]> git.ipfire.org Git - thirdparty/binutils-gdb.git/blame - gas/config/tc-arm.c
* objfiles.h (pc_in_section): New prototype.
[thirdparty/binutils-gdb.git] / gas / config / tc-arm.c
CommitLineData
b99bd4ef 1/* tc-arm.c -- Assemble for the ARM
da4339ed 2 Copyright 1994-2013 Free Software Foundation, Inc.
b99bd4ef
NC
3 Contributed by Richard Earnshaw (rwe@pegasus.esprit.ec.org)
4 Modified by David Taylor (dtaylor@armltd.co.uk)
22d9c8c5 5 Cirrus coprocessor mods by Aldy Hernandez (aldyh@redhat.com)
34920d91
NC
6 Cirrus coprocessor fixes by Petko Manolov (petkan@nucleusys.com)
7 Cirrus coprocessor fixes by Vladimir Ivanov (vladitx@nucleusys.com)
b99bd4ef
NC
8
9 This file is part of GAS, the GNU Assembler.
10
11 GAS is free software; you can redistribute it and/or modify
12 it under the terms of the GNU General Public License as published by
ec2655a6 13 the Free Software Foundation; either version 3, or (at your option)
b99bd4ef
NC
14 any later version.
15
16 GAS is distributed in the hope that it will be useful,
17 but WITHOUT ANY WARRANTY; without even the implied warranty of
c19d1205 18 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
b99bd4ef
NC
19 GNU General Public License for more details.
20
21 You should have received a copy of the GNU General Public License
22 along with GAS; see the file COPYING. If not, write to the Free
699d2810
NC
23 Software Foundation, 51 Franklin Street - Fifth Floor, Boston, MA
24 02110-1301, USA. */
b99bd4ef 25
42a68e18 26#include "as.h"
5287ad62 27#include <limits.h>
037e8744 28#include <stdarg.h>
c19d1205 29#define NO_RELOC 0
3882b010 30#include "safe-ctype.h"
b99bd4ef
NC
31#include "subsegs.h"
32#include "obstack.h"
3da1d841 33#include "libiberty.h"
f263249b
RE
34#include "opcode/arm.h"
35
b99bd4ef
NC
36#ifdef OBJ_ELF
37#include "elf/arm.h"
a394c00f 38#include "dw2gencfi.h"
b99bd4ef
NC
39#endif
40
f0927246
NC
41#include "dwarf2dbg.h"
42
7ed4c4c5
NC
43#ifdef OBJ_ELF
44/* Must be at least the size of the largest unwind opcode (currently two). */
45#define ARM_OPCODE_CHUNK_SIZE 8
46
47/* This structure holds the unwinding state. */
48
49static struct
50{
c19d1205
ZW
51 symbolS * proc_start;
52 symbolS * table_entry;
53 symbolS * personality_routine;
54 int personality_index;
7ed4c4c5 55 /* The segment containing the function. */
c19d1205
ZW
56 segT saved_seg;
57 subsegT saved_subseg;
7ed4c4c5
NC
58 /* Opcodes generated from this function. */
59 unsigned char * opcodes;
c19d1205
ZW
60 int opcode_count;
61 int opcode_alloc;
7ed4c4c5 62 /* The number of bytes pushed to the stack. */
c19d1205 63 offsetT frame_size;
7ed4c4c5
NC
64 /* We don't add stack adjustment opcodes immediately so that we can merge
65 multiple adjustments. We can also omit the final adjustment
66 when using a frame pointer. */
c19d1205 67 offsetT pending_offset;
7ed4c4c5 68 /* These two fields are set by both unwind_movsp and unwind_setfp. They
c19d1205
ZW
69 hold the reg+offset to use when restoring sp from a frame pointer. */
70 offsetT fp_offset;
71 int fp_reg;
7ed4c4c5 72 /* Nonzero if an unwind_setfp directive has been seen. */
c19d1205 73 unsigned fp_used:1;
7ed4c4c5 74 /* Nonzero if the last opcode restores sp from fp_reg. */
c19d1205 75 unsigned sp_restored:1;
7ed4c4c5
NC
76} unwind;
77
8b1ad454
NC
78#endif /* OBJ_ELF */
79
4962c51a
MS
80/* Results from operand parsing worker functions. */
81
82typedef enum
83{
84 PARSE_OPERAND_SUCCESS,
85 PARSE_OPERAND_FAIL,
86 PARSE_OPERAND_FAIL_NO_BACKTRACK
87} parse_operand_result;
88
33a392fb
PB
89enum arm_float_abi
90{
91 ARM_FLOAT_ABI_HARD,
92 ARM_FLOAT_ABI_SOFTFP,
93 ARM_FLOAT_ABI_SOFT
94};
95
c19d1205 96/* Types of processor to assemble for. */
b99bd4ef 97#ifndef CPU_DEFAULT
8a59fff3 98/* The code that was here used to select a default CPU depending on compiler
fa94de6b 99 pre-defines which were only present when doing native builds, thus
8a59fff3
MGD
100 changing gas' default behaviour depending upon the build host.
101
102 If you have a target that requires a default CPU option then the you
103 should define CPU_DEFAULT here. */
b99bd4ef
NC
104#endif
105
106#ifndef FPU_DEFAULT
c820d418
MM
107# ifdef TE_LINUX
108# define FPU_DEFAULT FPU_ARCH_FPA
109# elif defined (TE_NetBSD)
110# ifdef OBJ_ELF
111# define FPU_DEFAULT FPU_ARCH_VFP /* Soft-float, but VFP order. */
112# else
113 /* Legacy a.out format. */
114# define FPU_DEFAULT FPU_ARCH_FPA /* Soft-float, but FPA order. */
115# endif
4e7fd91e
PB
116# elif defined (TE_VXWORKS)
117# define FPU_DEFAULT FPU_ARCH_VFP /* Soft-float, VFP order. */
c820d418
MM
118# else
119 /* For backwards compatibility, default to FPA. */
120# define FPU_DEFAULT FPU_ARCH_FPA
121# endif
122#endif /* ifndef FPU_DEFAULT */
b99bd4ef 123
c19d1205 124#define streq(a, b) (strcmp (a, b) == 0)
b99bd4ef 125
e74cfd16
PB
126static arm_feature_set cpu_variant;
127static arm_feature_set arm_arch_used;
128static arm_feature_set thumb_arch_used;
b99bd4ef 129
b99bd4ef 130/* Flags stored in private area of BFD structure. */
c19d1205
ZW
131static int uses_apcs_26 = FALSE;
132static int atpcs = FALSE;
b34976b6
AM
133static int support_interwork = FALSE;
134static int uses_apcs_float = FALSE;
c19d1205 135static int pic_code = FALSE;
845b51d6 136static int fix_v4bx = FALSE;
278df34e
NS
137/* Warn on using deprecated features. */
138static int warn_on_deprecated = TRUE;
139
03b1477f
RE
140
141/* Variables that we set while parsing command-line options. Once all
142 options have been read we re-process these values to set the real
143 assembly flags. */
e74cfd16
PB
144static const arm_feature_set *legacy_cpu = NULL;
145static const arm_feature_set *legacy_fpu = NULL;
146
147static const arm_feature_set *mcpu_cpu_opt = NULL;
148static const arm_feature_set *mcpu_fpu_opt = NULL;
149static const arm_feature_set *march_cpu_opt = NULL;
150static const arm_feature_set *march_fpu_opt = NULL;
151static const arm_feature_set *mfpu_opt = NULL;
7a1d4c38 152static const arm_feature_set *object_arch = NULL;
e74cfd16
PB
153
154/* Constants for known architecture features. */
155static const arm_feature_set fpu_default = FPU_DEFAULT;
156static const arm_feature_set fpu_arch_vfp_v1 = FPU_ARCH_VFP_V1;
157static const arm_feature_set fpu_arch_vfp_v2 = FPU_ARCH_VFP_V2;
5287ad62
JB
158static const arm_feature_set fpu_arch_vfp_v3 = FPU_ARCH_VFP_V3;
159static const arm_feature_set fpu_arch_neon_v1 = FPU_ARCH_NEON_V1;
e74cfd16
PB
160static const arm_feature_set fpu_arch_fpa = FPU_ARCH_FPA;
161static const arm_feature_set fpu_any_hard = FPU_ANY_HARD;
162static const arm_feature_set fpu_arch_maverick = FPU_ARCH_MAVERICK;
163static const arm_feature_set fpu_endian_pure = FPU_ARCH_ENDIAN_PURE;
164
165#ifdef CPU_DEFAULT
166static const arm_feature_set cpu_default = CPU_DEFAULT;
167#endif
168
169static const arm_feature_set arm_ext_v1 = ARM_FEATURE (ARM_EXT_V1, 0);
170static const arm_feature_set arm_ext_v2 = ARM_FEATURE (ARM_EXT_V1, 0);
171static const arm_feature_set arm_ext_v2s = ARM_FEATURE (ARM_EXT_V2S, 0);
172static const arm_feature_set arm_ext_v3 = ARM_FEATURE (ARM_EXT_V3, 0);
173static const arm_feature_set arm_ext_v3m = ARM_FEATURE (ARM_EXT_V3M, 0);
174static const arm_feature_set arm_ext_v4 = ARM_FEATURE (ARM_EXT_V4, 0);
175static const arm_feature_set arm_ext_v4t = ARM_FEATURE (ARM_EXT_V4T, 0);
176static const arm_feature_set arm_ext_v5 = ARM_FEATURE (ARM_EXT_V5, 0);
177static const arm_feature_set arm_ext_v4t_5 =
178 ARM_FEATURE (ARM_EXT_V4T | ARM_EXT_V5, 0);
179static const arm_feature_set arm_ext_v5t = ARM_FEATURE (ARM_EXT_V5T, 0);
180static const arm_feature_set arm_ext_v5e = ARM_FEATURE (ARM_EXT_V5E, 0);
181static const arm_feature_set arm_ext_v5exp = ARM_FEATURE (ARM_EXT_V5ExP, 0);
182static const arm_feature_set arm_ext_v5j = ARM_FEATURE (ARM_EXT_V5J, 0);
183static const arm_feature_set arm_ext_v6 = ARM_FEATURE (ARM_EXT_V6, 0);
184static const arm_feature_set arm_ext_v6k = ARM_FEATURE (ARM_EXT_V6K, 0);
e74cfd16 185static const arm_feature_set arm_ext_v6t2 = ARM_FEATURE (ARM_EXT_V6T2, 0);
b2a5fbdc 186static const arm_feature_set arm_ext_v6m = ARM_FEATURE (ARM_EXT_V6M, 0);
62b3e311 187static const arm_feature_set arm_ext_v6_notm = ARM_FEATURE (ARM_EXT_V6_NOTM, 0);
9e3c6df6 188static const arm_feature_set arm_ext_v6_dsp = ARM_FEATURE (ARM_EXT_V6_DSP, 0);
7e806470
PB
189static const arm_feature_set arm_ext_barrier = ARM_FEATURE (ARM_EXT_BARRIER, 0);
190static const arm_feature_set arm_ext_msr = ARM_FEATURE (ARM_EXT_THUMB_MSR, 0);
62b3e311
PB
191static const arm_feature_set arm_ext_div = ARM_FEATURE (ARM_EXT_DIV, 0);
192static const arm_feature_set arm_ext_v7 = ARM_FEATURE (ARM_EXT_V7, 0);
193static const arm_feature_set arm_ext_v7a = ARM_FEATURE (ARM_EXT_V7A, 0);
194static const arm_feature_set arm_ext_v7r = ARM_FEATURE (ARM_EXT_V7R, 0);
9e3c6df6 195static const arm_feature_set arm_ext_v7m = ARM_FEATURE (ARM_EXT_V7M, 0);
bca38921 196static const arm_feature_set arm_ext_v8 = ARM_FEATURE (ARM_EXT_V8, 0);
7e806470 197static const arm_feature_set arm_ext_m =
b2a5fbdc 198 ARM_FEATURE (ARM_EXT_V6M | ARM_EXT_OS | ARM_EXT_V7M, 0);
60e5ef9f 199static const arm_feature_set arm_ext_mp = ARM_FEATURE (ARM_EXT_MP, 0);
f4c65163 200static const arm_feature_set arm_ext_sec = ARM_FEATURE (ARM_EXT_SEC, 0);
b2a5fbdc 201static const arm_feature_set arm_ext_os = ARM_FEATURE (ARM_EXT_OS, 0);
eea54501 202static const arm_feature_set arm_ext_adiv = ARM_FEATURE (ARM_EXT_ADIV, 0);
90ec0d68 203static const arm_feature_set arm_ext_virt = ARM_FEATURE (ARM_EXT_VIRT, 0);
e74cfd16
PB
204
205static const arm_feature_set arm_arch_any = ARM_ANY;
206static const arm_feature_set arm_arch_full = ARM_FEATURE (-1, -1);
207static const arm_feature_set arm_arch_t2 = ARM_ARCH_THUMB2;
208static const arm_feature_set arm_arch_none = ARM_ARCH_NONE;
251665fc 209static const arm_feature_set arm_arch_v6m_only = ARM_ARCH_V6M_ONLY;
e74cfd16 210
2d447fca
JM
211static const arm_feature_set arm_cext_iwmmxt2 =
212 ARM_FEATURE (0, ARM_CEXT_IWMMXT2);
e74cfd16
PB
213static const arm_feature_set arm_cext_iwmmxt =
214 ARM_FEATURE (0, ARM_CEXT_IWMMXT);
215static const arm_feature_set arm_cext_xscale =
216 ARM_FEATURE (0, ARM_CEXT_XSCALE);
217static const arm_feature_set arm_cext_maverick =
218 ARM_FEATURE (0, ARM_CEXT_MAVERICK);
219static const arm_feature_set fpu_fpa_ext_v1 = ARM_FEATURE (0, FPU_FPA_EXT_V1);
220static const arm_feature_set fpu_fpa_ext_v2 = ARM_FEATURE (0, FPU_FPA_EXT_V2);
221static const arm_feature_set fpu_vfp_ext_v1xd =
222 ARM_FEATURE (0, FPU_VFP_EXT_V1xD);
223static const arm_feature_set fpu_vfp_ext_v1 = ARM_FEATURE (0, FPU_VFP_EXT_V1);
224static const arm_feature_set fpu_vfp_ext_v2 = ARM_FEATURE (0, FPU_VFP_EXT_V2);
62f3b8c8 225static const arm_feature_set fpu_vfp_ext_v3xd = ARM_FEATURE (0, FPU_VFP_EXT_V3xD);
5287ad62 226static const arm_feature_set fpu_vfp_ext_v3 = ARM_FEATURE (0, FPU_VFP_EXT_V3);
b1cc4aeb
PB
227static const arm_feature_set fpu_vfp_ext_d32 =
228 ARM_FEATURE (0, FPU_VFP_EXT_D32);
5287ad62
JB
229static const arm_feature_set fpu_neon_ext_v1 = ARM_FEATURE (0, FPU_NEON_EXT_V1);
230static const arm_feature_set fpu_vfp_v3_or_neon_ext =
231 ARM_FEATURE (0, FPU_NEON_EXT_V1 | FPU_VFP_EXT_V3);
62f3b8c8
PB
232static const arm_feature_set fpu_vfp_fp16 = ARM_FEATURE (0, FPU_VFP_EXT_FP16);
233static const arm_feature_set fpu_neon_ext_fma = ARM_FEATURE (0, FPU_NEON_EXT_FMA);
234static const arm_feature_set fpu_vfp_ext_fma = ARM_FEATURE (0, FPU_VFP_EXT_FMA);
bca38921
MGD
235static const arm_feature_set fpu_vfp_ext_armv8 =
236 ARM_FEATURE (0, FPU_VFP_EXT_ARMV8);
237static const arm_feature_set fpu_neon_ext_armv8 =
238 ARM_FEATURE (0, FPU_NEON_EXT_ARMV8);
239static const arm_feature_set fpu_crypto_ext_armv8 =
240 ARM_FEATURE (0, FPU_CRYPTO_EXT_ARMV8);
dd5181d5
KT
241static const arm_feature_set crc_ext_armv8 =
242 ARM_FEATURE (0, CRC_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
bacebabc
RM
324/* An immediate operand can start with #, and ld*, st*, pld operands
325 can contain [ and ]. We need to tell APP not to elide whitespace
477330fc
RM
326 before a [, which can appear as the first operand for pld.
327 Likewise, a { can appear as the first operand for push, pop, vld*, etc. */
328const char arm_symbol_chars[] = "#[]{}";
bacebabc 329
5287ad62
JB
330enum neon_el_type
331{
dcbf9037 332 NT_invtype,
5287ad62
JB
333 NT_untyped,
334 NT_integer,
335 NT_float,
336 NT_poly,
337 NT_signed,
dcbf9037 338 NT_unsigned
5287ad62
JB
339};
340
341struct neon_type_el
342{
343 enum neon_el_type type;
344 unsigned size;
345};
346
347#define NEON_MAX_TYPE_ELS 4
348
349struct neon_type
350{
351 struct neon_type_el el[NEON_MAX_TYPE_ELS];
352 unsigned elems;
353};
354
e07e6e58
NC
355enum it_instruction_type
356{
357 OUTSIDE_IT_INSN,
358 INSIDE_IT_INSN,
359 INSIDE_IT_LAST_INSN,
360 IF_INSIDE_IT_LAST_INSN, /* Either outside or inside;
477330fc 361 if inside, should be the last one. */
e07e6e58 362 NEUTRAL_IT_INSN, /* This could be either inside or outside,
477330fc 363 i.e. BKPT and NOP. */
e07e6e58
NC
364 IT_INSN /* The IT insn has been parsed. */
365};
366
ad6cec43
MGD
367/* The maximum number of operands we need. */
368#define ARM_IT_MAX_OPERANDS 6
369
b99bd4ef
NC
370struct arm_it
371{
c19d1205 372 const char * error;
b99bd4ef 373 unsigned long instruction;
c19d1205
ZW
374 int size;
375 int size_req;
376 int cond;
037e8744
JB
377 /* "uncond_value" is set to the value in place of the conditional field in
378 unconditional versions of the instruction, or -1 if nothing is
379 appropriate. */
380 int uncond_value;
5287ad62 381 struct neon_type vectype;
88714cb8
DG
382 /* This does not indicate an actual NEON instruction, only that
383 the mnemonic accepts neon-style type suffixes. */
384 int is_neon;
0110f2b8
PB
385 /* Set to the opcode if the instruction needs relaxation.
386 Zero if the instruction is not relaxed. */
387 unsigned long relax;
b99bd4ef
NC
388 struct
389 {
390 bfd_reloc_code_real_type type;
c19d1205
ZW
391 expressionS exp;
392 int pc_rel;
b99bd4ef 393 } reloc;
b99bd4ef 394
e07e6e58
NC
395 enum it_instruction_type it_insn_type;
396
c19d1205
ZW
397 struct
398 {
399 unsigned reg;
ca3f61f7 400 signed int imm;
dcbf9037 401 struct neon_type_el vectype;
ca3f61f7
NC
402 unsigned present : 1; /* Operand present. */
403 unsigned isreg : 1; /* Operand was a register. */
404 unsigned immisreg : 1; /* .imm field is a second register. */
5287ad62
JB
405 unsigned isscalar : 1; /* Operand is a (Neon) scalar. */
406 unsigned immisalign : 1; /* Immediate is an alignment specifier. */
c96612cc 407 unsigned immisfloat : 1; /* Immediate was parsed as a float. */
5287ad62
JB
408 /* Note: we abuse "regisimm" to mean "is Neon register" in VMOV
409 instructions. This allows us to disambiguate ARM <-> vector insns. */
410 unsigned regisimm : 1; /* 64-bit immediate, reg forms high 32 bits. */
037e8744 411 unsigned isvec : 1; /* Is a single, double or quad VFP/Neon reg. */
5287ad62 412 unsigned isquad : 1; /* Operand is Neon quad-precision register. */
037e8744 413 unsigned issingle : 1; /* Operand is VFP single-precision register. */
ca3f61f7
NC
414 unsigned hasreloc : 1; /* Operand has relocation suffix. */
415 unsigned writeback : 1; /* Operand has trailing ! */
416 unsigned preind : 1; /* Preindexed address. */
417 unsigned postind : 1; /* Postindexed address. */
418 unsigned negative : 1; /* Index register was negated. */
419 unsigned shifted : 1; /* Shift applied to operation. */
420 unsigned shift_kind : 3; /* Shift operation (enum shift_kind). */
ad6cec43 421 } operands[ARM_IT_MAX_OPERANDS];
b99bd4ef
NC
422};
423
c19d1205 424static struct arm_it inst;
b99bd4ef
NC
425
426#define NUM_FLOAT_VALS 8
427
05d2d07e 428const char * fp_const[] =
b99bd4ef
NC
429{
430 "0.0", "1.0", "2.0", "3.0", "4.0", "5.0", "0.5", "10.0", 0
431};
432
c19d1205 433/* Number of littlenums required to hold an extended precision number. */
b99bd4ef
NC
434#define MAX_LITTLENUMS 6
435
436LITTLENUM_TYPE fp_values[NUM_FLOAT_VALS][MAX_LITTLENUMS];
437
438#define FAIL (-1)
439#define SUCCESS (0)
440
441#define SUFF_S 1
442#define SUFF_D 2
443#define SUFF_E 3
444#define SUFF_P 4
445
c19d1205
ZW
446#define CP_T_X 0x00008000
447#define CP_T_Y 0x00400000
b99bd4ef 448
c19d1205
ZW
449#define CONDS_BIT 0x00100000
450#define LOAD_BIT 0x00100000
b99bd4ef
NC
451
452#define DOUBLE_LOAD_FLAG 0x00000001
453
454struct asm_cond
455{
d3ce72d0 456 const char * template_name;
c921be7d 457 unsigned long value;
b99bd4ef
NC
458};
459
c19d1205 460#define COND_ALWAYS 0xE
b99bd4ef 461
b99bd4ef
NC
462struct asm_psr
463{
d3ce72d0 464 const char * template_name;
c921be7d 465 unsigned long field;
b99bd4ef
NC
466};
467
62b3e311
PB
468struct asm_barrier_opt
469{
e797f7e0
MGD
470 const char * template_name;
471 unsigned long value;
472 const arm_feature_set arch;
62b3e311
PB
473};
474
2d2255b5 475/* The bit that distinguishes CPSR and SPSR. */
b99bd4ef
NC
476#define SPSR_BIT (1 << 22)
477
c19d1205
ZW
478/* The individual PSR flag bits. */
479#define PSR_c (1 << 16)
480#define PSR_x (1 << 17)
481#define PSR_s (1 << 18)
482#define PSR_f (1 << 19)
b99bd4ef 483
c19d1205 484struct reloc_entry
bfae80f2 485{
c921be7d
NC
486 char * name;
487 bfd_reloc_code_real_type reloc;
bfae80f2
RE
488};
489
5287ad62 490enum vfp_reg_pos
bfae80f2 491{
5287ad62
JB
492 VFP_REG_Sd, VFP_REG_Sm, VFP_REG_Sn,
493 VFP_REG_Dd, VFP_REG_Dm, VFP_REG_Dn
bfae80f2
RE
494};
495
496enum vfp_ldstm_type
497{
498 VFP_LDSTMIA, VFP_LDSTMDB, VFP_LDSTMIAX, VFP_LDSTMDBX
499};
500
dcbf9037
JB
501/* Bits for DEFINED field in neon_typed_alias. */
502#define NTA_HASTYPE 1
503#define NTA_HASINDEX 2
504
505struct neon_typed_alias
506{
c921be7d
NC
507 unsigned char defined;
508 unsigned char index;
509 struct neon_type_el eltype;
dcbf9037
JB
510};
511
c19d1205
ZW
512/* ARM register categories. This includes coprocessor numbers and various
513 architecture extensions' registers. */
514enum arm_reg_type
bfae80f2 515{
c19d1205
ZW
516 REG_TYPE_RN,
517 REG_TYPE_CP,
518 REG_TYPE_CN,
519 REG_TYPE_FN,
520 REG_TYPE_VFS,
521 REG_TYPE_VFD,
5287ad62 522 REG_TYPE_NQ,
037e8744 523 REG_TYPE_VFSD,
5287ad62 524 REG_TYPE_NDQ,
037e8744 525 REG_TYPE_NSDQ,
c19d1205
ZW
526 REG_TYPE_VFC,
527 REG_TYPE_MVF,
528 REG_TYPE_MVD,
529 REG_TYPE_MVFX,
530 REG_TYPE_MVDX,
531 REG_TYPE_MVAX,
532 REG_TYPE_DSPSC,
533 REG_TYPE_MMXWR,
534 REG_TYPE_MMXWC,
535 REG_TYPE_MMXWCG,
536 REG_TYPE_XSCALE,
90ec0d68 537 REG_TYPE_RNB
bfae80f2
RE
538};
539
dcbf9037
JB
540/* Structure for a hash table entry for a register.
541 If TYPE is REG_TYPE_VFD or REG_TYPE_NQ, the NEON field can point to extra
542 information which states whether a vector type or index is specified (for a
543 register alias created with .dn or .qn). Otherwise NEON should be NULL. */
6c43fab6
RE
544struct reg_entry
545{
c921be7d 546 const char * name;
90ec0d68 547 unsigned int number;
c921be7d
NC
548 unsigned char type;
549 unsigned char builtin;
550 struct neon_typed_alias * neon;
6c43fab6
RE
551};
552
c19d1205 553/* Diagnostics used when we don't get a register of the expected type. */
c921be7d 554const char * const reg_expected_msgs[] =
c19d1205
ZW
555{
556 N_("ARM register expected"),
557 N_("bad or missing co-processor number"),
558 N_("co-processor register expected"),
559 N_("FPA register expected"),
560 N_("VFP single precision register expected"),
5287ad62
JB
561 N_("VFP/Neon double precision register expected"),
562 N_("Neon quad precision register expected"),
037e8744 563 N_("VFP single or double precision register expected"),
5287ad62 564 N_("Neon double or quad precision register expected"),
037e8744 565 N_("VFP single, double or Neon quad precision register expected"),
c19d1205
ZW
566 N_("VFP system register expected"),
567 N_("Maverick MVF register expected"),
568 N_("Maverick MVD register expected"),
569 N_("Maverick MVFX register expected"),
570 N_("Maverick MVDX register expected"),
571 N_("Maverick MVAX register expected"),
572 N_("Maverick DSPSC register expected"),
573 N_("iWMMXt data register expected"),
574 N_("iWMMXt control register expected"),
575 N_("iWMMXt scalar register expected"),
576 N_("XScale accumulator register expected"),
6c43fab6
RE
577};
578
c19d1205 579/* Some well known registers that we refer to directly elsewhere. */
bd340a04 580#define REG_R12 12
c19d1205
ZW
581#define REG_SP 13
582#define REG_LR 14
583#define REG_PC 15
404ff6b5 584
b99bd4ef
NC
585/* ARM instructions take 4bytes in the object file, Thumb instructions
586 take 2: */
c19d1205 587#define INSN_SIZE 4
b99bd4ef
NC
588
589struct asm_opcode
590{
591 /* Basic string to match. */
d3ce72d0 592 const char * template_name;
c19d1205
ZW
593
594 /* Parameters to instruction. */
5be8be5d 595 unsigned int operands[8];
c19d1205
ZW
596
597 /* Conditional tag - see opcode_lookup. */
598 unsigned int tag : 4;
b99bd4ef
NC
599
600 /* Basic instruction code. */
c19d1205 601 unsigned int avalue : 28;
b99bd4ef 602
c19d1205
ZW
603 /* Thumb-format instruction code. */
604 unsigned int tvalue;
b99bd4ef 605
90e4755a 606 /* Which architecture variant provides this instruction. */
c921be7d
NC
607 const arm_feature_set * avariant;
608 const arm_feature_set * tvariant;
c19d1205
ZW
609
610 /* Function to call to encode instruction in ARM format. */
611 void (* aencode) (void);
b99bd4ef 612
c19d1205
ZW
613 /* Function to call to encode instruction in Thumb format. */
614 void (* tencode) (void);
b99bd4ef
NC
615};
616
a737bd4d
NC
617/* Defines for various bits that we will want to toggle. */
618#define INST_IMMEDIATE 0x02000000
619#define OFFSET_REG 0x02000000
c19d1205 620#define HWOFFSET_IMM 0x00400000
a737bd4d
NC
621#define SHIFT_BY_REG 0x00000010
622#define PRE_INDEX 0x01000000
623#define INDEX_UP 0x00800000
624#define WRITE_BACK 0x00200000
625#define LDM_TYPE_2_OR_3 0x00400000
a028a6f5 626#define CPSI_MMOD 0x00020000
90e4755a 627
a737bd4d
NC
628#define LITERAL_MASK 0xf000f000
629#define OPCODE_MASK 0xfe1fffff
630#define V4_STR_BIT 0x00000020
90e4755a 631
efd81785
PB
632#define T2_SUBS_PC_LR 0xf3de8f00
633
a737bd4d 634#define DATA_OP_SHIFT 21
90e4755a 635
ef8d22e6
PB
636#define T2_OPCODE_MASK 0xfe1fffff
637#define T2_DATA_OP_SHIFT 21
638
6530b175
NC
639#define A_COND_MASK 0xf0000000
640#define A_PUSH_POP_OP_MASK 0x0fff0000
641
642/* Opcodes for pushing/poping registers to/from the stack. */
643#define A1_OPCODE_PUSH 0x092d0000
644#define A2_OPCODE_PUSH 0x052d0004
645#define A2_OPCODE_POP 0x049d0004
646
a737bd4d
NC
647/* Codes to distinguish the arithmetic instructions. */
648#define OPCODE_AND 0
649#define OPCODE_EOR 1
650#define OPCODE_SUB 2
651#define OPCODE_RSB 3
652#define OPCODE_ADD 4
653#define OPCODE_ADC 5
654#define OPCODE_SBC 6
655#define OPCODE_RSC 7
656#define OPCODE_TST 8
657#define OPCODE_TEQ 9
658#define OPCODE_CMP 10
659#define OPCODE_CMN 11
660#define OPCODE_ORR 12
661#define OPCODE_MOV 13
662#define OPCODE_BIC 14
663#define OPCODE_MVN 15
90e4755a 664
ef8d22e6
PB
665#define T2_OPCODE_AND 0
666#define T2_OPCODE_BIC 1
667#define T2_OPCODE_ORR 2
668#define T2_OPCODE_ORN 3
669#define T2_OPCODE_EOR 4
670#define T2_OPCODE_ADD 8
671#define T2_OPCODE_ADC 10
672#define T2_OPCODE_SBC 11
673#define T2_OPCODE_SUB 13
674#define T2_OPCODE_RSB 14
675
a737bd4d
NC
676#define T_OPCODE_MUL 0x4340
677#define T_OPCODE_TST 0x4200
678#define T_OPCODE_CMN 0x42c0
679#define T_OPCODE_NEG 0x4240
680#define T_OPCODE_MVN 0x43c0
90e4755a 681
a737bd4d
NC
682#define T_OPCODE_ADD_R3 0x1800
683#define T_OPCODE_SUB_R3 0x1a00
684#define T_OPCODE_ADD_HI 0x4400
685#define T_OPCODE_ADD_ST 0xb000
686#define T_OPCODE_SUB_ST 0xb080
687#define T_OPCODE_ADD_SP 0xa800
688#define T_OPCODE_ADD_PC 0xa000
689#define T_OPCODE_ADD_I8 0x3000
690#define T_OPCODE_SUB_I8 0x3800
691#define T_OPCODE_ADD_I3 0x1c00
692#define T_OPCODE_SUB_I3 0x1e00
b99bd4ef 693
a737bd4d
NC
694#define T_OPCODE_ASR_R 0x4100
695#define T_OPCODE_LSL_R 0x4080
c19d1205
ZW
696#define T_OPCODE_LSR_R 0x40c0
697#define T_OPCODE_ROR_R 0x41c0
a737bd4d
NC
698#define T_OPCODE_ASR_I 0x1000
699#define T_OPCODE_LSL_I 0x0000
700#define T_OPCODE_LSR_I 0x0800
b99bd4ef 701
a737bd4d
NC
702#define T_OPCODE_MOV_I8 0x2000
703#define T_OPCODE_CMP_I8 0x2800
704#define T_OPCODE_CMP_LR 0x4280
705#define T_OPCODE_MOV_HR 0x4600
706#define T_OPCODE_CMP_HR 0x4500
b99bd4ef 707
a737bd4d
NC
708#define T_OPCODE_LDR_PC 0x4800
709#define T_OPCODE_LDR_SP 0x9800
710#define T_OPCODE_STR_SP 0x9000
711#define T_OPCODE_LDR_IW 0x6800
712#define T_OPCODE_STR_IW 0x6000
713#define T_OPCODE_LDR_IH 0x8800
714#define T_OPCODE_STR_IH 0x8000
715#define T_OPCODE_LDR_IB 0x7800
716#define T_OPCODE_STR_IB 0x7000
717#define T_OPCODE_LDR_RW 0x5800
718#define T_OPCODE_STR_RW 0x5000
719#define T_OPCODE_LDR_RH 0x5a00
720#define T_OPCODE_STR_RH 0x5200
721#define T_OPCODE_LDR_RB 0x5c00
722#define T_OPCODE_STR_RB 0x5400
c9b604bd 723
a737bd4d
NC
724#define T_OPCODE_PUSH 0xb400
725#define T_OPCODE_POP 0xbc00
b99bd4ef 726
2fc8bdac 727#define T_OPCODE_BRANCH 0xe000
b99bd4ef 728
a737bd4d 729#define THUMB_SIZE 2 /* Size of thumb instruction. */
a737bd4d 730#define THUMB_PP_PC_LR 0x0100
c19d1205 731#define THUMB_LOAD_BIT 0x0800
53365c0d 732#define THUMB2_LOAD_BIT 0x00100000
c19d1205
ZW
733
734#define BAD_ARGS _("bad arguments to instruction")
fdfde340 735#define BAD_SP _("r13 not allowed here")
c19d1205
ZW
736#define BAD_PC _("r15 not allowed here")
737#define BAD_COND _("instruction cannot be conditional")
738#define BAD_OVERLAP _("registers may not be the same")
739#define BAD_HIREG _("lo register required")
740#define BAD_THUMB32 _("instruction not supported in Thumb16 mode")
01cfc07f 741#define BAD_ADDR_MODE _("instruction does not accept this addressing mode");
dfa9f0d5
PB
742#define BAD_BRANCH _("branch must be last instruction in IT block")
743#define BAD_NOT_IT _("instruction not allowed in IT block")
037e8744 744#define BAD_FPU _("selected FPU does not support instruction")
e07e6e58
NC
745#define BAD_OUT_IT _("thumb conditional instruction should be in IT block")
746#define BAD_IT_COND _("incorrect condition in IT block")
747#define BAD_IT_IT _("IT falling in the range of a previous IT block")
921e5f0a 748#define MISSING_FNSTART _("missing .fnstart before unwinding directive")
5be8be5d
DG
749#define BAD_PC_ADDRESSING \
750 _("cannot use register index with PC-relative addressing")
751#define BAD_PC_WRITEBACK \
752 _("cannot use writeback with PC-relative addressing")
08f10d51 753#define BAD_RANGE _("branch out of range")
dd5181d5 754#define UNPRED_REG(R) _("using " R " results in unpredictable behaviour")
c19d1205 755
c921be7d
NC
756static struct hash_control * arm_ops_hsh;
757static struct hash_control * arm_cond_hsh;
758static struct hash_control * arm_shift_hsh;
759static struct hash_control * arm_psr_hsh;
760static struct hash_control * arm_v7m_psr_hsh;
761static struct hash_control * arm_reg_hsh;
762static struct hash_control * arm_reloc_hsh;
763static struct hash_control * arm_barrier_opt_hsh;
b99bd4ef 764
b99bd4ef
NC
765/* Stuff needed to resolve the label ambiguity
766 As:
767 ...
768 label: <insn>
769 may differ from:
770 ...
771 label:
5f4273c7 772 <insn> */
b99bd4ef
NC
773
774symbolS * last_label_seen;
b34976b6 775static int label_is_thumb_function_name = FALSE;
e07e6e58 776
3d0c9500
NC
777/* Literal pool structure. Held on a per-section
778 and per-sub-section basis. */
a737bd4d 779
c19d1205 780#define MAX_LITERAL_POOL_SIZE 1024
3d0c9500 781typedef struct literal_pool
b99bd4ef 782{
c921be7d
NC
783 expressionS literals [MAX_LITERAL_POOL_SIZE];
784 unsigned int next_free_entry;
785 unsigned int id;
786 symbolS * symbol;
787 segT section;
788 subsegT sub_section;
a8040cf2
NC
789#ifdef OBJ_ELF
790 struct dwarf2_line_info locs [MAX_LITERAL_POOL_SIZE];
791#endif
c921be7d 792 struct literal_pool * next;
3d0c9500 793} literal_pool;
b99bd4ef 794
3d0c9500
NC
795/* Pointer to a linked list of literal pools. */
796literal_pool * list_of_pools = NULL;
e27ec89e 797
e07e6e58
NC
798#ifdef OBJ_ELF
799# define now_it seg_info (now_seg)->tc_segment_info_data.current_it
800#else
801static struct current_it now_it;
802#endif
803
804static inline int
805now_it_compatible (int cond)
806{
807 return (cond & ~1) == (now_it.cc & ~1);
808}
809
810static inline int
811conditional_insn (void)
812{
813 return inst.cond != COND_ALWAYS;
814}
815
816static int in_it_block (void);
817
818static int handle_it_state (void);
819
820static void force_automatic_it_block_close (void);
821
c921be7d
NC
822static void it_fsm_post_encode (void);
823
e07e6e58
NC
824#define set_it_insn_type(type) \
825 do \
826 { \
827 inst.it_insn_type = type; \
828 if (handle_it_state () == FAIL) \
477330fc 829 return; \
e07e6e58
NC
830 } \
831 while (0)
832
c921be7d
NC
833#define set_it_insn_type_nonvoid(type, failret) \
834 do \
835 { \
836 inst.it_insn_type = type; \
837 if (handle_it_state () == FAIL) \
477330fc 838 return failret; \
c921be7d
NC
839 } \
840 while(0)
841
e07e6e58
NC
842#define set_it_insn_type_last() \
843 do \
844 { \
845 if (inst.cond == COND_ALWAYS) \
477330fc 846 set_it_insn_type (IF_INSIDE_IT_LAST_INSN); \
e07e6e58 847 else \
477330fc 848 set_it_insn_type (INSIDE_IT_LAST_INSN); \
e07e6e58
NC
849 } \
850 while (0)
851
c19d1205 852/* Pure syntax. */
b99bd4ef 853
c19d1205
ZW
854/* This array holds the chars that always start a comment. If the
855 pre-processor is disabled, these aren't very useful. */
856const char comment_chars[] = "@";
3d0c9500 857
c19d1205
ZW
858/* This array holds the chars that only start a comment at the beginning of
859 a line. If the line seems to have the form '# 123 filename'
860 .line and .file directives will appear in the pre-processed output. */
861/* Note that input_file.c hand checks for '#' at the beginning of the
862 first line of the input file. This is because the compiler outputs
863 #NO_APP at the beginning of its output. */
864/* Also note that comments like this one will always work. */
865const char line_comment_chars[] = "#";
3d0c9500 866
c19d1205 867const char line_separator_chars[] = ";";
b99bd4ef 868
c19d1205
ZW
869/* Chars that can be used to separate mant
870 from exp in floating point numbers. */
871const char EXP_CHARS[] = "eE";
3d0c9500 872
c19d1205
ZW
873/* Chars that mean this number is a floating point constant. */
874/* As in 0f12.456 */
875/* or 0d1.2345e12 */
b99bd4ef 876
c19d1205 877const char FLT_CHARS[] = "rRsSfFdDxXeEpP";
3d0c9500 878
c19d1205
ZW
879/* Prefix characters that indicate the start of an immediate
880 value. */
881#define is_immediate_prefix(C) ((C) == '#' || (C) == '$')
3d0c9500 882
c19d1205
ZW
883/* Separator character handling. */
884
885#define skip_whitespace(str) do { if (*(str) == ' ') ++(str); } while (0)
886
887static inline int
888skip_past_char (char ** str, char c)
889{
8ab8155f
NC
890 /* PR gas/14987: Allow for whitespace before the expected character. */
891 skip_whitespace (*str);
427d0db6 892
c19d1205
ZW
893 if (**str == c)
894 {
895 (*str)++;
896 return SUCCESS;
3d0c9500 897 }
c19d1205
ZW
898 else
899 return FAIL;
900}
c921be7d 901
c19d1205 902#define skip_past_comma(str) skip_past_char (str, ',')
3d0c9500 903
c19d1205
ZW
904/* Arithmetic expressions (possibly involving symbols). */
905
906/* Return TRUE if anything in the expression is a bignum. */
907
908static int
909walk_no_bignums (symbolS * sp)
910{
911 if (symbol_get_value_expression (sp)->X_op == O_big)
912 return 1;
913
914 if (symbol_get_value_expression (sp)->X_add_symbol)
3d0c9500 915 {
c19d1205
ZW
916 return (walk_no_bignums (symbol_get_value_expression (sp)->X_add_symbol)
917 || (symbol_get_value_expression (sp)->X_op_symbol
918 && walk_no_bignums (symbol_get_value_expression (sp)->X_op_symbol)));
3d0c9500
NC
919 }
920
c19d1205 921 return 0;
3d0c9500
NC
922}
923
c19d1205
ZW
924static int in_my_get_expression = 0;
925
926/* Third argument to my_get_expression. */
927#define GE_NO_PREFIX 0
928#define GE_IMM_PREFIX 1
929#define GE_OPT_PREFIX 2
5287ad62
JB
930/* This is a bit of a hack. Use an optional prefix, and also allow big (64-bit)
931 immediates, as can be used in Neon VMVN and VMOV immediate instructions. */
932#define GE_OPT_PREFIX_BIG 3
a737bd4d 933
b99bd4ef 934static int
c19d1205 935my_get_expression (expressionS * ep, char ** str, int prefix_mode)
b99bd4ef 936{
c19d1205
ZW
937 char * save_in;
938 segT seg;
b99bd4ef 939
c19d1205
ZW
940 /* In unified syntax, all prefixes are optional. */
941 if (unified_syntax)
5287ad62 942 prefix_mode = (prefix_mode == GE_OPT_PREFIX_BIG) ? prefix_mode
477330fc 943 : GE_OPT_PREFIX;
b99bd4ef 944
c19d1205 945 switch (prefix_mode)
b99bd4ef 946 {
c19d1205
ZW
947 case GE_NO_PREFIX: break;
948 case GE_IMM_PREFIX:
949 if (!is_immediate_prefix (**str))
950 {
951 inst.error = _("immediate expression requires a # prefix");
952 return FAIL;
953 }
954 (*str)++;
955 break;
956 case GE_OPT_PREFIX:
5287ad62 957 case GE_OPT_PREFIX_BIG:
c19d1205
ZW
958 if (is_immediate_prefix (**str))
959 (*str)++;
960 break;
961 default: abort ();
962 }
b99bd4ef 963
c19d1205 964 memset (ep, 0, sizeof (expressionS));
b99bd4ef 965
c19d1205
ZW
966 save_in = input_line_pointer;
967 input_line_pointer = *str;
968 in_my_get_expression = 1;
969 seg = expression (ep);
970 in_my_get_expression = 0;
971
f86adc07 972 if (ep->X_op == O_illegal || ep->X_op == O_absent)
b99bd4ef 973 {
f86adc07 974 /* We found a bad or missing expression in md_operand(). */
c19d1205
ZW
975 *str = input_line_pointer;
976 input_line_pointer = save_in;
977 if (inst.error == NULL)
f86adc07
NS
978 inst.error = (ep->X_op == O_absent
979 ? _("missing expression") :_("bad expression"));
c19d1205
ZW
980 return 1;
981 }
b99bd4ef 982
c19d1205
ZW
983#ifdef OBJ_AOUT
984 if (seg != absolute_section
985 && seg != text_section
986 && seg != data_section
987 && seg != bss_section
988 && seg != undefined_section)
989 {
990 inst.error = _("bad segment");
991 *str = input_line_pointer;
992 input_line_pointer = save_in;
993 return 1;
b99bd4ef 994 }
87975d2a
AM
995#else
996 (void) seg;
c19d1205 997#endif
b99bd4ef 998
c19d1205
ZW
999 /* Get rid of any bignums now, so that we don't generate an error for which
1000 we can't establish a line number later on. Big numbers are never valid
1001 in instructions, which is where this routine is always called. */
5287ad62
JB
1002 if (prefix_mode != GE_OPT_PREFIX_BIG
1003 && (ep->X_op == O_big
477330fc 1004 || (ep->X_add_symbol
5287ad62 1005 && (walk_no_bignums (ep->X_add_symbol)
477330fc 1006 || (ep->X_op_symbol
5287ad62 1007 && walk_no_bignums (ep->X_op_symbol))))))
c19d1205
ZW
1008 {
1009 inst.error = _("invalid constant");
1010 *str = input_line_pointer;
1011 input_line_pointer = save_in;
1012 return 1;
1013 }
b99bd4ef 1014
c19d1205
ZW
1015 *str = input_line_pointer;
1016 input_line_pointer = save_in;
1017 return 0;
b99bd4ef
NC
1018}
1019
c19d1205
ZW
1020/* Turn a string in input_line_pointer into a floating point constant
1021 of type TYPE, and store the appropriate bytes in *LITP. The number
1022 of LITTLENUMS emitted is stored in *SIZEP. An error message is
1023 returned, or NULL on OK.
b99bd4ef 1024
c19d1205
ZW
1025 Note that fp constants aren't represent in the normal way on the ARM.
1026 In big endian mode, things are as expected. However, in little endian
1027 mode fp constants are big-endian word-wise, and little-endian byte-wise
1028 within the words. For example, (double) 1.1 in big endian mode is
1029 the byte sequence 3f f1 99 99 99 99 99 9a, and in little endian mode is
1030 the byte sequence 99 99 f1 3f 9a 99 99 99.
b99bd4ef 1031
c19d1205 1032 ??? The format of 12 byte floats is uncertain according to gcc's arm.h. */
b99bd4ef 1033
c19d1205
ZW
1034char *
1035md_atof (int type, char * litP, int * sizeP)
1036{
1037 int prec;
1038 LITTLENUM_TYPE words[MAX_LITTLENUMS];
1039 char *t;
1040 int i;
b99bd4ef 1041
c19d1205
ZW
1042 switch (type)
1043 {
1044 case 'f':
1045 case 'F':
1046 case 's':
1047 case 'S':
1048 prec = 2;
1049 break;
b99bd4ef 1050
c19d1205
ZW
1051 case 'd':
1052 case 'D':
1053 case 'r':
1054 case 'R':
1055 prec = 4;
1056 break;
b99bd4ef 1057
c19d1205
ZW
1058 case 'x':
1059 case 'X':
499ac353 1060 prec = 5;
c19d1205 1061 break;
b99bd4ef 1062
c19d1205
ZW
1063 case 'p':
1064 case 'P':
499ac353 1065 prec = 5;
c19d1205 1066 break;
a737bd4d 1067
c19d1205
ZW
1068 default:
1069 *sizeP = 0;
499ac353 1070 return _("Unrecognized or unsupported floating point constant");
c19d1205 1071 }
b99bd4ef 1072
c19d1205
ZW
1073 t = atof_ieee (input_line_pointer, type, words);
1074 if (t)
1075 input_line_pointer = t;
499ac353 1076 *sizeP = prec * sizeof (LITTLENUM_TYPE);
b99bd4ef 1077
c19d1205
ZW
1078 if (target_big_endian)
1079 {
1080 for (i = 0; i < prec; i++)
1081 {
499ac353
NC
1082 md_number_to_chars (litP, (valueT) words[i], sizeof (LITTLENUM_TYPE));
1083 litP += sizeof (LITTLENUM_TYPE);
c19d1205
ZW
1084 }
1085 }
1086 else
1087 {
e74cfd16 1088 if (ARM_CPU_HAS_FEATURE (cpu_variant, fpu_endian_pure))
c19d1205
ZW
1089 for (i = prec - 1; i >= 0; i--)
1090 {
499ac353
NC
1091 md_number_to_chars (litP, (valueT) words[i], sizeof (LITTLENUM_TYPE));
1092 litP += sizeof (LITTLENUM_TYPE);
c19d1205
ZW
1093 }
1094 else
1095 /* For a 4 byte float the order of elements in `words' is 1 0.
1096 For an 8 byte float the order is 1 0 3 2. */
1097 for (i = 0; i < prec; i += 2)
1098 {
499ac353
NC
1099 md_number_to_chars (litP, (valueT) words[i + 1],
1100 sizeof (LITTLENUM_TYPE));
1101 md_number_to_chars (litP + sizeof (LITTLENUM_TYPE),
1102 (valueT) words[i], sizeof (LITTLENUM_TYPE));
1103 litP += 2 * sizeof (LITTLENUM_TYPE);
c19d1205
ZW
1104 }
1105 }
b99bd4ef 1106
499ac353 1107 return NULL;
c19d1205 1108}
b99bd4ef 1109
c19d1205
ZW
1110/* We handle all bad expressions here, so that we can report the faulty
1111 instruction in the error message. */
1112void
91d6fa6a 1113md_operand (expressionS * exp)
c19d1205
ZW
1114{
1115 if (in_my_get_expression)
91d6fa6a 1116 exp->X_op = O_illegal;
b99bd4ef
NC
1117}
1118
c19d1205 1119/* Immediate values. */
b99bd4ef 1120
c19d1205
ZW
1121/* Generic immediate-value read function for use in directives.
1122 Accepts anything that 'expression' can fold to a constant.
1123 *val receives the number. */
1124#ifdef OBJ_ELF
1125static int
1126immediate_for_directive (int *val)
b99bd4ef 1127{
c19d1205
ZW
1128 expressionS exp;
1129 exp.X_op = O_illegal;
b99bd4ef 1130
c19d1205
ZW
1131 if (is_immediate_prefix (*input_line_pointer))
1132 {
1133 input_line_pointer++;
1134 expression (&exp);
1135 }
b99bd4ef 1136
c19d1205
ZW
1137 if (exp.X_op != O_constant)
1138 {
1139 as_bad (_("expected #constant"));
1140 ignore_rest_of_line ();
1141 return FAIL;
1142 }
1143 *val = exp.X_add_number;
1144 return SUCCESS;
b99bd4ef 1145}
c19d1205 1146#endif
b99bd4ef 1147
c19d1205 1148/* Register parsing. */
b99bd4ef 1149
c19d1205
ZW
1150/* Generic register parser. CCP points to what should be the
1151 beginning of a register name. If it is indeed a valid register
1152 name, advance CCP over it and return the reg_entry structure;
1153 otherwise return NULL. Does not issue diagnostics. */
1154
1155static struct reg_entry *
1156arm_reg_parse_multi (char **ccp)
b99bd4ef 1157{
c19d1205
ZW
1158 char *start = *ccp;
1159 char *p;
1160 struct reg_entry *reg;
b99bd4ef 1161
477330fc
RM
1162 skip_whitespace (start);
1163
c19d1205
ZW
1164#ifdef REGISTER_PREFIX
1165 if (*start != REGISTER_PREFIX)
01cfc07f 1166 return NULL;
c19d1205
ZW
1167 start++;
1168#endif
1169#ifdef OPTIONAL_REGISTER_PREFIX
1170 if (*start == OPTIONAL_REGISTER_PREFIX)
1171 start++;
1172#endif
b99bd4ef 1173
c19d1205
ZW
1174 p = start;
1175 if (!ISALPHA (*p) || !is_name_beginner (*p))
1176 return NULL;
b99bd4ef 1177
c19d1205
ZW
1178 do
1179 p++;
1180 while (ISALPHA (*p) || ISDIGIT (*p) || *p == '_');
1181
1182 reg = (struct reg_entry *) hash_find_n (arm_reg_hsh, start, p - start);
1183
1184 if (!reg)
1185 return NULL;
1186
1187 *ccp = p;
1188 return reg;
b99bd4ef
NC
1189}
1190
1191static int
dcbf9037 1192arm_reg_alt_syntax (char **ccp, char *start, struct reg_entry *reg,
477330fc 1193 enum arm_reg_type type)
b99bd4ef 1194{
c19d1205
ZW
1195 /* Alternative syntaxes are accepted for a few register classes. */
1196 switch (type)
1197 {
1198 case REG_TYPE_MVF:
1199 case REG_TYPE_MVD:
1200 case REG_TYPE_MVFX:
1201 case REG_TYPE_MVDX:
1202 /* Generic coprocessor register names are allowed for these. */
79134647 1203 if (reg && reg->type == REG_TYPE_CN)
c19d1205
ZW
1204 return reg->number;
1205 break;
69b97547 1206
c19d1205
ZW
1207 case REG_TYPE_CP:
1208 /* For backward compatibility, a bare number is valid here. */
1209 {
1210 unsigned long processor = strtoul (start, ccp, 10);
1211 if (*ccp != start && processor <= 15)
1212 return processor;
1213 }
6057a28f 1214
c19d1205
ZW
1215 case REG_TYPE_MMXWC:
1216 /* WC includes WCG. ??? I'm not sure this is true for all
1217 instructions that take WC registers. */
79134647 1218 if (reg && reg->type == REG_TYPE_MMXWCG)
c19d1205 1219 return reg->number;
6057a28f 1220 break;
c19d1205 1221
6057a28f 1222 default:
c19d1205 1223 break;
6057a28f
NC
1224 }
1225
dcbf9037
JB
1226 return FAIL;
1227}
1228
1229/* As arm_reg_parse_multi, but the register must be of type TYPE, and the
1230 return value is the register number or FAIL. */
1231
1232static int
1233arm_reg_parse (char **ccp, enum arm_reg_type type)
1234{
1235 char *start = *ccp;
1236 struct reg_entry *reg = arm_reg_parse_multi (ccp);
1237 int ret;
1238
1239 /* Do not allow a scalar (reg+index) to parse as a register. */
1240 if (reg && reg->neon && (reg->neon->defined & NTA_HASINDEX))
1241 return FAIL;
1242
1243 if (reg && reg->type == type)
1244 return reg->number;
1245
1246 if ((ret = arm_reg_alt_syntax (ccp, start, reg, type)) != FAIL)
1247 return ret;
1248
c19d1205
ZW
1249 *ccp = start;
1250 return FAIL;
1251}
69b97547 1252
dcbf9037
JB
1253/* Parse a Neon type specifier. *STR should point at the leading '.'
1254 character. Does no verification at this stage that the type fits the opcode
1255 properly. E.g.,
1256
1257 .i32.i32.s16
1258 .s32.f32
1259 .u16
1260
1261 Can all be legally parsed by this function.
1262
1263 Fills in neon_type struct pointer with parsed information, and updates STR
1264 to point after the parsed type specifier. Returns SUCCESS if this was a legal
1265 type, FAIL if not. */
1266
1267static int
1268parse_neon_type (struct neon_type *type, char **str)
1269{
1270 char *ptr = *str;
1271
1272 if (type)
1273 type->elems = 0;
1274
1275 while (type->elems < NEON_MAX_TYPE_ELS)
1276 {
1277 enum neon_el_type thistype = NT_untyped;
1278 unsigned thissize = -1u;
1279
1280 if (*ptr != '.')
1281 break;
1282
1283 ptr++;
1284
1285 /* Just a size without an explicit type. */
1286 if (ISDIGIT (*ptr))
1287 goto parsesize;
1288
1289 switch (TOLOWER (*ptr))
1290 {
1291 case 'i': thistype = NT_integer; break;
1292 case 'f': thistype = NT_float; break;
1293 case 'p': thistype = NT_poly; break;
1294 case 's': thistype = NT_signed; break;
1295 case 'u': thistype = NT_unsigned; break;
477330fc
RM
1296 case 'd':
1297 thistype = NT_float;
1298 thissize = 64;
1299 ptr++;
1300 goto done;
dcbf9037
JB
1301 default:
1302 as_bad (_("unexpected character `%c' in type specifier"), *ptr);
1303 return FAIL;
1304 }
1305
1306 ptr++;
1307
1308 /* .f is an abbreviation for .f32. */
1309 if (thistype == NT_float && !ISDIGIT (*ptr))
1310 thissize = 32;
1311 else
1312 {
1313 parsesize:
1314 thissize = strtoul (ptr, &ptr, 10);
1315
1316 if (thissize != 8 && thissize != 16 && thissize != 32
477330fc
RM
1317 && thissize != 64)
1318 {
1319 as_bad (_("bad size %d in type specifier"), thissize);
dcbf9037
JB
1320 return FAIL;
1321 }
1322 }
1323
037e8744 1324 done:
dcbf9037 1325 if (type)
477330fc
RM
1326 {
1327 type->el[type->elems].type = thistype;
dcbf9037
JB
1328 type->el[type->elems].size = thissize;
1329 type->elems++;
1330 }
1331 }
1332
1333 /* Empty/missing type is not a successful parse. */
1334 if (type->elems == 0)
1335 return FAIL;
1336
1337 *str = ptr;
1338
1339 return SUCCESS;
1340}
1341
1342/* Errors may be set multiple times during parsing or bit encoding
1343 (particularly in the Neon bits), but usually the earliest error which is set
1344 will be the most meaningful. Avoid overwriting it with later (cascading)
1345 errors by calling this function. */
1346
1347static void
1348first_error (const char *err)
1349{
1350 if (!inst.error)
1351 inst.error = err;
1352}
1353
1354/* Parse a single type, e.g. ".s32", leading period included. */
1355static int
1356parse_neon_operand_type (struct neon_type_el *vectype, char **ccp)
1357{
1358 char *str = *ccp;
1359 struct neon_type optype;
1360
1361 if (*str == '.')
1362 {
1363 if (parse_neon_type (&optype, &str) == SUCCESS)
477330fc
RM
1364 {
1365 if (optype.elems == 1)
1366 *vectype = optype.el[0];
1367 else
1368 {
1369 first_error (_("only one type should be specified for operand"));
1370 return FAIL;
1371 }
1372 }
dcbf9037 1373 else
477330fc
RM
1374 {
1375 first_error (_("vector type expected"));
1376 return FAIL;
1377 }
dcbf9037
JB
1378 }
1379 else
1380 return FAIL;
5f4273c7 1381
dcbf9037 1382 *ccp = str;
5f4273c7 1383
dcbf9037
JB
1384 return SUCCESS;
1385}
1386
1387/* Special meanings for indices (which have a range of 0-7), which will fit into
1388 a 4-bit integer. */
1389
1390#define NEON_ALL_LANES 15
1391#define NEON_INTERLEAVE_LANES 14
1392
1393/* Parse either a register or a scalar, with an optional type. Return the
1394 register number, and optionally fill in the actual type of the register
1395 when multiple alternatives were given (NEON_TYPE_NDQ) in *RTYPE, and
1396 type/index information in *TYPEINFO. */
1397
1398static int
1399parse_typed_reg_or_scalar (char **ccp, enum arm_reg_type type,
477330fc
RM
1400 enum arm_reg_type *rtype,
1401 struct neon_typed_alias *typeinfo)
dcbf9037
JB
1402{
1403 char *str = *ccp;
1404 struct reg_entry *reg = arm_reg_parse_multi (&str);
1405 struct neon_typed_alias atype;
1406 struct neon_type_el parsetype;
1407
1408 atype.defined = 0;
1409 atype.index = -1;
1410 atype.eltype.type = NT_invtype;
1411 atype.eltype.size = -1;
1412
1413 /* Try alternate syntax for some types of register. Note these are mutually
1414 exclusive with the Neon syntax extensions. */
1415 if (reg == NULL)
1416 {
1417 int altreg = arm_reg_alt_syntax (&str, *ccp, reg, type);
1418 if (altreg != FAIL)
477330fc 1419 *ccp = str;
dcbf9037 1420 if (typeinfo)
477330fc 1421 *typeinfo = atype;
dcbf9037
JB
1422 return altreg;
1423 }
1424
037e8744
JB
1425 /* Undo polymorphism when a set of register types may be accepted. */
1426 if ((type == REG_TYPE_NDQ
1427 && (reg->type == REG_TYPE_NQ || reg->type == REG_TYPE_VFD))
1428 || (type == REG_TYPE_VFSD
477330fc 1429 && (reg->type == REG_TYPE_VFS || reg->type == REG_TYPE_VFD))
037e8744 1430 || (type == REG_TYPE_NSDQ
477330fc
RM
1431 && (reg->type == REG_TYPE_VFS || reg->type == REG_TYPE_VFD
1432 || reg->type == REG_TYPE_NQ))
f512f76f
NC
1433 || (type == REG_TYPE_MMXWC
1434 && (reg->type == REG_TYPE_MMXWCG)))
21d799b5 1435 type = (enum arm_reg_type) reg->type;
dcbf9037
JB
1436
1437 if (type != reg->type)
1438 return FAIL;
1439
1440 if (reg->neon)
1441 atype = *reg->neon;
5f4273c7 1442
dcbf9037
JB
1443 if (parse_neon_operand_type (&parsetype, &str) == SUCCESS)
1444 {
1445 if ((atype.defined & NTA_HASTYPE) != 0)
477330fc
RM
1446 {
1447 first_error (_("can't redefine type for operand"));
1448 return FAIL;
1449 }
dcbf9037
JB
1450 atype.defined |= NTA_HASTYPE;
1451 atype.eltype = parsetype;
1452 }
5f4273c7 1453
dcbf9037
JB
1454 if (skip_past_char (&str, '[') == SUCCESS)
1455 {
1456 if (type != REG_TYPE_VFD)
477330fc
RM
1457 {
1458 first_error (_("only D registers may be indexed"));
1459 return FAIL;
1460 }
5f4273c7 1461
dcbf9037 1462 if ((atype.defined & NTA_HASINDEX) != 0)
477330fc
RM
1463 {
1464 first_error (_("can't change index for operand"));
1465 return FAIL;
1466 }
dcbf9037
JB
1467
1468 atype.defined |= NTA_HASINDEX;
1469
1470 if (skip_past_char (&str, ']') == SUCCESS)
477330fc 1471 atype.index = NEON_ALL_LANES;
dcbf9037 1472 else
477330fc
RM
1473 {
1474 expressionS exp;
dcbf9037 1475
477330fc 1476 my_get_expression (&exp, &str, GE_NO_PREFIX);
dcbf9037 1477
477330fc
RM
1478 if (exp.X_op != O_constant)
1479 {
1480 first_error (_("constant expression required"));
1481 return FAIL;
1482 }
dcbf9037 1483
477330fc
RM
1484 if (skip_past_char (&str, ']') == FAIL)
1485 return FAIL;
dcbf9037 1486
477330fc
RM
1487 atype.index = exp.X_add_number;
1488 }
dcbf9037 1489 }
5f4273c7 1490
dcbf9037
JB
1491 if (typeinfo)
1492 *typeinfo = atype;
5f4273c7 1493
dcbf9037
JB
1494 if (rtype)
1495 *rtype = type;
5f4273c7 1496
dcbf9037 1497 *ccp = str;
5f4273c7 1498
dcbf9037
JB
1499 return reg->number;
1500}
1501
1502/* Like arm_reg_parse, but allow allow the following extra features:
1503 - If RTYPE is non-zero, return the (possibly restricted) type of the
1504 register (e.g. Neon double or quad reg when either has been requested).
1505 - If this is a Neon vector type with additional type information, fill
1506 in the struct pointed to by VECTYPE (if non-NULL).
5f4273c7 1507 This function will fault on encountering a scalar. */
dcbf9037
JB
1508
1509static int
1510arm_typed_reg_parse (char **ccp, enum arm_reg_type type,
477330fc 1511 enum arm_reg_type *rtype, struct neon_type_el *vectype)
dcbf9037
JB
1512{
1513 struct neon_typed_alias atype;
1514 char *str = *ccp;
1515 int reg = parse_typed_reg_or_scalar (&str, type, rtype, &atype);
1516
1517 if (reg == FAIL)
1518 return FAIL;
1519
0855e32b
NS
1520 /* Do not allow regname(... to parse as a register. */
1521 if (*str == '(')
1522 return FAIL;
1523
dcbf9037
JB
1524 /* Do not allow a scalar (reg+index) to parse as a register. */
1525 if ((atype.defined & NTA_HASINDEX) != 0)
1526 {
1527 first_error (_("register operand expected, but got scalar"));
1528 return FAIL;
1529 }
1530
1531 if (vectype)
1532 *vectype = atype.eltype;
1533
1534 *ccp = str;
1535
1536 return reg;
1537}
1538
1539#define NEON_SCALAR_REG(X) ((X) >> 4)
1540#define NEON_SCALAR_INDEX(X) ((X) & 15)
1541
5287ad62
JB
1542/* Parse a Neon scalar. Most of the time when we're parsing a scalar, we don't
1543 have enough information to be able to do a good job bounds-checking. So, we
1544 just do easy checks here, and do further checks later. */
1545
1546static int
dcbf9037 1547parse_scalar (char **ccp, int elsize, struct neon_type_el *type)
5287ad62 1548{
dcbf9037 1549 int reg;
5287ad62 1550 char *str = *ccp;
dcbf9037 1551 struct neon_typed_alias atype;
5f4273c7 1552
dcbf9037 1553 reg = parse_typed_reg_or_scalar (&str, REG_TYPE_VFD, NULL, &atype);
5f4273c7 1554
dcbf9037 1555 if (reg == FAIL || (atype.defined & NTA_HASINDEX) == 0)
5287ad62 1556 return FAIL;
5f4273c7 1557
dcbf9037 1558 if (atype.index == NEON_ALL_LANES)
5287ad62 1559 {
dcbf9037 1560 first_error (_("scalar must have an index"));
5287ad62
JB
1561 return FAIL;
1562 }
dcbf9037 1563 else if (atype.index >= 64 / elsize)
5287ad62 1564 {
dcbf9037 1565 first_error (_("scalar index out of range"));
5287ad62
JB
1566 return FAIL;
1567 }
5f4273c7 1568
dcbf9037
JB
1569 if (type)
1570 *type = atype.eltype;
5f4273c7 1571
5287ad62 1572 *ccp = str;
5f4273c7 1573
dcbf9037 1574 return reg * 16 + atype.index;
5287ad62
JB
1575}
1576
c19d1205 1577/* Parse an ARM register list. Returns the bitmask, or FAIL. */
e07e6e58 1578
c19d1205
ZW
1579static long
1580parse_reg_list (char ** strp)
1581{
1582 char * str = * strp;
1583 long range = 0;
1584 int another_range;
a737bd4d 1585
c19d1205
ZW
1586 /* We come back here if we get ranges concatenated by '+' or '|'. */
1587 do
6057a28f 1588 {
477330fc
RM
1589 skip_whitespace (str);
1590
c19d1205 1591 another_range = 0;
a737bd4d 1592
c19d1205
ZW
1593 if (*str == '{')
1594 {
1595 int in_range = 0;
1596 int cur_reg = -1;
a737bd4d 1597
c19d1205
ZW
1598 str++;
1599 do
1600 {
1601 int reg;
6057a28f 1602
dcbf9037 1603 if ((reg = arm_reg_parse (&str, REG_TYPE_RN)) == FAIL)
c19d1205 1604 {
dcbf9037 1605 first_error (_(reg_expected_msgs[REG_TYPE_RN]));
c19d1205
ZW
1606 return FAIL;
1607 }
a737bd4d 1608
c19d1205
ZW
1609 if (in_range)
1610 {
1611 int i;
a737bd4d 1612
c19d1205
ZW
1613 if (reg <= cur_reg)
1614 {
dcbf9037 1615 first_error (_("bad range in register list"));
c19d1205
ZW
1616 return FAIL;
1617 }
40a18ebd 1618
c19d1205
ZW
1619 for (i = cur_reg + 1; i < reg; i++)
1620 {
1621 if (range & (1 << i))
1622 as_tsktsk
1623 (_("Warning: duplicated register (r%d) in register list"),
1624 i);
1625 else
1626 range |= 1 << i;
1627 }
1628 in_range = 0;
1629 }
a737bd4d 1630
c19d1205
ZW
1631 if (range & (1 << reg))
1632 as_tsktsk (_("Warning: duplicated register (r%d) in register list"),
1633 reg);
1634 else if (reg <= cur_reg)
1635 as_tsktsk (_("Warning: register range not in ascending order"));
a737bd4d 1636
c19d1205
ZW
1637 range |= 1 << reg;
1638 cur_reg = reg;
1639 }
1640 while (skip_past_comma (&str) != FAIL
1641 || (in_range = 1, *str++ == '-'));
1642 str--;
a737bd4d 1643
c19d1205
ZW
1644 if (*str++ != '}')
1645 {
dcbf9037 1646 first_error (_("missing `}'"));
c19d1205
ZW
1647 return FAIL;
1648 }
1649 }
1650 else
1651 {
91d6fa6a 1652 expressionS exp;
40a18ebd 1653
91d6fa6a 1654 if (my_get_expression (&exp, &str, GE_NO_PREFIX))
c19d1205 1655 return FAIL;
40a18ebd 1656
91d6fa6a 1657 if (exp.X_op == O_constant)
c19d1205 1658 {
91d6fa6a
NC
1659 if (exp.X_add_number
1660 != (exp.X_add_number & 0x0000ffff))
c19d1205
ZW
1661 {
1662 inst.error = _("invalid register mask");
1663 return FAIL;
1664 }
a737bd4d 1665
91d6fa6a 1666 if ((range & exp.X_add_number) != 0)
c19d1205 1667 {
91d6fa6a 1668 int regno = range & exp.X_add_number;
a737bd4d 1669
c19d1205
ZW
1670 regno &= -regno;
1671 regno = (1 << regno) - 1;
1672 as_tsktsk
1673 (_("Warning: duplicated register (r%d) in register list"),
1674 regno);
1675 }
a737bd4d 1676
91d6fa6a 1677 range |= exp.X_add_number;
c19d1205
ZW
1678 }
1679 else
1680 {
1681 if (inst.reloc.type != 0)
1682 {
1683 inst.error = _("expression too complex");
1684 return FAIL;
1685 }
a737bd4d 1686
91d6fa6a 1687 memcpy (&inst.reloc.exp, &exp, sizeof (expressionS));
c19d1205
ZW
1688 inst.reloc.type = BFD_RELOC_ARM_MULTI;
1689 inst.reloc.pc_rel = 0;
1690 }
1691 }
a737bd4d 1692
c19d1205
ZW
1693 if (*str == '|' || *str == '+')
1694 {
1695 str++;
1696 another_range = 1;
1697 }
a737bd4d 1698 }
c19d1205 1699 while (another_range);
a737bd4d 1700
c19d1205
ZW
1701 *strp = str;
1702 return range;
a737bd4d
NC
1703}
1704
5287ad62
JB
1705/* Types of registers in a list. */
1706
1707enum reg_list_els
1708{
1709 REGLIST_VFP_S,
1710 REGLIST_VFP_D,
1711 REGLIST_NEON_D
1712};
1713
c19d1205
ZW
1714/* Parse a VFP register list. If the string is invalid return FAIL.
1715 Otherwise return the number of registers, and set PBASE to the first
5287ad62
JB
1716 register. Parses registers of type ETYPE.
1717 If REGLIST_NEON_D is used, several syntax enhancements are enabled:
1718 - Q registers can be used to specify pairs of D registers
1719 - { } can be omitted from around a singleton register list
477330fc
RM
1720 FIXME: This is not implemented, as it would require backtracking in
1721 some cases, e.g.:
1722 vtbl.8 d3,d4,d5
1723 This could be done (the meaning isn't really ambiguous), but doesn't
1724 fit in well with the current parsing framework.
dcbf9037
JB
1725 - 32 D registers may be used (also true for VFPv3).
1726 FIXME: Types are ignored in these register lists, which is probably a
1727 bug. */
6057a28f 1728
c19d1205 1729static int
037e8744 1730parse_vfp_reg_list (char **ccp, unsigned int *pbase, enum reg_list_els etype)
6057a28f 1731{
037e8744 1732 char *str = *ccp;
c19d1205
ZW
1733 int base_reg;
1734 int new_base;
21d799b5 1735 enum arm_reg_type regtype = (enum arm_reg_type) 0;
5287ad62 1736 int max_regs = 0;
c19d1205
ZW
1737 int count = 0;
1738 int warned = 0;
1739 unsigned long mask = 0;
a737bd4d 1740 int i;
6057a28f 1741
477330fc 1742 if (skip_past_char (&str, '{') == FAIL)
5287ad62
JB
1743 {
1744 inst.error = _("expecting {");
1745 return FAIL;
1746 }
6057a28f 1747
5287ad62 1748 switch (etype)
c19d1205 1749 {
5287ad62 1750 case REGLIST_VFP_S:
c19d1205
ZW
1751 regtype = REG_TYPE_VFS;
1752 max_regs = 32;
5287ad62 1753 break;
5f4273c7 1754
5287ad62
JB
1755 case REGLIST_VFP_D:
1756 regtype = REG_TYPE_VFD;
b7fc2769 1757 break;
5f4273c7 1758
b7fc2769
JB
1759 case REGLIST_NEON_D:
1760 regtype = REG_TYPE_NDQ;
1761 break;
1762 }
1763
1764 if (etype != REGLIST_VFP_S)
1765 {
b1cc4aeb
PB
1766 /* VFPv3 allows 32 D registers, except for the VFPv3-D16 variant. */
1767 if (ARM_CPU_HAS_FEATURE (cpu_variant, fpu_vfp_ext_d32))
477330fc
RM
1768 {
1769 max_regs = 32;
1770 if (thumb_mode)
1771 ARM_MERGE_FEATURE_SETS (thumb_arch_used, thumb_arch_used,
1772 fpu_vfp_ext_d32);
1773 else
1774 ARM_MERGE_FEATURE_SETS (arm_arch_used, arm_arch_used,
1775 fpu_vfp_ext_d32);
1776 }
5287ad62 1777 else
477330fc 1778 max_regs = 16;
c19d1205 1779 }
6057a28f 1780
c19d1205 1781 base_reg = max_regs;
a737bd4d 1782
c19d1205
ZW
1783 do
1784 {
5287ad62 1785 int setmask = 1, addregs = 1;
dcbf9037 1786
037e8744 1787 new_base = arm_typed_reg_parse (&str, regtype, &regtype, NULL);
dcbf9037 1788
c19d1205 1789 if (new_base == FAIL)
a737bd4d 1790 {
dcbf9037 1791 first_error (_(reg_expected_msgs[regtype]));
c19d1205
ZW
1792 return FAIL;
1793 }
5f4273c7 1794
b7fc2769 1795 if (new_base >= max_regs)
477330fc
RM
1796 {
1797 first_error (_("register out of range in list"));
1798 return FAIL;
1799 }
5f4273c7 1800
5287ad62
JB
1801 /* Note: a value of 2 * n is returned for the register Q<n>. */
1802 if (regtype == REG_TYPE_NQ)
477330fc
RM
1803 {
1804 setmask = 3;
1805 addregs = 2;
1806 }
5287ad62 1807
c19d1205
ZW
1808 if (new_base < base_reg)
1809 base_reg = new_base;
a737bd4d 1810
5287ad62 1811 if (mask & (setmask << new_base))
c19d1205 1812 {
dcbf9037 1813 first_error (_("invalid register list"));
c19d1205 1814 return FAIL;
a737bd4d 1815 }
a737bd4d 1816
c19d1205
ZW
1817 if ((mask >> new_base) != 0 && ! warned)
1818 {
1819 as_tsktsk (_("register list not in ascending order"));
1820 warned = 1;
1821 }
0bbf2aa4 1822
5287ad62
JB
1823 mask |= setmask << new_base;
1824 count += addregs;
0bbf2aa4 1825
037e8744 1826 if (*str == '-') /* We have the start of a range expression */
c19d1205
ZW
1827 {
1828 int high_range;
0bbf2aa4 1829
037e8744 1830 str++;
0bbf2aa4 1831
037e8744 1832 if ((high_range = arm_typed_reg_parse (&str, regtype, NULL, NULL))
477330fc 1833 == FAIL)
c19d1205
ZW
1834 {
1835 inst.error = gettext (reg_expected_msgs[regtype]);
1836 return FAIL;
1837 }
0bbf2aa4 1838
477330fc
RM
1839 if (high_range >= max_regs)
1840 {
1841 first_error (_("register out of range in list"));
1842 return FAIL;
1843 }
b7fc2769 1844
477330fc
RM
1845 if (regtype == REG_TYPE_NQ)
1846 high_range = high_range + 1;
5287ad62 1847
c19d1205
ZW
1848 if (high_range <= new_base)
1849 {
1850 inst.error = _("register range not in ascending order");
1851 return FAIL;
1852 }
0bbf2aa4 1853
5287ad62 1854 for (new_base += addregs; new_base <= high_range; new_base += addregs)
0bbf2aa4 1855 {
5287ad62 1856 if (mask & (setmask << new_base))
0bbf2aa4 1857 {
c19d1205
ZW
1858 inst.error = _("invalid register list");
1859 return FAIL;
0bbf2aa4 1860 }
c19d1205 1861
5287ad62
JB
1862 mask |= setmask << new_base;
1863 count += addregs;
0bbf2aa4 1864 }
0bbf2aa4 1865 }
0bbf2aa4 1866 }
037e8744 1867 while (skip_past_comma (&str) != FAIL);
0bbf2aa4 1868
037e8744 1869 str++;
0bbf2aa4 1870
c19d1205
ZW
1871 /* Sanity check -- should have raised a parse error above. */
1872 if (count == 0 || count > max_regs)
1873 abort ();
1874
1875 *pbase = base_reg;
1876
1877 /* Final test -- the registers must be consecutive. */
1878 mask >>= base_reg;
1879 for (i = 0; i < count; i++)
1880 {
1881 if ((mask & (1u << i)) == 0)
1882 {
1883 inst.error = _("non-contiguous register range");
1884 return FAIL;
1885 }
1886 }
1887
037e8744
JB
1888 *ccp = str;
1889
c19d1205 1890 return count;
b99bd4ef
NC
1891}
1892
dcbf9037
JB
1893/* True if two alias types are the same. */
1894
c921be7d 1895static bfd_boolean
dcbf9037
JB
1896neon_alias_types_same (struct neon_typed_alias *a, struct neon_typed_alias *b)
1897{
1898 if (!a && !b)
c921be7d 1899 return TRUE;
5f4273c7 1900
dcbf9037 1901 if (!a || !b)
c921be7d 1902 return FALSE;
dcbf9037
JB
1903
1904 if (a->defined != b->defined)
c921be7d 1905 return FALSE;
5f4273c7 1906
dcbf9037
JB
1907 if ((a->defined & NTA_HASTYPE) != 0
1908 && (a->eltype.type != b->eltype.type
477330fc 1909 || a->eltype.size != b->eltype.size))
c921be7d 1910 return FALSE;
dcbf9037
JB
1911
1912 if ((a->defined & NTA_HASINDEX) != 0
1913 && (a->index != b->index))
c921be7d 1914 return FALSE;
5f4273c7 1915
c921be7d 1916 return TRUE;
dcbf9037
JB
1917}
1918
5287ad62
JB
1919/* Parse element/structure lists for Neon VLD<n> and VST<n> instructions.
1920 The base register is put in *PBASE.
dcbf9037 1921 The lane (or one of the NEON_*_LANES constants) is placed in bits [3:0] of
5287ad62
JB
1922 the return value.
1923 The register stride (minus one) is put in bit 4 of the return value.
dcbf9037
JB
1924 Bits [6:5] encode the list length (minus one).
1925 The type of the list elements is put in *ELTYPE, if non-NULL. */
5287ad62 1926
5287ad62 1927#define NEON_LANE(X) ((X) & 0xf)
dcbf9037 1928#define NEON_REG_STRIDE(X) ((((X) >> 4) & 1) + 1)
5287ad62
JB
1929#define NEON_REGLIST_LENGTH(X) ((((X) >> 5) & 3) + 1)
1930
1931static int
dcbf9037 1932parse_neon_el_struct_list (char **str, unsigned *pbase,
477330fc 1933 struct neon_type_el *eltype)
5287ad62
JB
1934{
1935 char *ptr = *str;
1936 int base_reg = -1;
1937 int reg_incr = -1;
1938 int count = 0;
1939 int lane = -1;
1940 int leading_brace = 0;
1941 enum arm_reg_type rtype = REG_TYPE_NDQ;
20203fb9
NC
1942 const char *const incr_error = _("register stride must be 1 or 2");
1943 const char *const type_error = _("mismatched element/structure types in list");
dcbf9037 1944 struct neon_typed_alias firsttype;
5f4273c7 1945
5287ad62
JB
1946 if (skip_past_char (&ptr, '{') == SUCCESS)
1947 leading_brace = 1;
5f4273c7 1948
5287ad62
JB
1949 do
1950 {
dcbf9037
JB
1951 struct neon_typed_alias atype;
1952 int getreg = parse_typed_reg_or_scalar (&ptr, rtype, &rtype, &atype);
1953
5287ad62 1954 if (getreg == FAIL)
477330fc
RM
1955 {
1956 first_error (_(reg_expected_msgs[rtype]));
1957 return FAIL;
1958 }
5f4273c7 1959
5287ad62 1960 if (base_reg == -1)
477330fc
RM
1961 {
1962 base_reg = getreg;
1963 if (rtype == REG_TYPE_NQ)
1964 {
1965 reg_incr = 1;
1966 }
1967 firsttype = atype;
1968 }
5287ad62 1969 else if (reg_incr == -1)
477330fc
RM
1970 {
1971 reg_incr = getreg - base_reg;
1972 if (reg_incr < 1 || reg_incr > 2)
1973 {
1974 first_error (_(incr_error));
1975 return FAIL;
1976 }
1977 }
5287ad62 1978 else if (getreg != base_reg + reg_incr * count)
477330fc
RM
1979 {
1980 first_error (_(incr_error));
1981 return FAIL;
1982 }
dcbf9037 1983
c921be7d 1984 if (! neon_alias_types_same (&atype, &firsttype))
477330fc
RM
1985 {
1986 first_error (_(type_error));
1987 return FAIL;
1988 }
5f4273c7 1989
5287ad62 1990 /* Handle Dn-Dm or Qn-Qm syntax. Can only be used with non-indexed list
477330fc 1991 modes. */
5287ad62 1992 if (ptr[0] == '-')
477330fc
RM
1993 {
1994 struct neon_typed_alias htype;
1995 int hireg, dregs = (rtype == REG_TYPE_NQ) ? 2 : 1;
1996 if (lane == -1)
1997 lane = NEON_INTERLEAVE_LANES;
1998 else if (lane != NEON_INTERLEAVE_LANES)
1999 {
2000 first_error (_(type_error));
2001 return FAIL;
2002 }
2003 if (reg_incr == -1)
2004 reg_incr = 1;
2005 else if (reg_incr != 1)
2006 {
2007 first_error (_("don't use Rn-Rm syntax with non-unit stride"));
2008 return FAIL;
2009 }
2010 ptr++;
2011 hireg = parse_typed_reg_or_scalar (&ptr, rtype, NULL, &htype);
2012 if (hireg == FAIL)
2013 {
2014 first_error (_(reg_expected_msgs[rtype]));
2015 return FAIL;
2016 }
2017 if (! neon_alias_types_same (&htype, &firsttype))
2018 {
2019 first_error (_(type_error));
2020 return FAIL;
2021 }
2022 count += hireg + dregs - getreg;
2023 continue;
2024 }
5f4273c7 2025
5287ad62
JB
2026 /* If we're using Q registers, we can't use [] or [n] syntax. */
2027 if (rtype == REG_TYPE_NQ)
477330fc
RM
2028 {
2029 count += 2;
2030 continue;
2031 }
5f4273c7 2032
dcbf9037 2033 if ((atype.defined & NTA_HASINDEX) != 0)
477330fc
RM
2034 {
2035 if (lane == -1)
2036 lane = atype.index;
2037 else if (lane != atype.index)
2038 {
2039 first_error (_(type_error));
2040 return FAIL;
2041 }
2042 }
5287ad62 2043 else if (lane == -1)
477330fc 2044 lane = NEON_INTERLEAVE_LANES;
5287ad62 2045 else if (lane != NEON_INTERLEAVE_LANES)
477330fc
RM
2046 {
2047 first_error (_(type_error));
2048 return FAIL;
2049 }
5287ad62
JB
2050 count++;
2051 }
2052 while ((count != 1 || leading_brace) && skip_past_comma (&ptr) != FAIL);
5f4273c7 2053
5287ad62
JB
2054 /* No lane set by [x]. We must be interleaving structures. */
2055 if (lane == -1)
2056 lane = NEON_INTERLEAVE_LANES;
5f4273c7 2057
5287ad62
JB
2058 /* Sanity check. */
2059 if (lane == -1 || base_reg == -1 || count < 1 || count > 4
2060 || (count > 1 && reg_incr == -1))
2061 {
dcbf9037 2062 first_error (_("error parsing element/structure list"));
5287ad62
JB
2063 return FAIL;
2064 }
2065
2066 if ((count > 1 || leading_brace) && skip_past_char (&ptr, '}') == FAIL)
2067 {
dcbf9037 2068 first_error (_("expected }"));
5287ad62
JB
2069 return FAIL;
2070 }
5f4273c7 2071
5287ad62
JB
2072 if (reg_incr == -1)
2073 reg_incr = 1;
2074
dcbf9037
JB
2075 if (eltype)
2076 *eltype = firsttype.eltype;
2077
5287ad62
JB
2078 *pbase = base_reg;
2079 *str = ptr;
5f4273c7 2080
5287ad62
JB
2081 return lane | ((reg_incr - 1) << 4) | ((count - 1) << 5);
2082}
2083
c19d1205
ZW
2084/* Parse an explicit relocation suffix on an expression. This is
2085 either nothing, or a word in parentheses. Note that if !OBJ_ELF,
2086 arm_reloc_hsh contains no entries, so this function can only
2087 succeed if there is no () after the word. Returns -1 on error,
2088 BFD_RELOC_UNUSED if there wasn't any suffix. */
3da1d841 2089
c19d1205
ZW
2090static int
2091parse_reloc (char **str)
b99bd4ef 2092{
c19d1205
ZW
2093 struct reloc_entry *r;
2094 char *p, *q;
b99bd4ef 2095
c19d1205
ZW
2096 if (**str != '(')
2097 return BFD_RELOC_UNUSED;
b99bd4ef 2098
c19d1205
ZW
2099 p = *str + 1;
2100 q = p;
2101
2102 while (*q && *q != ')' && *q != ',')
2103 q++;
2104 if (*q != ')')
2105 return -1;
2106
21d799b5
NC
2107 if ((r = (struct reloc_entry *)
2108 hash_find_n (arm_reloc_hsh, p, q - p)) == NULL)
c19d1205
ZW
2109 return -1;
2110
2111 *str = q + 1;
2112 return r->reloc;
b99bd4ef
NC
2113}
2114
c19d1205
ZW
2115/* Directives: register aliases. */
2116
dcbf9037 2117static struct reg_entry *
90ec0d68 2118insert_reg_alias (char *str, unsigned number, int type)
b99bd4ef 2119{
d3ce72d0 2120 struct reg_entry *new_reg;
c19d1205 2121 const char *name;
b99bd4ef 2122
d3ce72d0 2123 if ((new_reg = (struct reg_entry *) hash_find (arm_reg_hsh, str)) != 0)
c19d1205 2124 {
d3ce72d0 2125 if (new_reg->builtin)
c19d1205 2126 as_warn (_("ignoring attempt to redefine built-in register '%s'"), str);
b99bd4ef 2127
c19d1205
ZW
2128 /* Only warn about a redefinition if it's not defined as the
2129 same register. */
d3ce72d0 2130 else if (new_reg->number != number || new_reg->type != type)
c19d1205 2131 as_warn (_("ignoring redefinition of register alias '%s'"), str);
69b97547 2132
d929913e 2133 return NULL;
c19d1205 2134 }
b99bd4ef 2135
c19d1205 2136 name = xstrdup (str);
d3ce72d0 2137 new_reg = (struct reg_entry *) xmalloc (sizeof (struct reg_entry));
b99bd4ef 2138
d3ce72d0
NC
2139 new_reg->name = name;
2140 new_reg->number = number;
2141 new_reg->type = type;
2142 new_reg->builtin = FALSE;
2143 new_reg->neon = NULL;
b99bd4ef 2144
d3ce72d0 2145 if (hash_insert (arm_reg_hsh, name, (void *) new_reg))
c19d1205 2146 abort ();
5f4273c7 2147
d3ce72d0 2148 return new_reg;
dcbf9037
JB
2149}
2150
2151static void
2152insert_neon_reg_alias (char *str, int number, int type,
477330fc 2153 struct neon_typed_alias *atype)
dcbf9037
JB
2154{
2155 struct reg_entry *reg = insert_reg_alias (str, number, type);
5f4273c7 2156
dcbf9037
JB
2157 if (!reg)
2158 {
2159 first_error (_("attempt to redefine typed alias"));
2160 return;
2161 }
5f4273c7 2162
dcbf9037
JB
2163 if (atype)
2164 {
21d799b5 2165 reg->neon = (struct neon_typed_alias *)
477330fc 2166 xmalloc (sizeof (struct neon_typed_alias));
dcbf9037
JB
2167 *reg->neon = *atype;
2168 }
c19d1205 2169}
b99bd4ef 2170
c19d1205 2171/* Look for the .req directive. This is of the form:
b99bd4ef 2172
c19d1205 2173 new_register_name .req existing_register_name
b99bd4ef 2174
c19d1205 2175 If we find one, or if it looks sufficiently like one that we want to
d929913e 2176 handle any error here, return TRUE. Otherwise return FALSE. */
b99bd4ef 2177
d929913e 2178static bfd_boolean
c19d1205
ZW
2179create_register_alias (char * newname, char *p)
2180{
2181 struct reg_entry *old;
2182 char *oldname, *nbuf;
2183 size_t nlen;
b99bd4ef 2184
c19d1205
ZW
2185 /* The input scrubber ensures that whitespace after the mnemonic is
2186 collapsed to single spaces. */
2187 oldname = p;
2188 if (strncmp (oldname, " .req ", 6) != 0)
d929913e 2189 return FALSE;
b99bd4ef 2190
c19d1205
ZW
2191 oldname += 6;
2192 if (*oldname == '\0')
d929913e 2193 return FALSE;
b99bd4ef 2194
21d799b5 2195 old = (struct reg_entry *) hash_find (arm_reg_hsh, oldname);
c19d1205 2196 if (!old)
b99bd4ef 2197 {
c19d1205 2198 as_warn (_("unknown register '%s' -- .req ignored"), oldname);
d929913e 2199 return TRUE;
b99bd4ef
NC
2200 }
2201
c19d1205
ZW
2202 /* If TC_CASE_SENSITIVE is defined, then newname already points to
2203 the desired alias name, and p points to its end. If not, then
2204 the desired alias name is in the global original_case_string. */
2205#ifdef TC_CASE_SENSITIVE
2206 nlen = p - newname;
2207#else
2208 newname = original_case_string;
2209 nlen = strlen (newname);
2210#endif
b99bd4ef 2211
21d799b5 2212 nbuf = (char *) alloca (nlen + 1);
c19d1205
ZW
2213 memcpy (nbuf, newname, nlen);
2214 nbuf[nlen] = '\0';
b99bd4ef 2215
c19d1205
ZW
2216 /* Create aliases under the new name as stated; an all-lowercase
2217 version of the new name; and an all-uppercase version of the new
2218 name. */
d929913e
NC
2219 if (insert_reg_alias (nbuf, old->number, old->type) != NULL)
2220 {
2221 for (p = nbuf; *p; p++)
2222 *p = TOUPPER (*p);
c19d1205 2223
d929913e
NC
2224 if (strncmp (nbuf, newname, nlen))
2225 {
2226 /* If this attempt to create an additional alias fails, do not bother
2227 trying to create the all-lower case alias. We will fail and issue
2228 a second, duplicate error message. This situation arises when the
2229 programmer does something like:
2230 foo .req r0
2231 Foo .req r1
2232 The second .req creates the "Foo" alias but then fails to create
5f4273c7 2233 the artificial FOO alias because it has already been created by the
d929913e
NC
2234 first .req. */
2235 if (insert_reg_alias (nbuf, old->number, old->type) == NULL)
2236 return TRUE;
2237 }
c19d1205 2238
d929913e
NC
2239 for (p = nbuf; *p; p++)
2240 *p = TOLOWER (*p);
c19d1205 2241
d929913e
NC
2242 if (strncmp (nbuf, newname, nlen))
2243 insert_reg_alias (nbuf, old->number, old->type);
2244 }
c19d1205 2245
d929913e 2246 return TRUE;
b99bd4ef
NC
2247}
2248
dcbf9037
JB
2249/* Create a Neon typed/indexed register alias using directives, e.g.:
2250 X .dn d5.s32[1]
2251 Y .qn 6.s16
2252 Z .dn d7
2253 T .dn Z[0]
2254 These typed registers can be used instead of the types specified after the
2255 Neon mnemonic, so long as all operands given have types. Types can also be
2256 specified directly, e.g.:
5f4273c7 2257 vadd d0.s32, d1.s32, d2.s32 */
dcbf9037 2258
c921be7d 2259static bfd_boolean
dcbf9037
JB
2260create_neon_reg_alias (char *newname, char *p)
2261{
2262 enum arm_reg_type basetype;
2263 struct reg_entry *basereg;
2264 struct reg_entry mybasereg;
2265 struct neon_type ntype;
2266 struct neon_typed_alias typeinfo;
12d6b0b7 2267 char *namebuf, *nameend ATTRIBUTE_UNUSED;
dcbf9037 2268 int namelen;
5f4273c7 2269
dcbf9037
JB
2270 typeinfo.defined = 0;
2271 typeinfo.eltype.type = NT_invtype;
2272 typeinfo.eltype.size = -1;
2273 typeinfo.index = -1;
5f4273c7 2274
dcbf9037 2275 nameend = p;
5f4273c7 2276
dcbf9037
JB
2277 if (strncmp (p, " .dn ", 5) == 0)
2278 basetype = REG_TYPE_VFD;
2279 else if (strncmp (p, " .qn ", 5) == 0)
2280 basetype = REG_TYPE_NQ;
2281 else
c921be7d 2282 return FALSE;
5f4273c7 2283
dcbf9037 2284 p += 5;
5f4273c7 2285
dcbf9037 2286 if (*p == '\0')
c921be7d 2287 return FALSE;
5f4273c7 2288
dcbf9037
JB
2289 basereg = arm_reg_parse_multi (&p);
2290
2291 if (basereg && basereg->type != basetype)
2292 {
2293 as_bad (_("bad type for register"));
c921be7d 2294 return FALSE;
dcbf9037
JB
2295 }
2296
2297 if (basereg == NULL)
2298 {
2299 expressionS exp;
2300 /* Try parsing as an integer. */
2301 my_get_expression (&exp, &p, GE_NO_PREFIX);
2302 if (exp.X_op != O_constant)
477330fc
RM
2303 {
2304 as_bad (_("expression must be constant"));
2305 return FALSE;
2306 }
dcbf9037
JB
2307 basereg = &mybasereg;
2308 basereg->number = (basetype == REG_TYPE_NQ) ? exp.X_add_number * 2
477330fc 2309 : exp.X_add_number;
dcbf9037
JB
2310 basereg->neon = 0;
2311 }
2312
2313 if (basereg->neon)
2314 typeinfo = *basereg->neon;
2315
2316 if (parse_neon_type (&ntype, &p) == SUCCESS)
2317 {
2318 /* We got a type. */
2319 if (typeinfo.defined & NTA_HASTYPE)
477330fc
RM
2320 {
2321 as_bad (_("can't redefine the type of a register alias"));
2322 return FALSE;
2323 }
5f4273c7 2324
dcbf9037
JB
2325 typeinfo.defined |= NTA_HASTYPE;
2326 if (ntype.elems != 1)
477330fc
RM
2327 {
2328 as_bad (_("you must specify a single type only"));
2329 return FALSE;
2330 }
dcbf9037
JB
2331 typeinfo.eltype = ntype.el[0];
2332 }
5f4273c7 2333
dcbf9037
JB
2334 if (skip_past_char (&p, '[') == SUCCESS)
2335 {
2336 expressionS exp;
2337 /* We got a scalar index. */
5f4273c7 2338
dcbf9037 2339 if (typeinfo.defined & NTA_HASINDEX)
477330fc
RM
2340 {
2341 as_bad (_("can't redefine the index of a scalar alias"));
2342 return FALSE;
2343 }
5f4273c7 2344
dcbf9037 2345 my_get_expression (&exp, &p, GE_NO_PREFIX);
5f4273c7 2346
dcbf9037 2347 if (exp.X_op != O_constant)
477330fc
RM
2348 {
2349 as_bad (_("scalar index must be constant"));
2350 return FALSE;
2351 }
5f4273c7 2352
dcbf9037
JB
2353 typeinfo.defined |= NTA_HASINDEX;
2354 typeinfo.index = exp.X_add_number;
5f4273c7 2355
dcbf9037 2356 if (skip_past_char (&p, ']') == FAIL)
477330fc
RM
2357 {
2358 as_bad (_("expecting ]"));
2359 return FALSE;
2360 }
dcbf9037
JB
2361 }
2362
15735687
NS
2363 /* If TC_CASE_SENSITIVE is defined, then newname already points to
2364 the desired alias name, and p points to its end. If not, then
2365 the desired alias name is in the global original_case_string. */
2366#ifdef TC_CASE_SENSITIVE
dcbf9037 2367 namelen = nameend - newname;
15735687
NS
2368#else
2369 newname = original_case_string;
2370 namelen = strlen (newname);
2371#endif
2372
21d799b5 2373 namebuf = (char *) alloca (namelen + 1);
dcbf9037
JB
2374 strncpy (namebuf, newname, namelen);
2375 namebuf[namelen] = '\0';
5f4273c7 2376
dcbf9037 2377 insert_neon_reg_alias (namebuf, basereg->number, basetype,
477330fc 2378 typeinfo.defined != 0 ? &typeinfo : NULL);
5f4273c7 2379
dcbf9037
JB
2380 /* Insert name in all uppercase. */
2381 for (p = namebuf; *p; p++)
2382 *p = TOUPPER (*p);
5f4273c7 2383
dcbf9037
JB
2384 if (strncmp (namebuf, newname, namelen))
2385 insert_neon_reg_alias (namebuf, basereg->number, basetype,
477330fc 2386 typeinfo.defined != 0 ? &typeinfo : NULL);
5f4273c7 2387
dcbf9037
JB
2388 /* Insert name in all lowercase. */
2389 for (p = namebuf; *p; p++)
2390 *p = TOLOWER (*p);
5f4273c7 2391
dcbf9037
JB
2392 if (strncmp (namebuf, newname, namelen))
2393 insert_neon_reg_alias (namebuf, basereg->number, basetype,
477330fc 2394 typeinfo.defined != 0 ? &typeinfo : NULL);
5f4273c7 2395
c921be7d 2396 return TRUE;
dcbf9037
JB
2397}
2398
c19d1205
ZW
2399/* Should never be called, as .req goes between the alias and the
2400 register name, not at the beginning of the line. */
c921be7d 2401
b99bd4ef 2402static void
c19d1205 2403s_req (int a ATTRIBUTE_UNUSED)
b99bd4ef 2404{
c19d1205
ZW
2405 as_bad (_("invalid syntax for .req directive"));
2406}
b99bd4ef 2407
dcbf9037
JB
2408static void
2409s_dn (int a ATTRIBUTE_UNUSED)
2410{
2411 as_bad (_("invalid syntax for .dn directive"));
2412}
2413
2414static void
2415s_qn (int a ATTRIBUTE_UNUSED)
2416{
2417 as_bad (_("invalid syntax for .qn directive"));
2418}
2419
c19d1205
ZW
2420/* The .unreq directive deletes an alias which was previously defined
2421 by .req. For example:
b99bd4ef 2422
c19d1205
ZW
2423 my_alias .req r11
2424 .unreq my_alias */
b99bd4ef
NC
2425
2426static void
c19d1205 2427s_unreq (int a ATTRIBUTE_UNUSED)
b99bd4ef 2428{
c19d1205
ZW
2429 char * name;
2430 char saved_char;
b99bd4ef 2431
c19d1205
ZW
2432 name = input_line_pointer;
2433
2434 while (*input_line_pointer != 0
2435 && *input_line_pointer != ' '
2436 && *input_line_pointer != '\n')
2437 ++input_line_pointer;
2438
2439 saved_char = *input_line_pointer;
2440 *input_line_pointer = 0;
2441
2442 if (!*name)
2443 as_bad (_("invalid syntax for .unreq directive"));
2444 else
2445 {
21d799b5 2446 struct reg_entry *reg = (struct reg_entry *) hash_find (arm_reg_hsh,
477330fc 2447 name);
c19d1205
ZW
2448
2449 if (!reg)
2450 as_bad (_("unknown register alias '%s'"), name);
2451 else if (reg->builtin)
a1727c1a 2452 as_warn (_("ignoring attempt to use .unreq on fixed register name: '%s'"),
c19d1205
ZW
2453 name);
2454 else
2455 {
d929913e
NC
2456 char * p;
2457 char * nbuf;
2458
db0bc284 2459 hash_delete (arm_reg_hsh, name, FALSE);
c19d1205 2460 free ((char *) reg->name);
477330fc
RM
2461 if (reg->neon)
2462 free (reg->neon);
c19d1205 2463 free (reg);
d929913e
NC
2464
2465 /* Also locate the all upper case and all lower case versions.
2466 Do not complain if we cannot find one or the other as it
2467 was probably deleted above. */
5f4273c7 2468
d929913e
NC
2469 nbuf = strdup (name);
2470 for (p = nbuf; *p; p++)
2471 *p = TOUPPER (*p);
21d799b5 2472 reg = (struct reg_entry *) hash_find (arm_reg_hsh, nbuf);
d929913e
NC
2473 if (reg)
2474 {
db0bc284 2475 hash_delete (arm_reg_hsh, nbuf, FALSE);
d929913e
NC
2476 free ((char *) reg->name);
2477 if (reg->neon)
2478 free (reg->neon);
2479 free (reg);
2480 }
2481
2482 for (p = nbuf; *p; p++)
2483 *p = TOLOWER (*p);
21d799b5 2484 reg = (struct reg_entry *) hash_find (arm_reg_hsh, nbuf);
d929913e
NC
2485 if (reg)
2486 {
db0bc284 2487 hash_delete (arm_reg_hsh, nbuf, FALSE);
d929913e
NC
2488 free ((char *) reg->name);
2489 if (reg->neon)
2490 free (reg->neon);
2491 free (reg);
2492 }
2493
2494 free (nbuf);
c19d1205
ZW
2495 }
2496 }
b99bd4ef 2497
c19d1205 2498 *input_line_pointer = saved_char;
b99bd4ef
NC
2499 demand_empty_rest_of_line ();
2500}
2501
c19d1205
ZW
2502/* Directives: Instruction set selection. */
2503
2504#ifdef OBJ_ELF
2505/* This code is to handle mapping symbols as defined in the ARM ELF spec.
2506 (See "Mapping symbols", section 4.5.5, ARM AAELF version 1.0).
2507 Note that previously, $a and $t has type STT_FUNC (BSF_OBJECT flag),
2508 and $d has type STT_OBJECT (BSF_OBJECT flag). Now all three are untyped. */
2509
cd000bff
DJ
2510/* Create a new mapping symbol for the transition to STATE. */
2511
2512static void
2513make_mapping_symbol (enum mstate state, valueT value, fragS *frag)
b99bd4ef 2514{
a737bd4d 2515 symbolS * symbolP;
c19d1205
ZW
2516 const char * symname;
2517 int type;
b99bd4ef 2518
c19d1205 2519 switch (state)
b99bd4ef 2520 {
c19d1205
ZW
2521 case MAP_DATA:
2522 symname = "$d";
2523 type = BSF_NO_FLAGS;
2524 break;
2525 case MAP_ARM:
2526 symname = "$a";
2527 type = BSF_NO_FLAGS;
2528 break;
2529 case MAP_THUMB:
2530 symname = "$t";
2531 type = BSF_NO_FLAGS;
2532 break;
c19d1205
ZW
2533 default:
2534 abort ();
2535 }
2536
cd000bff 2537 symbolP = symbol_new (symname, now_seg, value, frag);
c19d1205
ZW
2538 symbol_get_bfdsym (symbolP)->flags |= type | BSF_LOCAL;
2539
2540 switch (state)
2541 {
2542 case MAP_ARM:
2543 THUMB_SET_FUNC (symbolP, 0);
2544 ARM_SET_THUMB (symbolP, 0);
2545 ARM_SET_INTERWORK (symbolP, support_interwork);
2546 break;
2547
2548 case MAP_THUMB:
2549 THUMB_SET_FUNC (symbolP, 1);
2550 ARM_SET_THUMB (symbolP, 1);
2551 ARM_SET_INTERWORK (symbolP, support_interwork);
2552 break;
2553
2554 case MAP_DATA:
2555 default:
cd000bff
DJ
2556 break;
2557 }
2558
2559 /* Save the mapping symbols for future reference. Also check that
2560 we do not place two mapping symbols at the same offset within a
2561 frag. We'll handle overlap between frags in
2de7820f
JZ
2562 check_mapping_symbols.
2563
2564 If .fill or other data filling directive generates zero sized data,
2565 the mapping symbol for the following code will have the same value
2566 as the one generated for the data filling directive. In this case,
2567 we replace the old symbol with the new one at the same address. */
cd000bff
DJ
2568 if (value == 0)
2569 {
2de7820f
JZ
2570 if (frag->tc_frag_data.first_map != NULL)
2571 {
2572 know (S_GET_VALUE (frag->tc_frag_data.first_map) == 0);
2573 symbol_remove (frag->tc_frag_data.first_map, &symbol_rootP, &symbol_lastP);
2574 }
cd000bff
DJ
2575 frag->tc_frag_data.first_map = symbolP;
2576 }
2577 if (frag->tc_frag_data.last_map != NULL)
0f020cef
JZ
2578 {
2579 know (S_GET_VALUE (frag->tc_frag_data.last_map) <= S_GET_VALUE (symbolP));
0f020cef
JZ
2580 if (S_GET_VALUE (frag->tc_frag_data.last_map) == S_GET_VALUE (symbolP))
2581 symbol_remove (frag->tc_frag_data.last_map, &symbol_rootP, &symbol_lastP);
2582 }
cd000bff
DJ
2583 frag->tc_frag_data.last_map = symbolP;
2584}
2585
2586/* We must sometimes convert a region marked as code to data during
2587 code alignment, if an odd number of bytes have to be padded. The
2588 code mapping symbol is pushed to an aligned address. */
2589
2590static void
2591insert_data_mapping_symbol (enum mstate state,
2592 valueT value, fragS *frag, offsetT bytes)
2593{
2594 /* If there was already a mapping symbol, remove it. */
2595 if (frag->tc_frag_data.last_map != NULL
2596 && S_GET_VALUE (frag->tc_frag_data.last_map) == frag->fr_address + value)
2597 {
2598 symbolS *symp = frag->tc_frag_data.last_map;
2599
2600 if (value == 0)
2601 {
2602 know (frag->tc_frag_data.first_map == symp);
2603 frag->tc_frag_data.first_map = NULL;
2604 }
2605 frag->tc_frag_data.last_map = NULL;
2606 symbol_remove (symp, &symbol_rootP, &symbol_lastP);
c19d1205 2607 }
cd000bff
DJ
2608
2609 make_mapping_symbol (MAP_DATA, value, frag);
2610 make_mapping_symbol (state, value + bytes, frag);
2611}
2612
2613static void mapping_state_2 (enum mstate state, int max_chars);
2614
2615/* Set the mapping state to STATE. Only call this when about to
2616 emit some STATE bytes to the file. */
2617
2618void
2619mapping_state (enum mstate state)
2620{
940b5ce0
DJ
2621 enum mstate mapstate = seg_info (now_seg)->tc_segment_info_data.mapstate;
2622
cd000bff
DJ
2623#define TRANSITION(from, to) (mapstate == (from) && state == (to))
2624
2625 if (mapstate == state)
2626 /* The mapping symbol has already been emitted.
2627 There is nothing else to do. */
2628 return;
49c62a33
NC
2629
2630 if (state == MAP_ARM || state == MAP_THUMB)
2631 /* PR gas/12931
2632 All ARM instructions require 4-byte alignment.
2633 (Almost) all Thumb instructions require 2-byte alignment.
2634
2635 When emitting instructions into any section, mark the section
2636 appropriately.
2637
2638 Some Thumb instructions are alignment-sensitive modulo 4 bytes,
2639 but themselves require 2-byte alignment; this applies to some
2640 PC- relative forms. However, these cases will invovle implicit
2641 literal pool generation or an explicit .align >=2, both of
2642 which will cause the section to me marked with sufficient
2643 alignment. Thus, we don't handle those cases here. */
2644 record_alignment (now_seg, state == MAP_ARM ? 2 : 1);
2645
2646 if (TRANSITION (MAP_UNDEFINED, MAP_DATA))
cd000bff
DJ
2647 /* This case will be evaluated later in the next else. */
2648 return;
2649 else if (TRANSITION (MAP_UNDEFINED, MAP_ARM)
477330fc 2650 || TRANSITION (MAP_UNDEFINED, MAP_THUMB))
cd000bff
DJ
2651 {
2652 /* Only add the symbol if the offset is > 0:
477330fc
RM
2653 if we're at the first frag, check it's size > 0;
2654 if we're not at the first frag, then for sure
2655 the offset is > 0. */
cd000bff
DJ
2656 struct frag * const frag_first = seg_info (now_seg)->frchainP->frch_root;
2657 const int add_symbol = (frag_now != frag_first) || (frag_now_fix () > 0);
2658
2659 if (add_symbol)
477330fc 2660 make_mapping_symbol (MAP_DATA, (valueT) 0, frag_first);
cd000bff
DJ
2661 }
2662
2663 mapping_state_2 (state, 0);
2664#undef TRANSITION
2665}
2666
2667/* Same as mapping_state, but MAX_CHARS bytes have already been
2668 allocated. Put the mapping symbol that far back. */
2669
2670static void
2671mapping_state_2 (enum mstate state, int max_chars)
2672{
940b5ce0
DJ
2673 enum mstate mapstate = seg_info (now_seg)->tc_segment_info_data.mapstate;
2674
2675 if (!SEG_NORMAL (now_seg))
2676 return;
2677
cd000bff
DJ
2678 if (mapstate == state)
2679 /* The mapping symbol has already been emitted.
2680 There is nothing else to do. */
2681 return;
2682
cd000bff
DJ
2683 seg_info (now_seg)->tc_segment_info_data.mapstate = state;
2684 make_mapping_symbol (state, (valueT) frag_now_fix () - max_chars, frag_now);
c19d1205
ZW
2685}
2686#else
d3106081
NS
2687#define mapping_state(x) ((void)0)
2688#define mapping_state_2(x, y) ((void)0)
c19d1205
ZW
2689#endif
2690
2691/* Find the real, Thumb encoded start of a Thumb function. */
2692
4343666d 2693#ifdef OBJ_COFF
c19d1205
ZW
2694static symbolS *
2695find_real_start (symbolS * symbolP)
2696{
2697 char * real_start;
2698 const char * name = S_GET_NAME (symbolP);
2699 symbolS * new_target;
2700
2701 /* This definition must agree with the one in gcc/config/arm/thumb.c. */
2702#define STUB_NAME ".real_start_of"
2703
2704 if (name == NULL)
2705 abort ();
2706
37f6032b
ZW
2707 /* The compiler may generate BL instructions to local labels because
2708 it needs to perform a branch to a far away location. These labels
2709 do not have a corresponding ".real_start_of" label. We check
2710 both for S_IS_LOCAL and for a leading dot, to give a way to bypass
2711 the ".real_start_of" convention for nonlocal branches. */
2712 if (S_IS_LOCAL (symbolP) || name[0] == '.')
c19d1205
ZW
2713 return symbolP;
2714
37f6032b 2715 real_start = ACONCAT ((STUB_NAME, name, NULL));
c19d1205
ZW
2716 new_target = symbol_find (real_start);
2717
2718 if (new_target == NULL)
2719 {
bd3ba5d1 2720 as_warn (_("Failed to find real start of function: %s\n"), name);
c19d1205
ZW
2721 new_target = symbolP;
2722 }
2723
c19d1205
ZW
2724 return new_target;
2725}
4343666d 2726#endif
c19d1205
ZW
2727
2728static void
2729opcode_select (int width)
2730{
2731 switch (width)
2732 {
2733 case 16:
2734 if (! thumb_mode)
2735 {
e74cfd16 2736 if (!ARM_CPU_HAS_FEATURE (cpu_variant, arm_ext_v4t))
c19d1205
ZW
2737 as_bad (_("selected processor does not support THUMB opcodes"));
2738
2739 thumb_mode = 1;
2740 /* No need to force the alignment, since we will have been
2741 coming from ARM mode, which is word-aligned. */
2742 record_alignment (now_seg, 1);
2743 }
c19d1205
ZW
2744 break;
2745
2746 case 32:
2747 if (thumb_mode)
2748 {
e74cfd16 2749 if (!ARM_CPU_HAS_FEATURE (cpu_variant, arm_ext_v1))
c19d1205
ZW
2750 as_bad (_("selected processor does not support ARM opcodes"));
2751
2752 thumb_mode = 0;
2753
2754 if (!need_pass_2)
2755 frag_align (2, 0, 0);
2756
2757 record_alignment (now_seg, 1);
2758 }
c19d1205
ZW
2759 break;
2760
2761 default:
2762 as_bad (_("invalid instruction size selected (%d)"), width);
2763 }
2764}
2765
2766static void
2767s_arm (int ignore ATTRIBUTE_UNUSED)
2768{
2769 opcode_select (32);
2770 demand_empty_rest_of_line ();
2771}
2772
2773static void
2774s_thumb (int ignore ATTRIBUTE_UNUSED)
2775{
2776 opcode_select (16);
2777 demand_empty_rest_of_line ();
2778}
2779
2780static void
2781s_code (int unused ATTRIBUTE_UNUSED)
2782{
2783 int temp;
2784
2785 temp = get_absolute_expression ();
2786 switch (temp)
2787 {
2788 case 16:
2789 case 32:
2790 opcode_select (temp);
2791 break;
2792
2793 default:
2794 as_bad (_("invalid operand to .code directive (%d) (expecting 16 or 32)"), temp);
2795 }
2796}
2797
2798static void
2799s_force_thumb (int ignore ATTRIBUTE_UNUSED)
2800{
2801 /* If we are not already in thumb mode go into it, EVEN if
2802 the target processor does not support thumb instructions.
2803 This is used by gcc/config/arm/lib1funcs.asm for example
2804 to compile interworking support functions even if the
2805 target processor should not support interworking. */
2806 if (! thumb_mode)
2807 {
2808 thumb_mode = 2;
2809 record_alignment (now_seg, 1);
2810 }
2811
2812 demand_empty_rest_of_line ();
2813}
2814
2815static void
2816s_thumb_func (int ignore ATTRIBUTE_UNUSED)
2817{
2818 s_thumb (0);
2819
2820 /* The following label is the name/address of the start of a Thumb function.
2821 We need to know this for the interworking support. */
2822 label_is_thumb_function_name = TRUE;
2823}
2824
2825/* Perform a .set directive, but also mark the alias as
2826 being a thumb function. */
2827
2828static void
2829s_thumb_set (int equiv)
2830{
2831 /* XXX the following is a duplicate of the code for s_set() in read.c
2832 We cannot just call that code as we need to get at the symbol that
2833 is created. */
2834 char * name;
2835 char delim;
2836 char * end_name;
2837 symbolS * symbolP;
2838
2839 /* Especial apologies for the random logic:
2840 This just grew, and could be parsed much more simply!
2841 Dean - in haste. */
2842 name = input_line_pointer;
2843 delim = get_symbol_end ();
2844 end_name = input_line_pointer;
2845 *end_name = delim;
2846
2847 if (*input_line_pointer != ',')
2848 {
2849 *end_name = 0;
2850 as_bad (_("expected comma after name \"%s\""), name);
b99bd4ef
NC
2851 *end_name = delim;
2852 ignore_rest_of_line ();
2853 return;
2854 }
2855
2856 input_line_pointer++;
2857 *end_name = 0;
2858
2859 if (name[0] == '.' && name[1] == '\0')
2860 {
2861 /* XXX - this should not happen to .thumb_set. */
2862 abort ();
2863 }
2864
2865 if ((symbolP = symbol_find (name)) == NULL
2866 && (symbolP = md_undefined_symbol (name)) == NULL)
2867 {
2868#ifndef NO_LISTING
2869 /* When doing symbol listings, play games with dummy fragments living
2870 outside the normal fragment chain to record the file and line info
c19d1205 2871 for this symbol. */
b99bd4ef
NC
2872 if (listing & LISTING_SYMBOLS)
2873 {
2874 extern struct list_info_struct * listing_tail;
21d799b5 2875 fragS * dummy_frag = (fragS * ) xmalloc (sizeof (fragS));
b99bd4ef
NC
2876
2877 memset (dummy_frag, 0, sizeof (fragS));
2878 dummy_frag->fr_type = rs_fill;
2879 dummy_frag->line = listing_tail;
2880 symbolP = symbol_new (name, undefined_section, 0, dummy_frag);
2881 dummy_frag->fr_symbol = symbolP;
2882 }
2883 else
2884#endif
2885 symbolP = symbol_new (name, undefined_section, 0, &zero_address_frag);
2886
2887#ifdef OBJ_COFF
2888 /* "set" symbols are local unless otherwise specified. */
2889 SF_SET_LOCAL (symbolP);
2890#endif /* OBJ_COFF */
2891 } /* Make a new symbol. */
2892
2893 symbol_table_insert (symbolP);
2894
2895 * end_name = delim;
2896
2897 if (equiv
2898 && S_IS_DEFINED (symbolP)
2899 && S_GET_SEGMENT (symbolP) != reg_section)
2900 as_bad (_("symbol `%s' already defined"), S_GET_NAME (symbolP));
2901
2902 pseudo_set (symbolP);
2903
2904 demand_empty_rest_of_line ();
2905
c19d1205 2906 /* XXX Now we come to the Thumb specific bit of code. */
b99bd4ef
NC
2907
2908 THUMB_SET_FUNC (symbolP, 1);
2909 ARM_SET_THUMB (symbolP, 1);
2910#if defined OBJ_ELF || defined OBJ_COFF
2911 ARM_SET_INTERWORK (symbolP, support_interwork);
2912#endif
2913}
2914
c19d1205 2915/* Directives: Mode selection. */
b99bd4ef 2916
c19d1205
ZW
2917/* .syntax [unified|divided] - choose the new unified syntax
2918 (same for Arm and Thumb encoding, modulo slight differences in what
2919 can be represented) or the old divergent syntax for each mode. */
b99bd4ef 2920static void
c19d1205 2921s_syntax (int unused ATTRIBUTE_UNUSED)
b99bd4ef 2922{
c19d1205
ZW
2923 char *name, delim;
2924
2925 name = input_line_pointer;
2926 delim = get_symbol_end ();
2927
2928 if (!strcasecmp (name, "unified"))
2929 unified_syntax = TRUE;
2930 else if (!strcasecmp (name, "divided"))
2931 unified_syntax = FALSE;
2932 else
2933 {
2934 as_bad (_("unrecognized syntax mode \"%s\""), name);
2935 return;
2936 }
2937 *input_line_pointer = delim;
b99bd4ef
NC
2938 demand_empty_rest_of_line ();
2939}
2940
c19d1205
ZW
2941/* Directives: sectioning and alignment. */
2942
2943/* Same as s_align_ptwo but align 0 => align 2. */
2944
b99bd4ef 2945static void
c19d1205 2946s_align (int unused ATTRIBUTE_UNUSED)
b99bd4ef 2947{
a737bd4d 2948 int temp;
dce323d1 2949 bfd_boolean fill_p;
c19d1205
ZW
2950 long temp_fill;
2951 long max_alignment = 15;
b99bd4ef
NC
2952
2953 temp = get_absolute_expression ();
c19d1205
ZW
2954 if (temp > max_alignment)
2955 as_bad (_("alignment too large: %d assumed"), temp = max_alignment);
2956 else if (temp < 0)
b99bd4ef 2957 {
c19d1205
ZW
2958 as_bad (_("alignment negative. 0 assumed."));
2959 temp = 0;
2960 }
b99bd4ef 2961
c19d1205
ZW
2962 if (*input_line_pointer == ',')
2963 {
2964 input_line_pointer++;
2965 temp_fill = get_absolute_expression ();
dce323d1 2966 fill_p = TRUE;
b99bd4ef 2967 }
c19d1205 2968 else
dce323d1
PB
2969 {
2970 fill_p = FALSE;
2971 temp_fill = 0;
2972 }
b99bd4ef 2973
c19d1205
ZW
2974 if (!temp)
2975 temp = 2;
b99bd4ef 2976
c19d1205
ZW
2977 /* Only make a frag if we HAVE to. */
2978 if (temp && !need_pass_2)
dce323d1
PB
2979 {
2980 if (!fill_p && subseg_text_p (now_seg))
2981 frag_align_code (temp, 0);
2982 else
2983 frag_align (temp, (int) temp_fill, 0);
2984 }
c19d1205
ZW
2985 demand_empty_rest_of_line ();
2986
2987 record_alignment (now_seg, temp);
b99bd4ef
NC
2988}
2989
c19d1205
ZW
2990static void
2991s_bss (int ignore ATTRIBUTE_UNUSED)
b99bd4ef 2992{
c19d1205
ZW
2993 /* We don't support putting frags in the BSS segment, we fake it by
2994 marking in_bss, then looking at s_skip for clues. */
2995 subseg_set (bss_section, 0);
2996 demand_empty_rest_of_line ();
cd000bff
DJ
2997
2998#ifdef md_elf_section_change_hook
2999 md_elf_section_change_hook ();
3000#endif
c19d1205 3001}
b99bd4ef 3002
c19d1205
ZW
3003static void
3004s_even (int ignore ATTRIBUTE_UNUSED)
3005{
3006 /* Never make frag if expect extra pass. */
3007 if (!need_pass_2)
3008 frag_align (1, 0, 0);
b99bd4ef 3009
c19d1205 3010 record_alignment (now_seg, 1);
b99bd4ef 3011
c19d1205 3012 demand_empty_rest_of_line ();
b99bd4ef
NC
3013}
3014
c19d1205 3015/* Directives: Literal pools. */
a737bd4d 3016
c19d1205
ZW
3017static literal_pool *
3018find_literal_pool (void)
a737bd4d 3019{
c19d1205 3020 literal_pool * pool;
a737bd4d 3021
c19d1205 3022 for (pool = list_of_pools; pool != NULL; pool = pool->next)
a737bd4d 3023 {
c19d1205
ZW
3024 if (pool->section == now_seg
3025 && pool->sub_section == now_subseg)
3026 break;
a737bd4d
NC
3027 }
3028
c19d1205 3029 return pool;
a737bd4d
NC
3030}
3031
c19d1205
ZW
3032static literal_pool *
3033find_or_make_literal_pool (void)
a737bd4d 3034{
c19d1205
ZW
3035 /* Next literal pool ID number. */
3036 static unsigned int latest_pool_num = 1;
3037 literal_pool * pool;
a737bd4d 3038
c19d1205 3039 pool = find_literal_pool ();
a737bd4d 3040
c19d1205 3041 if (pool == NULL)
a737bd4d 3042 {
c19d1205 3043 /* Create a new pool. */
21d799b5 3044 pool = (literal_pool *) xmalloc (sizeof (* pool));
c19d1205
ZW
3045 if (! pool)
3046 return NULL;
a737bd4d 3047
c19d1205
ZW
3048 pool->next_free_entry = 0;
3049 pool->section = now_seg;
3050 pool->sub_section = now_subseg;
3051 pool->next = list_of_pools;
3052 pool->symbol = NULL;
3053
3054 /* Add it to the list. */
3055 list_of_pools = pool;
a737bd4d 3056 }
a737bd4d 3057
c19d1205
ZW
3058 /* New pools, and emptied pools, will have a NULL symbol. */
3059 if (pool->symbol == NULL)
a737bd4d 3060 {
c19d1205
ZW
3061 pool->symbol = symbol_create (FAKE_LABEL_NAME, undefined_section,
3062 (valueT) 0, &zero_address_frag);
3063 pool->id = latest_pool_num ++;
a737bd4d
NC
3064 }
3065
c19d1205
ZW
3066 /* Done. */
3067 return pool;
a737bd4d
NC
3068}
3069
c19d1205 3070/* Add the literal in the global 'inst'
5f4273c7 3071 structure to the relevant literal pool. */
b99bd4ef
NC
3072
3073static int
c19d1205 3074add_to_lit_pool (void)
b99bd4ef 3075{
c19d1205
ZW
3076 literal_pool * pool;
3077 unsigned int entry;
b99bd4ef 3078
c19d1205
ZW
3079 pool = find_or_make_literal_pool ();
3080
3081 /* Check if this literal value is already in the pool. */
3082 for (entry = 0; entry < pool->next_free_entry; entry ++)
b99bd4ef 3083 {
c19d1205
ZW
3084 if ((pool->literals[entry].X_op == inst.reloc.exp.X_op)
3085 && (inst.reloc.exp.X_op == O_constant)
3086 && (pool->literals[entry].X_add_number
3087 == inst.reloc.exp.X_add_number)
3088 && (pool->literals[entry].X_unsigned
3089 == inst.reloc.exp.X_unsigned))
3090 break;
3091
3092 if ((pool->literals[entry].X_op == inst.reloc.exp.X_op)
3093 && (inst.reloc.exp.X_op == O_symbol)
3094 && (pool->literals[entry].X_add_number
3095 == inst.reloc.exp.X_add_number)
3096 && (pool->literals[entry].X_add_symbol
3097 == inst.reloc.exp.X_add_symbol)
3098 && (pool->literals[entry].X_op_symbol
3099 == inst.reloc.exp.X_op_symbol))
3100 break;
b99bd4ef
NC
3101 }
3102
c19d1205
ZW
3103 /* Do we need to create a new entry? */
3104 if (entry == pool->next_free_entry)
3105 {
3106 if (entry >= MAX_LITERAL_POOL_SIZE)
3107 {
3108 inst.error = _("literal pool overflow");
3109 return FAIL;
3110 }
3111
3112 pool->literals[entry] = inst.reloc.exp;
a8040cf2
NC
3113#ifdef OBJ_ELF
3114 /* PR ld/12974: Record the location of the first source line to reference
3115 this entry in the literal pool. If it turns out during linking that the
3116 symbol does not exist we will be able to give an accurate line number for
3117 the (first use of the) missing reference. */
3118 if (debug_type == DEBUG_DWARF2)
3119 dwarf2_where (pool->locs + entry);
3120#endif
c19d1205
ZW
3121 pool->next_free_entry += 1;
3122 }
b99bd4ef 3123
c19d1205
ZW
3124 inst.reloc.exp.X_op = O_symbol;
3125 inst.reloc.exp.X_add_number = ((int) entry) * 4;
3126 inst.reloc.exp.X_add_symbol = pool->symbol;
b99bd4ef 3127
c19d1205 3128 return SUCCESS;
b99bd4ef
NC
3129}
3130
c19d1205
ZW
3131/* Can't use symbol_new here, so have to create a symbol and then at
3132 a later date assign it a value. Thats what these functions do. */
e16bb312 3133
c19d1205
ZW
3134static void
3135symbol_locate (symbolS * symbolP,
3136 const char * name, /* It is copied, the caller can modify. */
3137 segT segment, /* Segment identifier (SEG_<something>). */
3138 valueT valu, /* Symbol value. */
3139 fragS * frag) /* Associated fragment. */
3140{
3141 unsigned int name_length;
3142 char * preserved_copy_of_name;
e16bb312 3143
c19d1205
ZW
3144 name_length = strlen (name) + 1; /* +1 for \0. */
3145 obstack_grow (&notes, name, name_length);
21d799b5 3146 preserved_copy_of_name = (char *) obstack_finish (&notes);
e16bb312 3147
c19d1205
ZW
3148#ifdef tc_canonicalize_symbol_name
3149 preserved_copy_of_name =
3150 tc_canonicalize_symbol_name (preserved_copy_of_name);
3151#endif
b99bd4ef 3152
c19d1205 3153 S_SET_NAME (symbolP, preserved_copy_of_name);
b99bd4ef 3154
c19d1205
ZW
3155 S_SET_SEGMENT (symbolP, segment);
3156 S_SET_VALUE (symbolP, valu);
3157 symbol_clear_list_pointers (symbolP);
b99bd4ef 3158
c19d1205 3159 symbol_set_frag (symbolP, frag);
b99bd4ef 3160
c19d1205
ZW
3161 /* Link to end of symbol chain. */
3162 {
3163 extern int symbol_table_frozen;
b99bd4ef 3164
c19d1205
ZW
3165 if (symbol_table_frozen)
3166 abort ();
3167 }
b99bd4ef 3168
c19d1205 3169 symbol_append (symbolP, symbol_lastP, & symbol_rootP, & symbol_lastP);
b99bd4ef 3170
c19d1205 3171 obj_symbol_new_hook (symbolP);
b99bd4ef 3172
c19d1205
ZW
3173#ifdef tc_symbol_new_hook
3174 tc_symbol_new_hook (symbolP);
3175#endif
3176
3177#ifdef DEBUG_SYMS
3178 verify_symbol_chain (symbol_rootP, symbol_lastP);
3179#endif /* DEBUG_SYMS */
b99bd4ef
NC
3180}
3181
b99bd4ef 3182
c19d1205
ZW
3183static void
3184s_ltorg (int ignored ATTRIBUTE_UNUSED)
b99bd4ef 3185{
c19d1205
ZW
3186 unsigned int entry;
3187 literal_pool * pool;
3188 char sym_name[20];
b99bd4ef 3189
c19d1205
ZW
3190 pool = find_literal_pool ();
3191 if (pool == NULL
3192 || pool->symbol == NULL
3193 || pool->next_free_entry == 0)
3194 return;
b99bd4ef 3195
c19d1205 3196 mapping_state (MAP_DATA);
b99bd4ef 3197
c19d1205
ZW
3198 /* Align pool as you have word accesses.
3199 Only make a frag if we have to. */
3200 if (!need_pass_2)
3201 frag_align (2, 0, 0);
b99bd4ef 3202
c19d1205 3203 record_alignment (now_seg, 2);
b99bd4ef 3204
c19d1205 3205 sprintf (sym_name, "$$lit_\002%x", pool->id);
b99bd4ef 3206
c19d1205
ZW
3207 symbol_locate (pool->symbol, sym_name, now_seg,
3208 (valueT) frag_now_fix (), frag_now);
3209 symbol_table_insert (pool->symbol);
b99bd4ef 3210
c19d1205 3211 ARM_SET_THUMB (pool->symbol, thumb_mode);
b99bd4ef 3212
c19d1205
ZW
3213#if defined OBJ_COFF || defined OBJ_ELF
3214 ARM_SET_INTERWORK (pool->symbol, support_interwork);
3215#endif
6c43fab6 3216
c19d1205 3217 for (entry = 0; entry < pool->next_free_entry; entry ++)
a8040cf2
NC
3218 {
3219#ifdef OBJ_ELF
3220 if (debug_type == DEBUG_DWARF2)
3221 dwarf2_gen_line_info (frag_now_fix (), pool->locs + entry);
3222#endif
3223 /* First output the expression in the instruction to the pool. */
3224 emit_expr (&(pool->literals[entry]), 4); /* .word */
3225 }
b99bd4ef 3226
c19d1205
ZW
3227 /* Mark the pool as empty. */
3228 pool->next_free_entry = 0;
3229 pool->symbol = NULL;
b99bd4ef
NC
3230}
3231
c19d1205
ZW
3232#ifdef OBJ_ELF
3233/* Forward declarations for functions below, in the MD interface
3234 section. */
3235static void fix_new_arm (fragS *, int, short, expressionS *, int, int);
3236static valueT create_unwind_entry (int);
3237static void start_unwind_section (const segT, int);
3238static void add_unwind_opcode (valueT, int);
3239static void flush_pending_unwind (void);
b99bd4ef 3240
c19d1205 3241/* Directives: Data. */
b99bd4ef 3242
c19d1205
ZW
3243static void
3244s_arm_elf_cons (int nbytes)
3245{
3246 expressionS exp;
b99bd4ef 3247
c19d1205
ZW
3248#ifdef md_flush_pending_output
3249 md_flush_pending_output ();
3250#endif
b99bd4ef 3251
c19d1205 3252 if (is_it_end_of_statement ())
b99bd4ef 3253 {
c19d1205
ZW
3254 demand_empty_rest_of_line ();
3255 return;
b99bd4ef
NC
3256 }
3257
c19d1205
ZW
3258#ifdef md_cons_align
3259 md_cons_align (nbytes);
3260#endif
b99bd4ef 3261
c19d1205
ZW
3262 mapping_state (MAP_DATA);
3263 do
b99bd4ef 3264 {
c19d1205
ZW
3265 int reloc;
3266 char *base = input_line_pointer;
b99bd4ef 3267
c19d1205 3268 expression (& exp);
b99bd4ef 3269
c19d1205
ZW
3270 if (exp.X_op != O_symbol)
3271 emit_expr (&exp, (unsigned int) nbytes);
3272 else
3273 {
3274 char *before_reloc = input_line_pointer;
3275 reloc = parse_reloc (&input_line_pointer);
3276 if (reloc == -1)
3277 {
3278 as_bad (_("unrecognized relocation suffix"));
3279 ignore_rest_of_line ();
3280 return;
3281 }
3282 else if (reloc == BFD_RELOC_UNUSED)
3283 emit_expr (&exp, (unsigned int) nbytes);
3284 else
3285 {
21d799b5 3286 reloc_howto_type *howto = (reloc_howto_type *)
477330fc
RM
3287 bfd_reloc_type_lookup (stdoutput,
3288 (bfd_reloc_code_real_type) reloc);
c19d1205 3289 int size = bfd_get_reloc_size (howto);
b99bd4ef 3290
2fc8bdac
ZW
3291 if (reloc == BFD_RELOC_ARM_PLT32)
3292 {
3293 as_bad (_("(plt) is only valid on branch targets"));
3294 reloc = BFD_RELOC_UNUSED;
3295 size = 0;
3296 }
3297
c19d1205 3298 if (size > nbytes)
2fc8bdac 3299 as_bad (_("%s relocations do not fit in %d bytes"),
c19d1205
ZW
3300 howto->name, nbytes);
3301 else
3302 {
3303 /* We've parsed an expression stopping at O_symbol.
3304 But there may be more expression left now that we
3305 have parsed the relocation marker. Parse it again.
3306 XXX Surely there is a cleaner way to do this. */
3307 char *p = input_line_pointer;
3308 int offset;
21d799b5 3309 char *save_buf = (char *) alloca (input_line_pointer - base);
c19d1205
ZW
3310 memcpy (save_buf, base, input_line_pointer - base);
3311 memmove (base + (input_line_pointer - before_reloc),
3312 base, before_reloc - base);
3313
3314 input_line_pointer = base + (input_line_pointer-before_reloc);
3315 expression (&exp);
3316 memcpy (base, save_buf, p - base);
3317
3318 offset = nbytes - size;
3319 p = frag_more ((int) nbytes);
3320 fix_new_exp (frag_now, p - frag_now->fr_literal + offset,
21d799b5 3321 size, &exp, 0, (enum bfd_reloc_code_real) reloc);
c19d1205
ZW
3322 }
3323 }
3324 }
b99bd4ef 3325 }
c19d1205 3326 while (*input_line_pointer++ == ',');
b99bd4ef 3327
c19d1205
ZW
3328 /* Put terminator back into stream. */
3329 input_line_pointer --;
3330 demand_empty_rest_of_line ();
b99bd4ef
NC
3331}
3332
c921be7d
NC
3333/* Emit an expression containing a 32-bit thumb instruction.
3334 Implementation based on put_thumb32_insn. */
3335
3336static void
3337emit_thumb32_expr (expressionS * exp)
3338{
3339 expressionS exp_high = *exp;
3340
3341 exp_high.X_add_number = (unsigned long)exp_high.X_add_number >> 16;
3342 emit_expr (& exp_high, (unsigned int) THUMB_SIZE);
3343 exp->X_add_number &= 0xffff;
3344 emit_expr (exp, (unsigned int) THUMB_SIZE);
3345}
3346
3347/* Guess the instruction size based on the opcode. */
3348
3349static int
3350thumb_insn_size (int opcode)
3351{
3352 if ((unsigned int) opcode < 0xe800u)
3353 return 2;
3354 else if ((unsigned int) opcode >= 0xe8000000u)
3355 return 4;
3356 else
3357 return 0;
3358}
3359
3360static bfd_boolean
3361emit_insn (expressionS *exp, int nbytes)
3362{
3363 int size = 0;
3364
3365 if (exp->X_op == O_constant)
3366 {
3367 size = nbytes;
3368
3369 if (size == 0)
3370 size = thumb_insn_size (exp->X_add_number);
3371
3372 if (size != 0)
3373 {
3374 if (size == 2 && (unsigned int)exp->X_add_number > 0xffffu)
3375 {
3376 as_bad (_(".inst.n operand too big. "\
3377 "Use .inst.w instead"));
3378 size = 0;
3379 }
3380 else
3381 {
3382 if (now_it.state == AUTOMATIC_IT_BLOCK)
3383 set_it_insn_type_nonvoid (OUTSIDE_IT_INSN, 0);
3384 else
3385 set_it_insn_type_nonvoid (NEUTRAL_IT_INSN, 0);
3386
3387 if (thumb_mode && (size > THUMB_SIZE) && !target_big_endian)
3388 emit_thumb32_expr (exp);
3389 else
3390 emit_expr (exp, (unsigned int) size);
3391
3392 it_fsm_post_encode ();
3393 }
3394 }
3395 else
3396 as_bad (_("cannot determine Thumb instruction size. " \
3397 "Use .inst.n/.inst.w instead"));
3398 }
3399 else
3400 as_bad (_("constant expression required"));
3401
3402 return (size != 0);
3403}
3404
3405/* Like s_arm_elf_cons but do not use md_cons_align and
3406 set the mapping state to MAP_ARM/MAP_THUMB. */
3407
3408static void
3409s_arm_elf_inst (int nbytes)
3410{
3411 if (is_it_end_of_statement ())
3412 {
3413 demand_empty_rest_of_line ();
3414 return;
3415 }
3416
3417 /* Calling mapping_state () here will not change ARM/THUMB,
3418 but will ensure not to be in DATA state. */
3419
3420 if (thumb_mode)
3421 mapping_state (MAP_THUMB);
3422 else
3423 {
3424 if (nbytes != 0)
3425 {
3426 as_bad (_("width suffixes are invalid in ARM mode"));
3427 ignore_rest_of_line ();
3428 return;
3429 }
3430
3431 nbytes = 4;
3432
3433 mapping_state (MAP_ARM);
3434 }
3435
3436 do
3437 {
3438 expressionS exp;
3439
3440 expression (& exp);
3441
3442 if (! emit_insn (& exp, nbytes))
3443 {
3444 ignore_rest_of_line ();
3445 return;
3446 }
3447 }
3448 while (*input_line_pointer++ == ',');
3449
3450 /* Put terminator back into stream. */
3451 input_line_pointer --;
3452 demand_empty_rest_of_line ();
3453}
b99bd4ef 3454
c19d1205 3455/* Parse a .rel31 directive. */
b99bd4ef 3456
c19d1205
ZW
3457static void
3458s_arm_rel31 (int ignored ATTRIBUTE_UNUSED)
3459{
3460 expressionS exp;
3461 char *p;
3462 valueT highbit;
b99bd4ef 3463
c19d1205
ZW
3464 highbit = 0;
3465 if (*input_line_pointer == '1')
3466 highbit = 0x80000000;
3467 else if (*input_line_pointer != '0')
3468 as_bad (_("expected 0 or 1"));
b99bd4ef 3469
c19d1205
ZW
3470 input_line_pointer++;
3471 if (*input_line_pointer != ',')
3472 as_bad (_("missing comma"));
3473 input_line_pointer++;
b99bd4ef 3474
c19d1205
ZW
3475#ifdef md_flush_pending_output
3476 md_flush_pending_output ();
3477#endif
b99bd4ef 3478
c19d1205
ZW
3479#ifdef md_cons_align
3480 md_cons_align (4);
3481#endif
b99bd4ef 3482
c19d1205 3483 mapping_state (MAP_DATA);
b99bd4ef 3484
c19d1205 3485 expression (&exp);
b99bd4ef 3486
c19d1205
ZW
3487 p = frag_more (4);
3488 md_number_to_chars (p, highbit, 4);
3489 fix_new_arm (frag_now, p - frag_now->fr_literal, 4, &exp, 1,
3490 BFD_RELOC_ARM_PREL31);
b99bd4ef 3491
c19d1205 3492 demand_empty_rest_of_line ();
b99bd4ef
NC
3493}
3494
c19d1205 3495/* Directives: AEABI stack-unwind tables. */
b99bd4ef 3496
c19d1205 3497/* Parse an unwind_fnstart directive. Simply records the current location. */
b99bd4ef 3498
c19d1205
ZW
3499static void
3500s_arm_unwind_fnstart (int ignored ATTRIBUTE_UNUSED)
3501{
3502 demand_empty_rest_of_line ();
921e5f0a
PB
3503 if (unwind.proc_start)
3504 {
c921be7d 3505 as_bad (_("duplicate .fnstart directive"));
921e5f0a
PB
3506 return;
3507 }
3508
c19d1205
ZW
3509 /* Mark the start of the function. */
3510 unwind.proc_start = expr_build_dot ();
b99bd4ef 3511
c19d1205
ZW
3512 /* Reset the rest of the unwind info. */
3513 unwind.opcode_count = 0;
3514 unwind.table_entry = NULL;
3515 unwind.personality_routine = NULL;
3516 unwind.personality_index = -1;
3517 unwind.frame_size = 0;
3518 unwind.fp_offset = 0;
fdfde340 3519 unwind.fp_reg = REG_SP;
c19d1205
ZW
3520 unwind.fp_used = 0;
3521 unwind.sp_restored = 0;
3522}
b99bd4ef 3523
b99bd4ef 3524
c19d1205
ZW
3525/* Parse a handlerdata directive. Creates the exception handling table entry
3526 for the function. */
b99bd4ef 3527
c19d1205
ZW
3528static void
3529s_arm_unwind_handlerdata (int ignored ATTRIBUTE_UNUSED)
3530{
3531 demand_empty_rest_of_line ();
921e5f0a 3532 if (!unwind.proc_start)
c921be7d 3533 as_bad (MISSING_FNSTART);
921e5f0a 3534
c19d1205 3535 if (unwind.table_entry)
6decc662 3536 as_bad (_("duplicate .handlerdata directive"));
f02232aa 3537
c19d1205
ZW
3538 create_unwind_entry (1);
3539}
a737bd4d 3540
c19d1205 3541/* Parse an unwind_fnend directive. Generates the index table entry. */
b99bd4ef 3542
c19d1205
ZW
3543static void
3544s_arm_unwind_fnend (int ignored ATTRIBUTE_UNUSED)
3545{
3546 long where;
3547 char *ptr;
3548 valueT val;
940b5ce0 3549 unsigned int marked_pr_dependency;
f02232aa 3550
c19d1205 3551 demand_empty_rest_of_line ();
f02232aa 3552
921e5f0a
PB
3553 if (!unwind.proc_start)
3554 {
c921be7d 3555 as_bad (_(".fnend directive without .fnstart"));
921e5f0a
PB
3556 return;
3557 }
3558
c19d1205
ZW
3559 /* Add eh table entry. */
3560 if (unwind.table_entry == NULL)
3561 val = create_unwind_entry (0);
3562 else
3563 val = 0;
f02232aa 3564
c19d1205
ZW
3565 /* Add index table entry. This is two words. */
3566 start_unwind_section (unwind.saved_seg, 1);
3567 frag_align (2, 0, 0);
3568 record_alignment (now_seg, 2);
b99bd4ef 3569
c19d1205 3570 ptr = frag_more (8);
5011093d 3571 memset (ptr, 0, 8);
c19d1205 3572 where = frag_now_fix () - 8;
f02232aa 3573
c19d1205
ZW
3574 /* Self relative offset of the function start. */
3575 fix_new (frag_now, where, 4, unwind.proc_start, 0, 1,
3576 BFD_RELOC_ARM_PREL31);
f02232aa 3577
c19d1205
ZW
3578 /* Indicate dependency on EHABI-defined personality routines to the
3579 linker, if it hasn't been done already. */
940b5ce0
DJ
3580 marked_pr_dependency
3581 = seg_info (now_seg)->tc_segment_info_data.marked_pr_dependency;
c19d1205
ZW
3582 if (unwind.personality_index >= 0 && unwind.personality_index < 3
3583 && !(marked_pr_dependency & (1 << unwind.personality_index)))
3584 {
5f4273c7
NC
3585 static const char *const name[] =
3586 {
3587 "__aeabi_unwind_cpp_pr0",
3588 "__aeabi_unwind_cpp_pr1",
3589 "__aeabi_unwind_cpp_pr2"
3590 };
c19d1205
ZW
3591 symbolS *pr = symbol_find_or_make (name[unwind.personality_index]);
3592 fix_new (frag_now, where, 0, pr, 0, 1, BFD_RELOC_NONE);
c19d1205 3593 seg_info (now_seg)->tc_segment_info_data.marked_pr_dependency
940b5ce0 3594 |= 1 << unwind.personality_index;
c19d1205 3595 }
f02232aa 3596
c19d1205
ZW
3597 if (val)
3598 /* Inline exception table entry. */
3599 md_number_to_chars (ptr + 4, val, 4);
3600 else
3601 /* Self relative offset of the table entry. */
3602 fix_new (frag_now, where + 4, 4, unwind.table_entry, 0, 1,
3603 BFD_RELOC_ARM_PREL31);
f02232aa 3604
c19d1205
ZW
3605 /* Restore the original section. */
3606 subseg_set (unwind.saved_seg, unwind.saved_subseg);
921e5f0a
PB
3607
3608 unwind.proc_start = NULL;
c19d1205 3609}
f02232aa 3610
f02232aa 3611
c19d1205 3612/* Parse an unwind_cantunwind directive. */
b99bd4ef 3613
c19d1205
ZW
3614static void
3615s_arm_unwind_cantunwind (int ignored ATTRIBUTE_UNUSED)
3616{
3617 demand_empty_rest_of_line ();
921e5f0a 3618 if (!unwind.proc_start)
c921be7d 3619 as_bad (MISSING_FNSTART);
921e5f0a 3620
c19d1205
ZW
3621 if (unwind.personality_routine || unwind.personality_index != -1)
3622 as_bad (_("personality routine specified for cantunwind frame"));
b99bd4ef 3623
c19d1205
ZW
3624 unwind.personality_index = -2;
3625}
b99bd4ef 3626
b99bd4ef 3627
c19d1205 3628/* Parse a personalityindex directive. */
b99bd4ef 3629
c19d1205
ZW
3630static void
3631s_arm_unwind_personalityindex (int ignored ATTRIBUTE_UNUSED)
3632{
3633 expressionS exp;
b99bd4ef 3634
921e5f0a 3635 if (!unwind.proc_start)
c921be7d 3636 as_bad (MISSING_FNSTART);
921e5f0a 3637
c19d1205
ZW
3638 if (unwind.personality_routine || unwind.personality_index != -1)
3639 as_bad (_("duplicate .personalityindex directive"));
b99bd4ef 3640
c19d1205 3641 expression (&exp);
b99bd4ef 3642
c19d1205
ZW
3643 if (exp.X_op != O_constant
3644 || exp.X_add_number < 0 || exp.X_add_number > 15)
b99bd4ef 3645 {
c19d1205
ZW
3646 as_bad (_("bad personality routine number"));
3647 ignore_rest_of_line ();
3648 return;
b99bd4ef
NC
3649 }
3650
c19d1205 3651 unwind.personality_index = exp.X_add_number;
b99bd4ef 3652
c19d1205
ZW
3653 demand_empty_rest_of_line ();
3654}
e16bb312 3655
e16bb312 3656
c19d1205 3657/* Parse a personality directive. */
e16bb312 3658
c19d1205
ZW
3659static void
3660s_arm_unwind_personality (int ignored ATTRIBUTE_UNUSED)
3661{
3662 char *name, *p, c;
a737bd4d 3663
921e5f0a 3664 if (!unwind.proc_start)
c921be7d 3665 as_bad (MISSING_FNSTART);
921e5f0a 3666
c19d1205
ZW
3667 if (unwind.personality_routine || unwind.personality_index != -1)
3668 as_bad (_("duplicate .personality directive"));
a737bd4d 3669
c19d1205
ZW
3670 name = input_line_pointer;
3671 c = get_symbol_end ();
3672 p = input_line_pointer;
3673 unwind.personality_routine = symbol_find_or_make (name);
3674 *p = c;
3675 demand_empty_rest_of_line ();
3676}
e16bb312 3677
e16bb312 3678
c19d1205 3679/* Parse a directive saving core registers. */
e16bb312 3680
c19d1205
ZW
3681static void
3682s_arm_unwind_save_core (void)
e16bb312 3683{
c19d1205
ZW
3684 valueT op;
3685 long range;
3686 int n;
e16bb312 3687
c19d1205
ZW
3688 range = parse_reg_list (&input_line_pointer);
3689 if (range == FAIL)
e16bb312 3690 {
c19d1205
ZW
3691 as_bad (_("expected register list"));
3692 ignore_rest_of_line ();
3693 return;
3694 }
e16bb312 3695
c19d1205 3696 demand_empty_rest_of_line ();
e16bb312 3697
c19d1205
ZW
3698 /* Turn .unwind_movsp ip followed by .unwind_save {..., ip, ...}
3699 into .unwind_save {..., sp...}. We aren't bothered about the value of
3700 ip because it is clobbered by calls. */
3701 if (unwind.sp_restored && unwind.fp_reg == 12
3702 && (range & 0x3000) == 0x1000)
3703 {
3704 unwind.opcode_count--;
3705 unwind.sp_restored = 0;
3706 range = (range | 0x2000) & ~0x1000;
3707 unwind.pending_offset = 0;
3708 }
e16bb312 3709
01ae4198
DJ
3710 /* Pop r4-r15. */
3711 if (range & 0xfff0)
c19d1205 3712 {
01ae4198
DJ
3713 /* See if we can use the short opcodes. These pop a block of up to 8
3714 registers starting with r4, plus maybe r14. */
3715 for (n = 0; n < 8; n++)
3716 {
3717 /* Break at the first non-saved register. */
3718 if ((range & (1 << (n + 4))) == 0)
3719 break;
3720 }
3721 /* See if there are any other bits set. */
3722 if (n == 0 || (range & (0xfff0 << n) & 0xbff0) != 0)
3723 {
3724 /* Use the long form. */
3725 op = 0x8000 | ((range >> 4) & 0xfff);
3726 add_unwind_opcode (op, 2);
3727 }
0dd132b6 3728 else
01ae4198
DJ
3729 {
3730 /* Use the short form. */
3731 if (range & 0x4000)
3732 op = 0xa8; /* Pop r14. */
3733 else
3734 op = 0xa0; /* Do not pop r14. */
3735 op |= (n - 1);
3736 add_unwind_opcode (op, 1);
3737 }
c19d1205 3738 }
0dd132b6 3739
c19d1205
ZW
3740 /* Pop r0-r3. */
3741 if (range & 0xf)
3742 {
3743 op = 0xb100 | (range & 0xf);
3744 add_unwind_opcode (op, 2);
0dd132b6
NC
3745 }
3746
c19d1205
ZW
3747 /* Record the number of bytes pushed. */
3748 for (n = 0; n < 16; n++)
3749 {
3750 if (range & (1 << n))
3751 unwind.frame_size += 4;
3752 }
0dd132b6
NC
3753}
3754
c19d1205
ZW
3755
3756/* Parse a directive saving FPA registers. */
b99bd4ef
NC
3757
3758static void
c19d1205 3759s_arm_unwind_save_fpa (int reg)
b99bd4ef 3760{
c19d1205
ZW
3761 expressionS exp;
3762 int num_regs;
3763 valueT op;
b99bd4ef 3764
c19d1205
ZW
3765 /* Get Number of registers to transfer. */
3766 if (skip_past_comma (&input_line_pointer) != FAIL)
3767 expression (&exp);
3768 else
3769 exp.X_op = O_illegal;
b99bd4ef 3770
c19d1205 3771 if (exp.X_op != O_constant)
b99bd4ef 3772 {
c19d1205
ZW
3773 as_bad (_("expected , <constant>"));
3774 ignore_rest_of_line ();
b99bd4ef
NC
3775 return;
3776 }
3777
c19d1205
ZW
3778 num_regs = exp.X_add_number;
3779
3780 if (num_regs < 1 || num_regs > 4)
b99bd4ef 3781 {
c19d1205
ZW
3782 as_bad (_("number of registers must be in the range [1:4]"));
3783 ignore_rest_of_line ();
b99bd4ef
NC
3784 return;
3785 }
3786
c19d1205 3787 demand_empty_rest_of_line ();
b99bd4ef 3788
c19d1205
ZW
3789 if (reg == 4)
3790 {
3791 /* Short form. */
3792 op = 0xb4 | (num_regs - 1);
3793 add_unwind_opcode (op, 1);
3794 }
b99bd4ef
NC
3795 else
3796 {
c19d1205
ZW
3797 /* Long form. */
3798 op = 0xc800 | (reg << 4) | (num_regs - 1);
3799 add_unwind_opcode (op, 2);
b99bd4ef 3800 }
c19d1205 3801 unwind.frame_size += num_regs * 12;
b99bd4ef
NC
3802}
3803
c19d1205 3804
fa073d69
MS
3805/* Parse a directive saving VFP registers for ARMv6 and above. */
3806
3807static void
3808s_arm_unwind_save_vfp_armv6 (void)
3809{
3810 int count;
3811 unsigned int start;
3812 valueT op;
3813 int num_vfpv3_regs = 0;
3814 int num_regs_below_16;
3815
3816 count = parse_vfp_reg_list (&input_line_pointer, &start, REGLIST_VFP_D);
3817 if (count == FAIL)
3818 {
3819 as_bad (_("expected register list"));
3820 ignore_rest_of_line ();
3821 return;
3822 }
3823
3824 demand_empty_rest_of_line ();
3825
3826 /* We always generate FSTMD/FLDMD-style unwinding opcodes (rather
3827 than FSTMX/FLDMX-style ones). */
3828
3829 /* Generate opcode for (VFPv3) registers numbered in the range 16 .. 31. */
3830 if (start >= 16)
3831 num_vfpv3_regs = count;
3832 else if (start + count > 16)
3833 num_vfpv3_regs = start + count - 16;
3834
3835 if (num_vfpv3_regs > 0)
3836 {
3837 int start_offset = start > 16 ? start - 16 : 0;
3838 op = 0xc800 | (start_offset << 4) | (num_vfpv3_regs - 1);
3839 add_unwind_opcode (op, 2);
3840 }
3841
3842 /* Generate opcode for registers numbered in the range 0 .. 15. */
3843 num_regs_below_16 = num_vfpv3_regs > 0 ? 16 - (int) start : count;
9c2799c2 3844 gas_assert (num_regs_below_16 + num_vfpv3_regs == count);
fa073d69
MS
3845 if (num_regs_below_16 > 0)
3846 {
3847 op = 0xc900 | (start << 4) | (num_regs_below_16 - 1);
3848 add_unwind_opcode (op, 2);
3849 }
3850
3851 unwind.frame_size += count * 8;
3852}
3853
3854
3855/* Parse a directive saving VFP registers for pre-ARMv6. */
b99bd4ef
NC
3856
3857static void
c19d1205 3858s_arm_unwind_save_vfp (void)
b99bd4ef 3859{
c19d1205 3860 int count;
ca3f61f7 3861 unsigned int reg;
c19d1205 3862 valueT op;
b99bd4ef 3863
5287ad62 3864 count = parse_vfp_reg_list (&input_line_pointer, &reg, REGLIST_VFP_D);
c19d1205 3865 if (count == FAIL)
b99bd4ef 3866 {
c19d1205
ZW
3867 as_bad (_("expected register list"));
3868 ignore_rest_of_line ();
b99bd4ef
NC
3869 return;
3870 }
3871
c19d1205 3872 demand_empty_rest_of_line ();
b99bd4ef 3873
c19d1205 3874 if (reg == 8)
b99bd4ef 3875 {
c19d1205
ZW
3876 /* Short form. */
3877 op = 0xb8 | (count - 1);
3878 add_unwind_opcode (op, 1);
b99bd4ef 3879 }
c19d1205 3880 else
b99bd4ef 3881 {
c19d1205
ZW
3882 /* Long form. */
3883 op = 0xb300 | (reg << 4) | (count - 1);
3884 add_unwind_opcode (op, 2);
b99bd4ef 3885 }
c19d1205
ZW
3886 unwind.frame_size += count * 8 + 4;
3887}
b99bd4ef 3888
b99bd4ef 3889
c19d1205
ZW
3890/* Parse a directive saving iWMMXt data registers. */
3891
3892static void
3893s_arm_unwind_save_mmxwr (void)
3894{
3895 int reg;
3896 int hi_reg;
3897 int i;
3898 unsigned mask = 0;
3899 valueT op;
b99bd4ef 3900
c19d1205
ZW
3901 if (*input_line_pointer == '{')
3902 input_line_pointer++;
b99bd4ef 3903
c19d1205 3904 do
b99bd4ef 3905 {
dcbf9037 3906 reg = arm_reg_parse (&input_line_pointer, REG_TYPE_MMXWR);
b99bd4ef 3907
c19d1205 3908 if (reg == FAIL)
b99bd4ef 3909 {
9b7132d3 3910 as_bad ("%s", _(reg_expected_msgs[REG_TYPE_MMXWR]));
c19d1205 3911 goto error;
b99bd4ef
NC
3912 }
3913
c19d1205
ZW
3914 if (mask >> reg)
3915 as_tsktsk (_("register list not in ascending order"));
3916 mask |= 1 << reg;
b99bd4ef 3917
c19d1205
ZW
3918 if (*input_line_pointer == '-')
3919 {
3920 input_line_pointer++;
dcbf9037 3921 hi_reg = arm_reg_parse (&input_line_pointer, REG_TYPE_MMXWR);
c19d1205
ZW
3922 if (hi_reg == FAIL)
3923 {
9b7132d3 3924 as_bad ("%s", _(reg_expected_msgs[REG_TYPE_MMXWR]));
c19d1205
ZW
3925 goto error;
3926 }
3927 else if (reg >= hi_reg)
3928 {
3929 as_bad (_("bad register range"));
3930 goto error;
3931 }
3932 for (; reg < hi_reg; reg++)
3933 mask |= 1 << reg;
3934 }
3935 }
3936 while (skip_past_comma (&input_line_pointer) != FAIL);
b99bd4ef 3937
c19d1205
ZW
3938 if (*input_line_pointer == '}')
3939 input_line_pointer++;
b99bd4ef 3940
c19d1205 3941 demand_empty_rest_of_line ();
b99bd4ef 3942
708587a4 3943 /* Generate any deferred opcodes because we're going to be looking at
c19d1205
ZW
3944 the list. */
3945 flush_pending_unwind ();
b99bd4ef 3946
c19d1205 3947 for (i = 0; i < 16; i++)
b99bd4ef 3948 {
c19d1205
ZW
3949 if (mask & (1 << i))
3950 unwind.frame_size += 8;
b99bd4ef
NC
3951 }
3952
c19d1205
ZW
3953 /* Attempt to combine with a previous opcode. We do this because gcc
3954 likes to output separate unwind directives for a single block of
3955 registers. */
3956 if (unwind.opcode_count > 0)
b99bd4ef 3957 {
c19d1205
ZW
3958 i = unwind.opcodes[unwind.opcode_count - 1];
3959 if ((i & 0xf8) == 0xc0)
3960 {
3961 i &= 7;
3962 /* Only merge if the blocks are contiguous. */
3963 if (i < 6)
3964 {
3965 if ((mask & 0xfe00) == (1 << 9))
3966 {
3967 mask |= ((1 << (i + 11)) - 1) & 0xfc00;
3968 unwind.opcode_count--;
3969 }
3970 }
3971 else if (i == 6 && unwind.opcode_count >= 2)
3972 {
3973 i = unwind.opcodes[unwind.opcode_count - 2];
3974 reg = i >> 4;
3975 i &= 0xf;
b99bd4ef 3976
c19d1205
ZW
3977 op = 0xffff << (reg - 1);
3978 if (reg > 0
87a1fd79 3979 && ((mask & op) == (1u << (reg - 1))))
c19d1205
ZW
3980 {
3981 op = (1 << (reg + i + 1)) - 1;
3982 op &= ~((1 << reg) - 1);
3983 mask |= op;
3984 unwind.opcode_count -= 2;
3985 }
3986 }
3987 }
b99bd4ef
NC
3988 }
3989
c19d1205
ZW
3990 hi_reg = 15;
3991 /* We want to generate opcodes in the order the registers have been
3992 saved, ie. descending order. */
3993 for (reg = 15; reg >= -1; reg--)
b99bd4ef 3994 {
c19d1205
ZW
3995 /* Save registers in blocks. */
3996 if (reg < 0
3997 || !(mask & (1 << reg)))
3998 {
3999 /* We found an unsaved reg. Generate opcodes to save the
5f4273c7 4000 preceding block. */
c19d1205
ZW
4001 if (reg != hi_reg)
4002 {
4003 if (reg == 9)
4004 {
4005 /* Short form. */
4006 op = 0xc0 | (hi_reg - 10);
4007 add_unwind_opcode (op, 1);
4008 }
4009 else
4010 {
4011 /* Long form. */
4012 op = 0xc600 | ((reg + 1) << 4) | ((hi_reg - reg) - 1);
4013 add_unwind_opcode (op, 2);
4014 }
4015 }
4016 hi_reg = reg - 1;
4017 }
b99bd4ef
NC
4018 }
4019
c19d1205
ZW
4020 return;
4021error:
4022 ignore_rest_of_line ();
b99bd4ef
NC
4023}
4024
4025static void
c19d1205 4026s_arm_unwind_save_mmxwcg (void)
b99bd4ef 4027{
c19d1205
ZW
4028 int reg;
4029 int hi_reg;
4030 unsigned mask = 0;
4031 valueT op;
b99bd4ef 4032
c19d1205
ZW
4033 if (*input_line_pointer == '{')
4034 input_line_pointer++;
b99bd4ef 4035
477330fc
RM
4036 skip_whitespace (input_line_pointer);
4037
c19d1205 4038 do
b99bd4ef 4039 {
dcbf9037 4040 reg = arm_reg_parse (&input_line_pointer, REG_TYPE_MMXWCG);
b99bd4ef 4041
c19d1205
ZW
4042 if (reg == FAIL)
4043 {
9b7132d3 4044 as_bad ("%s", _(reg_expected_msgs[REG_TYPE_MMXWCG]));
c19d1205
ZW
4045 goto error;
4046 }
b99bd4ef 4047
c19d1205
ZW
4048 reg -= 8;
4049 if (mask >> reg)
4050 as_tsktsk (_("register list not in ascending order"));
4051 mask |= 1 << reg;
b99bd4ef 4052
c19d1205
ZW
4053 if (*input_line_pointer == '-')
4054 {
4055 input_line_pointer++;
dcbf9037 4056 hi_reg = arm_reg_parse (&input_line_pointer, REG_TYPE_MMXWCG);
c19d1205
ZW
4057 if (hi_reg == FAIL)
4058 {
9b7132d3 4059 as_bad ("%s", _(reg_expected_msgs[REG_TYPE_MMXWCG]));
c19d1205
ZW
4060 goto error;
4061 }
4062 else if (reg >= hi_reg)
4063 {
4064 as_bad (_("bad register range"));
4065 goto error;
4066 }
4067 for (; reg < hi_reg; reg++)
4068 mask |= 1 << reg;
4069 }
b99bd4ef 4070 }
c19d1205 4071 while (skip_past_comma (&input_line_pointer) != FAIL);
b99bd4ef 4072
c19d1205
ZW
4073 if (*input_line_pointer == '}')
4074 input_line_pointer++;
b99bd4ef 4075
c19d1205
ZW
4076 demand_empty_rest_of_line ();
4077
708587a4 4078 /* Generate any deferred opcodes because we're going to be looking at
c19d1205
ZW
4079 the list. */
4080 flush_pending_unwind ();
b99bd4ef 4081
c19d1205 4082 for (reg = 0; reg < 16; reg++)
b99bd4ef 4083 {
c19d1205
ZW
4084 if (mask & (1 << reg))
4085 unwind.frame_size += 4;
b99bd4ef 4086 }
c19d1205
ZW
4087 op = 0xc700 | mask;
4088 add_unwind_opcode (op, 2);
4089 return;
4090error:
4091 ignore_rest_of_line ();
b99bd4ef
NC
4092}
4093
c19d1205 4094
fa073d69
MS
4095/* Parse an unwind_save directive.
4096 If the argument is non-zero, this is a .vsave directive. */
c19d1205 4097
b99bd4ef 4098static void
fa073d69 4099s_arm_unwind_save (int arch_v6)
b99bd4ef 4100{
c19d1205
ZW
4101 char *peek;
4102 struct reg_entry *reg;
4103 bfd_boolean had_brace = FALSE;
b99bd4ef 4104
921e5f0a 4105 if (!unwind.proc_start)
c921be7d 4106 as_bad (MISSING_FNSTART);
921e5f0a 4107
c19d1205
ZW
4108 /* Figure out what sort of save we have. */
4109 peek = input_line_pointer;
b99bd4ef 4110
c19d1205 4111 if (*peek == '{')
b99bd4ef 4112 {
c19d1205
ZW
4113 had_brace = TRUE;
4114 peek++;
b99bd4ef
NC
4115 }
4116
c19d1205 4117 reg = arm_reg_parse_multi (&peek);
b99bd4ef 4118
c19d1205 4119 if (!reg)
b99bd4ef 4120 {
c19d1205
ZW
4121 as_bad (_("register expected"));
4122 ignore_rest_of_line ();
b99bd4ef
NC
4123 return;
4124 }
4125
c19d1205 4126 switch (reg->type)
b99bd4ef 4127 {
c19d1205
ZW
4128 case REG_TYPE_FN:
4129 if (had_brace)
4130 {
4131 as_bad (_("FPA .unwind_save does not take a register list"));
4132 ignore_rest_of_line ();
4133 return;
4134 }
93ac2687 4135 input_line_pointer = peek;
c19d1205 4136 s_arm_unwind_save_fpa (reg->number);
b99bd4ef 4137 return;
c19d1205
ZW
4138
4139 case REG_TYPE_RN: s_arm_unwind_save_core (); return;
fa073d69
MS
4140 case REG_TYPE_VFD:
4141 if (arch_v6)
477330fc 4142 s_arm_unwind_save_vfp_armv6 ();
fa073d69 4143 else
477330fc 4144 s_arm_unwind_save_vfp ();
fa073d69 4145 return;
c19d1205
ZW
4146 case REG_TYPE_MMXWR: s_arm_unwind_save_mmxwr (); return;
4147 case REG_TYPE_MMXWCG: s_arm_unwind_save_mmxwcg (); return;
4148
4149 default:
4150 as_bad (_(".unwind_save does not support this kind of register"));
4151 ignore_rest_of_line ();
b99bd4ef 4152 }
c19d1205 4153}
b99bd4ef 4154
b99bd4ef 4155
c19d1205
ZW
4156/* Parse an unwind_movsp directive. */
4157
4158static void
4159s_arm_unwind_movsp (int ignored ATTRIBUTE_UNUSED)
4160{
4161 int reg;
4162 valueT op;
4fa3602b 4163 int offset;
c19d1205 4164
921e5f0a 4165 if (!unwind.proc_start)
c921be7d 4166 as_bad (MISSING_FNSTART);
921e5f0a 4167
dcbf9037 4168 reg = arm_reg_parse (&input_line_pointer, REG_TYPE_RN);
c19d1205 4169 if (reg == FAIL)
b99bd4ef 4170 {
9b7132d3 4171 as_bad ("%s", _(reg_expected_msgs[REG_TYPE_RN]));
c19d1205 4172 ignore_rest_of_line ();
b99bd4ef
NC
4173 return;
4174 }
4fa3602b
PB
4175
4176 /* Optional constant. */
4177 if (skip_past_comma (&input_line_pointer) != FAIL)
4178 {
4179 if (immediate_for_directive (&offset) == FAIL)
4180 return;
4181 }
4182 else
4183 offset = 0;
4184
c19d1205 4185 demand_empty_rest_of_line ();
b99bd4ef 4186
c19d1205 4187 if (reg == REG_SP || reg == REG_PC)
b99bd4ef 4188 {
c19d1205 4189 as_bad (_("SP and PC not permitted in .unwind_movsp directive"));
b99bd4ef
NC
4190 return;
4191 }
4192
c19d1205
ZW
4193 if (unwind.fp_reg != REG_SP)
4194 as_bad (_("unexpected .unwind_movsp directive"));
b99bd4ef 4195
c19d1205
ZW
4196 /* Generate opcode to restore the value. */
4197 op = 0x90 | reg;
4198 add_unwind_opcode (op, 1);
4199
4200 /* Record the information for later. */
4201 unwind.fp_reg = reg;
4fa3602b 4202 unwind.fp_offset = unwind.frame_size - offset;
c19d1205 4203 unwind.sp_restored = 1;
b05fe5cf
ZW
4204}
4205
c19d1205
ZW
4206/* Parse an unwind_pad directive. */
4207
b05fe5cf 4208static void
c19d1205 4209s_arm_unwind_pad (int ignored ATTRIBUTE_UNUSED)
b05fe5cf 4210{
c19d1205 4211 int offset;
b05fe5cf 4212
921e5f0a 4213 if (!unwind.proc_start)
c921be7d 4214 as_bad (MISSING_FNSTART);
921e5f0a 4215
c19d1205
ZW
4216 if (immediate_for_directive (&offset) == FAIL)
4217 return;
b99bd4ef 4218
c19d1205
ZW
4219 if (offset & 3)
4220 {
4221 as_bad (_("stack increment must be multiple of 4"));
4222 ignore_rest_of_line ();
4223 return;
4224 }
b99bd4ef 4225
c19d1205
ZW
4226 /* Don't generate any opcodes, just record the details for later. */
4227 unwind.frame_size += offset;
4228 unwind.pending_offset += offset;
4229
4230 demand_empty_rest_of_line ();
4231}
4232
4233/* Parse an unwind_setfp directive. */
4234
4235static void
4236s_arm_unwind_setfp (int ignored ATTRIBUTE_UNUSED)
b99bd4ef 4237{
c19d1205
ZW
4238 int sp_reg;
4239 int fp_reg;
4240 int offset;
4241
921e5f0a 4242 if (!unwind.proc_start)
c921be7d 4243 as_bad (MISSING_FNSTART);
921e5f0a 4244
dcbf9037 4245 fp_reg = arm_reg_parse (&input_line_pointer, REG_TYPE_RN);
c19d1205
ZW
4246 if (skip_past_comma (&input_line_pointer) == FAIL)
4247 sp_reg = FAIL;
4248 else
dcbf9037 4249 sp_reg = arm_reg_parse (&input_line_pointer, REG_TYPE_RN);
b99bd4ef 4250
c19d1205
ZW
4251 if (fp_reg == FAIL || sp_reg == FAIL)
4252 {
4253 as_bad (_("expected <reg>, <reg>"));
4254 ignore_rest_of_line ();
4255 return;
4256 }
b99bd4ef 4257
c19d1205
ZW
4258 /* Optional constant. */
4259 if (skip_past_comma (&input_line_pointer) != FAIL)
4260 {
4261 if (immediate_for_directive (&offset) == FAIL)
4262 return;
4263 }
4264 else
4265 offset = 0;
a737bd4d 4266
c19d1205 4267 demand_empty_rest_of_line ();
a737bd4d 4268
fdfde340 4269 if (sp_reg != REG_SP && sp_reg != unwind.fp_reg)
a737bd4d 4270 {
c19d1205
ZW
4271 as_bad (_("register must be either sp or set by a previous"
4272 "unwind_movsp directive"));
4273 return;
a737bd4d
NC
4274 }
4275
c19d1205
ZW
4276 /* Don't generate any opcodes, just record the information for later. */
4277 unwind.fp_reg = fp_reg;
4278 unwind.fp_used = 1;
fdfde340 4279 if (sp_reg == REG_SP)
c19d1205
ZW
4280 unwind.fp_offset = unwind.frame_size - offset;
4281 else
4282 unwind.fp_offset -= offset;
a737bd4d
NC
4283}
4284
c19d1205
ZW
4285/* Parse an unwind_raw directive. */
4286
4287static void
4288s_arm_unwind_raw (int ignored ATTRIBUTE_UNUSED)
a737bd4d 4289{
c19d1205 4290 expressionS exp;
708587a4 4291 /* This is an arbitrary limit. */
c19d1205
ZW
4292 unsigned char op[16];
4293 int count;
a737bd4d 4294
921e5f0a 4295 if (!unwind.proc_start)
c921be7d 4296 as_bad (MISSING_FNSTART);
921e5f0a 4297
c19d1205
ZW
4298 expression (&exp);
4299 if (exp.X_op == O_constant
4300 && skip_past_comma (&input_line_pointer) != FAIL)
a737bd4d 4301 {
c19d1205
ZW
4302 unwind.frame_size += exp.X_add_number;
4303 expression (&exp);
4304 }
4305 else
4306 exp.X_op = O_illegal;
a737bd4d 4307
c19d1205
ZW
4308 if (exp.X_op != O_constant)
4309 {
4310 as_bad (_("expected <offset>, <opcode>"));
4311 ignore_rest_of_line ();
4312 return;
4313 }
a737bd4d 4314
c19d1205 4315 count = 0;
a737bd4d 4316
c19d1205
ZW
4317 /* Parse the opcode. */
4318 for (;;)
4319 {
4320 if (count >= 16)
4321 {
4322 as_bad (_("unwind opcode too long"));
4323 ignore_rest_of_line ();
a737bd4d 4324 }
c19d1205 4325 if (exp.X_op != O_constant || exp.X_add_number & ~0xff)
a737bd4d 4326 {
c19d1205
ZW
4327 as_bad (_("invalid unwind opcode"));
4328 ignore_rest_of_line ();
4329 return;
a737bd4d 4330 }
c19d1205 4331 op[count++] = exp.X_add_number;
a737bd4d 4332
c19d1205
ZW
4333 /* Parse the next byte. */
4334 if (skip_past_comma (&input_line_pointer) == FAIL)
4335 break;
a737bd4d 4336
c19d1205
ZW
4337 expression (&exp);
4338 }
b99bd4ef 4339
c19d1205
ZW
4340 /* Add the opcode bytes in reverse order. */
4341 while (count--)
4342 add_unwind_opcode (op[count], 1);
b99bd4ef 4343
c19d1205 4344 demand_empty_rest_of_line ();
b99bd4ef 4345}
ee065d83
PB
4346
4347
4348/* Parse a .eabi_attribute directive. */
4349
4350static void
4351s_arm_eabi_attribute (int ignored ATTRIBUTE_UNUSED)
4352{
0420f52b 4353 int tag = obj_elf_vendor_attribute (OBJ_ATTR_PROC);
ee3c0378
AS
4354
4355 if (tag < NUM_KNOWN_OBJ_ATTRIBUTES)
4356 attributes_set_explicitly[tag] = 1;
ee065d83
PB
4357}
4358
0855e32b
NS
4359/* Emit a tls fix for the symbol. */
4360
4361static void
4362s_arm_tls_descseq (int ignored ATTRIBUTE_UNUSED)
4363{
4364 char *p;
4365 expressionS exp;
4366#ifdef md_flush_pending_output
4367 md_flush_pending_output ();
4368#endif
4369
4370#ifdef md_cons_align
4371 md_cons_align (4);
4372#endif
4373
4374 /* Since we're just labelling the code, there's no need to define a
4375 mapping symbol. */
4376 expression (&exp);
4377 p = obstack_next_free (&frchain_now->frch_obstack);
4378 fix_new_arm (frag_now, p - frag_now->fr_literal, 4, &exp, 0,
4379 thumb_mode ? BFD_RELOC_ARM_THM_TLS_DESCSEQ
4380 : BFD_RELOC_ARM_TLS_DESCSEQ);
4381}
cdf9ccec 4382#endif /* OBJ_ELF */
0855e32b 4383
ee065d83 4384static void s_arm_arch (int);
7a1d4c38 4385static void s_arm_object_arch (int);
ee065d83
PB
4386static void s_arm_cpu (int);
4387static void s_arm_fpu (int);
69133863 4388static void s_arm_arch_extension (int);
b99bd4ef 4389
f0927246
NC
4390#ifdef TE_PE
4391
4392static void
5f4273c7 4393pe_directive_secrel (int dummy ATTRIBUTE_UNUSED)
f0927246
NC
4394{
4395 expressionS exp;
4396
4397 do
4398 {
4399 expression (&exp);
4400 if (exp.X_op == O_symbol)
4401 exp.X_op = O_secrel;
4402
4403 emit_expr (&exp, 4);
4404 }
4405 while (*input_line_pointer++ == ',');
4406
4407 input_line_pointer--;
4408 demand_empty_rest_of_line ();
4409}
4410#endif /* TE_PE */
4411
c19d1205
ZW
4412/* This table describes all the machine specific pseudo-ops the assembler
4413 has to support. The fields are:
4414 pseudo-op name without dot
4415 function to call to execute this pseudo-op
4416 Integer arg to pass to the function. */
b99bd4ef 4417
c19d1205 4418const pseudo_typeS md_pseudo_table[] =
b99bd4ef 4419{
c19d1205
ZW
4420 /* Never called because '.req' does not start a line. */
4421 { "req", s_req, 0 },
dcbf9037
JB
4422 /* Following two are likewise never called. */
4423 { "dn", s_dn, 0 },
4424 { "qn", s_qn, 0 },
c19d1205
ZW
4425 { "unreq", s_unreq, 0 },
4426 { "bss", s_bss, 0 },
4427 { "align", s_align, 0 },
4428 { "arm", s_arm, 0 },
4429 { "thumb", s_thumb, 0 },
4430 { "code", s_code, 0 },
4431 { "force_thumb", s_force_thumb, 0 },
4432 { "thumb_func", s_thumb_func, 0 },
4433 { "thumb_set", s_thumb_set, 0 },
4434 { "even", s_even, 0 },
4435 { "ltorg", s_ltorg, 0 },
4436 { "pool", s_ltorg, 0 },
4437 { "syntax", s_syntax, 0 },
8463be01
PB
4438 { "cpu", s_arm_cpu, 0 },
4439 { "arch", s_arm_arch, 0 },
7a1d4c38 4440 { "object_arch", s_arm_object_arch, 0 },
8463be01 4441 { "fpu", s_arm_fpu, 0 },
69133863 4442 { "arch_extension", s_arm_arch_extension, 0 },
c19d1205 4443#ifdef OBJ_ELF
c921be7d
NC
4444 { "word", s_arm_elf_cons, 4 },
4445 { "long", s_arm_elf_cons, 4 },
4446 { "inst.n", s_arm_elf_inst, 2 },
4447 { "inst.w", s_arm_elf_inst, 4 },
4448 { "inst", s_arm_elf_inst, 0 },
4449 { "rel31", s_arm_rel31, 0 },
c19d1205
ZW
4450 { "fnstart", s_arm_unwind_fnstart, 0 },
4451 { "fnend", s_arm_unwind_fnend, 0 },
4452 { "cantunwind", s_arm_unwind_cantunwind, 0 },
4453 { "personality", s_arm_unwind_personality, 0 },
4454 { "personalityindex", s_arm_unwind_personalityindex, 0 },
4455 { "handlerdata", s_arm_unwind_handlerdata, 0 },
4456 { "save", s_arm_unwind_save, 0 },
fa073d69 4457 { "vsave", s_arm_unwind_save, 1 },
c19d1205
ZW
4458 { "movsp", s_arm_unwind_movsp, 0 },
4459 { "pad", s_arm_unwind_pad, 0 },
4460 { "setfp", s_arm_unwind_setfp, 0 },
4461 { "unwind_raw", s_arm_unwind_raw, 0 },
ee065d83 4462 { "eabi_attribute", s_arm_eabi_attribute, 0 },
0855e32b 4463 { "tlsdescseq", s_arm_tls_descseq, 0 },
c19d1205
ZW
4464#else
4465 { "word", cons, 4},
f0927246
NC
4466
4467 /* These are used for dwarf. */
4468 {"2byte", cons, 2},
4469 {"4byte", cons, 4},
4470 {"8byte", cons, 8},
4471 /* These are used for dwarf2. */
4472 { "file", (void (*) (int)) dwarf2_directive_file, 0 },
4473 { "loc", dwarf2_directive_loc, 0 },
4474 { "loc_mark_labels", dwarf2_directive_loc_mark_labels, 0 },
c19d1205
ZW
4475#endif
4476 { "extend", float_cons, 'x' },
4477 { "ldouble", float_cons, 'x' },
4478 { "packed", float_cons, 'p' },
f0927246
NC
4479#ifdef TE_PE
4480 {"secrel32", pe_directive_secrel, 0},
4481#endif
c19d1205
ZW
4482 { 0, 0, 0 }
4483};
4484\f
4485/* Parser functions used exclusively in instruction operands. */
b99bd4ef 4486
c19d1205
ZW
4487/* Generic immediate-value read function for use in insn parsing.
4488 STR points to the beginning of the immediate (the leading #);
4489 VAL receives the value; if the value is outside [MIN, MAX]
4490 issue an error. PREFIX_OPT is true if the immediate prefix is
4491 optional. */
b99bd4ef 4492
c19d1205
ZW
4493static int
4494parse_immediate (char **str, int *val, int min, int max,
4495 bfd_boolean prefix_opt)
4496{
4497 expressionS exp;
4498 my_get_expression (&exp, str, prefix_opt ? GE_OPT_PREFIX : GE_IMM_PREFIX);
4499 if (exp.X_op != O_constant)
b99bd4ef 4500 {
c19d1205
ZW
4501 inst.error = _("constant expression required");
4502 return FAIL;
4503 }
b99bd4ef 4504
c19d1205
ZW
4505 if (exp.X_add_number < min || exp.X_add_number > max)
4506 {
4507 inst.error = _("immediate value out of range");
4508 return FAIL;
4509 }
b99bd4ef 4510
c19d1205
ZW
4511 *val = exp.X_add_number;
4512 return SUCCESS;
4513}
b99bd4ef 4514
5287ad62 4515/* Less-generic immediate-value read function with the possibility of loading a
036dc3f7 4516 big (64-bit) immediate, as required by Neon VMOV, VMVN and logic immediate
5287ad62
JB
4517 instructions. Puts the result directly in inst.operands[i]. */
4518
4519static int
4520parse_big_immediate (char **str, int i)
4521{
4522 expressionS exp;
4523 char *ptr = *str;
4524
4525 my_get_expression (&exp, &ptr, GE_OPT_PREFIX_BIG);
4526
4527 if (exp.X_op == O_constant)
036dc3f7
PB
4528 {
4529 inst.operands[i].imm = exp.X_add_number & 0xffffffff;
4530 /* If we're on a 64-bit host, then a 64-bit number can be returned using
4531 O_constant. We have to be careful not to break compilation for
4532 32-bit X_add_number, though. */
58ad575f 4533 if ((exp.X_add_number & ~(offsetT)(0xffffffffU)) != 0)
036dc3f7 4534 {
477330fc 4535 /* X >> 32 is illegal if sizeof (exp.X_add_number) == 4. */
036dc3f7
PB
4536 inst.operands[i].reg = ((exp.X_add_number >> 16) >> 16) & 0xffffffff;
4537 inst.operands[i].regisimm = 1;
4538 }
4539 }
5287ad62 4540 else if (exp.X_op == O_big
95b75c01 4541 && LITTLENUM_NUMBER_OF_BITS * exp.X_add_number > 32)
5287ad62
JB
4542 {
4543 unsigned parts = 32 / LITTLENUM_NUMBER_OF_BITS, j, idx = 0;
95b75c01 4544
5287ad62 4545 /* Bignums have their least significant bits in
477330fc
RM
4546 generic_bignum[0]. Make sure we put 32 bits in imm and
4547 32 bits in reg, in a (hopefully) portable way. */
9c2799c2 4548 gas_assert (parts != 0);
95b75c01
NC
4549
4550 /* Make sure that the number is not too big.
4551 PR 11972: Bignums can now be sign-extended to the
4552 size of a .octa so check that the out of range bits
4553 are all zero or all one. */
4554 if (LITTLENUM_NUMBER_OF_BITS * exp.X_add_number > 64)
4555 {
4556 LITTLENUM_TYPE m = -1;
4557
4558 if (generic_bignum[parts * 2] != 0
4559 && generic_bignum[parts * 2] != m)
4560 return FAIL;
4561
4562 for (j = parts * 2 + 1; j < (unsigned) exp.X_add_number; j++)
4563 if (generic_bignum[j] != generic_bignum[j-1])
4564 return FAIL;
4565 }
4566
5287ad62
JB
4567 inst.operands[i].imm = 0;
4568 for (j = 0; j < parts; j++, idx++)
477330fc
RM
4569 inst.operands[i].imm |= generic_bignum[idx]
4570 << (LITTLENUM_NUMBER_OF_BITS * j);
5287ad62
JB
4571 inst.operands[i].reg = 0;
4572 for (j = 0; j < parts; j++, idx++)
477330fc
RM
4573 inst.operands[i].reg |= generic_bignum[idx]
4574 << (LITTLENUM_NUMBER_OF_BITS * j);
5287ad62
JB
4575 inst.operands[i].regisimm = 1;
4576 }
4577 else
4578 return FAIL;
5f4273c7 4579
5287ad62
JB
4580 *str = ptr;
4581
4582 return SUCCESS;
4583}
4584
c19d1205
ZW
4585/* Returns the pseudo-register number of an FPA immediate constant,
4586 or FAIL if there isn't a valid constant here. */
b99bd4ef 4587
c19d1205
ZW
4588static int
4589parse_fpa_immediate (char ** str)
4590{
4591 LITTLENUM_TYPE words[MAX_LITTLENUMS];
4592 char * save_in;
4593 expressionS exp;
4594 int i;
4595 int j;
b99bd4ef 4596
c19d1205
ZW
4597 /* First try and match exact strings, this is to guarantee
4598 that some formats will work even for cross assembly. */
b99bd4ef 4599
c19d1205
ZW
4600 for (i = 0; fp_const[i]; i++)
4601 {
4602 if (strncmp (*str, fp_const[i], strlen (fp_const[i])) == 0)
b99bd4ef 4603 {
c19d1205 4604 char *start = *str;
b99bd4ef 4605
c19d1205
ZW
4606 *str += strlen (fp_const[i]);
4607 if (is_end_of_line[(unsigned char) **str])
4608 return i + 8;
4609 *str = start;
4610 }
4611 }
b99bd4ef 4612
c19d1205
ZW
4613 /* Just because we didn't get a match doesn't mean that the constant
4614 isn't valid, just that it is in a format that we don't
4615 automatically recognize. Try parsing it with the standard
4616 expression routines. */
b99bd4ef 4617
c19d1205 4618 memset (words, 0, MAX_LITTLENUMS * sizeof (LITTLENUM_TYPE));
b99bd4ef 4619
c19d1205
ZW
4620 /* Look for a raw floating point number. */
4621 if ((save_in = atof_ieee (*str, 'x', words)) != NULL
4622 && is_end_of_line[(unsigned char) *save_in])
4623 {
4624 for (i = 0; i < NUM_FLOAT_VALS; i++)
4625 {
4626 for (j = 0; j < MAX_LITTLENUMS; j++)
b99bd4ef 4627 {
c19d1205
ZW
4628 if (words[j] != fp_values[i][j])
4629 break;
b99bd4ef
NC
4630 }
4631
c19d1205 4632 if (j == MAX_LITTLENUMS)
b99bd4ef 4633 {
c19d1205
ZW
4634 *str = save_in;
4635 return i + 8;
b99bd4ef
NC
4636 }
4637 }
4638 }
b99bd4ef 4639
c19d1205
ZW
4640 /* Try and parse a more complex expression, this will probably fail
4641 unless the code uses a floating point prefix (eg "0f"). */
4642 save_in = input_line_pointer;
4643 input_line_pointer = *str;
4644 if (expression (&exp) == absolute_section
4645 && exp.X_op == O_big
4646 && exp.X_add_number < 0)
4647 {
4648 /* FIXME: 5 = X_PRECISION, should be #define'd where we can use it.
4649 Ditto for 15. */
4650 if (gen_to_words (words, 5, (long) 15) == 0)
4651 {
4652 for (i = 0; i < NUM_FLOAT_VALS; i++)
4653 {
4654 for (j = 0; j < MAX_LITTLENUMS; j++)
4655 {
4656 if (words[j] != fp_values[i][j])
4657 break;
4658 }
b99bd4ef 4659
c19d1205
ZW
4660 if (j == MAX_LITTLENUMS)
4661 {
4662 *str = input_line_pointer;
4663 input_line_pointer = save_in;
4664 return i + 8;
4665 }
4666 }
4667 }
b99bd4ef
NC
4668 }
4669
c19d1205
ZW
4670 *str = input_line_pointer;
4671 input_line_pointer = save_in;
4672 inst.error = _("invalid FPA immediate expression");
4673 return FAIL;
b99bd4ef
NC
4674}
4675
136da414
JB
4676/* Returns 1 if a number has "quarter-precision" float format
4677 0baBbbbbbc defgh000 00000000 00000000. */
4678
4679static int
4680is_quarter_float (unsigned imm)
4681{
4682 int bs = (imm & 0x20000000) ? 0x3e000000 : 0x40000000;
4683 return (imm & 0x7ffff) == 0 && ((imm & 0x7e000000) ^ bs) == 0;
4684}
4685
4686/* Parse an 8-bit "quarter-precision" floating point number of the form:
4687 0baBbbbbbc defgh000 00000000 00000000.
c96612cc
JB
4688 The zero and minus-zero cases need special handling, since they can't be
4689 encoded in the "quarter-precision" float format, but can nonetheless be
4690 loaded as integer constants. */
136da414
JB
4691
4692static unsigned
4693parse_qfloat_immediate (char **ccp, int *immed)
4694{
4695 char *str = *ccp;
c96612cc 4696 char *fpnum;
136da414 4697 LITTLENUM_TYPE words[MAX_LITTLENUMS];
c96612cc 4698 int found_fpchar = 0;
5f4273c7 4699
136da414 4700 skip_past_char (&str, '#');
5f4273c7 4701
c96612cc
JB
4702 /* We must not accidentally parse an integer as a floating-point number. Make
4703 sure that the value we parse is not an integer by checking for special
4704 characters '.' or 'e'.
4705 FIXME: This is a horrible hack, but doing better is tricky because type
4706 information isn't in a very usable state at parse time. */
4707 fpnum = str;
4708 skip_whitespace (fpnum);
4709
4710 if (strncmp (fpnum, "0x", 2) == 0)
4711 return FAIL;
4712 else
4713 {
4714 for (; *fpnum != '\0' && *fpnum != ' ' && *fpnum != '\n'; fpnum++)
477330fc
RM
4715 if (*fpnum == '.' || *fpnum == 'e' || *fpnum == 'E')
4716 {
4717 found_fpchar = 1;
4718 break;
4719 }
c96612cc
JB
4720
4721 if (!found_fpchar)
477330fc 4722 return FAIL;
c96612cc 4723 }
5f4273c7 4724
136da414
JB
4725 if ((str = atof_ieee (str, 's', words)) != NULL)
4726 {
4727 unsigned fpword = 0;
4728 int i;
5f4273c7 4729
136da414
JB
4730 /* Our FP word must be 32 bits (single-precision FP). */
4731 for (i = 0; i < 32 / LITTLENUM_NUMBER_OF_BITS; i++)
477330fc
RM
4732 {
4733 fpword <<= LITTLENUM_NUMBER_OF_BITS;
4734 fpword |= words[i];
4735 }
5f4273c7 4736
c96612cc 4737 if (is_quarter_float (fpword) || (fpword & 0x7fffffff) == 0)
477330fc 4738 *immed = fpword;
136da414 4739 else
477330fc 4740 return FAIL;
136da414
JB
4741
4742 *ccp = str;
5f4273c7 4743
136da414
JB
4744 return SUCCESS;
4745 }
5f4273c7 4746
136da414
JB
4747 return FAIL;
4748}
4749
c19d1205
ZW
4750/* Shift operands. */
4751enum shift_kind
b99bd4ef 4752{
c19d1205
ZW
4753 SHIFT_LSL, SHIFT_LSR, SHIFT_ASR, SHIFT_ROR, SHIFT_RRX
4754};
b99bd4ef 4755
c19d1205
ZW
4756struct asm_shift_name
4757{
4758 const char *name;
4759 enum shift_kind kind;
4760};
b99bd4ef 4761
c19d1205
ZW
4762/* Third argument to parse_shift. */
4763enum parse_shift_mode
4764{
4765 NO_SHIFT_RESTRICT, /* Any kind of shift is accepted. */
4766 SHIFT_IMMEDIATE, /* Shift operand must be an immediate. */
4767 SHIFT_LSL_OR_ASR_IMMEDIATE, /* Shift must be LSL or ASR immediate. */
4768 SHIFT_ASR_IMMEDIATE, /* Shift must be ASR immediate. */
4769 SHIFT_LSL_IMMEDIATE, /* Shift must be LSL immediate. */
4770};
b99bd4ef 4771
c19d1205
ZW
4772/* Parse a <shift> specifier on an ARM data processing instruction.
4773 This has three forms:
b99bd4ef 4774
c19d1205
ZW
4775 (LSL|LSR|ASL|ASR|ROR) Rs
4776 (LSL|LSR|ASL|ASR|ROR) #imm
4777 RRX
b99bd4ef 4778
c19d1205
ZW
4779 Note that ASL is assimilated to LSL in the instruction encoding, and
4780 RRX to ROR #0 (which cannot be written as such). */
b99bd4ef 4781
c19d1205
ZW
4782static int
4783parse_shift (char **str, int i, enum parse_shift_mode mode)
b99bd4ef 4784{
c19d1205
ZW
4785 const struct asm_shift_name *shift_name;
4786 enum shift_kind shift;
4787 char *s = *str;
4788 char *p = s;
4789 int reg;
b99bd4ef 4790
c19d1205
ZW
4791 for (p = *str; ISALPHA (*p); p++)
4792 ;
b99bd4ef 4793
c19d1205 4794 if (p == *str)
b99bd4ef 4795 {
c19d1205
ZW
4796 inst.error = _("shift expression expected");
4797 return FAIL;
b99bd4ef
NC
4798 }
4799
21d799b5 4800 shift_name = (const struct asm_shift_name *) hash_find_n (arm_shift_hsh, *str,
477330fc 4801 p - *str);
c19d1205
ZW
4802
4803 if (shift_name == NULL)
b99bd4ef 4804 {
c19d1205
ZW
4805 inst.error = _("shift expression expected");
4806 return FAIL;
b99bd4ef
NC
4807 }
4808
c19d1205 4809 shift = shift_name->kind;
b99bd4ef 4810
c19d1205
ZW
4811 switch (mode)
4812 {
4813 case NO_SHIFT_RESTRICT:
4814 case SHIFT_IMMEDIATE: break;
b99bd4ef 4815
c19d1205
ZW
4816 case SHIFT_LSL_OR_ASR_IMMEDIATE:
4817 if (shift != SHIFT_LSL && shift != SHIFT_ASR)
4818 {
4819 inst.error = _("'LSL' or 'ASR' required");
4820 return FAIL;
4821 }
4822 break;
b99bd4ef 4823
c19d1205
ZW
4824 case SHIFT_LSL_IMMEDIATE:
4825 if (shift != SHIFT_LSL)
4826 {
4827 inst.error = _("'LSL' required");
4828 return FAIL;
4829 }
4830 break;
b99bd4ef 4831
c19d1205
ZW
4832 case SHIFT_ASR_IMMEDIATE:
4833 if (shift != SHIFT_ASR)
4834 {
4835 inst.error = _("'ASR' required");
4836 return FAIL;
4837 }
4838 break;
b99bd4ef 4839
c19d1205
ZW
4840 default: abort ();
4841 }
b99bd4ef 4842
c19d1205
ZW
4843 if (shift != SHIFT_RRX)
4844 {
4845 /* Whitespace can appear here if the next thing is a bare digit. */
4846 skip_whitespace (p);
b99bd4ef 4847
c19d1205 4848 if (mode == NO_SHIFT_RESTRICT
dcbf9037 4849 && (reg = arm_reg_parse (&p, REG_TYPE_RN)) != FAIL)
c19d1205
ZW
4850 {
4851 inst.operands[i].imm = reg;
4852 inst.operands[i].immisreg = 1;
4853 }
4854 else if (my_get_expression (&inst.reloc.exp, &p, GE_IMM_PREFIX))
4855 return FAIL;
4856 }
4857 inst.operands[i].shift_kind = shift;
4858 inst.operands[i].shifted = 1;
4859 *str = p;
4860 return SUCCESS;
b99bd4ef
NC
4861}
4862
c19d1205 4863/* Parse a <shifter_operand> for an ARM data processing instruction:
b99bd4ef 4864
c19d1205
ZW
4865 #<immediate>
4866 #<immediate>, <rotate>
4867 <Rm>
4868 <Rm>, <shift>
b99bd4ef 4869
c19d1205
ZW
4870 where <shift> is defined by parse_shift above, and <rotate> is a
4871 multiple of 2 between 0 and 30. Validation of immediate operands
55cf6793 4872 is deferred to md_apply_fix. */
b99bd4ef 4873
c19d1205
ZW
4874static int
4875parse_shifter_operand (char **str, int i)
4876{
4877 int value;
91d6fa6a 4878 expressionS exp;
b99bd4ef 4879
dcbf9037 4880 if ((value = arm_reg_parse (str, REG_TYPE_RN)) != FAIL)
c19d1205
ZW
4881 {
4882 inst.operands[i].reg = value;
4883 inst.operands[i].isreg = 1;
b99bd4ef 4884
c19d1205
ZW
4885 /* parse_shift will override this if appropriate */
4886 inst.reloc.exp.X_op = O_constant;
4887 inst.reloc.exp.X_add_number = 0;
b99bd4ef 4888
c19d1205
ZW
4889 if (skip_past_comma (str) == FAIL)
4890 return SUCCESS;
b99bd4ef 4891
c19d1205
ZW
4892 /* Shift operation on register. */
4893 return parse_shift (str, i, NO_SHIFT_RESTRICT);
b99bd4ef
NC
4894 }
4895
c19d1205
ZW
4896 if (my_get_expression (&inst.reloc.exp, str, GE_IMM_PREFIX))
4897 return FAIL;
b99bd4ef 4898
c19d1205 4899 if (skip_past_comma (str) == SUCCESS)
b99bd4ef 4900 {
c19d1205 4901 /* #x, y -- ie explicit rotation by Y. */
91d6fa6a 4902 if (my_get_expression (&exp, str, GE_NO_PREFIX))
c19d1205 4903 return FAIL;
b99bd4ef 4904
91d6fa6a 4905 if (exp.X_op != O_constant || inst.reloc.exp.X_op != O_constant)
c19d1205
ZW
4906 {
4907 inst.error = _("constant expression expected");
4908 return FAIL;
4909 }
b99bd4ef 4910
91d6fa6a 4911 value = exp.X_add_number;
c19d1205
ZW
4912 if (value < 0 || value > 30 || value % 2 != 0)
4913 {
4914 inst.error = _("invalid rotation");
4915 return FAIL;
4916 }
4917 if (inst.reloc.exp.X_add_number < 0 || inst.reloc.exp.X_add_number > 255)
4918 {
4919 inst.error = _("invalid constant");
4920 return FAIL;
4921 }
09d92015 4922
a415b1cd
JB
4923 /* Encode as specified. */
4924 inst.operands[i].imm = inst.reloc.exp.X_add_number | value << 7;
4925 return SUCCESS;
09d92015
MM
4926 }
4927
c19d1205
ZW
4928 inst.reloc.type = BFD_RELOC_ARM_IMMEDIATE;
4929 inst.reloc.pc_rel = 0;
4930 return SUCCESS;
09d92015
MM
4931}
4932
4962c51a
MS
4933/* Group relocation information. Each entry in the table contains the
4934 textual name of the relocation as may appear in assembler source
4935 and must end with a colon.
4936 Along with this textual name are the relocation codes to be used if
4937 the corresponding instruction is an ALU instruction (ADD or SUB only),
4938 an LDR, an LDRS, or an LDC. */
4939
4940struct group_reloc_table_entry
4941{
4942 const char *name;
4943 int alu_code;
4944 int ldr_code;
4945 int ldrs_code;
4946 int ldc_code;
4947};
4948
4949typedef enum
4950{
4951 /* Varieties of non-ALU group relocation. */
4952
4953 GROUP_LDR,
4954 GROUP_LDRS,
4955 GROUP_LDC
4956} group_reloc_type;
4957
4958static struct group_reloc_table_entry group_reloc_table[] =
4959 { /* Program counter relative: */
4960 { "pc_g0_nc",
4961 BFD_RELOC_ARM_ALU_PC_G0_NC, /* ALU */
4962 0, /* LDR */
4963 0, /* LDRS */
4964 0 }, /* LDC */
4965 { "pc_g0",
4966 BFD_RELOC_ARM_ALU_PC_G0, /* ALU */
4967 BFD_RELOC_ARM_LDR_PC_G0, /* LDR */
4968 BFD_RELOC_ARM_LDRS_PC_G0, /* LDRS */
4969 BFD_RELOC_ARM_LDC_PC_G0 }, /* LDC */
4970 { "pc_g1_nc",
4971 BFD_RELOC_ARM_ALU_PC_G1_NC, /* ALU */
4972 0, /* LDR */
4973 0, /* LDRS */
4974 0 }, /* LDC */
4975 { "pc_g1",
4976 BFD_RELOC_ARM_ALU_PC_G1, /* ALU */
4977 BFD_RELOC_ARM_LDR_PC_G1, /* LDR */
4978 BFD_RELOC_ARM_LDRS_PC_G1, /* LDRS */
4979 BFD_RELOC_ARM_LDC_PC_G1 }, /* LDC */
4980 { "pc_g2",
4981 BFD_RELOC_ARM_ALU_PC_G2, /* ALU */
4982 BFD_RELOC_ARM_LDR_PC_G2, /* LDR */
4983 BFD_RELOC_ARM_LDRS_PC_G2, /* LDRS */
4984 BFD_RELOC_ARM_LDC_PC_G2 }, /* LDC */
4985 /* Section base relative */
4986 { "sb_g0_nc",
4987 BFD_RELOC_ARM_ALU_SB_G0_NC, /* ALU */
4988 0, /* LDR */
4989 0, /* LDRS */
4990 0 }, /* LDC */
4991 { "sb_g0",
4992 BFD_RELOC_ARM_ALU_SB_G0, /* ALU */
4993 BFD_RELOC_ARM_LDR_SB_G0, /* LDR */
4994 BFD_RELOC_ARM_LDRS_SB_G0, /* LDRS */
4995 BFD_RELOC_ARM_LDC_SB_G0 }, /* LDC */
4996 { "sb_g1_nc",
4997 BFD_RELOC_ARM_ALU_SB_G1_NC, /* ALU */
4998 0, /* LDR */
4999 0, /* LDRS */
5000 0 }, /* LDC */
5001 { "sb_g1",
5002 BFD_RELOC_ARM_ALU_SB_G1, /* ALU */
5003 BFD_RELOC_ARM_LDR_SB_G1, /* LDR */
5004 BFD_RELOC_ARM_LDRS_SB_G1, /* LDRS */
5005 BFD_RELOC_ARM_LDC_SB_G1 }, /* LDC */
5006 { "sb_g2",
5007 BFD_RELOC_ARM_ALU_SB_G2, /* ALU */
5008 BFD_RELOC_ARM_LDR_SB_G2, /* LDR */
5009 BFD_RELOC_ARM_LDRS_SB_G2, /* LDRS */
5010 BFD_RELOC_ARM_LDC_SB_G2 } }; /* LDC */
5011
5012/* Given the address of a pointer pointing to the textual name of a group
5013 relocation as may appear in assembler source, attempt to find its details
5014 in group_reloc_table. The pointer will be updated to the character after
5015 the trailing colon. On failure, FAIL will be returned; SUCCESS
5016 otherwise. On success, *entry will be updated to point at the relevant
5017 group_reloc_table entry. */
5018
5019static int
5020find_group_reloc_table_entry (char **str, struct group_reloc_table_entry **out)
5021{
5022 unsigned int i;
5023 for (i = 0; i < ARRAY_SIZE (group_reloc_table); i++)
5024 {
5025 int length = strlen (group_reloc_table[i].name);
5026
5f4273c7
NC
5027 if (strncasecmp (group_reloc_table[i].name, *str, length) == 0
5028 && (*str)[length] == ':')
477330fc
RM
5029 {
5030 *out = &group_reloc_table[i];
5031 *str += (length + 1);
5032 return SUCCESS;
5033 }
4962c51a
MS
5034 }
5035
5036 return FAIL;
5037}
5038
5039/* Parse a <shifter_operand> for an ARM data processing instruction
5040 (as for parse_shifter_operand) where group relocations are allowed:
5041
5042 #<immediate>
5043 #<immediate>, <rotate>
5044 #:<group_reloc>:<expression>
5045 <Rm>
5046 <Rm>, <shift>
5047
5048 where <group_reloc> is one of the strings defined in group_reloc_table.
5049 The hashes are optional.
5050
5051 Everything else is as for parse_shifter_operand. */
5052
5053static parse_operand_result
5054parse_shifter_operand_group_reloc (char **str, int i)
5055{
5056 /* Determine if we have the sequence of characters #: or just :
5057 coming next. If we do, then we check for a group relocation.
5058 If we don't, punt the whole lot to parse_shifter_operand. */
5059
5060 if (((*str)[0] == '#' && (*str)[1] == ':')
5061 || (*str)[0] == ':')
5062 {
5063 struct group_reloc_table_entry *entry;
5064
5065 if ((*str)[0] == '#')
477330fc 5066 (*str) += 2;
4962c51a 5067 else
477330fc 5068 (*str)++;
4962c51a
MS
5069
5070 /* Try to parse a group relocation. Anything else is an error. */
5071 if (find_group_reloc_table_entry (str, &entry) == FAIL)
477330fc
RM
5072 {
5073 inst.error = _("unknown group relocation");
5074 return PARSE_OPERAND_FAIL_NO_BACKTRACK;
5075 }
4962c51a
MS
5076
5077 /* We now have the group relocation table entry corresponding to
477330fc 5078 the name in the assembler source. Next, we parse the expression. */
4962c51a 5079 if (my_get_expression (&inst.reloc.exp, str, GE_NO_PREFIX))
477330fc 5080 return PARSE_OPERAND_FAIL_NO_BACKTRACK;
4962c51a
MS
5081
5082 /* Record the relocation type (always the ALU variant here). */
21d799b5 5083 inst.reloc.type = (bfd_reloc_code_real_type) entry->alu_code;
9c2799c2 5084 gas_assert (inst.reloc.type != 0);
4962c51a
MS
5085
5086 return PARSE_OPERAND_SUCCESS;
5087 }
5088 else
5089 return parse_shifter_operand (str, i) == SUCCESS
477330fc 5090 ? PARSE_OPERAND_SUCCESS : PARSE_OPERAND_FAIL;
4962c51a
MS
5091
5092 /* Never reached. */
5093}
5094
8e560766
MGD
5095/* Parse a Neon alignment expression. Information is written to
5096 inst.operands[i]. We assume the initial ':' has been skipped.
fa94de6b 5097
8e560766
MGD
5098 align .imm = align << 8, .immisalign=1, .preind=0 */
5099static parse_operand_result
5100parse_neon_alignment (char **str, int i)
5101{
5102 char *p = *str;
5103 expressionS exp;
5104
5105 my_get_expression (&exp, &p, GE_NO_PREFIX);
5106
5107 if (exp.X_op != O_constant)
5108 {
5109 inst.error = _("alignment must be constant");
5110 return PARSE_OPERAND_FAIL;
5111 }
5112
5113 inst.operands[i].imm = exp.X_add_number << 8;
5114 inst.operands[i].immisalign = 1;
5115 /* Alignments are not pre-indexes. */
5116 inst.operands[i].preind = 0;
5117
5118 *str = p;
5119 return PARSE_OPERAND_SUCCESS;
5120}
5121
c19d1205
ZW
5122/* Parse all forms of an ARM address expression. Information is written
5123 to inst.operands[i] and/or inst.reloc.
09d92015 5124
c19d1205 5125 Preindexed addressing (.preind=1):
09d92015 5126
c19d1205
ZW
5127 [Rn, #offset] .reg=Rn .reloc.exp=offset
5128 [Rn, +/-Rm] .reg=Rn .imm=Rm .immisreg=1 .negative=0/1
5129 [Rn, +/-Rm, shift] .reg=Rn .imm=Rm .immisreg=1 .negative=0/1
5130 .shift_kind=shift .reloc.exp=shift_imm
09d92015 5131
c19d1205 5132 These three may have a trailing ! which causes .writeback to be set also.
09d92015 5133
c19d1205 5134 Postindexed addressing (.postind=1, .writeback=1):
09d92015 5135
c19d1205
ZW
5136 [Rn], #offset .reg=Rn .reloc.exp=offset
5137 [Rn], +/-Rm .reg=Rn .imm=Rm .immisreg=1 .negative=0/1
5138 [Rn], +/-Rm, shift .reg=Rn .imm=Rm .immisreg=1 .negative=0/1
5139 .shift_kind=shift .reloc.exp=shift_imm
09d92015 5140
c19d1205 5141 Unindexed addressing (.preind=0, .postind=0):
09d92015 5142
c19d1205 5143 [Rn], {option} .reg=Rn .imm=option .immisreg=0
09d92015 5144
c19d1205 5145 Other:
09d92015 5146
c19d1205
ZW
5147 [Rn]{!} shorthand for [Rn,#0]{!}
5148 =immediate .isreg=0 .reloc.exp=immediate
5149 label .reg=PC .reloc.pc_rel=1 .reloc.exp=label
09d92015 5150
c19d1205
ZW
5151 It is the caller's responsibility to check for addressing modes not
5152 supported by the instruction, and to set inst.reloc.type. */
5153
4962c51a
MS
5154static parse_operand_result
5155parse_address_main (char **str, int i, int group_relocations,
477330fc 5156 group_reloc_type group_type)
09d92015 5157{
c19d1205
ZW
5158 char *p = *str;
5159 int reg;
09d92015 5160
c19d1205 5161 if (skip_past_char (&p, '[') == FAIL)
09d92015 5162 {
c19d1205
ZW
5163 if (skip_past_char (&p, '=') == FAIL)
5164 {
974da60d 5165 /* Bare address - translate to PC-relative offset. */
c19d1205
ZW
5166 inst.reloc.pc_rel = 1;
5167 inst.operands[i].reg = REG_PC;
5168 inst.operands[i].isreg = 1;
5169 inst.operands[i].preind = 1;
5170 }
974da60d 5171 /* Otherwise a load-constant pseudo op, no special treatment needed here. */
09d92015 5172
c19d1205 5173 if (my_get_expression (&inst.reloc.exp, &p, GE_NO_PREFIX))
4962c51a 5174 return PARSE_OPERAND_FAIL;
09d92015 5175
c19d1205 5176 *str = p;
4962c51a 5177 return PARSE_OPERAND_SUCCESS;
09d92015
MM
5178 }
5179
8ab8155f
NC
5180 /* PR gas/14887: Allow for whitespace after the opening bracket. */
5181 skip_whitespace (p);
5182
dcbf9037 5183 if ((reg = arm_reg_parse (&p, REG_TYPE_RN)) == FAIL)
09d92015 5184 {
c19d1205 5185 inst.error = _(reg_expected_msgs[REG_TYPE_RN]);
4962c51a 5186 return PARSE_OPERAND_FAIL;
09d92015 5187 }
c19d1205
ZW
5188 inst.operands[i].reg = reg;
5189 inst.operands[i].isreg = 1;
09d92015 5190
c19d1205 5191 if (skip_past_comma (&p) == SUCCESS)
09d92015 5192 {
c19d1205 5193 inst.operands[i].preind = 1;
09d92015 5194
c19d1205
ZW
5195 if (*p == '+') p++;
5196 else if (*p == '-') p++, inst.operands[i].negative = 1;
5197
dcbf9037 5198 if ((reg = arm_reg_parse (&p, REG_TYPE_RN)) != FAIL)
09d92015 5199 {
c19d1205
ZW
5200 inst.operands[i].imm = reg;
5201 inst.operands[i].immisreg = 1;
5202
5203 if (skip_past_comma (&p) == SUCCESS)
5204 if (parse_shift (&p, i, SHIFT_IMMEDIATE) == FAIL)
4962c51a 5205 return PARSE_OPERAND_FAIL;
c19d1205 5206 }
5287ad62 5207 else if (skip_past_char (&p, ':') == SUCCESS)
8e560766
MGD
5208 {
5209 /* FIXME: '@' should be used here, but it's filtered out by generic
5210 code before we get to see it here. This may be subject to
5211 change. */
5212 parse_operand_result result = parse_neon_alignment (&p, i);
fa94de6b 5213
8e560766
MGD
5214 if (result != PARSE_OPERAND_SUCCESS)
5215 return result;
5216 }
c19d1205
ZW
5217 else
5218 {
5219 if (inst.operands[i].negative)
5220 {
5221 inst.operands[i].negative = 0;
5222 p--;
5223 }
4962c51a 5224
5f4273c7
NC
5225 if (group_relocations
5226 && ((*p == '#' && *(p + 1) == ':') || *p == ':'))
4962c51a
MS
5227 {
5228 struct group_reloc_table_entry *entry;
5229
477330fc
RM
5230 /* Skip over the #: or : sequence. */
5231 if (*p == '#')
5232 p += 2;
5233 else
5234 p++;
4962c51a
MS
5235
5236 /* Try to parse a group relocation. Anything else is an
477330fc 5237 error. */
4962c51a
MS
5238 if (find_group_reloc_table_entry (&p, &entry) == FAIL)
5239 {
5240 inst.error = _("unknown group relocation");
5241 return PARSE_OPERAND_FAIL_NO_BACKTRACK;
5242 }
5243
5244 /* We now have the group relocation table entry corresponding to
5245 the name in the assembler source. Next, we parse the
477330fc 5246 expression. */
4962c51a
MS
5247 if (my_get_expression (&inst.reloc.exp, &p, GE_NO_PREFIX))
5248 return PARSE_OPERAND_FAIL_NO_BACKTRACK;
5249
5250 /* Record the relocation type. */
477330fc
RM
5251 switch (group_type)
5252 {
5253 case GROUP_LDR:
5254 inst.reloc.type = (bfd_reloc_code_real_type) entry->ldr_code;
5255 break;
4962c51a 5256
477330fc
RM
5257 case GROUP_LDRS:
5258 inst.reloc.type = (bfd_reloc_code_real_type) entry->ldrs_code;
5259 break;
4962c51a 5260
477330fc
RM
5261 case GROUP_LDC:
5262 inst.reloc.type = (bfd_reloc_code_real_type) entry->ldc_code;
5263 break;
4962c51a 5264
477330fc
RM
5265 default:
5266 gas_assert (0);
5267 }
4962c51a 5268
477330fc 5269 if (inst.reloc.type == 0)
4962c51a
MS
5270 {
5271 inst.error = _("this group relocation is not allowed on this instruction");
5272 return PARSE_OPERAND_FAIL_NO_BACKTRACK;
5273 }
477330fc
RM
5274 }
5275 else
26d97720
NS
5276 {
5277 char *q = p;
5278 if (my_get_expression (&inst.reloc.exp, &p, GE_IMM_PREFIX))
5279 return PARSE_OPERAND_FAIL;
5280 /* If the offset is 0, find out if it's a +0 or -0. */
5281 if (inst.reloc.exp.X_op == O_constant
5282 && inst.reloc.exp.X_add_number == 0)
5283 {
5284 skip_whitespace (q);
5285 if (*q == '#')
5286 {
5287 q++;
5288 skip_whitespace (q);
5289 }
5290 if (*q == '-')
5291 inst.operands[i].negative = 1;
5292 }
5293 }
09d92015
MM
5294 }
5295 }
8e560766
MGD
5296 else if (skip_past_char (&p, ':') == SUCCESS)
5297 {
5298 /* FIXME: '@' should be used here, but it's filtered out by generic code
5299 before we get to see it here. This may be subject to change. */
5300 parse_operand_result result = parse_neon_alignment (&p, i);
fa94de6b 5301
8e560766
MGD
5302 if (result != PARSE_OPERAND_SUCCESS)
5303 return result;
5304 }
09d92015 5305
c19d1205 5306 if (skip_past_char (&p, ']') == FAIL)
09d92015 5307 {
c19d1205 5308 inst.error = _("']' expected");
4962c51a 5309 return PARSE_OPERAND_FAIL;
09d92015
MM
5310 }
5311
c19d1205
ZW
5312 if (skip_past_char (&p, '!') == SUCCESS)
5313 inst.operands[i].writeback = 1;
09d92015 5314
c19d1205 5315 else if (skip_past_comma (&p) == SUCCESS)
09d92015 5316 {
c19d1205
ZW
5317 if (skip_past_char (&p, '{') == SUCCESS)
5318 {
5319 /* [Rn], {expr} - unindexed, with option */
5320 if (parse_immediate (&p, &inst.operands[i].imm,
ca3f61f7 5321 0, 255, TRUE) == FAIL)
4962c51a 5322 return PARSE_OPERAND_FAIL;
09d92015 5323
c19d1205
ZW
5324 if (skip_past_char (&p, '}') == FAIL)
5325 {
5326 inst.error = _("'}' expected at end of 'option' field");
4962c51a 5327 return PARSE_OPERAND_FAIL;
c19d1205
ZW
5328 }
5329 if (inst.operands[i].preind)
5330 {
5331 inst.error = _("cannot combine index with option");
4962c51a 5332 return PARSE_OPERAND_FAIL;
c19d1205
ZW
5333 }
5334 *str = p;
4962c51a 5335 return PARSE_OPERAND_SUCCESS;
09d92015 5336 }
c19d1205
ZW
5337 else
5338 {
5339 inst.operands[i].postind = 1;
5340 inst.operands[i].writeback = 1;
09d92015 5341
c19d1205
ZW
5342 if (inst.operands[i].preind)
5343 {
5344 inst.error = _("cannot combine pre- and post-indexing");
4962c51a 5345 return PARSE_OPERAND_FAIL;
c19d1205 5346 }
09d92015 5347
c19d1205
ZW
5348 if (*p == '+') p++;
5349 else if (*p == '-') p++, inst.operands[i].negative = 1;
a737bd4d 5350
dcbf9037 5351 if ((reg = arm_reg_parse (&p, REG_TYPE_RN)) != FAIL)
c19d1205 5352 {
477330fc
RM
5353 /* We might be using the immediate for alignment already. If we
5354 are, OR the register number into the low-order bits. */
5355 if (inst.operands[i].immisalign)
5356 inst.operands[i].imm |= reg;
5357 else
5358 inst.operands[i].imm = reg;
c19d1205 5359 inst.operands[i].immisreg = 1;
a737bd4d 5360
c19d1205
ZW
5361 if (skip_past_comma (&p) == SUCCESS)
5362 if (parse_shift (&p, i, SHIFT_IMMEDIATE) == FAIL)
4962c51a 5363 return PARSE_OPERAND_FAIL;
c19d1205
ZW
5364 }
5365 else
5366 {
26d97720 5367 char *q = p;
c19d1205
ZW
5368 if (inst.operands[i].negative)
5369 {
5370 inst.operands[i].negative = 0;
5371 p--;
5372 }
5373 if (my_get_expression (&inst.reloc.exp, &p, GE_IMM_PREFIX))
4962c51a 5374 return PARSE_OPERAND_FAIL;
26d97720
NS
5375 /* If the offset is 0, find out if it's a +0 or -0. */
5376 if (inst.reloc.exp.X_op == O_constant
5377 && inst.reloc.exp.X_add_number == 0)
5378 {
5379 skip_whitespace (q);
5380 if (*q == '#')
5381 {
5382 q++;
5383 skip_whitespace (q);
5384 }
5385 if (*q == '-')
5386 inst.operands[i].negative = 1;
5387 }
c19d1205
ZW
5388 }
5389 }
a737bd4d
NC
5390 }
5391
c19d1205
ZW
5392 /* If at this point neither .preind nor .postind is set, we have a
5393 bare [Rn]{!}, which is shorthand for [Rn,#0]{!}. */
5394 if (inst.operands[i].preind == 0 && inst.operands[i].postind == 0)
5395 {
5396 inst.operands[i].preind = 1;
5397 inst.reloc.exp.X_op = O_constant;
5398 inst.reloc.exp.X_add_number = 0;
5399 }
5400 *str = p;
4962c51a
MS
5401 return PARSE_OPERAND_SUCCESS;
5402}
5403
5404static int
5405parse_address (char **str, int i)
5406{
21d799b5 5407 return parse_address_main (str, i, 0, GROUP_LDR) == PARSE_OPERAND_SUCCESS
477330fc 5408 ? SUCCESS : FAIL;
4962c51a
MS
5409}
5410
5411static parse_operand_result
5412parse_address_group_reloc (char **str, int i, group_reloc_type type)
5413{
5414 return parse_address_main (str, i, 1, type);
a737bd4d
NC
5415}
5416
b6895b4f
PB
5417/* Parse an operand for a MOVW or MOVT instruction. */
5418static int
5419parse_half (char **str)
5420{
5421 char * p;
5f4273c7 5422
b6895b4f
PB
5423 p = *str;
5424 skip_past_char (&p, '#');
5f4273c7 5425 if (strncasecmp (p, ":lower16:", 9) == 0)
b6895b4f
PB
5426 inst.reloc.type = BFD_RELOC_ARM_MOVW;
5427 else if (strncasecmp (p, ":upper16:", 9) == 0)
5428 inst.reloc.type = BFD_RELOC_ARM_MOVT;
5429
5430 if (inst.reloc.type != BFD_RELOC_UNUSED)
5431 {
5432 p += 9;
5f4273c7 5433 skip_whitespace (p);
b6895b4f
PB
5434 }
5435
5436 if (my_get_expression (&inst.reloc.exp, &p, GE_NO_PREFIX))
5437 return FAIL;
5438
5439 if (inst.reloc.type == BFD_RELOC_UNUSED)
5440 {
5441 if (inst.reloc.exp.X_op != O_constant)
5442 {
5443 inst.error = _("constant expression expected");
5444 return FAIL;
5445 }
5446 if (inst.reloc.exp.X_add_number < 0
5447 || inst.reloc.exp.X_add_number > 0xffff)
5448 {
5449 inst.error = _("immediate value out of range");
5450 return FAIL;
5451 }
5452 }
5453 *str = p;
5454 return SUCCESS;
5455}
5456
c19d1205 5457/* Miscellaneous. */
a737bd4d 5458
c19d1205
ZW
5459/* Parse a PSR flag operand. The value returned is FAIL on syntax error,
5460 or a bitmask suitable to be or-ed into the ARM msr instruction. */
5461static int
d2cd1205 5462parse_psr (char **str, bfd_boolean lhs)
09d92015 5463{
c19d1205
ZW
5464 char *p;
5465 unsigned long psr_field;
62b3e311
PB
5466 const struct asm_psr *psr;
5467 char *start;
d2cd1205 5468 bfd_boolean is_apsr = FALSE;
ac7f631b 5469 bfd_boolean m_profile = ARM_CPU_HAS_FEATURE (selected_cpu, arm_ext_m);
09d92015 5470
a4482bb6
NC
5471 /* PR gas/12698: If the user has specified -march=all then m_profile will
5472 be TRUE, but we want to ignore it in this case as we are building for any
5473 CPU type, including non-m variants. */
5474 if (selected_cpu.core == arm_arch_any.core)
5475 m_profile = FALSE;
5476
c19d1205
ZW
5477 /* CPSR's and SPSR's can now be lowercase. This is just a convenience
5478 feature for ease of use and backwards compatibility. */
5479 p = *str;
62b3e311 5480 if (strncasecmp (p, "SPSR", 4) == 0)
d2cd1205
JB
5481 {
5482 if (m_profile)
5483 goto unsupported_psr;
fa94de6b 5484
d2cd1205
JB
5485 psr_field = SPSR_BIT;
5486 }
5487 else if (strncasecmp (p, "CPSR", 4) == 0)
5488 {
5489 if (m_profile)
5490 goto unsupported_psr;
5491
5492 psr_field = 0;
5493 }
5494 else if (strncasecmp (p, "APSR", 4) == 0)
5495 {
5496 /* APSR[_<bits>] can be used as a synonym for CPSR[_<flags>] on ARMv7-A
5497 and ARMv7-R architecture CPUs. */
5498 is_apsr = TRUE;
5499 psr_field = 0;
5500 }
5501 else if (m_profile)
62b3e311
PB
5502 {
5503 start = p;
5504 do
5505 p++;
5506 while (ISALNUM (*p) || *p == '_');
5507
d2cd1205
JB
5508 if (strncasecmp (start, "iapsr", 5) == 0
5509 || strncasecmp (start, "eapsr", 5) == 0
5510 || strncasecmp (start, "xpsr", 4) == 0
5511 || strncasecmp (start, "psr", 3) == 0)
5512 p = start + strcspn (start, "rR") + 1;
5513
21d799b5 5514 psr = (const struct asm_psr *) hash_find_n (arm_v7m_psr_hsh, start,
477330fc 5515 p - start);
d2cd1205 5516
62b3e311
PB
5517 if (!psr)
5518 return FAIL;
09d92015 5519
d2cd1205
JB
5520 /* If APSR is being written, a bitfield may be specified. Note that
5521 APSR itself is handled above. */
5522 if (psr->field <= 3)
5523 {
5524 psr_field = psr->field;
5525 is_apsr = TRUE;
5526 goto check_suffix;
5527 }
5528
62b3e311 5529 *str = p;
d2cd1205
JB
5530 /* M-profile MSR instructions have the mask field set to "10", except
5531 *PSR variants which modify APSR, which may use a different mask (and
5532 have been handled already). Do that by setting the PSR_f field
5533 here. */
5534 return psr->field | (lhs ? PSR_f : 0);
62b3e311 5535 }
d2cd1205
JB
5536 else
5537 goto unsupported_psr;
09d92015 5538
62b3e311 5539 p += 4;
d2cd1205 5540check_suffix:
c19d1205
ZW
5541 if (*p == '_')
5542 {
5543 /* A suffix follows. */
c19d1205
ZW
5544 p++;
5545 start = p;
a737bd4d 5546
c19d1205
ZW
5547 do
5548 p++;
5549 while (ISALNUM (*p) || *p == '_');
a737bd4d 5550
d2cd1205
JB
5551 if (is_apsr)
5552 {
5553 /* APSR uses a notation for bits, rather than fields. */
5554 unsigned int nzcvq_bits = 0;
5555 unsigned int g_bit = 0;
5556 char *bit;
fa94de6b 5557
d2cd1205
JB
5558 for (bit = start; bit != p; bit++)
5559 {
5560 switch (TOLOWER (*bit))
477330fc 5561 {
d2cd1205
JB
5562 case 'n':
5563 nzcvq_bits |= (nzcvq_bits & 0x01) ? 0x20 : 0x01;
5564 break;
5565
5566 case 'z':
5567 nzcvq_bits |= (nzcvq_bits & 0x02) ? 0x20 : 0x02;
5568 break;
5569
5570 case 'c':
5571 nzcvq_bits |= (nzcvq_bits & 0x04) ? 0x20 : 0x04;
5572 break;
5573
5574 case 'v':
5575 nzcvq_bits |= (nzcvq_bits & 0x08) ? 0x20 : 0x08;
5576 break;
fa94de6b 5577
d2cd1205
JB
5578 case 'q':
5579 nzcvq_bits |= (nzcvq_bits & 0x10) ? 0x20 : 0x10;
5580 break;
fa94de6b 5581
d2cd1205
JB
5582 case 'g':
5583 g_bit |= (g_bit & 0x1) ? 0x2 : 0x1;
5584 break;
fa94de6b 5585
d2cd1205
JB
5586 default:
5587 inst.error = _("unexpected bit specified after APSR");
5588 return FAIL;
5589 }
5590 }
fa94de6b 5591
d2cd1205
JB
5592 if (nzcvq_bits == 0x1f)
5593 psr_field |= PSR_f;
fa94de6b 5594
d2cd1205
JB
5595 if (g_bit == 0x1)
5596 {
5597 if (!ARM_CPU_HAS_FEATURE (selected_cpu, arm_ext_v6_dsp))
477330fc 5598 {
d2cd1205
JB
5599 inst.error = _("selected processor does not "
5600 "support DSP extension");
5601 return FAIL;
5602 }
5603
5604 psr_field |= PSR_s;
5605 }
fa94de6b 5606
d2cd1205
JB
5607 if ((nzcvq_bits & 0x20) != 0
5608 || (nzcvq_bits != 0x1f && nzcvq_bits != 0)
5609 || (g_bit & 0x2) != 0)
5610 {
5611 inst.error = _("bad bitmask specified after APSR");
5612 return FAIL;
5613 }
5614 }
5615 else
477330fc 5616 {
d2cd1205 5617 psr = (const struct asm_psr *) hash_find_n (arm_psr_hsh, start,
477330fc 5618 p - start);
d2cd1205 5619 if (!psr)
477330fc 5620 goto error;
a737bd4d 5621
d2cd1205
JB
5622 psr_field |= psr->field;
5623 }
a737bd4d 5624 }
c19d1205 5625 else
a737bd4d 5626 {
c19d1205
ZW
5627 if (ISALNUM (*p))
5628 goto error; /* Garbage after "[CS]PSR". */
5629
d2cd1205 5630 /* Unadorned APSR is equivalent to APSR_nzcvq/CPSR_f (for writes). This
477330fc 5631 is deprecated, but allow it anyway. */
d2cd1205
JB
5632 if (is_apsr && lhs)
5633 {
5634 psr_field |= PSR_f;
5635 as_tsktsk (_("writing to APSR without specifying a bitmask is "
5636 "deprecated"));
5637 }
5638 else if (!m_profile)
5639 /* These bits are never right for M-profile devices: don't set them
5640 (only code paths which read/write APSR reach here). */
5641 psr_field |= (PSR_c | PSR_f);
a737bd4d 5642 }
c19d1205
ZW
5643 *str = p;
5644 return psr_field;
a737bd4d 5645
d2cd1205
JB
5646 unsupported_psr:
5647 inst.error = _("selected processor does not support requested special "
5648 "purpose register");
5649 return FAIL;
5650
c19d1205
ZW
5651 error:
5652 inst.error = _("flag for {c}psr instruction expected");
5653 return FAIL;
a737bd4d
NC
5654}
5655
c19d1205
ZW
5656/* Parse the flags argument to CPSI[ED]. Returns FAIL on error, or a
5657 value suitable for splatting into the AIF field of the instruction. */
a737bd4d 5658
c19d1205
ZW
5659static int
5660parse_cps_flags (char **str)
a737bd4d 5661{
c19d1205
ZW
5662 int val = 0;
5663 int saw_a_flag = 0;
5664 char *s = *str;
a737bd4d 5665
c19d1205
ZW
5666 for (;;)
5667 switch (*s++)
5668 {
5669 case '\0': case ',':
5670 goto done;
a737bd4d 5671
c19d1205
ZW
5672 case 'a': case 'A': saw_a_flag = 1; val |= 0x4; break;
5673 case 'i': case 'I': saw_a_flag = 1; val |= 0x2; break;
5674 case 'f': case 'F': saw_a_flag = 1; val |= 0x1; break;
a737bd4d 5675
c19d1205
ZW
5676 default:
5677 inst.error = _("unrecognized CPS flag");
5678 return FAIL;
5679 }
a737bd4d 5680
c19d1205
ZW
5681 done:
5682 if (saw_a_flag == 0)
a737bd4d 5683 {
c19d1205
ZW
5684 inst.error = _("missing CPS flags");
5685 return FAIL;
a737bd4d 5686 }
a737bd4d 5687
c19d1205
ZW
5688 *str = s - 1;
5689 return val;
a737bd4d
NC
5690}
5691
c19d1205
ZW
5692/* Parse an endian specifier ("BE" or "LE", case insensitive);
5693 returns 0 for big-endian, 1 for little-endian, FAIL for an error. */
a737bd4d
NC
5694
5695static int
c19d1205 5696parse_endian_specifier (char **str)
a737bd4d 5697{
c19d1205
ZW
5698 int little_endian;
5699 char *s = *str;
a737bd4d 5700
c19d1205
ZW
5701 if (strncasecmp (s, "BE", 2))
5702 little_endian = 0;
5703 else if (strncasecmp (s, "LE", 2))
5704 little_endian = 1;
5705 else
a737bd4d 5706 {
c19d1205 5707 inst.error = _("valid endian specifiers are be or le");
a737bd4d
NC
5708 return FAIL;
5709 }
5710
c19d1205 5711 if (ISALNUM (s[2]) || s[2] == '_')
a737bd4d 5712 {
c19d1205 5713 inst.error = _("valid endian specifiers are be or le");
a737bd4d
NC
5714 return FAIL;
5715 }
5716
c19d1205
ZW
5717 *str = s + 2;
5718 return little_endian;
5719}
a737bd4d 5720
c19d1205
ZW
5721/* Parse a rotation specifier: ROR #0, #8, #16, #24. *val receives a
5722 value suitable for poking into the rotate field of an sxt or sxta
5723 instruction, or FAIL on error. */
5724
5725static int
5726parse_ror (char **str)
5727{
5728 int rot;
5729 char *s = *str;
5730
5731 if (strncasecmp (s, "ROR", 3) == 0)
5732 s += 3;
5733 else
a737bd4d 5734 {
c19d1205 5735 inst.error = _("missing rotation field after comma");
a737bd4d
NC
5736 return FAIL;
5737 }
c19d1205
ZW
5738
5739 if (parse_immediate (&s, &rot, 0, 24, FALSE) == FAIL)
5740 return FAIL;
5741
5742 switch (rot)
a737bd4d 5743 {
c19d1205
ZW
5744 case 0: *str = s; return 0x0;
5745 case 8: *str = s; return 0x1;
5746 case 16: *str = s; return 0x2;
5747 case 24: *str = s; return 0x3;
5748
5749 default:
5750 inst.error = _("rotation can only be 0, 8, 16, or 24");
a737bd4d
NC
5751 return FAIL;
5752 }
c19d1205 5753}
a737bd4d 5754
c19d1205
ZW
5755/* Parse a conditional code (from conds[] below). The value returned is in the
5756 range 0 .. 14, or FAIL. */
5757static int
5758parse_cond (char **str)
5759{
c462b453 5760 char *q;
c19d1205 5761 const struct asm_cond *c;
c462b453
PB
5762 int n;
5763 /* Condition codes are always 2 characters, so matching up to
5764 3 characters is sufficient. */
5765 char cond[3];
a737bd4d 5766
c462b453
PB
5767 q = *str;
5768 n = 0;
5769 while (ISALPHA (*q) && n < 3)
5770 {
e07e6e58 5771 cond[n] = TOLOWER (*q);
c462b453
PB
5772 q++;
5773 n++;
5774 }
a737bd4d 5775
21d799b5 5776 c = (const struct asm_cond *) hash_find_n (arm_cond_hsh, cond, n);
c19d1205 5777 if (!c)
a737bd4d 5778 {
c19d1205 5779 inst.error = _("condition required");
a737bd4d
NC
5780 return FAIL;
5781 }
5782
c19d1205
ZW
5783 *str = q;
5784 return c->value;
5785}
5786
e797f7e0
MGD
5787/* If the given feature available in the selected CPU, mark it as used.
5788 Returns TRUE iff feature is available. */
5789static bfd_boolean
5790mark_feature_used (const arm_feature_set *feature)
5791{
5792 /* Ensure the option is valid on the current architecture. */
5793 if (!ARM_CPU_HAS_FEATURE (cpu_variant, *feature))
5794 return FALSE;
5795
5796 /* Add the appropriate architecture feature for the barrier option used.
5797 */
5798 if (thumb_mode)
5799 ARM_MERGE_FEATURE_SETS (thumb_arch_used, thumb_arch_used, *feature);
5800 else
5801 ARM_MERGE_FEATURE_SETS (arm_arch_used, arm_arch_used, *feature);
5802
5803 return TRUE;
5804}
5805
62b3e311
PB
5806/* Parse an option for a barrier instruction. Returns the encoding for the
5807 option, or FAIL. */
5808static int
5809parse_barrier (char **str)
5810{
5811 char *p, *q;
5812 const struct asm_barrier_opt *o;
5813
5814 p = q = *str;
5815 while (ISALPHA (*q))
5816 q++;
5817
21d799b5 5818 o = (const struct asm_barrier_opt *) hash_find_n (arm_barrier_opt_hsh, p,
477330fc 5819 q - p);
62b3e311
PB
5820 if (!o)
5821 return FAIL;
5822
e797f7e0
MGD
5823 if (!mark_feature_used (&o->arch))
5824 return FAIL;
5825
62b3e311
PB
5826 *str = q;
5827 return o->value;
5828}
5829
92e90b6e
PB
5830/* Parse the operands of a table branch instruction. Similar to a memory
5831 operand. */
5832static int
5833parse_tb (char **str)
5834{
5835 char * p = *str;
5836 int reg;
5837
5838 if (skip_past_char (&p, '[') == FAIL)
ab1eb5fe
PB
5839 {
5840 inst.error = _("'[' expected");
5841 return FAIL;
5842 }
92e90b6e 5843
dcbf9037 5844 if ((reg = arm_reg_parse (&p, REG_TYPE_RN)) == FAIL)
92e90b6e
PB
5845 {
5846 inst.error = _(reg_expected_msgs[REG_TYPE_RN]);
5847 return FAIL;
5848 }
5849 inst.operands[0].reg = reg;
5850
5851 if (skip_past_comma (&p) == FAIL)
ab1eb5fe
PB
5852 {
5853 inst.error = _("',' expected");
5854 return FAIL;
5855 }
5f4273c7 5856
dcbf9037 5857 if ((reg = arm_reg_parse (&p, REG_TYPE_RN)) == FAIL)
92e90b6e
PB
5858 {
5859 inst.error = _(reg_expected_msgs[REG_TYPE_RN]);
5860 return FAIL;
5861 }
5862 inst.operands[0].imm = reg;
5863
5864 if (skip_past_comma (&p) == SUCCESS)
5865 {
5866 if (parse_shift (&p, 0, SHIFT_LSL_IMMEDIATE) == FAIL)
5867 return FAIL;
5868 if (inst.reloc.exp.X_add_number != 1)
5869 {
5870 inst.error = _("invalid shift");
5871 return FAIL;
5872 }
5873 inst.operands[0].shifted = 1;
5874 }
5875
5876 if (skip_past_char (&p, ']') == FAIL)
5877 {
5878 inst.error = _("']' expected");
5879 return FAIL;
5880 }
5881 *str = p;
5882 return SUCCESS;
5883}
5884
5287ad62
JB
5885/* Parse the operands of a Neon VMOV instruction. See do_neon_mov for more
5886 information on the types the operands can take and how they are encoded.
037e8744
JB
5887 Up to four operands may be read; this function handles setting the
5888 ".present" field for each read operand itself.
5287ad62
JB
5889 Updates STR and WHICH_OPERAND if parsing is successful and returns SUCCESS,
5890 else returns FAIL. */
5891
5892static int
5893parse_neon_mov (char **str, int *which_operand)
5894{
5895 int i = *which_operand, val;
5896 enum arm_reg_type rtype;
5897 char *ptr = *str;
dcbf9037 5898 struct neon_type_el optype;
5f4273c7 5899
dcbf9037 5900 if ((val = parse_scalar (&ptr, 8, &optype)) != FAIL)
5287ad62
JB
5901 {
5902 /* Case 4: VMOV<c><q>.<size> <Dn[x]>, <Rd>. */
5903 inst.operands[i].reg = val;
5904 inst.operands[i].isscalar = 1;
dcbf9037 5905 inst.operands[i].vectype = optype;
5287ad62
JB
5906 inst.operands[i++].present = 1;
5907
5908 if (skip_past_comma (&ptr) == FAIL)
477330fc 5909 goto wanted_comma;
5f4273c7 5910
dcbf9037 5911 if ((val = arm_reg_parse (&ptr, REG_TYPE_RN)) == FAIL)
477330fc 5912 goto wanted_arm;
5f4273c7 5913
5287ad62
JB
5914 inst.operands[i].reg = val;
5915 inst.operands[i].isreg = 1;
5916 inst.operands[i].present = 1;
5917 }
037e8744 5918 else if ((val = arm_typed_reg_parse (&ptr, REG_TYPE_NSDQ, &rtype, &optype))
477330fc 5919 != FAIL)
5287ad62
JB
5920 {
5921 /* Cases 0, 1, 2, 3, 5 (D only). */
5922 if (skip_past_comma (&ptr) == FAIL)
477330fc 5923 goto wanted_comma;
5f4273c7 5924
5287ad62
JB
5925 inst.operands[i].reg = val;
5926 inst.operands[i].isreg = 1;
5927 inst.operands[i].isquad = (rtype == REG_TYPE_NQ);
037e8744
JB
5928 inst.operands[i].issingle = (rtype == REG_TYPE_VFS);
5929 inst.operands[i].isvec = 1;
dcbf9037 5930 inst.operands[i].vectype = optype;
5287ad62
JB
5931 inst.operands[i++].present = 1;
5932
dcbf9037 5933 if ((val = arm_reg_parse (&ptr, REG_TYPE_RN)) != FAIL)
477330fc
RM
5934 {
5935 /* Case 5: VMOV<c><q> <Dm>, <Rd>, <Rn>.
5936 Case 13: VMOV <Sd>, <Rm> */
5937 inst.operands[i].reg = val;
5938 inst.operands[i].isreg = 1;
5939 inst.operands[i].present = 1;
5940
5941 if (rtype == REG_TYPE_NQ)
5942 {
5943 first_error (_("can't use Neon quad register here"));
5944 return FAIL;
5945 }
5946 else if (rtype != REG_TYPE_VFS)
5947 {
5948 i++;
5949 if (skip_past_comma (&ptr) == FAIL)
5950 goto wanted_comma;
5951 if ((val = arm_reg_parse (&ptr, REG_TYPE_RN)) == FAIL)
5952 goto wanted_arm;
5953 inst.operands[i].reg = val;
5954 inst.operands[i].isreg = 1;
5955 inst.operands[i].present = 1;
5956 }
5957 }
037e8744 5958 else if ((val = arm_typed_reg_parse (&ptr, REG_TYPE_NSDQ, &rtype,
477330fc
RM
5959 &optype)) != FAIL)
5960 {
5961 /* Case 0: VMOV<c><q> <Qd>, <Qm>
5962 Case 1: VMOV<c><q> <Dd>, <Dm>
5963 Case 8: VMOV.F32 <Sd>, <Sm>
5964 Case 15: VMOV <Sd>, <Se>, <Rn>, <Rm> */
5965
5966 inst.operands[i].reg = val;
5967 inst.operands[i].isreg = 1;
5968 inst.operands[i].isquad = (rtype == REG_TYPE_NQ);
5969 inst.operands[i].issingle = (rtype == REG_TYPE_VFS);
5970 inst.operands[i].isvec = 1;
5971 inst.operands[i].vectype = optype;
5972 inst.operands[i].present = 1;
5973
5974 if (skip_past_comma (&ptr) == SUCCESS)
5975 {
5976 /* Case 15. */
5977 i++;
5978
5979 if ((val = arm_reg_parse (&ptr, REG_TYPE_RN)) == FAIL)
5980 goto wanted_arm;
5981
5982 inst.operands[i].reg = val;
5983 inst.operands[i].isreg = 1;
5984 inst.operands[i++].present = 1;
5985
5986 if (skip_past_comma (&ptr) == FAIL)
5987 goto wanted_comma;
5988
5989 if ((val = arm_reg_parse (&ptr, REG_TYPE_RN)) == FAIL)
5990 goto wanted_arm;
5991
5992 inst.operands[i].reg = val;
5993 inst.operands[i].isreg = 1;
5994 inst.operands[i].present = 1;
5995 }
5996 }
4641781c 5997 else if (parse_qfloat_immediate (&ptr, &inst.operands[i].imm) == SUCCESS)
477330fc
RM
5998 /* Case 2: VMOV<c><q>.<dt> <Qd>, #<float-imm>
5999 Case 3: VMOV<c><q>.<dt> <Dd>, #<float-imm>
6000 Case 10: VMOV.F32 <Sd>, #<imm>
6001 Case 11: VMOV.F64 <Dd>, #<imm> */
6002 inst.operands[i].immisfloat = 1;
4641781c 6003 else if (parse_big_immediate (&ptr, i) == SUCCESS)
477330fc
RM
6004 /* Case 2: VMOV<c><q>.<dt> <Qd>, #<imm>
6005 Case 3: VMOV<c><q>.<dt> <Dd>, #<imm> */
6006 ;
5287ad62 6007 else
477330fc
RM
6008 {
6009 first_error (_("expected <Rm> or <Dm> or <Qm> operand"));
6010 return FAIL;
6011 }
5287ad62 6012 }
dcbf9037 6013 else if ((val = arm_reg_parse (&ptr, REG_TYPE_RN)) != FAIL)
5287ad62
JB
6014 {
6015 /* Cases 6, 7. */
6016 inst.operands[i].reg = val;
6017 inst.operands[i].isreg = 1;
6018 inst.operands[i++].present = 1;
5f4273c7 6019
5287ad62 6020 if (skip_past_comma (&ptr) == FAIL)
477330fc 6021 goto wanted_comma;
5f4273c7 6022
dcbf9037 6023 if ((val = parse_scalar (&ptr, 8, &optype)) != FAIL)
477330fc
RM
6024 {
6025 /* Case 6: VMOV<c><q>.<dt> <Rd>, <Dn[x]> */
6026 inst.operands[i].reg = val;
6027 inst.operands[i].isscalar = 1;
6028 inst.operands[i].present = 1;
6029 inst.operands[i].vectype = optype;
6030 }
dcbf9037 6031 else if ((val = arm_reg_parse (&ptr, REG_TYPE_RN)) != FAIL)
477330fc
RM
6032 {
6033 /* Case 7: VMOV<c><q> <Rd>, <Rn>, <Dm> */
6034 inst.operands[i].reg = val;
6035 inst.operands[i].isreg = 1;
6036 inst.operands[i++].present = 1;
6037
6038 if (skip_past_comma (&ptr) == FAIL)
6039 goto wanted_comma;
6040
6041 if ((val = arm_typed_reg_parse (&ptr, REG_TYPE_VFSD, &rtype, &optype))
6042 == FAIL)
6043 {
6044 first_error (_(reg_expected_msgs[REG_TYPE_VFSD]));
6045 return FAIL;
6046 }
6047
6048 inst.operands[i].reg = val;
6049 inst.operands[i].isreg = 1;
6050 inst.operands[i].isvec = 1;
6051 inst.operands[i].issingle = (rtype == REG_TYPE_VFS);
6052 inst.operands[i].vectype = optype;
6053 inst.operands[i].present = 1;
6054
6055 if (rtype == REG_TYPE_VFS)
6056 {
6057 /* Case 14. */
6058 i++;
6059 if (skip_past_comma (&ptr) == FAIL)
6060 goto wanted_comma;
6061 if ((val = arm_typed_reg_parse (&ptr, REG_TYPE_VFS, NULL,
6062 &optype)) == FAIL)
6063 {
6064 first_error (_(reg_expected_msgs[REG_TYPE_VFS]));
6065 return FAIL;
6066 }
6067 inst.operands[i].reg = val;
6068 inst.operands[i].isreg = 1;
6069 inst.operands[i].isvec = 1;
6070 inst.operands[i].issingle = 1;
6071 inst.operands[i].vectype = optype;
6072 inst.operands[i].present = 1;
6073 }
6074 }
037e8744 6075 else if ((val = arm_typed_reg_parse (&ptr, REG_TYPE_VFS, NULL, &optype))
477330fc
RM
6076 != FAIL)
6077 {
6078 /* Case 13. */
6079 inst.operands[i].reg = val;
6080 inst.operands[i].isreg = 1;
6081 inst.operands[i].isvec = 1;
6082 inst.operands[i].issingle = 1;
6083 inst.operands[i].vectype = optype;
6084 inst.operands[i].present = 1;
6085 }
5287ad62
JB
6086 }
6087 else
6088 {
dcbf9037 6089 first_error (_("parse error"));
5287ad62
JB
6090 return FAIL;
6091 }
6092
6093 /* Successfully parsed the operands. Update args. */
6094 *which_operand = i;
6095 *str = ptr;
6096 return SUCCESS;
6097
5f4273c7 6098 wanted_comma:
dcbf9037 6099 first_error (_("expected comma"));
5287ad62 6100 return FAIL;
5f4273c7
NC
6101
6102 wanted_arm:
dcbf9037 6103 first_error (_(reg_expected_msgs[REG_TYPE_RN]));
5287ad62 6104 return FAIL;
5287ad62
JB
6105}
6106
5be8be5d
DG
6107/* Use this macro when the operand constraints are different
6108 for ARM and THUMB (e.g. ldrd). */
6109#define MIX_ARM_THUMB_OPERANDS(arm_operand, thumb_operand) \
6110 ((arm_operand) | ((thumb_operand) << 16))
6111
c19d1205
ZW
6112/* Matcher codes for parse_operands. */
6113enum operand_parse_code
6114{
6115 OP_stop, /* end of line */
6116
6117 OP_RR, /* ARM register */
6118 OP_RRnpc, /* ARM register, not r15 */
5be8be5d 6119 OP_RRnpcsp, /* ARM register, neither r15 nor r13 (a.k.a. 'BadReg') */
c19d1205 6120 OP_RRnpcb, /* ARM register, not r15, in square brackets */
fa94de6b 6121 OP_RRnpctw, /* ARM register, not r15 in Thumb-state or with writeback,
55881a11 6122 optional trailing ! */
c19d1205
ZW
6123 OP_RRw, /* ARM register, not r15, optional trailing ! */
6124 OP_RCP, /* Coprocessor number */
6125 OP_RCN, /* Coprocessor register */
6126 OP_RF, /* FPA register */
6127 OP_RVS, /* VFP single precision register */
5287ad62
JB
6128 OP_RVD, /* VFP double precision register (0..15) */
6129 OP_RND, /* Neon double precision register (0..31) */
6130 OP_RNQ, /* Neon quad precision register */
037e8744 6131 OP_RVSD, /* VFP single or double precision register */
5287ad62 6132 OP_RNDQ, /* Neon double or quad precision register */
037e8744 6133 OP_RNSDQ, /* Neon single, double or quad precision register */
5287ad62 6134 OP_RNSC, /* Neon scalar D[X] */
c19d1205
ZW
6135 OP_RVC, /* VFP control register */
6136 OP_RMF, /* Maverick F register */
6137 OP_RMD, /* Maverick D register */
6138 OP_RMFX, /* Maverick FX register */
6139 OP_RMDX, /* Maverick DX register */
6140 OP_RMAX, /* Maverick AX register */
6141 OP_RMDS, /* Maverick DSPSC register */
6142 OP_RIWR, /* iWMMXt wR register */
6143 OP_RIWC, /* iWMMXt wC register */
6144 OP_RIWG, /* iWMMXt wCG register */
6145 OP_RXA, /* XScale accumulator register */
6146
6147 OP_REGLST, /* ARM register list */
6148 OP_VRSLST, /* VFP single-precision register list */
6149 OP_VRDLST, /* VFP double-precision register list */
037e8744 6150 OP_VRSDLST, /* VFP single or double-precision register list (& quad) */
5287ad62
JB
6151 OP_NRDLST, /* Neon double-precision register list (d0-d31, qN aliases) */
6152 OP_NSTRLST, /* Neon element/structure list */
6153
5287ad62 6154 OP_RNDQ_I0, /* Neon D or Q reg, or immediate zero. */
037e8744 6155 OP_RVSD_I0, /* VFP S or D reg, or immediate zero. */
5287ad62 6156 OP_RR_RNSC, /* ARM reg or Neon scalar. */
037e8744 6157 OP_RNSDQ_RNSC, /* Vector S, D or Q reg, or Neon scalar. */
5287ad62
JB
6158 OP_RNDQ_RNSC, /* Neon D or Q reg, or Neon scalar. */
6159 OP_RND_RNSC, /* Neon D reg, or Neon scalar. */
6160 OP_VMOV, /* Neon VMOV operands. */
4316f0d2 6161 OP_RNDQ_Ibig, /* Neon D or Q reg, or big immediate for logic and VMVN. */
5287ad62 6162 OP_RNDQ_I63b, /* Neon D or Q reg, or immediate for shift. */
2d447fca 6163 OP_RIWR_I32z, /* iWMMXt wR register, or immediate 0 .. 32 for iWMMXt2. */
5287ad62
JB
6164
6165 OP_I0, /* immediate zero */
c19d1205
ZW
6166 OP_I7, /* immediate value 0 .. 7 */
6167 OP_I15, /* 0 .. 15 */
6168 OP_I16, /* 1 .. 16 */
5287ad62 6169 OP_I16z, /* 0 .. 16 */
c19d1205
ZW
6170 OP_I31, /* 0 .. 31 */
6171 OP_I31w, /* 0 .. 31, optional trailing ! */
6172 OP_I32, /* 1 .. 32 */
5287ad62
JB
6173 OP_I32z, /* 0 .. 32 */
6174 OP_I63, /* 0 .. 63 */
c19d1205 6175 OP_I63s, /* -64 .. 63 */
5287ad62
JB
6176 OP_I64, /* 1 .. 64 */
6177 OP_I64z, /* 0 .. 64 */
c19d1205 6178 OP_I255, /* 0 .. 255 */
c19d1205
ZW
6179
6180 OP_I4b, /* immediate, prefix optional, 1 .. 4 */
6181 OP_I7b, /* 0 .. 7 */
6182 OP_I15b, /* 0 .. 15 */
6183 OP_I31b, /* 0 .. 31 */
6184
6185 OP_SH, /* shifter operand */
4962c51a 6186 OP_SHG, /* shifter operand with possible group relocation */
c19d1205 6187 OP_ADDR, /* Memory address expression (any mode) */
4962c51a
MS
6188 OP_ADDRGLDR, /* Mem addr expr (any mode) with possible LDR group reloc */
6189 OP_ADDRGLDRS, /* Mem addr expr (any mode) with possible LDRS group reloc */
6190 OP_ADDRGLDC, /* Mem addr expr (any mode) with possible LDC group reloc */
c19d1205
ZW
6191 OP_EXP, /* arbitrary expression */
6192 OP_EXPi, /* same, with optional immediate prefix */
6193 OP_EXPr, /* same, with optional relocation suffix */
b6895b4f 6194 OP_HALF, /* 0 .. 65535 or low/high reloc. */
c19d1205
ZW
6195
6196 OP_CPSF, /* CPS flags */
6197 OP_ENDI, /* Endianness specifier */
d2cd1205
JB
6198 OP_wPSR, /* CPSR/SPSR/APSR mask for msr (writing). */
6199 OP_rPSR, /* CPSR/SPSR/APSR mask for msr (reading). */
c19d1205 6200 OP_COND, /* conditional code */
92e90b6e 6201 OP_TB, /* Table branch. */
c19d1205 6202
037e8744
JB
6203 OP_APSR_RR, /* ARM register or "APSR_nzcv". */
6204
c19d1205
ZW
6205 OP_RRnpc_I0, /* ARM register or literal 0 */
6206 OP_RR_EXr, /* ARM register or expression with opt. reloc suff. */
6207 OP_RR_EXi, /* ARM register or expression with imm prefix */
6208 OP_RF_IF, /* FPA register or immediate */
6209 OP_RIWR_RIWC, /* iWMMXt R or C reg */
41adaa5c 6210 OP_RIWC_RIWG, /* iWMMXt wC or wCG reg */
c19d1205
ZW
6211
6212 /* Optional operands. */
6213 OP_oI7b, /* immediate, prefix optional, 0 .. 7 */
6214 OP_oI31b, /* 0 .. 31 */
5287ad62 6215 OP_oI32b, /* 1 .. 32 */
5f1af56b 6216 OP_oI32z, /* 0 .. 32 */
c19d1205
ZW
6217 OP_oIffffb, /* 0 .. 65535 */
6218 OP_oI255c, /* curly-brace enclosed, 0 .. 255 */
6219
6220 OP_oRR, /* ARM register */
6221 OP_oRRnpc, /* ARM register, not the PC */
5be8be5d 6222 OP_oRRnpcsp, /* ARM register, neither the PC nor the SP (a.k.a. BadReg) */
b6702015 6223 OP_oRRw, /* ARM register, not r15, optional trailing ! */
5287ad62
JB
6224 OP_oRND, /* Optional Neon double precision register */
6225 OP_oRNQ, /* Optional Neon quad precision register */
6226 OP_oRNDQ, /* Optional Neon double or quad precision register */
037e8744 6227 OP_oRNSDQ, /* Optional single, double or quad precision vector register */
c19d1205
ZW
6228 OP_oSHll, /* LSL immediate */
6229 OP_oSHar, /* ASR immediate */
6230 OP_oSHllar, /* LSL or ASR immediate */
6231 OP_oROR, /* ROR 0/8/16/24 */
52e7f43d 6232 OP_oBARRIER_I15, /* Option argument for a barrier instruction. */
c19d1205 6233
5be8be5d
DG
6234 /* Some pre-defined mixed (ARM/THUMB) operands. */
6235 OP_RR_npcsp = MIX_ARM_THUMB_OPERANDS (OP_RR, OP_RRnpcsp),
6236 OP_RRnpc_npcsp = MIX_ARM_THUMB_OPERANDS (OP_RRnpc, OP_RRnpcsp),
6237 OP_oRRnpc_npcsp = MIX_ARM_THUMB_OPERANDS (OP_oRRnpc, OP_oRRnpcsp),
6238
c19d1205
ZW
6239 OP_FIRST_OPTIONAL = OP_oI7b
6240};
a737bd4d 6241
c19d1205
ZW
6242/* Generic instruction operand parser. This does no encoding and no
6243 semantic validation; it merely squirrels values away in the inst
6244 structure. Returns SUCCESS or FAIL depending on whether the
6245 specified grammar matched. */
6246static int
5be8be5d 6247parse_operands (char *str, const unsigned int *pattern, bfd_boolean thumb)
c19d1205 6248{
5be8be5d 6249 unsigned const int *upat = pattern;
c19d1205
ZW
6250 char *backtrack_pos = 0;
6251 const char *backtrack_error = 0;
99aad254 6252 int i, val = 0, backtrack_index = 0;
5287ad62 6253 enum arm_reg_type rtype;
4962c51a 6254 parse_operand_result result;
5be8be5d 6255 unsigned int op_parse_code;
c19d1205 6256
e07e6e58
NC
6257#define po_char_or_fail(chr) \
6258 do \
6259 { \
6260 if (skip_past_char (&str, chr) == FAIL) \
477330fc 6261 goto bad_args; \
e07e6e58
NC
6262 } \
6263 while (0)
c19d1205 6264
e07e6e58
NC
6265#define po_reg_or_fail(regtype) \
6266 do \
dcbf9037 6267 { \
e07e6e58 6268 val = arm_typed_reg_parse (& str, regtype, & rtype, \
477330fc 6269 & inst.operands[i].vectype); \
e07e6e58 6270 if (val == FAIL) \
477330fc
RM
6271 { \
6272 first_error (_(reg_expected_msgs[regtype])); \
6273 goto failure; \
6274 } \
e07e6e58
NC
6275 inst.operands[i].reg = val; \
6276 inst.operands[i].isreg = 1; \
6277 inst.operands[i].isquad = (rtype == REG_TYPE_NQ); \
6278 inst.operands[i].issingle = (rtype == REG_TYPE_VFS); \
6279 inst.operands[i].isvec = (rtype == REG_TYPE_VFS \
477330fc
RM
6280 || rtype == REG_TYPE_VFD \
6281 || rtype == REG_TYPE_NQ); \
dcbf9037 6282 } \
e07e6e58
NC
6283 while (0)
6284
6285#define po_reg_or_goto(regtype, label) \
6286 do \
6287 { \
6288 val = arm_typed_reg_parse (& str, regtype, & rtype, \
6289 & inst.operands[i].vectype); \
6290 if (val == FAIL) \
6291 goto label; \
dcbf9037 6292 \
e07e6e58
NC
6293 inst.operands[i].reg = val; \
6294 inst.operands[i].isreg = 1; \
6295 inst.operands[i].isquad = (rtype == REG_TYPE_NQ); \
6296 inst.operands[i].issingle = (rtype == REG_TYPE_VFS); \
6297 inst.operands[i].isvec = (rtype == REG_TYPE_VFS \
477330fc 6298 || rtype == REG_TYPE_VFD \
e07e6e58
NC
6299 || rtype == REG_TYPE_NQ); \
6300 } \
6301 while (0)
6302
6303#define po_imm_or_fail(min, max, popt) \
6304 do \
6305 { \
6306 if (parse_immediate (&str, &val, min, max, popt) == FAIL) \
6307 goto failure; \
6308 inst.operands[i].imm = val; \
6309 } \
6310 while (0)
6311
6312#define po_scalar_or_goto(elsz, label) \
6313 do \
6314 { \
6315 val = parse_scalar (& str, elsz, & inst.operands[i].vectype); \
6316 if (val == FAIL) \
6317 goto label; \
6318 inst.operands[i].reg = val; \
6319 inst.operands[i].isscalar = 1; \
6320 } \
6321 while (0)
6322
6323#define po_misc_or_fail(expr) \
6324 do \
6325 { \
6326 if (expr) \
6327 goto failure; \
6328 } \
6329 while (0)
6330
6331#define po_misc_or_fail_no_backtrack(expr) \
6332 do \
6333 { \
6334 result = expr; \
6335 if (result == PARSE_OPERAND_FAIL_NO_BACKTRACK) \
6336 backtrack_pos = 0; \
6337 if (result != PARSE_OPERAND_SUCCESS) \
6338 goto failure; \
6339 } \
6340 while (0)
4962c51a 6341
52e7f43d
RE
6342#define po_barrier_or_imm(str) \
6343 do \
6344 { \
6345 val = parse_barrier (&str); \
ccb84d65
JB
6346 if (val == FAIL && ! ISALPHA (*str)) \
6347 goto immediate; \
6348 if (val == FAIL \
6349 /* ISB can only take SY as an option. */ \
6350 || ((inst.instruction & 0xf0) == 0x60 \
6351 && val != 0xf)) \
52e7f43d 6352 { \
ccb84d65
JB
6353 inst.error = _("invalid barrier type"); \
6354 backtrack_pos = 0; \
6355 goto failure; \
52e7f43d
RE
6356 } \
6357 } \
6358 while (0)
6359
c19d1205
ZW
6360 skip_whitespace (str);
6361
6362 for (i = 0; upat[i] != OP_stop; i++)
6363 {
5be8be5d
DG
6364 op_parse_code = upat[i];
6365 if (op_parse_code >= 1<<16)
6366 op_parse_code = thumb ? (op_parse_code >> 16)
6367 : (op_parse_code & ((1<<16)-1));
6368
6369 if (op_parse_code >= OP_FIRST_OPTIONAL)
c19d1205
ZW
6370 {
6371 /* Remember where we are in case we need to backtrack. */
9c2799c2 6372 gas_assert (!backtrack_pos);
c19d1205
ZW
6373 backtrack_pos = str;
6374 backtrack_error = inst.error;
6375 backtrack_index = i;
6376 }
6377
b6702015 6378 if (i > 0 && (i > 1 || inst.operands[0].present))
c19d1205
ZW
6379 po_char_or_fail (',');
6380
5be8be5d 6381 switch (op_parse_code)
c19d1205
ZW
6382 {
6383 /* Registers */
6384 case OP_oRRnpc:
5be8be5d 6385 case OP_oRRnpcsp:
c19d1205 6386 case OP_RRnpc:
5be8be5d 6387 case OP_RRnpcsp:
c19d1205
ZW
6388 case OP_oRR:
6389 case OP_RR: po_reg_or_fail (REG_TYPE_RN); break;
6390 case OP_RCP: po_reg_or_fail (REG_TYPE_CP); break;
6391 case OP_RCN: po_reg_or_fail (REG_TYPE_CN); break;
6392 case OP_RF: po_reg_or_fail (REG_TYPE_FN); break;
6393 case OP_RVS: po_reg_or_fail (REG_TYPE_VFS); break;
6394 case OP_RVD: po_reg_or_fail (REG_TYPE_VFD); break;
477330fc 6395 case OP_oRND:
5287ad62 6396 case OP_RND: po_reg_or_fail (REG_TYPE_VFD); break;
cd2cf30b
PB
6397 case OP_RVC:
6398 po_reg_or_goto (REG_TYPE_VFC, coproc_reg);
6399 break;
6400 /* Also accept generic coprocessor regs for unknown registers. */
6401 coproc_reg:
6402 po_reg_or_fail (REG_TYPE_CN);
6403 break;
c19d1205
ZW
6404 case OP_RMF: po_reg_or_fail (REG_TYPE_MVF); break;
6405 case OP_RMD: po_reg_or_fail (REG_TYPE_MVD); break;
6406 case OP_RMFX: po_reg_or_fail (REG_TYPE_MVFX); break;
6407 case OP_RMDX: po_reg_or_fail (REG_TYPE_MVDX); break;
6408 case OP_RMAX: po_reg_or_fail (REG_TYPE_MVAX); break;
6409 case OP_RMDS: po_reg_or_fail (REG_TYPE_DSPSC); break;
6410 case OP_RIWR: po_reg_or_fail (REG_TYPE_MMXWR); break;
6411 case OP_RIWC: po_reg_or_fail (REG_TYPE_MMXWC); break;
6412 case OP_RIWG: po_reg_or_fail (REG_TYPE_MMXWCG); break;
6413 case OP_RXA: po_reg_or_fail (REG_TYPE_XSCALE); break;
477330fc 6414 case OP_oRNQ:
5287ad62 6415 case OP_RNQ: po_reg_or_fail (REG_TYPE_NQ); break;
477330fc 6416 case OP_oRNDQ:
5287ad62 6417 case OP_RNDQ: po_reg_or_fail (REG_TYPE_NDQ); break;
477330fc
RM
6418 case OP_RVSD: po_reg_or_fail (REG_TYPE_VFSD); break;
6419 case OP_oRNSDQ:
6420 case OP_RNSDQ: po_reg_or_fail (REG_TYPE_NSDQ); break;
6421
6422 /* Neon scalar. Using an element size of 8 means that some invalid
6423 scalars are accepted here, so deal with those in later code. */
6424 case OP_RNSC: po_scalar_or_goto (8, failure); break;
6425
6426 case OP_RNDQ_I0:
6427 {
6428 po_reg_or_goto (REG_TYPE_NDQ, try_imm0);
6429 break;
6430 try_imm0:
6431 po_imm_or_fail (0, 0, TRUE);
6432 }
6433 break;
6434
6435 case OP_RVSD_I0:
6436 po_reg_or_goto (REG_TYPE_VFSD, try_imm0);
6437 break;
6438
6439 case OP_RR_RNSC:
6440 {
6441 po_scalar_or_goto (8, try_rr);
6442 break;
6443 try_rr:
6444 po_reg_or_fail (REG_TYPE_RN);
6445 }
6446 break;
6447
6448 case OP_RNSDQ_RNSC:
6449 {
6450 po_scalar_or_goto (8, try_nsdq);
6451 break;
6452 try_nsdq:
6453 po_reg_or_fail (REG_TYPE_NSDQ);
6454 }
6455 break;
6456
6457 case OP_RNDQ_RNSC:
6458 {
6459 po_scalar_or_goto (8, try_ndq);
6460 break;
6461 try_ndq:
6462 po_reg_or_fail (REG_TYPE_NDQ);
6463 }
6464 break;
6465
6466 case OP_RND_RNSC:
6467 {
6468 po_scalar_or_goto (8, try_vfd);
6469 break;
6470 try_vfd:
6471 po_reg_or_fail (REG_TYPE_VFD);
6472 }
6473 break;
6474
6475 case OP_VMOV:
6476 /* WARNING: parse_neon_mov can move the operand counter, i. If we're
6477 not careful then bad things might happen. */
6478 po_misc_or_fail (parse_neon_mov (&str, &i) == FAIL);
6479 break;
6480
6481 case OP_RNDQ_Ibig:
6482 {
6483 po_reg_or_goto (REG_TYPE_NDQ, try_immbig);
6484 break;
6485 try_immbig:
6486 /* There's a possibility of getting a 64-bit immediate here, so
6487 we need special handling. */
6488 if (parse_big_immediate (&str, i) == FAIL)
6489 {
6490 inst.error = _("immediate value is out of range");
6491 goto failure;
6492 }
6493 }
6494 break;
6495
6496 case OP_RNDQ_I63b:
6497 {
6498 po_reg_or_goto (REG_TYPE_NDQ, try_shimm);
6499 break;
6500 try_shimm:
6501 po_imm_or_fail (0, 63, TRUE);
6502 }
6503 break;
c19d1205
ZW
6504
6505 case OP_RRnpcb:
6506 po_char_or_fail ('[');
6507 po_reg_or_fail (REG_TYPE_RN);
6508 po_char_or_fail (']');
6509 break;
a737bd4d 6510
55881a11 6511 case OP_RRnpctw:
c19d1205 6512 case OP_RRw:
b6702015 6513 case OP_oRRw:
c19d1205
ZW
6514 po_reg_or_fail (REG_TYPE_RN);
6515 if (skip_past_char (&str, '!') == SUCCESS)
6516 inst.operands[i].writeback = 1;
6517 break;
6518
6519 /* Immediates */
6520 case OP_I7: po_imm_or_fail ( 0, 7, FALSE); break;
6521 case OP_I15: po_imm_or_fail ( 0, 15, FALSE); break;
6522 case OP_I16: po_imm_or_fail ( 1, 16, FALSE); break;
477330fc 6523 case OP_I16z: po_imm_or_fail ( 0, 16, FALSE); break;
c19d1205
ZW
6524 case OP_I31: po_imm_or_fail ( 0, 31, FALSE); break;
6525 case OP_I32: po_imm_or_fail ( 1, 32, FALSE); break;
477330fc 6526 case OP_I32z: po_imm_or_fail ( 0, 32, FALSE); break;
c19d1205 6527 case OP_I63s: po_imm_or_fail (-64, 63, FALSE); break;
477330fc
RM
6528 case OP_I63: po_imm_or_fail ( 0, 63, FALSE); break;
6529 case OP_I64: po_imm_or_fail ( 1, 64, FALSE); break;
6530 case OP_I64z: po_imm_or_fail ( 0, 64, FALSE); break;
c19d1205 6531 case OP_I255: po_imm_or_fail ( 0, 255, FALSE); break;
c19d1205
ZW
6532
6533 case OP_I4b: po_imm_or_fail ( 1, 4, TRUE); break;
6534 case OP_oI7b:
6535 case OP_I7b: po_imm_or_fail ( 0, 7, TRUE); break;
6536 case OP_I15b: po_imm_or_fail ( 0, 15, TRUE); break;
6537 case OP_oI31b:
6538 case OP_I31b: po_imm_or_fail ( 0, 31, TRUE); break;
477330fc
RM
6539 case OP_oI32b: po_imm_or_fail ( 1, 32, TRUE); break;
6540 case OP_oI32z: po_imm_or_fail ( 0, 32, TRUE); break;
c19d1205
ZW
6541 case OP_oIffffb: po_imm_or_fail ( 0, 0xffff, TRUE); break;
6542
6543 /* Immediate variants */
6544 case OP_oI255c:
6545 po_char_or_fail ('{');
6546 po_imm_or_fail (0, 255, TRUE);
6547 po_char_or_fail ('}');
6548 break;
6549
6550 case OP_I31w:
6551 /* The expression parser chokes on a trailing !, so we have
6552 to find it first and zap it. */
6553 {
6554 char *s = str;
6555 while (*s && *s != ',')
6556 s++;
6557 if (s[-1] == '!')
6558 {
6559 s[-1] = '\0';
6560 inst.operands[i].writeback = 1;
6561 }
6562 po_imm_or_fail (0, 31, TRUE);
6563 if (str == s - 1)
6564 str = s;
6565 }
6566 break;
6567
6568 /* Expressions */
6569 case OP_EXPi: EXPi:
6570 po_misc_or_fail (my_get_expression (&inst.reloc.exp, &str,
6571 GE_OPT_PREFIX));
6572 break;
6573
6574 case OP_EXP:
6575 po_misc_or_fail (my_get_expression (&inst.reloc.exp, &str,
6576 GE_NO_PREFIX));
6577 break;
6578
6579 case OP_EXPr: EXPr:
6580 po_misc_or_fail (my_get_expression (&inst.reloc.exp, &str,
6581 GE_NO_PREFIX));
6582 if (inst.reloc.exp.X_op == O_symbol)
a737bd4d 6583 {
c19d1205
ZW
6584 val = parse_reloc (&str);
6585 if (val == -1)
6586 {
6587 inst.error = _("unrecognized relocation suffix");
6588 goto failure;
6589 }
6590 else if (val != BFD_RELOC_UNUSED)
6591 {
6592 inst.operands[i].imm = val;
6593 inst.operands[i].hasreloc = 1;
6594 }
a737bd4d 6595 }
c19d1205 6596 break;
a737bd4d 6597
b6895b4f
PB
6598 /* Operand for MOVW or MOVT. */
6599 case OP_HALF:
6600 po_misc_or_fail (parse_half (&str));
6601 break;
6602
e07e6e58 6603 /* Register or expression. */
c19d1205
ZW
6604 case OP_RR_EXr: po_reg_or_goto (REG_TYPE_RN, EXPr); break;
6605 case OP_RR_EXi: po_reg_or_goto (REG_TYPE_RN, EXPi); break;
a737bd4d 6606
e07e6e58 6607 /* Register or immediate. */
c19d1205
ZW
6608 case OP_RRnpc_I0: po_reg_or_goto (REG_TYPE_RN, I0); break;
6609 I0: po_imm_or_fail (0, 0, FALSE); break;
a737bd4d 6610
c19d1205
ZW
6611 case OP_RF_IF: po_reg_or_goto (REG_TYPE_FN, IF); break;
6612 IF:
6613 if (!is_immediate_prefix (*str))
6614 goto bad_args;
6615 str++;
6616 val = parse_fpa_immediate (&str);
6617 if (val == FAIL)
6618 goto failure;
6619 /* FPA immediates are encoded as registers 8-15.
6620 parse_fpa_immediate has already applied the offset. */
6621 inst.operands[i].reg = val;
6622 inst.operands[i].isreg = 1;
6623 break;
09d92015 6624
2d447fca
JM
6625 case OP_RIWR_I32z: po_reg_or_goto (REG_TYPE_MMXWR, I32z); break;
6626 I32z: po_imm_or_fail (0, 32, FALSE); break;
6627
e07e6e58 6628 /* Two kinds of register. */
c19d1205
ZW
6629 case OP_RIWR_RIWC:
6630 {
6631 struct reg_entry *rege = arm_reg_parse_multi (&str);
97f87066
JM
6632 if (!rege
6633 || (rege->type != REG_TYPE_MMXWR
6634 && rege->type != REG_TYPE_MMXWC
6635 && rege->type != REG_TYPE_MMXWCG))
c19d1205
ZW
6636 {
6637 inst.error = _("iWMMXt data or control register expected");
6638 goto failure;
6639 }
6640 inst.operands[i].reg = rege->number;
6641 inst.operands[i].isreg = (rege->type == REG_TYPE_MMXWR);
6642 }
6643 break;
09d92015 6644
41adaa5c
JM
6645 case OP_RIWC_RIWG:
6646 {
6647 struct reg_entry *rege = arm_reg_parse_multi (&str);
6648 if (!rege
6649 || (rege->type != REG_TYPE_MMXWC
6650 && rege->type != REG_TYPE_MMXWCG))
6651 {
6652 inst.error = _("iWMMXt control register expected");
6653 goto failure;
6654 }
6655 inst.operands[i].reg = rege->number;
6656 inst.operands[i].isreg = 1;
6657 }
6658 break;
6659
c19d1205
ZW
6660 /* Misc */
6661 case OP_CPSF: val = parse_cps_flags (&str); break;
6662 case OP_ENDI: val = parse_endian_specifier (&str); break;
6663 case OP_oROR: val = parse_ror (&str); break;
c19d1205 6664 case OP_COND: val = parse_cond (&str); break;
52e7f43d
RE
6665 case OP_oBARRIER_I15:
6666 po_barrier_or_imm (str); break;
6667 immediate:
6668 if (parse_immediate (&str, &val, 0, 15, TRUE) == FAIL)
477330fc 6669 goto failure;
52e7f43d 6670 break;
c19d1205 6671
fa94de6b 6672 case OP_wPSR:
d2cd1205 6673 case OP_rPSR:
90ec0d68
MGD
6674 po_reg_or_goto (REG_TYPE_RNB, try_psr);
6675 if (!ARM_CPU_HAS_FEATURE (cpu_variant, arm_ext_virt))
6676 {
6677 inst.error = _("Banked registers are not available with this "
6678 "architecture.");
6679 goto failure;
6680 }
6681 break;
d2cd1205
JB
6682 try_psr:
6683 val = parse_psr (&str, op_parse_code == OP_wPSR);
6684 break;
037e8744 6685
477330fc
RM
6686 case OP_APSR_RR:
6687 po_reg_or_goto (REG_TYPE_RN, try_apsr);
6688 break;
6689 try_apsr:
6690 /* Parse "APSR_nvzc" operand (for FMSTAT-equivalent MRS
6691 instruction). */
6692 if (strncasecmp (str, "APSR_", 5) == 0)
6693 {
6694 unsigned found = 0;
6695 str += 5;
6696 while (found < 15)
6697 switch (*str++)
6698 {
6699 case 'c': found = (found & 1) ? 16 : found | 1; break;
6700 case 'n': found = (found & 2) ? 16 : found | 2; break;
6701 case 'z': found = (found & 4) ? 16 : found | 4; break;
6702 case 'v': found = (found & 8) ? 16 : found | 8; break;
6703 default: found = 16;
6704 }
6705 if (found != 15)
6706 goto failure;
6707 inst.operands[i].isvec = 1;
f7c21dc7
NC
6708 /* APSR_nzcv is encoded in instructions as if it were the REG_PC. */
6709 inst.operands[i].reg = REG_PC;
477330fc
RM
6710 }
6711 else
6712 goto failure;
6713 break;
037e8744 6714
92e90b6e
PB
6715 case OP_TB:
6716 po_misc_or_fail (parse_tb (&str));
6717 break;
6718
e07e6e58 6719 /* Register lists. */
c19d1205
ZW
6720 case OP_REGLST:
6721 val = parse_reg_list (&str);
6722 if (*str == '^')
6723 {
6724 inst.operands[1].writeback = 1;
6725 str++;
6726 }
6727 break;
09d92015 6728
c19d1205 6729 case OP_VRSLST:
5287ad62 6730 val = parse_vfp_reg_list (&str, &inst.operands[i].reg, REGLIST_VFP_S);
c19d1205 6731 break;
09d92015 6732
c19d1205 6733 case OP_VRDLST:
5287ad62 6734 val = parse_vfp_reg_list (&str, &inst.operands[i].reg, REGLIST_VFP_D);
c19d1205 6735 break;
a737bd4d 6736
477330fc
RM
6737 case OP_VRSDLST:
6738 /* Allow Q registers too. */
6739 val = parse_vfp_reg_list (&str, &inst.operands[i].reg,
6740 REGLIST_NEON_D);
6741 if (val == FAIL)
6742 {
6743 inst.error = NULL;
6744 val = parse_vfp_reg_list (&str, &inst.operands[i].reg,
6745 REGLIST_VFP_S);
6746 inst.operands[i].issingle = 1;
6747 }
6748 break;
6749
6750 case OP_NRDLST:
6751 val = parse_vfp_reg_list (&str, &inst.operands[i].reg,
6752 REGLIST_NEON_D);
6753 break;
5287ad62
JB
6754
6755 case OP_NSTRLST:
477330fc
RM
6756 val = parse_neon_el_struct_list (&str, &inst.operands[i].reg,
6757 &inst.operands[i].vectype);
6758 break;
5287ad62 6759
c19d1205
ZW
6760 /* Addressing modes */
6761 case OP_ADDR:
6762 po_misc_or_fail (parse_address (&str, i));
6763 break;
09d92015 6764
4962c51a
MS
6765 case OP_ADDRGLDR:
6766 po_misc_or_fail_no_backtrack (
477330fc 6767 parse_address_group_reloc (&str, i, GROUP_LDR));
4962c51a
MS
6768 break;
6769
6770 case OP_ADDRGLDRS:
6771 po_misc_or_fail_no_backtrack (
477330fc 6772 parse_address_group_reloc (&str, i, GROUP_LDRS));
4962c51a
MS
6773 break;
6774
6775 case OP_ADDRGLDC:
6776 po_misc_or_fail_no_backtrack (
477330fc 6777 parse_address_group_reloc (&str, i, GROUP_LDC));
4962c51a
MS
6778 break;
6779
c19d1205
ZW
6780 case OP_SH:
6781 po_misc_or_fail (parse_shifter_operand (&str, i));
6782 break;
09d92015 6783
4962c51a
MS
6784 case OP_SHG:
6785 po_misc_or_fail_no_backtrack (
477330fc 6786 parse_shifter_operand_group_reloc (&str, i));
4962c51a
MS
6787 break;
6788
c19d1205
ZW
6789 case OP_oSHll:
6790 po_misc_or_fail (parse_shift (&str, i, SHIFT_LSL_IMMEDIATE));
6791 break;
09d92015 6792
c19d1205
ZW
6793 case OP_oSHar:
6794 po_misc_or_fail (parse_shift (&str, i, SHIFT_ASR_IMMEDIATE));
6795 break;
09d92015 6796
c19d1205
ZW
6797 case OP_oSHllar:
6798 po_misc_or_fail (parse_shift (&str, i, SHIFT_LSL_OR_ASR_IMMEDIATE));
6799 break;
09d92015 6800
c19d1205 6801 default:
5be8be5d 6802 as_fatal (_("unhandled operand code %d"), op_parse_code);
c19d1205 6803 }
09d92015 6804
c19d1205
ZW
6805 /* Various value-based sanity checks and shared operations. We
6806 do not signal immediate failures for the register constraints;
6807 this allows a syntax error to take precedence. */
5be8be5d 6808 switch (op_parse_code)
c19d1205
ZW
6809 {
6810 case OP_oRRnpc:
6811 case OP_RRnpc:
6812 case OP_RRnpcb:
6813 case OP_RRw:
b6702015 6814 case OP_oRRw:
c19d1205
ZW
6815 case OP_RRnpc_I0:
6816 if (inst.operands[i].isreg && inst.operands[i].reg == REG_PC)
6817 inst.error = BAD_PC;
6818 break;
09d92015 6819
5be8be5d
DG
6820 case OP_oRRnpcsp:
6821 case OP_RRnpcsp:
6822 if (inst.operands[i].isreg)
6823 {
6824 if (inst.operands[i].reg == REG_PC)
6825 inst.error = BAD_PC;
6826 else if (inst.operands[i].reg == REG_SP)
6827 inst.error = BAD_SP;
6828 }
6829 break;
6830
55881a11 6831 case OP_RRnpctw:
fa94de6b
RM
6832 if (inst.operands[i].isreg
6833 && inst.operands[i].reg == REG_PC
55881a11
MGD
6834 && (inst.operands[i].writeback || thumb))
6835 inst.error = BAD_PC;
6836 break;
6837
c19d1205
ZW
6838 case OP_CPSF:
6839 case OP_ENDI:
6840 case OP_oROR:
d2cd1205
JB
6841 case OP_wPSR:
6842 case OP_rPSR:
c19d1205 6843 case OP_COND:
52e7f43d 6844 case OP_oBARRIER_I15:
c19d1205
ZW
6845 case OP_REGLST:
6846 case OP_VRSLST:
6847 case OP_VRDLST:
477330fc
RM
6848 case OP_VRSDLST:
6849 case OP_NRDLST:
6850 case OP_NSTRLST:
c19d1205
ZW
6851 if (val == FAIL)
6852 goto failure;
6853 inst.operands[i].imm = val;
6854 break;
a737bd4d 6855
c19d1205
ZW
6856 default:
6857 break;
6858 }
09d92015 6859
c19d1205
ZW
6860 /* If we get here, this operand was successfully parsed. */
6861 inst.operands[i].present = 1;
6862 continue;
09d92015 6863
c19d1205 6864 bad_args:
09d92015 6865 inst.error = BAD_ARGS;
c19d1205
ZW
6866
6867 failure:
6868 if (!backtrack_pos)
d252fdde
PB
6869 {
6870 /* The parse routine should already have set inst.error, but set a
5f4273c7 6871 default here just in case. */
d252fdde
PB
6872 if (!inst.error)
6873 inst.error = _("syntax error");
6874 return FAIL;
6875 }
c19d1205
ZW
6876
6877 /* Do not backtrack over a trailing optional argument that
6878 absorbed some text. We will only fail again, with the
6879 'garbage following instruction' error message, which is
6880 probably less helpful than the current one. */
6881 if (backtrack_index == i && backtrack_pos != str
6882 && upat[i+1] == OP_stop)
d252fdde
PB
6883 {
6884 if (!inst.error)
6885 inst.error = _("syntax error");
6886 return FAIL;
6887 }
c19d1205
ZW
6888
6889 /* Try again, skipping the optional argument at backtrack_pos. */
6890 str = backtrack_pos;
6891 inst.error = backtrack_error;
6892 inst.operands[backtrack_index].present = 0;
6893 i = backtrack_index;
6894 backtrack_pos = 0;
09d92015 6895 }
09d92015 6896
c19d1205
ZW
6897 /* Check that we have parsed all the arguments. */
6898 if (*str != '\0' && !inst.error)
6899 inst.error = _("garbage following instruction");
09d92015 6900
c19d1205 6901 return inst.error ? FAIL : SUCCESS;
09d92015
MM
6902}
6903
c19d1205
ZW
6904#undef po_char_or_fail
6905#undef po_reg_or_fail
6906#undef po_reg_or_goto
6907#undef po_imm_or_fail
5287ad62 6908#undef po_scalar_or_fail
52e7f43d 6909#undef po_barrier_or_imm
e07e6e58 6910
c19d1205 6911/* Shorthand macro for instruction encoding functions issuing errors. */
e07e6e58
NC
6912#define constraint(expr, err) \
6913 do \
c19d1205 6914 { \
e07e6e58
NC
6915 if (expr) \
6916 { \
6917 inst.error = err; \
6918 return; \
6919 } \
c19d1205 6920 } \
e07e6e58 6921 while (0)
c19d1205 6922
fdfde340
JM
6923/* Reject "bad registers" for Thumb-2 instructions. Many Thumb-2
6924 instructions are unpredictable if these registers are used. This
6925 is the BadReg predicate in ARM's Thumb-2 documentation. */
6926#define reject_bad_reg(reg) \
6927 do \
6928 if (reg == REG_SP || reg == REG_PC) \
6929 { \
6930 inst.error = (reg == REG_SP) ? BAD_SP : BAD_PC; \
6931 return; \
6932 } \
6933 while (0)
6934
94206790
MM
6935/* If REG is R13 (the stack pointer), warn that its use is
6936 deprecated. */
6937#define warn_deprecated_sp(reg) \
6938 do \
6939 if (warn_on_deprecated && reg == REG_SP) \
6940 as_warn (_("use of r13 is deprecated")); \
6941 while (0)
6942
c19d1205
ZW
6943/* Functions for operand encoding. ARM, then Thumb. */
6944
6945#define rotate_left(v, n) (v << n | v >> (32 - n))
6946
6947/* If VAL can be encoded in the immediate field of an ARM instruction,
6948 return the encoded form. Otherwise, return FAIL. */
6949
6950static unsigned int
6951encode_arm_immediate (unsigned int val)
09d92015 6952{
c19d1205
ZW
6953 unsigned int a, i;
6954
6955 for (i = 0; i < 32; i += 2)
6956 if ((a = rotate_left (val, i)) <= 0xff)
6957 return a | (i << 7); /* 12-bit pack: [shift-cnt,const]. */
6958
6959 return FAIL;
09d92015
MM
6960}
6961
c19d1205
ZW
6962/* If VAL can be encoded in the immediate field of a Thumb32 instruction,
6963 return the encoded form. Otherwise, return FAIL. */
6964static unsigned int
6965encode_thumb32_immediate (unsigned int val)
09d92015 6966{
c19d1205 6967 unsigned int a, i;
09d92015 6968
9c3c69f2 6969 if (val <= 0xff)
c19d1205 6970 return val;
a737bd4d 6971
9c3c69f2 6972 for (i = 1; i <= 24; i++)
09d92015 6973 {
9c3c69f2
PB
6974 a = val >> i;
6975 if ((val & ~(0xff << i)) == 0)
6976 return ((val >> i) & 0x7f) | ((32 - i) << 7);
09d92015 6977 }
a737bd4d 6978
c19d1205
ZW
6979 a = val & 0xff;
6980 if (val == ((a << 16) | a))
6981 return 0x100 | a;
6982 if (val == ((a << 24) | (a << 16) | (a << 8) | a))
6983 return 0x300 | a;
09d92015 6984
c19d1205
ZW
6985 a = val & 0xff00;
6986 if (val == ((a << 16) | a))
6987 return 0x200 | (a >> 8);
a737bd4d 6988
c19d1205 6989 return FAIL;
09d92015 6990}
5287ad62 6991/* Encode a VFP SP or DP register number into inst.instruction. */
09d92015
MM
6992
6993static void
5287ad62
JB
6994encode_arm_vfp_reg (int reg, enum vfp_reg_pos pos)
6995{
6996 if ((pos == VFP_REG_Dd || pos == VFP_REG_Dn || pos == VFP_REG_Dm)
6997 && reg > 15)
6998 {
b1cc4aeb 6999 if (ARM_CPU_HAS_FEATURE (cpu_variant, fpu_vfp_ext_d32))
477330fc
RM
7000 {
7001 if (thumb_mode)
7002 ARM_MERGE_FEATURE_SETS (thumb_arch_used, thumb_arch_used,
7003 fpu_vfp_ext_d32);
7004 else
7005 ARM_MERGE_FEATURE_SETS (arm_arch_used, arm_arch_used,
7006 fpu_vfp_ext_d32);
7007 }
5287ad62 7008 else
477330fc
RM
7009 {
7010 first_error (_("D register out of range for selected VFP version"));
7011 return;
7012 }
5287ad62
JB
7013 }
7014
c19d1205 7015 switch (pos)
09d92015 7016 {
c19d1205
ZW
7017 case VFP_REG_Sd:
7018 inst.instruction |= ((reg >> 1) << 12) | ((reg & 1) << 22);
7019 break;
7020
7021 case VFP_REG_Sn:
7022 inst.instruction |= ((reg >> 1) << 16) | ((reg & 1) << 7);
7023 break;
7024
7025 case VFP_REG_Sm:
7026 inst.instruction |= ((reg >> 1) << 0) | ((reg & 1) << 5);
7027 break;
7028
5287ad62
JB
7029 case VFP_REG_Dd:
7030 inst.instruction |= ((reg & 15) << 12) | ((reg >> 4) << 22);
7031 break;
5f4273c7 7032
5287ad62
JB
7033 case VFP_REG_Dn:
7034 inst.instruction |= ((reg & 15) << 16) | ((reg >> 4) << 7);
7035 break;
5f4273c7 7036
5287ad62
JB
7037 case VFP_REG_Dm:
7038 inst.instruction |= (reg & 15) | ((reg >> 4) << 5);
7039 break;
7040
c19d1205
ZW
7041 default:
7042 abort ();
09d92015 7043 }
09d92015
MM
7044}
7045
c19d1205 7046/* Encode a <shift> in an ARM-format instruction. The immediate,
55cf6793 7047 if any, is handled by md_apply_fix. */
09d92015 7048static void
c19d1205 7049encode_arm_shift (int i)
09d92015 7050{
c19d1205
ZW
7051 if (inst.operands[i].shift_kind == SHIFT_RRX)
7052 inst.instruction |= SHIFT_ROR << 5;
7053 else
09d92015 7054 {
c19d1205
ZW
7055 inst.instruction |= inst.operands[i].shift_kind << 5;
7056 if (inst.operands[i].immisreg)
7057 {
7058 inst.instruction |= SHIFT_BY_REG;
7059 inst.instruction |= inst.operands[i].imm << 8;
7060 }
7061 else
7062 inst.reloc.type = BFD_RELOC_ARM_SHIFT_IMM;
09d92015 7063 }
c19d1205 7064}
09d92015 7065
c19d1205
ZW
7066static void
7067encode_arm_shifter_operand (int i)
7068{
7069 if (inst.operands[i].isreg)
09d92015 7070 {
c19d1205
ZW
7071 inst.instruction |= inst.operands[i].reg;
7072 encode_arm_shift (i);
09d92015 7073 }
c19d1205 7074 else
a415b1cd
JB
7075 {
7076 inst.instruction |= INST_IMMEDIATE;
7077 if (inst.reloc.type != BFD_RELOC_ARM_IMMEDIATE)
7078 inst.instruction |= inst.operands[i].imm;
7079 }
09d92015
MM
7080}
7081
c19d1205 7082/* Subroutine of encode_arm_addr_mode_2 and encode_arm_addr_mode_3. */
09d92015 7083static void
c19d1205 7084encode_arm_addr_mode_common (int i, bfd_boolean is_t)
09d92015 7085{
2b2f5df9
NC
7086 /* PR 14260:
7087 Generate an error if the operand is not a register. */
7088 constraint (!inst.operands[i].isreg,
7089 _("Instruction does not support =N addresses"));
7090
c19d1205 7091 inst.instruction |= inst.operands[i].reg << 16;
a737bd4d 7092
c19d1205 7093 if (inst.operands[i].preind)
09d92015 7094 {
c19d1205
ZW
7095 if (is_t)
7096 {
7097 inst.error = _("instruction does not accept preindexed addressing");
7098 return;
7099 }
7100 inst.instruction |= PRE_INDEX;
7101 if (inst.operands[i].writeback)
7102 inst.instruction |= WRITE_BACK;
09d92015 7103
c19d1205
ZW
7104 }
7105 else if (inst.operands[i].postind)
7106 {
9c2799c2 7107 gas_assert (inst.operands[i].writeback);
c19d1205
ZW
7108 if (is_t)
7109 inst.instruction |= WRITE_BACK;
7110 }
7111 else /* unindexed - only for coprocessor */
09d92015 7112 {
c19d1205 7113 inst.error = _("instruction does not accept unindexed addressing");
09d92015
MM
7114 return;
7115 }
7116
c19d1205
ZW
7117 if (((inst.instruction & WRITE_BACK) || !(inst.instruction & PRE_INDEX))
7118 && (((inst.instruction & 0x000f0000) >> 16)
7119 == ((inst.instruction & 0x0000f000) >> 12)))
7120 as_warn ((inst.instruction & LOAD_BIT)
7121 ? _("destination register same as write-back base")
7122 : _("source register same as write-back base"));
09d92015
MM
7123}
7124
c19d1205
ZW
7125/* inst.operands[i] was set up by parse_address. Encode it into an
7126 ARM-format mode 2 load or store instruction. If is_t is true,
7127 reject forms that cannot be used with a T instruction (i.e. not
7128 post-indexed). */
a737bd4d 7129static void
c19d1205 7130encode_arm_addr_mode_2 (int i, bfd_boolean is_t)
09d92015 7131{
5be8be5d
DG
7132 const bfd_boolean is_pc = (inst.operands[i].reg == REG_PC);
7133
c19d1205 7134 encode_arm_addr_mode_common (i, is_t);
a737bd4d 7135
c19d1205 7136 if (inst.operands[i].immisreg)
09d92015 7137 {
5be8be5d
DG
7138 constraint ((inst.operands[i].imm == REG_PC
7139 || (is_pc && inst.operands[i].writeback)),
7140 BAD_PC_ADDRESSING);
c19d1205
ZW
7141 inst.instruction |= INST_IMMEDIATE; /* yes, this is backwards */
7142 inst.instruction |= inst.operands[i].imm;
7143 if (!inst.operands[i].negative)
7144 inst.instruction |= INDEX_UP;
7145 if (inst.operands[i].shifted)
7146 {
7147 if (inst.operands[i].shift_kind == SHIFT_RRX)
7148 inst.instruction |= SHIFT_ROR << 5;
7149 else
7150 {
7151 inst.instruction |= inst.operands[i].shift_kind << 5;
7152 inst.reloc.type = BFD_RELOC_ARM_SHIFT_IMM;
7153 }
7154 }
09d92015 7155 }
c19d1205 7156 else /* immediate offset in inst.reloc */
09d92015 7157 {
5be8be5d
DG
7158 if (is_pc && !inst.reloc.pc_rel)
7159 {
7160 const bfd_boolean is_load = ((inst.instruction & LOAD_BIT) != 0);
23a10334
JZ
7161
7162 /* If is_t is TRUE, it's called from do_ldstt. ldrt/strt
7163 cannot use PC in addressing.
7164 PC cannot be used in writeback addressing, either. */
7165 constraint ((is_t || inst.operands[i].writeback),
5be8be5d 7166 BAD_PC_ADDRESSING);
23a10334 7167
dc5ec521 7168 /* Use of PC in str is deprecated for ARMv7. */
23a10334
JZ
7169 if (warn_on_deprecated
7170 && !is_load
7171 && ARM_CPU_HAS_FEATURE (selected_cpu, arm_ext_v7))
7172 as_warn (_("use of PC in this instruction is deprecated"));
5be8be5d
DG
7173 }
7174
c19d1205 7175 if (inst.reloc.type == BFD_RELOC_UNUSED)
26d97720
NS
7176 {
7177 /* Prefer + for zero encoded value. */
7178 if (!inst.operands[i].negative)
7179 inst.instruction |= INDEX_UP;
7180 inst.reloc.type = BFD_RELOC_ARM_OFFSET_IMM;
7181 }
09d92015 7182 }
09d92015
MM
7183}
7184
c19d1205
ZW
7185/* inst.operands[i] was set up by parse_address. Encode it into an
7186 ARM-format mode 3 load or store instruction. Reject forms that
7187 cannot be used with such instructions. If is_t is true, reject
7188 forms that cannot be used with a T instruction (i.e. not
7189 post-indexed). */
7190static void
7191encode_arm_addr_mode_3 (int i, bfd_boolean is_t)
09d92015 7192{
c19d1205 7193 if (inst.operands[i].immisreg && inst.operands[i].shifted)
09d92015 7194 {
c19d1205
ZW
7195 inst.error = _("instruction does not accept scaled register index");
7196 return;
09d92015 7197 }
a737bd4d 7198
c19d1205 7199 encode_arm_addr_mode_common (i, is_t);
a737bd4d 7200
c19d1205
ZW
7201 if (inst.operands[i].immisreg)
7202 {
5be8be5d 7203 constraint ((inst.operands[i].imm == REG_PC
eb9f3f00 7204 || (is_t && inst.operands[i].reg == REG_PC)),
5be8be5d 7205 BAD_PC_ADDRESSING);
eb9f3f00
JB
7206 constraint (inst.operands[i].reg == REG_PC && inst.operands[i].writeback,
7207 BAD_PC_WRITEBACK);
c19d1205
ZW
7208 inst.instruction |= inst.operands[i].imm;
7209 if (!inst.operands[i].negative)
7210 inst.instruction |= INDEX_UP;
7211 }
7212 else /* immediate offset in inst.reloc */
7213 {
5be8be5d
DG
7214 constraint ((inst.operands[i].reg == REG_PC && !inst.reloc.pc_rel
7215 && inst.operands[i].writeback),
7216 BAD_PC_WRITEBACK);
c19d1205
ZW
7217 inst.instruction |= HWOFFSET_IMM;
7218 if (inst.reloc.type == BFD_RELOC_UNUSED)
26d97720
NS
7219 {
7220 /* Prefer + for zero encoded value. */
7221 if (!inst.operands[i].negative)
7222 inst.instruction |= INDEX_UP;
7223
7224 inst.reloc.type = BFD_RELOC_ARM_OFFSET_IMM8;
7225 }
c19d1205 7226 }
a737bd4d
NC
7227}
7228
c19d1205
ZW
7229/* inst.operands[i] was set up by parse_address. Encode it into an
7230 ARM-format instruction. Reject all forms which cannot be encoded
7231 into a coprocessor load/store instruction. If wb_ok is false,
7232 reject use of writeback; if unind_ok is false, reject use of
7233 unindexed addressing. If reloc_override is not 0, use it instead
4962c51a
MS
7234 of BFD_ARM_CP_OFF_IMM, unless the initial relocation is a group one
7235 (in which case it is preserved). */
09d92015 7236
c19d1205
ZW
7237static int
7238encode_arm_cp_address (int i, int wb_ok, int unind_ok, int reloc_override)
09d92015 7239{
c19d1205 7240 inst.instruction |= inst.operands[i].reg << 16;
a737bd4d 7241
9c2799c2 7242 gas_assert (!(inst.operands[i].preind && inst.operands[i].postind));
09d92015 7243
c19d1205 7244 if (!inst.operands[i].preind && !inst.operands[i].postind) /* unindexed */
09d92015 7245 {
9c2799c2 7246 gas_assert (!inst.operands[i].writeback);
c19d1205
ZW
7247 if (!unind_ok)
7248 {
7249 inst.error = _("instruction does not support unindexed addressing");
7250 return FAIL;
7251 }
7252 inst.instruction |= inst.operands[i].imm;
7253 inst.instruction |= INDEX_UP;
7254 return SUCCESS;
09d92015 7255 }
a737bd4d 7256
c19d1205
ZW
7257 if (inst.operands[i].preind)
7258 inst.instruction |= PRE_INDEX;
a737bd4d 7259
c19d1205 7260 if (inst.operands[i].writeback)
09d92015 7261 {
c19d1205
ZW
7262 if (inst.operands[i].reg == REG_PC)
7263 {
7264 inst.error = _("pc may not be used with write-back");
7265 return FAIL;
7266 }
7267 if (!wb_ok)
7268 {
7269 inst.error = _("instruction does not support writeback");
7270 return FAIL;
7271 }
7272 inst.instruction |= WRITE_BACK;
09d92015 7273 }
a737bd4d 7274
c19d1205 7275 if (reloc_override)
21d799b5 7276 inst.reloc.type = (bfd_reloc_code_real_type) reloc_override;
4962c51a 7277 else if ((inst.reloc.type < BFD_RELOC_ARM_ALU_PC_G0_NC
477330fc
RM
7278 || inst.reloc.type > BFD_RELOC_ARM_LDC_SB_G2)
7279 && inst.reloc.type != BFD_RELOC_ARM_LDR_PC_G0)
4962c51a
MS
7280 {
7281 if (thumb_mode)
477330fc 7282 inst.reloc.type = BFD_RELOC_ARM_T32_CP_OFF_IMM;
4962c51a 7283 else
477330fc 7284 inst.reloc.type = BFD_RELOC_ARM_CP_OFF_IMM;
4962c51a
MS
7285 }
7286
26d97720
NS
7287 /* Prefer + for zero encoded value. */
7288 if (!inst.operands[i].negative)
7289 inst.instruction |= INDEX_UP;
7290
c19d1205
ZW
7291 return SUCCESS;
7292}
a737bd4d 7293
c19d1205
ZW
7294/* inst.reloc.exp describes an "=expr" load pseudo-operation.
7295 Determine whether it can be performed with a move instruction; if
7296 it can, convert inst.instruction to that move instruction and
c921be7d
NC
7297 return TRUE; if it can't, convert inst.instruction to a literal-pool
7298 load and return FALSE. If this is not a valid thing to do in the
7299 current context, set inst.error and return TRUE.
a737bd4d 7300
c19d1205
ZW
7301 inst.operands[i] describes the destination register. */
7302
c921be7d 7303static bfd_boolean
c19d1205
ZW
7304move_or_literal_pool (int i, bfd_boolean thumb_p, bfd_boolean mode_3)
7305{
53365c0d
PB
7306 unsigned long tbit;
7307
7308 if (thumb_p)
7309 tbit = (inst.instruction > 0xffff) ? THUMB2_LOAD_BIT : THUMB_LOAD_BIT;
7310 else
7311 tbit = LOAD_BIT;
7312
7313 if ((inst.instruction & tbit) == 0)
09d92015 7314 {
c19d1205 7315 inst.error = _("invalid pseudo operation");
c921be7d 7316 return TRUE;
09d92015 7317 }
c19d1205 7318 if (inst.reloc.exp.X_op != O_constant && inst.reloc.exp.X_op != O_symbol)
09d92015
MM
7319 {
7320 inst.error = _("constant expression expected");
c921be7d 7321 return TRUE;
09d92015 7322 }
c19d1205 7323 if (inst.reloc.exp.X_op == O_constant)
09d92015 7324 {
c19d1205
ZW
7325 if (thumb_p)
7326 {
53365c0d 7327 if (!unified_syntax && (inst.reloc.exp.X_add_number & ~0xFF) == 0)
c19d1205
ZW
7328 {
7329 /* This can be done with a mov(1) instruction. */
7330 inst.instruction = T_OPCODE_MOV_I8 | (inst.operands[i].reg << 8);
7331 inst.instruction |= inst.reloc.exp.X_add_number;
c921be7d 7332 return TRUE;
c19d1205
ZW
7333 }
7334 }
7335 else
7336 {
7337 int value = encode_arm_immediate (inst.reloc.exp.X_add_number);
7338 if (value != FAIL)
7339 {
7340 /* This can be done with a mov instruction. */
7341 inst.instruction &= LITERAL_MASK;
7342 inst.instruction |= INST_IMMEDIATE | (OPCODE_MOV << DATA_OP_SHIFT);
7343 inst.instruction |= value & 0xfff;
c921be7d 7344 return TRUE;
c19d1205 7345 }
09d92015 7346
c19d1205
ZW
7347 value = encode_arm_immediate (~inst.reloc.exp.X_add_number);
7348 if (value != FAIL)
7349 {
7350 /* This can be done with a mvn instruction. */
7351 inst.instruction &= LITERAL_MASK;
7352 inst.instruction |= INST_IMMEDIATE | (OPCODE_MVN << DATA_OP_SHIFT);
7353 inst.instruction |= value & 0xfff;
c921be7d 7354 return TRUE;
c19d1205
ZW
7355 }
7356 }
09d92015
MM
7357 }
7358
c19d1205
ZW
7359 if (add_to_lit_pool () == FAIL)
7360 {
7361 inst.error = _("literal pool insertion failed");
c921be7d 7362 return TRUE;
c19d1205
ZW
7363 }
7364 inst.operands[1].reg = REG_PC;
7365 inst.operands[1].isreg = 1;
7366 inst.operands[1].preind = 1;
7367 inst.reloc.pc_rel = 1;
7368 inst.reloc.type = (thumb_p
7369 ? BFD_RELOC_ARM_THUMB_OFFSET
7370 : (mode_3
7371 ? BFD_RELOC_ARM_HWLITERAL
7372 : BFD_RELOC_ARM_LITERAL));
c921be7d 7373 return FALSE;
09d92015
MM
7374}
7375
5f4273c7 7376/* Functions for instruction encoding, sorted by sub-architecture.
c19d1205
ZW
7377 First some generics; their names are taken from the conventional
7378 bit positions for register arguments in ARM format instructions. */
09d92015 7379
a737bd4d 7380static void
c19d1205 7381do_noargs (void)
09d92015 7382{
c19d1205 7383}
a737bd4d 7384
c19d1205
ZW
7385static void
7386do_rd (void)
7387{
7388 inst.instruction |= inst.operands[0].reg << 12;
7389}
a737bd4d 7390
c19d1205
ZW
7391static void
7392do_rd_rm (void)
7393{
7394 inst.instruction |= inst.operands[0].reg << 12;
7395 inst.instruction |= inst.operands[1].reg;
7396}
09d92015 7397
9eb6c0f1
MGD
7398static void
7399do_rm_rn (void)
7400{
7401 inst.instruction |= inst.operands[0].reg;
7402 inst.instruction |= inst.operands[1].reg << 16;
7403}
7404
c19d1205
ZW
7405static void
7406do_rd_rn (void)
7407{
7408 inst.instruction |= inst.operands[0].reg << 12;
7409 inst.instruction |= inst.operands[1].reg << 16;
7410}
a737bd4d 7411
c19d1205
ZW
7412static void
7413do_rn_rd (void)
7414{
7415 inst.instruction |= inst.operands[0].reg << 16;
7416 inst.instruction |= inst.operands[1].reg << 12;
7417}
09d92015 7418
59d09be6
MGD
7419static bfd_boolean
7420check_obsolete (const arm_feature_set *feature, const char *msg)
7421{
7422 if (ARM_CPU_IS_ANY (cpu_variant))
7423 {
7424 as_warn ("%s", msg);
7425 return TRUE;
7426 }
7427 else if (ARM_CPU_HAS_FEATURE (cpu_variant, *feature))
7428 {
7429 as_bad ("%s", msg);
7430 return TRUE;
7431 }
7432
7433 return FALSE;
7434}
7435
c19d1205
ZW
7436static void
7437do_rd_rm_rn (void)
7438{
9a64e435 7439 unsigned Rn = inst.operands[2].reg;
708587a4 7440 /* Enforce restrictions on SWP instruction. */
9a64e435 7441 if ((inst.instruction & 0x0fbfffff) == 0x01000090)
56adecf4
DG
7442 {
7443 constraint (Rn == inst.operands[0].reg || Rn == inst.operands[1].reg,
7444 _("Rn must not overlap other operands"));
7445
59d09be6
MGD
7446 /* SWP{b} is obsolete for ARMv8-A, and deprecated for ARMv6* and ARMv7.
7447 */
7448 if (!check_obsolete (&arm_ext_v8,
7449 _("swp{b} use is obsoleted for ARMv8 and later"))
7450 && warn_on_deprecated
7451 && ARM_CPU_HAS_FEATURE (cpu_variant, arm_ext_v6))
7452 as_warn (_("swp{b} use is deprecated for ARMv6 and ARMv7"));
56adecf4 7453 }
59d09be6 7454
c19d1205
ZW
7455 inst.instruction |= inst.operands[0].reg << 12;
7456 inst.instruction |= inst.operands[1].reg;
9a64e435 7457 inst.instruction |= Rn << 16;
c19d1205 7458}
09d92015 7459
c19d1205
ZW
7460static void
7461do_rd_rn_rm (void)
7462{
7463 inst.instruction |= inst.operands[0].reg << 12;
7464 inst.instruction |= inst.operands[1].reg << 16;
7465 inst.instruction |= inst.operands[2].reg;
7466}
a737bd4d 7467
c19d1205
ZW
7468static void
7469do_rm_rd_rn (void)
7470{
5be8be5d
DG
7471 constraint ((inst.operands[2].reg == REG_PC), BAD_PC);
7472 constraint (((inst.reloc.exp.X_op != O_constant
7473 && inst.reloc.exp.X_op != O_illegal)
7474 || inst.reloc.exp.X_add_number != 0),
7475 BAD_ADDR_MODE);
c19d1205
ZW
7476 inst.instruction |= inst.operands[0].reg;
7477 inst.instruction |= inst.operands[1].reg << 12;
7478 inst.instruction |= inst.operands[2].reg << 16;
7479}
09d92015 7480
c19d1205
ZW
7481static void
7482do_imm0 (void)
7483{
7484 inst.instruction |= inst.operands[0].imm;
7485}
09d92015 7486
c19d1205
ZW
7487static void
7488do_rd_cpaddr (void)
7489{
7490 inst.instruction |= inst.operands[0].reg << 12;
7491 encode_arm_cp_address (1, TRUE, TRUE, 0);
09d92015 7492}
a737bd4d 7493
c19d1205
ZW
7494/* ARM instructions, in alphabetical order by function name (except
7495 that wrapper functions appear immediately after the function they
7496 wrap). */
09d92015 7497
c19d1205
ZW
7498/* This is a pseudo-op of the form "adr rd, label" to be converted
7499 into a relative address of the form "add rd, pc, #label-.-8". */
09d92015
MM
7500
7501static void
c19d1205 7502do_adr (void)
09d92015 7503{
c19d1205 7504 inst.instruction |= (inst.operands[0].reg << 12); /* Rd */
a737bd4d 7505
c19d1205
ZW
7506 /* Frag hacking will turn this into a sub instruction if the offset turns
7507 out to be negative. */
7508 inst.reloc.type = BFD_RELOC_ARM_IMMEDIATE;
c19d1205 7509 inst.reloc.pc_rel = 1;
2fc8bdac 7510 inst.reloc.exp.X_add_number -= 8;
c19d1205 7511}
b99bd4ef 7512
c19d1205
ZW
7513/* This is a pseudo-op of the form "adrl rd, label" to be converted
7514 into a relative address of the form:
7515 add rd, pc, #low(label-.-8)"
7516 add rd, rd, #high(label-.-8)" */
b99bd4ef 7517
c19d1205
ZW
7518static void
7519do_adrl (void)
7520{
7521 inst.instruction |= (inst.operands[0].reg << 12); /* Rd */
a737bd4d 7522
c19d1205
ZW
7523 /* Frag hacking will turn this into a sub instruction if the offset turns
7524 out to be negative. */
7525 inst.reloc.type = BFD_RELOC_ARM_ADRL_IMMEDIATE;
c19d1205
ZW
7526 inst.reloc.pc_rel = 1;
7527 inst.size = INSN_SIZE * 2;
2fc8bdac 7528 inst.reloc.exp.X_add_number -= 8;
b99bd4ef
NC
7529}
7530
b99bd4ef 7531static void
c19d1205 7532do_arit (void)
b99bd4ef 7533{
c19d1205
ZW
7534 if (!inst.operands[1].present)
7535 inst.operands[1].reg = inst.operands[0].reg;
7536 inst.instruction |= inst.operands[0].reg << 12;
7537 inst.instruction |= inst.operands[1].reg << 16;
7538 encode_arm_shifter_operand (2);
7539}
b99bd4ef 7540
62b3e311
PB
7541static void
7542do_barrier (void)
7543{
7544 if (inst.operands[0].present)
ccb84d65 7545 inst.instruction |= inst.operands[0].imm;
62b3e311
PB
7546 else
7547 inst.instruction |= 0xf;
7548}
7549
c19d1205
ZW
7550static void
7551do_bfc (void)
7552{
7553 unsigned int msb = inst.operands[1].imm + inst.operands[2].imm;
7554 constraint (msb > 32, _("bit-field extends past end of register"));
7555 /* The instruction encoding stores the LSB and MSB,
7556 not the LSB and width. */
7557 inst.instruction |= inst.operands[0].reg << 12;
7558 inst.instruction |= inst.operands[1].imm << 7;
7559 inst.instruction |= (msb - 1) << 16;
7560}
b99bd4ef 7561
c19d1205
ZW
7562static void
7563do_bfi (void)
7564{
7565 unsigned int msb;
b99bd4ef 7566
c19d1205
ZW
7567 /* #0 in second position is alternative syntax for bfc, which is
7568 the same instruction but with REG_PC in the Rm field. */
7569 if (!inst.operands[1].isreg)
7570 inst.operands[1].reg = REG_PC;
b99bd4ef 7571
c19d1205
ZW
7572 msb = inst.operands[2].imm + inst.operands[3].imm;
7573 constraint (msb > 32, _("bit-field extends past end of register"));
7574 /* The instruction encoding stores the LSB and MSB,
7575 not the LSB and width. */
7576 inst.instruction |= inst.operands[0].reg << 12;
7577 inst.instruction |= inst.operands[1].reg;
7578 inst.instruction |= inst.operands[2].imm << 7;
7579 inst.instruction |= (msb - 1) << 16;
b99bd4ef
NC
7580}
7581
b99bd4ef 7582static void
c19d1205 7583do_bfx (void)
b99bd4ef 7584{
c19d1205
ZW
7585 constraint (inst.operands[2].imm + inst.operands[3].imm > 32,
7586 _("bit-field extends past end of register"));
7587 inst.instruction |= inst.operands[0].reg << 12;
7588 inst.instruction |= inst.operands[1].reg;
7589 inst.instruction |= inst.operands[2].imm << 7;
7590 inst.instruction |= (inst.operands[3].imm - 1) << 16;
7591}
09d92015 7592
c19d1205
ZW
7593/* ARM V5 breakpoint instruction (argument parse)
7594 BKPT <16 bit unsigned immediate>
7595 Instruction is not conditional.
7596 The bit pattern given in insns[] has the COND_ALWAYS condition,
7597 and it is an error if the caller tried to override that. */
b99bd4ef 7598
c19d1205
ZW
7599static void
7600do_bkpt (void)
7601{
7602 /* Top 12 of 16 bits to bits 19:8. */
7603 inst.instruction |= (inst.operands[0].imm & 0xfff0) << 4;
09d92015 7604
c19d1205
ZW
7605 /* Bottom 4 of 16 bits to bits 3:0. */
7606 inst.instruction |= inst.operands[0].imm & 0xf;
7607}
09d92015 7608
c19d1205
ZW
7609static void
7610encode_branch (int default_reloc)
7611{
7612 if (inst.operands[0].hasreloc)
7613 {
0855e32b
NS
7614 constraint (inst.operands[0].imm != BFD_RELOC_ARM_PLT32
7615 && inst.operands[0].imm != BFD_RELOC_ARM_TLS_CALL,
7616 _("the only valid suffixes here are '(plt)' and '(tlscall)'"));
7617 inst.reloc.type = inst.operands[0].imm == BFD_RELOC_ARM_PLT32
7618 ? BFD_RELOC_ARM_PLT32
7619 : thumb_mode ? BFD_RELOC_ARM_THM_TLS_CALL : BFD_RELOC_ARM_TLS_CALL;
c19d1205 7620 }
b99bd4ef 7621 else
9ae92b05 7622 inst.reloc.type = (bfd_reloc_code_real_type) default_reloc;
2fc8bdac 7623 inst.reloc.pc_rel = 1;
b99bd4ef
NC
7624}
7625
b99bd4ef 7626static void
c19d1205 7627do_branch (void)
b99bd4ef 7628{
39b41c9c
PB
7629#ifdef OBJ_ELF
7630 if (EF_ARM_EABI_VERSION (meabi_flags) >= EF_ARM_EABI_VER4)
7631 encode_branch (BFD_RELOC_ARM_PCREL_JUMP);
7632 else
7633#endif
7634 encode_branch (BFD_RELOC_ARM_PCREL_BRANCH);
7635}
7636
7637static void
7638do_bl (void)
7639{
7640#ifdef OBJ_ELF
7641 if (EF_ARM_EABI_VERSION (meabi_flags) >= EF_ARM_EABI_VER4)
7642 {
7643 if (inst.cond == COND_ALWAYS)
7644 encode_branch (BFD_RELOC_ARM_PCREL_CALL);
7645 else
7646 encode_branch (BFD_RELOC_ARM_PCREL_JUMP);
7647 }
7648 else
7649#endif
7650 encode_branch (BFD_RELOC_ARM_PCREL_BRANCH);
c19d1205 7651}
b99bd4ef 7652
c19d1205
ZW
7653/* ARM V5 branch-link-exchange instruction (argument parse)
7654 BLX <target_addr> ie BLX(1)
7655 BLX{<condition>} <Rm> ie BLX(2)
7656 Unfortunately, there are two different opcodes for this mnemonic.
7657 So, the insns[].value is not used, and the code here zaps values
7658 into inst.instruction.
7659 Also, the <target_addr> can be 25 bits, hence has its own reloc. */
b99bd4ef 7660
c19d1205
ZW
7661static void
7662do_blx (void)
7663{
7664 if (inst.operands[0].isreg)
b99bd4ef 7665 {
c19d1205
ZW
7666 /* Arg is a register; the opcode provided by insns[] is correct.
7667 It is not illegal to do "blx pc", just useless. */
7668 if (inst.operands[0].reg == REG_PC)
7669 as_tsktsk (_("use of r15 in blx in ARM mode is not really useful"));
b99bd4ef 7670
c19d1205
ZW
7671 inst.instruction |= inst.operands[0].reg;
7672 }
7673 else
b99bd4ef 7674 {
c19d1205 7675 /* Arg is an address; this instruction cannot be executed
267bf995
RR
7676 conditionally, and the opcode must be adjusted.
7677 We retain the BFD_RELOC_ARM_PCREL_BLX till the very end
7678 where we generate out a BFD_RELOC_ARM_PCREL_CALL instead. */
c19d1205 7679 constraint (inst.cond != COND_ALWAYS, BAD_COND);
2fc8bdac 7680 inst.instruction = 0xfa000000;
267bf995 7681 encode_branch (BFD_RELOC_ARM_PCREL_BLX);
b99bd4ef 7682 }
c19d1205
ZW
7683}
7684
7685static void
7686do_bx (void)
7687{
845b51d6
PB
7688 bfd_boolean want_reloc;
7689
c19d1205
ZW
7690 if (inst.operands[0].reg == REG_PC)
7691 as_tsktsk (_("use of r15 in bx in ARM mode is not really useful"));
b99bd4ef 7692
c19d1205 7693 inst.instruction |= inst.operands[0].reg;
845b51d6
PB
7694 /* Output R_ARM_V4BX relocations if is an EABI object that looks like
7695 it is for ARMv4t or earlier. */
7696 want_reloc = !ARM_CPU_HAS_FEATURE (selected_cpu, arm_ext_v5);
7697 if (object_arch && !ARM_CPU_HAS_FEATURE (*object_arch, arm_ext_v5))
7698 want_reloc = TRUE;
7699
5ad34203 7700#ifdef OBJ_ELF
845b51d6 7701 if (EF_ARM_EABI_VERSION (meabi_flags) < EF_ARM_EABI_VER4)
5ad34203 7702#endif
584206db 7703 want_reloc = FALSE;
845b51d6
PB
7704
7705 if (want_reloc)
7706 inst.reloc.type = BFD_RELOC_ARM_V4BX;
09d92015
MM
7707}
7708
c19d1205
ZW
7709
7710/* ARM v5TEJ. Jump to Jazelle code. */
a737bd4d
NC
7711
7712static void
c19d1205 7713do_bxj (void)
a737bd4d 7714{
c19d1205
ZW
7715 if (inst.operands[0].reg == REG_PC)
7716 as_tsktsk (_("use of r15 in bxj is not really useful"));
7717
7718 inst.instruction |= inst.operands[0].reg;
a737bd4d
NC
7719}
7720
c19d1205
ZW
7721/* Co-processor data operation:
7722 CDP{cond} <coproc>, <opcode_1>, <CRd>, <CRn>, <CRm>{, <opcode_2>}
7723 CDP2 <coproc>, <opcode_1>, <CRd>, <CRn>, <CRm>{, <opcode_2>} */
7724static void
7725do_cdp (void)
7726{
7727 inst.instruction |= inst.operands[0].reg << 8;
7728 inst.instruction |= inst.operands[1].imm << 20;
7729 inst.instruction |= inst.operands[2].reg << 12;
7730 inst.instruction |= inst.operands[3].reg << 16;
7731 inst.instruction |= inst.operands[4].reg;
7732 inst.instruction |= inst.operands[5].imm << 5;
7733}
a737bd4d
NC
7734
7735static void
c19d1205 7736do_cmp (void)
a737bd4d 7737{
c19d1205
ZW
7738 inst.instruction |= inst.operands[0].reg << 16;
7739 encode_arm_shifter_operand (1);
a737bd4d
NC
7740}
7741
c19d1205
ZW
7742/* Transfer between coprocessor and ARM registers.
7743 MRC{cond} <coproc>, <opcode_1>, <Rd>, <CRn>, <CRm>{, <opcode_2>}
7744 MRC2
7745 MCR{cond}
7746 MCR2
7747
7748 No special properties. */
09d92015 7749
dcbd0d71
MGD
7750struct deprecated_coproc_regs_s
7751{
7752 unsigned cp;
7753 int opc1;
7754 unsigned crn;
7755 unsigned crm;
7756 int opc2;
7757 arm_feature_set deprecated;
7758 arm_feature_set obsoleted;
7759 const char *dep_msg;
7760 const char *obs_msg;
7761};
7762
7763#define DEPR_ACCESS_V8 \
7764 N_("This coprocessor register access is deprecated in ARMv8")
7765
7766/* Table of all deprecated coprocessor registers. */
7767static struct deprecated_coproc_regs_s deprecated_coproc_regs[] =
7768{
7769 {15, 0, 7, 10, 5, /* CP15DMB. */
7770 ARM_FEATURE (ARM_EXT_V8, 0), ARM_FEATURE (0, 0),
7771 DEPR_ACCESS_V8, NULL},
7772 {15, 0, 7, 10, 4, /* CP15DSB. */
7773 ARM_FEATURE (ARM_EXT_V8, 0), ARM_FEATURE (0, 0),
7774 DEPR_ACCESS_V8, NULL},
7775 {15, 0, 7, 5, 4, /* CP15ISB. */
7776 ARM_FEATURE (ARM_EXT_V8, 0), ARM_FEATURE (0, 0),
7777 DEPR_ACCESS_V8, NULL},
7778 {14, 6, 1, 0, 0, /* TEEHBR. */
7779 ARM_FEATURE (ARM_EXT_V8, 0), ARM_FEATURE (0, 0),
7780 DEPR_ACCESS_V8, NULL},
7781 {14, 6, 0, 0, 0, /* TEECR. */
7782 ARM_FEATURE (ARM_EXT_V8, 0), ARM_FEATURE (0, 0),
7783 DEPR_ACCESS_V8, NULL},
7784};
7785
7786#undef DEPR_ACCESS_V8
7787
7788static const size_t deprecated_coproc_reg_count =
7789 sizeof (deprecated_coproc_regs) / sizeof (deprecated_coproc_regs[0]);
7790
09d92015 7791static void
c19d1205 7792do_co_reg (void)
09d92015 7793{
fdfde340 7794 unsigned Rd;
dcbd0d71 7795 size_t i;
fdfde340
JM
7796
7797 Rd = inst.operands[2].reg;
7798 if (thumb_mode)
7799 {
7800 if (inst.instruction == 0xee000010
7801 || inst.instruction == 0xfe000010)
7802 /* MCR, MCR2 */
7803 reject_bad_reg (Rd);
7804 else
7805 /* MRC, MRC2 */
7806 constraint (Rd == REG_SP, BAD_SP);
7807 }
7808 else
7809 {
7810 /* MCR */
7811 if (inst.instruction == 0xe000010)
7812 constraint (Rd == REG_PC, BAD_PC);
7813 }
7814
dcbd0d71
MGD
7815 for (i = 0; i < deprecated_coproc_reg_count; ++i)
7816 {
7817 const struct deprecated_coproc_regs_s *r =
7818 deprecated_coproc_regs + i;
7819
7820 if (inst.operands[0].reg == r->cp
7821 && inst.operands[1].imm == r->opc1
7822 && inst.operands[3].reg == r->crn
7823 && inst.operands[4].reg == r->crm
7824 && inst.operands[5].imm == r->opc2)
7825 {
b10bf8c5 7826 if (! ARM_CPU_IS_ANY (cpu_variant)
477330fc 7827 && warn_on_deprecated
dcbd0d71
MGD
7828 && ARM_CPU_HAS_FEATURE (cpu_variant, r->deprecated))
7829 as_warn ("%s", r->dep_msg);
7830 }
7831 }
fdfde340 7832
c19d1205
ZW
7833 inst.instruction |= inst.operands[0].reg << 8;
7834 inst.instruction |= inst.operands[1].imm << 21;
fdfde340 7835 inst.instruction |= Rd << 12;
c19d1205
ZW
7836 inst.instruction |= inst.operands[3].reg << 16;
7837 inst.instruction |= inst.operands[4].reg;
7838 inst.instruction |= inst.operands[5].imm << 5;
7839}
09d92015 7840
c19d1205
ZW
7841/* Transfer between coprocessor register and pair of ARM registers.
7842 MCRR{cond} <coproc>, <opcode>, <Rd>, <Rn>, <CRm>.
7843 MCRR2
7844 MRRC{cond}
7845 MRRC2
b99bd4ef 7846
c19d1205 7847 Two XScale instructions are special cases of these:
09d92015 7848
c19d1205
ZW
7849 MAR{cond} acc0, <RdLo>, <RdHi> == MCRR{cond} p0, #0, <RdLo>, <RdHi>, c0
7850 MRA{cond} acc0, <RdLo>, <RdHi> == MRRC{cond} p0, #0, <RdLo>, <RdHi>, c0
b99bd4ef 7851
5f4273c7 7852 Result unpredictable if Rd or Rn is R15. */
a737bd4d 7853
c19d1205
ZW
7854static void
7855do_co_reg2c (void)
7856{
fdfde340
JM
7857 unsigned Rd, Rn;
7858
7859 Rd = inst.operands[2].reg;
7860 Rn = inst.operands[3].reg;
7861
7862 if (thumb_mode)
7863 {
7864 reject_bad_reg (Rd);
7865 reject_bad_reg (Rn);
7866 }
7867 else
7868 {
7869 constraint (Rd == REG_PC, BAD_PC);
7870 constraint (Rn == REG_PC, BAD_PC);
7871 }
7872
c19d1205
ZW
7873 inst.instruction |= inst.operands[0].reg << 8;
7874 inst.instruction |= inst.operands[1].imm << 4;
fdfde340
JM
7875 inst.instruction |= Rd << 12;
7876 inst.instruction |= Rn << 16;
c19d1205 7877 inst.instruction |= inst.operands[4].reg;
b99bd4ef
NC
7878}
7879
c19d1205
ZW
7880static void
7881do_cpsi (void)
7882{
7883 inst.instruction |= inst.operands[0].imm << 6;
a028a6f5
PB
7884 if (inst.operands[1].present)
7885 {
7886 inst.instruction |= CPSI_MMOD;
7887 inst.instruction |= inst.operands[1].imm;
7888 }
c19d1205 7889}
b99bd4ef 7890
62b3e311
PB
7891static void
7892do_dbg (void)
7893{
7894 inst.instruction |= inst.operands[0].imm;
7895}
7896
eea54501
MGD
7897static void
7898do_div (void)
7899{
7900 unsigned Rd, Rn, Rm;
7901
7902 Rd = inst.operands[0].reg;
7903 Rn = (inst.operands[1].present
7904 ? inst.operands[1].reg : Rd);
7905 Rm = inst.operands[2].reg;
7906
7907 constraint ((Rd == REG_PC), BAD_PC);
7908 constraint ((Rn == REG_PC), BAD_PC);
7909 constraint ((Rm == REG_PC), BAD_PC);
7910
7911 inst.instruction |= Rd << 16;
7912 inst.instruction |= Rn << 0;
7913 inst.instruction |= Rm << 8;
7914}
7915
b99bd4ef 7916static void
c19d1205 7917do_it (void)
b99bd4ef 7918{
c19d1205 7919 /* There is no IT instruction in ARM mode. We
e07e6e58
NC
7920 process it to do the validation as if in
7921 thumb mode, just in case the code gets
7922 assembled for thumb using the unified syntax. */
7923
c19d1205 7924 inst.size = 0;
e07e6e58
NC
7925 if (unified_syntax)
7926 {
7927 set_it_insn_type (IT_INSN);
7928 now_it.mask = (inst.instruction & 0xf) | 0x10;
7929 now_it.cc = inst.operands[0].imm;
7930 }
09d92015 7931}
b99bd4ef 7932
6530b175
NC
7933/* If there is only one register in the register list,
7934 then return its register number. Otherwise return -1. */
7935static int
7936only_one_reg_in_list (int range)
7937{
7938 int i = ffs (range) - 1;
7939 return (i > 15 || range != (1 << i)) ? -1 : i;
7940}
7941
09d92015 7942static void
6530b175 7943encode_ldmstm(int from_push_pop_mnem)
ea6ef066 7944{
c19d1205
ZW
7945 int base_reg = inst.operands[0].reg;
7946 int range = inst.operands[1].imm;
6530b175 7947 int one_reg;
ea6ef066 7948
c19d1205
ZW
7949 inst.instruction |= base_reg << 16;
7950 inst.instruction |= range;
ea6ef066 7951
c19d1205
ZW
7952 if (inst.operands[1].writeback)
7953 inst.instruction |= LDM_TYPE_2_OR_3;
09d92015 7954
c19d1205 7955 if (inst.operands[0].writeback)
ea6ef066 7956 {
c19d1205
ZW
7957 inst.instruction |= WRITE_BACK;
7958 /* Check for unpredictable uses of writeback. */
7959 if (inst.instruction & LOAD_BIT)
09d92015 7960 {
c19d1205
ZW
7961 /* Not allowed in LDM type 2. */
7962 if ((inst.instruction & LDM_TYPE_2_OR_3)
7963 && ((range & (1 << REG_PC)) == 0))
7964 as_warn (_("writeback of base register is UNPREDICTABLE"));
7965 /* Only allowed if base reg not in list for other types. */
7966 else if (range & (1 << base_reg))
7967 as_warn (_("writeback of base register when in register list is UNPREDICTABLE"));
7968 }
7969 else /* STM. */
7970 {
7971 /* Not allowed for type 2. */
7972 if (inst.instruction & LDM_TYPE_2_OR_3)
7973 as_warn (_("writeback of base register is UNPREDICTABLE"));
7974 /* Only allowed if base reg not in list, or first in list. */
7975 else if ((range & (1 << base_reg))
7976 && (range & ((1 << base_reg) - 1)))
7977 as_warn (_("if writeback register is in list, it must be the lowest reg in the list"));
09d92015 7978 }
ea6ef066 7979 }
6530b175
NC
7980
7981 /* If PUSH/POP has only one register, then use the A2 encoding. */
7982 one_reg = only_one_reg_in_list (range);
7983 if (from_push_pop_mnem && one_reg >= 0)
7984 {
7985 int is_push = (inst.instruction & A_PUSH_POP_OP_MASK) == A1_OPCODE_PUSH;
7986
7987 inst.instruction &= A_COND_MASK;
7988 inst.instruction |= is_push ? A2_OPCODE_PUSH : A2_OPCODE_POP;
7989 inst.instruction |= one_reg << 12;
7990 }
7991}
7992
7993static void
7994do_ldmstm (void)
7995{
7996 encode_ldmstm (/*from_push_pop_mnem=*/FALSE);
a737bd4d
NC
7997}
7998
c19d1205
ZW
7999/* ARMv5TE load-consecutive (argument parse)
8000 Mode is like LDRH.
8001
8002 LDRccD R, mode
8003 STRccD R, mode. */
8004
a737bd4d 8005static void
c19d1205 8006do_ldrd (void)
a737bd4d 8007{
c19d1205 8008 constraint (inst.operands[0].reg % 2 != 0,
c56791bb 8009 _("first transfer register must be even"));
c19d1205
ZW
8010 constraint (inst.operands[1].present
8011 && inst.operands[1].reg != inst.operands[0].reg + 1,
c56791bb 8012 _("can only transfer two consecutive registers"));
c19d1205
ZW
8013 constraint (inst.operands[0].reg == REG_LR, _("r14 not allowed here"));
8014 constraint (!inst.operands[2].isreg, _("'[' expected"));
a737bd4d 8015
c19d1205
ZW
8016 if (!inst.operands[1].present)
8017 inst.operands[1].reg = inst.operands[0].reg + 1;
5f4273c7 8018
c56791bb
RE
8019 /* encode_arm_addr_mode_3 will diagnose overlap between the base
8020 register and the first register written; we have to diagnose
8021 overlap between the base and the second register written here. */
ea6ef066 8022
c56791bb
RE
8023 if (inst.operands[2].reg == inst.operands[1].reg
8024 && (inst.operands[2].writeback || inst.operands[2].postind))
8025 as_warn (_("base register written back, and overlaps "
8026 "second transfer register"));
b05fe5cf 8027
c56791bb
RE
8028 if (!(inst.instruction & V4_STR_BIT))
8029 {
c19d1205 8030 /* For an index-register load, the index register must not overlap the
c56791bb
RE
8031 destination (even if not write-back). */
8032 if (inst.operands[2].immisreg
8033 && ((unsigned) inst.operands[2].imm == inst.operands[0].reg
8034 || (unsigned) inst.operands[2].imm == inst.operands[1].reg))
8035 as_warn (_("index register overlaps transfer register"));
b05fe5cf 8036 }
c19d1205
ZW
8037 inst.instruction |= inst.operands[0].reg << 12;
8038 encode_arm_addr_mode_3 (2, /*is_t=*/FALSE);
b05fe5cf
ZW
8039}
8040
8041static void
c19d1205 8042do_ldrex (void)
b05fe5cf 8043{
c19d1205
ZW
8044 constraint (!inst.operands[1].isreg || !inst.operands[1].preind
8045 || inst.operands[1].postind || inst.operands[1].writeback
8046 || inst.operands[1].immisreg || inst.operands[1].shifted
01cfc07f
NC
8047 || inst.operands[1].negative
8048 /* This can arise if the programmer has written
8049 strex rN, rM, foo
8050 or if they have mistakenly used a register name as the last
8051 operand, eg:
8052 strex rN, rM, rX
8053 It is very difficult to distinguish between these two cases
8054 because "rX" might actually be a label. ie the register
8055 name has been occluded by a symbol of the same name. So we
8056 just generate a general 'bad addressing mode' type error
8057 message and leave it up to the programmer to discover the
8058 true cause and fix their mistake. */
8059 || (inst.operands[1].reg == REG_PC),
8060 BAD_ADDR_MODE);
b05fe5cf 8061
c19d1205
ZW
8062 constraint (inst.reloc.exp.X_op != O_constant
8063 || inst.reloc.exp.X_add_number != 0,
8064 _("offset must be zero in ARM encoding"));
b05fe5cf 8065
5be8be5d
DG
8066 constraint ((inst.operands[1].reg == REG_PC), BAD_PC);
8067
c19d1205
ZW
8068 inst.instruction |= inst.operands[0].reg << 12;
8069 inst.instruction |= inst.operands[1].reg << 16;
8070 inst.reloc.type = BFD_RELOC_UNUSED;
b05fe5cf
ZW
8071}
8072
8073static void
c19d1205 8074do_ldrexd (void)
b05fe5cf 8075{
c19d1205
ZW
8076 constraint (inst.operands[0].reg % 2 != 0,
8077 _("even register required"));
8078 constraint (inst.operands[1].present
8079 && inst.operands[1].reg != inst.operands[0].reg + 1,
8080 _("can only load two consecutive registers"));
8081 /* If op 1 were present and equal to PC, this function wouldn't
8082 have been called in the first place. */
8083 constraint (inst.operands[0].reg == REG_LR, _("r14 not allowed here"));
b05fe5cf 8084
c19d1205
ZW
8085 inst.instruction |= inst.operands[0].reg << 12;
8086 inst.instruction |= inst.operands[2].reg << 16;
b05fe5cf
ZW
8087}
8088
1be5fd2e
NC
8089/* In both ARM and thumb state 'ldr pc, #imm' with an immediate
8090 which is not a multiple of four is UNPREDICTABLE. */
8091static void
8092check_ldr_r15_aligned (void)
8093{
8094 constraint (!(inst.operands[1].immisreg)
8095 && (inst.operands[0].reg == REG_PC
8096 && inst.operands[1].reg == REG_PC
8097 && (inst.reloc.exp.X_add_number & 0x3)),
8098 _("ldr to register 15 must be 4-byte alligned"));
8099}
8100
b05fe5cf 8101static void
c19d1205 8102do_ldst (void)
b05fe5cf 8103{
c19d1205
ZW
8104 inst.instruction |= inst.operands[0].reg << 12;
8105 if (!inst.operands[1].isreg)
8106 if (move_or_literal_pool (0, /*thumb_p=*/FALSE, /*mode_3=*/FALSE))
b05fe5cf 8107 return;
c19d1205 8108 encode_arm_addr_mode_2 (1, /*is_t=*/FALSE);
1be5fd2e 8109 check_ldr_r15_aligned ();
b05fe5cf
ZW
8110}
8111
8112static void
c19d1205 8113do_ldstt (void)
b05fe5cf 8114{
c19d1205
ZW
8115 /* ldrt/strt always use post-indexed addressing. Turn [Rn] into [Rn]! and
8116 reject [Rn,...]. */
8117 if (inst.operands[1].preind)
b05fe5cf 8118 {
bd3ba5d1
NC
8119 constraint (inst.reloc.exp.X_op != O_constant
8120 || inst.reloc.exp.X_add_number != 0,
c19d1205 8121 _("this instruction requires a post-indexed address"));
b05fe5cf 8122
c19d1205
ZW
8123 inst.operands[1].preind = 0;
8124 inst.operands[1].postind = 1;
8125 inst.operands[1].writeback = 1;
b05fe5cf 8126 }
c19d1205
ZW
8127 inst.instruction |= inst.operands[0].reg << 12;
8128 encode_arm_addr_mode_2 (1, /*is_t=*/TRUE);
8129}
b05fe5cf 8130
c19d1205 8131/* Halfword and signed-byte load/store operations. */
b05fe5cf 8132
c19d1205
ZW
8133static void
8134do_ldstv4 (void)
8135{
ff4a8d2b 8136 constraint (inst.operands[0].reg == REG_PC, BAD_PC);
c19d1205
ZW
8137 inst.instruction |= inst.operands[0].reg << 12;
8138 if (!inst.operands[1].isreg)
8139 if (move_or_literal_pool (0, /*thumb_p=*/FALSE, /*mode_3=*/TRUE))
b05fe5cf 8140 return;
c19d1205 8141 encode_arm_addr_mode_3 (1, /*is_t=*/FALSE);
b05fe5cf
ZW
8142}
8143
8144static void
c19d1205 8145do_ldsttv4 (void)
b05fe5cf 8146{
c19d1205
ZW
8147 /* ldrt/strt always use post-indexed addressing. Turn [Rn] into [Rn]! and
8148 reject [Rn,...]. */
8149 if (inst.operands[1].preind)
b05fe5cf 8150 {
bd3ba5d1
NC
8151 constraint (inst.reloc.exp.X_op != O_constant
8152 || inst.reloc.exp.X_add_number != 0,
c19d1205 8153 _("this instruction requires a post-indexed address"));
b05fe5cf 8154
c19d1205
ZW
8155 inst.operands[1].preind = 0;
8156 inst.operands[1].postind = 1;
8157 inst.operands[1].writeback = 1;
b05fe5cf 8158 }
c19d1205
ZW
8159 inst.instruction |= inst.operands[0].reg << 12;
8160 encode_arm_addr_mode_3 (1, /*is_t=*/TRUE);
8161}
b05fe5cf 8162
c19d1205
ZW
8163/* Co-processor register load/store.
8164 Format: <LDC|STC>{cond}[L] CP#,CRd,<address> */
8165static void
8166do_lstc (void)
8167{
8168 inst.instruction |= inst.operands[0].reg << 8;
8169 inst.instruction |= inst.operands[1].reg << 12;
8170 encode_arm_cp_address (2, TRUE, TRUE, 0);
b05fe5cf
ZW
8171}
8172
b05fe5cf 8173static void
c19d1205 8174do_mlas (void)
b05fe5cf 8175{
8fb9d7b9 8176 /* This restriction does not apply to mls (nor to mla in v6 or later). */
c19d1205 8177 if (inst.operands[0].reg == inst.operands[1].reg
8fb9d7b9 8178 && !ARM_CPU_HAS_FEATURE (selected_cpu, arm_ext_v6)
c19d1205 8179 && !(inst.instruction & 0x00400000))
8fb9d7b9 8180 as_tsktsk (_("Rd and Rm should be different in mla"));
b05fe5cf 8181
c19d1205
ZW
8182 inst.instruction |= inst.operands[0].reg << 16;
8183 inst.instruction |= inst.operands[1].reg;
8184 inst.instruction |= inst.operands[2].reg << 8;
8185 inst.instruction |= inst.operands[3].reg << 12;
c19d1205 8186}
b05fe5cf 8187
c19d1205
ZW
8188static void
8189do_mov (void)
8190{
8191 inst.instruction |= inst.operands[0].reg << 12;
8192 encode_arm_shifter_operand (1);
8193}
b05fe5cf 8194
c19d1205
ZW
8195/* ARM V6T2 16-bit immediate register load: MOV[WT]{cond} Rd, #<imm16>. */
8196static void
8197do_mov16 (void)
8198{
b6895b4f
PB
8199 bfd_vma imm;
8200 bfd_boolean top;
8201
8202 top = (inst.instruction & 0x00400000) != 0;
8203 constraint (top && inst.reloc.type == BFD_RELOC_ARM_MOVW,
8204 _(":lower16: not allowed this instruction"));
8205 constraint (!top && inst.reloc.type == BFD_RELOC_ARM_MOVT,
8206 _(":upper16: not allowed instruction"));
c19d1205 8207 inst.instruction |= inst.operands[0].reg << 12;
b6895b4f
PB
8208 if (inst.reloc.type == BFD_RELOC_UNUSED)
8209 {
8210 imm = inst.reloc.exp.X_add_number;
8211 /* The value is in two pieces: 0:11, 16:19. */
8212 inst.instruction |= (imm & 0x00000fff);
8213 inst.instruction |= (imm & 0x0000f000) << 4;
8214 }
b05fe5cf 8215}
b99bd4ef 8216
037e8744
JB
8217static void do_vfp_nsyn_opcode (const char *);
8218
8219static int
8220do_vfp_nsyn_mrs (void)
8221{
8222 if (inst.operands[0].isvec)
8223 {
8224 if (inst.operands[1].reg != 1)
477330fc 8225 first_error (_("operand 1 must be FPSCR"));
037e8744
JB
8226 memset (&inst.operands[0], '\0', sizeof (inst.operands[0]));
8227 memset (&inst.operands[1], '\0', sizeof (inst.operands[1]));
8228 do_vfp_nsyn_opcode ("fmstat");
8229 }
8230 else if (inst.operands[1].isvec)
8231 do_vfp_nsyn_opcode ("fmrx");
8232 else
8233 return FAIL;
5f4273c7 8234
037e8744
JB
8235 return SUCCESS;
8236}
8237
8238static int
8239do_vfp_nsyn_msr (void)
8240{
8241 if (inst.operands[0].isvec)
8242 do_vfp_nsyn_opcode ("fmxr");
8243 else
8244 return FAIL;
8245
8246 return SUCCESS;
8247}
8248
f7c21dc7
NC
8249static void
8250do_vmrs (void)
8251{
8252 unsigned Rt = inst.operands[0].reg;
fa94de6b 8253
16d02dc9 8254 if (thumb_mode && Rt == REG_SP)
f7c21dc7
NC
8255 {
8256 inst.error = BAD_SP;
8257 return;
8258 }
8259
8260 /* APSR_ sets isvec. All other refs to PC are illegal. */
16d02dc9 8261 if (!inst.operands[0].isvec && Rt == REG_PC)
f7c21dc7
NC
8262 {
8263 inst.error = BAD_PC;
8264 return;
8265 }
8266
16d02dc9
JB
8267 /* If we get through parsing the register name, we just insert the number
8268 generated into the instruction without further validation. */
8269 inst.instruction |= (inst.operands[1].reg << 16);
f7c21dc7
NC
8270 inst.instruction |= (Rt << 12);
8271}
8272
8273static void
8274do_vmsr (void)
8275{
8276 unsigned Rt = inst.operands[1].reg;
fa94de6b 8277
f7c21dc7
NC
8278 if (thumb_mode)
8279 reject_bad_reg (Rt);
8280 else if (Rt == REG_PC)
8281 {
8282 inst.error = BAD_PC;
8283 return;
8284 }
8285
16d02dc9
JB
8286 /* If we get through parsing the register name, we just insert the number
8287 generated into the instruction without further validation. */
8288 inst.instruction |= (inst.operands[0].reg << 16);
f7c21dc7
NC
8289 inst.instruction |= (Rt << 12);
8290}
8291
b99bd4ef 8292static void
c19d1205 8293do_mrs (void)
b99bd4ef 8294{
90ec0d68
MGD
8295 unsigned br;
8296
037e8744
JB
8297 if (do_vfp_nsyn_mrs () == SUCCESS)
8298 return;
8299
ff4a8d2b 8300 constraint (inst.operands[0].reg == REG_PC, BAD_PC);
c19d1205 8301 inst.instruction |= inst.operands[0].reg << 12;
90ec0d68
MGD
8302
8303 if (inst.operands[1].isreg)
8304 {
8305 br = inst.operands[1].reg;
8306 if (((br & 0x200) == 0) && ((br & 0xf0000) != 0xf000))
8307 as_bad (_("bad register for mrs"));
8308 }
8309 else
8310 {
8311 /* mrs only accepts CPSR/SPSR/CPSR_all/SPSR_all. */
8312 constraint ((inst.operands[1].imm & (PSR_c|PSR_x|PSR_s|PSR_f))
8313 != (PSR_c|PSR_f),
d2cd1205 8314 _("'APSR', 'CPSR' or 'SPSR' expected"));
90ec0d68
MGD
8315 br = (15<<16) | (inst.operands[1].imm & SPSR_BIT);
8316 }
8317
8318 inst.instruction |= br;
c19d1205 8319}
b99bd4ef 8320
c19d1205
ZW
8321/* Two possible forms:
8322 "{C|S}PSR_<field>, Rm",
8323 "{C|S}PSR_f, #expression". */
b99bd4ef 8324
c19d1205
ZW
8325static void
8326do_msr (void)
8327{
037e8744
JB
8328 if (do_vfp_nsyn_msr () == SUCCESS)
8329 return;
8330
c19d1205
ZW
8331 inst.instruction |= inst.operands[0].imm;
8332 if (inst.operands[1].isreg)
8333 inst.instruction |= inst.operands[1].reg;
8334 else
b99bd4ef 8335 {
c19d1205
ZW
8336 inst.instruction |= INST_IMMEDIATE;
8337 inst.reloc.type = BFD_RELOC_ARM_IMMEDIATE;
8338 inst.reloc.pc_rel = 0;
b99bd4ef 8339 }
b99bd4ef
NC
8340}
8341
c19d1205
ZW
8342static void
8343do_mul (void)
a737bd4d 8344{
ff4a8d2b
NC
8345 constraint (inst.operands[2].reg == REG_PC, BAD_PC);
8346
c19d1205
ZW
8347 if (!inst.operands[2].present)
8348 inst.operands[2].reg = inst.operands[0].reg;
8349 inst.instruction |= inst.operands[0].reg << 16;
8350 inst.instruction |= inst.operands[1].reg;
8351 inst.instruction |= inst.operands[2].reg << 8;
a737bd4d 8352
8fb9d7b9
MS
8353 if (inst.operands[0].reg == inst.operands[1].reg
8354 && !ARM_CPU_HAS_FEATURE (selected_cpu, arm_ext_v6))
8355 as_tsktsk (_("Rd and Rm should be different in mul"));
a737bd4d
NC
8356}
8357
c19d1205
ZW
8358/* Long Multiply Parser
8359 UMULL RdLo, RdHi, Rm, Rs
8360 SMULL RdLo, RdHi, Rm, Rs
8361 UMLAL RdLo, RdHi, Rm, Rs
8362 SMLAL RdLo, RdHi, Rm, Rs. */
b99bd4ef
NC
8363
8364static void
c19d1205 8365do_mull (void)
b99bd4ef 8366{
c19d1205
ZW
8367 inst.instruction |= inst.operands[0].reg << 12;
8368 inst.instruction |= inst.operands[1].reg << 16;
8369 inst.instruction |= inst.operands[2].reg;
8370 inst.instruction |= inst.operands[3].reg << 8;
b99bd4ef 8371
682b27ad
PB
8372 /* rdhi and rdlo must be different. */
8373 if (inst.operands[0].reg == inst.operands[1].reg)
8374 as_tsktsk (_("rdhi and rdlo must be different"));
8375
8376 /* rdhi, rdlo and rm must all be different before armv6. */
8377 if ((inst.operands[0].reg == inst.operands[2].reg
c19d1205 8378 || inst.operands[1].reg == inst.operands[2].reg)
682b27ad 8379 && !ARM_CPU_HAS_FEATURE (selected_cpu, arm_ext_v6))
c19d1205
ZW
8380 as_tsktsk (_("rdhi, rdlo and rm must all be different"));
8381}
b99bd4ef 8382
c19d1205
ZW
8383static void
8384do_nop (void)
8385{
e7495e45
NS
8386 if (inst.operands[0].present
8387 || ARM_CPU_HAS_FEATURE (selected_cpu, arm_ext_v6k))
c19d1205
ZW
8388 {
8389 /* Architectural NOP hints are CPSR sets with no bits selected. */
8390 inst.instruction &= 0xf0000000;
e7495e45
NS
8391 inst.instruction |= 0x0320f000;
8392 if (inst.operands[0].present)
8393 inst.instruction |= inst.operands[0].imm;
c19d1205 8394 }
b99bd4ef
NC
8395}
8396
c19d1205
ZW
8397/* ARM V6 Pack Halfword Bottom Top instruction (argument parse).
8398 PKHBT {<cond>} <Rd>, <Rn>, <Rm> {, LSL #<shift_imm>}
8399 Condition defaults to COND_ALWAYS.
8400 Error if Rd, Rn or Rm are R15. */
b99bd4ef
NC
8401
8402static void
c19d1205 8403do_pkhbt (void)
b99bd4ef 8404{
c19d1205
ZW
8405 inst.instruction |= inst.operands[0].reg << 12;
8406 inst.instruction |= inst.operands[1].reg << 16;
8407 inst.instruction |= inst.operands[2].reg;
8408 if (inst.operands[3].present)
8409 encode_arm_shift (3);
8410}
b99bd4ef 8411
c19d1205 8412/* ARM V6 PKHTB (Argument Parse). */
b99bd4ef 8413
c19d1205
ZW
8414static void
8415do_pkhtb (void)
8416{
8417 if (!inst.operands[3].present)
b99bd4ef 8418 {
c19d1205
ZW
8419 /* If the shift specifier is omitted, turn the instruction
8420 into pkhbt rd, rm, rn. */
8421 inst.instruction &= 0xfff00010;
8422 inst.instruction |= inst.operands[0].reg << 12;
8423 inst.instruction |= inst.operands[1].reg;
8424 inst.instruction |= inst.operands[2].reg << 16;
b99bd4ef
NC
8425 }
8426 else
8427 {
c19d1205
ZW
8428 inst.instruction |= inst.operands[0].reg << 12;
8429 inst.instruction |= inst.operands[1].reg << 16;
8430 inst.instruction |= inst.operands[2].reg;
8431 encode_arm_shift (3);
b99bd4ef
NC
8432 }
8433}
8434
c19d1205 8435/* ARMv5TE: Preload-Cache
60e5ef9f 8436 MP Extensions: Preload for write
c19d1205 8437
60e5ef9f 8438 PLD(W) <addr_mode>
c19d1205
ZW
8439
8440 Syntactically, like LDR with B=1, W=0, L=1. */
b99bd4ef
NC
8441
8442static void
c19d1205 8443do_pld (void)
b99bd4ef 8444{
c19d1205
ZW
8445 constraint (!inst.operands[0].isreg,
8446 _("'[' expected after PLD mnemonic"));
8447 constraint (inst.operands[0].postind,
8448 _("post-indexed expression used in preload instruction"));
8449 constraint (inst.operands[0].writeback,
8450 _("writeback used in preload instruction"));
8451 constraint (!inst.operands[0].preind,
8452 _("unindexed addressing used in preload instruction"));
c19d1205
ZW
8453 encode_arm_addr_mode_2 (0, /*is_t=*/FALSE);
8454}
b99bd4ef 8455
62b3e311
PB
8456/* ARMv7: PLI <addr_mode> */
8457static void
8458do_pli (void)
8459{
8460 constraint (!inst.operands[0].isreg,
8461 _("'[' expected after PLI mnemonic"));
8462 constraint (inst.operands[0].postind,
8463 _("post-indexed expression used in preload instruction"));
8464 constraint (inst.operands[0].writeback,
8465 _("writeback used in preload instruction"));
8466 constraint (!inst.operands[0].preind,
8467 _("unindexed addressing used in preload instruction"));
8468 encode_arm_addr_mode_2 (0, /*is_t=*/FALSE);
8469 inst.instruction &= ~PRE_INDEX;
8470}
8471
c19d1205
ZW
8472static void
8473do_push_pop (void)
8474{
8475 inst.operands[1] = inst.operands[0];
8476 memset (&inst.operands[0], 0, sizeof inst.operands[0]);
8477 inst.operands[0].isreg = 1;
8478 inst.operands[0].writeback = 1;
8479 inst.operands[0].reg = REG_SP;
6530b175 8480 encode_ldmstm (/*from_push_pop_mnem=*/TRUE);
c19d1205 8481}
b99bd4ef 8482
c19d1205
ZW
8483/* ARM V6 RFE (Return from Exception) loads the PC and CPSR from the
8484 word at the specified address and the following word
8485 respectively.
8486 Unconditionally executed.
8487 Error if Rn is R15. */
b99bd4ef 8488
c19d1205
ZW
8489static void
8490do_rfe (void)
8491{
8492 inst.instruction |= inst.operands[0].reg << 16;
8493 if (inst.operands[0].writeback)
8494 inst.instruction |= WRITE_BACK;
8495}
b99bd4ef 8496
c19d1205 8497/* ARM V6 ssat (argument parse). */
b99bd4ef 8498
c19d1205
ZW
8499static void
8500do_ssat (void)
8501{
8502 inst.instruction |= inst.operands[0].reg << 12;
8503 inst.instruction |= (inst.operands[1].imm - 1) << 16;
8504 inst.instruction |= inst.operands[2].reg;
b99bd4ef 8505
c19d1205
ZW
8506 if (inst.operands[3].present)
8507 encode_arm_shift (3);
b99bd4ef
NC
8508}
8509
c19d1205 8510/* ARM V6 usat (argument parse). */
b99bd4ef
NC
8511
8512static void
c19d1205 8513do_usat (void)
b99bd4ef 8514{
c19d1205
ZW
8515 inst.instruction |= inst.operands[0].reg << 12;
8516 inst.instruction |= inst.operands[1].imm << 16;
8517 inst.instruction |= inst.operands[2].reg;
b99bd4ef 8518
c19d1205
ZW
8519 if (inst.operands[3].present)
8520 encode_arm_shift (3);
b99bd4ef
NC
8521}
8522
c19d1205 8523/* ARM V6 ssat16 (argument parse). */
09d92015
MM
8524
8525static void
c19d1205 8526do_ssat16 (void)
09d92015 8527{
c19d1205
ZW
8528 inst.instruction |= inst.operands[0].reg << 12;
8529 inst.instruction |= ((inst.operands[1].imm - 1) << 16);
8530 inst.instruction |= inst.operands[2].reg;
09d92015
MM
8531}
8532
c19d1205
ZW
8533static void
8534do_usat16 (void)
a737bd4d 8535{
c19d1205
ZW
8536 inst.instruction |= inst.operands[0].reg << 12;
8537 inst.instruction |= inst.operands[1].imm << 16;
8538 inst.instruction |= inst.operands[2].reg;
8539}
a737bd4d 8540
c19d1205
ZW
8541/* ARM V6 SETEND (argument parse). Sets the E bit in the CPSR while
8542 preserving the other bits.
a737bd4d 8543
c19d1205
ZW
8544 setend <endian_specifier>, where <endian_specifier> is either
8545 BE or LE. */
a737bd4d 8546
c19d1205
ZW
8547static void
8548do_setend (void)
8549{
12e37cbc
MGD
8550 if (warn_on_deprecated
8551 && ARM_CPU_HAS_FEATURE (cpu_variant, arm_ext_v8))
8552 as_warn (_("setend use is deprecated for ARMv8"));
8553
c19d1205
ZW
8554 if (inst.operands[0].imm)
8555 inst.instruction |= 0x200;
a737bd4d
NC
8556}
8557
8558static void
c19d1205 8559do_shift (void)
a737bd4d 8560{
c19d1205
ZW
8561 unsigned int Rm = (inst.operands[1].present
8562 ? inst.operands[1].reg
8563 : inst.operands[0].reg);
a737bd4d 8564
c19d1205
ZW
8565 inst.instruction |= inst.operands[0].reg << 12;
8566 inst.instruction |= Rm;
8567 if (inst.operands[2].isreg) /* Rd, {Rm,} Rs */
a737bd4d 8568 {
c19d1205
ZW
8569 inst.instruction |= inst.operands[2].reg << 8;
8570 inst.instruction |= SHIFT_BY_REG;
94342ec3
NC
8571 /* PR 12854: Error on extraneous shifts. */
8572 constraint (inst.operands[2].shifted,
8573 _("extraneous shift as part of operand to shift insn"));
a737bd4d
NC
8574 }
8575 else
c19d1205 8576 inst.reloc.type = BFD_RELOC_ARM_SHIFT_IMM;
a737bd4d
NC
8577}
8578
09d92015 8579static void
3eb17e6b 8580do_smc (void)
09d92015 8581{
3eb17e6b 8582 inst.reloc.type = BFD_RELOC_ARM_SMC;
c19d1205 8583 inst.reloc.pc_rel = 0;
09d92015
MM
8584}
8585
90ec0d68
MGD
8586static void
8587do_hvc (void)
8588{
8589 inst.reloc.type = BFD_RELOC_ARM_HVC;
8590 inst.reloc.pc_rel = 0;
8591}
8592
09d92015 8593static void
c19d1205 8594do_swi (void)
09d92015 8595{
c19d1205
ZW
8596 inst.reloc.type = BFD_RELOC_ARM_SWI;
8597 inst.reloc.pc_rel = 0;
09d92015
MM
8598}
8599
c19d1205
ZW
8600/* ARM V5E (El Segundo) signed-multiply-accumulate (argument parse)
8601 SMLAxy{cond} Rd,Rm,Rs,Rn
8602 SMLAWy{cond} Rd,Rm,Rs,Rn
8603 Error if any register is R15. */
e16bb312 8604
c19d1205
ZW
8605static void
8606do_smla (void)
e16bb312 8607{
c19d1205
ZW
8608 inst.instruction |= inst.operands[0].reg << 16;
8609 inst.instruction |= inst.operands[1].reg;
8610 inst.instruction |= inst.operands[2].reg << 8;
8611 inst.instruction |= inst.operands[3].reg << 12;
8612}
a737bd4d 8613
c19d1205
ZW
8614/* ARM V5E (El Segundo) signed-multiply-accumulate-long (argument parse)
8615 SMLALxy{cond} Rdlo,Rdhi,Rm,Rs
8616 Error if any register is R15.
8617 Warning if Rdlo == Rdhi. */
a737bd4d 8618
c19d1205
ZW
8619static void
8620do_smlal (void)
8621{
8622 inst.instruction |= inst.operands[0].reg << 12;
8623 inst.instruction |= inst.operands[1].reg << 16;
8624 inst.instruction |= inst.operands[2].reg;
8625 inst.instruction |= inst.operands[3].reg << 8;
a737bd4d 8626
c19d1205
ZW
8627 if (inst.operands[0].reg == inst.operands[1].reg)
8628 as_tsktsk (_("rdhi and rdlo must be different"));
8629}
a737bd4d 8630
c19d1205
ZW
8631/* ARM V5E (El Segundo) signed-multiply (argument parse)
8632 SMULxy{cond} Rd,Rm,Rs
8633 Error if any register is R15. */
a737bd4d 8634
c19d1205
ZW
8635static void
8636do_smul (void)
8637{
8638 inst.instruction |= inst.operands[0].reg << 16;
8639 inst.instruction |= inst.operands[1].reg;
8640 inst.instruction |= inst.operands[2].reg << 8;
8641}
a737bd4d 8642
b6702015
PB
8643/* ARM V6 srs (argument parse). The variable fields in the encoding are
8644 the same for both ARM and Thumb-2. */
a737bd4d 8645
c19d1205
ZW
8646static void
8647do_srs (void)
8648{
b6702015
PB
8649 int reg;
8650
8651 if (inst.operands[0].present)
8652 {
8653 reg = inst.operands[0].reg;
fdfde340 8654 constraint (reg != REG_SP, _("SRS base register must be r13"));
b6702015
PB
8655 }
8656 else
fdfde340 8657 reg = REG_SP;
b6702015
PB
8658
8659 inst.instruction |= reg << 16;
8660 inst.instruction |= inst.operands[1].imm;
8661 if (inst.operands[0].writeback || inst.operands[1].writeback)
c19d1205
ZW
8662 inst.instruction |= WRITE_BACK;
8663}
a737bd4d 8664
c19d1205 8665/* ARM V6 strex (argument parse). */
a737bd4d 8666
c19d1205
ZW
8667static void
8668do_strex (void)
8669{
8670 constraint (!inst.operands[2].isreg || !inst.operands[2].preind
8671 || inst.operands[2].postind || inst.operands[2].writeback
8672 || inst.operands[2].immisreg || inst.operands[2].shifted
01cfc07f
NC
8673 || inst.operands[2].negative
8674 /* See comment in do_ldrex(). */
8675 || (inst.operands[2].reg == REG_PC),
8676 BAD_ADDR_MODE);
a737bd4d 8677
c19d1205
ZW
8678 constraint (inst.operands[0].reg == inst.operands[1].reg
8679 || inst.operands[0].reg == inst.operands[2].reg, BAD_OVERLAP);
a737bd4d 8680
c19d1205
ZW
8681 constraint (inst.reloc.exp.X_op != O_constant
8682 || inst.reloc.exp.X_add_number != 0,
8683 _("offset must be zero in ARM encoding"));
a737bd4d 8684
c19d1205
ZW
8685 inst.instruction |= inst.operands[0].reg << 12;
8686 inst.instruction |= inst.operands[1].reg;
8687 inst.instruction |= inst.operands[2].reg << 16;
8688 inst.reloc.type = BFD_RELOC_UNUSED;
e16bb312
NC
8689}
8690
877807f8
NC
8691static void
8692do_t_strexbh (void)
8693{
8694 constraint (!inst.operands[2].isreg || !inst.operands[2].preind
8695 || inst.operands[2].postind || inst.operands[2].writeback
8696 || inst.operands[2].immisreg || inst.operands[2].shifted
8697 || inst.operands[2].negative,
8698 BAD_ADDR_MODE);
8699
8700 constraint (inst.operands[0].reg == inst.operands[1].reg
8701 || inst.operands[0].reg == inst.operands[2].reg, BAD_OVERLAP);
8702
8703 do_rm_rd_rn ();
8704}
8705
e16bb312 8706static void
c19d1205 8707do_strexd (void)
e16bb312 8708{
c19d1205
ZW
8709 constraint (inst.operands[1].reg % 2 != 0,
8710 _("even register required"));
8711 constraint (inst.operands[2].present
8712 && inst.operands[2].reg != inst.operands[1].reg + 1,
8713 _("can only store two consecutive registers"));
8714 /* If op 2 were present and equal to PC, this function wouldn't
8715 have been called in the first place. */
8716 constraint (inst.operands[1].reg == REG_LR, _("r14 not allowed here"));
e16bb312 8717
c19d1205
ZW
8718 constraint (inst.operands[0].reg == inst.operands[1].reg
8719 || inst.operands[0].reg == inst.operands[1].reg + 1
8720 || inst.operands[0].reg == inst.operands[3].reg,
8721 BAD_OVERLAP);
e16bb312 8722
c19d1205
ZW
8723 inst.instruction |= inst.operands[0].reg << 12;
8724 inst.instruction |= inst.operands[1].reg;
8725 inst.instruction |= inst.operands[3].reg << 16;
e16bb312
NC
8726}
8727
9eb6c0f1
MGD
8728/* ARM V8 STRL. */
8729static void
4b8c8c02 8730do_stlex (void)
9eb6c0f1
MGD
8731{
8732 constraint (inst.operands[0].reg == inst.operands[1].reg
8733 || inst.operands[0].reg == inst.operands[2].reg, BAD_OVERLAP);
8734
8735 do_rd_rm_rn ();
8736}
8737
8738static void
4b8c8c02 8739do_t_stlex (void)
9eb6c0f1
MGD
8740{
8741 constraint (inst.operands[0].reg == inst.operands[1].reg
8742 || inst.operands[0].reg == inst.operands[2].reg, BAD_OVERLAP);
8743
8744 do_rm_rd_rn ();
8745}
8746
c19d1205
ZW
8747/* ARM V6 SXTAH extracts a 16-bit value from a register, sign
8748 extends it to 32-bits, and adds the result to a value in another
8749 register. You can specify a rotation by 0, 8, 16, or 24 bits
8750 before extracting the 16-bit value.
8751 SXTAH{<cond>} <Rd>, <Rn>, <Rm>{, <rotation>}
8752 Condition defaults to COND_ALWAYS.
8753 Error if any register uses R15. */
8754
e16bb312 8755static void
c19d1205 8756do_sxtah (void)
e16bb312 8757{
c19d1205
ZW
8758 inst.instruction |= inst.operands[0].reg << 12;
8759 inst.instruction |= inst.operands[1].reg << 16;
8760 inst.instruction |= inst.operands[2].reg;
8761 inst.instruction |= inst.operands[3].imm << 10;
8762}
e16bb312 8763
c19d1205 8764/* ARM V6 SXTH.
e16bb312 8765
c19d1205
ZW
8766 SXTH {<cond>} <Rd>, <Rm>{, <rotation>}
8767 Condition defaults to COND_ALWAYS.
8768 Error if any register uses R15. */
e16bb312
NC
8769
8770static void
c19d1205 8771do_sxth (void)
e16bb312 8772{
c19d1205
ZW
8773 inst.instruction |= inst.operands[0].reg << 12;
8774 inst.instruction |= inst.operands[1].reg;
8775 inst.instruction |= inst.operands[2].imm << 10;
e16bb312 8776}
c19d1205
ZW
8777\f
8778/* VFP instructions. In a logical order: SP variant first, monad
8779 before dyad, arithmetic then move then load/store. */
e16bb312
NC
8780
8781static void
c19d1205 8782do_vfp_sp_monadic (void)
e16bb312 8783{
5287ad62
JB
8784 encode_arm_vfp_reg (inst.operands[0].reg, VFP_REG_Sd);
8785 encode_arm_vfp_reg (inst.operands[1].reg, VFP_REG_Sm);
e16bb312
NC
8786}
8787
8788static void
c19d1205 8789do_vfp_sp_dyadic (void)
e16bb312 8790{
5287ad62
JB
8791 encode_arm_vfp_reg (inst.operands[0].reg, VFP_REG_Sd);
8792 encode_arm_vfp_reg (inst.operands[1].reg, VFP_REG_Sn);
8793 encode_arm_vfp_reg (inst.operands[2].reg, VFP_REG_Sm);
e16bb312
NC
8794}
8795
8796static void
c19d1205 8797do_vfp_sp_compare_z (void)
e16bb312 8798{
5287ad62 8799 encode_arm_vfp_reg (inst.operands[0].reg, VFP_REG_Sd);
e16bb312
NC
8800}
8801
8802static void
c19d1205 8803do_vfp_dp_sp_cvt (void)
e16bb312 8804{
5287ad62
JB
8805 encode_arm_vfp_reg (inst.operands[0].reg, VFP_REG_Dd);
8806 encode_arm_vfp_reg (inst.operands[1].reg, VFP_REG_Sm);
e16bb312
NC
8807}
8808
8809static void
c19d1205 8810do_vfp_sp_dp_cvt (void)
e16bb312 8811{
5287ad62
JB
8812 encode_arm_vfp_reg (inst.operands[0].reg, VFP_REG_Sd);
8813 encode_arm_vfp_reg (inst.operands[1].reg, VFP_REG_Dm);
e16bb312
NC
8814}
8815
8816static void
c19d1205 8817do_vfp_reg_from_sp (void)
e16bb312 8818{
c19d1205 8819 inst.instruction |= inst.operands[0].reg << 12;
5287ad62 8820 encode_arm_vfp_reg (inst.operands[1].reg, VFP_REG_Sn);
e16bb312
NC
8821}
8822
8823static void
c19d1205 8824do_vfp_reg2_from_sp2 (void)
e16bb312 8825{
c19d1205
ZW
8826 constraint (inst.operands[2].imm != 2,
8827 _("only two consecutive VFP SP registers allowed here"));
8828 inst.instruction |= inst.operands[0].reg << 12;
8829 inst.instruction |= inst.operands[1].reg << 16;
5287ad62 8830 encode_arm_vfp_reg (inst.operands[2].reg, VFP_REG_Sm);
e16bb312
NC
8831}
8832
8833static void
c19d1205 8834do_vfp_sp_from_reg (void)
e16bb312 8835{
5287ad62 8836 encode_arm_vfp_reg (inst.operands[0].reg, VFP_REG_Sn);
c19d1205 8837 inst.instruction |= inst.operands[1].reg << 12;
e16bb312
NC
8838}
8839
8840static void
c19d1205 8841do_vfp_sp2_from_reg2 (void)
e16bb312 8842{
c19d1205
ZW
8843 constraint (inst.operands[0].imm != 2,
8844 _("only two consecutive VFP SP registers allowed here"));
5287ad62 8845 encode_arm_vfp_reg (inst.operands[0].reg, VFP_REG_Sm);
c19d1205
ZW
8846 inst.instruction |= inst.operands[1].reg << 12;
8847 inst.instruction |= inst.operands[2].reg << 16;
e16bb312
NC
8848}
8849
8850static void
c19d1205 8851do_vfp_sp_ldst (void)
e16bb312 8852{
5287ad62 8853 encode_arm_vfp_reg (inst.operands[0].reg, VFP_REG_Sd);
c19d1205 8854 encode_arm_cp_address (1, FALSE, TRUE, 0);
e16bb312
NC
8855}
8856
8857static void
c19d1205 8858do_vfp_dp_ldst (void)
e16bb312 8859{
5287ad62 8860 encode_arm_vfp_reg (inst.operands[0].reg, VFP_REG_Dd);
c19d1205 8861 encode_arm_cp_address (1, FALSE, TRUE, 0);
e16bb312
NC
8862}
8863
c19d1205 8864
e16bb312 8865static void
c19d1205 8866vfp_sp_ldstm (enum vfp_ldstm_type ldstm_type)
e16bb312 8867{
c19d1205
ZW
8868 if (inst.operands[0].writeback)
8869 inst.instruction |= WRITE_BACK;
8870 else
8871 constraint (ldstm_type != VFP_LDSTMIA,
8872 _("this addressing mode requires base-register writeback"));
8873 inst.instruction |= inst.operands[0].reg << 16;
5287ad62 8874 encode_arm_vfp_reg (inst.operands[1].reg, VFP_REG_Sd);
c19d1205 8875 inst.instruction |= inst.operands[1].imm;
e16bb312
NC
8876}
8877
8878static void
c19d1205 8879vfp_dp_ldstm (enum vfp_ldstm_type ldstm_type)
e16bb312 8880{
c19d1205 8881 int count;
e16bb312 8882
c19d1205
ZW
8883 if (inst.operands[0].writeback)
8884 inst.instruction |= WRITE_BACK;
8885 else
8886 constraint (ldstm_type != VFP_LDSTMIA && ldstm_type != VFP_LDSTMIAX,
8887 _("this addressing mode requires base-register writeback"));
e16bb312 8888
c19d1205 8889 inst.instruction |= inst.operands[0].reg << 16;
5287ad62 8890 encode_arm_vfp_reg (inst.operands[1].reg, VFP_REG_Dd);
e16bb312 8891
c19d1205
ZW
8892 count = inst.operands[1].imm << 1;
8893 if (ldstm_type == VFP_LDSTMIAX || ldstm_type == VFP_LDSTMDBX)
8894 count += 1;
e16bb312 8895
c19d1205 8896 inst.instruction |= count;
e16bb312
NC
8897}
8898
8899static void
c19d1205 8900do_vfp_sp_ldstmia (void)
e16bb312 8901{
c19d1205 8902 vfp_sp_ldstm (VFP_LDSTMIA);
e16bb312
NC
8903}
8904
8905static void
c19d1205 8906do_vfp_sp_ldstmdb (void)
e16bb312 8907{
c19d1205 8908 vfp_sp_ldstm (VFP_LDSTMDB);
e16bb312
NC
8909}
8910
8911static void
c19d1205 8912do_vfp_dp_ldstmia (void)
e16bb312 8913{
c19d1205 8914 vfp_dp_ldstm (VFP_LDSTMIA);
e16bb312
NC
8915}
8916
8917static void
c19d1205 8918do_vfp_dp_ldstmdb (void)
e16bb312 8919{
c19d1205 8920 vfp_dp_ldstm (VFP_LDSTMDB);
e16bb312
NC
8921}
8922
8923static void
c19d1205 8924do_vfp_xp_ldstmia (void)
e16bb312 8925{
c19d1205
ZW
8926 vfp_dp_ldstm (VFP_LDSTMIAX);
8927}
e16bb312 8928
c19d1205
ZW
8929static void
8930do_vfp_xp_ldstmdb (void)
8931{
8932 vfp_dp_ldstm (VFP_LDSTMDBX);
e16bb312 8933}
5287ad62
JB
8934
8935static void
8936do_vfp_dp_rd_rm (void)
8937{
8938 encode_arm_vfp_reg (inst.operands[0].reg, VFP_REG_Dd);
8939 encode_arm_vfp_reg (inst.operands[1].reg, VFP_REG_Dm);
8940}
8941
8942static void
8943do_vfp_dp_rn_rd (void)
8944{
8945 encode_arm_vfp_reg (inst.operands[0].reg, VFP_REG_Dn);
8946 encode_arm_vfp_reg (inst.operands[1].reg, VFP_REG_Dd);
8947}
8948
8949static void
8950do_vfp_dp_rd_rn (void)
8951{
8952 encode_arm_vfp_reg (inst.operands[0].reg, VFP_REG_Dd);
8953 encode_arm_vfp_reg (inst.operands[1].reg, VFP_REG_Dn);
8954}
8955
8956static void
8957do_vfp_dp_rd_rn_rm (void)
8958{
8959 encode_arm_vfp_reg (inst.operands[0].reg, VFP_REG_Dd);
8960 encode_arm_vfp_reg (inst.operands[1].reg, VFP_REG_Dn);
8961 encode_arm_vfp_reg (inst.operands[2].reg, VFP_REG_Dm);
8962}
8963
8964static void
8965do_vfp_dp_rd (void)
8966{
8967 encode_arm_vfp_reg (inst.operands[0].reg, VFP_REG_Dd);
8968}
8969
8970static void
8971do_vfp_dp_rm_rd_rn (void)
8972{
8973 encode_arm_vfp_reg (inst.operands[0].reg, VFP_REG_Dm);
8974 encode_arm_vfp_reg (inst.operands[1].reg, VFP_REG_Dd);
8975 encode_arm_vfp_reg (inst.operands[2].reg, VFP_REG_Dn);
8976}
8977
8978/* VFPv3 instructions. */
8979static void
8980do_vfp_sp_const (void)
8981{
8982 encode_arm_vfp_reg (inst.operands[0].reg, VFP_REG_Sd);
00249aaa
PB
8983 inst.instruction |= (inst.operands[1].imm & 0xf0) << 12;
8984 inst.instruction |= (inst.operands[1].imm & 0x0f);
5287ad62
JB
8985}
8986
8987static void
8988do_vfp_dp_const (void)
8989{
8990 encode_arm_vfp_reg (inst.operands[0].reg, VFP_REG_Dd);
00249aaa
PB
8991 inst.instruction |= (inst.operands[1].imm & 0xf0) << 12;
8992 inst.instruction |= (inst.operands[1].imm & 0x0f);
5287ad62
JB
8993}
8994
8995static void
8996vfp_conv (int srcsize)
8997{
5f1af56b
MGD
8998 int immbits = srcsize - inst.operands[1].imm;
8999
fa94de6b
RM
9000 if (srcsize == 16 && !(immbits >= 0 && immbits <= srcsize))
9001 {
5f1af56b 9002 /* If srcsize is 16, inst.operands[1].imm must be in the range 0-16.
477330fc 9003 i.e. immbits must be in range 0 - 16. */
5f1af56b
MGD
9004 inst.error = _("immediate value out of range, expected range [0, 16]");
9005 return;
9006 }
fa94de6b 9007 else if (srcsize == 32 && !(immbits >= 0 && immbits < srcsize))
5f1af56b
MGD
9008 {
9009 /* If srcsize is 32, inst.operands[1].imm must be in the range 1-32.
477330fc 9010 i.e. immbits must be in range 0 - 31. */
5f1af56b
MGD
9011 inst.error = _("immediate value out of range, expected range [1, 32]");
9012 return;
9013 }
9014
5287ad62
JB
9015 inst.instruction |= (immbits & 1) << 5;
9016 inst.instruction |= (immbits >> 1);
9017}
9018
9019static void
9020do_vfp_sp_conv_16 (void)
9021{
9022 encode_arm_vfp_reg (inst.operands[0].reg, VFP_REG_Sd);
9023 vfp_conv (16);
9024}
9025
9026static void
9027do_vfp_dp_conv_16 (void)
9028{
9029 encode_arm_vfp_reg (inst.operands[0].reg, VFP_REG_Dd);
9030 vfp_conv (16);
9031}
9032
9033static void
9034do_vfp_sp_conv_32 (void)
9035{
9036 encode_arm_vfp_reg (inst.operands[0].reg, VFP_REG_Sd);
9037 vfp_conv (32);
9038}
9039
9040static void
9041do_vfp_dp_conv_32 (void)
9042{
9043 encode_arm_vfp_reg (inst.operands[0].reg, VFP_REG_Dd);
9044 vfp_conv (32);
9045}
c19d1205
ZW
9046\f
9047/* FPA instructions. Also in a logical order. */
e16bb312 9048
c19d1205
ZW
9049static void
9050do_fpa_cmp (void)
9051{
9052 inst.instruction |= inst.operands[0].reg << 16;
9053 inst.instruction |= inst.operands[1].reg;
9054}
b99bd4ef
NC
9055
9056static void
c19d1205 9057do_fpa_ldmstm (void)
b99bd4ef 9058{
c19d1205
ZW
9059 inst.instruction |= inst.operands[0].reg << 12;
9060 switch (inst.operands[1].imm)
9061 {
9062 case 1: inst.instruction |= CP_T_X; break;
9063 case 2: inst.instruction |= CP_T_Y; break;
9064 case 3: inst.instruction |= CP_T_Y | CP_T_X; break;
9065 case 4: break;
9066 default: abort ();
9067 }
b99bd4ef 9068
c19d1205
ZW
9069 if (inst.instruction & (PRE_INDEX | INDEX_UP))
9070 {
9071 /* The instruction specified "ea" or "fd", so we can only accept
9072 [Rn]{!}. The instruction does not really support stacking or
9073 unstacking, so we have to emulate these by setting appropriate
9074 bits and offsets. */
9075 constraint (inst.reloc.exp.X_op != O_constant
9076 || inst.reloc.exp.X_add_number != 0,
9077 _("this instruction does not support indexing"));
b99bd4ef 9078
c19d1205
ZW
9079 if ((inst.instruction & PRE_INDEX) || inst.operands[2].writeback)
9080 inst.reloc.exp.X_add_number = 12 * inst.operands[1].imm;
b99bd4ef 9081
c19d1205
ZW
9082 if (!(inst.instruction & INDEX_UP))
9083 inst.reloc.exp.X_add_number = -inst.reloc.exp.X_add_number;
b99bd4ef 9084
c19d1205
ZW
9085 if (!(inst.instruction & PRE_INDEX) && inst.operands[2].writeback)
9086 {
9087 inst.operands[2].preind = 0;
9088 inst.operands[2].postind = 1;
9089 }
9090 }
b99bd4ef 9091
c19d1205 9092 encode_arm_cp_address (2, TRUE, TRUE, 0);
b99bd4ef 9093}
c19d1205
ZW
9094\f
9095/* iWMMXt instructions: strictly in alphabetical order. */
b99bd4ef 9096
c19d1205
ZW
9097static void
9098do_iwmmxt_tandorc (void)
9099{
9100 constraint (inst.operands[0].reg != REG_PC, _("only r15 allowed here"));
9101}
b99bd4ef 9102
c19d1205
ZW
9103static void
9104do_iwmmxt_textrc (void)
9105{
9106 inst.instruction |= inst.operands[0].reg << 12;
9107 inst.instruction |= inst.operands[1].imm;
9108}
b99bd4ef
NC
9109
9110static void
c19d1205 9111do_iwmmxt_textrm (void)
b99bd4ef 9112{
c19d1205
ZW
9113 inst.instruction |= inst.operands[0].reg << 12;
9114 inst.instruction |= inst.operands[1].reg << 16;
9115 inst.instruction |= inst.operands[2].imm;
9116}
b99bd4ef 9117
c19d1205
ZW
9118static void
9119do_iwmmxt_tinsr (void)
9120{
9121 inst.instruction |= inst.operands[0].reg << 16;
9122 inst.instruction |= inst.operands[1].reg << 12;
9123 inst.instruction |= inst.operands[2].imm;
9124}
b99bd4ef 9125
c19d1205
ZW
9126static void
9127do_iwmmxt_tmia (void)
9128{
9129 inst.instruction |= inst.operands[0].reg << 5;
9130 inst.instruction |= inst.operands[1].reg;
9131 inst.instruction |= inst.operands[2].reg << 12;
9132}
b99bd4ef 9133
c19d1205
ZW
9134static void
9135do_iwmmxt_waligni (void)
9136{
9137 inst.instruction |= inst.operands[0].reg << 12;
9138 inst.instruction |= inst.operands[1].reg << 16;
9139 inst.instruction |= inst.operands[2].reg;
9140 inst.instruction |= inst.operands[3].imm << 20;
9141}
b99bd4ef 9142
2d447fca
JM
9143static void
9144do_iwmmxt_wmerge (void)
9145{
9146 inst.instruction |= inst.operands[0].reg << 12;
9147 inst.instruction |= inst.operands[1].reg << 16;
9148 inst.instruction |= inst.operands[2].reg;
9149 inst.instruction |= inst.operands[3].imm << 21;
9150}
9151
c19d1205
ZW
9152static void
9153do_iwmmxt_wmov (void)
9154{
9155 /* WMOV rD, rN is an alias for WOR rD, rN, rN. */
9156 inst.instruction |= inst.operands[0].reg << 12;
9157 inst.instruction |= inst.operands[1].reg << 16;
9158 inst.instruction |= inst.operands[1].reg;
9159}
b99bd4ef 9160
c19d1205
ZW
9161static void
9162do_iwmmxt_wldstbh (void)
9163{
8f06b2d8 9164 int reloc;
c19d1205 9165 inst.instruction |= inst.operands[0].reg << 12;
8f06b2d8
PB
9166 if (thumb_mode)
9167 reloc = BFD_RELOC_ARM_T32_CP_OFF_IMM_S2;
9168 else
9169 reloc = BFD_RELOC_ARM_CP_OFF_IMM_S2;
9170 encode_arm_cp_address (1, TRUE, FALSE, reloc);
b99bd4ef
NC
9171}
9172
c19d1205
ZW
9173static void
9174do_iwmmxt_wldstw (void)
9175{
9176 /* RIWR_RIWC clears .isreg for a control register. */
9177 if (!inst.operands[0].isreg)
9178 {
9179 constraint (inst.cond != COND_ALWAYS, BAD_COND);
9180 inst.instruction |= 0xf0000000;
9181 }
b99bd4ef 9182
c19d1205
ZW
9183 inst.instruction |= inst.operands[0].reg << 12;
9184 encode_arm_cp_address (1, TRUE, TRUE, 0);
9185}
b99bd4ef
NC
9186
9187static void
c19d1205 9188do_iwmmxt_wldstd (void)
b99bd4ef 9189{
c19d1205 9190 inst.instruction |= inst.operands[0].reg << 12;
2d447fca
JM
9191 if (ARM_CPU_HAS_FEATURE (cpu_variant, arm_cext_iwmmxt2)
9192 && inst.operands[1].immisreg)
9193 {
9194 inst.instruction &= ~0x1a000ff;
9195 inst.instruction |= (0xf << 28);
9196 if (inst.operands[1].preind)
9197 inst.instruction |= PRE_INDEX;
9198 if (!inst.operands[1].negative)
9199 inst.instruction |= INDEX_UP;
9200 if (inst.operands[1].writeback)
9201 inst.instruction |= WRITE_BACK;
9202 inst.instruction |= inst.operands[1].reg << 16;
9203 inst.instruction |= inst.reloc.exp.X_add_number << 4;
9204 inst.instruction |= inst.operands[1].imm;
9205 }
9206 else
9207 encode_arm_cp_address (1, TRUE, FALSE, 0);
c19d1205 9208}
b99bd4ef 9209
c19d1205
ZW
9210static void
9211do_iwmmxt_wshufh (void)
9212{
9213 inst.instruction |= inst.operands[0].reg << 12;
9214 inst.instruction |= inst.operands[1].reg << 16;
9215 inst.instruction |= ((inst.operands[2].imm & 0xf0) << 16);
9216 inst.instruction |= (inst.operands[2].imm & 0x0f);
9217}
b99bd4ef 9218
c19d1205
ZW
9219static void
9220do_iwmmxt_wzero (void)
9221{
9222 /* WZERO reg is an alias for WANDN reg, reg, reg. */
9223 inst.instruction |= inst.operands[0].reg;
9224 inst.instruction |= inst.operands[0].reg << 12;
9225 inst.instruction |= inst.operands[0].reg << 16;
9226}
2d447fca
JM
9227
9228static void
9229do_iwmmxt_wrwrwr_or_imm5 (void)
9230{
9231 if (inst.operands[2].isreg)
9232 do_rd_rn_rm ();
9233 else {
9234 constraint (!ARM_CPU_HAS_FEATURE (cpu_variant, arm_cext_iwmmxt2),
9235 _("immediate operand requires iWMMXt2"));
9236 do_rd_rn ();
9237 if (inst.operands[2].imm == 0)
9238 {
9239 switch ((inst.instruction >> 20) & 0xf)
9240 {
9241 case 4:
9242 case 5:
9243 case 6:
5f4273c7 9244 case 7:
2d447fca
JM
9245 /* w...h wrd, wrn, #0 -> wrorh wrd, wrn, #16. */
9246 inst.operands[2].imm = 16;
9247 inst.instruction = (inst.instruction & 0xff0fffff) | (0x7 << 20);
9248 break;
9249 case 8:
9250 case 9:
9251 case 10:
9252 case 11:
9253 /* w...w wrd, wrn, #0 -> wrorw wrd, wrn, #32. */
9254 inst.operands[2].imm = 32;
9255 inst.instruction = (inst.instruction & 0xff0fffff) | (0xb << 20);
9256 break;
9257 case 12:
9258 case 13:
9259 case 14:
9260 case 15:
9261 {
9262 /* w...d wrd, wrn, #0 -> wor wrd, wrn, wrn. */
9263 unsigned long wrn;
9264 wrn = (inst.instruction >> 16) & 0xf;
9265 inst.instruction &= 0xff0fff0f;
9266 inst.instruction |= wrn;
9267 /* Bail out here; the instruction is now assembled. */
9268 return;
9269 }
9270 }
9271 }
9272 /* Map 32 -> 0, etc. */
9273 inst.operands[2].imm &= 0x1f;
9274 inst.instruction |= (0xf << 28) | ((inst.operands[2].imm & 0x10) << 4) | (inst.operands[2].imm & 0xf);
9275 }
9276}
c19d1205
ZW
9277\f
9278/* Cirrus Maverick instructions. Simple 2-, 3-, and 4-register
9279 operations first, then control, shift, and load/store. */
b99bd4ef 9280
c19d1205 9281/* Insns like "foo X,Y,Z". */
b99bd4ef 9282
c19d1205
ZW
9283static void
9284do_mav_triple (void)
9285{
9286 inst.instruction |= inst.operands[0].reg << 16;
9287 inst.instruction |= inst.operands[1].reg;
9288 inst.instruction |= inst.operands[2].reg << 12;
9289}
b99bd4ef 9290
c19d1205
ZW
9291/* Insns like "foo W,X,Y,Z".
9292 where W=MVAX[0:3] and X,Y,Z=MVFX[0:15]. */
a737bd4d 9293
c19d1205
ZW
9294static void
9295do_mav_quad (void)
9296{
9297 inst.instruction |= inst.operands[0].reg << 5;
9298 inst.instruction |= inst.operands[1].reg << 12;
9299 inst.instruction |= inst.operands[2].reg << 16;
9300 inst.instruction |= inst.operands[3].reg;
a737bd4d
NC
9301}
9302
c19d1205
ZW
9303/* cfmvsc32<cond> DSPSC,MVDX[15:0]. */
9304static void
9305do_mav_dspsc (void)
a737bd4d 9306{
c19d1205
ZW
9307 inst.instruction |= inst.operands[1].reg << 12;
9308}
a737bd4d 9309
c19d1205
ZW
9310/* Maverick shift immediate instructions.
9311 cfsh32<cond> MVFX[15:0],MVFX[15:0],Shift[6:0].
9312 cfsh64<cond> MVDX[15:0],MVDX[15:0],Shift[6:0]. */
a737bd4d 9313
c19d1205
ZW
9314static void
9315do_mav_shift (void)
9316{
9317 int imm = inst.operands[2].imm;
a737bd4d 9318
c19d1205
ZW
9319 inst.instruction |= inst.operands[0].reg << 12;
9320 inst.instruction |= inst.operands[1].reg << 16;
a737bd4d 9321
c19d1205
ZW
9322 /* Bits 0-3 of the insn should have bits 0-3 of the immediate.
9323 Bits 5-7 of the insn should have bits 4-6 of the immediate.
9324 Bit 4 should be 0. */
9325 imm = (imm & 0xf) | ((imm & 0x70) << 1);
a737bd4d 9326
c19d1205
ZW
9327 inst.instruction |= imm;
9328}
9329\f
9330/* XScale instructions. Also sorted arithmetic before move. */
a737bd4d 9331
c19d1205
ZW
9332/* Xscale multiply-accumulate (argument parse)
9333 MIAcc acc0,Rm,Rs
9334 MIAPHcc acc0,Rm,Rs
9335 MIAxycc acc0,Rm,Rs. */
a737bd4d 9336
c19d1205
ZW
9337static void
9338do_xsc_mia (void)
9339{
9340 inst.instruction |= inst.operands[1].reg;
9341 inst.instruction |= inst.operands[2].reg << 12;
9342}
a737bd4d 9343
c19d1205 9344/* Xscale move-accumulator-register (argument parse)
a737bd4d 9345
c19d1205 9346 MARcc acc0,RdLo,RdHi. */
b99bd4ef 9347
c19d1205
ZW
9348static void
9349do_xsc_mar (void)
9350{
9351 inst.instruction |= inst.operands[1].reg << 12;
9352 inst.instruction |= inst.operands[2].reg << 16;
b99bd4ef
NC
9353}
9354
c19d1205 9355/* Xscale move-register-accumulator (argument parse)
b99bd4ef 9356
c19d1205 9357 MRAcc RdLo,RdHi,acc0. */
b99bd4ef
NC
9358
9359static void
c19d1205 9360do_xsc_mra (void)
b99bd4ef 9361{
c19d1205
ZW
9362 constraint (inst.operands[0].reg == inst.operands[1].reg, BAD_OVERLAP);
9363 inst.instruction |= inst.operands[0].reg << 12;
9364 inst.instruction |= inst.operands[1].reg << 16;
9365}
9366\f
9367/* Encoding functions relevant only to Thumb. */
b99bd4ef 9368
c19d1205
ZW
9369/* inst.operands[i] is a shifted-register operand; encode
9370 it into inst.instruction in the format used by Thumb32. */
9371
9372static void
9373encode_thumb32_shifted_operand (int i)
9374{
9375 unsigned int value = inst.reloc.exp.X_add_number;
9376 unsigned int shift = inst.operands[i].shift_kind;
b99bd4ef 9377
9c3c69f2
PB
9378 constraint (inst.operands[i].immisreg,
9379 _("shift by register not allowed in thumb mode"));
c19d1205
ZW
9380 inst.instruction |= inst.operands[i].reg;
9381 if (shift == SHIFT_RRX)
9382 inst.instruction |= SHIFT_ROR << 4;
9383 else
b99bd4ef 9384 {
c19d1205
ZW
9385 constraint (inst.reloc.exp.X_op != O_constant,
9386 _("expression too complex"));
9387
9388 constraint (value > 32
9389 || (value == 32 && (shift == SHIFT_LSL
9390 || shift == SHIFT_ROR)),
9391 _("shift expression is too large"));
9392
9393 if (value == 0)
9394 shift = SHIFT_LSL;
9395 else if (value == 32)
9396 value = 0;
9397
9398 inst.instruction |= shift << 4;
9399 inst.instruction |= (value & 0x1c) << 10;
9400 inst.instruction |= (value & 0x03) << 6;
b99bd4ef 9401 }
c19d1205 9402}
b99bd4ef 9403
b99bd4ef 9404
c19d1205
ZW
9405/* inst.operands[i] was set up by parse_address. Encode it into a
9406 Thumb32 format load or store instruction. Reject forms that cannot
9407 be used with such instructions. If is_t is true, reject forms that
9408 cannot be used with a T instruction; if is_d is true, reject forms
5be8be5d
DG
9409 that cannot be used with a D instruction. If it is a store insn,
9410 reject PC in Rn. */
b99bd4ef 9411
c19d1205
ZW
9412static void
9413encode_thumb32_addr_mode (int i, bfd_boolean is_t, bfd_boolean is_d)
9414{
5be8be5d 9415 const bfd_boolean is_pc = (inst.operands[i].reg == REG_PC);
c19d1205
ZW
9416
9417 constraint (!inst.operands[i].isreg,
53365c0d 9418 _("Instruction does not support =N addresses"));
b99bd4ef 9419
c19d1205
ZW
9420 inst.instruction |= inst.operands[i].reg << 16;
9421 if (inst.operands[i].immisreg)
b99bd4ef 9422 {
5be8be5d 9423 constraint (is_pc, BAD_PC_ADDRESSING);
c19d1205
ZW
9424 constraint (is_t || is_d, _("cannot use register index with this instruction"));
9425 constraint (inst.operands[i].negative,
9426 _("Thumb does not support negative register indexing"));
9427 constraint (inst.operands[i].postind,
9428 _("Thumb does not support register post-indexing"));
9429 constraint (inst.operands[i].writeback,
9430 _("Thumb does not support register indexing with writeback"));
9431 constraint (inst.operands[i].shifted && inst.operands[i].shift_kind != SHIFT_LSL,
9432 _("Thumb supports only LSL in shifted register indexing"));
b99bd4ef 9433
f40d1643 9434 inst.instruction |= inst.operands[i].imm;
c19d1205 9435 if (inst.operands[i].shifted)
b99bd4ef 9436 {
c19d1205
ZW
9437 constraint (inst.reloc.exp.X_op != O_constant,
9438 _("expression too complex"));
9c3c69f2
PB
9439 constraint (inst.reloc.exp.X_add_number < 0
9440 || inst.reloc.exp.X_add_number > 3,
c19d1205 9441 _("shift out of range"));
9c3c69f2 9442 inst.instruction |= inst.reloc.exp.X_add_number << 4;
c19d1205
ZW
9443 }
9444 inst.reloc.type = BFD_RELOC_UNUSED;
9445 }
9446 else if (inst.operands[i].preind)
9447 {
5be8be5d 9448 constraint (is_pc && inst.operands[i].writeback, BAD_PC_WRITEBACK);
f40d1643 9449 constraint (is_t && inst.operands[i].writeback,
c19d1205 9450 _("cannot use writeback with this instruction"));
4755303e
WN
9451 constraint (is_pc && ((inst.instruction & THUMB2_LOAD_BIT) == 0),
9452 BAD_PC_ADDRESSING);
c19d1205
ZW
9453
9454 if (is_d)
9455 {
9456 inst.instruction |= 0x01000000;
9457 if (inst.operands[i].writeback)
9458 inst.instruction |= 0x00200000;
b99bd4ef 9459 }
c19d1205 9460 else
b99bd4ef 9461 {
c19d1205
ZW
9462 inst.instruction |= 0x00000c00;
9463 if (inst.operands[i].writeback)
9464 inst.instruction |= 0x00000100;
b99bd4ef 9465 }
c19d1205 9466 inst.reloc.type = BFD_RELOC_ARM_T32_OFFSET_IMM;
b99bd4ef 9467 }
c19d1205 9468 else if (inst.operands[i].postind)
b99bd4ef 9469 {
9c2799c2 9470 gas_assert (inst.operands[i].writeback);
c19d1205
ZW
9471 constraint (is_pc, _("cannot use post-indexing with PC-relative addressing"));
9472 constraint (is_t, _("cannot use post-indexing with this instruction"));
9473
9474 if (is_d)
9475 inst.instruction |= 0x00200000;
9476 else
9477 inst.instruction |= 0x00000900;
9478 inst.reloc.type = BFD_RELOC_ARM_T32_OFFSET_IMM;
9479 }
9480 else /* unindexed - only for coprocessor */
9481 inst.error = _("instruction does not accept unindexed addressing");
9482}
9483
9484/* Table of Thumb instructions which exist in both 16- and 32-bit
9485 encodings (the latter only in post-V6T2 cores). The index is the
9486 value used in the insns table below. When there is more than one
9487 possible 16-bit encoding for the instruction, this table always
0110f2b8
PB
9488 holds variant (1).
9489 Also contains several pseudo-instructions used during relaxation. */
c19d1205 9490#define T16_32_TAB \
21d799b5
NC
9491 X(_adc, 4140, eb400000), \
9492 X(_adcs, 4140, eb500000), \
9493 X(_add, 1c00, eb000000), \
9494 X(_adds, 1c00, eb100000), \
9495 X(_addi, 0000, f1000000), \
9496 X(_addis, 0000, f1100000), \
9497 X(_add_pc,000f, f20f0000), \
9498 X(_add_sp,000d, f10d0000), \
9499 X(_adr, 000f, f20f0000), \
9500 X(_and, 4000, ea000000), \
9501 X(_ands, 4000, ea100000), \
9502 X(_asr, 1000, fa40f000), \
9503 X(_asrs, 1000, fa50f000), \
9504 X(_b, e000, f000b000), \
9505 X(_bcond, d000, f0008000), \
9506 X(_bic, 4380, ea200000), \
9507 X(_bics, 4380, ea300000), \
9508 X(_cmn, 42c0, eb100f00), \
9509 X(_cmp, 2800, ebb00f00), \
9510 X(_cpsie, b660, f3af8400), \
9511 X(_cpsid, b670, f3af8600), \
9512 X(_cpy, 4600, ea4f0000), \
9513 X(_dec_sp,80dd, f1ad0d00), \
9514 X(_eor, 4040, ea800000), \
9515 X(_eors, 4040, ea900000), \
9516 X(_inc_sp,00dd, f10d0d00), \
9517 X(_ldmia, c800, e8900000), \
9518 X(_ldr, 6800, f8500000), \
9519 X(_ldrb, 7800, f8100000), \
9520 X(_ldrh, 8800, f8300000), \
9521 X(_ldrsb, 5600, f9100000), \
9522 X(_ldrsh, 5e00, f9300000), \
9523 X(_ldr_pc,4800, f85f0000), \
9524 X(_ldr_pc2,4800, f85f0000), \
9525 X(_ldr_sp,9800, f85d0000), \
9526 X(_lsl, 0000, fa00f000), \
9527 X(_lsls, 0000, fa10f000), \
9528 X(_lsr, 0800, fa20f000), \
9529 X(_lsrs, 0800, fa30f000), \
9530 X(_mov, 2000, ea4f0000), \
9531 X(_movs, 2000, ea5f0000), \
9532 X(_mul, 4340, fb00f000), \
9533 X(_muls, 4340, ffffffff), /* no 32b muls */ \
9534 X(_mvn, 43c0, ea6f0000), \
9535 X(_mvns, 43c0, ea7f0000), \
9536 X(_neg, 4240, f1c00000), /* rsb #0 */ \
9537 X(_negs, 4240, f1d00000), /* rsbs #0 */ \
9538 X(_orr, 4300, ea400000), \
9539 X(_orrs, 4300, ea500000), \
9540 X(_pop, bc00, e8bd0000), /* ldmia sp!,... */ \
9541 X(_push, b400, e92d0000), /* stmdb sp!,... */ \
9542 X(_rev, ba00, fa90f080), \
9543 X(_rev16, ba40, fa90f090), \
9544 X(_revsh, bac0, fa90f0b0), \
9545 X(_ror, 41c0, fa60f000), \
9546 X(_rors, 41c0, fa70f000), \
9547 X(_sbc, 4180, eb600000), \
9548 X(_sbcs, 4180, eb700000), \
9549 X(_stmia, c000, e8800000), \
9550 X(_str, 6000, f8400000), \
9551 X(_strb, 7000, f8000000), \
9552 X(_strh, 8000, f8200000), \
9553 X(_str_sp,9000, f84d0000), \
9554 X(_sub, 1e00, eba00000), \
9555 X(_subs, 1e00, ebb00000), \
9556 X(_subi, 8000, f1a00000), \
9557 X(_subis, 8000, f1b00000), \
9558 X(_sxtb, b240, fa4ff080), \
9559 X(_sxth, b200, fa0ff080), \
9560 X(_tst, 4200, ea100f00), \
9561 X(_uxtb, b2c0, fa5ff080), \
9562 X(_uxth, b280, fa1ff080), \
9563 X(_nop, bf00, f3af8000), \
9564 X(_yield, bf10, f3af8001), \
9565 X(_wfe, bf20, f3af8002), \
9566 X(_wfi, bf30, f3af8003), \
53c4b28b
MGD
9567 X(_sev, bf40, f3af8004), \
9568 X(_sevl, bf50, f3af8005)
c19d1205
ZW
9569
9570/* To catch errors in encoding functions, the codes are all offset by
9571 0xF800, putting them in one of the 32-bit prefix ranges, ergo undefined
9572 as 16-bit instructions. */
21d799b5 9573#define X(a,b,c) T_MNEM##a
c19d1205
ZW
9574enum t16_32_codes { T16_32_OFFSET = 0xF7FF, T16_32_TAB };
9575#undef X
9576
9577#define X(a,b,c) 0x##b
9578static const unsigned short thumb_op16[] = { T16_32_TAB };
9579#define THUMB_OP16(n) (thumb_op16[(n) - (T16_32_OFFSET + 1)])
9580#undef X
9581
9582#define X(a,b,c) 0x##c
9583static const unsigned int thumb_op32[] = { T16_32_TAB };
c921be7d
NC
9584#define THUMB_OP32(n) (thumb_op32[(n) - (T16_32_OFFSET + 1)])
9585#define THUMB_SETS_FLAGS(n) (THUMB_OP32 (n) & 0x00100000)
c19d1205
ZW
9586#undef X
9587#undef T16_32_TAB
9588
9589/* Thumb instruction encoders, in alphabetical order. */
9590
92e90b6e 9591/* ADDW or SUBW. */
c921be7d 9592
92e90b6e
PB
9593static void
9594do_t_add_sub_w (void)
9595{
9596 int Rd, Rn;
9597
9598 Rd = inst.operands[0].reg;
9599 Rn = inst.operands[1].reg;
9600
539d4391
NC
9601 /* If Rn is REG_PC, this is ADR; if Rn is REG_SP, then this
9602 is the SP-{plus,minus}-immediate form of the instruction. */
9603 if (Rn == REG_SP)
9604 constraint (Rd == REG_PC, BAD_PC);
9605 else
9606 reject_bad_reg (Rd);
fdfde340 9607
92e90b6e
PB
9608 inst.instruction |= (Rn << 16) | (Rd << 8);
9609 inst.reloc.type = BFD_RELOC_ARM_T32_IMM12;
9610}
9611
c19d1205
ZW
9612/* Parse an add or subtract instruction. We get here with inst.instruction
9613 equalling any of THUMB_OPCODE_add, adds, sub, or subs. */
9614
9615static void
9616do_t_add_sub (void)
9617{
9618 int Rd, Rs, Rn;
9619
9620 Rd = inst.operands[0].reg;
9621 Rs = (inst.operands[1].present
9622 ? inst.operands[1].reg /* Rd, Rs, foo */
9623 : inst.operands[0].reg); /* Rd, foo -> Rd, Rd, foo */
9624
e07e6e58
NC
9625 if (Rd == REG_PC)
9626 set_it_insn_type_last ();
9627
c19d1205
ZW
9628 if (unified_syntax)
9629 {
0110f2b8
PB
9630 bfd_boolean flags;
9631 bfd_boolean narrow;
9632 int opcode;
9633
9634 flags = (inst.instruction == T_MNEM_adds
9635 || inst.instruction == T_MNEM_subs);
9636 if (flags)
e07e6e58 9637 narrow = !in_it_block ();
0110f2b8 9638 else
e07e6e58 9639 narrow = in_it_block ();
c19d1205 9640 if (!inst.operands[2].isreg)
b99bd4ef 9641 {
16805f35
PB
9642 int add;
9643
fdfde340
JM
9644 constraint (Rd == REG_SP && Rs != REG_SP, BAD_SP);
9645
16805f35
PB
9646 add = (inst.instruction == T_MNEM_add
9647 || inst.instruction == T_MNEM_adds);
0110f2b8
PB
9648 opcode = 0;
9649 if (inst.size_req != 4)
9650 {
0110f2b8 9651 /* Attempt to use a narrow opcode, with relaxation if
477330fc 9652 appropriate. */
0110f2b8
PB
9653 if (Rd == REG_SP && Rs == REG_SP && !flags)
9654 opcode = add ? T_MNEM_inc_sp : T_MNEM_dec_sp;
9655 else if (Rd <= 7 && Rs == REG_SP && add && !flags)
9656 opcode = T_MNEM_add_sp;
9657 else if (Rd <= 7 && Rs == REG_PC && add && !flags)
9658 opcode = T_MNEM_add_pc;
9659 else if (Rd <= 7 && Rs <= 7 && narrow)
9660 {
9661 if (flags)
9662 opcode = add ? T_MNEM_addis : T_MNEM_subis;
9663 else
9664 opcode = add ? T_MNEM_addi : T_MNEM_subi;
9665 }
9666 if (opcode)
9667 {
9668 inst.instruction = THUMB_OP16(opcode);
9669 inst.instruction |= (Rd << 4) | Rs;
9670 inst.reloc.type = BFD_RELOC_ARM_THUMB_ADD;
9671 if (inst.size_req != 2)
9672 inst.relax = opcode;
9673 }
9674 else
9675 constraint (inst.size_req == 2, BAD_HIREG);
9676 }
9677 if (inst.size_req == 4
9678 || (inst.size_req != 2 && !opcode))
9679 {
efd81785
PB
9680 if (Rd == REG_PC)
9681 {
fdfde340 9682 constraint (add, BAD_PC);
efd81785
PB
9683 constraint (Rs != REG_LR || inst.instruction != T_MNEM_subs,
9684 _("only SUBS PC, LR, #const allowed"));
9685 constraint (inst.reloc.exp.X_op != O_constant,
9686 _("expression too complex"));
9687 constraint (inst.reloc.exp.X_add_number < 0
9688 || inst.reloc.exp.X_add_number > 0xff,
9689 _("immediate value out of range"));
9690 inst.instruction = T2_SUBS_PC_LR
9691 | inst.reloc.exp.X_add_number;
9692 inst.reloc.type = BFD_RELOC_UNUSED;
9693 return;
9694 }
9695 else if (Rs == REG_PC)
16805f35
PB
9696 {
9697 /* Always use addw/subw. */
9698 inst.instruction = add ? 0xf20f0000 : 0xf2af0000;
9699 inst.reloc.type = BFD_RELOC_ARM_T32_IMM12;
9700 }
9701 else
9702 {
9703 inst.instruction = THUMB_OP32 (inst.instruction);
9704 inst.instruction = (inst.instruction & 0xe1ffffff)
9705 | 0x10000000;
9706 if (flags)
9707 inst.reloc.type = BFD_RELOC_ARM_T32_IMMEDIATE;
9708 else
9709 inst.reloc.type = BFD_RELOC_ARM_T32_ADD_IMM;
9710 }
dc4503c6
PB
9711 inst.instruction |= Rd << 8;
9712 inst.instruction |= Rs << 16;
0110f2b8 9713 }
b99bd4ef 9714 }
c19d1205
ZW
9715 else
9716 {
5f4cb198
NC
9717 unsigned int value = inst.reloc.exp.X_add_number;
9718 unsigned int shift = inst.operands[2].shift_kind;
9719
c19d1205
ZW
9720 Rn = inst.operands[2].reg;
9721 /* See if we can do this with a 16-bit instruction. */
9722 if (!inst.operands[2].shifted && inst.size_req != 4)
9723 {
e27ec89e
PB
9724 if (Rd > 7 || Rs > 7 || Rn > 7)
9725 narrow = FALSE;
9726
9727 if (narrow)
c19d1205 9728 {
e27ec89e
PB
9729 inst.instruction = ((inst.instruction == T_MNEM_adds
9730 || inst.instruction == T_MNEM_add)
c19d1205
ZW
9731 ? T_OPCODE_ADD_R3
9732 : T_OPCODE_SUB_R3);
9733 inst.instruction |= Rd | (Rs << 3) | (Rn << 6);
9734 return;
9735 }
b99bd4ef 9736
7e806470 9737 if (inst.instruction == T_MNEM_add && (Rd == Rs || Rd == Rn))
c19d1205 9738 {
7e806470
PB
9739 /* Thumb-1 cores (except v6-M) require at least one high
9740 register in a narrow non flag setting add. */
9741 if (Rd > 7 || Rn > 7
9742 || ARM_CPU_HAS_FEATURE (selected_cpu, arm_ext_v6t2)
9743 || ARM_CPU_HAS_FEATURE (selected_cpu, arm_ext_msr))
c19d1205 9744 {
7e806470
PB
9745 if (Rd == Rn)
9746 {
9747 Rn = Rs;
9748 Rs = Rd;
9749 }
c19d1205
ZW
9750 inst.instruction = T_OPCODE_ADD_HI;
9751 inst.instruction |= (Rd & 8) << 4;
9752 inst.instruction |= (Rd & 7);
9753 inst.instruction |= Rn << 3;
9754 return;
9755 }
c19d1205
ZW
9756 }
9757 }
c921be7d 9758
fdfde340
JM
9759 constraint (Rd == REG_PC, BAD_PC);
9760 constraint (Rd == REG_SP && Rs != REG_SP, BAD_SP);
9761 constraint (Rs == REG_PC, BAD_PC);
9762 reject_bad_reg (Rn);
9763
c19d1205
ZW
9764 /* If we get here, it can't be done in 16 bits. */
9765 constraint (inst.operands[2].shifted && inst.operands[2].immisreg,
9766 _("shift must be constant"));
9767 inst.instruction = THUMB_OP32 (inst.instruction);
9768 inst.instruction |= Rd << 8;
9769 inst.instruction |= Rs << 16;
5f4cb198
NC
9770 constraint (Rd == REG_SP && Rs == REG_SP && value > 3,
9771 _("shift value over 3 not allowed in thumb mode"));
9772 constraint (Rd == REG_SP && Rs == REG_SP && shift != SHIFT_LSL,
9773 _("only LSL shift allowed in thumb mode"));
c19d1205
ZW
9774 encode_thumb32_shifted_operand (2);
9775 }
9776 }
9777 else
9778 {
9779 constraint (inst.instruction == T_MNEM_adds
9780 || inst.instruction == T_MNEM_subs,
9781 BAD_THUMB32);
b99bd4ef 9782
c19d1205 9783 if (!inst.operands[2].isreg) /* Rd, Rs, #imm */
b99bd4ef 9784 {
c19d1205
ZW
9785 constraint ((Rd > 7 && (Rd != REG_SP || Rs != REG_SP))
9786 || (Rs > 7 && Rs != REG_SP && Rs != REG_PC),
9787 BAD_HIREG);
9788
9789 inst.instruction = (inst.instruction == T_MNEM_add
9790 ? 0x0000 : 0x8000);
9791 inst.instruction |= (Rd << 4) | Rs;
9792 inst.reloc.type = BFD_RELOC_ARM_THUMB_ADD;
b99bd4ef
NC
9793 return;
9794 }
9795
c19d1205
ZW
9796 Rn = inst.operands[2].reg;
9797 constraint (inst.operands[2].shifted, _("unshifted register required"));
b99bd4ef 9798
c19d1205
ZW
9799 /* We now have Rd, Rs, and Rn set to registers. */
9800 if (Rd > 7 || Rs > 7 || Rn > 7)
b99bd4ef 9801 {
c19d1205
ZW
9802 /* Can't do this for SUB. */
9803 constraint (inst.instruction == T_MNEM_sub, BAD_HIREG);
9804 inst.instruction = T_OPCODE_ADD_HI;
9805 inst.instruction |= (Rd & 8) << 4;
9806 inst.instruction |= (Rd & 7);
9807 if (Rs == Rd)
9808 inst.instruction |= Rn << 3;
9809 else if (Rn == Rd)
9810 inst.instruction |= Rs << 3;
9811 else
9812 constraint (1, _("dest must overlap one source register"));
9813 }
9814 else
9815 {
9816 inst.instruction = (inst.instruction == T_MNEM_add
9817 ? T_OPCODE_ADD_R3 : T_OPCODE_SUB_R3);
9818 inst.instruction |= Rd | (Rs << 3) | (Rn << 6);
b99bd4ef 9819 }
b99bd4ef 9820 }
b99bd4ef
NC
9821}
9822
c19d1205
ZW
9823static void
9824do_t_adr (void)
9825{
fdfde340
JM
9826 unsigned Rd;
9827
9828 Rd = inst.operands[0].reg;
9829 reject_bad_reg (Rd);
9830
9831 if (unified_syntax && inst.size_req == 0 && Rd <= 7)
0110f2b8
PB
9832 {
9833 /* Defer to section relaxation. */
9834 inst.relax = inst.instruction;
9835 inst.instruction = THUMB_OP16 (inst.instruction);
fdfde340 9836 inst.instruction |= Rd << 4;
0110f2b8
PB
9837 }
9838 else if (unified_syntax && inst.size_req != 2)
e9f89963 9839 {
0110f2b8 9840 /* Generate a 32-bit opcode. */
e9f89963 9841 inst.instruction = THUMB_OP32 (inst.instruction);
fdfde340 9842 inst.instruction |= Rd << 8;
e9f89963
PB
9843 inst.reloc.type = BFD_RELOC_ARM_T32_ADD_PC12;
9844 inst.reloc.pc_rel = 1;
9845 }
9846 else
9847 {
0110f2b8 9848 /* Generate a 16-bit opcode. */
e9f89963
PB
9849 inst.instruction = THUMB_OP16 (inst.instruction);
9850 inst.reloc.type = BFD_RELOC_ARM_THUMB_ADD;
9851 inst.reloc.exp.X_add_number -= 4; /* PC relative adjust. */
9852 inst.reloc.pc_rel = 1;
b99bd4ef 9853
fdfde340 9854 inst.instruction |= Rd << 4;
e9f89963 9855 }
c19d1205 9856}
b99bd4ef 9857
c19d1205
ZW
9858/* Arithmetic instructions for which there is just one 16-bit
9859 instruction encoding, and it allows only two low registers.
9860 For maximal compatibility with ARM syntax, we allow three register
9861 operands even when Thumb-32 instructions are not available, as long
9862 as the first two are identical. For instance, both "sbc r0,r1" and
9863 "sbc r0,r0,r1" are allowed. */
b99bd4ef 9864static void
c19d1205 9865do_t_arit3 (void)
b99bd4ef 9866{
c19d1205 9867 int Rd, Rs, Rn;
b99bd4ef 9868
c19d1205
ZW
9869 Rd = inst.operands[0].reg;
9870 Rs = (inst.operands[1].present
9871 ? inst.operands[1].reg /* Rd, Rs, foo */
9872 : inst.operands[0].reg); /* Rd, foo -> Rd, Rd, foo */
9873 Rn = inst.operands[2].reg;
b99bd4ef 9874
fdfde340
JM
9875 reject_bad_reg (Rd);
9876 reject_bad_reg (Rs);
9877 if (inst.operands[2].isreg)
9878 reject_bad_reg (Rn);
9879
c19d1205 9880 if (unified_syntax)
b99bd4ef 9881 {
c19d1205
ZW
9882 if (!inst.operands[2].isreg)
9883 {
9884 /* For an immediate, we always generate a 32-bit opcode;
9885 section relaxation will shrink it later if possible. */
9886 inst.instruction = THUMB_OP32 (inst.instruction);
9887 inst.instruction = (inst.instruction & 0xe1ffffff) | 0x10000000;
9888 inst.instruction |= Rd << 8;
9889 inst.instruction |= Rs << 16;
9890 inst.reloc.type = BFD_RELOC_ARM_T32_IMMEDIATE;
9891 }
9892 else
9893 {
e27ec89e
PB
9894 bfd_boolean narrow;
9895
c19d1205 9896 /* See if we can do this with a 16-bit instruction. */
e27ec89e 9897 if (THUMB_SETS_FLAGS (inst.instruction))
e07e6e58 9898 narrow = !in_it_block ();
e27ec89e 9899 else
e07e6e58 9900 narrow = in_it_block ();
e27ec89e
PB
9901
9902 if (Rd > 7 || Rn > 7 || Rs > 7)
9903 narrow = FALSE;
9904 if (inst.operands[2].shifted)
9905 narrow = FALSE;
9906 if (inst.size_req == 4)
9907 narrow = FALSE;
9908
9909 if (narrow
c19d1205
ZW
9910 && Rd == Rs)
9911 {
9912 inst.instruction = THUMB_OP16 (inst.instruction);
9913 inst.instruction |= Rd;
9914 inst.instruction |= Rn << 3;
9915 return;
9916 }
b99bd4ef 9917
c19d1205
ZW
9918 /* If we get here, it can't be done in 16 bits. */
9919 constraint (inst.operands[2].shifted
9920 && inst.operands[2].immisreg,
9921 _("shift must be constant"));
9922 inst.instruction = THUMB_OP32 (inst.instruction);
9923 inst.instruction |= Rd << 8;
9924 inst.instruction |= Rs << 16;
9925 encode_thumb32_shifted_operand (2);
9926 }
a737bd4d 9927 }
c19d1205 9928 else
b99bd4ef 9929 {
c19d1205
ZW
9930 /* On its face this is a lie - the instruction does set the
9931 flags. However, the only supported mnemonic in this mode
9932 says it doesn't. */
9933 constraint (THUMB_SETS_FLAGS (inst.instruction), BAD_THUMB32);
a737bd4d 9934
c19d1205
ZW
9935 constraint (!inst.operands[2].isreg || inst.operands[2].shifted,
9936 _("unshifted register required"));
9937 constraint (Rd > 7 || Rs > 7 || Rn > 7, BAD_HIREG);
9938 constraint (Rd != Rs,
9939 _("dest and source1 must be the same register"));
a737bd4d 9940
c19d1205
ZW
9941 inst.instruction = THUMB_OP16 (inst.instruction);
9942 inst.instruction |= Rd;
9943 inst.instruction |= Rn << 3;
b99bd4ef 9944 }
a737bd4d 9945}
b99bd4ef 9946
c19d1205
ZW
9947/* Similarly, but for instructions where the arithmetic operation is
9948 commutative, so we can allow either of them to be different from
9949 the destination operand in a 16-bit instruction. For instance, all
9950 three of "adc r0,r1", "adc r0,r0,r1", and "adc r0,r1,r0" are
9951 accepted. */
9952static void
9953do_t_arit3c (void)
a737bd4d 9954{
c19d1205 9955 int Rd, Rs, Rn;
b99bd4ef 9956
c19d1205
ZW
9957 Rd = inst.operands[0].reg;
9958 Rs = (inst.operands[1].present
9959 ? inst.operands[1].reg /* Rd, Rs, foo */
9960 : inst.operands[0].reg); /* Rd, foo -> Rd, Rd, foo */
9961 Rn = inst.operands[2].reg;
c921be7d 9962
fdfde340
JM
9963 reject_bad_reg (Rd);
9964 reject_bad_reg (Rs);
9965 if (inst.operands[2].isreg)
9966 reject_bad_reg (Rn);
a737bd4d 9967
c19d1205 9968 if (unified_syntax)
a737bd4d 9969 {
c19d1205 9970 if (!inst.operands[2].isreg)
b99bd4ef 9971 {
c19d1205
ZW
9972 /* For an immediate, we always generate a 32-bit opcode;
9973 section relaxation will shrink it later if possible. */
9974 inst.instruction = THUMB_OP32 (inst.instruction);
9975 inst.instruction = (inst.instruction & 0xe1ffffff) | 0x10000000;
9976 inst.instruction |= Rd << 8;
9977 inst.instruction |= Rs << 16;
9978 inst.reloc.type = BFD_RELOC_ARM_T32_IMMEDIATE;
b99bd4ef 9979 }
c19d1205 9980 else
a737bd4d 9981 {
e27ec89e
PB
9982 bfd_boolean narrow;
9983
c19d1205 9984 /* See if we can do this with a 16-bit instruction. */
e27ec89e 9985 if (THUMB_SETS_FLAGS (inst.instruction))
e07e6e58 9986 narrow = !in_it_block ();
e27ec89e 9987 else
e07e6e58 9988 narrow = in_it_block ();
e27ec89e
PB
9989
9990 if (Rd > 7 || Rn > 7 || Rs > 7)
9991 narrow = FALSE;
9992 if (inst.operands[2].shifted)
9993 narrow = FALSE;
9994 if (inst.size_req == 4)
9995 narrow = FALSE;
9996
9997 if (narrow)
a737bd4d 9998 {
c19d1205 9999 if (Rd == Rs)
a737bd4d 10000 {
c19d1205
ZW
10001 inst.instruction = THUMB_OP16 (inst.instruction);
10002 inst.instruction |= Rd;
10003 inst.instruction |= Rn << 3;
10004 return;
a737bd4d 10005 }
c19d1205 10006 if (Rd == Rn)
a737bd4d 10007 {
c19d1205
ZW
10008 inst.instruction = THUMB_OP16 (inst.instruction);
10009 inst.instruction |= Rd;
10010 inst.instruction |= Rs << 3;
10011 return;
a737bd4d
NC
10012 }
10013 }
c19d1205
ZW
10014
10015 /* If we get here, it can't be done in 16 bits. */
10016 constraint (inst.operands[2].shifted
10017 && inst.operands[2].immisreg,
10018 _("shift must be constant"));
10019 inst.instruction = THUMB_OP32 (inst.instruction);
10020 inst.instruction |= Rd << 8;
10021 inst.instruction |= Rs << 16;
10022 encode_thumb32_shifted_operand (2);
a737bd4d 10023 }
b99bd4ef 10024 }
c19d1205
ZW
10025 else
10026 {
10027 /* On its face this is a lie - the instruction does set the
10028 flags. However, the only supported mnemonic in this mode
10029 says it doesn't. */
10030 constraint (THUMB_SETS_FLAGS (inst.instruction), BAD_THUMB32);
a737bd4d 10031
c19d1205
ZW
10032 constraint (!inst.operands[2].isreg || inst.operands[2].shifted,
10033 _("unshifted register required"));
10034 constraint (Rd > 7 || Rs > 7 || Rn > 7, BAD_HIREG);
10035
10036 inst.instruction = THUMB_OP16 (inst.instruction);
10037 inst.instruction |= Rd;
10038
10039 if (Rd == Rs)
10040 inst.instruction |= Rn << 3;
10041 else if (Rd == Rn)
10042 inst.instruction |= Rs << 3;
10043 else
10044 constraint (1, _("dest must overlap one source register"));
10045 }
a737bd4d
NC
10046}
10047
c19d1205
ZW
10048static void
10049do_t_bfc (void)
a737bd4d 10050{
fdfde340 10051 unsigned Rd;
c19d1205
ZW
10052 unsigned int msb = inst.operands[1].imm + inst.operands[2].imm;
10053 constraint (msb > 32, _("bit-field extends past end of register"));
10054 /* The instruction encoding stores the LSB and MSB,
10055 not the LSB and width. */
fdfde340
JM
10056 Rd = inst.operands[0].reg;
10057 reject_bad_reg (Rd);
10058 inst.instruction |= Rd << 8;
c19d1205
ZW
10059 inst.instruction |= (inst.operands[1].imm & 0x1c) << 10;
10060 inst.instruction |= (inst.operands[1].imm & 0x03) << 6;
10061 inst.instruction |= msb - 1;
b99bd4ef
NC
10062}
10063
c19d1205
ZW
10064static void
10065do_t_bfi (void)
b99bd4ef 10066{
fdfde340 10067 int Rd, Rn;
c19d1205 10068 unsigned int msb;
b99bd4ef 10069
fdfde340
JM
10070 Rd = inst.operands[0].reg;
10071 reject_bad_reg (Rd);
10072
c19d1205
ZW
10073 /* #0 in second position is alternative syntax for bfc, which is
10074 the same instruction but with REG_PC in the Rm field. */
10075 if (!inst.operands[1].isreg)
fdfde340
JM
10076 Rn = REG_PC;
10077 else
10078 {
10079 Rn = inst.operands[1].reg;
10080 reject_bad_reg (Rn);
10081 }
b99bd4ef 10082
c19d1205
ZW
10083 msb = inst.operands[2].imm + inst.operands[3].imm;
10084 constraint (msb > 32, _("bit-field extends past end of register"));
10085 /* The instruction encoding stores the LSB and MSB,
10086 not the LSB and width. */
fdfde340
JM
10087 inst.instruction |= Rd << 8;
10088 inst.instruction |= Rn << 16;
c19d1205
ZW
10089 inst.instruction |= (inst.operands[2].imm & 0x1c) << 10;
10090 inst.instruction |= (inst.operands[2].imm & 0x03) << 6;
10091 inst.instruction |= msb - 1;
b99bd4ef
NC
10092}
10093
c19d1205
ZW
10094static void
10095do_t_bfx (void)
b99bd4ef 10096{
fdfde340
JM
10097 unsigned Rd, Rn;
10098
10099 Rd = inst.operands[0].reg;
10100 Rn = inst.operands[1].reg;
10101
10102 reject_bad_reg (Rd);
10103 reject_bad_reg (Rn);
10104
c19d1205
ZW
10105 constraint (inst.operands[2].imm + inst.operands[3].imm > 32,
10106 _("bit-field extends past end of register"));
fdfde340
JM
10107 inst.instruction |= Rd << 8;
10108 inst.instruction |= Rn << 16;
c19d1205
ZW
10109 inst.instruction |= (inst.operands[2].imm & 0x1c) << 10;
10110 inst.instruction |= (inst.operands[2].imm & 0x03) << 6;
10111 inst.instruction |= inst.operands[3].imm - 1;
10112}
b99bd4ef 10113
c19d1205
ZW
10114/* ARM V5 Thumb BLX (argument parse)
10115 BLX <target_addr> which is BLX(1)
10116 BLX <Rm> which is BLX(2)
10117 Unfortunately, there are two different opcodes for this mnemonic.
10118 So, the insns[].value is not used, and the code here zaps values
10119 into inst.instruction.
b99bd4ef 10120
c19d1205
ZW
10121 ??? How to take advantage of the additional two bits of displacement
10122 available in Thumb32 mode? Need new relocation? */
b99bd4ef 10123
c19d1205
ZW
10124static void
10125do_t_blx (void)
10126{
e07e6e58
NC
10127 set_it_insn_type_last ();
10128
c19d1205 10129 if (inst.operands[0].isreg)
fdfde340
JM
10130 {
10131 constraint (inst.operands[0].reg == REG_PC, BAD_PC);
10132 /* We have a register, so this is BLX(2). */
10133 inst.instruction |= inst.operands[0].reg << 3;
10134 }
b99bd4ef
NC
10135 else
10136 {
c19d1205 10137 /* No register. This must be BLX(1). */
2fc8bdac 10138 inst.instruction = 0xf000e800;
0855e32b 10139 encode_branch (BFD_RELOC_THUMB_PCREL_BLX);
b99bd4ef
NC
10140 }
10141}
10142
c19d1205
ZW
10143static void
10144do_t_branch (void)
b99bd4ef 10145{
0110f2b8 10146 int opcode;
dfa9f0d5 10147 int cond;
9ae92b05 10148 int reloc;
dfa9f0d5 10149
e07e6e58
NC
10150 cond = inst.cond;
10151 set_it_insn_type (IF_INSIDE_IT_LAST_INSN);
10152
10153 if (in_it_block ())
dfa9f0d5
PB
10154 {
10155 /* Conditional branches inside IT blocks are encoded as unconditional
477330fc 10156 branches. */
dfa9f0d5 10157 cond = COND_ALWAYS;
dfa9f0d5
PB
10158 }
10159 else
10160 cond = inst.cond;
10161
10162 if (cond != COND_ALWAYS)
0110f2b8
PB
10163 opcode = T_MNEM_bcond;
10164 else
10165 opcode = inst.instruction;
10166
12d6b0b7
RS
10167 if (unified_syntax
10168 && (inst.size_req == 4
10960bfb
PB
10169 || (inst.size_req != 2
10170 && (inst.operands[0].hasreloc
10171 || inst.reloc.exp.X_op == O_constant))))
c19d1205 10172 {
0110f2b8 10173 inst.instruction = THUMB_OP32(opcode);
dfa9f0d5 10174 if (cond == COND_ALWAYS)
9ae92b05 10175 reloc = BFD_RELOC_THUMB_PCREL_BRANCH25;
c19d1205
ZW
10176 else
10177 {
9c2799c2 10178 gas_assert (cond != 0xF);
dfa9f0d5 10179 inst.instruction |= cond << 22;
9ae92b05 10180 reloc = BFD_RELOC_THUMB_PCREL_BRANCH20;
c19d1205
ZW
10181 }
10182 }
b99bd4ef
NC
10183 else
10184 {
0110f2b8 10185 inst.instruction = THUMB_OP16(opcode);
dfa9f0d5 10186 if (cond == COND_ALWAYS)
9ae92b05 10187 reloc = BFD_RELOC_THUMB_PCREL_BRANCH12;
c19d1205 10188 else
b99bd4ef 10189 {
dfa9f0d5 10190 inst.instruction |= cond << 8;
9ae92b05 10191 reloc = BFD_RELOC_THUMB_PCREL_BRANCH9;
b99bd4ef 10192 }
0110f2b8
PB
10193 /* Allow section relaxation. */
10194 if (unified_syntax && inst.size_req != 2)
10195 inst.relax = opcode;
b99bd4ef 10196 }
9ae92b05 10197 inst.reloc.type = reloc;
c19d1205 10198 inst.reloc.pc_rel = 1;
b99bd4ef
NC
10199}
10200
8884b720 10201/* Actually do the work for Thumb state bkpt and hlt. The only difference
bacebabc 10202 between the two is the maximum immediate allowed - which is passed in
8884b720 10203 RANGE. */
b99bd4ef 10204static void
8884b720 10205do_t_bkpt_hlt1 (int range)
b99bd4ef 10206{
dfa9f0d5
PB
10207 constraint (inst.cond != COND_ALWAYS,
10208 _("instruction is always unconditional"));
c19d1205 10209 if (inst.operands[0].present)
b99bd4ef 10210 {
8884b720 10211 constraint (inst.operands[0].imm > range,
c19d1205
ZW
10212 _("immediate value out of range"));
10213 inst.instruction |= inst.operands[0].imm;
b99bd4ef 10214 }
8884b720
MGD
10215
10216 set_it_insn_type (NEUTRAL_IT_INSN);
10217}
10218
10219static void
10220do_t_hlt (void)
10221{
10222 do_t_bkpt_hlt1 (63);
10223}
10224
10225static void
10226do_t_bkpt (void)
10227{
10228 do_t_bkpt_hlt1 (255);
b99bd4ef
NC
10229}
10230
10231static void
c19d1205 10232do_t_branch23 (void)
b99bd4ef 10233{
e07e6e58 10234 set_it_insn_type_last ();
0855e32b 10235 encode_branch (BFD_RELOC_THUMB_PCREL_BRANCH23);
fa94de6b 10236
0855e32b
NS
10237 /* md_apply_fix blows up with 'bl foo(PLT)' where foo is defined in
10238 this file. We used to simply ignore the PLT reloc type here --
10239 the branch encoding is now needed to deal with TLSCALL relocs.
10240 So if we see a PLT reloc now, put it back to how it used to be to
10241 keep the preexisting behaviour. */
10242 if (inst.reloc.type == BFD_RELOC_ARM_PLT32)
10243 inst.reloc.type = BFD_RELOC_THUMB_PCREL_BRANCH23;
90e4755a 10244
4343666d 10245#if defined(OBJ_COFF)
c19d1205
ZW
10246 /* If the destination of the branch is a defined symbol which does not have
10247 the THUMB_FUNC attribute, then we must be calling a function which has
10248 the (interfacearm) attribute. We look for the Thumb entry point to that
10249 function and change the branch to refer to that function instead. */
10250 if ( inst.reloc.exp.X_op == O_symbol
10251 && inst.reloc.exp.X_add_symbol != NULL
10252 && S_IS_DEFINED (inst.reloc.exp.X_add_symbol)
10253 && ! THUMB_IS_FUNC (inst.reloc.exp.X_add_symbol))
10254 inst.reloc.exp.X_add_symbol =
10255 find_real_start (inst.reloc.exp.X_add_symbol);
4343666d 10256#endif
90e4755a
RE
10257}
10258
10259static void
c19d1205 10260do_t_bx (void)
90e4755a 10261{
e07e6e58 10262 set_it_insn_type_last ();
c19d1205
ZW
10263 inst.instruction |= inst.operands[0].reg << 3;
10264 /* ??? FIXME: Should add a hacky reloc here if reg is REG_PC. The reloc
10265 should cause the alignment to be checked once it is known. This is
10266 because BX PC only works if the instruction is word aligned. */
10267}
90e4755a 10268
c19d1205
ZW
10269static void
10270do_t_bxj (void)
10271{
fdfde340 10272 int Rm;
90e4755a 10273
e07e6e58 10274 set_it_insn_type_last ();
fdfde340
JM
10275 Rm = inst.operands[0].reg;
10276 reject_bad_reg (Rm);
10277 inst.instruction |= Rm << 16;
90e4755a
RE
10278}
10279
10280static void
c19d1205 10281do_t_clz (void)
90e4755a 10282{
fdfde340
JM
10283 unsigned Rd;
10284 unsigned Rm;
10285
10286 Rd = inst.operands[0].reg;
10287 Rm = inst.operands[1].reg;
10288
10289 reject_bad_reg (Rd);
10290 reject_bad_reg (Rm);
10291
10292 inst.instruction |= Rd << 8;
10293 inst.instruction |= Rm << 16;
10294 inst.instruction |= Rm;
c19d1205 10295}
90e4755a 10296
dfa9f0d5
PB
10297static void
10298do_t_cps (void)
10299{
e07e6e58 10300 set_it_insn_type (OUTSIDE_IT_INSN);
dfa9f0d5
PB
10301 inst.instruction |= inst.operands[0].imm;
10302}
10303
c19d1205
ZW
10304static void
10305do_t_cpsi (void)
10306{
e07e6e58 10307 set_it_insn_type (OUTSIDE_IT_INSN);
c19d1205 10308 if (unified_syntax
62b3e311
PB
10309 && (inst.operands[1].present || inst.size_req == 4)
10310 && ARM_CPU_HAS_FEATURE (cpu_variant, arm_ext_v6_notm))
90e4755a 10311 {
c19d1205
ZW
10312 unsigned int imod = (inst.instruction & 0x0030) >> 4;
10313 inst.instruction = 0xf3af8000;
10314 inst.instruction |= imod << 9;
10315 inst.instruction |= inst.operands[0].imm << 5;
10316 if (inst.operands[1].present)
10317 inst.instruction |= 0x100 | inst.operands[1].imm;
90e4755a 10318 }
c19d1205 10319 else
90e4755a 10320 {
62b3e311
PB
10321 constraint (!ARM_CPU_HAS_FEATURE (cpu_variant, arm_ext_v1)
10322 && (inst.operands[0].imm & 4),
10323 _("selected processor does not support 'A' form "
10324 "of this instruction"));
10325 constraint (inst.operands[1].present || inst.size_req == 4,
c19d1205
ZW
10326 _("Thumb does not support the 2-argument "
10327 "form of this instruction"));
10328 inst.instruction |= inst.operands[0].imm;
90e4755a 10329 }
90e4755a
RE
10330}
10331
c19d1205
ZW
10332/* THUMB CPY instruction (argument parse). */
10333
90e4755a 10334static void
c19d1205 10335do_t_cpy (void)
90e4755a 10336{
c19d1205 10337 if (inst.size_req == 4)
90e4755a 10338 {
c19d1205
ZW
10339 inst.instruction = THUMB_OP32 (T_MNEM_mov);
10340 inst.instruction |= inst.operands[0].reg << 8;
10341 inst.instruction |= inst.operands[1].reg;
90e4755a 10342 }
c19d1205 10343 else
90e4755a 10344 {
c19d1205
ZW
10345 inst.instruction |= (inst.operands[0].reg & 0x8) << 4;
10346 inst.instruction |= (inst.operands[0].reg & 0x7);
10347 inst.instruction |= inst.operands[1].reg << 3;
90e4755a 10348 }
90e4755a
RE
10349}
10350
90e4755a 10351static void
25fe350b 10352do_t_cbz (void)
90e4755a 10353{
e07e6e58 10354 set_it_insn_type (OUTSIDE_IT_INSN);
c19d1205
ZW
10355 constraint (inst.operands[0].reg > 7, BAD_HIREG);
10356 inst.instruction |= inst.operands[0].reg;
10357 inst.reloc.pc_rel = 1;
10358 inst.reloc.type = BFD_RELOC_THUMB_PCREL_BRANCH7;
10359}
90e4755a 10360
62b3e311
PB
10361static void
10362do_t_dbg (void)
10363{
10364 inst.instruction |= inst.operands[0].imm;
10365}
10366
10367static void
10368do_t_div (void)
10369{
fdfde340
JM
10370 unsigned Rd, Rn, Rm;
10371
10372 Rd = inst.operands[0].reg;
10373 Rn = (inst.operands[1].present
10374 ? inst.operands[1].reg : Rd);
10375 Rm = inst.operands[2].reg;
10376
10377 reject_bad_reg (Rd);
10378 reject_bad_reg (Rn);
10379 reject_bad_reg (Rm);
10380
10381 inst.instruction |= Rd << 8;
10382 inst.instruction |= Rn << 16;
10383 inst.instruction |= Rm;
62b3e311
PB
10384}
10385
c19d1205
ZW
10386static void
10387do_t_hint (void)
10388{
10389 if (unified_syntax && inst.size_req == 4)
10390 inst.instruction = THUMB_OP32 (inst.instruction);
10391 else
10392 inst.instruction = THUMB_OP16 (inst.instruction);
10393}
90e4755a 10394
c19d1205
ZW
10395static void
10396do_t_it (void)
10397{
10398 unsigned int cond = inst.operands[0].imm;
e27ec89e 10399
e07e6e58
NC
10400 set_it_insn_type (IT_INSN);
10401 now_it.mask = (inst.instruction & 0xf) | 0x10;
10402 now_it.cc = cond;
5a01bb1d 10403 now_it.warn_deprecated = FALSE;
e27ec89e
PB
10404
10405 /* If the condition is a negative condition, invert the mask. */
c19d1205 10406 if ((cond & 0x1) == 0x0)
90e4755a 10407 {
c19d1205 10408 unsigned int mask = inst.instruction & 0x000f;
90e4755a 10409
c19d1205 10410 if ((mask & 0x7) == 0)
5a01bb1d
MGD
10411 {
10412 /* No conversion needed. */
10413 now_it.block_length = 1;
10414 }
c19d1205 10415 else if ((mask & 0x3) == 0)
5a01bb1d
MGD
10416 {
10417 mask ^= 0x8;
10418 now_it.block_length = 2;
10419 }
e27ec89e 10420 else if ((mask & 0x1) == 0)
5a01bb1d
MGD
10421 {
10422 mask ^= 0xC;
10423 now_it.block_length = 3;
10424 }
c19d1205 10425 else
5a01bb1d
MGD
10426 {
10427 mask ^= 0xE;
10428 now_it.block_length = 4;
10429 }
90e4755a 10430
e27ec89e
PB
10431 inst.instruction &= 0xfff0;
10432 inst.instruction |= mask;
c19d1205 10433 }
90e4755a 10434
c19d1205
ZW
10435 inst.instruction |= cond << 4;
10436}
90e4755a 10437
3c707909
PB
10438/* Helper function used for both push/pop and ldm/stm. */
10439static void
10440encode_thumb2_ldmstm (int base, unsigned mask, bfd_boolean writeback)
10441{
10442 bfd_boolean load;
10443
10444 load = (inst.instruction & (1 << 20)) != 0;
10445
10446 if (mask & (1 << 13))
10447 inst.error = _("SP not allowed in register list");
1e5b0379
NC
10448
10449 if ((mask & (1 << base)) != 0
10450 && writeback)
10451 inst.error = _("having the base register in the register list when "
10452 "using write back is UNPREDICTABLE");
10453
3c707909
PB
10454 if (load)
10455 {
e07e6e58 10456 if (mask & (1 << 15))
477330fc
RM
10457 {
10458 if (mask & (1 << 14))
10459 inst.error = _("LR and PC should not both be in register list");
10460 else
10461 set_it_insn_type_last ();
10462 }
3c707909
PB
10463 }
10464 else
10465 {
10466 if (mask & (1 << 15))
10467 inst.error = _("PC not allowed in register list");
3c707909
PB
10468 }
10469
10470 if ((mask & (mask - 1)) == 0)
10471 {
10472 /* Single register transfers implemented as str/ldr. */
10473 if (writeback)
10474 {
10475 if (inst.instruction & (1 << 23))
10476 inst.instruction = 0x00000b04; /* ia! -> [base], #4 */
10477 else
10478 inst.instruction = 0x00000d04; /* db! -> [base, #-4]! */
10479 }
10480 else
10481 {
10482 if (inst.instruction & (1 << 23))
10483 inst.instruction = 0x00800000; /* ia -> [base] */
10484 else
10485 inst.instruction = 0x00000c04; /* db -> [base, #-4] */
10486 }
10487
10488 inst.instruction |= 0xf8400000;
10489 if (load)
10490 inst.instruction |= 0x00100000;
10491
5f4273c7 10492 mask = ffs (mask) - 1;
3c707909
PB
10493 mask <<= 12;
10494 }
10495 else if (writeback)
10496 inst.instruction |= WRITE_BACK;
10497
10498 inst.instruction |= mask;
10499 inst.instruction |= base << 16;
10500}
10501
c19d1205
ZW
10502static void
10503do_t_ldmstm (void)
10504{
10505 /* This really doesn't seem worth it. */
10506 constraint (inst.reloc.type != BFD_RELOC_UNUSED,
10507 _("expression too complex"));
10508 constraint (inst.operands[1].writeback,
10509 _("Thumb load/store multiple does not support {reglist}^"));
90e4755a 10510
c19d1205
ZW
10511 if (unified_syntax)
10512 {
3c707909
PB
10513 bfd_boolean narrow;
10514 unsigned mask;
10515
10516 narrow = FALSE;
c19d1205
ZW
10517 /* See if we can use a 16-bit instruction. */
10518 if (inst.instruction < 0xffff /* not ldmdb/stmdb */
10519 && inst.size_req != 4
3c707909 10520 && !(inst.operands[1].imm & ~0xff))
90e4755a 10521 {
3c707909 10522 mask = 1 << inst.operands[0].reg;
90e4755a 10523
eab4f823 10524 if (inst.operands[0].reg <= 7)
90e4755a 10525 {
3c707909 10526 if (inst.instruction == T_MNEM_stmia
eab4f823
MGD
10527 ? inst.operands[0].writeback
10528 : (inst.operands[0].writeback
10529 == !(inst.operands[1].imm & mask)))
477330fc 10530 {
eab4f823
MGD
10531 if (inst.instruction == T_MNEM_stmia
10532 && (inst.operands[1].imm & mask)
10533 && (inst.operands[1].imm & (mask - 1)))
10534 as_warn (_("value stored for r%d is UNKNOWN"),
10535 inst.operands[0].reg);
3c707909 10536
eab4f823
MGD
10537 inst.instruction = THUMB_OP16 (inst.instruction);
10538 inst.instruction |= inst.operands[0].reg << 8;
10539 inst.instruction |= inst.operands[1].imm;
10540 narrow = TRUE;
10541 }
10542 else if ((inst.operands[1].imm & (inst.operands[1].imm-1)) == 0)
10543 {
10544 /* This means 1 register in reg list one of 3 situations:
10545 1. Instruction is stmia, but without writeback.
10546 2. lmdia without writeback, but with Rn not in
477330fc 10547 reglist.
eab4f823
MGD
10548 3. ldmia with writeback, but with Rn in reglist.
10549 Case 3 is UNPREDICTABLE behaviour, so we handle
10550 case 1 and 2 which can be converted into a 16-bit
10551 str or ldr. The SP cases are handled below. */
10552 unsigned long opcode;
10553 /* First, record an error for Case 3. */
10554 if (inst.operands[1].imm & mask
10555 && inst.operands[0].writeback)
fa94de6b 10556 inst.error =
eab4f823
MGD
10557 _("having the base register in the register list when "
10558 "using write back is UNPREDICTABLE");
fa94de6b
RM
10559
10560 opcode = (inst.instruction == T_MNEM_stmia ? T_MNEM_str
eab4f823
MGD
10561 : T_MNEM_ldr);
10562 inst.instruction = THUMB_OP16 (opcode);
10563 inst.instruction |= inst.operands[0].reg << 3;
10564 inst.instruction |= (ffs (inst.operands[1].imm)-1);
10565 narrow = TRUE;
10566 }
90e4755a 10567 }
eab4f823 10568 else if (inst.operands[0] .reg == REG_SP)
90e4755a 10569 {
eab4f823
MGD
10570 if (inst.operands[0].writeback)
10571 {
fa94de6b 10572 inst.instruction =
eab4f823 10573 THUMB_OP16 (inst.instruction == T_MNEM_stmia
477330fc 10574 ? T_MNEM_push : T_MNEM_pop);
eab4f823 10575 inst.instruction |= inst.operands[1].imm;
477330fc 10576 narrow = TRUE;
eab4f823
MGD
10577 }
10578 else if ((inst.operands[1].imm & (inst.operands[1].imm-1)) == 0)
10579 {
fa94de6b 10580 inst.instruction =
eab4f823 10581 THUMB_OP16 (inst.instruction == T_MNEM_stmia
477330fc 10582 ? T_MNEM_str_sp : T_MNEM_ldr_sp);
eab4f823 10583 inst.instruction |= ((ffs (inst.operands[1].imm)-1) << 8);
477330fc 10584 narrow = TRUE;
eab4f823 10585 }
90e4755a 10586 }
3c707909
PB
10587 }
10588
10589 if (!narrow)
10590 {
c19d1205
ZW
10591 if (inst.instruction < 0xffff)
10592 inst.instruction = THUMB_OP32 (inst.instruction);
3c707909 10593
5f4273c7
NC
10594 encode_thumb2_ldmstm (inst.operands[0].reg, inst.operands[1].imm,
10595 inst.operands[0].writeback);
90e4755a
RE
10596 }
10597 }
c19d1205 10598 else
90e4755a 10599 {
c19d1205
ZW
10600 constraint (inst.operands[0].reg > 7
10601 || (inst.operands[1].imm & ~0xff), BAD_HIREG);
1198ca51
PB
10602 constraint (inst.instruction != T_MNEM_ldmia
10603 && inst.instruction != T_MNEM_stmia,
10604 _("Thumb-2 instruction only valid in unified syntax"));
c19d1205 10605 if (inst.instruction == T_MNEM_stmia)
f03698e6 10606 {
c19d1205
ZW
10607 if (!inst.operands[0].writeback)
10608 as_warn (_("this instruction will write back the base register"));
10609 if ((inst.operands[1].imm & (1 << inst.operands[0].reg))
10610 && (inst.operands[1].imm & ((1 << inst.operands[0].reg) - 1)))
1e5b0379 10611 as_warn (_("value stored for r%d is UNKNOWN"),
c19d1205 10612 inst.operands[0].reg);
f03698e6 10613 }
c19d1205 10614 else
90e4755a 10615 {
c19d1205
ZW
10616 if (!inst.operands[0].writeback
10617 && !(inst.operands[1].imm & (1 << inst.operands[0].reg)))
10618 as_warn (_("this instruction will write back the base register"));
10619 else if (inst.operands[0].writeback
10620 && (inst.operands[1].imm & (1 << inst.operands[0].reg)))
10621 as_warn (_("this instruction will not write back the base register"));
90e4755a
RE
10622 }
10623
c19d1205
ZW
10624 inst.instruction = THUMB_OP16 (inst.instruction);
10625 inst.instruction |= inst.operands[0].reg << 8;
10626 inst.instruction |= inst.operands[1].imm;
10627 }
10628}
e28cd48c 10629
c19d1205
ZW
10630static void
10631do_t_ldrex (void)
10632{
10633 constraint (!inst.operands[1].isreg || !inst.operands[1].preind
10634 || inst.operands[1].postind || inst.operands[1].writeback
10635 || inst.operands[1].immisreg || inst.operands[1].shifted
10636 || inst.operands[1].negative,
01cfc07f 10637 BAD_ADDR_MODE);
e28cd48c 10638
5be8be5d
DG
10639 constraint ((inst.operands[1].reg == REG_PC), BAD_PC);
10640
c19d1205
ZW
10641 inst.instruction |= inst.operands[0].reg << 12;
10642 inst.instruction |= inst.operands[1].reg << 16;
10643 inst.reloc.type = BFD_RELOC_ARM_T32_OFFSET_U8;
10644}
e28cd48c 10645
c19d1205
ZW
10646static void
10647do_t_ldrexd (void)
10648{
10649 if (!inst.operands[1].present)
1cac9012 10650 {
c19d1205
ZW
10651 constraint (inst.operands[0].reg == REG_LR,
10652 _("r14 not allowed as first register "
10653 "when second register is omitted"));
10654 inst.operands[1].reg = inst.operands[0].reg + 1;
b99bd4ef 10655 }
c19d1205
ZW
10656 constraint (inst.operands[0].reg == inst.operands[1].reg,
10657 BAD_OVERLAP);
b99bd4ef 10658
c19d1205
ZW
10659 inst.instruction |= inst.operands[0].reg << 12;
10660 inst.instruction |= inst.operands[1].reg << 8;
10661 inst.instruction |= inst.operands[2].reg << 16;
b99bd4ef
NC
10662}
10663
10664static void
c19d1205 10665do_t_ldst (void)
b99bd4ef 10666{
0110f2b8
PB
10667 unsigned long opcode;
10668 int Rn;
10669
e07e6e58
NC
10670 if (inst.operands[0].isreg
10671 && !inst.operands[0].preind
10672 && inst.operands[0].reg == REG_PC)
10673 set_it_insn_type_last ();
10674
0110f2b8 10675 opcode = inst.instruction;
c19d1205 10676 if (unified_syntax)
b99bd4ef 10677 {
53365c0d
PB
10678 if (!inst.operands[1].isreg)
10679 {
10680 if (opcode <= 0xffff)
10681 inst.instruction = THUMB_OP32 (opcode);
10682 if (move_or_literal_pool (0, /*thumb_p=*/TRUE, /*mode_3=*/FALSE))
10683 return;
10684 }
0110f2b8
PB
10685 if (inst.operands[1].isreg
10686 && !inst.operands[1].writeback
c19d1205
ZW
10687 && !inst.operands[1].shifted && !inst.operands[1].postind
10688 && !inst.operands[1].negative && inst.operands[0].reg <= 7
0110f2b8
PB
10689 && opcode <= 0xffff
10690 && inst.size_req != 4)
c19d1205 10691 {
0110f2b8
PB
10692 /* Insn may have a 16-bit form. */
10693 Rn = inst.operands[1].reg;
10694 if (inst.operands[1].immisreg)
10695 {
10696 inst.instruction = THUMB_OP16 (opcode);
5f4273c7 10697 /* [Rn, Rik] */
0110f2b8
PB
10698 if (Rn <= 7 && inst.operands[1].imm <= 7)
10699 goto op16;
5be8be5d
DG
10700 else if (opcode != T_MNEM_ldr && opcode != T_MNEM_str)
10701 reject_bad_reg (inst.operands[1].imm);
0110f2b8
PB
10702 }
10703 else if ((Rn <= 7 && opcode != T_MNEM_ldrsh
10704 && opcode != T_MNEM_ldrsb)
10705 || ((Rn == REG_PC || Rn == REG_SP) && opcode == T_MNEM_ldr)
10706 || (Rn == REG_SP && opcode == T_MNEM_str))
10707 {
10708 /* [Rn, #const] */
10709 if (Rn > 7)
10710 {
10711 if (Rn == REG_PC)
10712 {
10713 if (inst.reloc.pc_rel)
10714 opcode = T_MNEM_ldr_pc2;
10715 else
10716 opcode = T_MNEM_ldr_pc;
10717 }
10718 else
10719 {
10720 if (opcode == T_MNEM_ldr)
10721 opcode = T_MNEM_ldr_sp;
10722 else
10723 opcode = T_MNEM_str_sp;
10724 }
10725 inst.instruction = inst.operands[0].reg << 8;
10726 }
10727 else
10728 {
10729 inst.instruction = inst.operands[0].reg;
10730 inst.instruction |= inst.operands[1].reg << 3;
10731 }
10732 inst.instruction |= THUMB_OP16 (opcode);
10733 if (inst.size_req == 2)
10734 inst.reloc.type = BFD_RELOC_ARM_THUMB_OFFSET;
10735 else
10736 inst.relax = opcode;
10737 return;
10738 }
c19d1205 10739 }
0110f2b8 10740 /* Definitely a 32-bit variant. */
5be8be5d 10741
8d67f500
NC
10742 /* Warning for Erratum 752419. */
10743 if (opcode == T_MNEM_ldr
10744 && inst.operands[0].reg == REG_SP
10745 && inst.operands[1].writeback == 1
10746 && !inst.operands[1].immisreg)
10747 {
10748 if (no_cpu_selected ()
10749 || (ARM_CPU_HAS_FEATURE (cpu_variant, arm_ext_v7)
477330fc
RM
10750 && !ARM_CPU_HAS_FEATURE (cpu_variant, arm_ext_v7a)
10751 && !ARM_CPU_HAS_FEATURE (cpu_variant, arm_ext_v7r)))
8d67f500
NC
10752 as_warn (_("This instruction may be unpredictable "
10753 "if executed on M-profile cores "
10754 "with interrupts enabled."));
10755 }
10756
5be8be5d 10757 /* Do some validations regarding addressing modes. */
1be5fd2e 10758 if (inst.operands[1].immisreg)
5be8be5d
DG
10759 reject_bad_reg (inst.operands[1].imm);
10760
1be5fd2e
NC
10761 constraint (inst.operands[1].writeback == 1
10762 && inst.operands[0].reg == inst.operands[1].reg,
10763 BAD_OVERLAP);
10764
0110f2b8 10765 inst.instruction = THUMB_OP32 (opcode);
c19d1205
ZW
10766 inst.instruction |= inst.operands[0].reg << 12;
10767 encode_thumb32_addr_mode (1, /*is_t=*/FALSE, /*is_d=*/FALSE);
1be5fd2e 10768 check_ldr_r15_aligned ();
b99bd4ef
NC
10769 return;
10770 }
10771
c19d1205
ZW
10772 constraint (inst.operands[0].reg > 7, BAD_HIREG);
10773
10774 if (inst.instruction == T_MNEM_ldrsh || inst.instruction == T_MNEM_ldrsb)
b99bd4ef 10775 {
c19d1205
ZW
10776 /* Only [Rn,Rm] is acceptable. */
10777 constraint (inst.operands[1].reg > 7 || inst.operands[1].imm > 7, BAD_HIREG);
10778 constraint (!inst.operands[1].isreg || !inst.operands[1].immisreg
10779 || inst.operands[1].postind || inst.operands[1].shifted
10780 || inst.operands[1].negative,
10781 _("Thumb does not support this addressing mode"));
10782 inst.instruction = THUMB_OP16 (inst.instruction);
10783 goto op16;
b99bd4ef 10784 }
5f4273c7 10785
c19d1205
ZW
10786 inst.instruction = THUMB_OP16 (inst.instruction);
10787 if (!inst.operands[1].isreg)
10788 if (move_or_literal_pool (0, /*thumb_p=*/TRUE, /*mode_3=*/FALSE))
10789 return;
b99bd4ef 10790
c19d1205
ZW
10791 constraint (!inst.operands[1].preind
10792 || inst.operands[1].shifted
10793 || inst.operands[1].writeback,
10794 _("Thumb does not support this addressing mode"));
10795 if (inst.operands[1].reg == REG_PC || inst.operands[1].reg == REG_SP)
90e4755a 10796 {
c19d1205
ZW
10797 constraint (inst.instruction & 0x0600,
10798 _("byte or halfword not valid for base register"));
10799 constraint (inst.operands[1].reg == REG_PC
10800 && !(inst.instruction & THUMB_LOAD_BIT),
10801 _("r15 based store not allowed"));
10802 constraint (inst.operands[1].immisreg,
10803 _("invalid base register for register offset"));
b99bd4ef 10804
c19d1205
ZW
10805 if (inst.operands[1].reg == REG_PC)
10806 inst.instruction = T_OPCODE_LDR_PC;
10807 else if (inst.instruction & THUMB_LOAD_BIT)
10808 inst.instruction = T_OPCODE_LDR_SP;
10809 else
10810 inst.instruction = T_OPCODE_STR_SP;
b99bd4ef 10811
c19d1205
ZW
10812 inst.instruction |= inst.operands[0].reg << 8;
10813 inst.reloc.type = BFD_RELOC_ARM_THUMB_OFFSET;
10814 return;
10815 }
90e4755a 10816
c19d1205
ZW
10817 constraint (inst.operands[1].reg > 7, BAD_HIREG);
10818 if (!inst.operands[1].immisreg)
10819 {
10820 /* Immediate offset. */
10821 inst.instruction |= inst.operands[0].reg;
10822 inst.instruction |= inst.operands[1].reg << 3;
10823 inst.reloc.type = BFD_RELOC_ARM_THUMB_OFFSET;
10824 return;
10825 }
90e4755a 10826
c19d1205
ZW
10827 /* Register offset. */
10828 constraint (inst.operands[1].imm > 7, BAD_HIREG);
10829 constraint (inst.operands[1].negative,
10830 _("Thumb does not support this addressing mode"));
90e4755a 10831
c19d1205
ZW
10832 op16:
10833 switch (inst.instruction)
10834 {
10835 case T_OPCODE_STR_IW: inst.instruction = T_OPCODE_STR_RW; break;
10836 case T_OPCODE_STR_IH: inst.instruction = T_OPCODE_STR_RH; break;
10837 case T_OPCODE_STR_IB: inst.instruction = T_OPCODE_STR_RB; break;
10838 case T_OPCODE_LDR_IW: inst.instruction = T_OPCODE_LDR_RW; break;
10839 case T_OPCODE_LDR_IH: inst.instruction = T_OPCODE_LDR_RH; break;
10840 case T_OPCODE_LDR_IB: inst.instruction = T_OPCODE_LDR_RB; break;
10841 case 0x5600 /* ldrsb */:
10842 case 0x5e00 /* ldrsh */: break;
10843 default: abort ();
10844 }
90e4755a 10845
c19d1205
ZW
10846 inst.instruction |= inst.operands[0].reg;
10847 inst.instruction |= inst.operands[1].reg << 3;
10848 inst.instruction |= inst.operands[1].imm << 6;
10849}
90e4755a 10850
c19d1205
ZW
10851static void
10852do_t_ldstd (void)
10853{
10854 if (!inst.operands[1].present)
b99bd4ef 10855 {
c19d1205
ZW
10856 inst.operands[1].reg = inst.operands[0].reg + 1;
10857 constraint (inst.operands[0].reg == REG_LR,
10858 _("r14 not allowed here"));
bd340a04 10859 constraint (inst.operands[0].reg == REG_R12,
477330fc 10860 _("r12 not allowed here"));
b99bd4ef 10861 }
bd340a04
MGD
10862
10863 if (inst.operands[2].writeback
10864 && (inst.operands[0].reg == inst.operands[2].reg
10865 || inst.operands[1].reg == inst.operands[2].reg))
10866 as_warn (_("base register written back, and overlaps "
477330fc 10867 "one of transfer registers"));
bd340a04 10868
c19d1205
ZW
10869 inst.instruction |= inst.operands[0].reg << 12;
10870 inst.instruction |= inst.operands[1].reg << 8;
10871 encode_thumb32_addr_mode (2, /*is_t=*/FALSE, /*is_d=*/TRUE);
b99bd4ef
NC
10872}
10873
c19d1205
ZW
10874static void
10875do_t_ldstt (void)
10876{
10877 inst.instruction |= inst.operands[0].reg << 12;
10878 encode_thumb32_addr_mode (1, /*is_t=*/TRUE, /*is_d=*/FALSE);
10879}
a737bd4d 10880
b99bd4ef 10881static void
c19d1205 10882do_t_mla (void)
b99bd4ef 10883{
fdfde340 10884 unsigned Rd, Rn, Rm, Ra;
c921be7d 10885
fdfde340
JM
10886 Rd = inst.operands[0].reg;
10887 Rn = inst.operands[1].reg;
10888 Rm = inst.operands[2].reg;
10889 Ra = inst.operands[3].reg;
10890
10891 reject_bad_reg (Rd);
10892 reject_bad_reg (Rn);
10893 reject_bad_reg (Rm);
10894 reject_bad_reg (Ra);
10895
10896 inst.instruction |= Rd << 8;
10897 inst.instruction |= Rn << 16;
10898 inst.instruction |= Rm;
10899 inst.instruction |= Ra << 12;
c19d1205 10900}
b99bd4ef 10901
c19d1205
ZW
10902static void
10903do_t_mlal (void)
10904{
fdfde340
JM
10905 unsigned RdLo, RdHi, Rn, Rm;
10906
10907 RdLo = inst.operands[0].reg;
10908 RdHi = inst.operands[1].reg;
10909 Rn = inst.operands[2].reg;
10910 Rm = inst.operands[3].reg;
10911
10912 reject_bad_reg (RdLo);
10913 reject_bad_reg (RdHi);
10914 reject_bad_reg (Rn);
10915 reject_bad_reg (Rm);
10916
10917 inst.instruction |= RdLo << 12;
10918 inst.instruction |= RdHi << 8;
10919 inst.instruction |= Rn << 16;
10920 inst.instruction |= Rm;
c19d1205 10921}
b99bd4ef 10922
c19d1205
ZW
10923static void
10924do_t_mov_cmp (void)
10925{
fdfde340
JM
10926 unsigned Rn, Rm;
10927
10928 Rn = inst.operands[0].reg;
10929 Rm = inst.operands[1].reg;
10930
e07e6e58
NC
10931 if (Rn == REG_PC)
10932 set_it_insn_type_last ();
10933
c19d1205 10934 if (unified_syntax)
b99bd4ef 10935 {
c19d1205
ZW
10936 int r0off = (inst.instruction == T_MNEM_mov
10937 || inst.instruction == T_MNEM_movs) ? 8 : 16;
0110f2b8 10938 unsigned long opcode;
3d388997
PB
10939 bfd_boolean narrow;
10940 bfd_boolean low_regs;
10941
fdfde340 10942 low_regs = (Rn <= 7 && Rm <= 7);
0110f2b8 10943 opcode = inst.instruction;
e07e6e58 10944 if (in_it_block ())
0110f2b8 10945 narrow = opcode != T_MNEM_movs;
3d388997 10946 else
0110f2b8 10947 narrow = opcode != T_MNEM_movs || low_regs;
3d388997
PB
10948 if (inst.size_req == 4
10949 || inst.operands[1].shifted)
10950 narrow = FALSE;
10951
efd81785
PB
10952 /* MOVS PC, LR is encoded as SUBS PC, LR, #0. */
10953 if (opcode == T_MNEM_movs && inst.operands[1].isreg
10954 && !inst.operands[1].shifted
fdfde340
JM
10955 && Rn == REG_PC
10956 && Rm == REG_LR)
efd81785
PB
10957 {
10958 inst.instruction = T2_SUBS_PC_LR;
10959 return;
10960 }
10961
fdfde340
JM
10962 if (opcode == T_MNEM_cmp)
10963 {
10964 constraint (Rn == REG_PC, BAD_PC);
94206790
MM
10965 if (narrow)
10966 {
10967 /* In the Thumb-2 ISA, use of R13 as Rm is deprecated,
10968 but valid. */
10969 warn_deprecated_sp (Rm);
10970 /* R15 was documented as a valid choice for Rm in ARMv6,
10971 but as UNPREDICTABLE in ARMv7. ARM's proprietary
10972 tools reject R15, so we do too. */
10973 constraint (Rm == REG_PC, BAD_PC);
10974 }
10975 else
10976 reject_bad_reg (Rm);
fdfde340
JM
10977 }
10978 else if (opcode == T_MNEM_mov
10979 || opcode == T_MNEM_movs)
10980 {
10981 if (inst.operands[1].isreg)
10982 {
10983 if (opcode == T_MNEM_movs)
10984 {
10985 reject_bad_reg (Rn);
10986 reject_bad_reg (Rm);
10987 }
76fa04a4
MGD
10988 else if (narrow)
10989 {
10990 /* This is mov.n. */
10991 if ((Rn == REG_SP || Rn == REG_PC)
10992 && (Rm == REG_SP || Rm == REG_PC))
10993 {
10994 as_warn (_("Use of r%u as a source register is "
10995 "deprecated when r%u is the destination "
10996 "register."), Rm, Rn);
10997 }
10998 }
10999 else
11000 {
11001 /* This is mov.w. */
11002 constraint (Rn == REG_PC, BAD_PC);
11003 constraint (Rm == REG_PC, BAD_PC);
11004 constraint (Rn == REG_SP && Rm == REG_SP, BAD_SP);
11005 }
fdfde340
JM
11006 }
11007 else
11008 reject_bad_reg (Rn);
11009 }
11010
c19d1205
ZW
11011 if (!inst.operands[1].isreg)
11012 {
0110f2b8 11013 /* Immediate operand. */
e07e6e58 11014 if (!in_it_block () && opcode == T_MNEM_mov)
0110f2b8
PB
11015 narrow = 0;
11016 if (low_regs && narrow)
11017 {
11018 inst.instruction = THUMB_OP16 (opcode);
fdfde340 11019 inst.instruction |= Rn << 8;
0110f2b8
PB
11020 if (inst.size_req == 2)
11021 inst.reloc.type = BFD_RELOC_ARM_THUMB_IMM;
11022 else
11023 inst.relax = opcode;
11024 }
11025 else
11026 {
11027 inst.instruction = THUMB_OP32 (inst.instruction);
11028 inst.instruction = (inst.instruction & 0xe1ffffff) | 0x10000000;
fdfde340 11029 inst.instruction |= Rn << r0off;
0110f2b8
PB
11030 inst.reloc.type = BFD_RELOC_ARM_T32_IMMEDIATE;
11031 }
c19d1205 11032 }
728ca7c9
PB
11033 else if (inst.operands[1].shifted && inst.operands[1].immisreg
11034 && (inst.instruction == T_MNEM_mov
11035 || inst.instruction == T_MNEM_movs))
11036 {
11037 /* Register shifts are encoded as separate shift instructions. */
11038 bfd_boolean flags = (inst.instruction == T_MNEM_movs);
11039
e07e6e58 11040 if (in_it_block ())
728ca7c9
PB
11041 narrow = !flags;
11042 else
11043 narrow = flags;
11044
11045 if (inst.size_req == 4)
11046 narrow = FALSE;
11047
11048 if (!low_regs || inst.operands[1].imm > 7)
11049 narrow = FALSE;
11050
fdfde340 11051 if (Rn != Rm)
728ca7c9
PB
11052 narrow = FALSE;
11053
11054 switch (inst.operands[1].shift_kind)
11055 {
11056 case SHIFT_LSL:
11057 opcode = narrow ? T_OPCODE_LSL_R : THUMB_OP32 (T_MNEM_lsl);
11058 break;
11059 case SHIFT_ASR:
11060 opcode = narrow ? T_OPCODE_ASR_R : THUMB_OP32 (T_MNEM_asr);
11061 break;
11062 case SHIFT_LSR:
11063 opcode = narrow ? T_OPCODE_LSR_R : THUMB_OP32 (T_MNEM_lsr);
11064 break;
11065 case SHIFT_ROR:
11066 opcode = narrow ? T_OPCODE_ROR_R : THUMB_OP32 (T_MNEM_ror);
11067 break;
11068 default:
5f4273c7 11069 abort ();
728ca7c9
PB
11070 }
11071
11072 inst.instruction = opcode;
11073 if (narrow)
11074 {
fdfde340 11075 inst.instruction |= Rn;
728ca7c9
PB
11076 inst.instruction |= inst.operands[1].imm << 3;
11077 }
11078 else
11079 {
11080 if (flags)
11081 inst.instruction |= CONDS_BIT;
11082
fdfde340
JM
11083 inst.instruction |= Rn << 8;
11084 inst.instruction |= Rm << 16;
728ca7c9
PB
11085 inst.instruction |= inst.operands[1].imm;
11086 }
11087 }
3d388997 11088 else if (!narrow)
c19d1205 11089 {
728ca7c9
PB
11090 /* Some mov with immediate shift have narrow variants.
11091 Register shifts are handled above. */
11092 if (low_regs && inst.operands[1].shifted
11093 && (inst.instruction == T_MNEM_mov
11094 || inst.instruction == T_MNEM_movs))
11095 {
e07e6e58 11096 if (in_it_block ())
728ca7c9
PB
11097 narrow = (inst.instruction == T_MNEM_mov);
11098 else
11099 narrow = (inst.instruction == T_MNEM_movs);
11100 }
11101
11102 if (narrow)
11103 {
11104 switch (inst.operands[1].shift_kind)
11105 {
11106 case SHIFT_LSL: inst.instruction = T_OPCODE_LSL_I; break;
11107 case SHIFT_LSR: inst.instruction = T_OPCODE_LSR_I; break;
11108 case SHIFT_ASR: inst.instruction = T_OPCODE_ASR_I; break;
11109 default: narrow = FALSE; break;
11110 }
11111 }
11112
11113 if (narrow)
11114 {
fdfde340
JM
11115 inst.instruction |= Rn;
11116 inst.instruction |= Rm << 3;
728ca7c9
PB
11117 inst.reloc.type = BFD_RELOC_ARM_THUMB_SHIFT;
11118 }
11119 else
11120 {
11121 inst.instruction = THUMB_OP32 (inst.instruction);
fdfde340 11122 inst.instruction |= Rn << r0off;
728ca7c9
PB
11123 encode_thumb32_shifted_operand (1);
11124 }
c19d1205
ZW
11125 }
11126 else
11127 switch (inst.instruction)
11128 {
11129 case T_MNEM_mov:
837b3435 11130 /* In v4t or v5t a move of two lowregs produces unpredictable
c6400f8a
MGD
11131 results. Don't allow this. */
11132 if (low_regs)
11133 {
11134 constraint (!ARM_CPU_HAS_FEATURE (cpu_variant, arm_ext_v6),
11135 "MOV Rd, Rs with two low registers is not "
11136 "permitted on this architecture");
fa94de6b 11137 ARM_MERGE_FEATURE_SETS (thumb_arch_used, thumb_arch_used,
c6400f8a
MGD
11138 arm_ext_v6);
11139 }
11140
c19d1205 11141 inst.instruction = T_OPCODE_MOV_HR;
fdfde340
JM
11142 inst.instruction |= (Rn & 0x8) << 4;
11143 inst.instruction |= (Rn & 0x7);
11144 inst.instruction |= Rm << 3;
c19d1205 11145 break;
b99bd4ef 11146
c19d1205
ZW
11147 case T_MNEM_movs:
11148 /* We know we have low registers at this point.
941a8a52
MGD
11149 Generate LSLS Rd, Rs, #0. */
11150 inst.instruction = T_OPCODE_LSL_I;
fdfde340
JM
11151 inst.instruction |= Rn;
11152 inst.instruction |= Rm << 3;
c19d1205
ZW
11153 break;
11154
11155 case T_MNEM_cmp:
3d388997 11156 if (low_regs)
c19d1205
ZW
11157 {
11158 inst.instruction = T_OPCODE_CMP_LR;
fdfde340
JM
11159 inst.instruction |= Rn;
11160 inst.instruction |= Rm << 3;
c19d1205
ZW
11161 }
11162 else
11163 {
11164 inst.instruction = T_OPCODE_CMP_HR;
fdfde340
JM
11165 inst.instruction |= (Rn & 0x8) << 4;
11166 inst.instruction |= (Rn & 0x7);
11167 inst.instruction |= Rm << 3;
c19d1205
ZW
11168 }
11169 break;
11170 }
b99bd4ef
NC
11171 return;
11172 }
11173
c19d1205 11174 inst.instruction = THUMB_OP16 (inst.instruction);
539d4391
NC
11175
11176 /* PR 10443: Do not silently ignore shifted operands. */
11177 constraint (inst.operands[1].shifted,
11178 _("shifts in CMP/MOV instructions are only supported in unified syntax"));
11179
c19d1205 11180 if (inst.operands[1].isreg)
b99bd4ef 11181 {
fdfde340 11182 if (Rn < 8 && Rm < 8)
b99bd4ef 11183 {
c19d1205
ZW
11184 /* A move of two lowregs is encoded as ADD Rd, Rs, #0
11185 since a MOV instruction produces unpredictable results. */
11186 if (inst.instruction == T_OPCODE_MOV_I8)
11187 inst.instruction = T_OPCODE_ADD_I3;
b99bd4ef 11188 else
c19d1205 11189 inst.instruction = T_OPCODE_CMP_LR;
b99bd4ef 11190
fdfde340
JM
11191 inst.instruction |= Rn;
11192 inst.instruction |= Rm << 3;
b99bd4ef
NC
11193 }
11194 else
11195 {
c19d1205
ZW
11196 if (inst.instruction == T_OPCODE_MOV_I8)
11197 inst.instruction = T_OPCODE_MOV_HR;
11198 else
11199 inst.instruction = T_OPCODE_CMP_HR;
11200 do_t_cpy ();
b99bd4ef
NC
11201 }
11202 }
c19d1205 11203 else
b99bd4ef 11204 {
fdfde340 11205 constraint (Rn > 7,
c19d1205 11206 _("only lo regs allowed with immediate"));
fdfde340 11207 inst.instruction |= Rn << 8;
c19d1205
ZW
11208 inst.reloc.type = BFD_RELOC_ARM_THUMB_IMM;
11209 }
11210}
b99bd4ef 11211
c19d1205
ZW
11212static void
11213do_t_mov16 (void)
11214{
fdfde340 11215 unsigned Rd;
b6895b4f
PB
11216 bfd_vma imm;
11217 bfd_boolean top;
11218
11219 top = (inst.instruction & 0x00800000) != 0;
11220 if (inst.reloc.type == BFD_RELOC_ARM_MOVW)
11221 {
11222 constraint (top, _(":lower16: not allowed this instruction"));
11223 inst.reloc.type = BFD_RELOC_ARM_THUMB_MOVW;
11224 }
11225 else if (inst.reloc.type == BFD_RELOC_ARM_MOVT)
11226 {
11227 constraint (!top, _(":upper16: not allowed this instruction"));
11228 inst.reloc.type = BFD_RELOC_ARM_THUMB_MOVT;
11229 }
11230
fdfde340
JM
11231 Rd = inst.operands[0].reg;
11232 reject_bad_reg (Rd);
11233
11234 inst.instruction |= Rd << 8;
b6895b4f
PB
11235 if (inst.reloc.type == BFD_RELOC_UNUSED)
11236 {
11237 imm = inst.reloc.exp.X_add_number;
11238 inst.instruction |= (imm & 0xf000) << 4;
11239 inst.instruction |= (imm & 0x0800) << 15;
11240 inst.instruction |= (imm & 0x0700) << 4;
11241 inst.instruction |= (imm & 0x00ff);
11242 }
c19d1205 11243}
b99bd4ef 11244
c19d1205
ZW
11245static void
11246do_t_mvn_tst (void)
11247{
fdfde340 11248 unsigned Rn, Rm;
c921be7d 11249
fdfde340
JM
11250 Rn = inst.operands[0].reg;
11251 Rm = inst.operands[1].reg;
11252
11253 if (inst.instruction == T_MNEM_cmp
11254 || inst.instruction == T_MNEM_cmn)
11255 constraint (Rn == REG_PC, BAD_PC);
11256 else
11257 reject_bad_reg (Rn);
11258 reject_bad_reg (Rm);
11259
c19d1205
ZW
11260 if (unified_syntax)
11261 {
11262 int r0off = (inst.instruction == T_MNEM_mvn
11263 || inst.instruction == T_MNEM_mvns) ? 8 : 16;
3d388997
PB
11264 bfd_boolean narrow;
11265
11266 if (inst.size_req == 4
11267 || inst.instruction > 0xffff
11268 || inst.operands[1].shifted
fdfde340 11269 || Rn > 7 || Rm > 7)
3d388997
PB
11270 narrow = FALSE;
11271 else if (inst.instruction == T_MNEM_cmn)
11272 narrow = TRUE;
11273 else if (THUMB_SETS_FLAGS (inst.instruction))
e07e6e58 11274 narrow = !in_it_block ();
3d388997 11275 else
e07e6e58 11276 narrow = in_it_block ();
3d388997 11277
c19d1205 11278 if (!inst.operands[1].isreg)
b99bd4ef 11279 {
c19d1205
ZW
11280 /* For an immediate, we always generate a 32-bit opcode;
11281 section relaxation will shrink it later if possible. */
11282 if (inst.instruction < 0xffff)
11283 inst.instruction = THUMB_OP32 (inst.instruction);
11284 inst.instruction = (inst.instruction & 0xe1ffffff) | 0x10000000;
fdfde340 11285 inst.instruction |= Rn << r0off;
c19d1205 11286 inst.reloc.type = BFD_RELOC_ARM_T32_IMMEDIATE;
b99bd4ef 11287 }
c19d1205 11288 else
b99bd4ef 11289 {
c19d1205 11290 /* See if we can do this with a 16-bit instruction. */
3d388997 11291 if (narrow)
b99bd4ef 11292 {
c19d1205 11293 inst.instruction = THUMB_OP16 (inst.instruction);
fdfde340
JM
11294 inst.instruction |= Rn;
11295 inst.instruction |= Rm << 3;
b99bd4ef 11296 }
c19d1205 11297 else
b99bd4ef 11298 {
c19d1205
ZW
11299 constraint (inst.operands[1].shifted
11300 && inst.operands[1].immisreg,
11301 _("shift must be constant"));
11302 if (inst.instruction < 0xffff)
11303 inst.instruction = THUMB_OP32 (inst.instruction);
fdfde340 11304 inst.instruction |= Rn << r0off;
c19d1205 11305 encode_thumb32_shifted_operand (1);
b99bd4ef 11306 }
b99bd4ef
NC
11307 }
11308 }
11309 else
11310 {
c19d1205
ZW
11311 constraint (inst.instruction > 0xffff
11312 || inst.instruction == T_MNEM_mvns, BAD_THUMB32);
11313 constraint (!inst.operands[1].isreg || inst.operands[1].shifted,
11314 _("unshifted register required"));
fdfde340 11315 constraint (Rn > 7 || Rm > 7,
c19d1205 11316 BAD_HIREG);
b99bd4ef 11317
c19d1205 11318 inst.instruction = THUMB_OP16 (inst.instruction);
fdfde340
JM
11319 inst.instruction |= Rn;
11320 inst.instruction |= Rm << 3;
b99bd4ef 11321 }
b99bd4ef
NC
11322}
11323
b05fe5cf 11324static void
c19d1205 11325do_t_mrs (void)
b05fe5cf 11326{
fdfde340 11327 unsigned Rd;
037e8744
JB
11328
11329 if (do_vfp_nsyn_mrs () == SUCCESS)
11330 return;
11331
90ec0d68
MGD
11332 Rd = inst.operands[0].reg;
11333 reject_bad_reg (Rd);
11334 inst.instruction |= Rd << 8;
11335
11336 if (inst.operands[1].isreg)
62b3e311 11337 {
90ec0d68
MGD
11338 unsigned br = inst.operands[1].reg;
11339 if (((br & 0x200) == 0) && ((br & 0xf000) != 0xf000))
11340 as_bad (_("bad register for mrs"));
11341
11342 inst.instruction |= br & (0xf << 16);
11343 inst.instruction |= (br & 0x300) >> 4;
11344 inst.instruction |= (br & SPSR_BIT) >> 2;
62b3e311
PB
11345 }
11346 else
11347 {
90ec0d68 11348 int flags = inst.operands[1].imm & (PSR_c|PSR_x|PSR_s|PSR_f|SPSR_BIT);
5f4273c7 11349
d2cd1205 11350 if (ARM_CPU_HAS_FEATURE (selected_cpu, arm_ext_m))
1a43faaf
NC
11351 {
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 ((flags != 0) && m_profile, _("selected processor does "
11357 "not support requested special purpose register"));
11358 }
90ec0d68 11359 else
d2cd1205
JB
11360 /* mrs only accepts APSR/CPSR/SPSR/CPSR_all/SPSR_all (for non-M profile
11361 devices). */
11362 constraint ((flags & ~SPSR_BIT) != (PSR_c|PSR_f),
11363 _("'APSR', 'CPSR' or 'SPSR' expected"));
fdfde340 11364
90ec0d68
MGD
11365 inst.instruction |= (flags & SPSR_BIT) >> 2;
11366 inst.instruction |= inst.operands[1].imm & 0xff;
11367 inst.instruction |= 0xf0000;
11368 }
c19d1205 11369}
b05fe5cf 11370
c19d1205
ZW
11371static void
11372do_t_msr (void)
11373{
62b3e311 11374 int flags;
fdfde340 11375 unsigned Rn;
62b3e311 11376
037e8744
JB
11377 if (do_vfp_nsyn_msr () == SUCCESS)
11378 return;
11379
c19d1205
ZW
11380 constraint (!inst.operands[1].isreg,
11381 _("Thumb encoding does not support an immediate here"));
90ec0d68
MGD
11382
11383 if (inst.operands[0].isreg)
11384 flags = (int)(inst.operands[0].reg);
11385 else
11386 flags = inst.operands[0].imm;
11387
d2cd1205 11388 if (ARM_CPU_HAS_FEATURE (selected_cpu, arm_ext_m))
62b3e311 11389 {
d2cd1205
JB
11390 int bits = inst.operands[0].imm & (PSR_c|PSR_x|PSR_s|PSR_f|SPSR_BIT);
11391
1a43faaf 11392 /* PR gas/12698: The constraint is only applied for m_profile.
477330fc
RM
11393 If the user has specified -march=all, we want to ignore it as
11394 we are building for any CPU type, including non-m variants. */
1a43faaf
NC
11395 bfd_boolean m_profile = selected_cpu.core != arm_arch_any.core;
11396 constraint (((ARM_CPU_HAS_FEATURE (selected_cpu, arm_ext_v6_dsp)
477330fc
RM
11397 && (bits & ~(PSR_s | PSR_f)) != 0)
11398 || (!ARM_CPU_HAS_FEATURE (selected_cpu, arm_ext_v6_dsp)
11399 && bits != PSR_f)) && m_profile,
11400 _("selected processor does not support requested special "
11401 "purpose register"));
62b3e311
PB
11402 }
11403 else
d2cd1205
JB
11404 constraint ((flags & 0xff) != 0, _("selected processor does not support "
11405 "requested special purpose register"));
c921be7d 11406
fdfde340
JM
11407 Rn = inst.operands[1].reg;
11408 reject_bad_reg (Rn);
11409
62b3e311 11410 inst.instruction |= (flags & SPSR_BIT) >> 2;
90ec0d68
MGD
11411 inst.instruction |= (flags & 0xf0000) >> 8;
11412 inst.instruction |= (flags & 0x300) >> 4;
62b3e311 11413 inst.instruction |= (flags & 0xff);
fdfde340 11414 inst.instruction |= Rn << 16;
c19d1205 11415}
b05fe5cf 11416
c19d1205
ZW
11417static void
11418do_t_mul (void)
11419{
17828f45 11420 bfd_boolean narrow;
fdfde340 11421 unsigned Rd, Rn, Rm;
17828f45 11422
c19d1205
ZW
11423 if (!inst.operands[2].present)
11424 inst.operands[2].reg = inst.operands[0].reg;
b05fe5cf 11425
fdfde340
JM
11426 Rd = inst.operands[0].reg;
11427 Rn = inst.operands[1].reg;
11428 Rm = inst.operands[2].reg;
11429
17828f45 11430 if (unified_syntax)
b05fe5cf 11431 {
17828f45 11432 if (inst.size_req == 4
fdfde340
JM
11433 || (Rd != Rn
11434 && Rd != Rm)
11435 || Rn > 7
11436 || Rm > 7)
17828f45
JM
11437 narrow = FALSE;
11438 else if (inst.instruction == T_MNEM_muls)
e07e6e58 11439 narrow = !in_it_block ();
17828f45 11440 else
e07e6e58 11441 narrow = in_it_block ();
b05fe5cf 11442 }
c19d1205 11443 else
b05fe5cf 11444 {
17828f45 11445 constraint (inst.instruction == T_MNEM_muls, BAD_THUMB32);
fdfde340 11446 constraint (Rn > 7 || Rm > 7,
c19d1205 11447 BAD_HIREG);
17828f45
JM
11448 narrow = TRUE;
11449 }
b05fe5cf 11450
17828f45
JM
11451 if (narrow)
11452 {
11453 /* 16-bit MULS/Conditional MUL. */
c19d1205 11454 inst.instruction = THUMB_OP16 (inst.instruction);
fdfde340 11455 inst.instruction |= Rd;
b05fe5cf 11456
fdfde340
JM
11457 if (Rd == Rn)
11458 inst.instruction |= Rm << 3;
11459 else if (Rd == Rm)
11460 inst.instruction |= Rn << 3;
c19d1205
ZW
11461 else
11462 constraint (1, _("dest must overlap one source register"));
11463 }
17828f45
JM
11464 else
11465 {
e07e6e58
NC
11466 constraint (inst.instruction != T_MNEM_mul,
11467 _("Thumb-2 MUL must not set flags"));
17828f45
JM
11468 /* 32-bit MUL. */
11469 inst.instruction = THUMB_OP32 (inst.instruction);
fdfde340
JM
11470 inst.instruction |= Rd << 8;
11471 inst.instruction |= Rn << 16;
11472 inst.instruction |= Rm << 0;
11473
11474 reject_bad_reg (Rd);
11475 reject_bad_reg (Rn);
11476 reject_bad_reg (Rm);
17828f45 11477 }
c19d1205 11478}
b05fe5cf 11479
c19d1205
ZW
11480static void
11481do_t_mull (void)
11482{
fdfde340 11483 unsigned RdLo, RdHi, Rn, Rm;
b05fe5cf 11484
fdfde340
JM
11485 RdLo = inst.operands[0].reg;
11486 RdHi = inst.operands[1].reg;
11487 Rn = inst.operands[2].reg;
11488 Rm = inst.operands[3].reg;
11489
11490 reject_bad_reg (RdLo);
11491 reject_bad_reg (RdHi);
11492 reject_bad_reg (Rn);
11493 reject_bad_reg (Rm);
11494
11495 inst.instruction |= RdLo << 12;
11496 inst.instruction |= RdHi << 8;
11497 inst.instruction |= Rn << 16;
11498 inst.instruction |= Rm;
11499
11500 if (RdLo == RdHi)
c19d1205
ZW
11501 as_tsktsk (_("rdhi and rdlo must be different"));
11502}
b05fe5cf 11503
c19d1205
ZW
11504static void
11505do_t_nop (void)
11506{
e07e6e58
NC
11507 set_it_insn_type (NEUTRAL_IT_INSN);
11508
c19d1205
ZW
11509 if (unified_syntax)
11510 {
11511 if (inst.size_req == 4 || inst.operands[0].imm > 15)
b05fe5cf 11512 {
c19d1205
ZW
11513 inst.instruction = THUMB_OP32 (inst.instruction);
11514 inst.instruction |= inst.operands[0].imm;
11515 }
11516 else
11517 {
bc2d1808
NC
11518 /* PR9722: Check for Thumb2 availability before
11519 generating a thumb2 nop instruction. */
afa62d5e 11520 if (ARM_CPU_HAS_FEATURE (selected_cpu, arm_ext_v6t2))
bc2d1808
NC
11521 {
11522 inst.instruction = THUMB_OP16 (inst.instruction);
11523 inst.instruction |= inst.operands[0].imm << 4;
11524 }
11525 else
11526 inst.instruction = 0x46c0;
c19d1205
ZW
11527 }
11528 }
11529 else
11530 {
11531 constraint (inst.operands[0].present,
11532 _("Thumb does not support NOP with hints"));
11533 inst.instruction = 0x46c0;
11534 }
11535}
b05fe5cf 11536
c19d1205
ZW
11537static void
11538do_t_neg (void)
11539{
11540 if (unified_syntax)
11541 {
3d388997
PB
11542 bfd_boolean narrow;
11543
11544 if (THUMB_SETS_FLAGS (inst.instruction))
e07e6e58 11545 narrow = !in_it_block ();
3d388997 11546 else
e07e6e58 11547 narrow = in_it_block ();
3d388997
PB
11548 if (inst.operands[0].reg > 7 || inst.operands[1].reg > 7)
11549 narrow = FALSE;
11550 if (inst.size_req == 4)
11551 narrow = FALSE;
11552
11553 if (!narrow)
c19d1205
ZW
11554 {
11555 inst.instruction = THUMB_OP32 (inst.instruction);
11556 inst.instruction |= inst.operands[0].reg << 8;
11557 inst.instruction |= inst.operands[1].reg << 16;
b05fe5cf
ZW
11558 }
11559 else
11560 {
c19d1205
ZW
11561 inst.instruction = THUMB_OP16 (inst.instruction);
11562 inst.instruction |= inst.operands[0].reg;
11563 inst.instruction |= inst.operands[1].reg << 3;
b05fe5cf
ZW
11564 }
11565 }
11566 else
11567 {
c19d1205
ZW
11568 constraint (inst.operands[0].reg > 7 || inst.operands[1].reg > 7,
11569 BAD_HIREG);
11570 constraint (THUMB_SETS_FLAGS (inst.instruction), BAD_THUMB32);
11571
11572 inst.instruction = THUMB_OP16 (inst.instruction);
11573 inst.instruction |= inst.operands[0].reg;
11574 inst.instruction |= inst.operands[1].reg << 3;
11575 }
11576}
11577
1c444d06
JM
11578static void
11579do_t_orn (void)
11580{
11581 unsigned Rd, Rn;
11582
11583 Rd = inst.operands[0].reg;
11584 Rn = inst.operands[1].present ? inst.operands[1].reg : Rd;
11585
fdfde340
JM
11586 reject_bad_reg (Rd);
11587 /* Rn == REG_SP is unpredictable; Rn == REG_PC is MVN. */
11588 reject_bad_reg (Rn);
11589
1c444d06
JM
11590 inst.instruction |= Rd << 8;
11591 inst.instruction |= Rn << 16;
11592
11593 if (!inst.operands[2].isreg)
11594 {
11595 inst.instruction = (inst.instruction & 0xe1ffffff) | 0x10000000;
11596 inst.reloc.type = BFD_RELOC_ARM_T32_IMMEDIATE;
11597 }
11598 else
11599 {
11600 unsigned Rm;
11601
11602 Rm = inst.operands[2].reg;
fdfde340 11603 reject_bad_reg (Rm);
1c444d06
JM
11604
11605 constraint (inst.operands[2].shifted
11606 && inst.operands[2].immisreg,
11607 _("shift must be constant"));
11608 encode_thumb32_shifted_operand (2);
11609 }
11610}
11611
c19d1205
ZW
11612static void
11613do_t_pkhbt (void)
11614{
fdfde340
JM
11615 unsigned Rd, Rn, Rm;
11616
11617 Rd = inst.operands[0].reg;
11618 Rn = inst.operands[1].reg;
11619 Rm = inst.operands[2].reg;
11620
11621 reject_bad_reg (Rd);
11622 reject_bad_reg (Rn);
11623 reject_bad_reg (Rm);
11624
11625 inst.instruction |= Rd << 8;
11626 inst.instruction |= Rn << 16;
11627 inst.instruction |= Rm;
c19d1205
ZW
11628 if (inst.operands[3].present)
11629 {
11630 unsigned int val = inst.reloc.exp.X_add_number;
11631 constraint (inst.reloc.exp.X_op != O_constant,
11632 _("expression too complex"));
11633 inst.instruction |= (val & 0x1c) << 10;
11634 inst.instruction |= (val & 0x03) << 6;
b05fe5cf 11635 }
c19d1205 11636}
b05fe5cf 11637
c19d1205
ZW
11638static void
11639do_t_pkhtb (void)
11640{
11641 if (!inst.operands[3].present)
1ef52f49
NC
11642 {
11643 unsigned Rtmp;
11644
11645 inst.instruction &= ~0x00000020;
11646
11647 /* PR 10168. Swap the Rm and Rn registers. */
11648 Rtmp = inst.operands[1].reg;
11649 inst.operands[1].reg = inst.operands[2].reg;
11650 inst.operands[2].reg = Rtmp;
11651 }
c19d1205 11652 do_t_pkhbt ();
b05fe5cf
ZW
11653}
11654
c19d1205
ZW
11655static void
11656do_t_pld (void)
11657{
fdfde340
JM
11658 if (inst.operands[0].immisreg)
11659 reject_bad_reg (inst.operands[0].imm);
11660
c19d1205
ZW
11661 encode_thumb32_addr_mode (0, /*is_t=*/FALSE, /*is_d=*/FALSE);
11662}
b05fe5cf 11663
c19d1205
ZW
11664static void
11665do_t_push_pop (void)
b99bd4ef 11666{
e9f89963 11667 unsigned mask;
5f4273c7 11668
c19d1205
ZW
11669 constraint (inst.operands[0].writeback,
11670 _("push/pop do not support {reglist}^"));
11671 constraint (inst.reloc.type != BFD_RELOC_UNUSED,
11672 _("expression too complex"));
b99bd4ef 11673
e9f89963
PB
11674 mask = inst.operands[0].imm;
11675 if ((mask & ~0xff) == 0)
3c707909 11676 inst.instruction = THUMB_OP16 (inst.instruction) | mask;
c19d1205 11677 else if ((inst.instruction == T_MNEM_push
e9f89963 11678 && (mask & ~0xff) == 1 << REG_LR)
c19d1205 11679 || (inst.instruction == T_MNEM_pop
e9f89963 11680 && (mask & ~0xff) == 1 << REG_PC))
b99bd4ef 11681 {
c19d1205
ZW
11682 inst.instruction = THUMB_OP16 (inst.instruction);
11683 inst.instruction |= THUMB_PP_PC_LR;
3c707909 11684 inst.instruction |= mask & 0xff;
c19d1205
ZW
11685 }
11686 else if (unified_syntax)
11687 {
3c707909 11688 inst.instruction = THUMB_OP32 (inst.instruction);
5f4273c7 11689 encode_thumb2_ldmstm (13, mask, TRUE);
c19d1205
ZW
11690 }
11691 else
11692 {
11693 inst.error = _("invalid register list to push/pop instruction");
11694 return;
11695 }
c19d1205 11696}
b99bd4ef 11697
c19d1205
ZW
11698static void
11699do_t_rbit (void)
11700{
fdfde340
JM
11701 unsigned Rd, Rm;
11702
11703 Rd = inst.operands[0].reg;
11704 Rm = inst.operands[1].reg;
11705
11706 reject_bad_reg (Rd);
11707 reject_bad_reg (Rm);
11708
11709 inst.instruction |= Rd << 8;
11710 inst.instruction |= Rm << 16;
11711 inst.instruction |= Rm;
c19d1205 11712}
b99bd4ef 11713
c19d1205
ZW
11714static void
11715do_t_rev (void)
11716{
fdfde340
JM
11717 unsigned Rd, Rm;
11718
11719 Rd = inst.operands[0].reg;
11720 Rm = inst.operands[1].reg;
11721
11722 reject_bad_reg (Rd);
11723 reject_bad_reg (Rm);
11724
11725 if (Rd <= 7 && Rm <= 7
c19d1205
ZW
11726 && inst.size_req != 4)
11727 {
11728 inst.instruction = THUMB_OP16 (inst.instruction);
fdfde340
JM
11729 inst.instruction |= Rd;
11730 inst.instruction |= Rm << 3;
c19d1205
ZW
11731 }
11732 else if (unified_syntax)
11733 {
11734 inst.instruction = THUMB_OP32 (inst.instruction);
fdfde340
JM
11735 inst.instruction |= Rd << 8;
11736 inst.instruction |= Rm << 16;
11737 inst.instruction |= Rm;
c19d1205
ZW
11738 }
11739 else
11740 inst.error = BAD_HIREG;
11741}
b99bd4ef 11742
1c444d06
JM
11743static void
11744do_t_rrx (void)
11745{
11746 unsigned Rd, Rm;
11747
11748 Rd = inst.operands[0].reg;
11749 Rm = inst.operands[1].reg;
11750
fdfde340
JM
11751 reject_bad_reg (Rd);
11752 reject_bad_reg (Rm);
c921be7d 11753
1c444d06
JM
11754 inst.instruction |= Rd << 8;
11755 inst.instruction |= Rm;
11756}
11757
c19d1205
ZW
11758static void
11759do_t_rsb (void)
11760{
fdfde340 11761 unsigned Rd, Rs;
b99bd4ef 11762
c19d1205
ZW
11763 Rd = inst.operands[0].reg;
11764 Rs = (inst.operands[1].present
11765 ? inst.operands[1].reg /* Rd, Rs, foo */
11766 : inst.operands[0].reg); /* Rd, foo -> Rd, Rd, foo */
b99bd4ef 11767
fdfde340
JM
11768 reject_bad_reg (Rd);
11769 reject_bad_reg (Rs);
11770 if (inst.operands[2].isreg)
11771 reject_bad_reg (inst.operands[2].reg);
11772
c19d1205
ZW
11773 inst.instruction |= Rd << 8;
11774 inst.instruction |= Rs << 16;
11775 if (!inst.operands[2].isreg)
11776 {
026d3abb
PB
11777 bfd_boolean narrow;
11778
11779 if ((inst.instruction & 0x00100000) != 0)
e07e6e58 11780 narrow = !in_it_block ();
026d3abb 11781 else
e07e6e58 11782 narrow = in_it_block ();
026d3abb
PB
11783
11784 if (Rd > 7 || Rs > 7)
11785 narrow = FALSE;
11786
11787 if (inst.size_req == 4 || !unified_syntax)
11788 narrow = FALSE;
11789
11790 if (inst.reloc.exp.X_op != O_constant
11791 || inst.reloc.exp.X_add_number != 0)
11792 narrow = FALSE;
11793
11794 /* Turn rsb #0 into 16-bit neg. We should probably do this via
477330fc 11795 relaxation, but it doesn't seem worth the hassle. */
026d3abb
PB
11796 if (narrow)
11797 {
11798 inst.reloc.type = BFD_RELOC_UNUSED;
11799 inst.instruction = THUMB_OP16 (T_MNEM_negs);
11800 inst.instruction |= Rs << 3;
11801 inst.instruction |= Rd;
11802 }
11803 else
11804 {
11805 inst.instruction = (inst.instruction & 0xe1ffffff) | 0x10000000;
11806 inst.reloc.type = BFD_RELOC_ARM_T32_IMMEDIATE;
11807 }
c19d1205
ZW
11808 }
11809 else
11810 encode_thumb32_shifted_operand (2);
11811}
b99bd4ef 11812
c19d1205
ZW
11813static void
11814do_t_setend (void)
11815{
12e37cbc
MGD
11816 if (warn_on_deprecated
11817 && ARM_CPU_HAS_FEATURE (cpu_variant, arm_ext_v8))
11818 as_warn (_("setend use is deprecated for ARMv8"));
11819
e07e6e58 11820 set_it_insn_type (OUTSIDE_IT_INSN);
c19d1205
ZW
11821 if (inst.operands[0].imm)
11822 inst.instruction |= 0x8;
11823}
b99bd4ef 11824
c19d1205
ZW
11825static void
11826do_t_shift (void)
11827{
11828 if (!inst.operands[1].present)
11829 inst.operands[1].reg = inst.operands[0].reg;
11830
11831 if (unified_syntax)
11832 {
3d388997
PB
11833 bfd_boolean narrow;
11834 int shift_kind;
11835
11836 switch (inst.instruction)
11837 {
11838 case T_MNEM_asr:
11839 case T_MNEM_asrs: shift_kind = SHIFT_ASR; break;
11840 case T_MNEM_lsl:
11841 case T_MNEM_lsls: shift_kind = SHIFT_LSL; break;
11842 case T_MNEM_lsr:
11843 case T_MNEM_lsrs: shift_kind = SHIFT_LSR; break;
11844 case T_MNEM_ror:
11845 case T_MNEM_rors: shift_kind = SHIFT_ROR; break;
11846 default: abort ();
11847 }
11848
11849 if (THUMB_SETS_FLAGS (inst.instruction))
e07e6e58 11850 narrow = !in_it_block ();
3d388997 11851 else
e07e6e58 11852 narrow = in_it_block ();
3d388997
PB
11853 if (inst.operands[0].reg > 7 || inst.operands[1].reg > 7)
11854 narrow = FALSE;
11855 if (!inst.operands[2].isreg && shift_kind == SHIFT_ROR)
11856 narrow = FALSE;
11857 if (inst.operands[2].isreg
11858 && (inst.operands[1].reg != inst.operands[0].reg
11859 || inst.operands[2].reg > 7))
11860 narrow = FALSE;
11861 if (inst.size_req == 4)
11862 narrow = FALSE;
11863
fdfde340
JM
11864 reject_bad_reg (inst.operands[0].reg);
11865 reject_bad_reg (inst.operands[1].reg);
c921be7d 11866
3d388997 11867 if (!narrow)
c19d1205
ZW
11868 {
11869 if (inst.operands[2].isreg)
b99bd4ef 11870 {
fdfde340 11871 reject_bad_reg (inst.operands[2].reg);
c19d1205
ZW
11872 inst.instruction = THUMB_OP32 (inst.instruction);
11873 inst.instruction |= inst.operands[0].reg << 8;
11874 inst.instruction |= inst.operands[1].reg << 16;
11875 inst.instruction |= inst.operands[2].reg;
94342ec3
NC
11876
11877 /* PR 12854: Error on extraneous shifts. */
11878 constraint (inst.operands[2].shifted,
11879 _("extraneous shift as part of operand to shift insn"));
c19d1205
ZW
11880 }
11881 else
11882 {
11883 inst.operands[1].shifted = 1;
3d388997 11884 inst.operands[1].shift_kind = shift_kind;
c19d1205
ZW
11885 inst.instruction = THUMB_OP32 (THUMB_SETS_FLAGS (inst.instruction)
11886 ? T_MNEM_movs : T_MNEM_mov);
11887 inst.instruction |= inst.operands[0].reg << 8;
11888 encode_thumb32_shifted_operand (1);
11889 /* Prevent the incorrect generation of an ARM_IMMEDIATE fixup. */
11890 inst.reloc.type = BFD_RELOC_UNUSED;
b99bd4ef
NC
11891 }
11892 }
11893 else
11894 {
c19d1205 11895 if (inst.operands[2].isreg)
b99bd4ef 11896 {
3d388997 11897 switch (shift_kind)
b99bd4ef 11898 {
3d388997
PB
11899 case SHIFT_ASR: inst.instruction = T_OPCODE_ASR_R; break;
11900 case SHIFT_LSL: inst.instruction = T_OPCODE_LSL_R; break;
11901 case SHIFT_LSR: inst.instruction = T_OPCODE_LSR_R; break;
11902 case SHIFT_ROR: inst.instruction = T_OPCODE_ROR_R; break;
c19d1205 11903 default: abort ();
b99bd4ef 11904 }
5f4273c7 11905
c19d1205
ZW
11906 inst.instruction |= inst.operands[0].reg;
11907 inst.instruction |= inst.operands[2].reg << 3;
af199b06
NC
11908
11909 /* PR 12854: Error on extraneous shifts. */
11910 constraint (inst.operands[2].shifted,
11911 _("extraneous shift as part of operand to shift insn"));
b99bd4ef
NC
11912 }
11913 else
11914 {
3d388997 11915 switch (shift_kind)
b99bd4ef 11916 {
3d388997
PB
11917 case SHIFT_ASR: inst.instruction = T_OPCODE_ASR_I; break;
11918 case SHIFT_LSL: inst.instruction = T_OPCODE_LSL_I; break;
11919 case SHIFT_LSR: inst.instruction = T_OPCODE_LSR_I; break;
c19d1205 11920 default: abort ();
b99bd4ef 11921 }
c19d1205
ZW
11922 inst.reloc.type = BFD_RELOC_ARM_THUMB_SHIFT;
11923 inst.instruction |= inst.operands[0].reg;
11924 inst.instruction |= inst.operands[1].reg << 3;
b99bd4ef
NC
11925 }
11926 }
c19d1205
ZW
11927 }
11928 else
11929 {
11930 constraint (inst.operands[0].reg > 7
11931 || inst.operands[1].reg > 7, BAD_HIREG);
11932 constraint (THUMB_SETS_FLAGS (inst.instruction), BAD_THUMB32);
b99bd4ef 11933
c19d1205
ZW
11934 if (inst.operands[2].isreg) /* Rd, {Rs,} Rn */
11935 {
11936 constraint (inst.operands[2].reg > 7, BAD_HIREG);
11937 constraint (inst.operands[0].reg != inst.operands[1].reg,
11938 _("source1 and dest must be same register"));
b99bd4ef 11939
c19d1205
ZW
11940 switch (inst.instruction)
11941 {
11942 case T_MNEM_asr: inst.instruction = T_OPCODE_ASR_R; break;
11943 case T_MNEM_lsl: inst.instruction = T_OPCODE_LSL_R; break;
11944 case T_MNEM_lsr: inst.instruction = T_OPCODE_LSR_R; break;
11945 case T_MNEM_ror: inst.instruction = T_OPCODE_ROR_R; break;
11946 default: abort ();
11947 }
5f4273c7 11948
c19d1205
ZW
11949 inst.instruction |= inst.operands[0].reg;
11950 inst.instruction |= inst.operands[2].reg << 3;
af199b06
NC
11951
11952 /* PR 12854: Error on extraneous shifts. */
11953 constraint (inst.operands[2].shifted,
11954 _("extraneous shift as part of operand to shift insn"));
c19d1205
ZW
11955 }
11956 else
b99bd4ef 11957 {
c19d1205
ZW
11958 switch (inst.instruction)
11959 {
11960 case T_MNEM_asr: inst.instruction = T_OPCODE_ASR_I; break;
11961 case T_MNEM_lsl: inst.instruction = T_OPCODE_LSL_I; break;
11962 case T_MNEM_lsr: inst.instruction = T_OPCODE_LSR_I; break;
11963 case T_MNEM_ror: inst.error = _("ror #imm not supported"); return;
11964 default: abort ();
11965 }
11966 inst.reloc.type = BFD_RELOC_ARM_THUMB_SHIFT;
11967 inst.instruction |= inst.operands[0].reg;
11968 inst.instruction |= inst.operands[1].reg << 3;
b99bd4ef
NC
11969 }
11970 }
b99bd4ef
NC
11971}
11972
11973static void
c19d1205 11974do_t_simd (void)
b99bd4ef 11975{
fdfde340
JM
11976 unsigned Rd, Rn, Rm;
11977
11978 Rd = inst.operands[0].reg;
11979 Rn = inst.operands[1].reg;
11980 Rm = inst.operands[2].reg;
11981
11982 reject_bad_reg (Rd);
11983 reject_bad_reg (Rn);
11984 reject_bad_reg (Rm);
11985
11986 inst.instruction |= Rd << 8;
11987 inst.instruction |= Rn << 16;
11988 inst.instruction |= Rm;
c19d1205 11989}
b99bd4ef 11990
03ee1b7f
NC
11991static void
11992do_t_simd2 (void)
11993{
11994 unsigned Rd, Rn, Rm;
11995
11996 Rd = inst.operands[0].reg;
11997 Rm = inst.operands[1].reg;
11998 Rn = inst.operands[2].reg;
11999
12000 reject_bad_reg (Rd);
12001 reject_bad_reg (Rn);
12002 reject_bad_reg (Rm);
12003
12004 inst.instruction |= Rd << 8;
12005 inst.instruction |= Rn << 16;
12006 inst.instruction |= Rm;
12007}
12008
c19d1205 12009static void
3eb17e6b 12010do_t_smc (void)
c19d1205
ZW
12011{
12012 unsigned int value = inst.reloc.exp.X_add_number;
f4c65163
MGD
12013 constraint (!ARM_CPU_HAS_FEATURE (cpu_variant, arm_ext_v7a),
12014 _("SMC is not permitted on this architecture"));
c19d1205
ZW
12015 constraint (inst.reloc.exp.X_op != O_constant,
12016 _("expression too complex"));
12017 inst.reloc.type = BFD_RELOC_UNUSED;
12018 inst.instruction |= (value & 0xf000) >> 12;
12019 inst.instruction |= (value & 0x0ff0);
12020 inst.instruction |= (value & 0x000f) << 16;
24382199
NC
12021 /* PR gas/15623: SMC instructions must be last in an IT block. */
12022 set_it_insn_type_last ();
c19d1205 12023}
b99bd4ef 12024
90ec0d68
MGD
12025static void
12026do_t_hvc (void)
12027{
12028 unsigned int value = inst.reloc.exp.X_add_number;
12029
12030 inst.reloc.type = BFD_RELOC_UNUSED;
12031 inst.instruction |= (value & 0x0fff);
12032 inst.instruction |= (value & 0xf000) << 4;
12033}
12034
c19d1205 12035static void
3a21c15a 12036do_t_ssat_usat (int bias)
c19d1205 12037{
fdfde340
JM
12038 unsigned Rd, Rn;
12039
12040 Rd = inst.operands[0].reg;
12041 Rn = inst.operands[2].reg;
12042
12043 reject_bad_reg (Rd);
12044 reject_bad_reg (Rn);
12045
12046 inst.instruction |= Rd << 8;
3a21c15a 12047 inst.instruction |= inst.operands[1].imm - bias;
fdfde340 12048 inst.instruction |= Rn << 16;
b99bd4ef 12049
c19d1205 12050 if (inst.operands[3].present)
b99bd4ef 12051 {
3a21c15a
NC
12052 offsetT shift_amount = inst.reloc.exp.X_add_number;
12053
12054 inst.reloc.type = BFD_RELOC_UNUSED;
12055
c19d1205
ZW
12056 constraint (inst.reloc.exp.X_op != O_constant,
12057 _("expression too complex"));
b99bd4ef 12058
3a21c15a 12059 if (shift_amount != 0)
6189168b 12060 {
3a21c15a
NC
12061 constraint (shift_amount > 31,
12062 _("shift expression is too large"));
12063
c19d1205 12064 if (inst.operands[3].shift_kind == SHIFT_ASR)
3a21c15a
NC
12065 inst.instruction |= 0x00200000; /* sh bit. */
12066
12067 inst.instruction |= (shift_amount & 0x1c) << 10;
12068 inst.instruction |= (shift_amount & 0x03) << 6;
6189168b
NC
12069 }
12070 }
b99bd4ef 12071}
c921be7d 12072
3a21c15a
NC
12073static void
12074do_t_ssat (void)
12075{
12076 do_t_ssat_usat (1);
12077}
b99bd4ef 12078
0dd132b6 12079static void
c19d1205 12080do_t_ssat16 (void)
0dd132b6 12081{
fdfde340
JM
12082 unsigned Rd, Rn;
12083
12084 Rd = inst.operands[0].reg;
12085 Rn = inst.operands[2].reg;
12086
12087 reject_bad_reg (Rd);
12088 reject_bad_reg (Rn);
12089
12090 inst.instruction |= Rd << 8;
c19d1205 12091 inst.instruction |= inst.operands[1].imm - 1;
fdfde340 12092 inst.instruction |= Rn << 16;
c19d1205 12093}
0dd132b6 12094
c19d1205
ZW
12095static void
12096do_t_strex (void)
12097{
12098 constraint (!inst.operands[2].isreg || !inst.operands[2].preind
12099 || inst.operands[2].postind || inst.operands[2].writeback
12100 || inst.operands[2].immisreg || inst.operands[2].shifted
12101 || inst.operands[2].negative,
01cfc07f 12102 BAD_ADDR_MODE);
0dd132b6 12103
5be8be5d
DG
12104 constraint (inst.operands[2].reg == REG_PC, BAD_PC);
12105
c19d1205
ZW
12106 inst.instruction |= inst.operands[0].reg << 8;
12107 inst.instruction |= inst.operands[1].reg << 12;
12108 inst.instruction |= inst.operands[2].reg << 16;
12109 inst.reloc.type = BFD_RELOC_ARM_T32_OFFSET_U8;
0dd132b6
NC
12110}
12111
b99bd4ef 12112static void
c19d1205 12113do_t_strexd (void)
b99bd4ef 12114{
c19d1205
ZW
12115 if (!inst.operands[2].present)
12116 inst.operands[2].reg = inst.operands[1].reg + 1;
b99bd4ef 12117
c19d1205
ZW
12118 constraint (inst.operands[0].reg == inst.operands[1].reg
12119 || inst.operands[0].reg == inst.operands[2].reg
f8a8e9d6 12120 || inst.operands[0].reg == inst.operands[3].reg,
c19d1205 12121 BAD_OVERLAP);
b99bd4ef 12122
c19d1205
ZW
12123 inst.instruction |= inst.operands[0].reg;
12124 inst.instruction |= inst.operands[1].reg << 12;
12125 inst.instruction |= inst.operands[2].reg << 8;
12126 inst.instruction |= inst.operands[3].reg << 16;
b99bd4ef
NC
12127}
12128
12129static void
c19d1205 12130do_t_sxtah (void)
b99bd4ef 12131{
fdfde340
JM
12132 unsigned Rd, Rn, Rm;
12133
12134 Rd = inst.operands[0].reg;
12135 Rn = inst.operands[1].reg;
12136 Rm = inst.operands[2].reg;
12137
12138 reject_bad_reg (Rd);
12139 reject_bad_reg (Rn);
12140 reject_bad_reg (Rm);
12141
12142 inst.instruction |= Rd << 8;
12143 inst.instruction |= Rn << 16;
12144 inst.instruction |= Rm;
c19d1205
ZW
12145 inst.instruction |= inst.operands[3].imm << 4;
12146}
b99bd4ef 12147
c19d1205
ZW
12148static void
12149do_t_sxth (void)
12150{
fdfde340
JM
12151 unsigned Rd, Rm;
12152
12153 Rd = inst.operands[0].reg;
12154 Rm = inst.operands[1].reg;
12155
12156 reject_bad_reg (Rd);
12157 reject_bad_reg (Rm);
c921be7d
NC
12158
12159 if (inst.instruction <= 0xffff
12160 && inst.size_req != 4
fdfde340 12161 && Rd <= 7 && Rm <= 7
c19d1205 12162 && (!inst.operands[2].present || inst.operands[2].imm == 0))
b99bd4ef 12163 {
c19d1205 12164 inst.instruction = THUMB_OP16 (inst.instruction);
fdfde340
JM
12165 inst.instruction |= Rd;
12166 inst.instruction |= Rm << 3;
b99bd4ef 12167 }
c19d1205 12168 else if (unified_syntax)
b99bd4ef 12169 {
c19d1205
ZW
12170 if (inst.instruction <= 0xffff)
12171 inst.instruction = THUMB_OP32 (inst.instruction);
fdfde340
JM
12172 inst.instruction |= Rd << 8;
12173 inst.instruction |= Rm;
c19d1205 12174 inst.instruction |= inst.operands[2].imm << 4;
b99bd4ef 12175 }
c19d1205 12176 else
b99bd4ef 12177 {
c19d1205
ZW
12178 constraint (inst.operands[2].present && inst.operands[2].imm != 0,
12179 _("Thumb encoding does not support rotation"));
12180 constraint (1, BAD_HIREG);
b99bd4ef 12181 }
c19d1205 12182}
b99bd4ef 12183
c19d1205
ZW
12184static void
12185do_t_swi (void)
12186{
b2a5fbdc
MGD
12187 /* We have to do the following check manually as ARM_EXT_OS only applies
12188 to ARM_EXT_V6M. */
12189 if (ARM_CPU_HAS_FEATURE (cpu_variant, arm_ext_v6m))
12190 {
ac7f631b
NC
12191 if (!ARM_CPU_HAS_FEATURE (cpu_variant, arm_ext_os)
12192 /* This only applies to the v6m howver, not later architectures. */
12193 && ! ARM_CPU_HAS_FEATURE (cpu_variant, arm_ext_v7))
b2a5fbdc
MGD
12194 as_bad (_("SVC is not permitted on this architecture"));
12195 ARM_MERGE_FEATURE_SETS (thumb_arch_used, thumb_arch_used, arm_ext_os);
12196 }
12197
c19d1205
ZW
12198 inst.reloc.type = BFD_RELOC_ARM_SWI;
12199}
b99bd4ef 12200
92e90b6e
PB
12201static void
12202do_t_tb (void)
12203{
fdfde340 12204 unsigned Rn, Rm;
92e90b6e
PB
12205 int half;
12206
12207 half = (inst.instruction & 0x10) != 0;
e07e6e58 12208 set_it_insn_type_last ();
dfa9f0d5
PB
12209 constraint (inst.operands[0].immisreg,
12210 _("instruction requires register index"));
fdfde340
JM
12211
12212 Rn = inst.operands[0].reg;
12213 Rm = inst.operands[0].imm;
c921be7d 12214
fdfde340
JM
12215 constraint (Rn == REG_SP, BAD_SP);
12216 reject_bad_reg (Rm);
12217
92e90b6e
PB
12218 constraint (!half && inst.operands[0].shifted,
12219 _("instruction does not allow shifted index"));
fdfde340 12220 inst.instruction |= (Rn << 16) | Rm;
92e90b6e
PB
12221}
12222
c19d1205
ZW
12223static void
12224do_t_usat (void)
12225{
3a21c15a 12226 do_t_ssat_usat (0);
b99bd4ef
NC
12227}
12228
12229static void
c19d1205 12230do_t_usat16 (void)
b99bd4ef 12231{
fdfde340
JM
12232 unsigned Rd, Rn;
12233
12234 Rd = inst.operands[0].reg;
12235 Rn = inst.operands[2].reg;
12236
12237 reject_bad_reg (Rd);
12238 reject_bad_reg (Rn);
12239
12240 inst.instruction |= Rd << 8;
c19d1205 12241 inst.instruction |= inst.operands[1].imm;
fdfde340 12242 inst.instruction |= Rn << 16;
b99bd4ef 12243}
c19d1205 12244
5287ad62 12245/* Neon instruction encoder helpers. */
5f4273c7 12246
5287ad62 12247/* Encodings for the different types for various Neon opcodes. */
b99bd4ef 12248
5287ad62
JB
12249/* An "invalid" code for the following tables. */
12250#define N_INV -1u
12251
12252struct neon_tab_entry
b99bd4ef 12253{
5287ad62
JB
12254 unsigned integer;
12255 unsigned float_or_poly;
12256 unsigned scalar_or_imm;
12257};
5f4273c7 12258
5287ad62
JB
12259/* Map overloaded Neon opcodes to their respective encodings. */
12260#define NEON_ENC_TAB \
12261 X(vabd, 0x0000700, 0x1200d00, N_INV), \
12262 X(vmax, 0x0000600, 0x0000f00, N_INV), \
12263 X(vmin, 0x0000610, 0x0200f00, N_INV), \
12264 X(vpadd, 0x0000b10, 0x1000d00, N_INV), \
12265 X(vpmax, 0x0000a00, 0x1000f00, N_INV), \
12266 X(vpmin, 0x0000a10, 0x1200f00, N_INV), \
12267 X(vadd, 0x0000800, 0x0000d00, N_INV), \
12268 X(vsub, 0x1000800, 0x0200d00, N_INV), \
12269 X(vceq, 0x1000810, 0x0000e00, 0x1b10100), \
12270 X(vcge, 0x0000310, 0x1000e00, 0x1b10080), \
12271 X(vcgt, 0x0000300, 0x1200e00, 0x1b10000), \
12272 /* Register variants of the following two instructions are encoded as
e07e6e58 12273 vcge / vcgt with the operands reversed. */ \
92559b5b
PB
12274 X(vclt, 0x0000300, 0x1200e00, 0x1b10200), \
12275 X(vcle, 0x0000310, 0x1000e00, 0x1b10180), \
62f3b8c8
PB
12276 X(vfma, N_INV, 0x0000c10, N_INV), \
12277 X(vfms, N_INV, 0x0200c10, N_INV), \
5287ad62
JB
12278 X(vmla, 0x0000900, 0x0000d10, 0x0800040), \
12279 X(vmls, 0x1000900, 0x0200d10, 0x0800440), \
12280 X(vmul, 0x0000910, 0x1000d10, 0x0800840), \
12281 X(vmull, 0x0800c00, 0x0800e00, 0x0800a40), /* polynomial not float. */ \
12282 X(vmlal, 0x0800800, N_INV, 0x0800240), \
12283 X(vmlsl, 0x0800a00, N_INV, 0x0800640), \
12284 X(vqdmlal, 0x0800900, N_INV, 0x0800340), \
12285 X(vqdmlsl, 0x0800b00, N_INV, 0x0800740), \
12286 X(vqdmull, 0x0800d00, N_INV, 0x0800b40), \
12287 X(vqdmulh, 0x0000b00, N_INV, 0x0800c40), \
12288 X(vqrdmulh, 0x1000b00, N_INV, 0x0800d40), \
12289 X(vshl, 0x0000400, N_INV, 0x0800510), \
12290 X(vqshl, 0x0000410, N_INV, 0x0800710), \
12291 X(vand, 0x0000110, N_INV, 0x0800030), \
12292 X(vbic, 0x0100110, N_INV, 0x0800030), \
12293 X(veor, 0x1000110, N_INV, N_INV), \
12294 X(vorn, 0x0300110, N_INV, 0x0800010), \
12295 X(vorr, 0x0200110, N_INV, 0x0800010), \
12296 X(vmvn, 0x1b00580, N_INV, 0x0800030), \
12297 X(vshll, 0x1b20300, N_INV, 0x0800a10), /* max shift, immediate. */ \
12298 X(vcvt, 0x1b30600, N_INV, 0x0800e10), /* integer, fixed-point. */ \
12299 X(vdup, 0xe800b10, N_INV, 0x1b00c00), /* arm, scalar. */ \
12300 X(vld1, 0x0200000, 0x0a00000, 0x0a00c00), /* interlv, lane, dup. */ \
12301 X(vst1, 0x0000000, 0x0800000, N_INV), \
12302 X(vld2, 0x0200100, 0x0a00100, 0x0a00d00), \
12303 X(vst2, 0x0000100, 0x0800100, N_INV), \
12304 X(vld3, 0x0200200, 0x0a00200, 0x0a00e00), \
12305 X(vst3, 0x0000200, 0x0800200, N_INV), \
12306 X(vld4, 0x0200300, 0x0a00300, 0x0a00f00), \
12307 X(vst4, 0x0000300, 0x0800300, N_INV), \
12308 X(vmovn, 0x1b20200, N_INV, N_INV), \
12309 X(vtrn, 0x1b20080, N_INV, N_INV), \
12310 X(vqmovn, 0x1b20200, N_INV, N_INV), \
037e8744
JB
12311 X(vqmovun, 0x1b20240, N_INV, N_INV), \
12312 X(vnmul, 0xe200a40, 0xe200b40, N_INV), \
e6655fda
PB
12313 X(vnmla, 0xe100a40, 0xe100b40, N_INV), \
12314 X(vnmls, 0xe100a00, 0xe100b00, N_INV), \
62f3b8c8
PB
12315 X(vfnma, 0xe900a40, 0xe900b40, N_INV), \
12316 X(vfnms, 0xe900a00, 0xe900b00, N_INV), \
037e8744
JB
12317 X(vcmp, 0xeb40a40, 0xeb40b40, N_INV), \
12318 X(vcmpz, 0xeb50a40, 0xeb50b40, N_INV), \
12319 X(vcmpe, 0xeb40ac0, 0xeb40bc0, N_INV), \
33399f07
MGD
12320 X(vcmpez, 0xeb50ac0, 0xeb50bc0, N_INV), \
12321 X(vseleq, 0xe000a00, N_INV, N_INV), \
12322 X(vselvs, 0xe100a00, N_INV, N_INV), \
12323 X(vselge, 0xe200a00, N_INV, N_INV), \
73924fbc
MGD
12324 X(vselgt, 0xe300a00, N_INV, N_INV), \
12325 X(vmaxnm, 0xe800a00, 0x3000f10, N_INV), \
7e8e6784 12326 X(vminnm, 0xe800a40, 0x3200f10, N_INV), \
30bdf752
MGD
12327 X(vcvta, 0xebc0a40, 0x3bb0000, N_INV), \
12328 X(vrintr, 0xeb60a40, 0x3ba0400, N_INV), \
91ff7894 12329 X(vrinta, 0xeb80a40, 0x3ba0400, N_INV), \
48adcd8e 12330 X(aes, 0x3b00300, N_INV, N_INV), \
3c9017d2
MGD
12331 X(sha3op, 0x2000c00, N_INV, N_INV), \
12332 X(sha1h, 0x3b902c0, N_INV, N_INV), \
12333 X(sha2op, 0x3ba0380, N_INV, N_INV)
5287ad62
JB
12334
12335enum neon_opc
12336{
12337#define X(OPC,I,F,S) N_MNEM_##OPC
12338NEON_ENC_TAB
12339#undef X
12340};
b99bd4ef 12341
5287ad62
JB
12342static const struct neon_tab_entry neon_enc_tab[] =
12343{
12344#define X(OPC,I,F,S) { (I), (F), (S) }
12345NEON_ENC_TAB
12346#undef X
12347};
b99bd4ef 12348
88714cb8
DG
12349/* Do not use these macros; instead, use NEON_ENCODE defined below. */
12350#define NEON_ENC_INTEGER_(X) (neon_enc_tab[(X) & 0x0fffffff].integer)
12351#define NEON_ENC_ARMREG_(X) (neon_enc_tab[(X) & 0x0fffffff].integer)
12352#define NEON_ENC_POLY_(X) (neon_enc_tab[(X) & 0x0fffffff].float_or_poly)
12353#define NEON_ENC_FLOAT_(X) (neon_enc_tab[(X) & 0x0fffffff].float_or_poly)
12354#define NEON_ENC_SCALAR_(X) (neon_enc_tab[(X) & 0x0fffffff].scalar_or_imm)
12355#define NEON_ENC_IMMED_(X) (neon_enc_tab[(X) & 0x0fffffff].scalar_or_imm)
12356#define NEON_ENC_INTERLV_(X) (neon_enc_tab[(X) & 0x0fffffff].integer)
12357#define NEON_ENC_LANE_(X) (neon_enc_tab[(X) & 0x0fffffff].float_or_poly)
12358#define NEON_ENC_DUP_(X) (neon_enc_tab[(X) & 0x0fffffff].scalar_or_imm)
12359#define NEON_ENC_SINGLE_(X) \
037e8744 12360 ((neon_enc_tab[(X) & 0x0fffffff].integer) | ((X) & 0xf0000000))
88714cb8 12361#define NEON_ENC_DOUBLE_(X) \
037e8744 12362 ((neon_enc_tab[(X) & 0x0fffffff].float_or_poly) | ((X) & 0xf0000000))
33399f07
MGD
12363#define NEON_ENC_FPV8_(X) \
12364 ((neon_enc_tab[(X) & 0x0fffffff].integer) | ((X) & 0xf000000))
5287ad62 12365
88714cb8
DG
12366#define NEON_ENCODE(type, inst) \
12367 do \
12368 { \
12369 inst.instruction = NEON_ENC_##type##_ (inst.instruction); \
12370 inst.is_neon = 1; \
12371 } \
12372 while (0)
12373
12374#define check_neon_suffixes \
12375 do \
12376 { \
12377 if (!inst.error && inst.vectype.elems > 0 && !inst.is_neon) \
12378 { \
12379 as_bad (_("invalid neon suffix for non neon instruction")); \
12380 return; \
12381 } \
12382 } \
12383 while (0)
12384
037e8744
JB
12385/* Define shapes for instruction operands. The following mnemonic characters
12386 are used in this table:
5287ad62 12387
037e8744 12388 F - VFP S<n> register
5287ad62
JB
12389 D - Neon D<n> register
12390 Q - Neon Q<n> register
12391 I - Immediate
12392 S - Scalar
12393 R - ARM register
12394 L - D<n> register list
5f4273c7 12395
037e8744
JB
12396 This table is used to generate various data:
12397 - enumerations of the form NS_DDR to be used as arguments to
12398 neon_select_shape.
12399 - a table classifying shapes into single, double, quad, mixed.
5f4273c7 12400 - a table used to drive neon_select_shape. */
b99bd4ef 12401
037e8744
JB
12402#define NEON_SHAPE_DEF \
12403 X(3, (D, D, D), DOUBLE), \
12404 X(3, (Q, Q, Q), QUAD), \
12405 X(3, (D, D, I), DOUBLE), \
12406 X(3, (Q, Q, I), QUAD), \
12407 X(3, (D, D, S), DOUBLE), \
12408 X(3, (Q, Q, S), QUAD), \
12409 X(2, (D, D), DOUBLE), \
12410 X(2, (Q, Q), QUAD), \
12411 X(2, (D, S), DOUBLE), \
12412 X(2, (Q, S), QUAD), \
12413 X(2, (D, R), DOUBLE), \
12414 X(2, (Q, R), QUAD), \
12415 X(2, (D, I), DOUBLE), \
12416 X(2, (Q, I), QUAD), \
12417 X(3, (D, L, D), DOUBLE), \
12418 X(2, (D, Q), MIXED), \
12419 X(2, (Q, D), MIXED), \
12420 X(3, (D, Q, I), MIXED), \
12421 X(3, (Q, D, I), MIXED), \
12422 X(3, (Q, D, D), MIXED), \
12423 X(3, (D, Q, Q), MIXED), \
12424 X(3, (Q, Q, D), MIXED), \
12425 X(3, (Q, D, S), MIXED), \
12426 X(3, (D, Q, S), MIXED), \
12427 X(4, (D, D, D, I), DOUBLE), \
12428 X(4, (Q, Q, Q, I), QUAD), \
12429 X(2, (F, F), SINGLE), \
12430 X(3, (F, F, F), SINGLE), \
12431 X(2, (F, I), SINGLE), \
12432 X(2, (F, D), MIXED), \
12433 X(2, (D, F), MIXED), \
12434 X(3, (F, F, I), MIXED), \
12435 X(4, (R, R, F, F), SINGLE), \
12436 X(4, (F, F, R, R), SINGLE), \
12437 X(3, (D, R, R), DOUBLE), \
12438 X(3, (R, R, D), DOUBLE), \
12439 X(2, (S, R), SINGLE), \
12440 X(2, (R, S), SINGLE), \
12441 X(2, (F, R), SINGLE), \
12442 X(2, (R, F), SINGLE)
12443
12444#define S2(A,B) NS_##A##B
12445#define S3(A,B,C) NS_##A##B##C
12446#define S4(A,B,C,D) NS_##A##B##C##D
12447
12448#define X(N, L, C) S##N L
12449
5287ad62
JB
12450enum neon_shape
12451{
037e8744
JB
12452 NEON_SHAPE_DEF,
12453 NS_NULL
5287ad62 12454};
b99bd4ef 12455
037e8744
JB
12456#undef X
12457#undef S2
12458#undef S3
12459#undef S4
12460
12461enum neon_shape_class
12462{
12463 SC_SINGLE,
12464 SC_DOUBLE,
12465 SC_QUAD,
12466 SC_MIXED
12467};
12468
12469#define X(N, L, C) SC_##C
12470
12471static enum neon_shape_class neon_shape_class[] =
12472{
12473 NEON_SHAPE_DEF
12474};
12475
12476#undef X
12477
12478enum neon_shape_el
12479{
12480 SE_F,
12481 SE_D,
12482 SE_Q,
12483 SE_I,
12484 SE_S,
12485 SE_R,
12486 SE_L
12487};
12488
12489/* Register widths of above. */
12490static unsigned neon_shape_el_size[] =
12491{
12492 32,
12493 64,
12494 128,
12495 0,
12496 32,
12497 32,
12498 0
12499};
12500
12501struct neon_shape_info
12502{
12503 unsigned els;
12504 enum neon_shape_el el[NEON_MAX_TYPE_ELS];
12505};
12506
12507#define S2(A,B) { SE_##A, SE_##B }
12508#define S3(A,B,C) { SE_##A, SE_##B, SE_##C }
12509#define S4(A,B,C,D) { SE_##A, SE_##B, SE_##C, SE_##D }
12510
12511#define X(N, L, C) { N, S##N L }
12512
12513static struct neon_shape_info neon_shape_tab[] =
12514{
12515 NEON_SHAPE_DEF
12516};
12517
12518#undef X
12519#undef S2
12520#undef S3
12521#undef S4
12522
5287ad62
JB
12523/* Bit masks used in type checking given instructions.
12524 'N_EQK' means the type must be the same as (or based on in some way) the key
12525 type, which itself is marked with the 'N_KEY' bit. If the 'N_EQK' bit is
12526 set, various other bits can be set as well in order to modify the meaning of
12527 the type constraint. */
12528
12529enum neon_type_mask
12530{
8e79c3df
CM
12531 N_S8 = 0x0000001,
12532 N_S16 = 0x0000002,
12533 N_S32 = 0x0000004,
12534 N_S64 = 0x0000008,
12535 N_U8 = 0x0000010,
12536 N_U16 = 0x0000020,
12537 N_U32 = 0x0000040,
12538 N_U64 = 0x0000080,
12539 N_I8 = 0x0000100,
12540 N_I16 = 0x0000200,
12541 N_I32 = 0x0000400,
12542 N_I64 = 0x0000800,
12543 N_8 = 0x0001000,
12544 N_16 = 0x0002000,
12545 N_32 = 0x0004000,
12546 N_64 = 0x0008000,
12547 N_P8 = 0x0010000,
12548 N_P16 = 0x0020000,
12549 N_F16 = 0x0040000,
12550 N_F32 = 0x0080000,
12551 N_F64 = 0x0100000,
4f51b4bd 12552 N_P64 = 0x0200000,
c921be7d
NC
12553 N_KEY = 0x1000000, /* Key element (main type specifier). */
12554 N_EQK = 0x2000000, /* Given operand has the same type & size as the key. */
8e79c3df 12555 N_VFP = 0x4000000, /* VFP mode: operand size must match register width. */
91ff7894 12556 N_UNT = 0x8000000, /* Must be explicitly untyped. */
c921be7d
NC
12557 N_DBL = 0x0000001, /* If N_EQK, this operand is twice the size. */
12558 N_HLF = 0x0000002, /* If N_EQK, this operand is half the size. */
12559 N_SGN = 0x0000004, /* If N_EQK, this operand is forced to be signed. */
12560 N_UNS = 0x0000008, /* If N_EQK, this operand is forced to be unsigned. */
12561 N_INT = 0x0000010, /* If N_EQK, this operand is forced to be integer. */
12562 N_FLT = 0x0000020, /* If N_EQK, this operand is forced to be float. */
12563 N_SIZ = 0x0000040, /* If N_EQK, this operand is forced to be size-only. */
5287ad62 12564 N_UTYP = 0,
4f51b4bd 12565 N_MAX_NONSPECIAL = N_P64
5287ad62
JB
12566};
12567
dcbf9037
JB
12568#define N_ALLMODS (N_DBL | N_HLF | N_SGN | N_UNS | N_INT | N_FLT | N_SIZ)
12569
5287ad62
JB
12570#define N_SU_ALL (N_S8 | N_S16 | N_S32 | N_S64 | N_U8 | N_U16 | N_U32 | N_U64)
12571#define N_SU_32 (N_S8 | N_S16 | N_S32 | N_U8 | N_U16 | N_U32)
12572#define N_SU_16_64 (N_S16 | N_S32 | N_S64 | N_U16 | N_U32 | N_U64)
12573#define N_SUF_32 (N_SU_32 | N_F32)
12574#define N_I_ALL (N_I8 | N_I16 | N_I32 | N_I64)
12575#define N_IF_32 (N_I8 | N_I16 | N_I32 | N_F32)
12576
12577/* Pass this as the first type argument to neon_check_type to ignore types
12578 altogether. */
12579#define N_IGNORE_TYPE (N_KEY | N_EQK)
12580
037e8744
JB
12581/* Select a "shape" for the current instruction (describing register types or
12582 sizes) from a list of alternatives. Return NS_NULL if the current instruction
12583 doesn't fit. For non-polymorphic shapes, checking is usually done as a
12584 function of operand parsing, so this function doesn't need to be called.
12585 Shapes should be listed in order of decreasing length. */
5287ad62
JB
12586
12587static enum neon_shape
037e8744 12588neon_select_shape (enum neon_shape shape, ...)
5287ad62 12589{
037e8744
JB
12590 va_list ap;
12591 enum neon_shape first_shape = shape;
5287ad62
JB
12592
12593 /* Fix missing optional operands. FIXME: we don't know at this point how
12594 many arguments we should have, so this makes the assumption that we have
12595 > 1. This is true of all current Neon opcodes, I think, but may not be
12596 true in the future. */
12597 if (!inst.operands[1].present)
12598 inst.operands[1] = inst.operands[0];
12599
037e8744 12600 va_start (ap, shape);
5f4273c7 12601
21d799b5 12602 for (; shape != NS_NULL; shape = (enum neon_shape) va_arg (ap, int))
037e8744
JB
12603 {
12604 unsigned j;
12605 int matches = 1;
12606
12607 for (j = 0; j < neon_shape_tab[shape].els; j++)
477330fc
RM
12608 {
12609 if (!inst.operands[j].present)
12610 {
12611 matches = 0;
12612 break;
12613 }
12614
12615 switch (neon_shape_tab[shape].el[j])
12616 {
12617 case SE_F:
12618 if (!(inst.operands[j].isreg
12619 && inst.operands[j].isvec
12620 && inst.operands[j].issingle
12621 && !inst.operands[j].isquad))
12622 matches = 0;
12623 break;
12624
12625 case SE_D:
12626 if (!(inst.operands[j].isreg
12627 && inst.operands[j].isvec
12628 && !inst.operands[j].isquad
12629 && !inst.operands[j].issingle))
12630 matches = 0;
12631 break;
12632
12633 case SE_R:
12634 if (!(inst.operands[j].isreg
12635 && !inst.operands[j].isvec))
12636 matches = 0;
12637 break;
12638
12639 case SE_Q:
12640 if (!(inst.operands[j].isreg
12641 && inst.operands[j].isvec
12642 && inst.operands[j].isquad
12643 && !inst.operands[j].issingle))
12644 matches = 0;
12645 break;
12646
12647 case SE_I:
12648 if (!(!inst.operands[j].isreg
12649 && !inst.operands[j].isscalar))
12650 matches = 0;
12651 break;
12652
12653 case SE_S:
12654 if (!(!inst.operands[j].isreg
12655 && inst.operands[j].isscalar))
12656 matches = 0;
12657 break;
12658
12659 case SE_L:
12660 break;
12661 }
3fde54a2
JZ
12662 if (!matches)
12663 break;
477330fc 12664 }
ad6cec43
MGD
12665 if (matches && (j >= ARM_IT_MAX_OPERANDS || !inst.operands[j].present))
12666 /* We've matched all the entries in the shape table, and we don't
12667 have any left over operands which have not been matched. */
477330fc 12668 break;
037e8744 12669 }
5f4273c7 12670
037e8744 12671 va_end (ap);
5287ad62 12672
037e8744
JB
12673 if (shape == NS_NULL && first_shape != NS_NULL)
12674 first_error (_("invalid instruction shape"));
5287ad62 12675
037e8744
JB
12676 return shape;
12677}
5287ad62 12678
037e8744
JB
12679/* True if SHAPE is predominantly a quadword operation (most of the time, this
12680 means the Q bit should be set). */
12681
12682static int
12683neon_quad (enum neon_shape shape)
12684{
12685 return neon_shape_class[shape] == SC_QUAD;
5287ad62 12686}
037e8744 12687
5287ad62
JB
12688static void
12689neon_modify_type_size (unsigned typebits, enum neon_el_type *g_type,
477330fc 12690 unsigned *g_size)
5287ad62
JB
12691{
12692 /* Allow modification to be made to types which are constrained to be
12693 based on the key element, based on bits set alongside N_EQK. */
12694 if ((typebits & N_EQK) != 0)
12695 {
12696 if ((typebits & N_HLF) != 0)
12697 *g_size /= 2;
12698 else if ((typebits & N_DBL) != 0)
12699 *g_size *= 2;
12700 if ((typebits & N_SGN) != 0)
12701 *g_type = NT_signed;
12702 else if ((typebits & N_UNS) != 0)
477330fc 12703 *g_type = NT_unsigned;
5287ad62 12704 else if ((typebits & N_INT) != 0)
477330fc 12705 *g_type = NT_integer;
5287ad62 12706 else if ((typebits & N_FLT) != 0)
477330fc 12707 *g_type = NT_float;
dcbf9037 12708 else if ((typebits & N_SIZ) != 0)
477330fc 12709 *g_type = NT_untyped;
5287ad62
JB
12710 }
12711}
5f4273c7 12712
5287ad62
JB
12713/* Return operand OPNO promoted by bits set in THISARG. KEY should be the "key"
12714 operand type, i.e. the single type specified in a Neon instruction when it
12715 is the only one given. */
12716
12717static struct neon_type_el
12718neon_type_promote (struct neon_type_el *key, unsigned thisarg)
12719{
12720 struct neon_type_el dest = *key;
5f4273c7 12721
9c2799c2 12722 gas_assert ((thisarg & N_EQK) != 0);
5f4273c7 12723
5287ad62
JB
12724 neon_modify_type_size (thisarg, &dest.type, &dest.size);
12725
12726 return dest;
12727}
12728
12729/* Convert Neon type and size into compact bitmask representation. */
12730
12731static enum neon_type_mask
12732type_chk_of_el_type (enum neon_el_type type, unsigned size)
12733{
12734 switch (type)
12735 {
12736 case NT_untyped:
12737 switch (size)
477330fc
RM
12738 {
12739 case 8: return N_8;
12740 case 16: return N_16;
12741 case 32: return N_32;
12742 case 64: return N_64;
12743 default: ;
12744 }
5287ad62
JB
12745 break;
12746
12747 case NT_integer:
12748 switch (size)
477330fc
RM
12749 {
12750 case 8: return N_I8;
12751 case 16: return N_I16;
12752 case 32: return N_I32;
12753 case 64: return N_I64;
12754 default: ;
12755 }
5287ad62
JB
12756 break;
12757
12758 case NT_float:
037e8744 12759 switch (size)
477330fc 12760 {
8e79c3df 12761 case 16: return N_F16;
477330fc
RM
12762 case 32: return N_F32;
12763 case 64: return N_F64;
12764 default: ;
12765 }
5287ad62
JB
12766 break;
12767
12768 case NT_poly:
12769 switch (size)
477330fc
RM
12770 {
12771 case 8: return N_P8;
12772 case 16: return N_P16;
4f51b4bd 12773 case 64: return N_P64;
477330fc
RM
12774 default: ;
12775 }
5287ad62
JB
12776 break;
12777
12778 case NT_signed:
12779 switch (size)
477330fc
RM
12780 {
12781 case 8: return N_S8;
12782 case 16: return N_S16;
12783 case 32: return N_S32;
12784 case 64: return N_S64;
12785 default: ;
12786 }
5287ad62
JB
12787 break;
12788
12789 case NT_unsigned:
12790 switch (size)
477330fc
RM
12791 {
12792 case 8: return N_U8;
12793 case 16: return N_U16;
12794 case 32: return N_U32;
12795 case 64: return N_U64;
12796 default: ;
12797 }
5287ad62
JB
12798 break;
12799
12800 default: ;
12801 }
5f4273c7 12802
5287ad62
JB
12803 return N_UTYP;
12804}
12805
12806/* Convert compact Neon bitmask type representation to a type and size. Only
12807 handles the case where a single bit is set in the mask. */
12808
dcbf9037 12809static int
5287ad62 12810el_type_of_type_chk (enum neon_el_type *type, unsigned *size,
477330fc 12811 enum neon_type_mask mask)
5287ad62 12812{
dcbf9037
JB
12813 if ((mask & N_EQK) != 0)
12814 return FAIL;
12815
5287ad62
JB
12816 if ((mask & (N_S8 | N_U8 | N_I8 | N_8 | N_P8)) != 0)
12817 *size = 8;
c70a8987 12818 else if ((mask & (N_S16 | N_U16 | N_I16 | N_16 | N_F16 | N_P16)) != 0)
5287ad62 12819 *size = 16;
dcbf9037 12820 else if ((mask & (N_S32 | N_U32 | N_I32 | N_32 | N_F32)) != 0)
5287ad62 12821 *size = 32;
4f51b4bd 12822 else if ((mask & (N_S64 | N_U64 | N_I64 | N_64 | N_F64 | N_P64)) != 0)
5287ad62 12823 *size = 64;
dcbf9037
JB
12824 else
12825 return FAIL;
12826
5287ad62
JB
12827 if ((mask & (N_S8 | N_S16 | N_S32 | N_S64)) != 0)
12828 *type = NT_signed;
dcbf9037 12829 else if ((mask & (N_U8 | N_U16 | N_U32 | N_U64)) != 0)
5287ad62 12830 *type = NT_unsigned;
dcbf9037 12831 else if ((mask & (N_I8 | N_I16 | N_I32 | N_I64)) != 0)
5287ad62 12832 *type = NT_integer;
dcbf9037 12833 else if ((mask & (N_8 | N_16 | N_32 | N_64)) != 0)
5287ad62 12834 *type = NT_untyped;
4f51b4bd 12835 else if ((mask & (N_P8 | N_P16 | N_P64)) != 0)
5287ad62 12836 *type = NT_poly;
c70a8987 12837 else if ((mask & (N_F16 | N_F32 | N_F64)) != 0)
5287ad62 12838 *type = NT_float;
dcbf9037
JB
12839 else
12840 return FAIL;
5f4273c7 12841
dcbf9037 12842 return SUCCESS;
5287ad62
JB
12843}
12844
12845/* Modify a bitmask of allowed types. This is only needed for type
12846 relaxation. */
12847
12848static unsigned
12849modify_types_allowed (unsigned allowed, unsigned mods)
12850{
12851 unsigned size;
12852 enum neon_el_type type;
12853 unsigned destmask;
12854 int i;
5f4273c7 12855
5287ad62 12856 destmask = 0;
5f4273c7 12857
5287ad62
JB
12858 for (i = 1; i <= N_MAX_NONSPECIAL; i <<= 1)
12859 {
21d799b5 12860 if (el_type_of_type_chk (&type, &size,
477330fc
RM
12861 (enum neon_type_mask) (allowed & i)) == SUCCESS)
12862 {
12863 neon_modify_type_size (mods, &type, &size);
12864 destmask |= type_chk_of_el_type (type, size);
12865 }
5287ad62 12866 }
5f4273c7 12867
5287ad62
JB
12868 return destmask;
12869}
12870
12871/* Check type and return type classification.
12872 The manual states (paraphrase): If one datatype is given, it indicates the
12873 type given in:
12874 - the second operand, if there is one
12875 - the operand, if there is no second operand
12876 - the result, if there are no operands.
12877 This isn't quite good enough though, so we use a concept of a "key" datatype
12878 which is set on a per-instruction basis, which is the one which matters when
12879 only one data type is written.
12880 Note: this function has side-effects (e.g. filling in missing operands). All
037e8744 12881 Neon instructions should call it before performing bit encoding. */
5287ad62
JB
12882
12883static struct neon_type_el
12884neon_check_type (unsigned els, enum neon_shape ns, ...)
12885{
12886 va_list ap;
12887 unsigned i, pass, key_el = 0;
12888 unsigned types[NEON_MAX_TYPE_ELS];
12889 enum neon_el_type k_type = NT_invtype;
12890 unsigned k_size = -1u;
12891 struct neon_type_el badtype = {NT_invtype, -1};
12892 unsigned key_allowed = 0;
12893
12894 /* Optional registers in Neon instructions are always (not) in operand 1.
12895 Fill in the missing operand here, if it was omitted. */
12896 if (els > 1 && !inst.operands[1].present)
12897 inst.operands[1] = inst.operands[0];
12898
12899 /* Suck up all the varargs. */
12900 va_start (ap, ns);
12901 for (i = 0; i < els; i++)
12902 {
12903 unsigned thisarg = va_arg (ap, unsigned);
12904 if (thisarg == N_IGNORE_TYPE)
477330fc
RM
12905 {
12906 va_end (ap);
12907 return badtype;
12908 }
5287ad62
JB
12909 types[i] = thisarg;
12910 if ((thisarg & N_KEY) != 0)
477330fc 12911 key_el = i;
5287ad62
JB
12912 }
12913 va_end (ap);
12914
dcbf9037
JB
12915 if (inst.vectype.elems > 0)
12916 for (i = 0; i < els; i++)
12917 if (inst.operands[i].vectype.type != NT_invtype)
477330fc
RM
12918 {
12919 first_error (_("types specified in both the mnemonic and operands"));
12920 return badtype;
12921 }
dcbf9037 12922
5287ad62
JB
12923 /* Duplicate inst.vectype elements here as necessary.
12924 FIXME: No idea if this is exactly the same as the ARM assembler,
12925 particularly when an insn takes one register and one non-register
12926 operand. */
12927 if (inst.vectype.elems == 1 && els > 1)
12928 {
12929 unsigned j;
12930 inst.vectype.elems = els;
12931 inst.vectype.el[key_el] = inst.vectype.el[0];
12932 for (j = 0; j < els; j++)
477330fc
RM
12933 if (j != key_el)
12934 inst.vectype.el[j] = neon_type_promote (&inst.vectype.el[key_el],
12935 types[j]);
dcbf9037
JB
12936 }
12937 else if (inst.vectype.elems == 0 && els > 0)
12938 {
12939 unsigned j;
12940 /* No types were given after the mnemonic, so look for types specified
477330fc
RM
12941 after each operand. We allow some flexibility here; as long as the
12942 "key" operand has a type, we can infer the others. */
dcbf9037 12943 for (j = 0; j < els; j++)
477330fc
RM
12944 if (inst.operands[j].vectype.type != NT_invtype)
12945 inst.vectype.el[j] = inst.operands[j].vectype;
dcbf9037
JB
12946
12947 if (inst.operands[key_el].vectype.type != NT_invtype)
477330fc
RM
12948 {
12949 for (j = 0; j < els; j++)
12950 if (inst.operands[j].vectype.type == NT_invtype)
12951 inst.vectype.el[j] = neon_type_promote (&inst.vectype.el[key_el],
12952 types[j]);
12953 }
dcbf9037 12954 else
477330fc
RM
12955 {
12956 first_error (_("operand types can't be inferred"));
12957 return badtype;
12958 }
5287ad62
JB
12959 }
12960 else if (inst.vectype.elems != els)
12961 {
dcbf9037 12962 first_error (_("type specifier has the wrong number of parts"));
5287ad62
JB
12963 return badtype;
12964 }
12965
12966 for (pass = 0; pass < 2; pass++)
12967 {
12968 for (i = 0; i < els; i++)
477330fc
RM
12969 {
12970 unsigned thisarg = types[i];
12971 unsigned types_allowed = ((thisarg & N_EQK) != 0 && pass != 0)
12972 ? modify_types_allowed (key_allowed, thisarg) : thisarg;
12973 enum neon_el_type g_type = inst.vectype.el[i].type;
12974 unsigned g_size = inst.vectype.el[i].size;
12975
12976 /* Decay more-specific signed & unsigned types to sign-insensitive
5287ad62 12977 integer types if sign-specific variants are unavailable. */
477330fc 12978 if ((g_type == NT_signed || g_type == NT_unsigned)
5287ad62
JB
12979 && (types_allowed & N_SU_ALL) == 0)
12980 g_type = NT_integer;
12981
477330fc 12982 /* If only untyped args are allowed, decay any more specific types to
5287ad62
JB
12983 them. Some instructions only care about signs for some element
12984 sizes, so handle that properly. */
477330fc 12985 if (((types_allowed & N_UNT) == 0)
91ff7894
MGD
12986 && ((g_size == 8 && (types_allowed & N_8) != 0)
12987 || (g_size == 16 && (types_allowed & N_16) != 0)
12988 || (g_size == 32 && (types_allowed & N_32) != 0)
12989 || (g_size == 64 && (types_allowed & N_64) != 0)))
5287ad62
JB
12990 g_type = NT_untyped;
12991
477330fc
RM
12992 if (pass == 0)
12993 {
12994 if ((thisarg & N_KEY) != 0)
12995 {
12996 k_type = g_type;
12997 k_size = g_size;
12998 key_allowed = thisarg & ~N_KEY;
12999 }
13000 }
13001 else
13002 {
13003 if ((thisarg & N_VFP) != 0)
13004 {
13005 enum neon_shape_el regshape;
13006 unsigned regwidth, match;
99b253c5
NC
13007
13008 /* PR 11136: Catch the case where we are passed a shape of NS_NULL. */
13009 if (ns == NS_NULL)
13010 {
13011 first_error (_("invalid instruction shape"));
13012 return badtype;
13013 }
477330fc
RM
13014 regshape = neon_shape_tab[ns].el[i];
13015 regwidth = neon_shape_el_size[regshape];
13016
13017 /* In VFP mode, operands must match register widths. If we
13018 have a key operand, use its width, else use the width of
13019 the current operand. */
13020 if (k_size != -1u)
13021 match = k_size;
13022 else
13023 match = g_size;
13024
13025 if (regwidth != match)
13026 {
13027 first_error (_("operand size must match register width"));
13028 return badtype;
13029 }
13030 }
13031
13032 if ((thisarg & N_EQK) == 0)
13033 {
13034 unsigned given_type = type_chk_of_el_type (g_type, g_size);
13035
13036 if ((given_type & types_allowed) == 0)
13037 {
13038 first_error (_("bad type in Neon instruction"));
13039 return badtype;
13040 }
13041 }
13042 else
13043 {
13044 enum neon_el_type mod_k_type = k_type;
13045 unsigned mod_k_size = k_size;
13046 neon_modify_type_size (thisarg, &mod_k_type, &mod_k_size);
13047 if (g_type != mod_k_type || g_size != mod_k_size)
13048 {
13049 first_error (_("inconsistent types in Neon instruction"));
13050 return badtype;
13051 }
13052 }
13053 }
13054 }
5287ad62
JB
13055 }
13056
13057 return inst.vectype.el[key_el];
13058}
13059
037e8744 13060/* Neon-style VFP instruction forwarding. */
5287ad62 13061
037e8744
JB
13062/* Thumb VFP instructions have 0xE in the condition field. */
13063
13064static void
13065do_vfp_cond_or_thumb (void)
5287ad62 13066{
88714cb8
DG
13067 inst.is_neon = 1;
13068
5287ad62 13069 if (thumb_mode)
037e8744 13070 inst.instruction |= 0xe0000000;
5287ad62 13071 else
037e8744 13072 inst.instruction |= inst.cond << 28;
5287ad62
JB
13073}
13074
037e8744
JB
13075/* Look up and encode a simple mnemonic, for use as a helper function for the
13076 Neon-style VFP syntax. This avoids duplication of bits of the insns table,
13077 etc. It is assumed that operand parsing has already been done, and that the
13078 operands are in the form expected by the given opcode (this isn't necessarily
13079 the same as the form in which they were parsed, hence some massaging must
13080 take place before this function is called).
13081 Checks current arch version against that in the looked-up opcode. */
5287ad62 13082
037e8744
JB
13083static void
13084do_vfp_nsyn_opcode (const char *opname)
5287ad62 13085{
037e8744 13086 const struct asm_opcode *opcode;
5f4273c7 13087
21d799b5 13088 opcode = (const struct asm_opcode *) hash_find (arm_ops_hsh, opname);
5287ad62 13089
037e8744
JB
13090 if (!opcode)
13091 abort ();
5287ad62 13092
037e8744 13093 constraint (!ARM_CPU_HAS_FEATURE (cpu_variant,
477330fc
RM
13094 thumb_mode ? *opcode->tvariant : *opcode->avariant),
13095 _(BAD_FPU));
5287ad62 13096
88714cb8
DG
13097 inst.is_neon = 1;
13098
037e8744
JB
13099 if (thumb_mode)
13100 {
13101 inst.instruction = opcode->tvalue;
13102 opcode->tencode ();
13103 }
13104 else
13105 {
13106 inst.instruction = (inst.cond << 28) | opcode->avalue;
13107 opcode->aencode ();
13108 }
13109}
5287ad62
JB
13110
13111static void
037e8744 13112do_vfp_nsyn_add_sub (enum neon_shape rs)
5287ad62 13113{
037e8744
JB
13114 int is_add = (inst.instruction & 0x0fffffff) == N_MNEM_vadd;
13115
13116 if (rs == NS_FFF)
13117 {
13118 if (is_add)
477330fc 13119 do_vfp_nsyn_opcode ("fadds");
037e8744 13120 else
477330fc 13121 do_vfp_nsyn_opcode ("fsubs");
037e8744
JB
13122 }
13123 else
13124 {
13125 if (is_add)
477330fc 13126 do_vfp_nsyn_opcode ("faddd");
037e8744 13127 else
477330fc 13128 do_vfp_nsyn_opcode ("fsubd");
037e8744
JB
13129 }
13130}
13131
13132/* Check operand types to see if this is a VFP instruction, and if so call
13133 PFN (). */
13134
13135static int
13136try_vfp_nsyn (int args, void (*pfn) (enum neon_shape))
13137{
13138 enum neon_shape rs;
13139 struct neon_type_el et;
13140
13141 switch (args)
13142 {
13143 case 2:
13144 rs = neon_select_shape (NS_FF, NS_DD, NS_NULL);
13145 et = neon_check_type (2, rs,
477330fc 13146 N_EQK | N_VFP, N_F32 | N_F64 | N_KEY | N_VFP);
037e8744 13147 break;
5f4273c7 13148
037e8744
JB
13149 case 3:
13150 rs = neon_select_shape (NS_FFF, NS_DDD, NS_NULL);
13151 et = neon_check_type (3, rs,
477330fc 13152 N_EQK | N_VFP, N_EQK | N_VFP, N_F32 | N_F64 | N_KEY | N_VFP);
037e8744
JB
13153 break;
13154
13155 default:
13156 abort ();
13157 }
13158
13159 if (et.type != NT_invtype)
13160 {
13161 pfn (rs);
13162 return SUCCESS;
13163 }
037e8744 13164
99b253c5 13165 inst.error = NULL;
037e8744
JB
13166 return FAIL;
13167}
13168
13169static void
13170do_vfp_nsyn_mla_mls (enum neon_shape rs)
13171{
13172 int is_mla = (inst.instruction & 0x0fffffff) == N_MNEM_vmla;
5f4273c7 13173
037e8744
JB
13174 if (rs == NS_FFF)
13175 {
13176 if (is_mla)
477330fc 13177 do_vfp_nsyn_opcode ("fmacs");
037e8744 13178 else
477330fc 13179 do_vfp_nsyn_opcode ("fnmacs");
037e8744
JB
13180 }
13181 else
13182 {
13183 if (is_mla)
477330fc 13184 do_vfp_nsyn_opcode ("fmacd");
037e8744 13185 else
477330fc 13186 do_vfp_nsyn_opcode ("fnmacd");
037e8744
JB
13187 }
13188}
13189
62f3b8c8
PB
13190static void
13191do_vfp_nsyn_fma_fms (enum neon_shape rs)
13192{
13193 int is_fma = (inst.instruction & 0x0fffffff) == N_MNEM_vfma;
13194
13195 if (rs == NS_FFF)
13196 {
13197 if (is_fma)
477330fc 13198 do_vfp_nsyn_opcode ("ffmas");
62f3b8c8 13199 else
477330fc 13200 do_vfp_nsyn_opcode ("ffnmas");
62f3b8c8
PB
13201 }
13202 else
13203 {
13204 if (is_fma)
477330fc 13205 do_vfp_nsyn_opcode ("ffmad");
62f3b8c8 13206 else
477330fc 13207 do_vfp_nsyn_opcode ("ffnmad");
62f3b8c8
PB
13208 }
13209}
13210
037e8744
JB
13211static void
13212do_vfp_nsyn_mul (enum neon_shape rs)
13213{
13214 if (rs == NS_FFF)
13215 do_vfp_nsyn_opcode ("fmuls");
13216 else
13217 do_vfp_nsyn_opcode ("fmuld");
13218}
13219
13220static void
13221do_vfp_nsyn_abs_neg (enum neon_shape rs)
13222{
13223 int is_neg = (inst.instruction & 0x80) != 0;
13224 neon_check_type (2, rs, N_EQK | N_VFP, N_F32 | N_F64 | N_VFP | N_KEY);
13225
13226 if (rs == NS_FF)
13227 {
13228 if (is_neg)
477330fc 13229 do_vfp_nsyn_opcode ("fnegs");
037e8744 13230 else
477330fc 13231 do_vfp_nsyn_opcode ("fabss");
037e8744
JB
13232 }
13233 else
13234 {
13235 if (is_neg)
477330fc 13236 do_vfp_nsyn_opcode ("fnegd");
037e8744 13237 else
477330fc 13238 do_vfp_nsyn_opcode ("fabsd");
037e8744
JB
13239 }
13240}
13241
13242/* Encode single-precision (only!) VFP fldm/fstm instructions. Double precision
13243 insns belong to Neon, and are handled elsewhere. */
13244
13245static void
13246do_vfp_nsyn_ldm_stm (int is_dbmode)
13247{
13248 int is_ldm = (inst.instruction & (1 << 20)) != 0;
13249 if (is_ldm)
13250 {
13251 if (is_dbmode)
477330fc 13252 do_vfp_nsyn_opcode ("fldmdbs");
037e8744 13253 else
477330fc 13254 do_vfp_nsyn_opcode ("fldmias");
037e8744
JB
13255 }
13256 else
13257 {
13258 if (is_dbmode)
477330fc 13259 do_vfp_nsyn_opcode ("fstmdbs");
037e8744 13260 else
477330fc 13261 do_vfp_nsyn_opcode ("fstmias");
037e8744
JB
13262 }
13263}
13264
037e8744
JB
13265static void
13266do_vfp_nsyn_sqrt (void)
13267{
13268 enum neon_shape rs = neon_select_shape (NS_FF, NS_DD, NS_NULL);
13269 neon_check_type (2, rs, N_EQK | N_VFP, N_F32 | N_F64 | N_KEY | N_VFP);
5f4273c7 13270
037e8744
JB
13271 if (rs == NS_FF)
13272 do_vfp_nsyn_opcode ("fsqrts");
13273 else
13274 do_vfp_nsyn_opcode ("fsqrtd");
13275}
13276
13277static void
13278do_vfp_nsyn_div (void)
13279{
13280 enum neon_shape rs = neon_select_shape (NS_FFF, NS_DDD, NS_NULL);
13281 neon_check_type (3, rs, N_EQK | N_VFP, N_EQK | N_VFP,
13282 N_F32 | N_F64 | N_KEY | N_VFP);
5f4273c7 13283
037e8744
JB
13284 if (rs == NS_FFF)
13285 do_vfp_nsyn_opcode ("fdivs");
13286 else
13287 do_vfp_nsyn_opcode ("fdivd");
13288}
13289
13290static void
13291do_vfp_nsyn_nmul (void)
13292{
13293 enum neon_shape rs = neon_select_shape (NS_FFF, NS_DDD, NS_NULL);
13294 neon_check_type (3, rs, N_EQK | N_VFP, N_EQK | N_VFP,
13295 N_F32 | N_F64 | N_KEY | N_VFP);
5f4273c7 13296
037e8744
JB
13297 if (rs == NS_FFF)
13298 {
88714cb8 13299 NEON_ENCODE (SINGLE, inst);
037e8744
JB
13300 do_vfp_sp_dyadic ();
13301 }
13302 else
13303 {
88714cb8 13304 NEON_ENCODE (DOUBLE, inst);
037e8744
JB
13305 do_vfp_dp_rd_rn_rm ();
13306 }
13307 do_vfp_cond_or_thumb ();
13308}
13309
13310static void
13311do_vfp_nsyn_cmp (void)
13312{
13313 if (inst.operands[1].isreg)
13314 {
13315 enum neon_shape rs = neon_select_shape (NS_FF, NS_DD, NS_NULL);
13316 neon_check_type (2, rs, N_EQK | N_VFP, N_F32 | N_F64 | N_KEY | N_VFP);
5f4273c7 13317
037e8744 13318 if (rs == NS_FF)
477330fc
RM
13319 {
13320 NEON_ENCODE (SINGLE, inst);
13321 do_vfp_sp_monadic ();
13322 }
037e8744 13323 else
477330fc
RM
13324 {
13325 NEON_ENCODE (DOUBLE, inst);
13326 do_vfp_dp_rd_rm ();
13327 }
037e8744
JB
13328 }
13329 else
13330 {
13331 enum neon_shape rs = neon_select_shape (NS_FI, NS_DI, NS_NULL);
13332 neon_check_type (2, rs, N_F32 | N_F64 | N_KEY | N_VFP, N_EQK);
13333
13334 switch (inst.instruction & 0x0fffffff)
477330fc
RM
13335 {
13336 case N_MNEM_vcmp:
13337 inst.instruction += N_MNEM_vcmpz - N_MNEM_vcmp;
13338 break;
13339 case N_MNEM_vcmpe:
13340 inst.instruction += N_MNEM_vcmpez - N_MNEM_vcmpe;
13341 break;
13342 default:
13343 abort ();
13344 }
5f4273c7 13345
037e8744 13346 if (rs == NS_FI)
477330fc
RM
13347 {
13348 NEON_ENCODE (SINGLE, inst);
13349 do_vfp_sp_compare_z ();
13350 }
037e8744 13351 else
477330fc
RM
13352 {
13353 NEON_ENCODE (DOUBLE, inst);
13354 do_vfp_dp_rd ();
13355 }
037e8744
JB
13356 }
13357 do_vfp_cond_or_thumb ();
13358}
13359
13360static void
13361nsyn_insert_sp (void)
13362{
13363 inst.operands[1] = inst.operands[0];
13364 memset (&inst.operands[0], '\0', sizeof (inst.operands[0]));
fdfde340 13365 inst.operands[0].reg = REG_SP;
037e8744
JB
13366 inst.operands[0].isreg = 1;
13367 inst.operands[0].writeback = 1;
13368 inst.operands[0].present = 1;
13369}
13370
13371static void
13372do_vfp_nsyn_push (void)
13373{
13374 nsyn_insert_sp ();
13375 if (inst.operands[1].issingle)
13376 do_vfp_nsyn_opcode ("fstmdbs");
13377 else
13378 do_vfp_nsyn_opcode ("fstmdbd");
13379}
13380
13381static void
13382do_vfp_nsyn_pop (void)
13383{
13384 nsyn_insert_sp ();
13385 if (inst.operands[1].issingle)
22b5b651 13386 do_vfp_nsyn_opcode ("fldmias");
037e8744 13387 else
22b5b651 13388 do_vfp_nsyn_opcode ("fldmiad");
037e8744
JB
13389}
13390
13391/* Fix up Neon data-processing instructions, ORing in the correct bits for
13392 ARM mode or Thumb mode and moving the encoded bit 24 to bit 28. */
13393
88714cb8
DG
13394static void
13395neon_dp_fixup (struct arm_it* insn)
037e8744 13396{
88714cb8
DG
13397 unsigned int i = insn->instruction;
13398 insn->is_neon = 1;
13399
037e8744
JB
13400 if (thumb_mode)
13401 {
13402 /* The U bit is at bit 24 by default. Move to bit 28 in Thumb mode. */
13403 if (i & (1 << 24))
477330fc 13404 i |= 1 << 28;
5f4273c7 13405
037e8744 13406 i &= ~(1 << 24);
5f4273c7 13407
037e8744
JB
13408 i |= 0xef000000;
13409 }
13410 else
13411 i |= 0xf2000000;
5f4273c7 13412
88714cb8 13413 insn->instruction = i;
037e8744
JB
13414}
13415
13416/* Turn a size (8, 16, 32, 64) into the respective bit number minus 3
13417 (0, 1, 2, 3). */
13418
13419static unsigned
13420neon_logbits (unsigned x)
13421{
13422 return ffs (x) - 4;
13423}
13424
13425#define LOW4(R) ((R) & 0xf)
13426#define HI1(R) (((R) >> 4) & 1)
13427
13428/* Encode insns with bit pattern:
13429
13430 |28/24|23|22 |21 20|19 16|15 12|11 8|7|6|5|4|3 0|
13431 | U |x |D |size | Rn | Rd |x x x x|N|Q|M|x| Rm |
5f4273c7 13432
037e8744
JB
13433 SIZE is passed in bits. -1 means size field isn't changed, in case it has a
13434 different meaning for some instruction. */
13435
13436static void
13437neon_three_same (int isquad, int ubit, int size)
13438{
13439 inst.instruction |= LOW4 (inst.operands[0].reg) << 12;
13440 inst.instruction |= HI1 (inst.operands[0].reg) << 22;
13441 inst.instruction |= LOW4 (inst.operands[1].reg) << 16;
13442 inst.instruction |= HI1 (inst.operands[1].reg) << 7;
13443 inst.instruction |= LOW4 (inst.operands[2].reg);
13444 inst.instruction |= HI1 (inst.operands[2].reg) << 5;
13445 inst.instruction |= (isquad != 0) << 6;
13446 inst.instruction |= (ubit != 0) << 24;
13447 if (size != -1)
13448 inst.instruction |= neon_logbits (size) << 20;
5f4273c7 13449
88714cb8 13450 neon_dp_fixup (&inst);
037e8744
JB
13451}
13452
13453/* Encode instructions of the form:
13454
13455 |28/24|23|22|21 20|19 18|17 16|15 12|11 7|6|5|4|3 0|
13456 | U |x |D |x x |size |x x | Rd |x x x x x|Q|M|x| Rm |
5287ad62
JB
13457
13458 Don't write size if SIZE == -1. */
13459
13460static void
13461neon_two_same (int qbit, int ubit, int size)
13462{
13463 inst.instruction |= LOW4 (inst.operands[0].reg) << 12;
13464 inst.instruction |= HI1 (inst.operands[0].reg) << 22;
13465 inst.instruction |= LOW4 (inst.operands[1].reg);
13466 inst.instruction |= HI1 (inst.operands[1].reg) << 5;
13467 inst.instruction |= (qbit != 0) << 6;
13468 inst.instruction |= (ubit != 0) << 24;
13469
13470 if (size != -1)
13471 inst.instruction |= neon_logbits (size) << 18;
13472
88714cb8 13473 neon_dp_fixup (&inst);
5287ad62
JB
13474}
13475
13476/* Neon instruction encoders, in approximate order of appearance. */
13477
13478static void
13479do_neon_dyadic_i_su (void)
13480{
037e8744 13481 enum neon_shape rs = neon_select_shape (NS_DDD, NS_QQQ, NS_NULL);
5287ad62
JB
13482 struct neon_type_el et = neon_check_type (3, rs,
13483 N_EQK, N_EQK, N_SU_32 | N_KEY);
037e8744 13484 neon_three_same (neon_quad (rs), et.type == NT_unsigned, et.size);
5287ad62
JB
13485}
13486
13487static void
13488do_neon_dyadic_i64_su (void)
13489{
037e8744 13490 enum neon_shape rs = neon_select_shape (NS_DDD, NS_QQQ, NS_NULL);
5287ad62
JB
13491 struct neon_type_el et = neon_check_type (3, rs,
13492 N_EQK, N_EQK, N_SU_ALL | N_KEY);
037e8744 13493 neon_three_same (neon_quad (rs), et.type == NT_unsigned, et.size);
5287ad62
JB
13494}
13495
13496static void
13497neon_imm_shift (int write_ubit, int uval, int isquad, struct neon_type_el et,
477330fc 13498 unsigned immbits)
5287ad62
JB
13499{
13500 unsigned size = et.size >> 3;
13501 inst.instruction |= LOW4 (inst.operands[0].reg) << 12;
13502 inst.instruction |= HI1 (inst.operands[0].reg) << 22;
13503 inst.instruction |= LOW4 (inst.operands[1].reg);
13504 inst.instruction |= HI1 (inst.operands[1].reg) << 5;
13505 inst.instruction |= (isquad != 0) << 6;
13506 inst.instruction |= immbits << 16;
13507 inst.instruction |= (size >> 3) << 7;
13508 inst.instruction |= (size & 0x7) << 19;
13509 if (write_ubit)
13510 inst.instruction |= (uval != 0) << 24;
13511
88714cb8 13512 neon_dp_fixup (&inst);
5287ad62
JB
13513}
13514
13515static void
13516do_neon_shl_imm (void)
13517{
13518 if (!inst.operands[2].isreg)
13519 {
037e8744 13520 enum neon_shape rs = neon_select_shape (NS_DDI, NS_QQI, NS_NULL);
5287ad62 13521 struct neon_type_el et = neon_check_type (2, rs, N_EQK, N_KEY | N_I_ALL);
88714cb8 13522 NEON_ENCODE (IMMED, inst);
037e8744 13523 neon_imm_shift (FALSE, 0, neon_quad (rs), et, inst.operands[2].imm);
5287ad62
JB
13524 }
13525 else
13526 {
037e8744 13527 enum neon_shape rs = neon_select_shape (NS_DDD, NS_QQQ, NS_NULL);
5287ad62 13528 struct neon_type_el et = neon_check_type (3, rs,
477330fc 13529 N_EQK, N_SU_ALL | N_KEY, N_EQK | N_SGN);
627907b7
JB
13530 unsigned int tmp;
13531
13532 /* VSHL/VQSHL 3-register variants have syntax such as:
477330fc
RM
13533 vshl.xx Dd, Dm, Dn
13534 whereas other 3-register operations encoded by neon_three_same have
13535 syntax like:
13536 vadd.xx Dd, Dn, Dm
13537 (i.e. with Dn & Dm reversed). Swap operands[1].reg and operands[2].reg
13538 here. */
627907b7
JB
13539 tmp = inst.operands[2].reg;
13540 inst.operands[2].reg = inst.operands[1].reg;
13541 inst.operands[1].reg = tmp;
88714cb8 13542 NEON_ENCODE (INTEGER, inst);
037e8744 13543 neon_three_same (neon_quad (rs), et.type == NT_unsigned, et.size);
5287ad62
JB
13544 }
13545}
13546
13547static void
13548do_neon_qshl_imm (void)
13549{
13550 if (!inst.operands[2].isreg)
13551 {
037e8744 13552 enum neon_shape rs = neon_select_shape (NS_DDI, NS_QQI, NS_NULL);
5287ad62 13553 struct neon_type_el et = neon_check_type (2, rs, N_EQK, N_SU_ALL | N_KEY);
627907b7 13554
88714cb8 13555 NEON_ENCODE (IMMED, inst);
037e8744 13556 neon_imm_shift (TRUE, et.type == NT_unsigned, neon_quad (rs), et,
477330fc 13557 inst.operands[2].imm);
5287ad62
JB
13558 }
13559 else
13560 {
037e8744 13561 enum neon_shape rs = neon_select_shape (NS_DDD, NS_QQQ, NS_NULL);
5287ad62 13562 struct neon_type_el et = neon_check_type (3, rs,
477330fc 13563 N_EQK, N_SU_ALL | N_KEY, N_EQK | N_SGN);
627907b7
JB
13564 unsigned int tmp;
13565
13566 /* See note in do_neon_shl_imm. */
13567 tmp = inst.operands[2].reg;
13568 inst.operands[2].reg = inst.operands[1].reg;
13569 inst.operands[1].reg = tmp;
88714cb8 13570 NEON_ENCODE (INTEGER, inst);
037e8744 13571 neon_three_same (neon_quad (rs), et.type == NT_unsigned, et.size);
5287ad62
JB
13572 }
13573}
13574
627907b7
JB
13575static void
13576do_neon_rshl (void)
13577{
13578 enum neon_shape rs = neon_select_shape (NS_DDD, NS_QQQ, NS_NULL);
13579 struct neon_type_el et = neon_check_type (3, rs,
13580 N_EQK, N_EQK, N_SU_ALL | N_KEY);
13581 unsigned int tmp;
13582
13583 tmp = inst.operands[2].reg;
13584 inst.operands[2].reg = inst.operands[1].reg;
13585 inst.operands[1].reg = tmp;
13586 neon_three_same (neon_quad (rs), et.type == NT_unsigned, et.size);
13587}
13588
5287ad62
JB
13589static int
13590neon_cmode_for_logic_imm (unsigned immediate, unsigned *immbits, int size)
13591{
036dc3f7
PB
13592 /* Handle .I8 pseudo-instructions. */
13593 if (size == 8)
5287ad62 13594 {
5287ad62 13595 /* Unfortunately, this will make everything apart from zero out-of-range.
477330fc
RM
13596 FIXME is this the intended semantics? There doesn't seem much point in
13597 accepting .I8 if so. */
5287ad62
JB
13598 immediate |= immediate << 8;
13599 size = 16;
036dc3f7
PB
13600 }
13601
13602 if (size >= 32)
13603 {
13604 if (immediate == (immediate & 0x000000ff))
13605 {
13606 *immbits = immediate;
13607 return 0x1;
13608 }
13609 else if (immediate == (immediate & 0x0000ff00))
13610 {
13611 *immbits = immediate >> 8;
13612 return 0x3;
13613 }
13614 else if (immediate == (immediate & 0x00ff0000))
13615 {
13616 *immbits = immediate >> 16;
13617 return 0x5;
13618 }
13619 else if (immediate == (immediate & 0xff000000))
13620 {
13621 *immbits = immediate >> 24;
13622 return 0x7;
13623 }
13624 if ((immediate & 0xffff) != (immediate >> 16))
13625 goto bad_immediate;
13626 immediate &= 0xffff;
5287ad62
JB
13627 }
13628
13629 if (immediate == (immediate & 0x000000ff))
13630 {
13631 *immbits = immediate;
036dc3f7 13632 return 0x9;
5287ad62
JB
13633 }
13634 else if (immediate == (immediate & 0x0000ff00))
13635 {
13636 *immbits = immediate >> 8;
036dc3f7 13637 return 0xb;
5287ad62
JB
13638 }
13639
13640 bad_immediate:
dcbf9037 13641 first_error (_("immediate value out of range"));
5287ad62
JB
13642 return FAIL;
13643}
13644
13645/* True if IMM has form 0bAAAAAAAABBBBBBBBCCCCCCCCDDDDDDDD for bits
13646 A, B, C, D. */
13647
13648static int
13649neon_bits_same_in_bytes (unsigned imm)
13650{
13651 return ((imm & 0x000000ff) == 0 || (imm & 0x000000ff) == 0x000000ff)
477330fc
RM
13652 && ((imm & 0x0000ff00) == 0 || (imm & 0x0000ff00) == 0x0000ff00)
13653 && ((imm & 0x00ff0000) == 0 || (imm & 0x00ff0000) == 0x00ff0000)
13654 && ((imm & 0xff000000) == 0 || (imm & 0xff000000) == 0xff000000);
5287ad62
JB
13655}
13656
13657/* For immediate of above form, return 0bABCD. */
13658
13659static unsigned
13660neon_squash_bits (unsigned imm)
13661{
13662 return (imm & 0x01) | ((imm & 0x0100) >> 7) | ((imm & 0x010000) >> 14)
477330fc 13663 | ((imm & 0x01000000) >> 21);
5287ad62
JB
13664}
13665
136da414 13666/* Compress quarter-float representation to 0b...000 abcdefgh. */
5287ad62
JB
13667
13668static unsigned
13669neon_qfloat_bits (unsigned imm)
13670{
136da414 13671 return ((imm >> 19) & 0x7f) | ((imm >> 24) & 0x80);
5287ad62
JB
13672}
13673
13674/* Returns CMODE. IMMBITS [7:0] is set to bits suitable for inserting into
13675 the instruction. *OP is passed as the initial value of the op field, and
13676 may be set to a different value depending on the constant (i.e.
13677 "MOV I64, 0bAAAAAAAABBBB..." which uses OP = 1 despite being MOV not
5f4273c7 13678 MVN). If the immediate looks like a repeated pattern then also
036dc3f7 13679 try smaller element sizes. */
5287ad62
JB
13680
13681static int
c96612cc
JB
13682neon_cmode_for_move_imm (unsigned immlo, unsigned immhi, int float_p,
13683 unsigned *immbits, int *op, int size,
13684 enum neon_el_type type)
5287ad62 13685{
c96612cc
JB
13686 /* Only permit float immediates (including 0.0/-0.0) if the operand type is
13687 float. */
13688 if (type == NT_float && !float_p)
13689 return FAIL;
13690
136da414
JB
13691 if (type == NT_float && is_quarter_float (immlo) && immhi == 0)
13692 {
13693 if (size != 32 || *op == 1)
477330fc 13694 return FAIL;
136da414
JB
13695 *immbits = neon_qfloat_bits (immlo);
13696 return 0xf;
13697 }
036dc3f7
PB
13698
13699 if (size == 64)
5287ad62 13700 {
036dc3f7
PB
13701 if (neon_bits_same_in_bytes (immhi)
13702 && neon_bits_same_in_bytes (immlo))
13703 {
13704 if (*op == 1)
13705 return FAIL;
13706 *immbits = (neon_squash_bits (immhi) << 4)
13707 | neon_squash_bits (immlo);
13708 *op = 1;
13709 return 0xe;
13710 }
13711
13712 if (immhi != immlo)
13713 return FAIL;
5287ad62 13714 }
036dc3f7
PB
13715
13716 if (size >= 32)
5287ad62 13717 {
036dc3f7
PB
13718 if (immlo == (immlo & 0x000000ff))
13719 {
13720 *immbits = immlo;
13721 return 0x0;
13722 }
13723 else if (immlo == (immlo & 0x0000ff00))
13724 {
13725 *immbits = immlo >> 8;
13726 return 0x2;
13727 }
13728 else if (immlo == (immlo & 0x00ff0000))
13729 {
13730 *immbits = immlo >> 16;
13731 return 0x4;
13732 }
13733 else if (immlo == (immlo & 0xff000000))
13734 {
13735 *immbits = immlo >> 24;
13736 return 0x6;
13737 }
13738 else if (immlo == ((immlo & 0x0000ff00) | 0x000000ff))
13739 {
13740 *immbits = (immlo >> 8) & 0xff;
13741 return 0xc;
13742 }
13743 else if (immlo == ((immlo & 0x00ff0000) | 0x0000ffff))
13744 {
13745 *immbits = (immlo >> 16) & 0xff;
13746 return 0xd;
13747 }
13748
13749 if ((immlo & 0xffff) != (immlo >> 16))
13750 return FAIL;
13751 immlo &= 0xffff;
5287ad62 13752 }
036dc3f7
PB
13753
13754 if (size >= 16)
5287ad62 13755 {
036dc3f7
PB
13756 if (immlo == (immlo & 0x000000ff))
13757 {
13758 *immbits = immlo;
13759 return 0x8;
13760 }
13761 else if (immlo == (immlo & 0x0000ff00))
13762 {
13763 *immbits = immlo >> 8;
13764 return 0xa;
13765 }
13766
13767 if ((immlo & 0xff) != (immlo >> 8))
13768 return FAIL;
13769 immlo &= 0xff;
5287ad62 13770 }
036dc3f7
PB
13771
13772 if (immlo == (immlo & 0x000000ff))
5287ad62 13773 {
036dc3f7
PB
13774 /* Don't allow MVN with 8-bit immediate. */
13775 if (*op == 1)
13776 return FAIL;
13777 *immbits = immlo;
13778 return 0xe;
5287ad62 13779 }
5287ad62
JB
13780
13781 return FAIL;
13782}
13783
13784/* Write immediate bits [7:0] to the following locations:
13785
13786 |28/24|23 19|18 16|15 4|3 0|
13787 | 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|
13788
13789 This function is used by VMOV/VMVN/VORR/VBIC. */
13790
13791static void
13792neon_write_immbits (unsigned immbits)
13793{
13794 inst.instruction |= immbits & 0xf;
13795 inst.instruction |= ((immbits >> 4) & 0x7) << 16;
13796 inst.instruction |= ((immbits >> 7) & 0x1) << 24;
13797}
13798
13799/* Invert low-order SIZE bits of XHI:XLO. */
13800
13801static void
13802neon_invert_size (unsigned *xlo, unsigned *xhi, int size)
13803{
13804 unsigned immlo = xlo ? *xlo : 0;
13805 unsigned immhi = xhi ? *xhi : 0;
13806
13807 switch (size)
13808 {
13809 case 8:
13810 immlo = (~immlo) & 0xff;
13811 break;
13812
13813 case 16:
13814 immlo = (~immlo) & 0xffff;
13815 break;
13816
13817 case 64:
13818 immhi = (~immhi) & 0xffffffff;
13819 /* fall through. */
13820
13821 case 32:
13822 immlo = (~immlo) & 0xffffffff;
13823 break;
13824
13825 default:
13826 abort ();
13827 }
13828
13829 if (xlo)
13830 *xlo = immlo;
13831
13832 if (xhi)
13833 *xhi = immhi;
13834}
13835
13836static void
13837do_neon_logic (void)
13838{
13839 if (inst.operands[2].present && inst.operands[2].isreg)
13840 {
037e8744 13841 enum neon_shape rs = neon_select_shape (NS_DDD, NS_QQQ, NS_NULL);
5287ad62
JB
13842 neon_check_type (3, rs, N_IGNORE_TYPE);
13843 /* U bit and size field were set as part of the bitmask. */
88714cb8 13844 NEON_ENCODE (INTEGER, inst);
037e8744 13845 neon_three_same (neon_quad (rs), 0, -1);
5287ad62
JB
13846 }
13847 else
13848 {
4316f0d2
DG
13849 const int three_ops_form = (inst.operands[2].present
13850 && !inst.operands[2].isreg);
13851 const int immoperand = (three_ops_form ? 2 : 1);
13852 enum neon_shape rs = (three_ops_form
13853 ? neon_select_shape (NS_DDI, NS_QQI, NS_NULL)
13854 : neon_select_shape (NS_DI, NS_QI, NS_NULL));
037e8744 13855 struct neon_type_el et = neon_check_type (2, rs,
477330fc 13856 N_I8 | N_I16 | N_I32 | N_I64 | N_F32 | N_KEY, N_EQK);
21d799b5 13857 enum neon_opc opcode = (enum neon_opc) inst.instruction & 0x0fffffff;
5287ad62
JB
13858 unsigned immbits;
13859 int cmode;
5f4273c7 13860
5287ad62 13861 if (et.type == NT_invtype)
477330fc 13862 return;
5f4273c7 13863
4316f0d2
DG
13864 if (three_ops_form)
13865 constraint (inst.operands[0].reg != inst.operands[1].reg,
13866 _("first and second operands shall be the same register"));
13867
88714cb8 13868 NEON_ENCODE (IMMED, inst);
5287ad62 13869
4316f0d2 13870 immbits = inst.operands[immoperand].imm;
036dc3f7
PB
13871 if (et.size == 64)
13872 {
13873 /* .i64 is a pseudo-op, so the immediate must be a repeating
13874 pattern. */
4316f0d2
DG
13875 if (immbits != (inst.operands[immoperand].regisimm ?
13876 inst.operands[immoperand].reg : 0))
036dc3f7
PB
13877 {
13878 /* Set immbits to an invalid constant. */
13879 immbits = 0xdeadbeef;
13880 }
13881 }
13882
5287ad62 13883 switch (opcode)
477330fc
RM
13884 {
13885 case N_MNEM_vbic:
13886 cmode = neon_cmode_for_logic_imm (immbits, &immbits, et.size);
13887 break;
13888
13889 case N_MNEM_vorr:
13890 cmode = neon_cmode_for_logic_imm (immbits, &immbits, et.size);
13891 break;
13892
13893 case N_MNEM_vand:
13894 /* Pseudo-instruction for VBIC. */
13895 neon_invert_size (&immbits, 0, et.size);
13896 cmode = neon_cmode_for_logic_imm (immbits, &immbits, et.size);
13897 break;
13898
13899 case N_MNEM_vorn:
13900 /* Pseudo-instruction for VORR. */
13901 neon_invert_size (&immbits, 0, et.size);
13902 cmode = neon_cmode_for_logic_imm (immbits, &immbits, et.size);
13903 break;
13904
13905 default:
13906 abort ();
13907 }
5287ad62
JB
13908
13909 if (cmode == FAIL)
477330fc 13910 return;
5287ad62 13911
037e8744 13912 inst.instruction |= neon_quad (rs) << 6;
5287ad62
JB
13913 inst.instruction |= LOW4 (inst.operands[0].reg) << 12;
13914 inst.instruction |= HI1 (inst.operands[0].reg) << 22;
13915 inst.instruction |= cmode << 8;
13916 neon_write_immbits (immbits);
5f4273c7 13917
88714cb8 13918 neon_dp_fixup (&inst);
5287ad62
JB
13919 }
13920}
13921
13922static void
13923do_neon_bitfield (void)
13924{
037e8744 13925 enum neon_shape rs = neon_select_shape (NS_DDD, NS_QQQ, NS_NULL);
dcbf9037 13926 neon_check_type (3, rs, N_IGNORE_TYPE);
037e8744 13927 neon_three_same (neon_quad (rs), 0, -1);
5287ad62
JB
13928}
13929
13930static void
dcbf9037 13931neon_dyadic_misc (enum neon_el_type ubit_meaning, unsigned types,
477330fc 13932 unsigned destbits)
5287ad62 13933{
037e8744 13934 enum neon_shape rs = neon_select_shape (NS_DDD, NS_QQQ, NS_NULL);
dcbf9037 13935 struct neon_type_el et = neon_check_type (3, rs, N_EQK | destbits, N_EQK,
477330fc 13936 types | N_KEY);
5287ad62
JB
13937 if (et.type == NT_float)
13938 {
88714cb8 13939 NEON_ENCODE (FLOAT, inst);
037e8744 13940 neon_three_same (neon_quad (rs), 0, -1);
5287ad62
JB
13941 }
13942 else
13943 {
88714cb8 13944 NEON_ENCODE (INTEGER, inst);
037e8744 13945 neon_three_same (neon_quad (rs), et.type == ubit_meaning, et.size);
5287ad62
JB
13946 }
13947}
13948
13949static void
13950do_neon_dyadic_if_su (void)
13951{
dcbf9037 13952 neon_dyadic_misc (NT_unsigned, N_SUF_32, 0);
5287ad62
JB
13953}
13954
13955static void
13956do_neon_dyadic_if_su_d (void)
13957{
13958 /* This version only allow D registers, but that constraint is enforced during
13959 operand parsing so we don't need to do anything extra here. */
dcbf9037 13960 neon_dyadic_misc (NT_unsigned, N_SUF_32, 0);
5287ad62
JB
13961}
13962
5287ad62
JB
13963static void
13964do_neon_dyadic_if_i_d (void)
13965{
428e3f1f
PB
13966 /* The "untyped" case can't happen. Do this to stop the "U" bit being
13967 affected if we specify unsigned args. */
13968 neon_dyadic_misc (NT_untyped, N_IF_32, 0);
5287ad62
JB
13969}
13970
037e8744
JB
13971enum vfp_or_neon_is_neon_bits
13972{
13973 NEON_CHECK_CC = 1,
73924fbc
MGD
13974 NEON_CHECK_ARCH = 2,
13975 NEON_CHECK_ARCH8 = 4
037e8744
JB
13976};
13977
13978/* Call this function if an instruction which may have belonged to the VFP or
13979 Neon instruction sets, but turned out to be a Neon instruction (due to the
13980 operand types involved, etc.). We have to check and/or fix-up a couple of
13981 things:
13982
13983 - Make sure the user hasn't attempted to make a Neon instruction
13984 conditional.
13985 - Alter the value in the condition code field if necessary.
13986 - Make sure that the arch supports Neon instructions.
13987
13988 Which of these operations take place depends on bits from enum
13989 vfp_or_neon_is_neon_bits.
13990
13991 WARNING: This function has side effects! If NEON_CHECK_CC is used and the
13992 current instruction's condition is COND_ALWAYS, the condition field is
13993 changed to inst.uncond_value. This is necessary because instructions shared
13994 between VFP and Neon may be conditional for the VFP variants only, and the
13995 unconditional Neon version must have, e.g., 0xF in the condition field. */
13996
13997static int
13998vfp_or_neon_is_neon (unsigned check)
13999{
14000 /* Conditions are always legal in Thumb mode (IT blocks). */
14001 if (!thumb_mode && (check & NEON_CHECK_CC))
14002 {
14003 if (inst.cond != COND_ALWAYS)
477330fc
RM
14004 {
14005 first_error (_(BAD_COND));
14006 return FAIL;
14007 }
037e8744 14008 if (inst.uncond_value != -1)
477330fc 14009 inst.instruction |= inst.uncond_value << 28;
037e8744 14010 }
5f4273c7 14011
037e8744 14012 if ((check & NEON_CHECK_ARCH)
73924fbc
MGD
14013 && !mark_feature_used (&fpu_neon_ext_v1))
14014 {
14015 first_error (_(BAD_FPU));
14016 return FAIL;
14017 }
14018
14019 if ((check & NEON_CHECK_ARCH8)
14020 && !mark_feature_used (&fpu_neon_ext_armv8))
037e8744
JB
14021 {
14022 first_error (_(BAD_FPU));
14023 return FAIL;
14024 }
5f4273c7 14025
037e8744
JB
14026 return SUCCESS;
14027}
14028
5287ad62
JB
14029static void
14030do_neon_addsub_if_i (void)
14031{
037e8744
JB
14032 if (try_vfp_nsyn (3, do_vfp_nsyn_add_sub) == SUCCESS)
14033 return;
14034
14035 if (vfp_or_neon_is_neon (NEON_CHECK_CC | NEON_CHECK_ARCH) == FAIL)
14036 return;
14037
5287ad62
JB
14038 /* The "untyped" case can't happen. Do this to stop the "U" bit being
14039 affected if we specify unsigned args. */
dcbf9037 14040 neon_dyadic_misc (NT_untyped, N_IF_32 | N_I64, 0);
5287ad62
JB
14041}
14042
14043/* Swaps operands 1 and 2. If operand 1 (optional arg) was omitted, we want the
14044 result to be:
14045 V<op> A,B (A is operand 0, B is operand 2)
14046 to mean:
14047 V<op> A,B,A
14048 not:
14049 V<op> A,B,B
14050 so handle that case specially. */
14051
14052static void
14053neon_exchange_operands (void)
14054{
14055 void *scratch = alloca (sizeof (inst.operands[0]));
14056 if (inst.operands[1].present)
14057 {
14058 /* Swap operands[1] and operands[2]. */
14059 memcpy (scratch, &inst.operands[1], sizeof (inst.operands[0]));
14060 inst.operands[1] = inst.operands[2];
14061 memcpy (&inst.operands[2], scratch, sizeof (inst.operands[0]));
14062 }
14063 else
14064 {
14065 inst.operands[1] = inst.operands[2];
14066 inst.operands[2] = inst.operands[0];
14067 }
14068}
14069
14070static void
14071neon_compare (unsigned regtypes, unsigned immtypes, int invert)
14072{
14073 if (inst.operands[2].isreg)
14074 {
14075 if (invert)
477330fc 14076 neon_exchange_operands ();
dcbf9037 14077 neon_dyadic_misc (NT_unsigned, regtypes, N_SIZ);
5287ad62
JB
14078 }
14079 else
14080 {
037e8744 14081 enum neon_shape rs = neon_select_shape (NS_DDI, NS_QQI, NS_NULL);
dcbf9037 14082 struct neon_type_el et = neon_check_type (2, rs,
477330fc 14083 N_EQK | N_SIZ, immtypes | N_KEY);
5287ad62 14084
88714cb8 14085 NEON_ENCODE (IMMED, inst);
5287ad62
JB
14086 inst.instruction |= LOW4 (inst.operands[0].reg) << 12;
14087 inst.instruction |= HI1 (inst.operands[0].reg) << 22;
14088 inst.instruction |= LOW4 (inst.operands[1].reg);
14089 inst.instruction |= HI1 (inst.operands[1].reg) << 5;
037e8744 14090 inst.instruction |= neon_quad (rs) << 6;
5287ad62
JB
14091 inst.instruction |= (et.type == NT_float) << 10;
14092 inst.instruction |= neon_logbits (et.size) << 18;
5f4273c7 14093
88714cb8 14094 neon_dp_fixup (&inst);
5287ad62
JB
14095 }
14096}
14097
14098static void
14099do_neon_cmp (void)
14100{
14101 neon_compare (N_SUF_32, N_S8 | N_S16 | N_S32 | N_F32, FALSE);
14102}
14103
14104static void
14105do_neon_cmp_inv (void)
14106{
14107 neon_compare (N_SUF_32, N_S8 | N_S16 | N_S32 | N_F32, TRUE);
14108}
14109
14110static void
14111do_neon_ceq (void)
14112{
14113 neon_compare (N_IF_32, N_IF_32, FALSE);
14114}
14115
14116/* For multiply instructions, we have the possibility of 16-bit or 32-bit
14117 scalars, which are encoded in 5 bits, M : Rm.
14118 For 16-bit scalars, the register is encoded in Rm[2:0] and the index in
14119 M:Rm[3], and for 32-bit scalars, the register is encoded in Rm[3:0] and the
14120 index in M. */
14121
14122static unsigned
14123neon_scalar_for_mul (unsigned scalar, unsigned elsize)
14124{
dcbf9037
JB
14125 unsigned regno = NEON_SCALAR_REG (scalar);
14126 unsigned elno = NEON_SCALAR_INDEX (scalar);
5287ad62
JB
14127
14128 switch (elsize)
14129 {
14130 case 16:
14131 if (regno > 7 || elno > 3)
477330fc 14132 goto bad_scalar;
5287ad62 14133 return regno | (elno << 3);
5f4273c7 14134
5287ad62
JB
14135 case 32:
14136 if (regno > 15 || elno > 1)
477330fc 14137 goto bad_scalar;
5287ad62
JB
14138 return regno | (elno << 4);
14139
14140 default:
14141 bad_scalar:
dcbf9037 14142 first_error (_("scalar out of range for multiply instruction"));
5287ad62
JB
14143 }
14144
14145 return 0;
14146}
14147
14148/* Encode multiply / multiply-accumulate scalar instructions. */
14149
14150static void
14151neon_mul_mac (struct neon_type_el et, int ubit)
14152{
dcbf9037
JB
14153 unsigned scalar;
14154
14155 /* Give a more helpful error message if we have an invalid type. */
14156 if (et.type == NT_invtype)
14157 return;
5f4273c7 14158
dcbf9037 14159 scalar = neon_scalar_for_mul (inst.operands[2].reg, et.size);
5287ad62
JB
14160 inst.instruction |= LOW4 (inst.operands[0].reg) << 12;
14161 inst.instruction |= HI1 (inst.operands[0].reg) << 22;
14162 inst.instruction |= LOW4 (inst.operands[1].reg) << 16;
14163 inst.instruction |= HI1 (inst.operands[1].reg) << 7;
14164 inst.instruction |= LOW4 (scalar);
14165 inst.instruction |= HI1 (scalar) << 5;
14166 inst.instruction |= (et.type == NT_float) << 8;
14167 inst.instruction |= neon_logbits (et.size) << 20;
14168 inst.instruction |= (ubit != 0) << 24;
14169
88714cb8 14170 neon_dp_fixup (&inst);
5287ad62
JB
14171}
14172
14173static void
14174do_neon_mac_maybe_scalar (void)
14175{
037e8744
JB
14176 if (try_vfp_nsyn (3, do_vfp_nsyn_mla_mls) == SUCCESS)
14177 return;
14178
14179 if (vfp_or_neon_is_neon (NEON_CHECK_CC | NEON_CHECK_ARCH) == FAIL)
14180 return;
14181
5287ad62
JB
14182 if (inst.operands[2].isscalar)
14183 {
037e8744 14184 enum neon_shape rs = neon_select_shape (NS_DDS, NS_QQS, NS_NULL);
5287ad62 14185 struct neon_type_el et = neon_check_type (3, rs,
477330fc 14186 N_EQK, N_EQK, N_I16 | N_I32 | N_F32 | N_KEY);
88714cb8 14187 NEON_ENCODE (SCALAR, inst);
037e8744 14188 neon_mul_mac (et, neon_quad (rs));
5287ad62
JB
14189 }
14190 else
428e3f1f
PB
14191 {
14192 /* The "untyped" case can't happen. Do this to stop the "U" bit being
14193 affected if we specify unsigned args. */
14194 neon_dyadic_misc (NT_untyped, N_IF_32, 0);
14195 }
5287ad62
JB
14196}
14197
62f3b8c8
PB
14198static void
14199do_neon_fmac (void)
14200{
14201 if (try_vfp_nsyn (3, do_vfp_nsyn_fma_fms) == SUCCESS)
14202 return;
14203
14204 if (vfp_or_neon_is_neon (NEON_CHECK_CC | NEON_CHECK_ARCH) == FAIL)
14205 return;
14206
14207 neon_dyadic_misc (NT_untyped, N_IF_32, 0);
14208}
14209
5287ad62
JB
14210static void
14211do_neon_tst (void)
14212{
037e8744 14213 enum neon_shape rs = neon_select_shape (NS_DDD, NS_QQQ, NS_NULL);
5287ad62
JB
14214 struct neon_type_el et = neon_check_type (3, rs,
14215 N_EQK, N_EQK, N_8 | N_16 | N_32 | N_KEY);
037e8744 14216 neon_three_same (neon_quad (rs), 0, et.size);
5287ad62
JB
14217}
14218
14219/* VMUL with 3 registers allows the P8 type. The scalar version supports the
14220 same types as the MAC equivalents. The polynomial type for this instruction
14221 is encoded the same as the integer type. */
14222
14223static void
14224do_neon_mul (void)
14225{
037e8744
JB
14226 if (try_vfp_nsyn (3, do_vfp_nsyn_mul) == SUCCESS)
14227 return;
14228
14229 if (vfp_or_neon_is_neon (NEON_CHECK_CC | NEON_CHECK_ARCH) == FAIL)
14230 return;
14231
5287ad62
JB
14232 if (inst.operands[2].isscalar)
14233 do_neon_mac_maybe_scalar ();
14234 else
dcbf9037 14235 neon_dyadic_misc (NT_poly, N_I8 | N_I16 | N_I32 | N_F32 | N_P8, 0);
5287ad62
JB
14236}
14237
14238static void
14239do_neon_qdmulh (void)
14240{
14241 if (inst.operands[2].isscalar)
14242 {
037e8744 14243 enum neon_shape rs = neon_select_shape (NS_DDS, NS_QQS, NS_NULL);
5287ad62 14244 struct neon_type_el et = neon_check_type (3, rs,
477330fc 14245 N_EQK, N_EQK, N_S16 | N_S32 | N_KEY);
88714cb8 14246 NEON_ENCODE (SCALAR, inst);
037e8744 14247 neon_mul_mac (et, neon_quad (rs));
5287ad62
JB
14248 }
14249 else
14250 {
037e8744 14251 enum neon_shape rs = neon_select_shape (NS_DDD, NS_QQQ, NS_NULL);
5287ad62 14252 struct neon_type_el et = neon_check_type (3, rs,
477330fc 14253 N_EQK, N_EQK, N_S16 | N_S32 | N_KEY);
88714cb8 14254 NEON_ENCODE (INTEGER, inst);
5287ad62 14255 /* The U bit (rounding) comes from bit mask. */
037e8744 14256 neon_three_same (neon_quad (rs), 0, et.size);
5287ad62
JB
14257 }
14258}
14259
14260static void
14261do_neon_fcmp_absolute (void)
14262{
037e8744 14263 enum neon_shape rs = neon_select_shape (NS_DDD, NS_QQQ, NS_NULL);
5287ad62
JB
14264 neon_check_type (3, rs, N_EQK, N_EQK, N_F32 | N_KEY);
14265 /* Size field comes from bit mask. */
037e8744 14266 neon_three_same (neon_quad (rs), 1, -1);
5287ad62
JB
14267}
14268
14269static void
14270do_neon_fcmp_absolute_inv (void)
14271{
14272 neon_exchange_operands ();
14273 do_neon_fcmp_absolute ();
14274}
14275
14276static void
14277do_neon_step (void)
14278{
037e8744 14279 enum neon_shape rs = neon_select_shape (NS_DDD, NS_QQQ, NS_NULL);
5287ad62 14280 neon_check_type (3, rs, N_EQK, N_EQK, N_F32 | N_KEY);
037e8744 14281 neon_three_same (neon_quad (rs), 0, -1);
5287ad62
JB
14282}
14283
14284static void
14285do_neon_abs_neg (void)
14286{
037e8744
JB
14287 enum neon_shape rs;
14288 struct neon_type_el et;
5f4273c7 14289
037e8744
JB
14290 if (try_vfp_nsyn (2, do_vfp_nsyn_abs_neg) == SUCCESS)
14291 return;
14292
14293 if (vfp_or_neon_is_neon (NEON_CHECK_CC | NEON_CHECK_ARCH) == FAIL)
14294 return;
14295
14296 rs = neon_select_shape (NS_DD, NS_QQ, NS_NULL);
14297 et = neon_check_type (2, rs, N_EQK, N_S8 | N_S16 | N_S32 | N_F32 | N_KEY);
5f4273c7 14298
5287ad62
JB
14299 inst.instruction |= LOW4 (inst.operands[0].reg) << 12;
14300 inst.instruction |= HI1 (inst.operands[0].reg) << 22;
14301 inst.instruction |= LOW4 (inst.operands[1].reg);
14302 inst.instruction |= HI1 (inst.operands[1].reg) << 5;
037e8744 14303 inst.instruction |= neon_quad (rs) << 6;
5287ad62
JB
14304 inst.instruction |= (et.type == NT_float) << 10;
14305 inst.instruction |= neon_logbits (et.size) << 18;
5f4273c7 14306
88714cb8 14307 neon_dp_fixup (&inst);
5287ad62
JB
14308}
14309
14310static void
14311do_neon_sli (void)
14312{
037e8744 14313 enum neon_shape rs = neon_select_shape (NS_DDI, NS_QQI, NS_NULL);
5287ad62
JB
14314 struct neon_type_el et = neon_check_type (2, rs,
14315 N_EQK, N_8 | N_16 | N_32 | N_64 | N_KEY);
14316 int imm = inst.operands[2].imm;
14317 constraint (imm < 0 || (unsigned)imm >= et.size,
477330fc 14318 _("immediate out of range for insert"));
037e8744 14319 neon_imm_shift (FALSE, 0, neon_quad (rs), et, imm);
5287ad62
JB
14320}
14321
14322static void
14323do_neon_sri (void)
14324{
037e8744 14325 enum neon_shape rs = neon_select_shape (NS_DDI, NS_QQI, NS_NULL);
5287ad62
JB
14326 struct neon_type_el et = neon_check_type (2, rs,
14327 N_EQK, N_8 | N_16 | N_32 | N_64 | N_KEY);
14328 int imm = inst.operands[2].imm;
14329 constraint (imm < 1 || (unsigned)imm > et.size,
477330fc 14330 _("immediate out of range for insert"));
037e8744 14331 neon_imm_shift (FALSE, 0, neon_quad (rs), et, et.size - imm);
5287ad62
JB
14332}
14333
14334static void
14335do_neon_qshlu_imm (void)
14336{
037e8744 14337 enum neon_shape rs = neon_select_shape (NS_DDI, NS_QQI, NS_NULL);
5287ad62
JB
14338 struct neon_type_el et = neon_check_type (2, rs,
14339 N_EQK | N_UNS, N_S8 | N_S16 | N_S32 | N_S64 | N_KEY);
14340 int imm = inst.operands[2].imm;
14341 constraint (imm < 0 || (unsigned)imm >= et.size,
477330fc 14342 _("immediate out of range for shift"));
5287ad62
JB
14343 /* Only encodes the 'U present' variant of the instruction.
14344 In this case, signed types have OP (bit 8) set to 0.
14345 Unsigned types have OP set to 1. */
14346 inst.instruction |= (et.type == NT_unsigned) << 8;
14347 /* The rest of the bits are the same as other immediate shifts. */
037e8744 14348 neon_imm_shift (FALSE, 0, neon_quad (rs), et, imm);
5287ad62
JB
14349}
14350
14351static void
14352do_neon_qmovn (void)
14353{
14354 struct neon_type_el et = neon_check_type (2, NS_DQ,
14355 N_EQK | N_HLF, N_SU_16_64 | N_KEY);
14356 /* Saturating move where operands can be signed or unsigned, and the
14357 destination has the same signedness. */
88714cb8 14358 NEON_ENCODE (INTEGER, inst);
5287ad62
JB
14359 if (et.type == NT_unsigned)
14360 inst.instruction |= 0xc0;
14361 else
14362 inst.instruction |= 0x80;
14363 neon_two_same (0, 1, et.size / 2);
14364}
14365
14366static void
14367do_neon_qmovun (void)
14368{
14369 struct neon_type_el et = neon_check_type (2, NS_DQ,
14370 N_EQK | N_HLF | N_UNS, N_S16 | N_S32 | N_S64 | N_KEY);
14371 /* Saturating move with unsigned results. Operands must be signed. */
88714cb8 14372 NEON_ENCODE (INTEGER, inst);
5287ad62
JB
14373 neon_two_same (0, 1, et.size / 2);
14374}
14375
14376static void
14377do_neon_rshift_sat_narrow (void)
14378{
14379 /* FIXME: Types for narrowing. If operands are signed, results can be signed
14380 or unsigned. If operands are unsigned, results must also be unsigned. */
14381 struct neon_type_el et = neon_check_type (2, NS_DQI,
14382 N_EQK | N_HLF, N_SU_16_64 | N_KEY);
14383 int imm = inst.operands[2].imm;
14384 /* This gets the bounds check, size encoding and immediate bits calculation
14385 right. */
14386 et.size /= 2;
5f4273c7 14387
5287ad62
JB
14388 /* VQ{R}SHRN.I<size> <Dd>, <Qm>, #0 is a synonym for
14389 VQMOVN.I<size> <Dd>, <Qm>. */
14390 if (imm == 0)
14391 {
14392 inst.operands[2].present = 0;
14393 inst.instruction = N_MNEM_vqmovn;
14394 do_neon_qmovn ();
14395 return;
14396 }
5f4273c7 14397
5287ad62 14398 constraint (imm < 1 || (unsigned)imm > et.size,
477330fc 14399 _("immediate out of range"));
5287ad62
JB
14400 neon_imm_shift (TRUE, et.type == NT_unsigned, 0, et, et.size - imm);
14401}
14402
14403static void
14404do_neon_rshift_sat_narrow_u (void)
14405{
14406 /* FIXME: Types for narrowing. If operands are signed, results can be signed
14407 or unsigned. If operands are unsigned, results must also be unsigned. */
14408 struct neon_type_el et = neon_check_type (2, NS_DQI,
14409 N_EQK | N_HLF | N_UNS, N_S16 | N_S32 | N_S64 | N_KEY);
14410 int imm = inst.operands[2].imm;
14411 /* This gets the bounds check, size encoding and immediate bits calculation
14412 right. */
14413 et.size /= 2;
14414
14415 /* VQSHRUN.I<size> <Dd>, <Qm>, #0 is a synonym for
14416 VQMOVUN.I<size> <Dd>, <Qm>. */
14417 if (imm == 0)
14418 {
14419 inst.operands[2].present = 0;
14420 inst.instruction = N_MNEM_vqmovun;
14421 do_neon_qmovun ();
14422 return;
14423 }
14424
14425 constraint (imm < 1 || (unsigned)imm > et.size,
477330fc 14426 _("immediate out of range"));
5287ad62
JB
14427 /* FIXME: The manual is kind of unclear about what value U should have in
14428 VQ{R}SHRUN instructions, but U=0, op=0 definitely encodes VRSHR, so it
14429 must be 1. */
14430 neon_imm_shift (TRUE, 1, 0, et, et.size - imm);
14431}
14432
14433static void
14434do_neon_movn (void)
14435{
14436 struct neon_type_el et = neon_check_type (2, NS_DQ,
14437 N_EQK | N_HLF, N_I16 | N_I32 | N_I64 | N_KEY);
88714cb8 14438 NEON_ENCODE (INTEGER, inst);
5287ad62
JB
14439 neon_two_same (0, 1, et.size / 2);
14440}
14441
14442static void
14443do_neon_rshift_narrow (void)
14444{
14445 struct neon_type_el et = neon_check_type (2, NS_DQI,
14446 N_EQK | N_HLF, N_I16 | N_I32 | N_I64 | N_KEY);
14447 int imm = inst.operands[2].imm;
14448 /* This gets the bounds check, size encoding and immediate bits calculation
14449 right. */
14450 et.size /= 2;
5f4273c7 14451
5287ad62
JB
14452 /* If immediate is zero then we are a pseudo-instruction for
14453 VMOVN.I<size> <Dd>, <Qm> */
14454 if (imm == 0)
14455 {
14456 inst.operands[2].present = 0;
14457 inst.instruction = N_MNEM_vmovn;
14458 do_neon_movn ();
14459 return;
14460 }
5f4273c7 14461
5287ad62 14462 constraint (imm < 1 || (unsigned)imm > et.size,
477330fc 14463 _("immediate out of range for narrowing operation"));
5287ad62
JB
14464 neon_imm_shift (FALSE, 0, 0, et, et.size - imm);
14465}
14466
14467static void
14468do_neon_shll (void)
14469{
14470 /* FIXME: Type checking when lengthening. */
14471 struct neon_type_el et = neon_check_type (2, NS_QDI,
14472 N_EQK | N_DBL, N_I8 | N_I16 | N_I32 | N_KEY);
14473 unsigned imm = inst.operands[2].imm;
14474
14475 if (imm == et.size)
14476 {
14477 /* Maximum shift variant. */
88714cb8 14478 NEON_ENCODE (INTEGER, inst);
5287ad62
JB
14479 inst.instruction |= LOW4 (inst.operands[0].reg) << 12;
14480 inst.instruction |= HI1 (inst.operands[0].reg) << 22;
14481 inst.instruction |= LOW4 (inst.operands[1].reg);
14482 inst.instruction |= HI1 (inst.operands[1].reg) << 5;
14483 inst.instruction |= neon_logbits (et.size) << 18;
5f4273c7 14484
88714cb8 14485 neon_dp_fixup (&inst);
5287ad62
JB
14486 }
14487 else
14488 {
14489 /* A more-specific type check for non-max versions. */
14490 et = neon_check_type (2, NS_QDI,
477330fc 14491 N_EQK | N_DBL, N_SU_32 | N_KEY);
88714cb8 14492 NEON_ENCODE (IMMED, inst);
5287ad62
JB
14493 neon_imm_shift (TRUE, et.type == NT_unsigned, 0, et, imm);
14494 }
14495}
14496
037e8744 14497/* Check the various types for the VCVT instruction, and return which version
5287ad62
JB
14498 the current instruction is. */
14499
6b9a8b67
MGD
14500#define CVT_FLAVOUR_VAR \
14501 CVT_VAR (s32_f32, N_S32, N_F32, whole_reg, "ftosls", "ftosis", "ftosizs") \
14502 CVT_VAR (u32_f32, N_U32, N_F32, whole_reg, "ftouls", "ftouis", "ftouizs") \
14503 CVT_VAR (f32_s32, N_F32, N_S32, whole_reg, "fsltos", "fsitos", NULL) \
14504 CVT_VAR (f32_u32, N_F32, N_U32, whole_reg, "fultos", "fuitos", NULL) \
14505 /* Half-precision conversions. */ \
14506 CVT_VAR (f32_f16, N_F32, N_F16, whole_reg, NULL, NULL, NULL) \
14507 CVT_VAR (f16_f32, N_F16, N_F32, whole_reg, NULL, NULL, NULL) \
14508 /* VFP instructions. */ \
14509 CVT_VAR (f32_f64, N_F32, N_F64, N_VFP, NULL, "fcvtsd", NULL) \
14510 CVT_VAR (f64_f32, N_F64, N_F32, N_VFP, NULL, "fcvtds", NULL) \
14511 CVT_VAR (s32_f64, N_S32, N_F64 | key, N_VFP, "ftosld", "ftosid", "ftosizd") \
14512 CVT_VAR (u32_f64, N_U32, N_F64 | key, N_VFP, "ftould", "ftouid", "ftouizd") \
14513 CVT_VAR (f64_s32, N_F64 | key, N_S32, N_VFP, "fsltod", "fsitod", NULL) \
14514 CVT_VAR (f64_u32, N_F64 | key, N_U32, N_VFP, "fultod", "fuitod", NULL) \
14515 /* VFP instructions with bitshift. */ \
14516 CVT_VAR (f32_s16, N_F32 | key, N_S16, N_VFP, "fshtos", NULL, NULL) \
14517 CVT_VAR (f32_u16, N_F32 | key, N_U16, N_VFP, "fuhtos", NULL, NULL) \
14518 CVT_VAR (f64_s16, N_F64 | key, N_S16, N_VFP, "fshtod", NULL, NULL) \
14519 CVT_VAR (f64_u16, N_F64 | key, N_U16, N_VFP, "fuhtod", NULL, NULL) \
14520 CVT_VAR (s16_f32, N_S16, N_F32 | key, N_VFP, "ftoshs", NULL, NULL) \
14521 CVT_VAR (u16_f32, N_U16, N_F32 | key, N_VFP, "ftouhs", NULL, NULL) \
14522 CVT_VAR (s16_f64, N_S16, N_F64 | key, N_VFP, "ftoshd", NULL, NULL) \
14523 CVT_VAR (u16_f64, N_U16, N_F64 | key, N_VFP, "ftouhd", NULL, NULL)
14524
14525#define CVT_VAR(C, X, Y, R, BSN, CN, ZN) \
14526 neon_cvt_flavour_##C,
14527
14528/* The different types of conversions we can do. */
14529enum neon_cvt_flavour
14530{
14531 CVT_FLAVOUR_VAR
14532 neon_cvt_flavour_invalid,
14533 neon_cvt_flavour_first_fp = neon_cvt_flavour_f32_f64
14534};
14535
14536#undef CVT_VAR
14537
14538static enum neon_cvt_flavour
14539get_neon_cvt_flavour (enum neon_shape rs)
5287ad62 14540{
6b9a8b67
MGD
14541#define CVT_VAR(C,X,Y,R,BSN,CN,ZN) \
14542 et = neon_check_type (2, rs, (R) | (X), (R) | (Y)); \
14543 if (et.type != NT_invtype) \
14544 { \
14545 inst.error = NULL; \
14546 return (neon_cvt_flavour_##C); \
5287ad62 14547 }
6b9a8b67 14548
5287ad62 14549 struct neon_type_el et;
037e8744 14550 unsigned whole_reg = (rs == NS_FFI || rs == NS_FD || rs == NS_DF
477330fc 14551 || rs == NS_FF) ? N_VFP : 0;
037e8744
JB
14552 /* The instruction versions which take an immediate take one register
14553 argument, which is extended to the width of the full register. Thus the
14554 "source" and "destination" registers must have the same width. Hack that
14555 here by making the size equal to the key (wider, in this case) operand. */
14556 unsigned key = (rs == NS_QQI || rs == NS_DDI || rs == NS_FFI) ? N_KEY : 0;
5f4273c7 14557
6b9a8b67
MGD
14558 CVT_FLAVOUR_VAR;
14559
14560 return neon_cvt_flavour_invalid;
5287ad62
JB
14561#undef CVT_VAR
14562}
14563
7e8e6784
MGD
14564enum neon_cvt_mode
14565{
14566 neon_cvt_mode_a,
14567 neon_cvt_mode_n,
14568 neon_cvt_mode_p,
14569 neon_cvt_mode_m,
14570 neon_cvt_mode_z,
30bdf752
MGD
14571 neon_cvt_mode_x,
14572 neon_cvt_mode_r
7e8e6784
MGD
14573};
14574
037e8744
JB
14575/* Neon-syntax VFP conversions. */
14576
5287ad62 14577static void
6b9a8b67 14578do_vfp_nsyn_cvt (enum neon_shape rs, enum neon_cvt_flavour flavour)
5287ad62 14579{
037e8744 14580 const char *opname = 0;
5f4273c7 14581
037e8744 14582 if (rs == NS_DDI || rs == NS_QQI || rs == NS_FFI)
5287ad62 14583 {
037e8744
JB
14584 /* Conversions with immediate bitshift. */
14585 const char *enc[] =
477330fc 14586 {
6b9a8b67
MGD
14587#define CVT_VAR(C,A,B,R,BSN,CN,ZN) BSN,
14588 CVT_FLAVOUR_VAR
14589 NULL
14590#undef CVT_VAR
477330fc 14591 };
037e8744 14592
6b9a8b67 14593 if (flavour < (int) ARRAY_SIZE (enc))
477330fc
RM
14594 {
14595 opname = enc[flavour];
14596 constraint (inst.operands[0].reg != inst.operands[1].reg,
14597 _("operands 0 and 1 must be the same register"));
14598 inst.operands[1] = inst.operands[2];
14599 memset (&inst.operands[2], '\0', sizeof (inst.operands[2]));
14600 }
5287ad62
JB
14601 }
14602 else
14603 {
037e8744
JB
14604 /* Conversions without bitshift. */
14605 const char *enc[] =
477330fc 14606 {
6b9a8b67
MGD
14607#define CVT_VAR(C,A,B,R,BSN,CN,ZN) CN,
14608 CVT_FLAVOUR_VAR
14609 NULL
14610#undef CVT_VAR
477330fc 14611 };
037e8744 14612
6b9a8b67 14613 if (flavour < (int) ARRAY_SIZE (enc))
477330fc 14614 opname = enc[flavour];
037e8744
JB
14615 }
14616
14617 if (opname)
14618 do_vfp_nsyn_opcode (opname);
14619}
14620
14621static void
14622do_vfp_nsyn_cvtz (void)
14623{
14624 enum neon_shape rs = neon_select_shape (NS_FF, NS_FD, NS_NULL);
6b9a8b67 14625 enum neon_cvt_flavour flavour = get_neon_cvt_flavour (rs);
037e8744
JB
14626 const char *enc[] =
14627 {
6b9a8b67
MGD
14628#define CVT_VAR(C,A,B,R,BSN,CN,ZN) ZN,
14629 CVT_FLAVOUR_VAR
14630 NULL
14631#undef CVT_VAR
037e8744
JB
14632 };
14633
6b9a8b67 14634 if (flavour < (int) ARRAY_SIZE (enc) && enc[flavour])
037e8744
JB
14635 do_vfp_nsyn_opcode (enc[flavour]);
14636}
f31fef98 14637
037e8744 14638static void
bacebabc 14639do_vfp_nsyn_cvt_fpv8 (enum neon_cvt_flavour flavour,
7e8e6784
MGD
14640 enum neon_cvt_mode mode)
14641{
14642 int sz, op;
14643 int rm;
14644
14645 set_it_insn_type (OUTSIDE_IT_INSN);
14646
14647 switch (flavour)
14648 {
14649 case neon_cvt_flavour_s32_f64:
14650 sz = 1;
14651 op = 0;
14652 break;
14653 case neon_cvt_flavour_s32_f32:
14654 sz = 0;
14655 op = 1;
14656 break;
14657 case neon_cvt_flavour_u32_f64:
14658 sz = 1;
14659 op = 0;
14660 break;
14661 case neon_cvt_flavour_u32_f32:
14662 sz = 0;
14663 op = 0;
14664 break;
14665 default:
14666 first_error (_("invalid instruction shape"));
14667 return;
14668 }
14669
14670 switch (mode)
14671 {
14672 case neon_cvt_mode_a: rm = 0; break;
14673 case neon_cvt_mode_n: rm = 1; break;
14674 case neon_cvt_mode_p: rm = 2; break;
14675 case neon_cvt_mode_m: rm = 3; break;
14676 default: first_error (_("invalid rounding mode")); return;
14677 }
14678
14679 NEON_ENCODE (FPV8, inst);
14680 encode_arm_vfp_reg (inst.operands[0].reg, VFP_REG_Sd);
14681 encode_arm_vfp_reg (inst.operands[1].reg, sz == 1 ? VFP_REG_Dm : VFP_REG_Sm);
14682 inst.instruction |= sz << 8;
14683 inst.instruction |= op << 7;
14684 inst.instruction |= rm << 16;
14685 inst.instruction |= 0xf0000000;
14686 inst.is_neon = TRUE;
14687}
14688
14689static void
14690do_neon_cvt_1 (enum neon_cvt_mode mode)
037e8744
JB
14691{
14692 enum neon_shape rs = neon_select_shape (NS_DDI, NS_QQI, NS_FFI, NS_DD, NS_QQ,
8e79c3df 14693 NS_FD, NS_DF, NS_FF, NS_QD, NS_DQ, NS_NULL);
6b9a8b67 14694 enum neon_cvt_flavour flavour = get_neon_cvt_flavour (rs);
037e8744 14695
e3e535bc 14696 /* PR11109: Handle round-to-zero for VCVT conversions. */
7e8e6784 14697 if (mode == neon_cvt_mode_z
e3e535bc 14698 && ARM_CPU_HAS_FEATURE (cpu_variant, fpu_arch_vfp_v2)
bacebabc
RM
14699 && (flavour == neon_cvt_flavour_s32_f32
14700 || flavour == neon_cvt_flavour_u32_f32
14701 || flavour == neon_cvt_flavour_s32_f64
6b9a8b67 14702 || flavour == neon_cvt_flavour_u32_f64)
e3e535bc
NC
14703 && (rs == NS_FD || rs == NS_FF))
14704 {
14705 do_vfp_nsyn_cvtz ();
14706 return;
14707 }
14708
037e8744 14709 /* VFP rather than Neon conversions. */
6b9a8b67 14710 if (flavour >= neon_cvt_flavour_first_fp)
037e8744 14711 {
7e8e6784
MGD
14712 if (mode == neon_cvt_mode_x || mode == neon_cvt_mode_z)
14713 do_vfp_nsyn_cvt (rs, flavour);
14714 else
14715 do_vfp_nsyn_cvt_fpv8 (flavour, mode);
14716
037e8744
JB
14717 return;
14718 }
14719
14720 switch (rs)
14721 {
14722 case NS_DDI:
14723 case NS_QQI:
14724 {
477330fc
RM
14725 unsigned immbits;
14726 unsigned enctab[] = { 0x0000100, 0x1000100, 0x0, 0x1000000 };
35997600 14727
477330fc
RM
14728 if (vfp_or_neon_is_neon (NEON_CHECK_CC | NEON_CHECK_ARCH) == FAIL)
14729 return;
037e8744 14730
477330fc
RM
14731 /* Fixed-point conversion with #0 immediate is encoded as an
14732 integer conversion. */
14733 if (inst.operands[2].present && inst.operands[2].imm == 0)
14734 goto int_encode;
35997600 14735 immbits = 32 - inst.operands[2].imm;
477330fc
RM
14736 NEON_ENCODE (IMMED, inst);
14737 if (flavour != neon_cvt_flavour_invalid)
14738 inst.instruction |= enctab[flavour];
14739 inst.instruction |= LOW4 (inst.operands[0].reg) << 12;
14740 inst.instruction |= HI1 (inst.operands[0].reg) << 22;
14741 inst.instruction |= LOW4 (inst.operands[1].reg);
14742 inst.instruction |= HI1 (inst.operands[1].reg) << 5;
14743 inst.instruction |= neon_quad (rs) << 6;
14744 inst.instruction |= 1 << 21;
14745 inst.instruction |= immbits << 16;
14746
14747 neon_dp_fixup (&inst);
037e8744
JB
14748 }
14749 break;
14750
14751 case NS_DD:
14752 case NS_QQ:
7e8e6784
MGD
14753 if (mode != neon_cvt_mode_x && mode != neon_cvt_mode_z)
14754 {
14755 NEON_ENCODE (FLOAT, inst);
14756 set_it_insn_type (OUTSIDE_IT_INSN);
14757
14758 if (vfp_or_neon_is_neon (NEON_CHECK_CC | NEON_CHECK_ARCH8) == FAIL)
14759 return;
14760
14761 inst.instruction |= LOW4 (inst.operands[0].reg) << 12;
14762 inst.instruction |= HI1 (inst.operands[0].reg) << 22;
14763 inst.instruction |= LOW4 (inst.operands[1].reg);
14764 inst.instruction |= HI1 (inst.operands[1].reg) << 5;
14765 inst.instruction |= neon_quad (rs) << 6;
14766 inst.instruction |= (flavour == neon_cvt_flavour_u32_f32) << 7;
14767 inst.instruction |= mode << 8;
14768 if (thumb_mode)
14769 inst.instruction |= 0xfc000000;
14770 else
14771 inst.instruction |= 0xf0000000;
14772 }
14773 else
14774 {
037e8744 14775 int_encode:
7e8e6784
MGD
14776 {
14777 unsigned enctab[] = { 0x100, 0x180, 0x0, 0x080 };
037e8744 14778
7e8e6784 14779 NEON_ENCODE (INTEGER, inst);
037e8744 14780
7e8e6784
MGD
14781 if (vfp_or_neon_is_neon (NEON_CHECK_CC | NEON_CHECK_ARCH) == FAIL)
14782 return;
037e8744 14783
7e8e6784
MGD
14784 if (flavour != neon_cvt_flavour_invalid)
14785 inst.instruction |= enctab[flavour];
037e8744 14786
7e8e6784
MGD
14787 inst.instruction |= LOW4 (inst.operands[0].reg) << 12;
14788 inst.instruction |= HI1 (inst.operands[0].reg) << 22;
14789 inst.instruction |= LOW4 (inst.operands[1].reg);
14790 inst.instruction |= HI1 (inst.operands[1].reg) << 5;
14791 inst.instruction |= neon_quad (rs) << 6;
14792 inst.instruction |= 2 << 18;
037e8744 14793
7e8e6784
MGD
14794 neon_dp_fixup (&inst);
14795 }
14796 }
14797 break;
037e8744 14798
8e79c3df
CM
14799 /* Half-precision conversions for Advanced SIMD -- neon. */
14800 case NS_QD:
14801 case NS_DQ:
14802
14803 if ((rs == NS_DQ)
14804 && (inst.vectype.el[0].size != 16 || inst.vectype.el[1].size != 32))
14805 {
14806 as_bad (_("operand size must match register width"));
14807 break;
14808 }
14809
14810 if ((rs == NS_QD)
14811 && ((inst.vectype.el[0].size != 32 || inst.vectype.el[1].size != 16)))
14812 {
14813 as_bad (_("operand size must match register width"));
14814 break;
14815 }
14816
14817 if (rs == NS_DQ)
477330fc 14818 inst.instruction = 0x3b60600;
8e79c3df
CM
14819 else
14820 inst.instruction = 0x3b60700;
14821
14822 inst.instruction |= LOW4 (inst.operands[0].reg) << 12;
14823 inst.instruction |= HI1 (inst.operands[0].reg) << 22;
14824 inst.instruction |= LOW4 (inst.operands[1].reg);
14825 inst.instruction |= HI1 (inst.operands[1].reg) << 5;
88714cb8 14826 neon_dp_fixup (&inst);
8e79c3df
CM
14827 break;
14828
037e8744
JB
14829 default:
14830 /* Some VFP conversions go here (s32 <-> f32, u32 <-> f32). */
7e8e6784
MGD
14831 if (mode == neon_cvt_mode_x || mode == neon_cvt_mode_z)
14832 do_vfp_nsyn_cvt (rs, flavour);
14833 else
14834 do_vfp_nsyn_cvt_fpv8 (flavour, mode);
5287ad62 14835 }
5287ad62
JB
14836}
14837
e3e535bc
NC
14838static void
14839do_neon_cvtr (void)
14840{
7e8e6784 14841 do_neon_cvt_1 (neon_cvt_mode_x);
e3e535bc
NC
14842}
14843
14844static void
14845do_neon_cvt (void)
14846{
7e8e6784
MGD
14847 do_neon_cvt_1 (neon_cvt_mode_z);
14848}
14849
14850static void
14851do_neon_cvta (void)
14852{
14853 do_neon_cvt_1 (neon_cvt_mode_a);
14854}
14855
14856static void
14857do_neon_cvtn (void)
14858{
14859 do_neon_cvt_1 (neon_cvt_mode_n);
14860}
14861
14862static void
14863do_neon_cvtp (void)
14864{
14865 do_neon_cvt_1 (neon_cvt_mode_p);
14866}
14867
14868static void
14869do_neon_cvtm (void)
14870{
14871 do_neon_cvt_1 (neon_cvt_mode_m);
e3e535bc
NC
14872}
14873
8e79c3df 14874static void
c70a8987 14875do_neon_cvttb_2 (bfd_boolean t, bfd_boolean to, bfd_boolean is_double)
8e79c3df 14876{
c70a8987
MGD
14877 if (is_double)
14878 mark_feature_used (&fpu_vfp_ext_armv8);
8e79c3df 14879
c70a8987
MGD
14880 encode_arm_vfp_reg (inst.operands[0].reg,
14881 (is_double && !to) ? VFP_REG_Dd : VFP_REG_Sd);
14882 encode_arm_vfp_reg (inst.operands[1].reg,
14883 (is_double && to) ? VFP_REG_Dm : VFP_REG_Sm);
14884 inst.instruction |= to ? 0x10000 : 0;
14885 inst.instruction |= t ? 0x80 : 0;
14886 inst.instruction |= is_double ? 0x100 : 0;
14887 do_vfp_cond_or_thumb ();
14888}
8e79c3df 14889
c70a8987
MGD
14890static void
14891do_neon_cvttb_1 (bfd_boolean t)
14892{
14893 enum neon_shape rs = neon_select_shape (NS_FF, NS_FD, NS_DF, NS_NULL);
8e79c3df 14894
c70a8987
MGD
14895 if (rs == NS_NULL)
14896 return;
14897 else if (neon_check_type (2, rs, N_F16, N_F32 | N_VFP).type != NT_invtype)
14898 {
14899 inst.error = NULL;
14900 do_neon_cvttb_2 (t, /*to=*/TRUE, /*is_double=*/FALSE);
14901 }
14902 else if (neon_check_type (2, rs, N_F32 | N_VFP, N_F16).type != NT_invtype)
14903 {
14904 inst.error = NULL;
14905 do_neon_cvttb_2 (t, /*to=*/FALSE, /*is_double=*/FALSE);
14906 }
14907 else if (neon_check_type (2, rs, N_F16, N_F64 | N_VFP).type != NT_invtype)
14908 {
14909 inst.error = NULL;
14910 do_neon_cvttb_2 (t, /*to=*/TRUE, /*is_double=*/TRUE);
14911 }
14912 else if (neon_check_type (2, rs, N_F64 | N_VFP, N_F16).type != NT_invtype)
14913 {
14914 inst.error = NULL;
14915 do_neon_cvttb_2 (t, /*to=*/FALSE, /*is_double=*/TRUE);
14916 }
14917 else
14918 return;
14919}
14920
14921static void
14922do_neon_cvtb (void)
14923{
14924 do_neon_cvttb_1 (FALSE);
8e79c3df
CM
14925}
14926
14927
14928static void
14929do_neon_cvtt (void)
14930{
c70a8987 14931 do_neon_cvttb_1 (TRUE);
8e79c3df
CM
14932}
14933
5287ad62
JB
14934static void
14935neon_move_immediate (void)
14936{
037e8744
JB
14937 enum neon_shape rs = neon_select_shape (NS_DI, NS_QI, NS_NULL);
14938 struct neon_type_el et = neon_check_type (2, rs,
14939 N_I8 | N_I16 | N_I32 | N_I64 | N_F32 | N_KEY, N_EQK);
5287ad62 14940 unsigned immlo, immhi = 0, immbits;
c96612cc 14941 int op, cmode, float_p;
5287ad62 14942
037e8744 14943 constraint (et.type == NT_invtype,
477330fc 14944 _("operand size must be specified for immediate VMOV"));
037e8744 14945
5287ad62
JB
14946 /* We start out as an MVN instruction if OP = 1, MOV otherwise. */
14947 op = (inst.instruction & (1 << 5)) != 0;
14948
14949 immlo = inst.operands[1].imm;
14950 if (inst.operands[1].regisimm)
14951 immhi = inst.operands[1].reg;
14952
14953 constraint (et.size < 32 && (immlo & ~((1 << et.size) - 1)) != 0,
477330fc 14954 _("immediate has bits set outside the operand size"));
5287ad62 14955
c96612cc
JB
14956 float_p = inst.operands[1].immisfloat;
14957
14958 if ((cmode = neon_cmode_for_move_imm (immlo, immhi, float_p, &immbits, &op,
477330fc 14959 et.size, et.type)) == FAIL)
5287ad62
JB
14960 {
14961 /* Invert relevant bits only. */
14962 neon_invert_size (&immlo, &immhi, et.size);
14963 /* Flip from VMOV/VMVN to VMVN/VMOV. Some immediate types are unavailable
477330fc
RM
14964 with one or the other; those cases are caught by
14965 neon_cmode_for_move_imm. */
5287ad62 14966 op = !op;
c96612cc
JB
14967 if ((cmode = neon_cmode_for_move_imm (immlo, immhi, float_p, &immbits,
14968 &op, et.size, et.type)) == FAIL)
477330fc
RM
14969 {
14970 first_error (_("immediate out of range"));
14971 return;
14972 }
5287ad62
JB
14973 }
14974
14975 inst.instruction &= ~(1 << 5);
14976 inst.instruction |= op << 5;
14977
14978 inst.instruction |= LOW4 (inst.operands[0].reg) << 12;
14979 inst.instruction |= HI1 (inst.operands[0].reg) << 22;
037e8744 14980 inst.instruction |= neon_quad (rs) << 6;
5287ad62
JB
14981 inst.instruction |= cmode << 8;
14982
14983 neon_write_immbits (immbits);
14984}
14985
14986static void
14987do_neon_mvn (void)
14988{
14989 if (inst.operands[1].isreg)
14990 {
037e8744 14991 enum neon_shape rs = neon_select_shape (NS_DD, NS_QQ, NS_NULL);
5f4273c7 14992
88714cb8 14993 NEON_ENCODE (INTEGER, inst);
5287ad62
JB
14994 inst.instruction |= LOW4 (inst.operands[0].reg) << 12;
14995 inst.instruction |= HI1 (inst.operands[0].reg) << 22;
14996 inst.instruction |= LOW4 (inst.operands[1].reg);
14997 inst.instruction |= HI1 (inst.operands[1].reg) << 5;
037e8744 14998 inst.instruction |= neon_quad (rs) << 6;
5287ad62
JB
14999 }
15000 else
15001 {
88714cb8 15002 NEON_ENCODE (IMMED, inst);
5287ad62
JB
15003 neon_move_immediate ();
15004 }
15005
88714cb8 15006 neon_dp_fixup (&inst);
5287ad62
JB
15007}
15008
15009/* Encode instructions of form:
15010
15011 |28/24|23|22|21 20|19 16|15 12|11 8|7|6|5|4|3 0|
5f4273c7 15012 | U |x |D |size | Rn | Rd |x x x x|N|x|M|x| Rm | */
5287ad62
JB
15013
15014static void
15015neon_mixed_length (struct neon_type_el et, unsigned size)
15016{
15017 inst.instruction |= LOW4 (inst.operands[0].reg) << 12;
15018 inst.instruction |= HI1 (inst.operands[0].reg) << 22;
15019 inst.instruction |= LOW4 (inst.operands[1].reg) << 16;
15020 inst.instruction |= HI1 (inst.operands[1].reg) << 7;
15021 inst.instruction |= LOW4 (inst.operands[2].reg);
15022 inst.instruction |= HI1 (inst.operands[2].reg) << 5;
15023 inst.instruction |= (et.type == NT_unsigned) << 24;
15024 inst.instruction |= neon_logbits (size) << 20;
5f4273c7 15025
88714cb8 15026 neon_dp_fixup (&inst);
5287ad62
JB
15027}
15028
15029static void
15030do_neon_dyadic_long (void)
15031{
15032 /* FIXME: Type checking for lengthening op. */
15033 struct neon_type_el et = neon_check_type (3, NS_QDD,
15034 N_EQK | N_DBL, N_EQK, N_SU_32 | N_KEY);
15035 neon_mixed_length (et, et.size);
15036}
15037
15038static void
15039do_neon_abal (void)
15040{
15041 struct neon_type_el et = neon_check_type (3, NS_QDD,
15042 N_EQK | N_INT | N_DBL, N_EQK, N_SU_32 | N_KEY);
15043 neon_mixed_length (et, et.size);
15044}
15045
15046static void
15047neon_mac_reg_scalar_long (unsigned regtypes, unsigned scalartypes)
15048{
15049 if (inst.operands[2].isscalar)
15050 {
dcbf9037 15051 struct neon_type_el et = neon_check_type (3, NS_QDS,
477330fc 15052 N_EQK | N_DBL, N_EQK, regtypes | N_KEY);
88714cb8 15053 NEON_ENCODE (SCALAR, inst);
5287ad62
JB
15054 neon_mul_mac (et, et.type == NT_unsigned);
15055 }
15056 else
15057 {
15058 struct neon_type_el et = neon_check_type (3, NS_QDD,
477330fc 15059 N_EQK | N_DBL, N_EQK, scalartypes | N_KEY);
88714cb8 15060 NEON_ENCODE (INTEGER, inst);
5287ad62
JB
15061 neon_mixed_length (et, et.size);
15062 }
15063}
15064
15065static void
15066do_neon_mac_maybe_scalar_long (void)
15067{
15068 neon_mac_reg_scalar_long (N_S16 | N_S32 | N_U16 | N_U32, N_SU_32);
15069}
15070
15071static void
15072do_neon_dyadic_wide (void)
15073{
15074 struct neon_type_el et = neon_check_type (3, NS_QQD,
15075 N_EQK | N_DBL, N_EQK | N_DBL, N_SU_32 | N_KEY);
15076 neon_mixed_length (et, et.size);
15077}
15078
15079static void
15080do_neon_dyadic_narrow (void)
15081{
15082 struct neon_type_el et = neon_check_type (3, NS_QDD,
15083 N_EQK | N_DBL, N_EQK, N_I16 | N_I32 | N_I64 | N_KEY);
428e3f1f
PB
15084 /* Operand sign is unimportant, and the U bit is part of the opcode,
15085 so force the operand type to integer. */
15086 et.type = NT_integer;
5287ad62
JB
15087 neon_mixed_length (et, et.size / 2);
15088}
15089
15090static void
15091do_neon_mul_sat_scalar_long (void)
15092{
15093 neon_mac_reg_scalar_long (N_S16 | N_S32, N_S16 | N_S32);
15094}
15095
15096static void
15097do_neon_vmull (void)
15098{
15099 if (inst.operands[2].isscalar)
15100 do_neon_mac_maybe_scalar_long ();
15101 else
15102 {
15103 struct neon_type_el et = neon_check_type (3, NS_QDD,
477330fc 15104 N_EQK | N_DBL, N_EQK, N_SU_32 | N_P8 | N_P64 | N_KEY);
4f51b4bd 15105
5287ad62 15106 if (et.type == NT_poly)
477330fc 15107 NEON_ENCODE (POLY, inst);
5287ad62 15108 else
477330fc 15109 NEON_ENCODE (INTEGER, inst);
4f51b4bd
MGD
15110
15111 /* For polynomial encoding the U bit must be zero, and the size must
15112 be 8 (encoded as 0b00) or, on ARMv8 or later 64 (encoded, non
15113 obviously, as 0b10). */
15114 if (et.size == 64)
15115 {
15116 /* Check we're on the correct architecture. */
15117 if (!mark_feature_used (&fpu_crypto_ext_armv8))
15118 inst.error =
15119 _("Instruction form not available on this architecture.");
15120
15121 et.size = 32;
15122 }
15123
5287ad62
JB
15124 neon_mixed_length (et, et.size);
15125 }
15126}
15127
15128static void
15129do_neon_ext (void)
15130{
037e8744 15131 enum neon_shape rs = neon_select_shape (NS_DDDI, NS_QQQI, NS_NULL);
5287ad62
JB
15132 struct neon_type_el et = neon_check_type (3, rs,
15133 N_EQK, N_EQK, N_8 | N_16 | N_32 | N_64 | N_KEY);
15134 unsigned imm = (inst.operands[3].imm * et.size) / 8;
35997600
NC
15135
15136 constraint (imm >= (unsigned) (neon_quad (rs) ? 16 : 8),
15137 _("shift out of range"));
5287ad62
JB
15138 inst.instruction |= LOW4 (inst.operands[0].reg) << 12;
15139 inst.instruction |= HI1 (inst.operands[0].reg) << 22;
15140 inst.instruction |= LOW4 (inst.operands[1].reg) << 16;
15141 inst.instruction |= HI1 (inst.operands[1].reg) << 7;
15142 inst.instruction |= LOW4 (inst.operands[2].reg);
15143 inst.instruction |= HI1 (inst.operands[2].reg) << 5;
037e8744 15144 inst.instruction |= neon_quad (rs) << 6;
5287ad62 15145 inst.instruction |= imm << 8;
5f4273c7 15146
88714cb8 15147 neon_dp_fixup (&inst);
5287ad62
JB
15148}
15149
15150static void
15151do_neon_rev (void)
15152{
037e8744 15153 enum neon_shape rs = neon_select_shape (NS_DD, NS_QQ, NS_NULL);
5287ad62
JB
15154 struct neon_type_el et = neon_check_type (2, rs,
15155 N_EQK, N_8 | N_16 | N_32 | N_KEY);
15156 unsigned op = (inst.instruction >> 7) & 3;
15157 /* N (width of reversed regions) is encoded as part of the bitmask. We
15158 extract it here to check the elements to be reversed are smaller.
15159 Otherwise we'd get a reserved instruction. */
15160 unsigned elsize = (op == 2) ? 16 : (op == 1) ? 32 : (op == 0) ? 64 : 0;
9c2799c2 15161 gas_assert (elsize != 0);
5287ad62 15162 constraint (et.size >= elsize,
477330fc 15163 _("elements must be smaller than reversal region"));
037e8744 15164 neon_two_same (neon_quad (rs), 1, et.size);
5287ad62
JB
15165}
15166
15167static void
15168do_neon_dup (void)
15169{
15170 if (inst.operands[1].isscalar)
15171 {
037e8744 15172 enum neon_shape rs = neon_select_shape (NS_DS, NS_QS, NS_NULL);
dcbf9037 15173 struct neon_type_el et = neon_check_type (2, rs,
477330fc 15174 N_EQK, N_8 | N_16 | N_32 | N_KEY);
5287ad62 15175 unsigned sizebits = et.size >> 3;
dcbf9037 15176 unsigned dm = NEON_SCALAR_REG (inst.operands[1].reg);
5287ad62 15177 int logsize = neon_logbits (et.size);
dcbf9037 15178 unsigned x = NEON_SCALAR_INDEX (inst.operands[1].reg) << logsize;
037e8744
JB
15179
15180 if (vfp_or_neon_is_neon (NEON_CHECK_CC) == FAIL)
477330fc 15181 return;
037e8744 15182
88714cb8 15183 NEON_ENCODE (SCALAR, inst);
5287ad62
JB
15184 inst.instruction |= LOW4 (inst.operands[0].reg) << 12;
15185 inst.instruction |= HI1 (inst.operands[0].reg) << 22;
15186 inst.instruction |= LOW4 (dm);
15187 inst.instruction |= HI1 (dm) << 5;
037e8744 15188 inst.instruction |= neon_quad (rs) << 6;
5287ad62
JB
15189 inst.instruction |= x << 17;
15190 inst.instruction |= sizebits << 16;
5f4273c7 15191
88714cb8 15192 neon_dp_fixup (&inst);
5287ad62
JB
15193 }
15194 else
15195 {
037e8744
JB
15196 enum neon_shape rs = neon_select_shape (NS_DR, NS_QR, NS_NULL);
15197 struct neon_type_el et = neon_check_type (2, rs,
477330fc 15198 N_8 | N_16 | N_32 | N_KEY, N_EQK);
5287ad62 15199 /* Duplicate ARM register to lanes of vector. */
88714cb8 15200 NEON_ENCODE (ARMREG, inst);
5287ad62 15201 switch (et.size)
477330fc
RM
15202 {
15203 case 8: inst.instruction |= 0x400000; break;
15204 case 16: inst.instruction |= 0x000020; break;
15205 case 32: inst.instruction |= 0x000000; break;
15206 default: break;
15207 }
5287ad62
JB
15208 inst.instruction |= LOW4 (inst.operands[1].reg) << 12;
15209 inst.instruction |= LOW4 (inst.operands[0].reg) << 16;
15210 inst.instruction |= HI1 (inst.operands[0].reg) << 7;
037e8744 15211 inst.instruction |= neon_quad (rs) << 21;
5287ad62 15212 /* The encoding for this instruction is identical for the ARM and Thumb
477330fc 15213 variants, except for the condition field. */
037e8744 15214 do_vfp_cond_or_thumb ();
5287ad62
JB
15215 }
15216}
15217
15218/* VMOV has particularly many variations. It can be one of:
15219 0. VMOV<c><q> <Qd>, <Qm>
15220 1. VMOV<c><q> <Dd>, <Dm>
15221 (Register operations, which are VORR with Rm = Rn.)
15222 2. VMOV<c><q>.<dt> <Qd>, #<imm>
15223 3. VMOV<c><q>.<dt> <Dd>, #<imm>
15224 (Immediate loads.)
15225 4. VMOV<c><q>.<size> <Dn[x]>, <Rd>
15226 (ARM register to scalar.)
15227 5. VMOV<c><q> <Dm>, <Rd>, <Rn>
15228 (Two ARM registers to vector.)
15229 6. VMOV<c><q>.<dt> <Rd>, <Dn[x]>
15230 (Scalar to ARM register.)
15231 7. VMOV<c><q> <Rd>, <Rn>, <Dm>
15232 (Vector to two ARM registers.)
037e8744
JB
15233 8. VMOV.F32 <Sd>, <Sm>
15234 9. VMOV.F64 <Dd>, <Dm>
15235 (VFP register moves.)
15236 10. VMOV.F32 <Sd>, #imm
15237 11. VMOV.F64 <Dd>, #imm
15238 (VFP float immediate load.)
15239 12. VMOV <Rd>, <Sm>
15240 (VFP single to ARM reg.)
15241 13. VMOV <Sd>, <Rm>
15242 (ARM reg to VFP single.)
15243 14. VMOV <Rd>, <Re>, <Sn>, <Sm>
15244 (Two ARM regs to two VFP singles.)
15245 15. VMOV <Sd>, <Se>, <Rn>, <Rm>
15246 (Two VFP singles to two ARM regs.)
5f4273c7 15247
037e8744
JB
15248 These cases can be disambiguated using neon_select_shape, except cases 1/9
15249 and 3/11 which depend on the operand type too.
5f4273c7 15250
5287ad62 15251 All the encoded bits are hardcoded by this function.
5f4273c7 15252
b7fc2769
JB
15253 Cases 4, 6 may be used with VFPv1 and above (only 32-bit transfers!).
15254 Cases 5, 7 may be used with VFPv2 and above.
5f4273c7 15255
5287ad62 15256 FIXME: Some of the checking may be a bit sloppy (in a couple of cases you
5f4273c7 15257 can specify a type where it doesn't make sense to, and is ignored). */
5287ad62
JB
15258
15259static void
15260do_neon_mov (void)
15261{
037e8744
JB
15262 enum neon_shape rs = neon_select_shape (NS_RRFF, NS_FFRR, NS_DRR, NS_RRD,
15263 NS_QQ, NS_DD, NS_QI, NS_DI, NS_SR, NS_RS, NS_FF, NS_FI, NS_RF, NS_FR,
15264 NS_NULL);
15265 struct neon_type_el et;
15266 const char *ldconst = 0;
5287ad62 15267
037e8744 15268 switch (rs)
5287ad62 15269 {
037e8744
JB
15270 case NS_DD: /* case 1/9. */
15271 et = neon_check_type (2, rs, N_EQK, N_F64 | N_KEY);
15272 /* It is not an error here if no type is given. */
15273 inst.error = NULL;
15274 if (et.type == NT_float && et.size == 64)
477330fc
RM
15275 {
15276 do_vfp_nsyn_opcode ("fcpyd");
15277 break;
15278 }
037e8744 15279 /* fall through. */
5287ad62 15280
037e8744
JB
15281 case NS_QQ: /* case 0/1. */
15282 {
477330fc
RM
15283 if (vfp_or_neon_is_neon (NEON_CHECK_CC | NEON_CHECK_ARCH) == FAIL)
15284 return;
15285 /* The architecture manual I have doesn't explicitly state which
15286 value the U bit should have for register->register moves, but
15287 the equivalent VORR instruction has U = 0, so do that. */
15288 inst.instruction = 0x0200110;
15289 inst.instruction |= LOW4 (inst.operands[0].reg) << 12;
15290 inst.instruction |= HI1 (inst.operands[0].reg) << 22;
15291 inst.instruction |= LOW4 (inst.operands[1].reg);
15292 inst.instruction |= HI1 (inst.operands[1].reg) << 5;
15293 inst.instruction |= LOW4 (inst.operands[1].reg) << 16;
15294 inst.instruction |= HI1 (inst.operands[1].reg) << 7;
15295 inst.instruction |= neon_quad (rs) << 6;
15296
15297 neon_dp_fixup (&inst);
037e8744
JB
15298 }
15299 break;
5f4273c7 15300
037e8744
JB
15301 case NS_DI: /* case 3/11. */
15302 et = neon_check_type (2, rs, N_EQK, N_F64 | N_KEY);
15303 inst.error = NULL;
15304 if (et.type == NT_float && et.size == 64)
477330fc
RM
15305 {
15306 /* case 11 (fconstd). */
15307 ldconst = "fconstd";
15308 goto encode_fconstd;
15309 }
037e8744
JB
15310 /* fall through. */
15311
15312 case NS_QI: /* case 2/3. */
15313 if (vfp_or_neon_is_neon (NEON_CHECK_CC | NEON_CHECK_ARCH) == FAIL)
477330fc 15314 return;
037e8744
JB
15315 inst.instruction = 0x0800010;
15316 neon_move_immediate ();
88714cb8 15317 neon_dp_fixup (&inst);
5287ad62 15318 break;
5f4273c7 15319
037e8744
JB
15320 case NS_SR: /* case 4. */
15321 {
477330fc
RM
15322 unsigned bcdebits = 0;
15323 int logsize;
15324 unsigned dn = NEON_SCALAR_REG (inst.operands[0].reg);
15325 unsigned x = NEON_SCALAR_INDEX (inst.operands[0].reg);
037e8744 15326
05ac0ffb
JB
15327 /* .<size> is optional here, defaulting to .32. */
15328 if (inst.vectype.elems == 0
15329 && inst.operands[0].vectype.type == NT_invtype
15330 && inst.operands[1].vectype.type == NT_invtype)
15331 {
15332 inst.vectype.el[0].type = NT_untyped;
15333 inst.vectype.el[0].size = 32;
15334 inst.vectype.elems = 1;
15335 }
15336
477330fc
RM
15337 et = neon_check_type (2, NS_NULL, N_8 | N_16 | N_32 | N_KEY, N_EQK);
15338 logsize = neon_logbits (et.size);
15339
15340 constraint (!ARM_CPU_HAS_FEATURE (cpu_variant, fpu_vfp_ext_v1),
15341 _(BAD_FPU));
15342 constraint (!ARM_CPU_HAS_FEATURE (cpu_variant, fpu_neon_ext_v1)
15343 && et.size != 32, _(BAD_FPU));
15344 constraint (et.type == NT_invtype, _("bad type for scalar"));
15345 constraint (x >= 64 / et.size, _("scalar index out of range"));
15346
15347 switch (et.size)
15348 {
15349 case 8: bcdebits = 0x8; break;
15350 case 16: bcdebits = 0x1; break;
15351 case 32: bcdebits = 0x0; break;
15352 default: ;
15353 }
15354
15355 bcdebits |= x << logsize;
15356
15357 inst.instruction = 0xe000b10;
15358 do_vfp_cond_or_thumb ();
15359 inst.instruction |= LOW4 (dn) << 16;
15360 inst.instruction |= HI1 (dn) << 7;
15361 inst.instruction |= inst.operands[1].reg << 12;
15362 inst.instruction |= (bcdebits & 3) << 5;
15363 inst.instruction |= (bcdebits >> 2) << 21;
037e8744
JB
15364 }
15365 break;
5f4273c7 15366
037e8744 15367 case NS_DRR: /* case 5 (fmdrr). */
b7fc2769 15368 constraint (!ARM_CPU_HAS_FEATURE (cpu_variant, fpu_vfp_ext_v2),
477330fc 15369 _(BAD_FPU));
b7fc2769 15370
037e8744
JB
15371 inst.instruction = 0xc400b10;
15372 do_vfp_cond_or_thumb ();
15373 inst.instruction |= LOW4 (inst.operands[0].reg);
15374 inst.instruction |= HI1 (inst.operands[0].reg) << 5;
15375 inst.instruction |= inst.operands[1].reg << 12;
15376 inst.instruction |= inst.operands[2].reg << 16;
15377 break;
5f4273c7 15378
037e8744
JB
15379 case NS_RS: /* case 6. */
15380 {
477330fc
RM
15381 unsigned logsize;
15382 unsigned dn = NEON_SCALAR_REG (inst.operands[1].reg);
15383 unsigned x = NEON_SCALAR_INDEX (inst.operands[1].reg);
15384 unsigned abcdebits = 0;
037e8744 15385
05ac0ffb
JB
15386 /* .<dt> is optional here, defaulting to .32. */
15387 if (inst.vectype.elems == 0
15388 && inst.operands[0].vectype.type == NT_invtype
15389 && inst.operands[1].vectype.type == NT_invtype)
15390 {
15391 inst.vectype.el[0].type = NT_untyped;
15392 inst.vectype.el[0].size = 32;
15393 inst.vectype.elems = 1;
15394 }
15395
91d6fa6a
NC
15396 et = neon_check_type (2, NS_NULL,
15397 N_EQK, N_S8 | N_S16 | N_U8 | N_U16 | N_32 | N_KEY);
477330fc
RM
15398 logsize = neon_logbits (et.size);
15399
15400 constraint (!ARM_CPU_HAS_FEATURE (cpu_variant, fpu_vfp_ext_v1),
15401 _(BAD_FPU));
15402 constraint (!ARM_CPU_HAS_FEATURE (cpu_variant, fpu_neon_ext_v1)
15403 && et.size != 32, _(BAD_FPU));
15404 constraint (et.type == NT_invtype, _("bad type for scalar"));
15405 constraint (x >= 64 / et.size, _("scalar index out of range"));
15406
15407 switch (et.size)
15408 {
15409 case 8: abcdebits = (et.type == NT_signed) ? 0x08 : 0x18; break;
15410 case 16: abcdebits = (et.type == NT_signed) ? 0x01 : 0x11; break;
15411 case 32: abcdebits = 0x00; break;
15412 default: ;
15413 }
15414
15415 abcdebits |= x << logsize;
15416 inst.instruction = 0xe100b10;
15417 do_vfp_cond_or_thumb ();
15418 inst.instruction |= LOW4 (dn) << 16;
15419 inst.instruction |= HI1 (dn) << 7;
15420 inst.instruction |= inst.operands[0].reg << 12;
15421 inst.instruction |= (abcdebits & 3) << 5;
15422 inst.instruction |= (abcdebits >> 2) << 21;
037e8744
JB
15423 }
15424 break;
5f4273c7 15425
037e8744
JB
15426 case NS_RRD: /* case 7 (fmrrd). */
15427 constraint (!ARM_CPU_HAS_FEATURE (cpu_variant, fpu_vfp_ext_v2),
477330fc 15428 _(BAD_FPU));
037e8744
JB
15429
15430 inst.instruction = 0xc500b10;
15431 do_vfp_cond_or_thumb ();
15432 inst.instruction |= inst.operands[0].reg << 12;
15433 inst.instruction |= inst.operands[1].reg << 16;
15434 inst.instruction |= LOW4 (inst.operands[2].reg);
15435 inst.instruction |= HI1 (inst.operands[2].reg) << 5;
15436 break;
5f4273c7 15437
037e8744
JB
15438 case NS_FF: /* case 8 (fcpys). */
15439 do_vfp_nsyn_opcode ("fcpys");
15440 break;
5f4273c7 15441
037e8744
JB
15442 case NS_FI: /* case 10 (fconsts). */
15443 ldconst = "fconsts";
15444 encode_fconstd:
15445 if (is_quarter_float (inst.operands[1].imm))
477330fc
RM
15446 {
15447 inst.operands[1].imm = neon_qfloat_bits (inst.operands[1].imm);
15448 do_vfp_nsyn_opcode (ldconst);
15449 }
5287ad62 15450 else
477330fc 15451 first_error (_("immediate out of range"));
037e8744 15452 break;
5f4273c7 15453
037e8744
JB
15454 case NS_RF: /* case 12 (fmrs). */
15455 do_vfp_nsyn_opcode ("fmrs");
15456 break;
5f4273c7 15457
037e8744
JB
15458 case NS_FR: /* case 13 (fmsr). */
15459 do_vfp_nsyn_opcode ("fmsr");
15460 break;
5f4273c7 15461
037e8744
JB
15462 /* The encoders for the fmrrs and fmsrr instructions expect three operands
15463 (one of which is a list), but we have parsed four. Do some fiddling to
15464 make the operands what do_vfp_reg2_from_sp2 and do_vfp_sp2_from_reg2
15465 expect. */
15466 case NS_RRFF: /* case 14 (fmrrs). */
15467 constraint (inst.operands[3].reg != inst.operands[2].reg + 1,
477330fc 15468 _("VFP registers must be adjacent"));
037e8744
JB
15469 inst.operands[2].imm = 2;
15470 memset (&inst.operands[3], '\0', sizeof (inst.operands[3]));
15471 do_vfp_nsyn_opcode ("fmrrs");
15472 break;
5f4273c7 15473
037e8744
JB
15474 case NS_FFRR: /* case 15 (fmsrr). */
15475 constraint (inst.operands[1].reg != inst.operands[0].reg + 1,
477330fc 15476 _("VFP registers must be adjacent"));
037e8744
JB
15477 inst.operands[1] = inst.operands[2];
15478 inst.operands[2] = inst.operands[3];
15479 inst.operands[0].imm = 2;
15480 memset (&inst.operands[3], '\0', sizeof (inst.operands[3]));
15481 do_vfp_nsyn_opcode ("fmsrr");
5287ad62 15482 break;
5f4273c7 15483
4c261dff
NC
15484 case NS_NULL:
15485 /* neon_select_shape has determined that the instruction
15486 shape is wrong and has already set the error message. */
15487 break;
15488
5287ad62
JB
15489 default:
15490 abort ();
15491 }
15492}
15493
15494static void
15495do_neon_rshift_round_imm (void)
15496{
037e8744 15497 enum neon_shape rs = neon_select_shape (NS_DDI, NS_QQI, NS_NULL);
5287ad62
JB
15498 struct neon_type_el et = neon_check_type (2, rs, N_EQK, N_SU_ALL | N_KEY);
15499 int imm = inst.operands[2].imm;
15500
15501 /* imm == 0 case is encoded as VMOV for V{R}SHR. */
15502 if (imm == 0)
15503 {
15504 inst.operands[2].present = 0;
15505 do_neon_mov ();
15506 return;
15507 }
15508
15509 constraint (imm < 1 || (unsigned)imm > et.size,
477330fc 15510 _("immediate out of range for shift"));
037e8744 15511 neon_imm_shift (TRUE, et.type == NT_unsigned, neon_quad (rs), et,
477330fc 15512 et.size - imm);
5287ad62
JB
15513}
15514
15515static void
15516do_neon_movl (void)
15517{
15518 struct neon_type_el et = neon_check_type (2, NS_QD,
15519 N_EQK | N_DBL, N_SU_32 | N_KEY);
15520 unsigned sizebits = et.size >> 3;
15521 inst.instruction |= sizebits << 19;
15522 neon_two_same (0, et.type == NT_unsigned, -1);
15523}
15524
15525static void
15526do_neon_trn (void)
15527{
037e8744 15528 enum neon_shape rs = neon_select_shape (NS_DD, NS_QQ, NS_NULL);
5287ad62
JB
15529 struct neon_type_el et = neon_check_type (2, rs,
15530 N_EQK, N_8 | N_16 | N_32 | N_KEY);
88714cb8 15531 NEON_ENCODE (INTEGER, inst);
037e8744 15532 neon_two_same (neon_quad (rs), 1, et.size);
5287ad62
JB
15533}
15534
15535static void
15536do_neon_zip_uzp (void)
15537{
037e8744 15538 enum neon_shape rs = neon_select_shape (NS_DD, NS_QQ, NS_NULL);
5287ad62
JB
15539 struct neon_type_el et = neon_check_type (2, rs,
15540 N_EQK, N_8 | N_16 | N_32 | N_KEY);
15541 if (rs == NS_DD && et.size == 32)
15542 {
15543 /* Special case: encode as VTRN.32 <Dd>, <Dm>. */
15544 inst.instruction = N_MNEM_vtrn;
15545 do_neon_trn ();
15546 return;
15547 }
037e8744 15548 neon_two_same (neon_quad (rs), 1, et.size);
5287ad62
JB
15549}
15550
15551static void
15552do_neon_sat_abs_neg (void)
15553{
037e8744 15554 enum neon_shape rs = neon_select_shape (NS_DD, NS_QQ, NS_NULL);
5287ad62
JB
15555 struct neon_type_el et = neon_check_type (2, rs,
15556 N_EQK, N_S8 | N_S16 | N_S32 | N_KEY);
037e8744 15557 neon_two_same (neon_quad (rs), 1, et.size);
5287ad62
JB
15558}
15559
15560static void
15561do_neon_pair_long (void)
15562{
037e8744 15563 enum neon_shape rs = neon_select_shape (NS_DD, NS_QQ, NS_NULL);
5287ad62
JB
15564 struct neon_type_el et = neon_check_type (2, rs, N_EQK, N_SU_32 | N_KEY);
15565 /* Unsigned is encoded in OP field (bit 7) for these instruction. */
15566 inst.instruction |= (et.type == NT_unsigned) << 7;
037e8744 15567 neon_two_same (neon_quad (rs), 1, et.size);
5287ad62
JB
15568}
15569
15570static void
15571do_neon_recip_est (void)
15572{
037e8744 15573 enum neon_shape rs = neon_select_shape (NS_DD, NS_QQ, NS_NULL);
5287ad62
JB
15574 struct neon_type_el et = neon_check_type (2, rs,
15575 N_EQK | N_FLT, N_F32 | N_U32 | N_KEY);
15576 inst.instruction |= (et.type == NT_float) << 8;
037e8744 15577 neon_two_same (neon_quad (rs), 1, et.size);
5287ad62
JB
15578}
15579
15580static void
15581do_neon_cls (void)
15582{
037e8744 15583 enum neon_shape rs = neon_select_shape (NS_DD, NS_QQ, NS_NULL);
5287ad62
JB
15584 struct neon_type_el et = neon_check_type (2, rs,
15585 N_EQK, N_S8 | N_S16 | N_S32 | N_KEY);
037e8744 15586 neon_two_same (neon_quad (rs), 1, et.size);
5287ad62
JB
15587}
15588
15589static void
15590do_neon_clz (void)
15591{
037e8744 15592 enum neon_shape rs = neon_select_shape (NS_DD, NS_QQ, NS_NULL);
5287ad62
JB
15593 struct neon_type_el et = neon_check_type (2, rs,
15594 N_EQK, N_I8 | N_I16 | N_I32 | N_KEY);
037e8744 15595 neon_two_same (neon_quad (rs), 1, et.size);
5287ad62
JB
15596}
15597
15598static void
15599do_neon_cnt (void)
15600{
037e8744 15601 enum neon_shape rs = neon_select_shape (NS_DD, NS_QQ, NS_NULL);
5287ad62
JB
15602 struct neon_type_el et = neon_check_type (2, rs,
15603 N_EQK | N_INT, N_8 | N_KEY);
037e8744 15604 neon_two_same (neon_quad (rs), 1, et.size);
5287ad62
JB
15605}
15606
15607static void
15608do_neon_swp (void)
15609{
037e8744
JB
15610 enum neon_shape rs = neon_select_shape (NS_DD, NS_QQ, NS_NULL);
15611 neon_two_same (neon_quad (rs), 1, -1);
5287ad62
JB
15612}
15613
15614static void
15615do_neon_tbl_tbx (void)
15616{
15617 unsigned listlenbits;
dcbf9037 15618 neon_check_type (3, NS_DLD, N_EQK, N_EQK, N_8 | N_KEY);
5f4273c7 15619
5287ad62
JB
15620 if (inst.operands[1].imm < 1 || inst.operands[1].imm > 4)
15621 {
dcbf9037 15622 first_error (_("bad list length for table lookup"));
5287ad62
JB
15623 return;
15624 }
5f4273c7 15625
5287ad62
JB
15626 listlenbits = inst.operands[1].imm - 1;
15627 inst.instruction |= LOW4 (inst.operands[0].reg) << 12;
15628 inst.instruction |= HI1 (inst.operands[0].reg) << 22;
15629 inst.instruction |= LOW4 (inst.operands[1].reg) << 16;
15630 inst.instruction |= HI1 (inst.operands[1].reg) << 7;
15631 inst.instruction |= LOW4 (inst.operands[2].reg);
15632 inst.instruction |= HI1 (inst.operands[2].reg) << 5;
15633 inst.instruction |= listlenbits << 8;
5f4273c7 15634
88714cb8 15635 neon_dp_fixup (&inst);
5287ad62
JB
15636}
15637
15638static void
15639do_neon_ldm_stm (void)
15640{
15641 /* P, U and L bits are part of bitmask. */
15642 int is_dbmode = (inst.instruction & (1 << 24)) != 0;
15643 unsigned offsetbits = inst.operands[1].imm * 2;
15644
037e8744
JB
15645 if (inst.operands[1].issingle)
15646 {
15647 do_vfp_nsyn_ldm_stm (is_dbmode);
15648 return;
15649 }
15650
5287ad62 15651 constraint (is_dbmode && !inst.operands[0].writeback,
477330fc 15652 _("writeback (!) must be used for VLDMDB and VSTMDB"));
5287ad62
JB
15653
15654 constraint (inst.operands[1].imm < 1 || inst.operands[1].imm > 16,
477330fc
RM
15655 _("register list must contain at least 1 and at most 16 "
15656 "registers"));
5287ad62
JB
15657
15658 inst.instruction |= inst.operands[0].reg << 16;
15659 inst.instruction |= inst.operands[0].writeback << 21;
15660 inst.instruction |= LOW4 (inst.operands[1].reg) << 12;
15661 inst.instruction |= HI1 (inst.operands[1].reg) << 22;
15662
15663 inst.instruction |= offsetbits;
5f4273c7 15664
037e8744 15665 do_vfp_cond_or_thumb ();
5287ad62
JB
15666}
15667
15668static void
15669do_neon_ldr_str (void)
15670{
5287ad62 15671 int is_ldr = (inst.instruction & (1 << 20)) != 0;
5f4273c7 15672
6844b2c2
MGD
15673 /* Use of PC in vstr in ARM mode is deprecated in ARMv7.
15674 And is UNPREDICTABLE in thumb mode. */
fa94de6b 15675 if (!is_ldr
6844b2c2 15676 && inst.operands[1].reg == REG_PC
ba86b375 15677 && (ARM_CPU_HAS_FEATURE (selected_cpu, arm_ext_v7) || thumb_mode))
6844b2c2 15678 {
94dcf8bf 15679 if (thumb_mode)
6844b2c2 15680 inst.error = _("Use of PC here is UNPREDICTABLE");
94dcf8bf
JB
15681 else if (warn_on_deprecated)
15682 as_warn (_("Use of PC here is deprecated"));
6844b2c2
MGD
15683 }
15684
037e8744
JB
15685 if (inst.operands[0].issingle)
15686 {
cd2f129f 15687 if (is_ldr)
477330fc 15688 do_vfp_nsyn_opcode ("flds");
cd2f129f 15689 else
477330fc 15690 do_vfp_nsyn_opcode ("fsts");
5287ad62
JB
15691 }
15692 else
5287ad62 15693 {
cd2f129f 15694 if (is_ldr)
477330fc 15695 do_vfp_nsyn_opcode ("fldd");
5287ad62 15696 else
477330fc 15697 do_vfp_nsyn_opcode ("fstd");
5287ad62 15698 }
5287ad62
JB
15699}
15700
15701/* "interleave" version also handles non-interleaving register VLD1/VST1
15702 instructions. */
15703
15704static void
15705do_neon_ld_st_interleave (void)
15706{
037e8744 15707 struct neon_type_el et = neon_check_type (1, NS_NULL,
477330fc 15708 N_8 | N_16 | N_32 | N_64);
5287ad62
JB
15709 unsigned alignbits = 0;
15710 unsigned idx;
15711 /* The bits in this table go:
15712 0: register stride of one (0) or two (1)
15713 1,2: register list length, minus one (1, 2, 3, 4).
15714 3,4: <n> in instruction type, minus one (VLD<n> / VST<n>).
15715 We use -1 for invalid entries. */
15716 const int typetable[] =
15717 {
15718 0x7, -1, 0xa, -1, 0x6, -1, 0x2, -1, /* VLD1 / VST1. */
15719 -1, -1, 0x8, 0x9, -1, -1, 0x3, -1, /* VLD2 / VST2. */
15720 -1, -1, -1, -1, 0x4, 0x5, -1, -1, /* VLD3 / VST3. */
15721 -1, -1, -1, -1, -1, -1, 0x0, 0x1 /* VLD4 / VST4. */
15722 };
15723 int typebits;
15724
dcbf9037
JB
15725 if (et.type == NT_invtype)
15726 return;
15727
5287ad62
JB
15728 if (inst.operands[1].immisalign)
15729 switch (inst.operands[1].imm >> 8)
15730 {
15731 case 64: alignbits = 1; break;
15732 case 128:
477330fc 15733 if (NEON_REGLIST_LENGTH (inst.operands[0].imm) != 2
e23c0ad8 15734 && NEON_REGLIST_LENGTH (inst.operands[0].imm) != 4)
477330fc
RM
15735 goto bad_alignment;
15736 alignbits = 2;
15737 break;
5287ad62 15738 case 256:
477330fc
RM
15739 if (NEON_REGLIST_LENGTH (inst.operands[0].imm) != 4)
15740 goto bad_alignment;
15741 alignbits = 3;
15742 break;
5287ad62
JB
15743 default:
15744 bad_alignment:
477330fc
RM
15745 first_error (_("bad alignment"));
15746 return;
5287ad62
JB
15747 }
15748
15749 inst.instruction |= alignbits << 4;
15750 inst.instruction |= neon_logbits (et.size) << 6;
15751
15752 /* Bits [4:6] of the immediate in a list specifier encode register stride
15753 (minus 1) in bit 4, and list length in bits [5:6]. We put the <n> of
15754 VLD<n>/VST<n> in bits [9:8] of the initial bitmask. Suck it out here, look
15755 up the right value for "type" in a table based on this value and the given
15756 list style, then stick it back. */
15757 idx = ((inst.operands[0].imm >> 4) & 7)
477330fc 15758 | (((inst.instruction >> 8) & 3) << 3);
5287ad62
JB
15759
15760 typebits = typetable[idx];
5f4273c7 15761
5287ad62
JB
15762 constraint (typebits == -1, _("bad list type for instruction"));
15763
15764 inst.instruction &= ~0xf00;
15765 inst.instruction |= typebits << 8;
15766}
15767
15768/* Check alignment is valid for do_neon_ld_st_lane and do_neon_ld_dup.
15769 *DO_ALIGN is set to 1 if the relevant alignment bit should be set, 0
15770 otherwise. The variable arguments are a list of pairs of legal (size, align)
15771 values, terminated with -1. */
15772
15773static int
15774neon_alignment_bit (int size, int align, int *do_align, ...)
15775{
15776 va_list ap;
15777 int result = FAIL, thissize, thisalign;
5f4273c7 15778
5287ad62
JB
15779 if (!inst.operands[1].immisalign)
15780 {
15781 *do_align = 0;
15782 return SUCCESS;
15783 }
5f4273c7 15784
5287ad62
JB
15785 va_start (ap, do_align);
15786
15787 do
15788 {
15789 thissize = va_arg (ap, int);
15790 if (thissize == -1)
477330fc 15791 break;
5287ad62
JB
15792 thisalign = va_arg (ap, int);
15793
15794 if (size == thissize && align == thisalign)
477330fc 15795 result = SUCCESS;
5287ad62
JB
15796 }
15797 while (result != SUCCESS);
15798
15799 va_end (ap);
15800
15801 if (result == SUCCESS)
15802 *do_align = 1;
15803 else
dcbf9037 15804 first_error (_("unsupported alignment for instruction"));
5f4273c7 15805
5287ad62
JB
15806 return result;
15807}
15808
15809static void
15810do_neon_ld_st_lane (void)
15811{
037e8744 15812 struct neon_type_el et = neon_check_type (1, NS_NULL, N_8 | N_16 | N_32);
5287ad62
JB
15813 int align_good, do_align = 0;
15814 int logsize = neon_logbits (et.size);
15815 int align = inst.operands[1].imm >> 8;
15816 int n = (inst.instruction >> 8) & 3;
15817 int max_el = 64 / et.size;
5f4273c7 15818
dcbf9037
JB
15819 if (et.type == NT_invtype)
15820 return;
5f4273c7 15821
5287ad62 15822 constraint (NEON_REGLIST_LENGTH (inst.operands[0].imm) != n + 1,
477330fc 15823 _("bad list length"));
5287ad62 15824 constraint (NEON_LANE (inst.operands[0].imm) >= max_el,
477330fc 15825 _("scalar index out of range"));
5287ad62 15826 constraint (n != 0 && NEON_REG_STRIDE (inst.operands[0].imm) == 2
477330fc
RM
15827 && et.size == 8,
15828 _("stride of 2 unavailable when element size is 8"));
5f4273c7 15829
5287ad62
JB
15830 switch (n)
15831 {
15832 case 0: /* VLD1 / VST1. */
15833 align_good = neon_alignment_bit (et.size, align, &do_align, 16, 16,
477330fc 15834 32, 32, -1);
5287ad62 15835 if (align_good == FAIL)
477330fc 15836 return;
5287ad62 15837 if (do_align)
477330fc
RM
15838 {
15839 unsigned alignbits = 0;
15840 switch (et.size)
15841 {
15842 case 16: alignbits = 0x1; break;
15843 case 32: alignbits = 0x3; break;
15844 default: ;
15845 }
15846 inst.instruction |= alignbits << 4;
15847 }
5287ad62
JB
15848 break;
15849
15850 case 1: /* VLD2 / VST2. */
15851 align_good = neon_alignment_bit (et.size, align, &do_align, 8, 16, 16, 32,
477330fc 15852 32, 64, -1);
5287ad62 15853 if (align_good == FAIL)
477330fc 15854 return;
5287ad62 15855 if (do_align)
477330fc 15856 inst.instruction |= 1 << 4;
5287ad62
JB
15857 break;
15858
15859 case 2: /* VLD3 / VST3. */
15860 constraint (inst.operands[1].immisalign,
477330fc 15861 _("can't use alignment with this instruction"));
5287ad62
JB
15862 break;
15863
15864 case 3: /* VLD4 / VST4. */
15865 align_good = neon_alignment_bit (et.size, align, &do_align, 8, 32,
477330fc 15866 16, 64, 32, 64, 32, 128, -1);
5287ad62 15867 if (align_good == FAIL)
477330fc 15868 return;
5287ad62 15869 if (do_align)
477330fc
RM
15870 {
15871 unsigned alignbits = 0;
15872 switch (et.size)
15873 {
15874 case 8: alignbits = 0x1; break;
15875 case 16: alignbits = 0x1; break;
15876 case 32: alignbits = (align == 64) ? 0x1 : 0x2; break;
15877 default: ;
15878 }
15879 inst.instruction |= alignbits << 4;
15880 }
5287ad62
JB
15881 break;
15882
15883 default: ;
15884 }
15885
15886 /* Reg stride of 2 is encoded in bit 5 when size==16, bit 6 when size==32. */
15887 if (n != 0 && NEON_REG_STRIDE (inst.operands[0].imm) == 2)
15888 inst.instruction |= 1 << (4 + logsize);
5f4273c7 15889
5287ad62
JB
15890 inst.instruction |= NEON_LANE (inst.operands[0].imm) << (logsize + 5);
15891 inst.instruction |= logsize << 10;
15892}
15893
15894/* Encode single n-element structure to all lanes VLD<n> instructions. */
15895
15896static void
15897do_neon_ld_dup (void)
15898{
037e8744 15899 struct neon_type_el et = neon_check_type (1, NS_NULL, N_8 | N_16 | N_32);
5287ad62
JB
15900 int align_good, do_align = 0;
15901
dcbf9037
JB
15902 if (et.type == NT_invtype)
15903 return;
15904
5287ad62
JB
15905 switch ((inst.instruction >> 8) & 3)
15906 {
15907 case 0: /* VLD1. */
9c2799c2 15908 gas_assert (NEON_REG_STRIDE (inst.operands[0].imm) != 2);
5287ad62 15909 align_good = neon_alignment_bit (et.size, inst.operands[1].imm >> 8,
477330fc 15910 &do_align, 16, 16, 32, 32, -1);
5287ad62 15911 if (align_good == FAIL)
477330fc 15912 return;
5287ad62 15913 switch (NEON_REGLIST_LENGTH (inst.operands[0].imm))
477330fc
RM
15914 {
15915 case 1: break;
15916 case 2: inst.instruction |= 1 << 5; break;
15917 default: first_error (_("bad list length")); return;
15918 }
5287ad62
JB
15919 inst.instruction |= neon_logbits (et.size) << 6;
15920 break;
15921
15922 case 1: /* VLD2. */
15923 align_good = neon_alignment_bit (et.size, inst.operands[1].imm >> 8,
477330fc 15924 &do_align, 8, 16, 16, 32, 32, 64, -1);
5287ad62 15925 if (align_good == FAIL)
477330fc 15926 return;
5287ad62 15927 constraint (NEON_REGLIST_LENGTH (inst.operands[0].imm) != 2,
477330fc 15928 _("bad list length"));
5287ad62 15929 if (NEON_REG_STRIDE (inst.operands[0].imm) == 2)
477330fc 15930 inst.instruction |= 1 << 5;
5287ad62
JB
15931 inst.instruction |= neon_logbits (et.size) << 6;
15932 break;
15933
15934 case 2: /* VLD3. */
15935 constraint (inst.operands[1].immisalign,
477330fc 15936 _("can't use alignment with this instruction"));
5287ad62 15937 constraint (NEON_REGLIST_LENGTH (inst.operands[0].imm) != 3,
477330fc 15938 _("bad list length"));
5287ad62 15939 if (NEON_REG_STRIDE (inst.operands[0].imm) == 2)
477330fc 15940 inst.instruction |= 1 << 5;
5287ad62
JB
15941 inst.instruction |= neon_logbits (et.size) << 6;
15942 break;
15943
15944 case 3: /* VLD4. */
15945 {
477330fc
RM
15946 int align = inst.operands[1].imm >> 8;
15947 align_good = neon_alignment_bit (et.size, align, &do_align, 8, 32,
15948 16, 64, 32, 64, 32, 128, -1);
15949 if (align_good == FAIL)
15950 return;
15951 constraint (NEON_REGLIST_LENGTH (inst.operands[0].imm) != 4,
15952 _("bad list length"));
15953 if (NEON_REG_STRIDE (inst.operands[0].imm) == 2)
15954 inst.instruction |= 1 << 5;
15955 if (et.size == 32 && align == 128)
15956 inst.instruction |= 0x3 << 6;
15957 else
15958 inst.instruction |= neon_logbits (et.size) << 6;
5287ad62
JB
15959 }
15960 break;
15961
15962 default: ;
15963 }
15964
15965 inst.instruction |= do_align << 4;
15966}
15967
15968/* Disambiguate VLD<n> and VST<n> instructions, and fill in common bits (those
15969 apart from bits [11:4]. */
15970
15971static void
15972do_neon_ldx_stx (void)
15973{
b1a769ed
DG
15974 if (inst.operands[1].isreg)
15975 constraint (inst.operands[1].reg == REG_PC, BAD_PC);
15976
5287ad62
JB
15977 switch (NEON_LANE (inst.operands[0].imm))
15978 {
15979 case NEON_INTERLEAVE_LANES:
88714cb8 15980 NEON_ENCODE (INTERLV, inst);
5287ad62
JB
15981 do_neon_ld_st_interleave ();
15982 break;
5f4273c7 15983
5287ad62 15984 case NEON_ALL_LANES:
88714cb8 15985 NEON_ENCODE (DUP, inst);
2d51fb74
JB
15986 if (inst.instruction == N_INV)
15987 {
15988 first_error ("only loads support such operands");
15989 break;
15990 }
5287ad62
JB
15991 do_neon_ld_dup ();
15992 break;
5f4273c7 15993
5287ad62 15994 default:
88714cb8 15995 NEON_ENCODE (LANE, inst);
5287ad62
JB
15996 do_neon_ld_st_lane ();
15997 }
15998
15999 /* L bit comes from bit mask. */
16000 inst.instruction |= LOW4 (inst.operands[0].reg) << 12;
16001 inst.instruction |= HI1 (inst.operands[0].reg) << 22;
16002 inst.instruction |= inst.operands[1].reg << 16;
5f4273c7 16003
5287ad62
JB
16004 if (inst.operands[1].postind)
16005 {
16006 int postreg = inst.operands[1].imm & 0xf;
16007 constraint (!inst.operands[1].immisreg,
477330fc 16008 _("post-index must be a register"));
5287ad62 16009 constraint (postreg == 0xd || postreg == 0xf,
477330fc 16010 _("bad register for post-index"));
5287ad62
JB
16011 inst.instruction |= postreg;
16012 }
16013 else if (inst.operands[1].writeback)
16014 {
16015 inst.instruction |= 0xd;
16016 }
16017 else
5f4273c7
NC
16018 inst.instruction |= 0xf;
16019
5287ad62
JB
16020 if (thumb_mode)
16021 inst.instruction |= 0xf9000000;
16022 else
16023 inst.instruction |= 0xf4000000;
16024}
33399f07
MGD
16025
16026/* FP v8. */
16027static void
16028do_vfp_nsyn_fpv8 (enum neon_shape rs)
16029{
16030 NEON_ENCODE (FPV8, inst);
16031
16032 if (rs == NS_FFF)
16033 do_vfp_sp_dyadic ();
16034 else
16035 do_vfp_dp_rd_rn_rm ();
16036
16037 if (rs == NS_DDD)
16038 inst.instruction |= 0x100;
16039
16040 inst.instruction |= 0xf0000000;
16041}
16042
16043static void
16044do_vsel (void)
16045{
16046 set_it_insn_type (OUTSIDE_IT_INSN);
16047
16048 if (try_vfp_nsyn (3, do_vfp_nsyn_fpv8) != SUCCESS)
16049 first_error (_("invalid instruction shape"));
16050}
16051
73924fbc
MGD
16052static void
16053do_vmaxnm (void)
16054{
16055 set_it_insn_type (OUTSIDE_IT_INSN);
16056
16057 if (try_vfp_nsyn (3, do_vfp_nsyn_fpv8) == SUCCESS)
16058 return;
16059
16060 if (vfp_or_neon_is_neon (NEON_CHECK_CC | NEON_CHECK_ARCH8) == FAIL)
16061 return;
16062
16063 neon_dyadic_misc (NT_untyped, N_F32, 0);
16064}
16065
30bdf752
MGD
16066static void
16067do_vrint_1 (enum neon_cvt_mode mode)
16068{
16069 enum neon_shape rs = neon_select_shape (NS_FF, NS_DD, NS_QQ, NS_NULL);
16070 struct neon_type_el et;
16071
16072 if (rs == NS_NULL)
16073 return;
16074
16075 et = neon_check_type (2, rs, N_EQK | N_VFP, N_F32 | N_F64 | N_KEY | N_VFP);
16076 if (et.type != NT_invtype)
16077 {
16078 /* VFP encodings. */
16079 if (mode == neon_cvt_mode_a || mode == neon_cvt_mode_n
16080 || mode == neon_cvt_mode_p || mode == neon_cvt_mode_m)
16081 set_it_insn_type (OUTSIDE_IT_INSN);
16082
16083 NEON_ENCODE (FPV8, inst);
16084 if (rs == NS_FF)
16085 do_vfp_sp_monadic ();
16086 else
16087 do_vfp_dp_rd_rm ();
16088
16089 switch (mode)
16090 {
16091 case neon_cvt_mode_r: inst.instruction |= 0x00000000; break;
16092 case neon_cvt_mode_z: inst.instruction |= 0x00000080; break;
16093 case neon_cvt_mode_x: inst.instruction |= 0x00010000; break;
16094 case neon_cvt_mode_a: inst.instruction |= 0xf0000000; break;
16095 case neon_cvt_mode_n: inst.instruction |= 0xf0010000; break;
16096 case neon_cvt_mode_p: inst.instruction |= 0xf0020000; break;
16097 case neon_cvt_mode_m: inst.instruction |= 0xf0030000; break;
16098 default: abort ();
16099 }
16100
16101 inst.instruction |= (rs == NS_DD) << 8;
16102 do_vfp_cond_or_thumb ();
16103 }
16104 else
16105 {
16106 /* Neon encodings (or something broken...). */
16107 inst.error = NULL;
16108 et = neon_check_type (2, rs, N_EQK, N_F32 | N_KEY);
16109
16110 if (et.type == NT_invtype)
16111 return;
16112
16113 set_it_insn_type (OUTSIDE_IT_INSN);
16114 NEON_ENCODE (FLOAT, inst);
16115
16116 if (vfp_or_neon_is_neon (NEON_CHECK_CC | NEON_CHECK_ARCH8) == FAIL)
16117 return;
16118
16119 inst.instruction |= LOW4 (inst.operands[0].reg) << 12;
16120 inst.instruction |= HI1 (inst.operands[0].reg) << 22;
16121 inst.instruction |= LOW4 (inst.operands[1].reg);
16122 inst.instruction |= HI1 (inst.operands[1].reg) << 5;
16123 inst.instruction |= neon_quad (rs) << 6;
16124 switch (mode)
16125 {
16126 case neon_cvt_mode_z: inst.instruction |= 3 << 7; break;
16127 case neon_cvt_mode_x: inst.instruction |= 1 << 7; break;
16128 case neon_cvt_mode_a: inst.instruction |= 2 << 7; break;
16129 case neon_cvt_mode_n: inst.instruction |= 0 << 7; break;
16130 case neon_cvt_mode_p: inst.instruction |= 7 << 7; break;
16131 case neon_cvt_mode_m: inst.instruction |= 5 << 7; break;
16132 case neon_cvt_mode_r: inst.error = _("invalid rounding mode"); break;
16133 default: abort ();
16134 }
16135
16136 if (thumb_mode)
16137 inst.instruction |= 0xfc000000;
16138 else
16139 inst.instruction |= 0xf0000000;
16140 }
16141}
16142
16143static void
16144do_vrintx (void)
16145{
16146 do_vrint_1 (neon_cvt_mode_x);
16147}
16148
16149static void
16150do_vrintz (void)
16151{
16152 do_vrint_1 (neon_cvt_mode_z);
16153}
16154
16155static void
16156do_vrintr (void)
16157{
16158 do_vrint_1 (neon_cvt_mode_r);
16159}
16160
16161static void
16162do_vrinta (void)
16163{
16164 do_vrint_1 (neon_cvt_mode_a);
16165}
16166
16167static void
16168do_vrintn (void)
16169{
16170 do_vrint_1 (neon_cvt_mode_n);
16171}
16172
16173static void
16174do_vrintp (void)
16175{
16176 do_vrint_1 (neon_cvt_mode_p);
16177}
16178
16179static void
16180do_vrintm (void)
16181{
16182 do_vrint_1 (neon_cvt_mode_m);
16183}
16184
91ff7894
MGD
16185/* Crypto v1 instructions. */
16186static void
16187do_crypto_2op_1 (unsigned elttype, int op)
16188{
16189 set_it_insn_type (OUTSIDE_IT_INSN);
16190
16191 if (neon_check_type (2, NS_QQ, N_EQK | N_UNT, elttype | N_UNT | N_KEY).type
16192 == NT_invtype)
16193 return;
16194
16195 inst.error = NULL;
16196
16197 NEON_ENCODE (INTEGER, inst);
16198 inst.instruction |= LOW4 (inst.operands[0].reg) << 12;
16199 inst.instruction |= HI1 (inst.operands[0].reg) << 22;
16200 inst.instruction |= LOW4 (inst.operands[1].reg);
16201 inst.instruction |= HI1 (inst.operands[1].reg) << 5;
16202 if (op != -1)
16203 inst.instruction |= op << 6;
16204
16205 if (thumb_mode)
16206 inst.instruction |= 0xfc000000;
16207 else
16208 inst.instruction |= 0xf0000000;
16209}
16210
48adcd8e
MGD
16211static void
16212do_crypto_3op_1 (int u, int op)
16213{
16214 set_it_insn_type (OUTSIDE_IT_INSN);
16215
16216 if (neon_check_type (3, NS_QQQ, N_EQK | N_UNT, N_EQK | N_UNT,
16217 N_32 | N_UNT | N_KEY).type == NT_invtype)
16218 return;
16219
16220 inst.error = NULL;
16221
16222 NEON_ENCODE (INTEGER, inst);
16223 neon_three_same (1, u, 8 << op);
16224}
16225
91ff7894
MGD
16226static void
16227do_aese (void)
16228{
16229 do_crypto_2op_1 (N_8, 0);
16230}
16231
16232static void
16233do_aesd (void)
16234{
16235 do_crypto_2op_1 (N_8, 1);
16236}
16237
16238static void
16239do_aesmc (void)
16240{
16241 do_crypto_2op_1 (N_8, 2);
16242}
16243
16244static void
16245do_aesimc (void)
16246{
16247 do_crypto_2op_1 (N_8, 3);
16248}
16249
48adcd8e
MGD
16250static void
16251do_sha1c (void)
16252{
16253 do_crypto_3op_1 (0, 0);
16254}
16255
16256static void
16257do_sha1p (void)
16258{
16259 do_crypto_3op_1 (0, 1);
16260}
16261
16262static void
16263do_sha1m (void)
16264{
16265 do_crypto_3op_1 (0, 2);
16266}
16267
16268static void
16269do_sha1su0 (void)
16270{
16271 do_crypto_3op_1 (0, 3);
16272}
91ff7894 16273
48adcd8e
MGD
16274static void
16275do_sha256h (void)
16276{
16277 do_crypto_3op_1 (1, 0);
16278}
16279
16280static void
16281do_sha256h2 (void)
16282{
16283 do_crypto_3op_1 (1, 1);
16284}
16285
16286static void
16287do_sha256su1 (void)
16288{
16289 do_crypto_3op_1 (1, 2);
16290}
3c9017d2
MGD
16291
16292static void
16293do_sha1h (void)
16294{
16295 do_crypto_2op_1 (N_32, -1);
16296}
16297
16298static void
16299do_sha1su1 (void)
16300{
16301 do_crypto_2op_1 (N_32, 0);
16302}
16303
16304static void
16305do_sha256su0 (void)
16306{
16307 do_crypto_2op_1 (N_32, 1);
16308}
dd5181d5
KT
16309
16310static void
16311do_crc32_1 (unsigned int poly, unsigned int sz)
16312{
16313 unsigned int Rd = inst.operands[0].reg;
16314 unsigned int Rn = inst.operands[1].reg;
16315 unsigned int Rm = inst.operands[2].reg;
16316
16317 set_it_insn_type (OUTSIDE_IT_INSN);
16318 inst.instruction |= LOW4 (Rd) << (thumb_mode ? 8 : 12);
16319 inst.instruction |= LOW4 (Rn) << 16;
16320 inst.instruction |= LOW4 (Rm);
16321 inst.instruction |= sz << (thumb_mode ? 4 : 21);
16322 inst.instruction |= poly << (thumb_mode ? 20 : 9);
16323
16324 if (Rd == REG_PC || Rn == REG_PC || Rm == REG_PC)
16325 as_warn (UNPRED_REG ("r15"));
16326 if (thumb_mode && (Rd == REG_SP || Rn == REG_SP || Rm == REG_SP))
16327 as_warn (UNPRED_REG ("r13"));
16328}
16329
16330static void
16331do_crc32b (void)
16332{
16333 do_crc32_1 (0, 0);
16334}
16335
16336static void
16337do_crc32h (void)
16338{
16339 do_crc32_1 (0, 1);
16340}
16341
16342static void
16343do_crc32w (void)
16344{
16345 do_crc32_1 (0, 2);
16346}
16347
16348static void
16349do_crc32cb (void)
16350{
16351 do_crc32_1 (1, 0);
16352}
16353
16354static void
16355do_crc32ch (void)
16356{
16357 do_crc32_1 (1, 1);
16358}
16359
16360static void
16361do_crc32cw (void)
16362{
16363 do_crc32_1 (1, 2);
16364}
16365
5287ad62
JB
16366\f
16367/* Overall per-instruction processing. */
16368
16369/* We need to be able to fix up arbitrary expressions in some statements.
16370 This is so that we can handle symbols that are an arbitrary distance from
16371 the pc. The most common cases are of the form ((+/-sym -/+ . - 8) & mask),
16372 which returns part of an address in a form which will be valid for
16373 a data instruction. We do this by pushing the expression into a symbol
16374 in the expr_section, and creating a fix for that. */
16375
16376static void
16377fix_new_arm (fragS * frag,
16378 int where,
16379 short int size,
16380 expressionS * exp,
16381 int pc_rel,
16382 int reloc)
16383{
16384 fixS * new_fix;
16385
16386 switch (exp->X_op)
16387 {
16388 case O_constant:
6e7ce2cd
PB
16389 if (pc_rel)
16390 {
16391 /* Create an absolute valued symbol, so we have something to
477330fc
RM
16392 refer to in the object file. Unfortunately for us, gas's
16393 generic expression parsing will already have folded out
16394 any use of .set foo/.type foo %function that may have
16395 been used to set type information of the target location,
16396 that's being specified symbolically. We have to presume
16397 the user knows what they are doing. */
6e7ce2cd
PB
16398 char name[16 + 8];
16399 symbolS *symbol;
16400
16401 sprintf (name, "*ABS*0x%lx", (unsigned long)exp->X_add_number);
16402
16403 symbol = symbol_find_or_make (name);
16404 S_SET_SEGMENT (symbol, absolute_section);
16405 symbol_set_frag (symbol, &zero_address_frag);
16406 S_SET_VALUE (symbol, exp->X_add_number);
16407 exp->X_op = O_symbol;
16408 exp->X_add_symbol = symbol;
16409 exp->X_add_number = 0;
16410 }
16411 /* FALLTHROUGH */
5287ad62
JB
16412 case O_symbol:
16413 case O_add:
16414 case O_subtract:
21d799b5 16415 new_fix = fix_new_exp (frag, where, size, exp, pc_rel,
477330fc 16416 (enum bfd_reloc_code_real) reloc);
5287ad62
JB
16417 break;
16418
16419 default:
21d799b5 16420 new_fix = (fixS *) fix_new (frag, where, size, make_expr_symbol (exp), 0,
477330fc 16421 pc_rel, (enum bfd_reloc_code_real) reloc);
5287ad62
JB
16422 break;
16423 }
16424
16425 /* Mark whether the fix is to a THUMB instruction, or an ARM
16426 instruction. */
16427 new_fix->tc_fix_data = thumb_mode;
16428}
16429
16430/* Create a frg for an instruction requiring relaxation. */
16431static void
16432output_relax_insn (void)
16433{
16434 char * to;
16435 symbolS *sym;
0110f2b8
PB
16436 int offset;
16437
6e1cb1a6
PB
16438 /* The size of the instruction is unknown, so tie the debug info to the
16439 start of the instruction. */
16440 dwarf2_emit_insn (0);
6e1cb1a6 16441
0110f2b8
PB
16442 switch (inst.reloc.exp.X_op)
16443 {
16444 case O_symbol:
16445 sym = inst.reloc.exp.X_add_symbol;
16446 offset = inst.reloc.exp.X_add_number;
16447 break;
16448 case O_constant:
16449 sym = NULL;
16450 offset = inst.reloc.exp.X_add_number;
16451 break;
16452 default:
16453 sym = make_expr_symbol (&inst.reloc.exp);
16454 offset = 0;
16455 break;
16456 }
16457 to = frag_var (rs_machine_dependent, INSN_SIZE, THUMB_SIZE,
16458 inst.relax, sym, offset, NULL/*offset, opcode*/);
16459 md_number_to_chars (to, inst.instruction, THUMB_SIZE);
0110f2b8
PB
16460}
16461
16462/* Write a 32-bit thumb instruction to buf. */
16463static void
16464put_thumb32_insn (char * buf, unsigned long insn)
16465{
16466 md_number_to_chars (buf, insn >> 16, THUMB_SIZE);
16467 md_number_to_chars (buf + THUMB_SIZE, insn, THUMB_SIZE);
16468}
16469
b99bd4ef 16470static void
c19d1205 16471output_inst (const char * str)
b99bd4ef 16472{
c19d1205 16473 char * to = NULL;
b99bd4ef 16474
c19d1205 16475 if (inst.error)
b99bd4ef 16476 {
c19d1205 16477 as_bad ("%s -- `%s'", inst.error, str);
b99bd4ef
NC
16478 return;
16479 }
5f4273c7
NC
16480 if (inst.relax)
16481 {
16482 output_relax_insn ();
0110f2b8 16483 return;
5f4273c7 16484 }
c19d1205
ZW
16485 if (inst.size == 0)
16486 return;
b99bd4ef 16487
c19d1205 16488 to = frag_more (inst.size);
8dc2430f
NC
16489 /* PR 9814: Record the thumb mode into the current frag so that we know
16490 what type of NOP padding to use, if necessary. We override any previous
16491 setting so that if the mode has changed then the NOPS that we use will
16492 match the encoding of the last instruction in the frag. */
cd000bff 16493 frag_now->tc_frag_data.thumb_mode = thumb_mode | MODE_RECORDED;
c19d1205
ZW
16494
16495 if (thumb_mode && (inst.size > THUMB_SIZE))
b99bd4ef 16496 {
9c2799c2 16497 gas_assert (inst.size == (2 * THUMB_SIZE));
0110f2b8 16498 put_thumb32_insn (to, inst.instruction);
b99bd4ef 16499 }
c19d1205 16500 else if (inst.size > INSN_SIZE)
b99bd4ef 16501 {
9c2799c2 16502 gas_assert (inst.size == (2 * INSN_SIZE));
c19d1205
ZW
16503 md_number_to_chars (to, inst.instruction, INSN_SIZE);
16504 md_number_to_chars (to + INSN_SIZE, inst.instruction, INSN_SIZE);
b99bd4ef 16505 }
c19d1205
ZW
16506 else
16507 md_number_to_chars (to, inst.instruction, inst.size);
b99bd4ef 16508
c19d1205
ZW
16509 if (inst.reloc.type != BFD_RELOC_UNUSED)
16510 fix_new_arm (frag_now, to - frag_now->fr_literal,
16511 inst.size, & inst.reloc.exp, inst.reloc.pc_rel,
16512 inst.reloc.type);
b99bd4ef 16513
c19d1205 16514 dwarf2_emit_insn (inst.size);
c19d1205 16515}
b99bd4ef 16516
e07e6e58
NC
16517static char *
16518output_it_inst (int cond, int mask, char * to)
16519{
16520 unsigned long instruction = 0xbf00;
16521
16522 mask &= 0xf;
16523 instruction |= mask;
16524 instruction |= cond << 4;
16525
16526 if (to == NULL)
16527 {
16528 to = frag_more (2);
16529#ifdef OBJ_ELF
16530 dwarf2_emit_insn (2);
16531#endif
16532 }
16533
16534 md_number_to_chars (to, instruction, 2);
16535
16536 return to;
16537}
16538
c19d1205
ZW
16539/* Tag values used in struct asm_opcode's tag field. */
16540enum opcode_tag
16541{
16542 OT_unconditional, /* Instruction cannot be conditionalized.
16543 The ARM condition field is still 0xE. */
16544 OT_unconditionalF, /* Instruction cannot be conditionalized
16545 and carries 0xF in its ARM condition field. */
16546 OT_csuffix, /* Instruction takes a conditional suffix. */
037e8744 16547 OT_csuffixF, /* Some forms of the instruction take a conditional
477330fc
RM
16548 suffix, others place 0xF where the condition field
16549 would be. */
c19d1205
ZW
16550 OT_cinfix3, /* Instruction takes a conditional infix,
16551 beginning at character index 3. (In
16552 unified mode, it becomes a suffix.) */
088fa78e
KH
16553 OT_cinfix3_deprecated, /* The same as OT_cinfix3. This is used for
16554 tsts, cmps, cmns, and teqs. */
e3cb604e
PB
16555 OT_cinfix3_legacy, /* Legacy instruction takes a conditional infix at
16556 character index 3, even in unified mode. Used for
16557 legacy instructions where suffix and infix forms
16558 may be ambiguous. */
c19d1205 16559 OT_csuf_or_in3, /* Instruction takes either a conditional
e3cb604e 16560 suffix or an infix at character index 3. */
c19d1205
ZW
16561 OT_odd_infix_unc, /* This is the unconditional variant of an
16562 instruction that takes a conditional infix
16563 at an unusual position. In unified mode,
16564 this variant will accept a suffix. */
16565 OT_odd_infix_0 /* Values greater than or equal to OT_odd_infix_0
16566 are the conditional variants of instructions that
16567 take conditional infixes in unusual positions.
16568 The infix appears at character index
16569 (tag - OT_odd_infix_0). These are not accepted
16570 in unified mode. */
16571};
b99bd4ef 16572
c19d1205
ZW
16573/* Subroutine of md_assemble, responsible for looking up the primary
16574 opcode from the mnemonic the user wrote. STR points to the
16575 beginning of the mnemonic.
16576
16577 This is not simply a hash table lookup, because of conditional
16578 variants. Most instructions have conditional variants, which are
16579 expressed with a _conditional affix_ to the mnemonic. If we were
16580 to encode each conditional variant as a literal string in the opcode
16581 table, it would have approximately 20,000 entries.
16582
16583 Most mnemonics take this affix as a suffix, and in unified syntax,
16584 'most' is upgraded to 'all'. However, in the divided syntax, some
16585 instructions take the affix as an infix, notably the s-variants of
16586 the arithmetic instructions. Of those instructions, all but six
16587 have the infix appear after the third character of the mnemonic.
16588
16589 Accordingly, the algorithm for looking up primary opcodes given
16590 an identifier is:
16591
16592 1. Look up the identifier in the opcode table.
16593 If we find a match, go to step U.
16594
16595 2. Look up the last two characters of the identifier in the
16596 conditions table. If we find a match, look up the first N-2
16597 characters of the identifier in the opcode table. If we
16598 find a match, go to step CE.
16599
16600 3. Look up the fourth and fifth characters of the identifier in
16601 the conditions table. If we find a match, extract those
16602 characters from the identifier, and look up the remaining
16603 characters in the opcode table. If we find a match, go
16604 to step CM.
16605
16606 4. Fail.
16607
16608 U. Examine the tag field of the opcode structure, in case this is
16609 one of the six instructions with its conditional infix in an
16610 unusual place. If it is, the tag tells us where to find the
16611 infix; look it up in the conditions table and set inst.cond
16612 accordingly. Otherwise, this is an unconditional instruction.
16613 Again set inst.cond accordingly. Return the opcode structure.
16614
16615 CE. Examine the tag field to make sure this is an instruction that
16616 should receive a conditional suffix. If it is not, fail.
16617 Otherwise, set inst.cond from the suffix we already looked up,
16618 and return the opcode structure.
16619
16620 CM. Examine the tag field to make sure this is an instruction that
16621 should receive a conditional infix after the third character.
16622 If it is not, fail. Otherwise, undo the edits to the current
16623 line of input and proceed as for case CE. */
16624
16625static const struct asm_opcode *
16626opcode_lookup (char **str)
16627{
16628 char *end, *base;
16629 char *affix;
16630 const struct asm_opcode *opcode;
16631 const struct asm_cond *cond;
e3cb604e 16632 char save[2];
c19d1205
ZW
16633
16634 /* Scan up to the end of the mnemonic, which must end in white space,
721a8186 16635 '.' (in unified mode, or for Neon/VFP instructions), or end of string. */
c19d1205 16636 for (base = end = *str; *end != '\0'; end++)
721a8186 16637 if (*end == ' ' || *end == '.')
c19d1205 16638 break;
b99bd4ef 16639
c19d1205 16640 if (end == base)
c921be7d 16641 return NULL;
b99bd4ef 16642
5287ad62 16643 /* Handle a possible width suffix and/or Neon type suffix. */
c19d1205 16644 if (end[0] == '.')
b99bd4ef 16645 {
5287ad62 16646 int offset = 2;
5f4273c7 16647
267d2029 16648 /* The .w and .n suffixes are only valid if the unified syntax is in
477330fc 16649 use. */
267d2029 16650 if (unified_syntax && end[1] == 'w')
c19d1205 16651 inst.size_req = 4;
267d2029 16652 else if (unified_syntax && end[1] == 'n')
c19d1205
ZW
16653 inst.size_req = 2;
16654 else
477330fc 16655 offset = 0;
5287ad62
JB
16656
16657 inst.vectype.elems = 0;
16658
16659 *str = end + offset;
b99bd4ef 16660
5f4273c7 16661 if (end[offset] == '.')
5287ad62 16662 {
267d2029 16663 /* See if we have a Neon type suffix (possible in either unified or
477330fc
RM
16664 non-unified ARM syntax mode). */
16665 if (parse_neon_type (&inst.vectype, str) == FAIL)
c921be7d 16666 return NULL;
477330fc 16667 }
5287ad62 16668 else if (end[offset] != '\0' && end[offset] != ' ')
477330fc 16669 return NULL;
b99bd4ef 16670 }
c19d1205
ZW
16671 else
16672 *str = end;
b99bd4ef 16673
c19d1205 16674 /* Look for unaffixed or special-case affixed mnemonic. */
21d799b5 16675 opcode = (const struct asm_opcode *) hash_find_n (arm_ops_hsh, base,
477330fc 16676 end - base);
c19d1205 16677 if (opcode)
b99bd4ef 16678 {
c19d1205
ZW
16679 /* step U */
16680 if (opcode->tag < OT_odd_infix_0)
b99bd4ef 16681 {
c19d1205
ZW
16682 inst.cond = COND_ALWAYS;
16683 return opcode;
b99bd4ef 16684 }
b99bd4ef 16685
278df34e 16686 if (warn_on_deprecated && unified_syntax)
c19d1205
ZW
16687 as_warn (_("conditional infixes are deprecated in unified syntax"));
16688 affix = base + (opcode->tag - OT_odd_infix_0);
21d799b5 16689 cond = (const struct asm_cond *) hash_find_n (arm_cond_hsh, affix, 2);
9c2799c2 16690 gas_assert (cond);
b99bd4ef 16691
c19d1205
ZW
16692 inst.cond = cond->value;
16693 return opcode;
16694 }
b99bd4ef 16695
c19d1205
ZW
16696 /* Cannot have a conditional suffix on a mnemonic of less than two
16697 characters. */
16698 if (end - base < 3)
c921be7d 16699 return NULL;
b99bd4ef 16700
c19d1205
ZW
16701 /* Look for suffixed mnemonic. */
16702 affix = end - 2;
21d799b5
NC
16703 cond = (const struct asm_cond *) hash_find_n (arm_cond_hsh, affix, 2);
16704 opcode = (const struct asm_opcode *) hash_find_n (arm_ops_hsh, base,
477330fc 16705 affix - base);
c19d1205
ZW
16706 if (opcode && cond)
16707 {
16708 /* step CE */
16709 switch (opcode->tag)
16710 {
e3cb604e
PB
16711 case OT_cinfix3_legacy:
16712 /* Ignore conditional suffixes matched on infix only mnemonics. */
16713 break;
16714
c19d1205 16715 case OT_cinfix3:
088fa78e 16716 case OT_cinfix3_deprecated:
c19d1205
ZW
16717 case OT_odd_infix_unc:
16718 if (!unified_syntax)
e3cb604e 16719 return 0;
c19d1205
ZW
16720 /* else fall through */
16721
16722 case OT_csuffix:
477330fc 16723 case OT_csuffixF:
c19d1205
ZW
16724 case OT_csuf_or_in3:
16725 inst.cond = cond->value;
16726 return opcode;
16727
16728 case OT_unconditional:
16729 case OT_unconditionalF:
dfa9f0d5 16730 if (thumb_mode)
c921be7d 16731 inst.cond = cond->value;
dfa9f0d5
PB
16732 else
16733 {
c921be7d 16734 /* Delayed diagnostic. */
dfa9f0d5
PB
16735 inst.error = BAD_COND;
16736 inst.cond = COND_ALWAYS;
16737 }
c19d1205 16738 return opcode;
b99bd4ef 16739
c19d1205 16740 default:
c921be7d 16741 return NULL;
c19d1205
ZW
16742 }
16743 }
b99bd4ef 16744
c19d1205
ZW
16745 /* Cannot have a usual-position infix on a mnemonic of less than
16746 six characters (five would be a suffix). */
16747 if (end - base < 6)
c921be7d 16748 return NULL;
b99bd4ef 16749
c19d1205
ZW
16750 /* Look for infixed mnemonic in the usual position. */
16751 affix = base + 3;
21d799b5 16752 cond = (const struct asm_cond *) hash_find_n (arm_cond_hsh, affix, 2);
e3cb604e 16753 if (!cond)
c921be7d 16754 return NULL;
e3cb604e
PB
16755
16756 memcpy (save, affix, 2);
16757 memmove (affix, affix + 2, (end - affix) - 2);
21d799b5 16758 opcode = (const struct asm_opcode *) hash_find_n (arm_ops_hsh, base,
477330fc 16759 (end - base) - 2);
e3cb604e
PB
16760 memmove (affix + 2, affix, (end - affix) - 2);
16761 memcpy (affix, save, 2);
16762
088fa78e
KH
16763 if (opcode
16764 && (opcode->tag == OT_cinfix3
16765 || opcode->tag == OT_cinfix3_deprecated
16766 || opcode->tag == OT_csuf_or_in3
16767 || opcode->tag == OT_cinfix3_legacy))
b99bd4ef 16768 {
c921be7d 16769 /* Step CM. */
278df34e 16770 if (warn_on_deprecated && unified_syntax
088fa78e
KH
16771 && (opcode->tag == OT_cinfix3
16772 || opcode->tag == OT_cinfix3_deprecated))
c19d1205
ZW
16773 as_warn (_("conditional infixes are deprecated in unified syntax"));
16774
16775 inst.cond = cond->value;
16776 return opcode;
b99bd4ef
NC
16777 }
16778
c921be7d 16779 return NULL;
b99bd4ef
NC
16780}
16781
e07e6e58
NC
16782/* This function generates an initial IT instruction, leaving its block
16783 virtually open for the new instructions. Eventually,
16784 the mask will be updated by now_it_add_mask () each time
16785 a new instruction needs to be included in the IT block.
16786 Finally, the block is closed with close_automatic_it_block ().
16787 The block closure can be requested either from md_assemble (),
16788 a tencode (), or due to a label hook. */
16789
16790static void
16791new_automatic_it_block (int cond)
16792{
16793 now_it.state = AUTOMATIC_IT_BLOCK;
16794 now_it.mask = 0x18;
16795 now_it.cc = cond;
16796 now_it.block_length = 1;
cd000bff 16797 mapping_state (MAP_THUMB);
e07e6e58 16798 now_it.insn = output_it_inst (cond, now_it.mask, NULL);
5a01bb1d
MGD
16799 now_it.warn_deprecated = FALSE;
16800 now_it.insn_cond = TRUE;
e07e6e58
NC
16801}
16802
16803/* Close an automatic IT block.
16804 See comments in new_automatic_it_block (). */
16805
16806static void
16807close_automatic_it_block (void)
16808{
16809 now_it.mask = 0x10;
16810 now_it.block_length = 0;
16811}
16812
16813/* Update the mask of the current automatically-generated IT
16814 instruction. See comments in new_automatic_it_block (). */
16815
16816static void
16817now_it_add_mask (int cond)
16818{
16819#define CLEAR_BIT(value, nbit) ((value) & ~(1 << (nbit)))
16820#define SET_BIT_VALUE(value, bitvalue, nbit) (CLEAR_BIT (value, nbit) \
477330fc 16821 | ((bitvalue) << (nbit)))
e07e6e58 16822 const int resulting_bit = (cond & 1);
c921be7d 16823
e07e6e58
NC
16824 now_it.mask &= 0xf;
16825 now_it.mask = SET_BIT_VALUE (now_it.mask,
477330fc
RM
16826 resulting_bit,
16827 (5 - now_it.block_length));
e07e6e58 16828 now_it.mask = SET_BIT_VALUE (now_it.mask,
477330fc
RM
16829 1,
16830 ((5 - now_it.block_length) - 1) );
e07e6e58
NC
16831 output_it_inst (now_it.cc, now_it.mask, now_it.insn);
16832
16833#undef CLEAR_BIT
16834#undef SET_BIT_VALUE
e07e6e58
NC
16835}
16836
16837/* The IT blocks handling machinery is accessed through the these functions:
16838 it_fsm_pre_encode () from md_assemble ()
16839 set_it_insn_type () optional, from the tencode functions
16840 set_it_insn_type_last () ditto
16841 in_it_block () ditto
16842 it_fsm_post_encode () from md_assemble ()
16843 force_automatic_it_block_close () from label habdling functions
16844
16845 Rationale:
16846 1) md_assemble () calls it_fsm_pre_encode () before calling tencode (),
477330fc
RM
16847 initializing the IT insn type with a generic initial value depending
16848 on the inst.condition.
e07e6e58 16849 2) During the tencode function, two things may happen:
477330fc
RM
16850 a) The tencode function overrides the IT insn type by
16851 calling either set_it_insn_type (type) or set_it_insn_type_last ().
16852 b) The tencode function queries the IT block state by
16853 calling in_it_block () (i.e. to determine narrow/not narrow mode).
16854
16855 Both set_it_insn_type and in_it_block run the internal FSM state
16856 handling function (handle_it_state), because: a) setting the IT insn
16857 type may incur in an invalid state (exiting the function),
16858 and b) querying the state requires the FSM to be updated.
16859 Specifically we want to avoid creating an IT block for conditional
16860 branches, so it_fsm_pre_encode is actually a guess and we can't
16861 determine whether an IT block is required until the tencode () routine
16862 has decided what type of instruction this actually it.
16863 Because of this, if set_it_insn_type and in_it_block have to be used,
16864 set_it_insn_type has to be called first.
16865
16866 set_it_insn_type_last () is a wrapper of set_it_insn_type (type), that
16867 determines the insn IT type depending on the inst.cond code.
16868 When a tencode () routine encodes an instruction that can be
16869 either outside an IT block, or, in the case of being inside, has to be
16870 the last one, set_it_insn_type_last () will determine the proper
16871 IT instruction type based on the inst.cond code. Otherwise,
16872 set_it_insn_type can be called for overriding that logic or
16873 for covering other cases.
16874
16875 Calling handle_it_state () may not transition the IT block state to
16876 OUTSIDE_IT_BLOCK immediatelly, since the (current) state could be
16877 still queried. Instead, if the FSM determines that the state should
16878 be transitioned to OUTSIDE_IT_BLOCK, a flag is marked to be closed
16879 after the tencode () function: that's what it_fsm_post_encode () does.
16880
16881 Since in_it_block () calls the state handling function to get an
16882 updated state, an error may occur (due to invalid insns combination).
16883 In that case, inst.error is set.
16884 Therefore, inst.error has to be checked after the execution of
16885 the tencode () routine.
e07e6e58
NC
16886
16887 3) Back in md_assemble(), it_fsm_post_encode () is called to commit
477330fc
RM
16888 any pending state change (if any) that didn't take place in
16889 handle_it_state () as explained above. */
e07e6e58
NC
16890
16891static void
16892it_fsm_pre_encode (void)
16893{
16894 if (inst.cond != COND_ALWAYS)
16895 inst.it_insn_type = INSIDE_IT_INSN;
16896 else
16897 inst.it_insn_type = OUTSIDE_IT_INSN;
16898
16899 now_it.state_handled = 0;
16900}
16901
16902/* IT state FSM handling function. */
16903
16904static int
16905handle_it_state (void)
16906{
16907 now_it.state_handled = 1;
5a01bb1d 16908 now_it.insn_cond = FALSE;
e07e6e58
NC
16909
16910 switch (now_it.state)
16911 {
16912 case OUTSIDE_IT_BLOCK:
16913 switch (inst.it_insn_type)
16914 {
16915 case OUTSIDE_IT_INSN:
16916 break;
16917
16918 case INSIDE_IT_INSN:
16919 case INSIDE_IT_LAST_INSN:
16920 if (thumb_mode == 0)
16921 {
c921be7d 16922 if (unified_syntax
e07e6e58
NC
16923 && !(implicit_it_mode & IMPLICIT_IT_MODE_ARM))
16924 as_tsktsk (_("Warning: conditional outside an IT block"\
16925 " for Thumb."));
16926 }
16927 else
16928 {
16929 if ((implicit_it_mode & IMPLICIT_IT_MODE_THUMB)
16930 && ARM_CPU_HAS_FEATURE (cpu_variant, arm_arch_t2))
16931 {
16932 /* Automatically generate the IT instruction. */
16933 new_automatic_it_block (inst.cond);
16934 if (inst.it_insn_type == INSIDE_IT_LAST_INSN)
16935 close_automatic_it_block ();
16936 }
16937 else
16938 {
16939 inst.error = BAD_OUT_IT;
16940 return FAIL;
16941 }
16942 }
16943 break;
16944
16945 case IF_INSIDE_IT_LAST_INSN:
16946 case NEUTRAL_IT_INSN:
16947 break;
16948
16949 case IT_INSN:
16950 now_it.state = MANUAL_IT_BLOCK;
16951 now_it.block_length = 0;
16952 break;
16953 }
16954 break;
16955
16956 case AUTOMATIC_IT_BLOCK:
16957 /* Three things may happen now:
16958 a) We should increment current it block size;
16959 b) We should close current it block (closing insn or 4 insns);
16960 c) We should close current it block and start a new one (due
16961 to incompatible conditions or
16962 4 insns-length block reached). */
16963
16964 switch (inst.it_insn_type)
16965 {
16966 case OUTSIDE_IT_INSN:
16967 /* The closure of the block shall happen immediatelly,
16968 so any in_it_block () call reports the block as closed. */
16969 force_automatic_it_block_close ();
16970 break;
16971
16972 case INSIDE_IT_INSN:
16973 case INSIDE_IT_LAST_INSN:
16974 case IF_INSIDE_IT_LAST_INSN:
16975 now_it.block_length++;
16976
16977 if (now_it.block_length > 4
16978 || !now_it_compatible (inst.cond))
16979 {
16980 force_automatic_it_block_close ();
16981 if (inst.it_insn_type != IF_INSIDE_IT_LAST_INSN)
16982 new_automatic_it_block (inst.cond);
16983 }
16984 else
16985 {
5a01bb1d 16986 now_it.insn_cond = TRUE;
e07e6e58
NC
16987 now_it_add_mask (inst.cond);
16988 }
16989
16990 if (now_it.state == AUTOMATIC_IT_BLOCK
16991 && (inst.it_insn_type == INSIDE_IT_LAST_INSN
16992 || inst.it_insn_type == IF_INSIDE_IT_LAST_INSN))
16993 close_automatic_it_block ();
16994 break;
16995
16996 case NEUTRAL_IT_INSN:
16997 now_it.block_length++;
5a01bb1d 16998 now_it.insn_cond = TRUE;
e07e6e58
NC
16999
17000 if (now_it.block_length > 4)
17001 force_automatic_it_block_close ();
17002 else
17003 now_it_add_mask (now_it.cc & 1);
17004 break;
17005
17006 case IT_INSN:
17007 close_automatic_it_block ();
17008 now_it.state = MANUAL_IT_BLOCK;
17009 break;
17010 }
17011 break;
17012
17013 case MANUAL_IT_BLOCK:
17014 {
17015 /* Check conditional suffixes. */
17016 const int cond = now_it.cc ^ ((now_it.mask >> 4) & 1) ^ 1;
17017 int is_last;
17018 now_it.mask <<= 1;
17019 now_it.mask &= 0x1f;
17020 is_last = (now_it.mask == 0x10);
5a01bb1d 17021 now_it.insn_cond = TRUE;
e07e6e58
NC
17022
17023 switch (inst.it_insn_type)
17024 {
17025 case OUTSIDE_IT_INSN:
17026 inst.error = BAD_NOT_IT;
17027 return FAIL;
17028
17029 case INSIDE_IT_INSN:
17030 if (cond != inst.cond)
17031 {
17032 inst.error = BAD_IT_COND;
17033 return FAIL;
17034 }
17035 break;
17036
17037 case INSIDE_IT_LAST_INSN:
17038 case IF_INSIDE_IT_LAST_INSN:
17039 if (cond != inst.cond)
17040 {
17041 inst.error = BAD_IT_COND;
17042 return FAIL;
17043 }
17044 if (!is_last)
17045 {
17046 inst.error = BAD_BRANCH;
17047 return FAIL;
17048 }
17049 break;
17050
17051 case NEUTRAL_IT_INSN:
17052 /* The BKPT instruction is unconditional even in an IT block. */
17053 break;
17054
17055 case IT_INSN:
17056 inst.error = BAD_IT_IT;
17057 return FAIL;
17058 }
17059 }
17060 break;
17061 }
17062
17063 return SUCCESS;
17064}
17065
5a01bb1d
MGD
17066struct depr_insn_mask
17067{
17068 unsigned long pattern;
17069 unsigned long mask;
17070 const char* description;
17071};
17072
17073/* List of 16-bit instruction patterns deprecated in an IT block in
17074 ARMv8. */
17075static const struct depr_insn_mask depr_it_insns[] = {
17076 { 0xc000, 0xc000, N_("Short branches, Undefined, SVC, LDM/STM") },
17077 { 0xb000, 0xb000, N_("Miscellaneous 16-bit instructions") },
17078 { 0xa000, 0xb800, N_("ADR") },
17079 { 0x4800, 0xf800, N_("Literal loads") },
17080 { 0x4478, 0xf478, N_("Hi-register ADD, MOV, CMP, BX, BLX using pc") },
17081 { 0x4487, 0xfc87, N_("Hi-register ADD, MOV, CMP using pc") },
17082 { 0, 0, NULL }
17083};
17084
e07e6e58
NC
17085static void
17086it_fsm_post_encode (void)
17087{
17088 int is_last;
17089
17090 if (!now_it.state_handled)
17091 handle_it_state ();
17092
5a01bb1d
MGD
17093 if (now_it.insn_cond
17094 && !now_it.warn_deprecated
17095 && warn_on_deprecated
17096 && ARM_CPU_HAS_FEATURE (cpu_variant, arm_ext_v8))
17097 {
17098 if (inst.instruction >= 0x10000)
17099 {
0a8897c7 17100 as_warn (_("IT blocks containing 32-bit Thumb instructions are "
5a01bb1d
MGD
17101 "deprecated in ARMv8"));
17102 now_it.warn_deprecated = TRUE;
17103 }
17104 else
17105 {
17106 const struct depr_insn_mask *p = depr_it_insns;
17107
17108 while (p->mask != 0)
17109 {
17110 if ((inst.instruction & p->mask) == p->pattern)
17111 {
0a8897c7 17112 as_warn (_("IT blocks containing 16-bit Thumb instructions "
5a01bb1d
MGD
17113 "of the following class are deprecated in ARMv8: "
17114 "%s"), p->description);
17115 now_it.warn_deprecated = TRUE;
17116 break;
17117 }
17118
17119 ++p;
17120 }
17121 }
17122
17123 if (now_it.block_length > 1)
17124 {
0a8897c7
KT
17125 as_warn (_("IT blocks containing more than one conditional "
17126 "instruction are deprecated in ARMv8"));
5a01bb1d
MGD
17127 now_it.warn_deprecated = TRUE;
17128 }
17129 }
17130
e07e6e58
NC
17131 is_last = (now_it.mask == 0x10);
17132 if (is_last)
17133 {
17134 now_it.state = OUTSIDE_IT_BLOCK;
17135 now_it.mask = 0;
17136 }
17137}
17138
17139static void
17140force_automatic_it_block_close (void)
17141{
17142 if (now_it.state == AUTOMATIC_IT_BLOCK)
17143 {
17144 close_automatic_it_block ();
17145 now_it.state = OUTSIDE_IT_BLOCK;
17146 now_it.mask = 0;
17147 }
17148}
17149
17150static int
17151in_it_block (void)
17152{
17153 if (!now_it.state_handled)
17154 handle_it_state ();
17155
17156 return now_it.state != OUTSIDE_IT_BLOCK;
17157}
17158
c19d1205
ZW
17159void
17160md_assemble (char *str)
b99bd4ef 17161{
c19d1205
ZW
17162 char *p = str;
17163 const struct asm_opcode * opcode;
b99bd4ef 17164
c19d1205
ZW
17165 /* Align the previous label if needed. */
17166 if (last_label_seen != NULL)
b99bd4ef 17167 {
c19d1205
ZW
17168 symbol_set_frag (last_label_seen, frag_now);
17169 S_SET_VALUE (last_label_seen, (valueT) frag_now_fix ());
17170 S_SET_SEGMENT (last_label_seen, now_seg);
b99bd4ef
NC
17171 }
17172
c19d1205
ZW
17173 memset (&inst, '\0', sizeof (inst));
17174 inst.reloc.type = BFD_RELOC_UNUSED;
b99bd4ef 17175
c19d1205
ZW
17176 opcode = opcode_lookup (&p);
17177 if (!opcode)
b99bd4ef 17178 {
c19d1205 17179 /* It wasn't an instruction, but it might be a register alias of
dcbf9037 17180 the form alias .req reg, or a Neon .dn/.qn directive. */
c921be7d 17181 if (! create_register_alias (str, p)
477330fc 17182 && ! create_neon_reg_alias (str, p))
c19d1205 17183 as_bad (_("bad instruction `%s'"), str);
b99bd4ef 17184
b99bd4ef
NC
17185 return;
17186 }
17187
278df34e 17188 if (warn_on_deprecated && opcode->tag == OT_cinfix3_deprecated)
088fa78e
KH
17189 as_warn (_("s suffix on comparison instruction is deprecated"));
17190
037e8744
JB
17191 /* The value which unconditional instructions should have in place of the
17192 condition field. */
17193 inst.uncond_value = (opcode->tag == OT_csuffixF) ? 0xf : -1;
17194
c19d1205 17195 if (thumb_mode)
b99bd4ef 17196 {
e74cfd16 17197 arm_feature_set variant;
8f06b2d8
PB
17198
17199 variant = cpu_variant;
17200 /* Only allow coprocessor instructions on Thumb-2 capable devices. */
e74cfd16
PB
17201 if (!ARM_CPU_HAS_FEATURE (variant, arm_arch_t2))
17202 ARM_CLEAR_FEATURE (variant, variant, fpu_any_hard);
c19d1205 17203 /* Check that this instruction is supported for this CPU. */
62b3e311
PB
17204 if (!opcode->tvariant
17205 || (thumb_mode == 1
17206 && !ARM_CPU_HAS_FEATURE (variant, *opcode->tvariant)))
b99bd4ef 17207 {
bf3eeda7 17208 as_bad (_("selected processor does not support Thumb mode `%s'"), str);
b99bd4ef
NC
17209 return;
17210 }
c19d1205
ZW
17211 if (inst.cond != COND_ALWAYS && !unified_syntax
17212 && opcode->tencode != do_t_branch)
b99bd4ef 17213 {
c19d1205 17214 as_bad (_("Thumb does not support conditional execution"));
b99bd4ef
NC
17215 return;
17216 }
17217
752d5da4 17218 if (!ARM_CPU_HAS_FEATURE (variant, arm_ext_v6t2))
076d447c 17219 {
7e806470 17220 if (opcode->tencode != do_t_blx && opcode->tencode != do_t_branch23
752d5da4
NC
17221 && !(ARM_CPU_HAS_FEATURE(*opcode->tvariant, arm_ext_msr)
17222 || ARM_CPU_HAS_FEATURE(*opcode->tvariant, arm_ext_barrier)))
17223 {
17224 /* Two things are addressed here.
17225 1) Implicit require narrow instructions on Thumb-1.
17226 This avoids relaxation accidentally introducing Thumb-2
17227 instructions.
17228 2) Reject wide instructions in non Thumb-2 cores. */
17229 if (inst.size_req == 0)
17230 inst.size_req = 2;
17231 else if (inst.size_req == 4)
17232 {
bf3eeda7 17233 as_bad (_("selected processor does not support Thumb-2 mode `%s'"), str);
752d5da4
NC
17234 return;
17235 }
17236 }
076d447c
PB
17237 }
17238
c19d1205
ZW
17239 inst.instruction = opcode->tvalue;
17240
5be8be5d 17241 if (!parse_operands (p, opcode->operands, /*thumb=*/TRUE))
477330fc
RM
17242 {
17243 /* Prepare the it_insn_type for those encodings that don't set
17244 it. */
17245 it_fsm_pre_encode ();
c19d1205 17246
477330fc 17247 opcode->tencode ();
e07e6e58 17248
477330fc
RM
17249 it_fsm_post_encode ();
17250 }
e27ec89e 17251
0110f2b8 17252 if (!(inst.error || inst.relax))
b99bd4ef 17253 {
9c2799c2 17254 gas_assert (inst.instruction < 0xe800 || inst.instruction > 0xffff);
c19d1205
ZW
17255 inst.size = (inst.instruction > 0xffff ? 4 : 2);
17256 if (inst.size_req && inst.size_req != inst.size)
b99bd4ef 17257 {
c19d1205 17258 as_bad (_("cannot honor width suffix -- `%s'"), str);
b99bd4ef
NC
17259 return;
17260 }
17261 }
076d447c
PB
17262
17263 /* Something has gone badly wrong if we try to relax a fixed size
477330fc 17264 instruction. */
9c2799c2 17265 gas_assert (inst.size_req == 0 || !inst.relax);
076d447c 17266
e74cfd16
PB
17267 ARM_MERGE_FEATURE_SETS (thumb_arch_used, thumb_arch_used,
17268 *opcode->tvariant);
ee065d83 17269 /* Many Thumb-2 instructions also have Thumb-1 variants, so explicitly
708587a4 17270 set those bits when Thumb-2 32-bit instructions are seen. ie.
7e806470 17271 anything other than bl/blx and v6-M instructions.
ee065d83 17272 This is overly pessimistic for relaxable instructions. */
7e806470
PB
17273 if (((inst.size == 4 && (inst.instruction & 0xf800e800) != 0xf000e800)
17274 || inst.relax)
e07e6e58
NC
17275 && !(ARM_CPU_HAS_FEATURE (*opcode->tvariant, arm_ext_msr)
17276 || ARM_CPU_HAS_FEATURE (*opcode->tvariant, arm_ext_barrier)))
e74cfd16
PB
17277 ARM_MERGE_FEATURE_SETS (thumb_arch_used, thumb_arch_used,
17278 arm_ext_v6t2);
cd000bff 17279
88714cb8
DG
17280 check_neon_suffixes;
17281
cd000bff 17282 if (!inst.error)
c877a2f2
NC
17283 {
17284 mapping_state (MAP_THUMB);
17285 }
c19d1205 17286 }
3e9e4fcf 17287 else if (ARM_CPU_HAS_FEATURE (cpu_variant, arm_ext_v1))
c19d1205 17288 {
845b51d6
PB
17289 bfd_boolean is_bx;
17290
17291 /* bx is allowed on v5 cores, and sometimes on v4 cores. */
17292 is_bx = (opcode->aencode == do_bx);
17293
c19d1205 17294 /* Check that this instruction is supported for this CPU. */
845b51d6
PB
17295 if (!(is_bx && fix_v4bx)
17296 && !(opcode->avariant &&
17297 ARM_CPU_HAS_FEATURE (cpu_variant, *opcode->avariant)))
b99bd4ef 17298 {
bf3eeda7 17299 as_bad (_("selected processor does not support ARM mode `%s'"), str);
c19d1205 17300 return;
b99bd4ef 17301 }
c19d1205 17302 if (inst.size_req)
b99bd4ef 17303 {
c19d1205
ZW
17304 as_bad (_("width suffixes are invalid in ARM mode -- `%s'"), str);
17305 return;
b99bd4ef
NC
17306 }
17307
c19d1205
ZW
17308 inst.instruction = opcode->avalue;
17309 if (opcode->tag == OT_unconditionalF)
17310 inst.instruction |= 0xF << 28;
17311 else
17312 inst.instruction |= inst.cond << 28;
17313 inst.size = INSN_SIZE;
5be8be5d 17314 if (!parse_operands (p, opcode->operands, /*thumb=*/FALSE))
477330fc
RM
17315 {
17316 it_fsm_pre_encode ();
17317 opcode->aencode ();
17318 it_fsm_post_encode ();
17319 }
ee065d83 17320 /* Arm mode bx is marked as both v4T and v5 because it's still required
477330fc 17321 on a hypothetical non-thumb v5 core. */
845b51d6 17322 if (is_bx)
e74cfd16 17323 ARM_MERGE_FEATURE_SETS (arm_arch_used, arm_arch_used, arm_ext_v4t);
ee065d83 17324 else
e74cfd16
PB
17325 ARM_MERGE_FEATURE_SETS (arm_arch_used, arm_arch_used,
17326 *opcode->avariant);
88714cb8
DG
17327
17328 check_neon_suffixes;
17329
cd000bff 17330 if (!inst.error)
c877a2f2
NC
17331 {
17332 mapping_state (MAP_ARM);
17333 }
b99bd4ef 17334 }
3e9e4fcf
JB
17335 else
17336 {
17337 as_bad (_("attempt to use an ARM instruction on a Thumb-only processor "
17338 "-- `%s'"), str);
17339 return;
17340 }
c19d1205
ZW
17341 output_inst (str);
17342}
b99bd4ef 17343
e07e6e58
NC
17344static void
17345check_it_blocks_finished (void)
17346{
17347#ifdef OBJ_ELF
17348 asection *sect;
17349
17350 for (sect = stdoutput->sections; sect != NULL; sect = sect->next)
17351 if (seg_info (sect)->tc_segment_info_data.current_it.state
17352 == MANUAL_IT_BLOCK)
17353 {
17354 as_warn (_("section '%s' finished with an open IT block."),
17355 sect->name);
17356 }
17357#else
17358 if (now_it.state == MANUAL_IT_BLOCK)
17359 as_warn (_("file finished with an open IT block."));
17360#endif
17361}
17362
c19d1205
ZW
17363/* Various frobbings of labels and their addresses. */
17364
17365void
17366arm_start_line_hook (void)
17367{
17368 last_label_seen = NULL;
b99bd4ef
NC
17369}
17370
c19d1205
ZW
17371void
17372arm_frob_label (symbolS * sym)
b99bd4ef 17373{
c19d1205 17374 last_label_seen = sym;
b99bd4ef 17375
c19d1205 17376 ARM_SET_THUMB (sym, thumb_mode);
b99bd4ef 17377
c19d1205
ZW
17378#if defined OBJ_COFF || defined OBJ_ELF
17379 ARM_SET_INTERWORK (sym, support_interwork);
17380#endif
b99bd4ef 17381
e07e6e58
NC
17382 force_automatic_it_block_close ();
17383
5f4273c7 17384 /* Note - do not allow local symbols (.Lxxx) to be labelled
c19d1205
ZW
17385 as Thumb functions. This is because these labels, whilst
17386 they exist inside Thumb code, are not the entry points for
17387 possible ARM->Thumb calls. Also, these labels can be used
17388 as part of a computed goto or switch statement. eg gcc
17389 can generate code that looks like this:
b99bd4ef 17390
c19d1205
ZW
17391 ldr r2, [pc, .Laaa]
17392 lsl r3, r3, #2
17393 ldr r2, [r3, r2]
17394 mov pc, r2
b99bd4ef 17395
c19d1205
ZW
17396 .Lbbb: .word .Lxxx
17397 .Lccc: .word .Lyyy
17398 ..etc...
17399 .Laaa: .word Lbbb
b99bd4ef 17400
c19d1205
ZW
17401 The first instruction loads the address of the jump table.
17402 The second instruction converts a table index into a byte offset.
17403 The third instruction gets the jump address out of the table.
17404 The fourth instruction performs the jump.
b99bd4ef 17405
c19d1205
ZW
17406 If the address stored at .Laaa is that of a symbol which has the
17407 Thumb_Func bit set, then the linker will arrange for this address
17408 to have the bottom bit set, which in turn would mean that the
17409 address computation performed by the third instruction would end
17410 up with the bottom bit set. Since the ARM is capable of unaligned
17411 word loads, the instruction would then load the incorrect address
17412 out of the jump table, and chaos would ensue. */
17413 if (label_is_thumb_function_name
17414 && (S_GET_NAME (sym)[0] != '.' || S_GET_NAME (sym)[1] != 'L')
17415 && (bfd_get_section_flags (stdoutput, now_seg) & SEC_CODE) != 0)
b99bd4ef 17416 {
c19d1205
ZW
17417 /* When the address of a Thumb function is taken the bottom
17418 bit of that address should be set. This will allow
17419 interworking between Arm and Thumb functions to work
17420 correctly. */
b99bd4ef 17421
c19d1205 17422 THUMB_SET_FUNC (sym, 1);
b99bd4ef 17423
c19d1205 17424 label_is_thumb_function_name = FALSE;
b99bd4ef 17425 }
07a53e5c 17426
07a53e5c 17427 dwarf2_emit_label (sym);
b99bd4ef
NC
17428}
17429
c921be7d 17430bfd_boolean
c19d1205 17431arm_data_in_code (void)
b99bd4ef 17432{
c19d1205 17433 if (thumb_mode && ! strncmp (input_line_pointer + 1, "data:", 5))
b99bd4ef 17434 {
c19d1205
ZW
17435 *input_line_pointer = '/';
17436 input_line_pointer += 5;
17437 *input_line_pointer = 0;
c921be7d 17438 return TRUE;
b99bd4ef
NC
17439 }
17440
c921be7d 17441 return FALSE;
b99bd4ef
NC
17442}
17443
c19d1205
ZW
17444char *
17445arm_canonicalize_symbol_name (char * name)
b99bd4ef 17446{
c19d1205 17447 int len;
b99bd4ef 17448
c19d1205
ZW
17449 if (thumb_mode && (len = strlen (name)) > 5
17450 && streq (name + len - 5, "/data"))
17451 *(name + len - 5) = 0;
b99bd4ef 17452
c19d1205 17453 return name;
b99bd4ef 17454}
c19d1205
ZW
17455\f
17456/* Table of all register names defined by default. The user can
17457 define additional names with .req. Note that all register names
17458 should appear in both upper and lowercase variants. Some registers
17459 also have mixed-case names. */
b99bd4ef 17460
dcbf9037 17461#define REGDEF(s,n,t) { #s, n, REG_TYPE_##t, TRUE, 0 }
c19d1205 17462#define REGNUM(p,n,t) REGDEF(p##n, n, t)
5287ad62 17463#define REGNUM2(p,n,t) REGDEF(p##n, 2 * n, t)
c19d1205
ZW
17464#define REGSET(p,t) \
17465 REGNUM(p, 0,t), REGNUM(p, 1,t), REGNUM(p, 2,t), REGNUM(p, 3,t), \
17466 REGNUM(p, 4,t), REGNUM(p, 5,t), REGNUM(p, 6,t), REGNUM(p, 7,t), \
17467 REGNUM(p, 8,t), REGNUM(p, 9,t), REGNUM(p,10,t), REGNUM(p,11,t), \
17468 REGNUM(p,12,t), REGNUM(p,13,t), REGNUM(p,14,t), REGNUM(p,15,t)
5287ad62
JB
17469#define REGSETH(p,t) \
17470 REGNUM(p,16,t), REGNUM(p,17,t), REGNUM(p,18,t), REGNUM(p,19,t), \
17471 REGNUM(p,20,t), REGNUM(p,21,t), REGNUM(p,22,t), REGNUM(p,23,t), \
17472 REGNUM(p,24,t), REGNUM(p,25,t), REGNUM(p,26,t), REGNUM(p,27,t), \
17473 REGNUM(p,28,t), REGNUM(p,29,t), REGNUM(p,30,t), REGNUM(p,31,t)
17474#define REGSET2(p,t) \
17475 REGNUM2(p, 0,t), REGNUM2(p, 1,t), REGNUM2(p, 2,t), REGNUM2(p, 3,t), \
17476 REGNUM2(p, 4,t), REGNUM2(p, 5,t), REGNUM2(p, 6,t), REGNUM2(p, 7,t), \
17477 REGNUM2(p, 8,t), REGNUM2(p, 9,t), REGNUM2(p,10,t), REGNUM2(p,11,t), \
17478 REGNUM2(p,12,t), REGNUM2(p,13,t), REGNUM2(p,14,t), REGNUM2(p,15,t)
90ec0d68
MGD
17479#define SPLRBANK(base,bank,t) \
17480 REGDEF(lr_##bank, 768|((base+0)<<16), t), \
17481 REGDEF(sp_##bank, 768|((base+1)<<16), t), \
17482 REGDEF(spsr_##bank, 768|(base<<16)|SPSR_BIT, t), \
17483 REGDEF(LR_##bank, 768|((base+0)<<16), t), \
17484 REGDEF(SP_##bank, 768|((base+1)<<16), t), \
17485 REGDEF(SPSR_##bank, 768|(base<<16)|SPSR_BIT, t)
7ed4c4c5 17486
c19d1205 17487static const struct reg_entry reg_names[] =
7ed4c4c5 17488{
c19d1205
ZW
17489 /* ARM integer registers. */
17490 REGSET(r, RN), REGSET(R, RN),
7ed4c4c5 17491
c19d1205
ZW
17492 /* ATPCS synonyms. */
17493 REGDEF(a1,0,RN), REGDEF(a2,1,RN), REGDEF(a3, 2,RN), REGDEF(a4, 3,RN),
17494 REGDEF(v1,4,RN), REGDEF(v2,5,RN), REGDEF(v3, 6,RN), REGDEF(v4, 7,RN),
17495 REGDEF(v5,8,RN), REGDEF(v6,9,RN), REGDEF(v7,10,RN), REGDEF(v8,11,RN),
7ed4c4c5 17496
c19d1205
ZW
17497 REGDEF(A1,0,RN), REGDEF(A2,1,RN), REGDEF(A3, 2,RN), REGDEF(A4, 3,RN),
17498 REGDEF(V1,4,RN), REGDEF(V2,5,RN), REGDEF(V3, 6,RN), REGDEF(V4, 7,RN),
17499 REGDEF(V5,8,RN), REGDEF(V6,9,RN), REGDEF(V7,10,RN), REGDEF(V8,11,RN),
7ed4c4c5 17500
c19d1205
ZW
17501 /* Well-known aliases. */
17502 REGDEF(wr, 7,RN), REGDEF(sb, 9,RN), REGDEF(sl,10,RN), REGDEF(fp,11,RN),
17503 REGDEF(ip,12,RN), REGDEF(sp,13,RN), REGDEF(lr,14,RN), REGDEF(pc,15,RN),
17504
17505 REGDEF(WR, 7,RN), REGDEF(SB, 9,RN), REGDEF(SL,10,RN), REGDEF(FP,11,RN),
17506 REGDEF(IP,12,RN), REGDEF(SP,13,RN), REGDEF(LR,14,RN), REGDEF(PC,15,RN),
17507
17508 /* Coprocessor numbers. */
17509 REGSET(p, CP), REGSET(P, CP),
17510
17511 /* Coprocessor register numbers. The "cr" variants are for backward
17512 compatibility. */
17513 REGSET(c, CN), REGSET(C, CN),
17514 REGSET(cr, CN), REGSET(CR, CN),
17515
90ec0d68
MGD
17516 /* ARM banked registers. */
17517 REGDEF(R8_usr,512|(0<<16),RNB), REGDEF(r8_usr,512|(0<<16),RNB),
17518 REGDEF(R9_usr,512|(1<<16),RNB), REGDEF(r9_usr,512|(1<<16),RNB),
17519 REGDEF(R10_usr,512|(2<<16),RNB), REGDEF(r10_usr,512|(2<<16),RNB),
17520 REGDEF(R11_usr,512|(3<<16),RNB), REGDEF(r11_usr,512|(3<<16),RNB),
17521 REGDEF(R12_usr,512|(4<<16),RNB), REGDEF(r12_usr,512|(4<<16),RNB),
17522 REGDEF(SP_usr,512|(5<<16),RNB), REGDEF(sp_usr,512|(5<<16),RNB),
17523 REGDEF(LR_usr,512|(6<<16),RNB), REGDEF(lr_usr,512|(6<<16),RNB),
17524
17525 REGDEF(R8_fiq,512|(8<<16),RNB), REGDEF(r8_fiq,512|(8<<16),RNB),
17526 REGDEF(R9_fiq,512|(9<<16),RNB), REGDEF(r9_fiq,512|(9<<16),RNB),
17527 REGDEF(R10_fiq,512|(10<<16),RNB), REGDEF(r10_fiq,512|(10<<16),RNB),
17528 REGDEF(R11_fiq,512|(11<<16),RNB), REGDEF(r11_fiq,512|(11<<16),RNB),
17529 REGDEF(R12_fiq,512|(12<<16),RNB), REGDEF(r12_fiq,512|(12<<16),RNB),
1472d06f 17530 REGDEF(SP_fiq,512|(13<<16),RNB), REGDEF(sp_fiq,512|(13<<16),RNB),
90ec0d68
MGD
17531 REGDEF(LR_fiq,512|(14<<16),RNB), REGDEF(lr_fiq,512|(14<<16),RNB),
17532 REGDEF(SPSR_fiq,512|(14<<16)|SPSR_BIT,RNB), REGDEF(spsr_fiq,512|(14<<16)|SPSR_BIT,RNB),
17533
17534 SPLRBANK(0,IRQ,RNB), SPLRBANK(0,irq,RNB),
17535 SPLRBANK(2,SVC,RNB), SPLRBANK(2,svc,RNB),
17536 SPLRBANK(4,ABT,RNB), SPLRBANK(4,abt,RNB),
17537 SPLRBANK(6,UND,RNB), SPLRBANK(6,und,RNB),
17538 SPLRBANK(12,MON,RNB), SPLRBANK(12,mon,RNB),
17539 REGDEF(elr_hyp,768|(14<<16),RNB), REGDEF(ELR_hyp,768|(14<<16),RNB),
17540 REGDEF(sp_hyp,768|(15<<16),RNB), REGDEF(SP_hyp,768|(15<<16),RNB),
fa94de6b 17541 REGDEF(spsr_hyp,768|(14<<16)|SPSR_BIT,RNB),
90ec0d68
MGD
17542 REGDEF(SPSR_hyp,768|(14<<16)|SPSR_BIT,RNB),
17543
c19d1205
ZW
17544 /* FPA registers. */
17545 REGNUM(f,0,FN), REGNUM(f,1,FN), REGNUM(f,2,FN), REGNUM(f,3,FN),
17546 REGNUM(f,4,FN), REGNUM(f,5,FN), REGNUM(f,6,FN), REGNUM(f,7, FN),
17547
17548 REGNUM(F,0,FN), REGNUM(F,1,FN), REGNUM(F,2,FN), REGNUM(F,3,FN),
17549 REGNUM(F,4,FN), REGNUM(F,5,FN), REGNUM(F,6,FN), REGNUM(F,7, FN),
17550
17551 /* VFP SP registers. */
5287ad62
JB
17552 REGSET(s,VFS), REGSET(S,VFS),
17553 REGSETH(s,VFS), REGSETH(S,VFS),
c19d1205
ZW
17554
17555 /* VFP DP Registers. */
5287ad62
JB
17556 REGSET(d,VFD), REGSET(D,VFD),
17557 /* Extra Neon DP registers. */
17558 REGSETH(d,VFD), REGSETH(D,VFD),
17559
17560 /* Neon QP registers. */
17561 REGSET2(q,NQ), REGSET2(Q,NQ),
c19d1205
ZW
17562
17563 /* VFP control registers. */
17564 REGDEF(fpsid,0,VFC), REGDEF(fpscr,1,VFC), REGDEF(fpexc,8,VFC),
17565 REGDEF(FPSID,0,VFC), REGDEF(FPSCR,1,VFC), REGDEF(FPEXC,8,VFC),
cd2cf30b
PB
17566 REGDEF(fpinst,9,VFC), REGDEF(fpinst2,10,VFC),
17567 REGDEF(FPINST,9,VFC), REGDEF(FPINST2,10,VFC),
17568 REGDEF(mvfr0,7,VFC), REGDEF(mvfr1,6,VFC),
17569 REGDEF(MVFR0,7,VFC), REGDEF(MVFR1,6,VFC),
c19d1205
ZW
17570
17571 /* Maverick DSP coprocessor registers. */
17572 REGSET(mvf,MVF), REGSET(mvd,MVD), REGSET(mvfx,MVFX), REGSET(mvdx,MVDX),
17573 REGSET(MVF,MVF), REGSET(MVD,MVD), REGSET(MVFX,MVFX), REGSET(MVDX,MVDX),
17574
17575 REGNUM(mvax,0,MVAX), REGNUM(mvax,1,MVAX),
17576 REGNUM(mvax,2,MVAX), REGNUM(mvax,3,MVAX),
17577 REGDEF(dspsc,0,DSPSC),
17578
17579 REGNUM(MVAX,0,MVAX), REGNUM(MVAX,1,MVAX),
17580 REGNUM(MVAX,2,MVAX), REGNUM(MVAX,3,MVAX),
17581 REGDEF(DSPSC,0,DSPSC),
17582
17583 /* iWMMXt data registers - p0, c0-15. */
17584 REGSET(wr,MMXWR), REGSET(wR,MMXWR), REGSET(WR, MMXWR),
17585
17586 /* iWMMXt control registers - p1, c0-3. */
17587 REGDEF(wcid, 0,MMXWC), REGDEF(wCID, 0,MMXWC), REGDEF(WCID, 0,MMXWC),
17588 REGDEF(wcon, 1,MMXWC), REGDEF(wCon, 1,MMXWC), REGDEF(WCON, 1,MMXWC),
17589 REGDEF(wcssf, 2,MMXWC), REGDEF(wCSSF, 2,MMXWC), REGDEF(WCSSF, 2,MMXWC),
17590 REGDEF(wcasf, 3,MMXWC), REGDEF(wCASF, 3,MMXWC), REGDEF(WCASF, 3,MMXWC),
17591
17592 /* iWMMXt scalar (constant/offset) registers - p1, c8-11. */
17593 REGDEF(wcgr0, 8,MMXWCG), REGDEF(wCGR0, 8,MMXWCG), REGDEF(WCGR0, 8,MMXWCG),
17594 REGDEF(wcgr1, 9,MMXWCG), REGDEF(wCGR1, 9,MMXWCG), REGDEF(WCGR1, 9,MMXWCG),
17595 REGDEF(wcgr2,10,MMXWCG), REGDEF(wCGR2,10,MMXWCG), REGDEF(WCGR2,10,MMXWCG),
17596 REGDEF(wcgr3,11,MMXWCG), REGDEF(wCGR3,11,MMXWCG), REGDEF(WCGR3,11,MMXWCG),
17597
17598 /* XScale accumulator registers. */
17599 REGNUM(acc,0,XSCALE), REGNUM(ACC,0,XSCALE),
17600};
17601#undef REGDEF
17602#undef REGNUM
17603#undef REGSET
7ed4c4c5 17604
c19d1205
ZW
17605/* Table of all PSR suffixes. Bare "CPSR" and "SPSR" are handled
17606 within psr_required_here. */
17607static const struct asm_psr psrs[] =
17608{
17609 /* Backward compatibility notation. Note that "all" is no longer
17610 truly all possible PSR bits. */
17611 {"all", PSR_c | PSR_f},
17612 {"flg", PSR_f},
17613 {"ctl", PSR_c},
17614
17615 /* Individual flags. */
17616 {"f", PSR_f},
17617 {"c", PSR_c},
17618 {"x", PSR_x},
17619 {"s", PSR_s},
59b42a0d 17620
c19d1205
ZW
17621 /* Combinations of flags. */
17622 {"fs", PSR_f | PSR_s},
17623 {"fx", PSR_f | PSR_x},
17624 {"fc", PSR_f | PSR_c},
17625 {"sf", PSR_s | PSR_f},
17626 {"sx", PSR_s | PSR_x},
17627 {"sc", PSR_s | PSR_c},
17628 {"xf", PSR_x | PSR_f},
17629 {"xs", PSR_x | PSR_s},
17630 {"xc", PSR_x | PSR_c},
17631 {"cf", PSR_c | PSR_f},
17632 {"cs", PSR_c | PSR_s},
17633 {"cx", PSR_c | PSR_x},
17634 {"fsx", PSR_f | PSR_s | PSR_x},
17635 {"fsc", PSR_f | PSR_s | PSR_c},
17636 {"fxs", PSR_f | PSR_x | PSR_s},
17637 {"fxc", PSR_f | PSR_x | PSR_c},
17638 {"fcs", PSR_f | PSR_c | PSR_s},
17639 {"fcx", PSR_f | PSR_c | PSR_x},
17640 {"sfx", PSR_s | PSR_f | PSR_x},
17641 {"sfc", PSR_s | PSR_f | PSR_c},
17642 {"sxf", PSR_s | PSR_x | PSR_f},
17643 {"sxc", PSR_s | PSR_x | PSR_c},
17644 {"scf", PSR_s | PSR_c | PSR_f},
17645 {"scx", PSR_s | PSR_c | PSR_x},
17646 {"xfs", PSR_x | PSR_f | PSR_s},
17647 {"xfc", PSR_x | PSR_f | PSR_c},
17648 {"xsf", PSR_x | PSR_s | PSR_f},
17649 {"xsc", PSR_x | PSR_s | PSR_c},
17650 {"xcf", PSR_x | PSR_c | PSR_f},
17651 {"xcs", PSR_x | PSR_c | PSR_s},
17652 {"cfs", PSR_c | PSR_f | PSR_s},
17653 {"cfx", PSR_c | PSR_f | PSR_x},
17654 {"csf", PSR_c | PSR_s | PSR_f},
17655 {"csx", PSR_c | PSR_s | PSR_x},
17656 {"cxf", PSR_c | PSR_x | PSR_f},
17657 {"cxs", PSR_c | PSR_x | PSR_s},
17658 {"fsxc", PSR_f | PSR_s | PSR_x | PSR_c},
17659 {"fscx", PSR_f | PSR_s | PSR_c | PSR_x},
17660 {"fxsc", PSR_f | PSR_x | PSR_s | PSR_c},
17661 {"fxcs", PSR_f | PSR_x | PSR_c | PSR_s},
17662 {"fcsx", PSR_f | PSR_c | PSR_s | PSR_x},
17663 {"fcxs", PSR_f | PSR_c | PSR_x | PSR_s},
17664 {"sfxc", PSR_s | PSR_f | PSR_x | PSR_c},
17665 {"sfcx", PSR_s | PSR_f | PSR_c | PSR_x},
17666 {"sxfc", PSR_s | PSR_x | PSR_f | PSR_c},
17667 {"sxcf", PSR_s | PSR_x | PSR_c | PSR_f},
17668 {"scfx", PSR_s | PSR_c | PSR_f | PSR_x},
17669 {"scxf", PSR_s | PSR_c | PSR_x | PSR_f},
17670 {"xfsc", PSR_x | PSR_f | PSR_s | PSR_c},
17671 {"xfcs", PSR_x | PSR_f | PSR_c | PSR_s},
17672 {"xsfc", PSR_x | PSR_s | PSR_f | PSR_c},
17673 {"xscf", PSR_x | PSR_s | PSR_c | PSR_f},
17674 {"xcfs", PSR_x | PSR_c | PSR_f | PSR_s},
17675 {"xcsf", PSR_x | PSR_c | PSR_s | PSR_f},
17676 {"cfsx", PSR_c | PSR_f | PSR_s | PSR_x},
17677 {"cfxs", PSR_c | PSR_f | PSR_x | PSR_s},
17678 {"csfx", PSR_c | PSR_s | PSR_f | PSR_x},
17679 {"csxf", PSR_c | PSR_s | PSR_x | PSR_f},
17680 {"cxfs", PSR_c | PSR_x | PSR_f | PSR_s},
17681 {"cxsf", PSR_c | PSR_x | PSR_s | PSR_f},
17682};
17683
62b3e311
PB
17684/* Table of V7M psr names. */
17685static const struct asm_psr v7m_psrs[] =
17686{
2b744c99
PB
17687 {"apsr", 0 }, {"APSR", 0 },
17688 {"iapsr", 1 }, {"IAPSR", 1 },
17689 {"eapsr", 2 }, {"EAPSR", 2 },
17690 {"psr", 3 }, {"PSR", 3 },
17691 {"xpsr", 3 }, {"XPSR", 3 }, {"xPSR", 3 },
17692 {"ipsr", 5 }, {"IPSR", 5 },
17693 {"epsr", 6 }, {"EPSR", 6 },
17694 {"iepsr", 7 }, {"IEPSR", 7 },
17695 {"msp", 8 }, {"MSP", 8 },
17696 {"psp", 9 }, {"PSP", 9 },
17697 {"primask", 16}, {"PRIMASK", 16},
17698 {"basepri", 17}, {"BASEPRI", 17},
00bbc0bd
NC
17699 {"basepri_max", 18}, {"BASEPRI_MAX", 18},
17700 {"basepri_max", 18}, {"BASEPRI_MASK", 18}, /* Typo, preserved for backwards compatibility. */
2b744c99
PB
17701 {"faultmask", 19}, {"FAULTMASK", 19},
17702 {"control", 20}, {"CONTROL", 20}
62b3e311
PB
17703};
17704
c19d1205
ZW
17705/* Table of all shift-in-operand names. */
17706static const struct asm_shift_name shift_names [] =
b99bd4ef 17707{
c19d1205
ZW
17708 { "asl", SHIFT_LSL }, { "ASL", SHIFT_LSL },
17709 { "lsl", SHIFT_LSL }, { "LSL", SHIFT_LSL },
17710 { "lsr", SHIFT_LSR }, { "LSR", SHIFT_LSR },
17711 { "asr", SHIFT_ASR }, { "ASR", SHIFT_ASR },
17712 { "ror", SHIFT_ROR }, { "ROR", SHIFT_ROR },
17713 { "rrx", SHIFT_RRX }, { "RRX", SHIFT_RRX }
17714};
b99bd4ef 17715
c19d1205
ZW
17716/* Table of all explicit relocation names. */
17717#ifdef OBJ_ELF
17718static struct reloc_entry reloc_names[] =
17719{
17720 { "got", BFD_RELOC_ARM_GOT32 }, { "GOT", BFD_RELOC_ARM_GOT32 },
17721 { "gotoff", BFD_RELOC_ARM_GOTOFF }, { "GOTOFF", BFD_RELOC_ARM_GOTOFF },
17722 { "plt", BFD_RELOC_ARM_PLT32 }, { "PLT", BFD_RELOC_ARM_PLT32 },
17723 { "target1", BFD_RELOC_ARM_TARGET1 }, { "TARGET1", BFD_RELOC_ARM_TARGET1 },
17724 { "target2", BFD_RELOC_ARM_TARGET2 }, { "TARGET2", BFD_RELOC_ARM_TARGET2 },
17725 { "sbrel", BFD_RELOC_ARM_SBREL32 }, { "SBREL", BFD_RELOC_ARM_SBREL32 },
17726 { "tlsgd", BFD_RELOC_ARM_TLS_GD32}, { "TLSGD", BFD_RELOC_ARM_TLS_GD32},
17727 { "tlsldm", BFD_RELOC_ARM_TLS_LDM32}, { "TLSLDM", BFD_RELOC_ARM_TLS_LDM32},
17728 { "tlsldo", BFD_RELOC_ARM_TLS_LDO32}, { "TLSLDO", BFD_RELOC_ARM_TLS_LDO32},
17729 { "gottpoff",BFD_RELOC_ARM_TLS_IE32}, { "GOTTPOFF",BFD_RELOC_ARM_TLS_IE32},
b43420e6 17730 { "tpoff", BFD_RELOC_ARM_TLS_LE32}, { "TPOFF", BFD_RELOC_ARM_TLS_LE32},
0855e32b
NS
17731 { "got_prel", BFD_RELOC_ARM_GOT_PREL}, { "GOT_PREL", BFD_RELOC_ARM_GOT_PREL},
17732 { "tlsdesc", BFD_RELOC_ARM_TLS_GOTDESC},
477330fc 17733 { "TLSDESC", BFD_RELOC_ARM_TLS_GOTDESC},
0855e32b 17734 { "tlscall", BFD_RELOC_ARM_TLS_CALL},
477330fc 17735 { "TLSCALL", BFD_RELOC_ARM_TLS_CALL},
0855e32b 17736 { "tlsdescseq", BFD_RELOC_ARM_TLS_DESCSEQ},
477330fc 17737 { "TLSDESCSEQ", BFD_RELOC_ARM_TLS_DESCSEQ}
c19d1205
ZW
17738};
17739#endif
b99bd4ef 17740
c19d1205
ZW
17741/* Table of all conditional affixes. 0xF is not defined as a condition code. */
17742static const struct asm_cond conds[] =
17743{
17744 {"eq", 0x0},
17745 {"ne", 0x1},
17746 {"cs", 0x2}, {"hs", 0x2},
17747 {"cc", 0x3}, {"ul", 0x3}, {"lo", 0x3},
17748 {"mi", 0x4},
17749 {"pl", 0x5},
17750 {"vs", 0x6},
17751 {"vc", 0x7},
17752 {"hi", 0x8},
17753 {"ls", 0x9},
17754 {"ge", 0xa},
17755 {"lt", 0xb},
17756 {"gt", 0xc},
17757 {"le", 0xd},
17758 {"al", 0xe}
17759};
bfae80f2 17760
e797f7e0
MGD
17761#define UL_BARRIER(L,U,CODE,FEAT) \
17762 { L, CODE, ARM_FEATURE (FEAT, 0) }, \
17763 { U, CODE, ARM_FEATURE (FEAT, 0) }
17764
62b3e311
PB
17765static struct asm_barrier_opt barrier_opt_names[] =
17766{
e797f7e0
MGD
17767 UL_BARRIER ("sy", "SY", 0xf, ARM_EXT_BARRIER),
17768 UL_BARRIER ("st", "ST", 0xe, ARM_EXT_BARRIER),
17769 UL_BARRIER ("ld", "LD", 0xd, ARM_EXT_V8),
17770 UL_BARRIER ("ish", "ISH", 0xb, ARM_EXT_BARRIER),
17771 UL_BARRIER ("sh", "SH", 0xb, ARM_EXT_BARRIER),
17772 UL_BARRIER ("ishst", "ISHST", 0xa, ARM_EXT_BARRIER),
17773 UL_BARRIER ("shst", "SHST", 0xa, ARM_EXT_BARRIER),
17774 UL_BARRIER ("ishld", "ISHLD", 0x9, ARM_EXT_V8),
17775 UL_BARRIER ("un", "UN", 0x7, ARM_EXT_BARRIER),
17776 UL_BARRIER ("nsh", "NSH", 0x7, ARM_EXT_BARRIER),
17777 UL_BARRIER ("unst", "UNST", 0x6, ARM_EXT_BARRIER),
17778 UL_BARRIER ("nshst", "NSHST", 0x6, ARM_EXT_BARRIER),
17779 UL_BARRIER ("nshld", "NSHLD", 0x5, ARM_EXT_V8),
17780 UL_BARRIER ("osh", "OSH", 0x3, ARM_EXT_BARRIER),
17781 UL_BARRIER ("oshst", "OSHST", 0x2, ARM_EXT_BARRIER),
17782 UL_BARRIER ("oshld", "OSHLD", 0x1, ARM_EXT_V8)
62b3e311
PB
17783};
17784
e797f7e0
MGD
17785#undef UL_BARRIER
17786
c19d1205
ZW
17787/* Table of ARM-format instructions. */
17788
17789/* Macros for gluing together operand strings. N.B. In all cases
17790 other than OPS0, the trailing OP_stop comes from default
17791 zero-initialization of the unspecified elements of the array. */
17792#define OPS0() { OP_stop, }
17793#define OPS1(a) { OP_##a, }
17794#define OPS2(a,b) { OP_##a,OP_##b, }
17795#define OPS3(a,b,c) { OP_##a,OP_##b,OP_##c, }
17796#define OPS4(a,b,c,d) { OP_##a,OP_##b,OP_##c,OP_##d, }
17797#define OPS5(a,b,c,d,e) { OP_##a,OP_##b,OP_##c,OP_##d,OP_##e, }
17798#define OPS6(a,b,c,d,e,f) { OP_##a,OP_##b,OP_##c,OP_##d,OP_##e,OP_##f, }
17799
5be8be5d
DG
17800/* These macros are similar to the OPSn, but do not prepend the OP_ prefix.
17801 This is useful when mixing operands for ARM and THUMB, i.e. using the
17802 MIX_ARM_THUMB_OPERANDS macro.
17803 In order to use these macros, prefix the number of operands with _
17804 e.g. _3. */
17805#define OPS_1(a) { a, }
17806#define OPS_2(a,b) { a,b, }
17807#define OPS_3(a,b,c) { a,b,c, }
17808#define OPS_4(a,b,c,d) { a,b,c,d, }
17809#define OPS_5(a,b,c,d,e) { a,b,c,d,e, }
17810#define OPS_6(a,b,c,d,e,f) { a,b,c,d,e,f, }
17811
c19d1205
ZW
17812/* These macros abstract out the exact format of the mnemonic table and
17813 save some repeated characters. */
17814
17815/* The normal sort of mnemonic; has a Thumb variant; takes a conditional suffix. */
17816#define TxCE(mnem, op, top, nops, ops, ae, te) \
21d799b5 17817 { mnem, OPS##nops ops, OT_csuffix, 0x##op, top, ARM_VARIANT, \
1887dd22 17818 THUMB_VARIANT, do_##ae, do_##te }
c19d1205
ZW
17819
17820/* Two variants of the above - TCE for a numeric Thumb opcode, tCE for
17821 a T_MNEM_xyz enumerator. */
17822#define TCE(mnem, aop, top, nops, ops, ae, te) \
e07e6e58 17823 TxCE (mnem, aop, 0x##top, nops, ops, ae, te)
c19d1205 17824#define tCE(mnem, aop, top, nops, ops, ae, te) \
21d799b5 17825 TxCE (mnem, aop, T_MNEM##top, nops, ops, ae, te)
c19d1205
ZW
17826
17827/* Second most common sort of mnemonic: has a Thumb variant, takes a conditional
17828 infix after the third character. */
17829#define TxC3(mnem, op, top, nops, ops, ae, te) \
21d799b5 17830 { mnem, OPS##nops ops, OT_cinfix3, 0x##op, top, ARM_VARIANT, \
1887dd22 17831 THUMB_VARIANT, do_##ae, do_##te }
088fa78e 17832#define TxC3w(mnem, op, top, nops, ops, ae, te) \
21d799b5 17833 { mnem, OPS##nops ops, OT_cinfix3_deprecated, 0x##op, top, ARM_VARIANT, \
088fa78e 17834 THUMB_VARIANT, do_##ae, do_##te }
c19d1205 17835#define TC3(mnem, aop, top, nops, ops, ae, te) \
e07e6e58 17836 TxC3 (mnem, aop, 0x##top, nops, ops, ae, te)
088fa78e 17837#define TC3w(mnem, aop, top, nops, ops, ae, te) \
e07e6e58 17838 TxC3w (mnem, aop, 0x##top, nops, ops, ae, te)
c19d1205 17839#define tC3(mnem, aop, top, nops, ops, ae, te) \
21d799b5 17840 TxC3 (mnem, aop, T_MNEM##top, nops, ops, ae, te)
088fa78e 17841#define tC3w(mnem, aop, top, nops, ops, ae, te) \
21d799b5 17842 TxC3w (mnem, aop, T_MNEM##top, nops, ops, ae, te)
c19d1205 17843
c19d1205 17844/* Mnemonic that cannot be conditionalized. The ARM condition-code
dfa9f0d5
PB
17845 field is still 0xE. Many of the Thumb variants can be executed
17846 conditionally, so this is checked separately. */
c19d1205 17847#define TUE(mnem, op, top, nops, ops, ae, te) \
21d799b5 17848 { mnem, OPS##nops ops, OT_unconditional, 0x##op, 0x##top, ARM_VARIANT, \
1887dd22 17849 THUMB_VARIANT, do_##ae, do_##te }
c19d1205 17850
dd5181d5
KT
17851/* Same as TUE but the encoding function for ARM and Thumb modes is the same.
17852 Used by mnemonics that have very minimal differences in the encoding for
17853 ARM and Thumb variants and can be handled in a common function. */
17854#define TUEc(mnem, op, top, nops, ops, en) \
17855 { mnem, OPS##nops ops, OT_unconditional, 0x##op, 0x##top, ARM_VARIANT, \
17856 THUMB_VARIANT, do_##en, do_##en }
17857
c19d1205
ZW
17858/* Mnemonic that cannot be conditionalized, and bears 0xF in its ARM
17859 condition code field. */
17860#define TUF(mnem, op, top, nops, ops, ae, te) \
21d799b5 17861 { mnem, OPS##nops ops, OT_unconditionalF, 0x##op, 0x##top, ARM_VARIANT, \
1887dd22 17862 THUMB_VARIANT, do_##ae, do_##te }
c19d1205
ZW
17863
17864/* ARM-only variants of all the above. */
6a86118a 17865#define CE(mnem, op, nops, ops, ae) \
21d799b5 17866 { mnem, OPS##nops ops, OT_csuffix, 0x##op, 0x0, ARM_VARIANT, 0, do_##ae, NULL }
6a86118a
NC
17867
17868#define C3(mnem, op, nops, ops, ae) \
17869 { #mnem, OPS##nops ops, OT_cinfix3, 0x##op, 0x0, ARM_VARIANT, 0, do_##ae, NULL }
17870
e3cb604e
PB
17871/* Legacy mnemonics that always have conditional infix after the third
17872 character. */
17873#define CL(mnem, op, nops, ops, ae) \
21d799b5 17874 { mnem, OPS##nops ops, OT_cinfix3_legacy, \
e3cb604e
PB
17875 0x##op, 0x0, ARM_VARIANT, 0, do_##ae, NULL }
17876
8f06b2d8
PB
17877/* Coprocessor instructions. Isomorphic between Arm and Thumb-2. */
17878#define cCE(mnem, op, nops, ops, ae) \
21d799b5 17879 { mnem, OPS##nops ops, OT_csuffix, 0x##op, 0xe##op, ARM_VARIANT, ARM_VARIANT, do_##ae, do_##ae }
8f06b2d8 17880
e3cb604e
PB
17881/* Legacy coprocessor instructions where conditional infix and conditional
17882 suffix are ambiguous. For consistency this includes all FPA instructions,
17883 not just the potentially ambiguous ones. */
17884#define cCL(mnem, op, nops, ops, ae) \
21d799b5 17885 { mnem, OPS##nops ops, OT_cinfix3_legacy, \
e3cb604e
PB
17886 0x##op, 0xe##op, ARM_VARIANT, ARM_VARIANT, do_##ae, do_##ae }
17887
17888/* Coprocessor, takes either a suffix or a position-3 infix
17889 (for an FPA corner case). */
17890#define C3E(mnem, op, nops, ops, ae) \
21d799b5 17891 { mnem, OPS##nops ops, OT_csuf_or_in3, \
e3cb604e 17892 0x##op, 0xe##op, ARM_VARIANT, ARM_VARIANT, do_##ae, do_##ae }
8f06b2d8 17893
6a86118a 17894#define xCM_(m1, m2, m3, op, nops, ops, ae) \
21d799b5
NC
17895 { m1 #m2 m3, OPS##nops ops, \
17896 sizeof (#m2) == 1 ? OT_odd_infix_unc : OT_odd_infix_0 + sizeof (m1) - 1, \
6a86118a
NC
17897 0x##op, 0x0, ARM_VARIANT, 0, do_##ae, NULL }
17898
17899#define CM(m1, m2, op, nops, ops, ae) \
e07e6e58
NC
17900 xCM_ (m1, , m2, op, nops, ops, ae), \
17901 xCM_ (m1, eq, m2, op, nops, ops, ae), \
17902 xCM_ (m1, ne, m2, op, nops, ops, ae), \
17903 xCM_ (m1, cs, m2, op, nops, ops, ae), \
17904 xCM_ (m1, hs, m2, op, nops, ops, ae), \
17905 xCM_ (m1, cc, m2, op, nops, ops, ae), \
17906 xCM_ (m1, ul, m2, op, nops, ops, ae), \
17907 xCM_ (m1, lo, m2, op, nops, ops, ae), \
17908 xCM_ (m1, mi, m2, op, nops, ops, ae), \
17909 xCM_ (m1, pl, m2, op, nops, ops, ae), \
17910 xCM_ (m1, vs, m2, op, nops, ops, ae), \
17911 xCM_ (m1, vc, m2, op, nops, ops, ae), \
17912 xCM_ (m1, hi, m2, op, nops, ops, ae), \
17913 xCM_ (m1, ls, m2, op, nops, ops, ae), \
17914 xCM_ (m1, ge, m2, op, nops, ops, ae), \
17915 xCM_ (m1, lt, m2, op, nops, ops, ae), \
17916 xCM_ (m1, gt, m2, op, nops, ops, ae), \
17917 xCM_ (m1, le, m2, op, nops, ops, ae), \
17918 xCM_ (m1, al, m2, op, nops, ops, ae)
6a86118a
NC
17919
17920#define UE(mnem, op, nops, ops, ae) \
17921 { #mnem, OPS##nops ops, OT_unconditional, 0x##op, 0, ARM_VARIANT, 0, do_##ae, NULL }
17922
17923#define UF(mnem, op, nops, ops, ae) \
17924 { #mnem, OPS##nops ops, OT_unconditionalF, 0x##op, 0, ARM_VARIANT, 0, do_##ae, NULL }
17925
5287ad62
JB
17926/* Neon data-processing. ARM versions are unconditional with cond=0xf.
17927 The Thumb and ARM variants are mostly the same (bits 0-23 and 24/28), so we
17928 use the same encoding function for each. */
17929#define NUF(mnem, op, nops, ops, enc) \
17930 { #mnem, OPS##nops ops, OT_unconditionalF, 0x##op, 0x##op, \
17931 ARM_VARIANT, THUMB_VARIANT, do_##enc, do_##enc }
17932
17933/* Neon data processing, version which indirects through neon_enc_tab for
17934 the various overloaded versions of opcodes. */
17935#define nUF(mnem, op, nops, ops, enc) \
21d799b5 17936 { #mnem, OPS##nops ops, OT_unconditionalF, N_MNEM##op, N_MNEM##op, \
5287ad62
JB
17937 ARM_VARIANT, THUMB_VARIANT, do_##enc, do_##enc }
17938
17939/* Neon insn with conditional suffix for the ARM version, non-overloaded
17940 version. */
037e8744
JB
17941#define NCE_tag(mnem, op, nops, ops, enc, tag) \
17942 { #mnem, OPS##nops ops, tag, 0x##op, 0x##op, ARM_VARIANT, \
5287ad62
JB
17943 THUMB_VARIANT, do_##enc, do_##enc }
17944
037e8744 17945#define NCE(mnem, op, nops, ops, enc) \
e07e6e58 17946 NCE_tag (mnem, op, nops, ops, enc, OT_csuffix)
037e8744
JB
17947
17948#define NCEF(mnem, op, nops, ops, enc) \
e07e6e58 17949 NCE_tag (mnem, op, nops, ops, enc, OT_csuffixF)
037e8744 17950
5287ad62 17951/* Neon insn with conditional suffix for the ARM version, overloaded types. */
037e8744 17952#define nCE_tag(mnem, op, nops, ops, enc, tag) \
21d799b5 17953 { #mnem, OPS##nops ops, tag, N_MNEM##op, N_MNEM##op, \
5287ad62
JB
17954 ARM_VARIANT, THUMB_VARIANT, do_##enc, do_##enc }
17955
037e8744 17956#define nCE(mnem, op, nops, ops, enc) \
e07e6e58 17957 nCE_tag (mnem, op, nops, ops, enc, OT_csuffix)
037e8744
JB
17958
17959#define nCEF(mnem, op, nops, ops, enc) \
e07e6e58 17960 nCE_tag (mnem, op, nops, ops, enc, OT_csuffixF)
037e8744 17961
c19d1205
ZW
17962#define do_0 0
17963
c19d1205 17964static const struct asm_opcode insns[] =
bfae80f2 17965{
e74cfd16
PB
17966#define ARM_VARIANT &arm_ext_v1 /* Core ARM Instructions. */
17967#define THUMB_VARIANT &arm_ext_v4t
21d799b5
NC
17968 tCE("and", 0000000, _and, 3, (RR, oRR, SH), arit, t_arit3c),
17969 tC3("ands", 0100000, _ands, 3, (RR, oRR, SH), arit, t_arit3c),
17970 tCE("eor", 0200000, _eor, 3, (RR, oRR, SH), arit, t_arit3c),
17971 tC3("eors", 0300000, _eors, 3, (RR, oRR, SH), arit, t_arit3c),
17972 tCE("sub", 0400000, _sub, 3, (RR, oRR, SH), arit, t_add_sub),
17973 tC3("subs", 0500000, _subs, 3, (RR, oRR, SH), arit, t_add_sub),
17974 tCE("add", 0800000, _add, 3, (RR, oRR, SHG), arit, t_add_sub),
17975 tC3("adds", 0900000, _adds, 3, (RR, oRR, SHG), arit, t_add_sub),
17976 tCE("adc", 0a00000, _adc, 3, (RR, oRR, SH), arit, t_arit3c),
17977 tC3("adcs", 0b00000, _adcs, 3, (RR, oRR, SH), arit, t_arit3c),
17978 tCE("sbc", 0c00000, _sbc, 3, (RR, oRR, SH), arit, t_arit3),
17979 tC3("sbcs", 0d00000, _sbcs, 3, (RR, oRR, SH), arit, t_arit3),
17980 tCE("orr", 1800000, _orr, 3, (RR, oRR, SH), arit, t_arit3c),
17981 tC3("orrs", 1900000, _orrs, 3, (RR, oRR, SH), arit, t_arit3c),
17982 tCE("bic", 1c00000, _bic, 3, (RR, oRR, SH), arit, t_arit3),
17983 tC3("bics", 1d00000, _bics, 3, (RR, oRR, SH), arit, t_arit3),
c19d1205
ZW
17984
17985 /* The p-variants of tst/cmp/cmn/teq (below) are the pre-V6 mechanism
17986 for setting PSR flag bits. They are obsolete in V6 and do not
17987 have Thumb equivalents. */
21d799b5
NC
17988 tCE("tst", 1100000, _tst, 2, (RR, SH), cmp, t_mvn_tst),
17989 tC3w("tsts", 1100000, _tst, 2, (RR, SH), cmp, t_mvn_tst),
17990 CL("tstp", 110f000, 2, (RR, SH), cmp),
17991 tCE("cmp", 1500000, _cmp, 2, (RR, SH), cmp, t_mov_cmp),
17992 tC3w("cmps", 1500000, _cmp, 2, (RR, SH), cmp, t_mov_cmp),
17993 CL("cmpp", 150f000, 2, (RR, SH), cmp),
17994 tCE("cmn", 1700000, _cmn, 2, (RR, SH), cmp, t_mvn_tst),
17995 tC3w("cmns", 1700000, _cmn, 2, (RR, SH), cmp, t_mvn_tst),
17996 CL("cmnp", 170f000, 2, (RR, SH), cmp),
17997
17998 tCE("mov", 1a00000, _mov, 2, (RR, SH), mov, t_mov_cmp),
17999 tC3("movs", 1b00000, _movs, 2, (RR, SH), mov, t_mov_cmp),
18000 tCE("mvn", 1e00000, _mvn, 2, (RR, SH), mov, t_mvn_tst),
18001 tC3("mvns", 1f00000, _mvns, 2, (RR, SH), mov, t_mvn_tst),
18002
18003 tCE("ldr", 4100000, _ldr, 2, (RR, ADDRGLDR),ldst, t_ldst),
5be8be5d
DG
18004 tC3("ldrb", 4500000, _ldrb, 2, (RRnpc_npcsp, ADDRGLDR),ldst, t_ldst),
18005 tCE("str", 4000000, _str, _2, (MIX_ARM_THUMB_OPERANDS (OP_RR,
18006 OP_RRnpc),
18007 OP_ADDRGLDR),ldst, t_ldst),
18008 tC3("strb", 4400000, _strb, 2, (RRnpc_npcsp, ADDRGLDR),ldst, t_ldst),
21d799b5
NC
18009
18010 tCE("stm", 8800000, _stmia, 2, (RRw, REGLST), ldmstm, t_ldmstm),
18011 tC3("stmia", 8800000, _stmia, 2, (RRw, REGLST), ldmstm, t_ldmstm),
18012 tC3("stmea", 8800000, _stmia, 2, (RRw, REGLST), ldmstm, t_ldmstm),
18013 tCE("ldm", 8900000, _ldmia, 2, (RRw, REGLST), ldmstm, t_ldmstm),
18014 tC3("ldmia", 8900000, _ldmia, 2, (RRw, REGLST), ldmstm, t_ldmstm),
18015 tC3("ldmfd", 8900000, _ldmia, 2, (RRw, REGLST), ldmstm, t_ldmstm),
18016
18017 TCE("swi", f000000, df00, 1, (EXPi), swi, t_swi),
18018 TCE("svc", f000000, df00, 1, (EXPi), swi, t_swi),
18019 tCE("b", a000000, _b, 1, (EXPr), branch, t_branch),
18020 TCE("bl", b000000, f000f800, 1, (EXPr), bl, t_branch23),
bfae80f2 18021
c19d1205 18022 /* Pseudo ops. */
21d799b5 18023 tCE("adr", 28f0000, _adr, 2, (RR, EXP), adr, t_adr),
2fc8bdac 18024 C3(adrl, 28f0000, 2, (RR, EXP), adrl),
21d799b5 18025 tCE("nop", 1a00000, _nop, 1, (oI255c), nop, t_nop),
c19d1205
ZW
18026
18027 /* Thumb-compatibility pseudo ops. */
21d799b5
NC
18028 tCE("lsl", 1a00000, _lsl, 3, (RR, oRR, SH), shift, t_shift),
18029 tC3("lsls", 1b00000, _lsls, 3, (RR, oRR, SH), shift, t_shift),
18030 tCE("lsr", 1a00020, _lsr, 3, (RR, oRR, SH), shift, t_shift),
18031 tC3("lsrs", 1b00020, _lsrs, 3, (RR, oRR, SH), shift, t_shift),
18032 tCE("asr", 1a00040, _asr, 3, (RR, oRR, SH), shift, t_shift),
18033 tC3("asrs", 1b00040, _asrs, 3, (RR, oRR, SH), shift, t_shift),
18034 tCE("ror", 1a00060, _ror, 3, (RR, oRR, SH), shift, t_shift),
18035 tC3("rors", 1b00060, _rors, 3, (RR, oRR, SH), shift, t_shift),
18036 tCE("neg", 2600000, _neg, 2, (RR, RR), rd_rn, t_neg),
18037 tC3("negs", 2700000, _negs, 2, (RR, RR), rd_rn, t_neg),
18038 tCE("push", 92d0000, _push, 1, (REGLST), push_pop, t_push_pop),
18039 tCE("pop", 8bd0000, _pop, 1, (REGLST), push_pop, t_push_pop),
c19d1205 18040
16a4cf17 18041 /* These may simplify to neg. */
21d799b5
NC
18042 TCE("rsb", 0600000, ebc00000, 3, (RR, oRR, SH), arit, t_rsb),
18043 TC3("rsbs", 0700000, ebd00000, 3, (RR, oRR, SH), arit, t_rsb),
16a4cf17 18044
c921be7d
NC
18045#undef THUMB_VARIANT
18046#define THUMB_VARIANT & arm_ext_v6
18047
21d799b5 18048 TCE("cpy", 1a00000, 4600, 2, (RR, RR), rd_rm, t_cpy),
c19d1205
ZW
18049
18050 /* V1 instructions with no Thumb analogue prior to V6T2. */
c921be7d
NC
18051#undef THUMB_VARIANT
18052#define THUMB_VARIANT & arm_ext_v6t2
18053
21d799b5
NC
18054 TCE("teq", 1300000, ea900f00, 2, (RR, SH), cmp, t_mvn_tst),
18055 TC3w("teqs", 1300000, ea900f00, 2, (RR, SH), cmp, t_mvn_tst),
18056 CL("teqp", 130f000, 2, (RR, SH), cmp),
c19d1205 18057
5be8be5d
DG
18058 TC3("ldrt", 4300000, f8500e00, 2, (RRnpc_npcsp, ADDR),ldstt, t_ldstt),
18059 TC3("ldrbt", 4700000, f8100e00, 2, (RRnpc_npcsp, ADDR),ldstt, t_ldstt),
18060 TC3("strt", 4200000, f8400e00, 2, (RR_npcsp, ADDR), ldstt, t_ldstt),
18061 TC3("strbt", 4600000, f8000e00, 2, (RRnpc_npcsp, ADDR),ldstt, t_ldstt),
c19d1205 18062
21d799b5
NC
18063 TC3("stmdb", 9000000, e9000000, 2, (RRw, REGLST), ldmstm, t_ldmstm),
18064 TC3("stmfd", 9000000, e9000000, 2, (RRw, REGLST), ldmstm, t_ldmstm),
c19d1205 18065
21d799b5
NC
18066 TC3("ldmdb", 9100000, e9100000, 2, (RRw, REGLST), ldmstm, t_ldmstm),
18067 TC3("ldmea", 9100000, e9100000, 2, (RRw, REGLST), ldmstm, t_ldmstm),
c19d1205
ZW
18068
18069 /* V1 instructions with no Thumb analogue at all. */
21d799b5 18070 CE("rsc", 0e00000, 3, (RR, oRR, SH), arit),
c19d1205
ZW
18071 C3(rscs, 0f00000, 3, (RR, oRR, SH), arit),
18072
18073 C3(stmib, 9800000, 2, (RRw, REGLST), ldmstm),
18074 C3(stmfa, 9800000, 2, (RRw, REGLST), ldmstm),
18075 C3(stmda, 8000000, 2, (RRw, REGLST), ldmstm),
18076 C3(stmed, 8000000, 2, (RRw, REGLST), ldmstm),
18077 C3(ldmib, 9900000, 2, (RRw, REGLST), ldmstm),
18078 C3(ldmed, 9900000, 2, (RRw, REGLST), ldmstm),
18079 C3(ldmda, 8100000, 2, (RRw, REGLST), ldmstm),
18080 C3(ldmfa, 8100000, 2, (RRw, REGLST), ldmstm),
18081
c921be7d
NC
18082#undef ARM_VARIANT
18083#define ARM_VARIANT & arm_ext_v2 /* ARM 2 - multiplies. */
18084#undef THUMB_VARIANT
18085#define THUMB_VARIANT & arm_ext_v4t
18086
21d799b5
NC
18087 tCE("mul", 0000090, _mul, 3, (RRnpc, RRnpc, oRR), mul, t_mul),
18088 tC3("muls", 0100090, _muls, 3, (RRnpc, RRnpc, oRR), mul, t_mul),
c19d1205 18089
c921be7d
NC
18090#undef THUMB_VARIANT
18091#define THUMB_VARIANT & arm_ext_v6t2
18092
21d799b5 18093 TCE("mla", 0200090, fb000000, 4, (RRnpc, RRnpc, RRnpc, RRnpc), mlas, t_mla),
c19d1205
ZW
18094 C3(mlas, 0300090, 4, (RRnpc, RRnpc, RRnpc, RRnpc), mlas),
18095
18096 /* Generic coprocessor instructions. */
21d799b5
NC
18097 TCE("cdp", e000000, ee000000, 6, (RCP, I15b, RCN, RCN, RCN, oI7b), cdp, cdp),
18098 TCE("ldc", c100000, ec100000, 3, (RCP, RCN, ADDRGLDC), lstc, lstc),
18099 TC3("ldcl", c500000, ec500000, 3, (RCP, RCN, ADDRGLDC), lstc, lstc),
18100 TCE("stc", c000000, ec000000, 3, (RCP, RCN, ADDRGLDC), lstc, lstc),
18101 TC3("stcl", c400000, ec400000, 3, (RCP, RCN, ADDRGLDC), lstc, lstc),
18102 TCE("mcr", e000010, ee000010, 6, (RCP, I7b, RR, RCN, RCN, oI7b), co_reg, co_reg),
db472d6f 18103 TCE("mrc", e100010, ee100010, 6, (RCP, I7b, APSR_RR, RCN, RCN, oI7b), co_reg, co_reg),
c19d1205 18104
c921be7d
NC
18105#undef ARM_VARIANT
18106#define ARM_VARIANT & arm_ext_v2s /* ARM 3 - swp instructions. */
18107
21d799b5 18108 CE("swp", 1000090, 3, (RRnpc, RRnpc, RRnpcb), rd_rm_rn),
c19d1205
ZW
18109 C3(swpb, 1400090, 3, (RRnpc, RRnpc, RRnpcb), rd_rm_rn),
18110
c921be7d
NC
18111#undef ARM_VARIANT
18112#define ARM_VARIANT & arm_ext_v3 /* ARM 6 Status register instructions. */
18113#undef THUMB_VARIANT
18114#define THUMB_VARIANT & arm_ext_msr
18115
d2cd1205
JB
18116 TCE("mrs", 1000000, f3e08000, 2, (RRnpc, rPSR), mrs, t_mrs),
18117 TCE("msr", 120f000, f3808000, 2, (wPSR, RR_EXi), msr, t_msr),
c19d1205 18118
c921be7d
NC
18119#undef ARM_VARIANT
18120#define ARM_VARIANT & arm_ext_v3m /* ARM 7M long multiplies. */
18121#undef THUMB_VARIANT
18122#define THUMB_VARIANT & arm_ext_v6t2
18123
21d799b5
NC
18124 TCE("smull", 0c00090, fb800000, 4, (RRnpc, RRnpc, RRnpc, RRnpc), mull, t_mull),
18125 CM("smull","s", 0d00090, 4, (RRnpc, RRnpc, RRnpc, RRnpc), mull),
18126 TCE("umull", 0800090, fba00000, 4, (RRnpc, RRnpc, RRnpc, RRnpc), mull, t_mull),
18127 CM("umull","s", 0900090, 4, (RRnpc, RRnpc, RRnpc, RRnpc), mull),
18128 TCE("smlal", 0e00090, fbc00000, 4, (RRnpc, RRnpc, RRnpc, RRnpc), mull, t_mull),
18129 CM("smlal","s", 0f00090, 4, (RRnpc, RRnpc, RRnpc, RRnpc), mull),
18130 TCE("umlal", 0a00090, fbe00000, 4, (RRnpc, RRnpc, RRnpc, RRnpc), mull, t_mull),
18131 CM("umlal","s", 0b00090, 4, (RRnpc, RRnpc, RRnpc, RRnpc), mull),
c19d1205 18132
c921be7d
NC
18133#undef ARM_VARIANT
18134#define ARM_VARIANT & arm_ext_v4 /* ARM Architecture 4. */
18135#undef THUMB_VARIANT
18136#define THUMB_VARIANT & arm_ext_v4t
18137
5be8be5d
DG
18138 tC3("ldrh", 01000b0, _ldrh, 2, (RRnpc_npcsp, ADDRGLDRS), ldstv4, t_ldst),
18139 tC3("strh", 00000b0, _strh, 2, (RRnpc_npcsp, ADDRGLDRS), ldstv4, t_ldst),
18140 tC3("ldrsh", 01000f0, _ldrsh, 2, (RRnpc_npcsp, ADDRGLDRS), ldstv4, t_ldst),
18141 tC3("ldrsb", 01000d0, _ldrsb, 2, (RRnpc_npcsp, ADDRGLDRS), ldstv4, t_ldst),
56c0a61f
RE
18142 tC3("ldsh", 01000f0, _ldrsh, 2, (RRnpc_npcsp, ADDRGLDRS), ldstv4, t_ldst),
18143 tC3("ldsb", 01000d0, _ldrsb, 2, (RRnpc_npcsp, ADDRGLDRS), ldstv4, t_ldst),
c19d1205 18144
c921be7d
NC
18145#undef ARM_VARIANT
18146#define ARM_VARIANT & arm_ext_v4t_5
18147
c19d1205
ZW
18148 /* ARM Architecture 4T. */
18149 /* Note: bx (and blx) are required on V5, even if the processor does
18150 not support Thumb. */
21d799b5 18151 TCE("bx", 12fff10, 4700, 1, (RR), bx, t_bx),
c19d1205 18152
c921be7d
NC
18153#undef ARM_VARIANT
18154#define ARM_VARIANT & arm_ext_v5 /* ARM Architecture 5T. */
18155#undef THUMB_VARIANT
18156#define THUMB_VARIANT & arm_ext_v5t
18157
c19d1205
ZW
18158 /* Note: blx has 2 variants; the .value coded here is for
18159 BLX(2). Only this variant has conditional execution. */
21d799b5
NC
18160 TCE("blx", 12fff30, 4780, 1, (RR_EXr), blx, t_blx),
18161 TUE("bkpt", 1200070, be00, 1, (oIffffb), bkpt, t_bkpt),
c19d1205 18162
c921be7d
NC
18163#undef THUMB_VARIANT
18164#define THUMB_VARIANT & arm_ext_v6t2
18165
21d799b5
NC
18166 TCE("clz", 16f0f10, fab0f080, 2, (RRnpc, RRnpc), rd_rm, t_clz),
18167 TUF("ldc2", c100000, fc100000, 3, (RCP, RCN, ADDRGLDC), lstc, lstc),
18168 TUF("ldc2l", c500000, fc500000, 3, (RCP, RCN, ADDRGLDC), lstc, lstc),
18169 TUF("stc2", c000000, fc000000, 3, (RCP, RCN, ADDRGLDC), lstc, lstc),
18170 TUF("stc2l", c400000, fc400000, 3, (RCP, RCN, ADDRGLDC), lstc, lstc),
18171 TUF("cdp2", e000000, fe000000, 6, (RCP, I15b, RCN, RCN, RCN, oI7b), cdp, cdp),
18172 TUF("mcr2", e000010, fe000010, 6, (RCP, I7b, RR, RCN, RCN, oI7b), co_reg, co_reg),
18173 TUF("mrc2", e100010, fe100010, 6, (RCP, I7b, RR, RCN, RCN, oI7b), co_reg, co_reg),
c19d1205 18174
c921be7d
NC
18175#undef ARM_VARIANT
18176#define ARM_VARIANT & arm_ext_v5exp /* ARM Architecture 5TExP. */
9e3c6df6
PB
18177#undef THUMB_VARIANT
18178#define THUMB_VARIANT &arm_ext_v5exp
c921be7d 18179
21d799b5
NC
18180 TCE("smlabb", 1000080, fb100000, 4, (RRnpc, RRnpc, RRnpc, RRnpc), smla, t_mla),
18181 TCE("smlatb", 10000a0, fb100020, 4, (RRnpc, RRnpc, RRnpc, RRnpc), smla, t_mla),
18182 TCE("smlabt", 10000c0, fb100010, 4, (RRnpc, RRnpc, RRnpc, RRnpc), smla, t_mla),
18183 TCE("smlatt", 10000e0, fb100030, 4, (RRnpc, RRnpc, RRnpc, RRnpc), smla, t_mla),
c19d1205 18184
21d799b5
NC
18185 TCE("smlawb", 1200080, fb300000, 4, (RRnpc, RRnpc, RRnpc, RRnpc), smla, t_mla),
18186 TCE("smlawt", 12000c0, fb300010, 4, (RRnpc, RRnpc, RRnpc, RRnpc), smla, t_mla),
c19d1205 18187
21d799b5
NC
18188 TCE("smlalbb", 1400080, fbc00080, 4, (RRnpc, RRnpc, RRnpc, RRnpc), smlal, t_mlal),
18189 TCE("smlaltb", 14000a0, fbc000a0, 4, (RRnpc, RRnpc, RRnpc, RRnpc), smlal, t_mlal),
18190 TCE("smlalbt", 14000c0, fbc00090, 4, (RRnpc, RRnpc, RRnpc, RRnpc), smlal, t_mlal),
18191 TCE("smlaltt", 14000e0, fbc000b0, 4, (RRnpc, RRnpc, RRnpc, RRnpc), smlal, t_mlal),
c19d1205 18192
21d799b5
NC
18193 TCE("smulbb", 1600080, fb10f000, 3, (RRnpc, RRnpc, RRnpc), smul, t_simd),
18194 TCE("smultb", 16000a0, fb10f020, 3, (RRnpc, RRnpc, RRnpc), smul, t_simd),
18195 TCE("smulbt", 16000c0, fb10f010, 3, (RRnpc, RRnpc, RRnpc), smul, t_simd),
18196 TCE("smultt", 16000e0, fb10f030, 3, (RRnpc, RRnpc, RRnpc), smul, t_simd),
c19d1205 18197
21d799b5
NC
18198 TCE("smulwb", 12000a0, fb30f000, 3, (RRnpc, RRnpc, RRnpc), smul, t_simd),
18199 TCE("smulwt", 12000e0, fb30f010, 3, (RRnpc, RRnpc, RRnpc), smul, t_simd),
c19d1205 18200
03ee1b7f
NC
18201 TCE("qadd", 1000050, fa80f080, 3, (RRnpc, RRnpc, RRnpc), rd_rm_rn, t_simd2),
18202 TCE("qdadd", 1400050, fa80f090, 3, (RRnpc, RRnpc, RRnpc), rd_rm_rn, t_simd2),
18203 TCE("qsub", 1200050, fa80f0a0, 3, (RRnpc, RRnpc, RRnpc), rd_rm_rn, t_simd2),
18204 TCE("qdsub", 1600050, fa80f0b0, 3, (RRnpc, RRnpc, RRnpc), rd_rm_rn, t_simd2),
c19d1205 18205
c921be7d
NC
18206#undef ARM_VARIANT
18207#define ARM_VARIANT & arm_ext_v5e /* ARM Architecture 5TE. */
9e3c6df6
PB
18208#undef THUMB_VARIANT
18209#define THUMB_VARIANT &arm_ext_v6t2
c921be7d 18210
21d799b5 18211 TUF("pld", 450f000, f810f000, 1, (ADDR), pld, t_pld),
5be8be5d
DG
18212 TC3("ldrd", 00000d0, e8500000, 3, (RRnpc_npcsp, oRRnpc_npcsp, ADDRGLDRS),
18213 ldrd, t_ldstd),
18214 TC3("strd", 00000f0, e8400000, 3, (RRnpc_npcsp, oRRnpc_npcsp,
18215 ADDRGLDRS), ldrd, t_ldstd),
c19d1205 18216
21d799b5
NC
18217 TCE("mcrr", c400000, ec400000, 5, (RCP, I15b, RRnpc, RRnpc, RCN), co_reg2c, co_reg2c),
18218 TCE("mrrc", c500000, ec500000, 5, (RCP, I15b, RRnpc, RRnpc, RCN), co_reg2c, co_reg2c),
c19d1205 18219
c921be7d
NC
18220#undef ARM_VARIANT
18221#define ARM_VARIANT & arm_ext_v5j /* ARM Architecture 5TEJ. */
18222
21d799b5 18223 TCE("bxj", 12fff20, f3c08f00, 1, (RR), bxj, t_bxj),
c19d1205 18224
c921be7d
NC
18225#undef ARM_VARIANT
18226#define ARM_VARIANT & arm_ext_v6 /* ARM V6. */
18227#undef THUMB_VARIANT
18228#define THUMB_VARIANT & arm_ext_v6
18229
21d799b5
NC
18230 TUF("cpsie", 1080000, b660, 2, (CPSF, oI31b), cpsi, t_cpsi),
18231 TUF("cpsid", 10c0000, b670, 2, (CPSF, oI31b), cpsi, t_cpsi),
18232 tCE("rev", 6bf0f30, _rev, 2, (RRnpc, RRnpc), rd_rm, t_rev),
18233 tCE("rev16", 6bf0fb0, _rev16, 2, (RRnpc, RRnpc), rd_rm, t_rev),
18234 tCE("revsh", 6ff0fb0, _revsh, 2, (RRnpc, RRnpc), rd_rm, t_rev),
18235 tCE("sxth", 6bf0070, _sxth, 3, (RRnpc, RRnpc, oROR), sxth, t_sxth),
18236 tCE("uxth", 6ff0070, _uxth, 3, (RRnpc, RRnpc, oROR), sxth, t_sxth),
18237 tCE("sxtb", 6af0070, _sxtb, 3, (RRnpc, RRnpc, oROR), sxth, t_sxth),
18238 tCE("uxtb", 6ef0070, _uxtb, 3, (RRnpc, RRnpc, oROR), sxth, t_sxth),
18239 TUF("setend", 1010000, b650, 1, (ENDI), setend, t_setend),
c19d1205 18240
c921be7d
NC
18241#undef THUMB_VARIANT
18242#define THUMB_VARIANT & arm_ext_v6t2
18243
5be8be5d
DG
18244 TCE("ldrex", 1900f9f, e8500f00, 2, (RRnpc_npcsp, ADDR), ldrex, t_ldrex),
18245 TCE("strex", 1800f90, e8400000, 3, (RRnpc_npcsp, RRnpc_npcsp, ADDR),
18246 strex, t_strex),
21d799b5
NC
18247 TUF("mcrr2", c400000, fc400000, 5, (RCP, I15b, RRnpc, RRnpc, RCN), co_reg2c, co_reg2c),
18248 TUF("mrrc2", c500000, fc500000, 5, (RCP, I15b, RRnpc, RRnpc, RCN), co_reg2c, co_reg2c),
62b3e311 18249
21d799b5
NC
18250 TCE("ssat", 6a00010, f3000000, 4, (RRnpc, I32, RRnpc, oSHllar),ssat, t_ssat),
18251 TCE("usat", 6e00010, f3800000, 4, (RRnpc, I31, RRnpc, oSHllar),usat, t_usat),
62b3e311 18252
9e3c6df6 18253/* ARM V6 not included in V7M. */
c921be7d
NC
18254#undef THUMB_VARIANT
18255#define THUMB_VARIANT & arm_ext_v6_notm
9e3c6df6 18256 TUF("rfeia", 8900a00, e990c000, 1, (RRw), rfe, rfe),
d709e4e6 18257 TUF("rfe", 8900a00, e990c000, 1, (RRw), rfe, rfe),
9e3c6df6
PB
18258 UF(rfeib, 9900a00, 1, (RRw), rfe),
18259 UF(rfeda, 8100a00, 1, (RRw), rfe),
18260 TUF("rfedb", 9100a00, e810c000, 1, (RRw), rfe, rfe),
18261 TUF("rfefd", 8900a00, e990c000, 1, (RRw), rfe, rfe),
d709e4e6
RE
18262 UF(rfefa, 8100a00, 1, (RRw), rfe),
18263 TUF("rfeea", 9100a00, e810c000, 1, (RRw), rfe, rfe),
18264 UF(rfeed, 9900a00, 1, (RRw), rfe),
9e3c6df6 18265 TUF("srsia", 8c00500, e980c000, 2, (oRRw, I31w), srs, srs),
d709e4e6
RE
18266 TUF("srs", 8c00500, e980c000, 2, (oRRw, I31w), srs, srs),
18267 TUF("srsea", 8c00500, e980c000, 2, (oRRw, I31w), srs, srs),
9e3c6df6 18268 UF(srsib, 9c00500, 2, (oRRw, I31w), srs),
d709e4e6 18269 UF(srsfa, 9c00500, 2, (oRRw, I31w), srs),
9e3c6df6 18270 UF(srsda, 8400500, 2, (oRRw, I31w), srs),
d709e4e6 18271 UF(srsed, 8400500, 2, (oRRw, I31w), srs),
9e3c6df6 18272 TUF("srsdb", 9400500, e800c000, 2, (oRRw, I31w), srs, srs),
d709e4e6 18273 TUF("srsfd", 9400500, e800c000, 2, (oRRw, I31w), srs, srs),
c921be7d 18274
9e3c6df6
PB
18275/* ARM V6 not included in V7M (eg. integer SIMD). */
18276#undef THUMB_VARIANT
18277#define THUMB_VARIANT & arm_ext_v6_dsp
21d799b5
NC
18278 TUF("cps", 1020000, f3af8100, 1, (I31b), imm0, t_cps),
18279 TCE("pkhbt", 6800010, eac00000, 4, (RRnpc, RRnpc, RRnpc, oSHll), pkhbt, t_pkhbt),
18280 TCE("pkhtb", 6800050, eac00020, 4, (RRnpc, RRnpc, RRnpc, oSHar), pkhtb, t_pkhtb),
18281 TCE("qadd16", 6200f10, fa90f010, 3, (RRnpc, RRnpc, RRnpc), rd_rn_rm, t_simd),
18282 TCE("qadd8", 6200f90, fa80f010, 3, (RRnpc, RRnpc, RRnpc), rd_rn_rm, t_simd),
18283 TCE("qasx", 6200f30, faa0f010, 3, (RRnpc, RRnpc, RRnpc), rd_rn_rm, t_simd),
4f80ef3e 18284 /* Old name for QASX. */
21d799b5
NC
18285 TCE("qaddsubx", 6200f30, faa0f010, 3, (RRnpc, RRnpc, RRnpc), rd_rn_rm, t_simd),
18286 TCE("qsax", 6200f50, fae0f010, 3, (RRnpc, RRnpc, RRnpc), rd_rn_rm, t_simd),
4f80ef3e 18287 /* Old name for QSAX. */
21d799b5
NC
18288 TCE("qsubaddx", 6200f50, fae0f010, 3, (RRnpc, RRnpc, RRnpc), rd_rn_rm, t_simd),
18289 TCE("qsub16", 6200f70, fad0f010, 3, (RRnpc, RRnpc, RRnpc), rd_rn_rm, t_simd),
18290 TCE("qsub8", 6200ff0, fac0f010, 3, (RRnpc, RRnpc, RRnpc), rd_rn_rm, t_simd),
18291 TCE("sadd16", 6100f10, fa90f000, 3, (RRnpc, RRnpc, RRnpc), rd_rn_rm, t_simd),
18292 TCE("sadd8", 6100f90, fa80f000, 3, (RRnpc, RRnpc, RRnpc), rd_rn_rm, t_simd),
18293 TCE("sasx", 6100f30, faa0f000, 3, (RRnpc, RRnpc, RRnpc), rd_rn_rm, t_simd),
4f80ef3e 18294 /* Old name for SASX. */
21d799b5
NC
18295 TCE("saddsubx", 6100f30, faa0f000, 3, (RRnpc, RRnpc, RRnpc), rd_rn_rm, t_simd),
18296 TCE("shadd16", 6300f10, fa90f020, 3, (RRnpc, RRnpc, RRnpc), rd_rn_rm, t_simd),
18297 TCE("shadd8", 6300f90, fa80f020, 3, (RRnpc, RRnpc, RRnpc), rd_rn_rm, t_simd),
18298 TCE("shasx", 6300f30, faa0f020, 3, (RRnpc, RRnpc, RRnpc), rd_rn_rm, t_simd),
4f80ef3e 18299 /* Old name for SHASX. */
21d799b5
NC
18300 TCE("shaddsubx", 6300f30, faa0f020, 3, (RRnpc, RRnpc, RRnpc), rd_rn_rm, t_simd),
18301 TCE("shsax", 6300f50, fae0f020, 3, (RRnpc, RRnpc, RRnpc), rd_rn_rm, t_simd),
4f80ef3e 18302 /* Old name for SHSAX. */
21d799b5
NC
18303 TCE("shsubaddx", 6300f50, fae0f020, 3, (RRnpc, RRnpc, RRnpc), rd_rn_rm, t_simd),
18304 TCE("shsub16", 6300f70, fad0f020, 3, (RRnpc, RRnpc, RRnpc), rd_rn_rm, t_simd),
18305 TCE("shsub8", 6300ff0, fac0f020, 3, (RRnpc, RRnpc, RRnpc), rd_rn_rm, t_simd),
18306 TCE("ssax", 6100f50, fae0f000, 3, (RRnpc, RRnpc, RRnpc), rd_rn_rm, t_simd),
4f80ef3e 18307 /* Old name for SSAX. */
21d799b5
NC
18308 TCE("ssubaddx", 6100f50, fae0f000, 3, (RRnpc, RRnpc, RRnpc), rd_rn_rm, t_simd),
18309 TCE("ssub16", 6100f70, fad0f000, 3, (RRnpc, RRnpc, RRnpc), rd_rn_rm, t_simd),
18310 TCE("ssub8", 6100ff0, fac0f000, 3, (RRnpc, RRnpc, RRnpc), rd_rn_rm, t_simd),
18311 TCE("uadd16", 6500f10, fa90f040, 3, (RRnpc, RRnpc, RRnpc), rd_rn_rm, t_simd),
18312 TCE("uadd8", 6500f90, fa80f040, 3, (RRnpc, RRnpc, RRnpc), rd_rn_rm, t_simd),
18313 TCE("uasx", 6500f30, faa0f040, 3, (RRnpc, RRnpc, RRnpc), rd_rn_rm, t_simd),
4f80ef3e 18314 /* Old name for UASX. */
21d799b5
NC
18315 TCE("uaddsubx", 6500f30, faa0f040, 3, (RRnpc, RRnpc, RRnpc), rd_rn_rm, t_simd),
18316 TCE("uhadd16", 6700f10, fa90f060, 3, (RRnpc, RRnpc, RRnpc), rd_rn_rm, t_simd),
18317 TCE("uhadd8", 6700f90, fa80f060, 3, (RRnpc, RRnpc, RRnpc), rd_rn_rm, t_simd),
18318 TCE("uhasx", 6700f30, faa0f060, 3, (RRnpc, RRnpc, RRnpc), rd_rn_rm, t_simd),
4f80ef3e 18319 /* Old name for UHASX. */
21d799b5
NC
18320 TCE("uhaddsubx", 6700f30, faa0f060, 3, (RRnpc, RRnpc, RRnpc), rd_rn_rm, t_simd),
18321 TCE("uhsax", 6700f50, fae0f060, 3, (RRnpc, RRnpc, RRnpc), rd_rn_rm, t_simd),
4f80ef3e 18322 /* Old name for UHSAX. */
21d799b5
NC
18323 TCE("uhsubaddx", 6700f50, fae0f060, 3, (RRnpc, RRnpc, RRnpc), rd_rn_rm, t_simd),
18324 TCE("uhsub16", 6700f70, fad0f060, 3, (RRnpc, RRnpc, RRnpc), rd_rn_rm, t_simd),
18325 TCE("uhsub8", 6700ff0, fac0f060, 3, (RRnpc, RRnpc, RRnpc), rd_rn_rm, t_simd),
18326 TCE("uqadd16", 6600f10, fa90f050, 3, (RRnpc, RRnpc, RRnpc), rd_rn_rm, t_simd),
18327 TCE("uqadd8", 6600f90, fa80f050, 3, (RRnpc, RRnpc, RRnpc), rd_rn_rm, t_simd),
18328 TCE("uqasx", 6600f30, faa0f050, 3, (RRnpc, RRnpc, RRnpc), rd_rn_rm, t_simd),
4f80ef3e 18329 /* Old name for UQASX. */
21d799b5
NC
18330 TCE("uqaddsubx", 6600f30, faa0f050, 3, (RRnpc, RRnpc, RRnpc), rd_rn_rm, t_simd),
18331 TCE("uqsax", 6600f50, fae0f050, 3, (RRnpc, RRnpc, RRnpc), rd_rn_rm, t_simd),
4f80ef3e 18332 /* Old name for UQSAX. */
21d799b5
NC
18333 TCE("uqsubaddx", 6600f50, fae0f050, 3, (RRnpc, RRnpc, RRnpc), rd_rn_rm, t_simd),
18334 TCE("uqsub16", 6600f70, fad0f050, 3, (RRnpc, RRnpc, RRnpc), rd_rn_rm, t_simd),
18335 TCE("uqsub8", 6600ff0, fac0f050, 3, (RRnpc, RRnpc, RRnpc), rd_rn_rm, t_simd),
18336 TCE("usub16", 6500f70, fad0f040, 3, (RRnpc, RRnpc, RRnpc), rd_rn_rm, t_simd),
18337 TCE("usax", 6500f50, fae0f040, 3, (RRnpc, RRnpc, RRnpc), rd_rn_rm, t_simd),
4f80ef3e 18338 /* Old name for USAX. */
21d799b5
NC
18339 TCE("usubaddx", 6500f50, fae0f040, 3, (RRnpc, RRnpc, RRnpc), rd_rn_rm, t_simd),
18340 TCE("usub8", 6500ff0, fac0f040, 3, (RRnpc, RRnpc, RRnpc), rd_rn_rm, t_simd),
21d799b5
NC
18341 TCE("sxtah", 6b00070, fa00f080, 4, (RRnpc, RRnpc, RRnpc, oROR), sxtah, t_sxtah),
18342 TCE("sxtab16", 6800070, fa20f080, 4, (RRnpc, RRnpc, RRnpc, oROR), sxtah, t_sxtah),
18343 TCE("sxtab", 6a00070, fa40f080, 4, (RRnpc, RRnpc, RRnpc, oROR), sxtah, t_sxtah),
18344 TCE("sxtb16", 68f0070, fa2ff080, 3, (RRnpc, RRnpc, oROR), sxth, t_sxth),
18345 TCE("uxtah", 6f00070, fa10f080, 4, (RRnpc, RRnpc, RRnpc, oROR), sxtah, t_sxtah),
18346 TCE("uxtab16", 6c00070, fa30f080, 4, (RRnpc, RRnpc, RRnpc, oROR), sxtah, t_sxtah),
18347 TCE("uxtab", 6e00070, fa50f080, 4, (RRnpc, RRnpc, RRnpc, oROR), sxtah, t_sxtah),
18348 TCE("uxtb16", 6cf0070, fa3ff080, 3, (RRnpc, RRnpc, oROR), sxth, t_sxth),
18349 TCE("sel", 6800fb0, faa0f080, 3, (RRnpc, RRnpc, RRnpc), rd_rn_rm, t_simd),
18350 TCE("smlad", 7000010, fb200000, 4, (RRnpc, RRnpc, RRnpc, RRnpc),smla, t_mla),
18351 TCE("smladx", 7000030, fb200010, 4, (RRnpc, RRnpc, RRnpc, RRnpc),smla, t_mla),
18352 TCE("smlald", 7400010, fbc000c0, 4, (RRnpc, RRnpc, RRnpc, RRnpc),smlal,t_mlal),
18353 TCE("smlaldx", 7400030, fbc000d0, 4, (RRnpc, RRnpc, RRnpc, RRnpc),smlal,t_mlal),
18354 TCE("smlsd", 7000050, fb400000, 4, (RRnpc, RRnpc, RRnpc, RRnpc),smla, t_mla),
18355 TCE("smlsdx", 7000070, fb400010, 4, (RRnpc, RRnpc, RRnpc, RRnpc),smla, t_mla),
18356 TCE("smlsld", 7400050, fbd000c0, 4, (RRnpc, RRnpc, RRnpc, RRnpc),smlal,t_mlal),
18357 TCE("smlsldx", 7400070, fbd000d0, 4, (RRnpc, RRnpc, RRnpc, RRnpc),smlal,t_mlal),
18358 TCE("smmla", 7500010, fb500000, 4, (RRnpc, RRnpc, RRnpc, RRnpc),smla, t_mla),
18359 TCE("smmlar", 7500030, fb500010, 4, (RRnpc, RRnpc, RRnpc, RRnpc),smla, t_mla),
18360 TCE("smmls", 75000d0, fb600000, 4, (RRnpc, RRnpc, RRnpc, RRnpc),smla, t_mla),
18361 TCE("smmlsr", 75000f0, fb600010, 4, (RRnpc, RRnpc, RRnpc, RRnpc),smla, t_mla),
18362 TCE("smmul", 750f010, fb50f000, 3, (RRnpc, RRnpc, RRnpc), smul, t_simd),
18363 TCE("smmulr", 750f030, fb50f010, 3, (RRnpc, RRnpc, RRnpc), smul, t_simd),
18364 TCE("smuad", 700f010, fb20f000, 3, (RRnpc, RRnpc, RRnpc), smul, t_simd),
18365 TCE("smuadx", 700f030, fb20f010, 3, (RRnpc, RRnpc, RRnpc), smul, t_simd),
18366 TCE("smusd", 700f050, fb40f000, 3, (RRnpc, RRnpc, RRnpc), smul, t_simd),
18367 TCE("smusdx", 700f070, fb40f010, 3, (RRnpc, RRnpc, RRnpc), smul, t_simd),
21d799b5
NC
18368 TCE("ssat16", 6a00f30, f3200000, 3, (RRnpc, I16, RRnpc), ssat16, t_ssat16),
18369 TCE("umaal", 0400090, fbe00060, 4, (RRnpc, RRnpc, RRnpc, RRnpc),smlal, t_mlal),
18370 TCE("usad8", 780f010, fb70f000, 3, (RRnpc, RRnpc, RRnpc), smul, t_simd),
18371 TCE("usada8", 7800010, fb700000, 4, (RRnpc, RRnpc, RRnpc, RRnpc),smla, t_mla),
18372 TCE("usat16", 6e00f30, f3a00000, 3, (RRnpc, I15, RRnpc), usat16, t_usat16),
c19d1205 18373
c921be7d
NC
18374#undef ARM_VARIANT
18375#define ARM_VARIANT & arm_ext_v6k
18376#undef THUMB_VARIANT
18377#define THUMB_VARIANT & arm_ext_v6k
18378
21d799b5
NC
18379 tCE("yield", 320f001, _yield, 0, (), noargs, t_hint),
18380 tCE("wfe", 320f002, _wfe, 0, (), noargs, t_hint),
18381 tCE("wfi", 320f003, _wfi, 0, (), noargs, t_hint),
18382 tCE("sev", 320f004, _sev, 0, (), noargs, t_hint),
c19d1205 18383
c921be7d
NC
18384#undef THUMB_VARIANT
18385#define THUMB_VARIANT & arm_ext_v6_notm
5be8be5d
DG
18386 TCE("ldrexd", 1b00f9f, e8d0007f, 3, (RRnpc_npcsp, oRRnpc_npcsp, RRnpcb),
18387 ldrexd, t_ldrexd),
18388 TCE("strexd", 1a00f90, e8c00070, 4, (RRnpc_npcsp, RRnpc_npcsp, oRRnpc_npcsp,
18389 RRnpcb), strexd, t_strexd),
ebdca51a 18390
c921be7d
NC
18391#undef THUMB_VARIANT
18392#define THUMB_VARIANT & arm_ext_v6t2
5be8be5d
DG
18393 TCE("ldrexb", 1d00f9f, e8d00f4f, 2, (RRnpc_npcsp,RRnpcb),
18394 rd_rn, rd_rn),
18395 TCE("ldrexh", 1f00f9f, e8d00f5f, 2, (RRnpc_npcsp, RRnpcb),
18396 rd_rn, rd_rn),
18397 TCE("strexb", 1c00f90, e8c00f40, 3, (RRnpc_npcsp, RRnpc_npcsp, ADDR),
877807f8 18398 strex, t_strexbh),
5be8be5d 18399 TCE("strexh", 1e00f90, e8c00f50, 3, (RRnpc_npcsp, RRnpc_npcsp, ADDR),
877807f8 18400 strex, t_strexbh),
21d799b5 18401 TUF("clrex", 57ff01f, f3bf8f2f, 0, (), noargs, noargs),
c19d1205 18402
c921be7d 18403#undef ARM_VARIANT
f4c65163
MGD
18404#define ARM_VARIANT & arm_ext_sec
18405#undef THUMB_VARIANT
18406#define THUMB_VARIANT & arm_ext_sec
c921be7d 18407
21d799b5 18408 TCE("smc", 1600070, f7f08000, 1, (EXPi), smc, t_smc),
c19d1205 18409
90ec0d68
MGD
18410#undef ARM_VARIANT
18411#define ARM_VARIANT & arm_ext_virt
18412#undef THUMB_VARIANT
18413#define THUMB_VARIANT & arm_ext_virt
18414
18415 TCE("hvc", 1400070, f7e08000, 1, (EXPi), hvc, t_hvc),
18416 TCE("eret", 160006e, f3de8f00, 0, (), noargs, noargs),
18417
c921be7d
NC
18418#undef ARM_VARIANT
18419#define ARM_VARIANT & arm_ext_v6t2
f4c65163
MGD
18420#undef THUMB_VARIANT
18421#define THUMB_VARIANT & arm_ext_v6t2
c921be7d 18422
21d799b5
NC
18423 TCE("bfc", 7c0001f, f36f0000, 3, (RRnpc, I31, I32), bfc, t_bfc),
18424 TCE("bfi", 7c00010, f3600000, 4, (RRnpc, RRnpc_I0, I31, I32), bfi, t_bfi),
18425 TCE("sbfx", 7a00050, f3400000, 4, (RR, RR, I31, I32), bfx, t_bfx),
18426 TCE("ubfx", 7e00050, f3c00000, 4, (RR, RR, I31, I32), bfx, t_bfx),
c19d1205 18427
21d799b5
NC
18428 TCE("mls", 0600090, fb000010, 4, (RRnpc, RRnpc, RRnpc, RRnpc), mlas, t_mla),
18429 TCE("movw", 3000000, f2400000, 2, (RRnpc, HALF), mov16, t_mov16),
18430 TCE("movt", 3400000, f2c00000, 2, (RRnpc, HALF), mov16, t_mov16),
18431 TCE("rbit", 6ff0f30, fa90f0a0, 2, (RR, RR), rd_rm, t_rbit),
c19d1205 18432
5be8be5d
DG
18433 TC3("ldrht", 03000b0, f8300e00, 2, (RRnpc_npcsp, ADDR), ldsttv4, t_ldstt),
18434 TC3("ldrsht", 03000f0, f9300e00, 2, (RRnpc_npcsp, ADDR), ldsttv4, t_ldstt),
18435 TC3("ldrsbt", 03000d0, f9100e00, 2, (RRnpc_npcsp, ADDR), ldsttv4, t_ldstt),
18436 TC3("strht", 02000b0, f8200e00, 2, (RRnpc_npcsp, ADDR), ldsttv4, t_ldstt),
c19d1205 18437
bf3eeda7
NS
18438 /* Thumb-only instructions. */
18439#undef ARM_VARIANT
18440#define ARM_VARIANT NULL
18441 TUE("cbnz", 0, b900, 2, (RR, EXP), 0, t_cbz),
18442 TUE("cbz", 0, b100, 2, (RR, EXP), 0, t_cbz),
c921be7d
NC
18443
18444 /* ARM does not really have an IT instruction, so always allow it.
18445 The opcode is copied from Thumb in order to allow warnings in
18446 -mimplicit-it=[never | arm] modes. */
18447#undef ARM_VARIANT
18448#define ARM_VARIANT & arm_ext_v1
18449
21d799b5
NC
18450 TUE("it", bf08, bf08, 1, (COND), it, t_it),
18451 TUE("itt", bf0c, bf0c, 1, (COND), it, t_it),
18452 TUE("ite", bf04, bf04, 1, (COND), it, t_it),
18453 TUE("ittt", bf0e, bf0e, 1, (COND), it, t_it),
18454 TUE("itet", bf06, bf06, 1, (COND), it, t_it),
18455 TUE("itte", bf0a, bf0a, 1, (COND), it, t_it),
18456 TUE("itee", bf02, bf02, 1, (COND), it, t_it),
18457 TUE("itttt", bf0f, bf0f, 1, (COND), it, t_it),
18458 TUE("itett", bf07, bf07, 1, (COND), it, t_it),
18459 TUE("ittet", bf0b, bf0b, 1, (COND), it, t_it),
18460 TUE("iteet", bf03, bf03, 1, (COND), it, t_it),
18461 TUE("ittte", bf0d, bf0d, 1, (COND), it, t_it),
18462 TUE("itete", bf05, bf05, 1, (COND), it, t_it),
18463 TUE("ittee", bf09, bf09, 1, (COND), it, t_it),
18464 TUE("iteee", bf01, bf01, 1, (COND), it, t_it),
1c444d06 18465 /* ARM/Thumb-2 instructions with no Thumb-1 equivalent. */
21d799b5
NC
18466 TC3("rrx", 01a00060, ea4f0030, 2, (RR, RR), rd_rm, t_rrx),
18467 TC3("rrxs", 01b00060, ea5f0030, 2, (RR, RR), rd_rm, t_rrx),
c19d1205 18468
92e90b6e 18469 /* Thumb2 only instructions. */
c921be7d
NC
18470#undef ARM_VARIANT
18471#define ARM_VARIANT NULL
92e90b6e 18472
21d799b5
NC
18473 TCE("addw", 0, f2000000, 3, (RR, RR, EXPi), 0, t_add_sub_w),
18474 TCE("subw", 0, f2a00000, 3, (RR, RR, EXPi), 0, t_add_sub_w),
18475 TCE("orn", 0, ea600000, 3, (RR, oRR, SH), 0, t_orn),
18476 TCE("orns", 0, ea700000, 3, (RR, oRR, SH), 0, t_orn),
18477 TCE("tbb", 0, e8d0f000, 1, (TB), 0, t_tb),
18478 TCE("tbh", 0, e8d0f010, 1, (TB), 0, t_tb),
92e90b6e 18479
eea54501
MGD
18480 /* Hardware division instructions. */
18481#undef ARM_VARIANT
18482#define ARM_VARIANT & arm_ext_adiv
c921be7d
NC
18483#undef THUMB_VARIANT
18484#define THUMB_VARIANT & arm_ext_div
18485
eea54501
MGD
18486 TCE("sdiv", 710f010, fb90f0f0, 3, (RR, oRR, RR), div, t_div),
18487 TCE("udiv", 730f010, fbb0f0f0, 3, (RR, oRR, RR), div, t_div),
62b3e311 18488
7e806470 18489 /* ARM V6M/V7 instructions. */
c921be7d
NC
18490#undef ARM_VARIANT
18491#define ARM_VARIANT & arm_ext_barrier
18492#undef THUMB_VARIANT
18493#define THUMB_VARIANT & arm_ext_barrier
18494
ccb84d65
JB
18495 TUF("dmb", 57ff050, f3bf8f50, 1, (oBARRIER_I15), barrier, barrier),
18496 TUF("dsb", 57ff040, f3bf8f40, 1, (oBARRIER_I15), barrier, barrier),
18497 TUF("isb", 57ff060, f3bf8f60, 1, (oBARRIER_I15), barrier, barrier),
7e806470 18498
62b3e311 18499 /* ARM V7 instructions. */
c921be7d
NC
18500#undef ARM_VARIANT
18501#define ARM_VARIANT & arm_ext_v7
18502#undef THUMB_VARIANT
18503#define THUMB_VARIANT & arm_ext_v7
18504
21d799b5
NC
18505 TUF("pli", 450f000, f910f000, 1, (ADDR), pli, t_pld),
18506 TCE("dbg", 320f0f0, f3af80f0, 1, (I15), dbg, t_dbg),
62b3e311 18507
60e5ef9f
MGD
18508#undef ARM_VARIANT
18509#define ARM_VARIANT & arm_ext_mp
18510#undef THUMB_VARIANT
18511#define THUMB_VARIANT & arm_ext_mp
18512
18513 TUF("pldw", 410f000, f830f000, 1, (ADDR), pld, t_pld),
18514
53c4b28b
MGD
18515 /* AArchv8 instructions. */
18516#undef ARM_VARIANT
18517#define ARM_VARIANT & arm_ext_v8
18518#undef THUMB_VARIANT
18519#define THUMB_VARIANT & arm_ext_v8
18520
18521 tCE("sevl", 320f005, _sevl, 0, (), noargs, t_hint),
8884b720 18522 TUE("hlt", 1000070, ba80, 1, (oIffffb), bkpt, t_hlt),
4b8c8c02
RE
18523 TCE("ldaex", 1900e9f, e8d00fef, 2, (RRnpc, RRnpcb), rd_rn, rd_rn),
18524 TCE("ldaexd", 1b00e9f, e8d000ff, 3, (RRnpc, oRRnpc, RRnpcb),
9eb6c0f1 18525 ldrexd, t_ldrexd),
4b8c8c02
RE
18526 TCE("ldaexb", 1d00e9f, e8d00fcf, 2, (RRnpc,RRnpcb), rd_rn, rd_rn),
18527 TCE("ldaexh", 1f00e9f, e8d00fdf, 2, (RRnpc, RRnpcb), rd_rn, rd_rn),
18528 TCE("stlex", 1800e90, e8c00fe0, 3, (RRnpc, RRnpc, RRnpcb),
18529 stlex, t_stlex),
18530 TCE("stlexd", 1a00e90, e8c000f0, 4, (RRnpc, RRnpc, oRRnpc, RRnpcb),
9eb6c0f1 18531 strexd, t_strexd),
4b8c8c02
RE
18532 TCE("stlexb", 1c00e90, e8c00fc0, 3, (RRnpc, RRnpc, RRnpcb),
18533 stlex, t_stlex),
18534 TCE("stlexh", 1e00e90, e8c00fd0, 3, (RRnpc, RRnpc, RRnpcb),
18535 stlex, t_stlex),
18536 TCE("lda", 1900c9f, e8d00faf, 2, (RRnpc, RRnpcb), rd_rn, rd_rn),
18537 TCE("ldab", 1d00c9f, e8d00f8f, 2, (RRnpc, RRnpcb), rd_rn, rd_rn),
18538 TCE("ldah", 1f00c9f, e8d00f9f, 2, (RRnpc, RRnpcb), rd_rn, rd_rn),
18539 TCE("stl", 180fc90, e8c00faf, 2, (RRnpc, RRnpcb), rm_rn, rd_rn),
18540 TCE("stlb", 1c0fc90, e8c00f8f, 2, (RRnpc, RRnpcb), rm_rn, rd_rn),
18541 TCE("stlh", 1e0fc90, e8c00f9f, 2, (RRnpc, RRnpcb), rm_rn, rd_rn),
53c4b28b 18542
8884b720 18543 /* ARMv8 T32 only. */
b79f7053
MGD
18544#undef ARM_VARIANT
18545#define ARM_VARIANT NULL
18546 TUF("dcps1", 0, f78f8001, 0, (), noargs, noargs),
18547 TUF("dcps2", 0, f78f8002, 0, (), noargs, noargs),
18548 TUF("dcps3", 0, f78f8003, 0, (), noargs, noargs),
18549
33399f07
MGD
18550 /* FP for ARMv8. */
18551#undef ARM_VARIANT
18552#define ARM_VARIANT & fpu_vfp_ext_armv8
18553#undef THUMB_VARIANT
18554#define THUMB_VARIANT & fpu_vfp_ext_armv8
18555
18556 nUF(vseleq, _vseleq, 3, (RVSD, RVSD, RVSD), vsel),
18557 nUF(vselvs, _vselvs, 3, (RVSD, RVSD, RVSD), vsel),
18558 nUF(vselge, _vselge, 3, (RVSD, RVSD, RVSD), vsel),
18559 nUF(vselgt, _vselgt, 3, (RVSD, RVSD, RVSD), vsel),
73924fbc
MGD
18560 nUF(vmaxnm, _vmaxnm, 3, (RNSDQ, oRNSDQ, RNSDQ), vmaxnm),
18561 nUF(vminnm, _vminnm, 3, (RNSDQ, oRNSDQ, RNSDQ), vmaxnm),
7e8e6784
MGD
18562 nUF(vcvta, _vcvta, 2, (RNSDQ, oRNSDQ), neon_cvta),
18563 nUF(vcvtn, _vcvta, 2, (RNSDQ, oRNSDQ), neon_cvtn),
18564 nUF(vcvtp, _vcvta, 2, (RNSDQ, oRNSDQ), neon_cvtp),
18565 nUF(vcvtm, _vcvta, 2, (RNSDQ, oRNSDQ), neon_cvtm),
30bdf752
MGD
18566 nCE(vrintr, _vrintr, 2, (RNSDQ, oRNSDQ), vrintr),
18567 nCE(vrintz, _vrintr, 2, (RNSDQ, oRNSDQ), vrintz),
18568 nCE(vrintx, _vrintr, 2, (RNSDQ, oRNSDQ), vrintx),
18569 nUF(vrinta, _vrinta, 2, (RNSDQ, oRNSDQ), vrinta),
18570 nUF(vrintn, _vrinta, 2, (RNSDQ, oRNSDQ), vrintn),
18571 nUF(vrintp, _vrinta, 2, (RNSDQ, oRNSDQ), vrintp),
18572 nUF(vrintm, _vrinta, 2, (RNSDQ, oRNSDQ), vrintm),
33399f07 18573
91ff7894
MGD
18574 /* Crypto v1 extensions. */
18575#undef ARM_VARIANT
18576#define ARM_VARIANT & fpu_crypto_ext_armv8
18577#undef THUMB_VARIANT
18578#define THUMB_VARIANT & fpu_crypto_ext_armv8
18579
18580 nUF(aese, _aes, 2, (RNQ, RNQ), aese),
18581 nUF(aesd, _aes, 2, (RNQ, RNQ), aesd),
18582 nUF(aesmc, _aes, 2, (RNQ, RNQ), aesmc),
18583 nUF(aesimc, _aes, 2, (RNQ, RNQ), aesimc),
48adcd8e
MGD
18584 nUF(sha1c, _sha3op, 3, (RNQ, RNQ, RNQ), sha1c),
18585 nUF(sha1p, _sha3op, 3, (RNQ, RNQ, RNQ), sha1p),
18586 nUF(sha1m, _sha3op, 3, (RNQ, RNQ, RNQ), sha1m),
18587 nUF(sha1su0, _sha3op, 3, (RNQ, RNQ, RNQ), sha1su0),
18588 nUF(sha256h, _sha3op, 3, (RNQ, RNQ, RNQ), sha256h),
18589 nUF(sha256h2, _sha3op, 3, (RNQ, RNQ, RNQ), sha256h2),
18590 nUF(sha256su1, _sha3op, 3, (RNQ, RNQ, RNQ), sha256su1),
3c9017d2
MGD
18591 nUF(sha1h, _sha1h, 2, (RNQ, RNQ), sha1h),
18592 nUF(sha1su1, _sha2op, 2, (RNQ, RNQ), sha1su1),
18593 nUF(sha256su0, _sha2op, 2, (RNQ, RNQ), sha256su0),
91ff7894 18594
dd5181d5
KT
18595#undef ARM_VARIANT
18596#define ARM_VARIANT & crc_ext_armv8
18597#undef THUMB_VARIANT
18598#define THUMB_VARIANT & crc_ext_armv8
18599 TUEc("crc32b", 1000040, fac0f080, 3, (RR, oRR, RR), crc32b),
18600 TUEc("crc32h", 1200040, fac0f090, 3, (RR, oRR, RR), crc32h),
18601 TUEc("crc32w", 1400040, fac0f0a0, 3, (RR, oRR, RR), crc32w),
18602 TUEc("crc32cb",1000240, fad0f080, 3, (RR, oRR, RR), crc32cb),
18603 TUEc("crc32ch",1200240, fad0f090, 3, (RR, oRR, RR), crc32ch),
18604 TUEc("crc32cw",1400240, fad0f0a0, 3, (RR, oRR, RR), crc32cw),
18605
c921be7d
NC
18606#undef ARM_VARIANT
18607#define ARM_VARIANT & fpu_fpa_ext_v1 /* Core FPA instruction set (V1). */
53c4b28b
MGD
18608#undef THUMB_VARIANT
18609#define THUMB_VARIANT NULL
c921be7d 18610
21d799b5
NC
18611 cCE("wfs", e200110, 1, (RR), rd),
18612 cCE("rfs", e300110, 1, (RR), rd),
18613 cCE("wfc", e400110, 1, (RR), rd),
18614 cCE("rfc", e500110, 1, (RR), rd),
18615
18616 cCL("ldfs", c100100, 2, (RF, ADDRGLDC), rd_cpaddr),
18617 cCL("ldfd", c108100, 2, (RF, ADDRGLDC), rd_cpaddr),
18618 cCL("ldfe", c500100, 2, (RF, ADDRGLDC), rd_cpaddr),
18619 cCL("ldfp", c508100, 2, (RF, ADDRGLDC), rd_cpaddr),
18620
18621 cCL("stfs", c000100, 2, (RF, ADDRGLDC), rd_cpaddr),
18622 cCL("stfd", c008100, 2, (RF, ADDRGLDC), rd_cpaddr),
18623 cCL("stfe", c400100, 2, (RF, ADDRGLDC), rd_cpaddr),
18624 cCL("stfp", c408100, 2, (RF, ADDRGLDC), rd_cpaddr),
18625
18626 cCL("mvfs", e008100, 2, (RF, RF_IF), rd_rm),
18627 cCL("mvfsp", e008120, 2, (RF, RF_IF), rd_rm),
18628 cCL("mvfsm", e008140, 2, (RF, RF_IF), rd_rm),
18629 cCL("mvfsz", e008160, 2, (RF, RF_IF), rd_rm),
18630 cCL("mvfd", e008180, 2, (RF, RF_IF), rd_rm),
18631 cCL("mvfdp", e0081a0, 2, (RF, RF_IF), rd_rm),
18632 cCL("mvfdm", e0081c0, 2, (RF, RF_IF), rd_rm),
18633 cCL("mvfdz", e0081e0, 2, (RF, RF_IF), rd_rm),
18634 cCL("mvfe", e088100, 2, (RF, RF_IF), rd_rm),
18635 cCL("mvfep", e088120, 2, (RF, RF_IF), rd_rm),
18636 cCL("mvfem", e088140, 2, (RF, RF_IF), rd_rm),
18637 cCL("mvfez", e088160, 2, (RF, RF_IF), rd_rm),
18638
18639 cCL("mnfs", e108100, 2, (RF, RF_IF), rd_rm),
18640 cCL("mnfsp", e108120, 2, (RF, RF_IF), rd_rm),
18641 cCL("mnfsm", e108140, 2, (RF, RF_IF), rd_rm),
18642 cCL("mnfsz", e108160, 2, (RF, RF_IF), rd_rm),
18643 cCL("mnfd", e108180, 2, (RF, RF_IF), rd_rm),
18644 cCL("mnfdp", e1081a0, 2, (RF, RF_IF), rd_rm),
18645 cCL("mnfdm", e1081c0, 2, (RF, RF_IF), rd_rm),
18646 cCL("mnfdz", e1081e0, 2, (RF, RF_IF), rd_rm),
18647 cCL("mnfe", e188100, 2, (RF, RF_IF), rd_rm),
18648 cCL("mnfep", e188120, 2, (RF, RF_IF), rd_rm),
18649 cCL("mnfem", e188140, 2, (RF, RF_IF), rd_rm),
18650 cCL("mnfez", e188160, 2, (RF, RF_IF), rd_rm),
18651
18652 cCL("abss", e208100, 2, (RF, RF_IF), rd_rm),
18653 cCL("abssp", e208120, 2, (RF, RF_IF), rd_rm),
18654 cCL("abssm", e208140, 2, (RF, RF_IF), rd_rm),
18655 cCL("abssz", e208160, 2, (RF, RF_IF), rd_rm),
18656 cCL("absd", e208180, 2, (RF, RF_IF), rd_rm),
18657 cCL("absdp", e2081a0, 2, (RF, RF_IF), rd_rm),
18658 cCL("absdm", e2081c0, 2, (RF, RF_IF), rd_rm),
18659 cCL("absdz", e2081e0, 2, (RF, RF_IF), rd_rm),
18660 cCL("abse", e288100, 2, (RF, RF_IF), rd_rm),
18661 cCL("absep", e288120, 2, (RF, RF_IF), rd_rm),
18662 cCL("absem", e288140, 2, (RF, RF_IF), rd_rm),
18663 cCL("absez", e288160, 2, (RF, RF_IF), rd_rm),
18664
18665 cCL("rnds", e308100, 2, (RF, RF_IF), rd_rm),
18666 cCL("rndsp", e308120, 2, (RF, RF_IF), rd_rm),
18667 cCL("rndsm", e308140, 2, (RF, RF_IF), rd_rm),
18668 cCL("rndsz", e308160, 2, (RF, RF_IF), rd_rm),
18669 cCL("rndd", e308180, 2, (RF, RF_IF), rd_rm),
18670 cCL("rnddp", e3081a0, 2, (RF, RF_IF), rd_rm),
18671 cCL("rnddm", e3081c0, 2, (RF, RF_IF), rd_rm),
18672 cCL("rnddz", e3081e0, 2, (RF, RF_IF), rd_rm),
18673 cCL("rnde", e388100, 2, (RF, RF_IF), rd_rm),
18674 cCL("rndep", e388120, 2, (RF, RF_IF), rd_rm),
18675 cCL("rndem", e388140, 2, (RF, RF_IF), rd_rm),
18676 cCL("rndez", e388160, 2, (RF, RF_IF), rd_rm),
18677
18678 cCL("sqts", e408100, 2, (RF, RF_IF), rd_rm),
18679 cCL("sqtsp", e408120, 2, (RF, RF_IF), rd_rm),
18680 cCL("sqtsm", e408140, 2, (RF, RF_IF), rd_rm),
18681 cCL("sqtsz", e408160, 2, (RF, RF_IF), rd_rm),
18682 cCL("sqtd", e408180, 2, (RF, RF_IF), rd_rm),
18683 cCL("sqtdp", e4081a0, 2, (RF, RF_IF), rd_rm),
18684 cCL("sqtdm", e4081c0, 2, (RF, RF_IF), rd_rm),
18685 cCL("sqtdz", e4081e0, 2, (RF, RF_IF), rd_rm),
18686 cCL("sqte", e488100, 2, (RF, RF_IF), rd_rm),
18687 cCL("sqtep", e488120, 2, (RF, RF_IF), rd_rm),
18688 cCL("sqtem", e488140, 2, (RF, RF_IF), rd_rm),
18689 cCL("sqtez", e488160, 2, (RF, RF_IF), rd_rm),
18690
18691 cCL("logs", e508100, 2, (RF, RF_IF), rd_rm),
18692 cCL("logsp", e508120, 2, (RF, RF_IF), rd_rm),
18693 cCL("logsm", e508140, 2, (RF, RF_IF), rd_rm),
18694 cCL("logsz", e508160, 2, (RF, RF_IF), rd_rm),
18695 cCL("logd", e508180, 2, (RF, RF_IF), rd_rm),
18696 cCL("logdp", e5081a0, 2, (RF, RF_IF), rd_rm),
18697 cCL("logdm", e5081c0, 2, (RF, RF_IF), rd_rm),
18698 cCL("logdz", e5081e0, 2, (RF, RF_IF), rd_rm),
18699 cCL("loge", e588100, 2, (RF, RF_IF), rd_rm),
18700 cCL("logep", e588120, 2, (RF, RF_IF), rd_rm),
18701 cCL("logem", e588140, 2, (RF, RF_IF), rd_rm),
18702 cCL("logez", e588160, 2, (RF, RF_IF), rd_rm),
18703
18704 cCL("lgns", e608100, 2, (RF, RF_IF), rd_rm),
18705 cCL("lgnsp", e608120, 2, (RF, RF_IF), rd_rm),
18706 cCL("lgnsm", e608140, 2, (RF, RF_IF), rd_rm),
18707 cCL("lgnsz", e608160, 2, (RF, RF_IF), rd_rm),
18708 cCL("lgnd", e608180, 2, (RF, RF_IF), rd_rm),
18709 cCL("lgndp", e6081a0, 2, (RF, RF_IF), rd_rm),
18710 cCL("lgndm", e6081c0, 2, (RF, RF_IF), rd_rm),
18711 cCL("lgndz", e6081e0, 2, (RF, RF_IF), rd_rm),
18712 cCL("lgne", e688100, 2, (RF, RF_IF), rd_rm),
18713 cCL("lgnep", e688120, 2, (RF, RF_IF), rd_rm),
18714 cCL("lgnem", e688140, 2, (RF, RF_IF), rd_rm),
18715 cCL("lgnez", e688160, 2, (RF, RF_IF), rd_rm),
18716
18717 cCL("exps", e708100, 2, (RF, RF_IF), rd_rm),
18718 cCL("expsp", e708120, 2, (RF, RF_IF), rd_rm),
18719 cCL("expsm", e708140, 2, (RF, RF_IF), rd_rm),
18720 cCL("expsz", e708160, 2, (RF, RF_IF), rd_rm),
18721 cCL("expd", e708180, 2, (RF, RF_IF), rd_rm),
18722 cCL("expdp", e7081a0, 2, (RF, RF_IF), rd_rm),
18723 cCL("expdm", e7081c0, 2, (RF, RF_IF), rd_rm),
18724 cCL("expdz", e7081e0, 2, (RF, RF_IF), rd_rm),
18725 cCL("expe", e788100, 2, (RF, RF_IF), rd_rm),
18726 cCL("expep", e788120, 2, (RF, RF_IF), rd_rm),
18727 cCL("expem", e788140, 2, (RF, RF_IF), rd_rm),
18728 cCL("expdz", e788160, 2, (RF, RF_IF), rd_rm),
18729
18730 cCL("sins", e808100, 2, (RF, RF_IF), rd_rm),
18731 cCL("sinsp", e808120, 2, (RF, RF_IF), rd_rm),
18732 cCL("sinsm", e808140, 2, (RF, RF_IF), rd_rm),
18733 cCL("sinsz", e808160, 2, (RF, RF_IF), rd_rm),
18734 cCL("sind", e808180, 2, (RF, RF_IF), rd_rm),
18735 cCL("sindp", e8081a0, 2, (RF, RF_IF), rd_rm),
18736 cCL("sindm", e8081c0, 2, (RF, RF_IF), rd_rm),
18737 cCL("sindz", e8081e0, 2, (RF, RF_IF), rd_rm),
18738 cCL("sine", e888100, 2, (RF, RF_IF), rd_rm),
18739 cCL("sinep", e888120, 2, (RF, RF_IF), rd_rm),
18740 cCL("sinem", e888140, 2, (RF, RF_IF), rd_rm),
18741 cCL("sinez", e888160, 2, (RF, RF_IF), rd_rm),
18742
18743 cCL("coss", e908100, 2, (RF, RF_IF), rd_rm),
18744 cCL("cossp", e908120, 2, (RF, RF_IF), rd_rm),
18745 cCL("cossm", e908140, 2, (RF, RF_IF), rd_rm),
18746 cCL("cossz", e908160, 2, (RF, RF_IF), rd_rm),
18747 cCL("cosd", e908180, 2, (RF, RF_IF), rd_rm),
18748 cCL("cosdp", e9081a0, 2, (RF, RF_IF), rd_rm),
18749 cCL("cosdm", e9081c0, 2, (RF, RF_IF), rd_rm),
18750 cCL("cosdz", e9081e0, 2, (RF, RF_IF), rd_rm),
18751 cCL("cose", e988100, 2, (RF, RF_IF), rd_rm),
18752 cCL("cosep", e988120, 2, (RF, RF_IF), rd_rm),
18753 cCL("cosem", e988140, 2, (RF, RF_IF), rd_rm),
18754 cCL("cosez", e988160, 2, (RF, RF_IF), rd_rm),
18755
18756 cCL("tans", ea08100, 2, (RF, RF_IF), rd_rm),
18757 cCL("tansp", ea08120, 2, (RF, RF_IF), rd_rm),
18758 cCL("tansm", ea08140, 2, (RF, RF_IF), rd_rm),
18759 cCL("tansz", ea08160, 2, (RF, RF_IF), rd_rm),
18760 cCL("tand", ea08180, 2, (RF, RF_IF), rd_rm),
18761 cCL("tandp", ea081a0, 2, (RF, RF_IF), rd_rm),
18762 cCL("tandm", ea081c0, 2, (RF, RF_IF), rd_rm),
18763 cCL("tandz", ea081e0, 2, (RF, RF_IF), rd_rm),
18764 cCL("tane", ea88100, 2, (RF, RF_IF), rd_rm),
18765 cCL("tanep", ea88120, 2, (RF, RF_IF), rd_rm),
18766 cCL("tanem", ea88140, 2, (RF, RF_IF), rd_rm),
18767 cCL("tanez", ea88160, 2, (RF, RF_IF), rd_rm),
18768
18769 cCL("asns", eb08100, 2, (RF, RF_IF), rd_rm),
18770 cCL("asnsp", eb08120, 2, (RF, RF_IF), rd_rm),
18771 cCL("asnsm", eb08140, 2, (RF, RF_IF), rd_rm),
18772 cCL("asnsz", eb08160, 2, (RF, RF_IF), rd_rm),
18773 cCL("asnd", eb08180, 2, (RF, RF_IF), rd_rm),
18774 cCL("asndp", eb081a0, 2, (RF, RF_IF), rd_rm),
18775 cCL("asndm", eb081c0, 2, (RF, RF_IF), rd_rm),
18776 cCL("asndz", eb081e0, 2, (RF, RF_IF), rd_rm),
18777 cCL("asne", eb88100, 2, (RF, RF_IF), rd_rm),
18778 cCL("asnep", eb88120, 2, (RF, RF_IF), rd_rm),
18779 cCL("asnem", eb88140, 2, (RF, RF_IF), rd_rm),
18780 cCL("asnez", eb88160, 2, (RF, RF_IF), rd_rm),
18781
18782 cCL("acss", ec08100, 2, (RF, RF_IF), rd_rm),
18783 cCL("acssp", ec08120, 2, (RF, RF_IF), rd_rm),
18784 cCL("acssm", ec08140, 2, (RF, RF_IF), rd_rm),
18785 cCL("acssz", ec08160, 2, (RF, RF_IF), rd_rm),
18786 cCL("acsd", ec08180, 2, (RF, RF_IF), rd_rm),
18787 cCL("acsdp", ec081a0, 2, (RF, RF_IF), rd_rm),
18788 cCL("acsdm", ec081c0, 2, (RF, RF_IF), rd_rm),
18789 cCL("acsdz", ec081e0, 2, (RF, RF_IF), rd_rm),
18790 cCL("acse", ec88100, 2, (RF, RF_IF), rd_rm),
18791 cCL("acsep", ec88120, 2, (RF, RF_IF), rd_rm),
18792 cCL("acsem", ec88140, 2, (RF, RF_IF), rd_rm),
18793 cCL("acsez", ec88160, 2, (RF, RF_IF), rd_rm),
18794
18795 cCL("atns", ed08100, 2, (RF, RF_IF), rd_rm),
18796 cCL("atnsp", ed08120, 2, (RF, RF_IF), rd_rm),
18797 cCL("atnsm", ed08140, 2, (RF, RF_IF), rd_rm),
18798 cCL("atnsz", ed08160, 2, (RF, RF_IF), rd_rm),
18799 cCL("atnd", ed08180, 2, (RF, RF_IF), rd_rm),
18800 cCL("atndp", ed081a0, 2, (RF, RF_IF), rd_rm),
18801 cCL("atndm", ed081c0, 2, (RF, RF_IF), rd_rm),
18802 cCL("atndz", ed081e0, 2, (RF, RF_IF), rd_rm),
18803 cCL("atne", ed88100, 2, (RF, RF_IF), rd_rm),
18804 cCL("atnep", ed88120, 2, (RF, RF_IF), rd_rm),
18805 cCL("atnem", ed88140, 2, (RF, RF_IF), rd_rm),
18806 cCL("atnez", ed88160, 2, (RF, RF_IF), rd_rm),
18807
18808 cCL("urds", ee08100, 2, (RF, RF_IF), rd_rm),
18809 cCL("urdsp", ee08120, 2, (RF, RF_IF), rd_rm),
18810 cCL("urdsm", ee08140, 2, (RF, RF_IF), rd_rm),
18811 cCL("urdsz", ee08160, 2, (RF, RF_IF), rd_rm),
18812 cCL("urdd", ee08180, 2, (RF, RF_IF), rd_rm),
18813 cCL("urddp", ee081a0, 2, (RF, RF_IF), rd_rm),
18814 cCL("urddm", ee081c0, 2, (RF, RF_IF), rd_rm),
18815 cCL("urddz", ee081e0, 2, (RF, RF_IF), rd_rm),
18816 cCL("urde", ee88100, 2, (RF, RF_IF), rd_rm),
18817 cCL("urdep", ee88120, 2, (RF, RF_IF), rd_rm),
18818 cCL("urdem", ee88140, 2, (RF, RF_IF), rd_rm),
18819 cCL("urdez", ee88160, 2, (RF, RF_IF), rd_rm),
18820
18821 cCL("nrms", ef08100, 2, (RF, RF_IF), rd_rm),
18822 cCL("nrmsp", ef08120, 2, (RF, RF_IF), rd_rm),
18823 cCL("nrmsm", ef08140, 2, (RF, RF_IF), rd_rm),
18824 cCL("nrmsz", ef08160, 2, (RF, RF_IF), rd_rm),
18825 cCL("nrmd", ef08180, 2, (RF, RF_IF), rd_rm),
18826 cCL("nrmdp", ef081a0, 2, (RF, RF_IF), rd_rm),
18827 cCL("nrmdm", ef081c0, 2, (RF, RF_IF), rd_rm),
18828 cCL("nrmdz", ef081e0, 2, (RF, RF_IF), rd_rm),
18829 cCL("nrme", ef88100, 2, (RF, RF_IF), rd_rm),
18830 cCL("nrmep", ef88120, 2, (RF, RF_IF), rd_rm),
18831 cCL("nrmem", ef88140, 2, (RF, RF_IF), rd_rm),
18832 cCL("nrmez", ef88160, 2, (RF, RF_IF), rd_rm),
18833
18834 cCL("adfs", e000100, 3, (RF, RF, RF_IF), rd_rn_rm),
18835 cCL("adfsp", e000120, 3, (RF, RF, RF_IF), rd_rn_rm),
18836 cCL("adfsm", e000140, 3, (RF, RF, RF_IF), rd_rn_rm),
18837 cCL("adfsz", e000160, 3, (RF, RF, RF_IF), rd_rn_rm),
18838 cCL("adfd", e000180, 3, (RF, RF, RF_IF), rd_rn_rm),
18839 cCL("adfdp", e0001a0, 3, (RF, RF, RF_IF), rd_rn_rm),
18840 cCL("adfdm", e0001c0, 3, (RF, RF, RF_IF), rd_rn_rm),
18841 cCL("adfdz", e0001e0, 3, (RF, RF, RF_IF), rd_rn_rm),
18842 cCL("adfe", e080100, 3, (RF, RF, RF_IF), rd_rn_rm),
18843 cCL("adfep", e080120, 3, (RF, RF, RF_IF), rd_rn_rm),
18844 cCL("adfem", e080140, 3, (RF, RF, RF_IF), rd_rn_rm),
18845 cCL("adfez", e080160, 3, (RF, RF, RF_IF), rd_rn_rm),
18846
18847 cCL("sufs", e200100, 3, (RF, RF, RF_IF), rd_rn_rm),
18848 cCL("sufsp", e200120, 3, (RF, RF, RF_IF), rd_rn_rm),
18849 cCL("sufsm", e200140, 3, (RF, RF, RF_IF), rd_rn_rm),
18850 cCL("sufsz", e200160, 3, (RF, RF, RF_IF), rd_rn_rm),
18851 cCL("sufd", e200180, 3, (RF, RF, RF_IF), rd_rn_rm),
18852 cCL("sufdp", e2001a0, 3, (RF, RF, RF_IF), rd_rn_rm),
18853 cCL("sufdm", e2001c0, 3, (RF, RF, RF_IF), rd_rn_rm),
18854 cCL("sufdz", e2001e0, 3, (RF, RF, RF_IF), rd_rn_rm),
18855 cCL("sufe", e280100, 3, (RF, RF, RF_IF), rd_rn_rm),
18856 cCL("sufep", e280120, 3, (RF, RF, RF_IF), rd_rn_rm),
18857 cCL("sufem", e280140, 3, (RF, RF, RF_IF), rd_rn_rm),
18858 cCL("sufez", e280160, 3, (RF, RF, RF_IF), rd_rn_rm),
18859
18860 cCL("rsfs", e300100, 3, (RF, RF, RF_IF), rd_rn_rm),
18861 cCL("rsfsp", e300120, 3, (RF, RF, RF_IF), rd_rn_rm),
18862 cCL("rsfsm", e300140, 3, (RF, RF, RF_IF), rd_rn_rm),
18863 cCL("rsfsz", e300160, 3, (RF, RF, RF_IF), rd_rn_rm),
18864 cCL("rsfd", e300180, 3, (RF, RF, RF_IF), rd_rn_rm),
18865 cCL("rsfdp", e3001a0, 3, (RF, RF, RF_IF), rd_rn_rm),
18866 cCL("rsfdm", e3001c0, 3, (RF, RF, RF_IF), rd_rn_rm),
18867 cCL("rsfdz", e3001e0, 3, (RF, RF, RF_IF), rd_rn_rm),
18868 cCL("rsfe", e380100, 3, (RF, RF, RF_IF), rd_rn_rm),
18869 cCL("rsfep", e380120, 3, (RF, RF, RF_IF), rd_rn_rm),
18870 cCL("rsfem", e380140, 3, (RF, RF, RF_IF), rd_rn_rm),
18871 cCL("rsfez", e380160, 3, (RF, RF, RF_IF), rd_rn_rm),
18872
18873 cCL("mufs", e100100, 3, (RF, RF, RF_IF), rd_rn_rm),
18874 cCL("mufsp", e100120, 3, (RF, RF, RF_IF), rd_rn_rm),
18875 cCL("mufsm", e100140, 3, (RF, RF, RF_IF), rd_rn_rm),
18876 cCL("mufsz", e100160, 3, (RF, RF, RF_IF), rd_rn_rm),
18877 cCL("mufd", e100180, 3, (RF, RF, RF_IF), rd_rn_rm),
18878 cCL("mufdp", e1001a0, 3, (RF, RF, RF_IF), rd_rn_rm),
18879 cCL("mufdm", e1001c0, 3, (RF, RF, RF_IF), rd_rn_rm),
18880 cCL("mufdz", e1001e0, 3, (RF, RF, RF_IF), rd_rn_rm),
18881 cCL("mufe", e180100, 3, (RF, RF, RF_IF), rd_rn_rm),
18882 cCL("mufep", e180120, 3, (RF, RF, RF_IF), rd_rn_rm),
18883 cCL("mufem", e180140, 3, (RF, RF, RF_IF), rd_rn_rm),
18884 cCL("mufez", e180160, 3, (RF, RF, RF_IF), rd_rn_rm),
18885
18886 cCL("dvfs", e400100, 3, (RF, RF, RF_IF), rd_rn_rm),
18887 cCL("dvfsp", e400120, 3, (RF, RF, RF_IF), rd_rn_rm),
18888 cCL("dvfsm", e400140, 3, (RF, RF, RF_IF), rd_rn_rm),
18889 cCL("dvfsz", e400160, 3, (RF, RF, RF_IF), rd_rn_rm),
18890 cCL("dvfd", e400180, 3, (RF, RF, RF_IF), rd_rn_rm),
18891 cCL("dvfdp", e4001a0, 3, (RF, RF, RF_IF), rd_rn_rm),
18892 cCL("dvfdm", e4001c0, 3, (RF, RF, RF_IF), rd_rn_rm),
18893 cCL("dvfdz", e4001e0, 3, (RF, RF, RF_IF), rd_rn_rm),
18894 cCL("dvfe", e480100, 3, (RF, RF, RF_IF), rd_rn_rm),
18895 cCL("dvfep", e480120, 3, (RF, RF, RF_IF), rd_rn_rm),
18896 cCL("dvfem", e480140, 3, (RF, RF, RF_IF), rd_rn_rm),
18897 cCL("dvfez", e480160, 3, (RF, RF, RF_IF), rd_rn_rm),
18898
18899 cCL("rdfs", e500100, 3, (RF, RF, RF_IF), rd_rn_rm),
18900 cCL("rdfsp", e500120, 3, (RF, RF, RF_IF), rd_rn_rm),
18901 cCL("rdfsm", e500140, 3, (RF, RF, RF_IF), rd_rn_rm),
18902 cCL("rdfsz", e500160, 3, (RF, RF, RF_IF), rd_rn_rm),
18903 cCL("rdfd", e500180, 3, (RF, RF, RF_IF), rd_rn_rm),
18904 cCL("rdfdp", e5001a0, 3, (RF, RF, RF_IF), rd_rn_rm),
18905 cCL("rdfdm", e5001c0, 3, (RF, RF, RF_IF), rd_rn_rm),
18906 cCL("rdfdz", e5001e0, 3, (RF, RF, RF_IF), rd_rn_rm),
18907 cCL("rdfe", e580100, 3, (RF, RF, RF_IF), rd_rn_rm),
18908 cCL("rdfep", e580120, 3, (RF, RF, RF_IF), rd_rn_rm),
18909 cCL("rdfem", e580140, 3, (RF, RF, RF_IF), rd_rn_rm),
18910 cCL("rdfez", e580160, 3, (RF, RF, RF_IF), rd_rn_rm),
18911
18912 cCL("pows", e600100, 3, (RF, RF, RF_IF), rd_rn_rm),
18913 cCL("powsp", e600120, 3, (RF, RF, RF_IF), rd_rn_rm),
18914 cCL("powsm", e600140, 3, (RF, RF, RF_IF), rd_rn_rm),
18915 cCL("powsz", e600160, 3, (RF, RF, RF_IF), rd_rn_rm),
18916 cCL("powd", e600180, 3, (RF, RF, RF_IF), rd_rn_rm),
18917 cCL("powdp", e6001a0, 3, (RF, RF, RF_IF), rd_rn_rm),
18918 cCL("powdm", e6001c0, 3, (RF, RF, RF_IF), rd_rn_rm),
18919 cCL("powdz", e6001e0, 3, (RF, RF, RF_IF), rd_rn_rm),
18920 cCL("powe", e680100, 3, (RF, RF, RF_IF), rd_rn_rm),
18921 cCL("powep", e680120, 3, (RF, RF, RF_IF), rd_rn_rm),
18922 cCL("powem", e680140, 3, (RF, RF, RF_IF), rd_rn_rm),
18923 cCL("powez", e680160, 3, (RF, RF, RF_IF), rd_rn_rm),
18924
18925 cCL("rpws", e700100, 3, (RF, RF, RF_IF), rd_rn_rm),
18926 cCL("rpwsp", e700120, 3, (RF, RF, RF_IF), rd_rn_rm),
18927 cCL("rpwsm", e700140, 3, (RF, RF, RF_IF), rd_rn_rm),
18928 cCL("rpwsz", e700160, 3, (RF, RF, RF_IF), rd_rn_rm),
18929 cCL("rpwd", e700180, 3, (RF, RF, RF_IF), rd_rn_rm),
18930 cCL("rpwdp", e7001a0, 3, (RF, RF, RF_IF), rd_rn_rm),
18931 cCL("rpwdm", e7001c0, 3, (RF, RF, RF_IF), rd_rn_rm),
18932 cCL("rpwdz", e7001e0, 3, (RF, RF, RF_IF), rd_rn_rm),
18933 cCL("rpwe", e780100, 3, (RF, RF, RF_IF), rd_rn_rm),
18934 cCL("rpwep", e780120, 3, (RF, RF, RF_IF), rd_rn_rm),
18935 cCL("rpwem", e780140, 3, (RF, RF, RF_IF), rd_rn_rm),
18936 cCL("rpwez", e780160, 3, (RF, RF, RF_IF), rd_rn_rm),
18937
18938 cCL("rmfs", e800100, 3, (RF, RF, RF_IF), rd_rn_rm),
18939 cCL("rmfsp", e800120, 3, (RF, RF, RF_IF), rd_rn_rm),
18940 cCL("rmfsm", e800140, 3, (RF, RF, RF_IF), rd_rn_rm),
18941 cCL("rmfsz", e800160, 3, (RF, RF, RF_IF), rd_rn_rm),
18942 cCL("rmfd", e800180, 3, (RF, RF, RF_IF), rd_rn_rm),
18943 cCL("rmfdp", e8001a0, 3, (RF, RF, RF_IF), rd_rn_rm),
18944 cCL("rmfdm", e8001c0, 3, (RF, RF, RF_IF), rd_rn_rm),
18945 cCL("rmfdz", e8001e0, 3, (RF, RF, RF_IF), rd_rn_rm),
18946 cCL("rmfe", e880100, 3, (RF, RF, RF_IF), rd_rn_rm),
18947 cCL("rmfep", e880120, 3, (RF, RF, RF_IF), rd_rn_rm),
18948 cCL("rmfem", e880140, 3, (RF, RF, RF_IF), rd_rn_rm),
18949 cCL("rmfez", e880160, 3, (RF, RF, RF_IF), rd_rn_rm),
18950
18951 cCL("fmls", e900100, 3, (RF, RF, RF_IF), rd_rn_rm),
18952 cCL("fmlsp", e900120, 3, (RF, RF, RF_IF), rd_rn_rm),
18953 cCL("fmlsm", e900140, 3, (RF, RF, RF_IF), rd_rn_rm),
18954 cCL("fmlsz", e900160, 3, (RF, RF, RF_IF), rd_rn_rm),
18955 cCL("fmld", e900180, 3, (RF, RF, RF_IF), rd_rn_rm),
18956 cCL("fmldp", e9001a0, 3, (RF, RF, RF_IF), rd_rn_rm),
18957 cCL("fmldm", e9001c0, 3, (RF, RF, RF_IF), rd_rn_rm),
18958 cCL("fmldz", e9001e0, 3, (RF, RF, RF_IF), rd_rn_rm),
18959 cCL("fmle", e980100, 3, (RF, RF, RF_IF), rd_rn_rm),
18960 cCL("fmlep", e980120, 3, (RF, RF, RF_IF), rd_rn_rm),
18961 cCL("fmlem", e980140, 3, (RF, RF, RF_IF), rd_rn_rm),
18962 cCL("fmlez", e980160, 3, (RF, RF, RF_IF), rd_rn_rm),
18963
18964 cCL("fdvs", ea00100, 3, (RF, RF, RF_IF), rd_rn_rm),
18965 cCL("fdvsp", ea00120, 3, (RF, RF, RF_IF), rd_rn_rm),
18966 cCL("fdvsm", ea00140, 3, (RF, RF, RF_IF), rd_rn_rm),
18967 cCL("fdvsz", ea00160, 3, (RF, RF, RF_IF), rd_rn_rm),
18968 cCL("fdvd", ea00180, 3, (RF, RF, RF_IF), rd_rn_rm),
18969 cCL("fdvdp", ea001a0, 3, (RF, RF, RF_IF), rd_rn_rm),
18970 cCL("fdvdm", ea001c0, 3, (RF, RF, RF_IF), rd_rn_rm),
18971 cCL("fdvdz", ea001e0, 3, (RF, RF, RF_IF), rd_rn_rm),
18972 cCL("fdve", ea80100, 3, (RF, RF, RF_IF), rd_rn_rm),
18973 cCL("fdvep", ea80120, 3, (RF, RF, RF_IF), rd_rn_rm),
18974 cCL("fdvem", ea80140, 3, (RF, RF, RF_IF), rd_rn_rm),
18975 cCL("fdvez", ea80160, 3, (RF, RF, RF_IF), rd_rn_rm),
18976
18977 cCL("frds", eb00100, 3, (RF, RF, RF_IF), rd_rn_rm),
18978 cCL("frdsp", eb00120, 3, (RF, RF, RF_IF), rd_rn_rm),
18979 cCL("frdsm", eb00140, 3, (RF, RF, RF_IF), rd_rn_rm),
18980 cCL("frdsz", eb00160, 3, (RF, RF, RF_IF), rd_rn_rm),
18981 cCL("frdd", eb00180, 3, (RF, RF, RF_IF), rd_rn_rm),
18982 cCL("frddp", eb001a0, 3, (RF, RF, RF_IF), rd_rn_rm),
18983 cCL("frddm", eb001c0, 3, (RF, RF, RF_IF), rd_rn_rm),
18984 cCL("frddz", eb001e0, 3, (RF, RF, RF_IF), rd_rn_rm),
18985 cCL("frde", eb80100, 3, (RF, RF, RF_IF), rd_rn_rm),
18986 cCL("frdep", eb80120, 3, (RF, RF, RF_IF), rd_rn_rm),
18987 cCL("frdem", eb80140, 3, (RF, RF, RF_IF), rd_rn_rm),
18988 cCL("frdez", eb80160, 3, (RF, RF, RF_IF), rd_rn_rm),
18989
18990 cCL("pols", ec00100, 3, (RF, RF, RF_IF), rd_rn_rm),
18991 cCL("polsp", ec00120, 3, (RF, RF, RF_IF), rd_rn_rm),
18992 cCL("polsm", ec00140, 3, (RF, RF, RF_IF), rd_rn_rm),
18993 cCL("polsz", ec00160, 3, (RF, RF, RF_IF), rd_rn_rm),
18994 cCL("pold", ec00180, 3, (RF, RF, RF_IF), rd_rn_rm),
18995 cCL("poldp", ec001a0, 3, (RF, RF, RF_IF), rd_rn_rm),
18996 cCL("poldm", ec001c0, 3, (RF, RF, RF_IF), rd_rn_rm),
18997 cCL("poldz", ec001e0, 3, (RF, RF, RF_IF), rd_rn_rm),
18998 cCL("pole", ec80100, 3, (RF, RF, RF_IF), rd_rn_rm),
18999 cCL("polep", ec80120, 3, (RF, RF, RF_IF), rd_rn_rm),
19000 cCL("polem", ec80140, 3, (RF, RF, RF_IF), rd_rn_rm),
19001 cCL("polez", ec80160, 3, (RF, RF, RF_IF), rd_rn_rm),
19002
19003 cCE("cmf", e90f110, 2, (RF, RF_IF), fpa_cmp),
19004 C3E("cmfe", ed0f110, 2, (RF, RF_IF), fpa_cmp),
19005 cCE("cnf", eb0f110, 2, (RF, RF_IF), fpa_cmp),
19006 C3E("cnfe", ef0f110, 2, (RF, RF_IF), fpa_cmp),
19007
19008 cCL("flts", e000110, 2, (RF, RR), rn_rd),
19009 cCL("fltsp", e000130, 2, (RF, RR), rn_rd),
19010 cCL("fltsm", e000150, 2, (RF, RR), rn_rd),
19011 cCL("fltsz", e000170, 2, (RF, RR), rn_rd),
19012 cCL("fltd", e000190, 2, (RF, RR), rn_rd),
19013 cCL("fltdp", e0001b0, 2, (RF, RR), rn_rd),
19014 cCL("fltdm", e0001d0, 2, (RF, RR), rn_rd),
19015 cCL("fltdz", e0001f0, 2, (RF, RR), rn_rd),
19016 cCL("flte", e080110, 2, (RF, RR), rn_rd),
19017 cCL("fltep", e080130, 2, (RF, RR), rn_rd),
19018 cCL("fltem", e080150, 2, (RF, RR), rn_rd),
19019 cCL("fltez", e080170, 2, (RF, RR), rn_rd),
b99bd4ef 19020
c19d1205
ZW
19021 /* The implementation of the FIX instruction is broken on some
19022 assemblers, in that it accepts a precision specifier as well as a
19023 rounding specifier, despite the fact that this is meaningless.
19024 To be more compatible, we accept it as well, though of course it
19025 does not set any bits. */
21d799b5
NC
19026 cCE("fix", e100110, 2, (RR, RF), rd_rm),
19027 cCL("fixp", e100130, 2, (RR, RF), rd_rm),
19028 cCL("fixm", e100150, 2, (RR, RF), rd_rm),
19029 cCL("fixz", e100170, 2, (RR, RF), rd_rm),
19030 cCL("fixsp", e100130, 2, (RR, RF), rd_rm),
19031 cCL("fixsm", e100150, 2, (RR, RF), rd_rm),
19032 cCL("fixsz", e100170, 2, (RR, RF), rd_rm),
19033 cCL("fixdp", e100130, 2, (RR, RF), rd_rm),
19034 cCL("fixdm", e100150, 2, (RR, RF), rd_rm),
19035 cCL("fixdz", e100170, 2, (RR, RF), rd_rm),
19036 cCL("fixep", e100130, 2, (RR, RF), rd_rm),
19037 cCL("fixem", e100150, 2, (RR, RF), rd_rm),
19038 cCL("fixez", e100170, 2, (RR, RF), rd_rm),
bfae80f2 19039
c19d1205 19040 /* Instructions that were new with the real FPA, call them V2. */
c921be7d
NC
19041#undef ARM_VARIANT
19042#define ARM_VARIANT & fpu_fpa_ext_v2
19043
21d799b5
NC
19044 cCE("lfm", c100200, 3, (RF, I4b, ADDR), fpa_ldmstm),
19045 cCL("lfmfd", c900200, 3, (RF, I4b, ADDR), fpa_ldmstm),
19046 cCL("lfmea", d100200, 3, (RF, I4b, ADDR), fpa_ldmstm),
19047 cCE("sfm", c000200, 3, (RF, I4b, ADDR), fpa_ldmstm),
19048 cCL("sfmfd", d000200, 3, (RF, I4b, ADDR), fpa_ldmstm),
19049 cCL("sfmea", c800200, 3, (RF, I4b, ADDR), fpa_ldmstm),
c19d1205 19050
c921be7d
NC
19051#undef ARM_VARIANT
19052#define ARM_VARIANT & fpu_vfp_ext_v1xd /* VFP V1xD (single precision). */
19053
c19d1205 19054 /* Moves and type conversions. */
21d799b5
NC
19055 cCE("fcpys", eb00a40, 2, (RVS, RVS), vfp_sp_monadic),
19056 cCE("fmrs", e100a10, 2, (RR, RVS), vfp_reg_from_sp),
19057 cCE("fmsr", e000a10, 2, (RVS, RR), vfp_sp_from_reg),
19058 cCE("fmstat", ef1fa10, 0, (), noargs),
7465e07a
NC
19059 cCE("vmrs", ef00a10, 2, (APSR_RR, RVC), vmrs),
19060 cCE("vmsr", ee00a10, 2, (RVC, RR), vmsr),
21d799b5
NC
19061 cCE("fsitos", eb80ac0, 2, (RVS, RVS), vfp_sp_monadic),
19062 cCE("fuitos", eb80a40, 2, (RVS, RVS), vfp_sp_monadic),
19063 cCE("ftosis", ebd0a40, 2, (RVS, RVS), vfp_sp_monadic),
19064 cCE("ftosizs", ebd0ac0, 2, (RVS, RVS), vfp_sp_monadic),
19065 cCE("ftouis", ebc0a40, 2, (RVS, RVS), vfp_sp_monadic),
19066 cCE("ftouizs", ebc0ac0, 2, (RVS, RVS), vfp_sp_monadic),
19067 cCE("fmrx", ef00a10, 2, (RR, RVC), rd_rn),
19068 cCE("fmxr", ee00a10, 2, (RVC, RR), rn_rd),
c19d1205
ZW
19069
19070 /* Memory operations. */
21d799b5
NC
19071 cCE("flds", d100a00, 2, (RVS, ADDRGLDC), vfp_sp_ldst),
19072 cCE("fsts", d000a00, 2, (RVS, ADDRGLDC), vfp_sp_ldst),
55881a11
MGD
19073 cCE("fldmias", c900a00, 2, (RRnpctw, VRSLST), vfp_sp_ldstmia),
19074 cCE("fldmfds", c900a00, 2, (RRnpctw, VRSLST), vfp_sp_ldstmia),
19075 cCE("fldmdbs", d300a00, 2, (RRnpctw, VRSLST), vfp_sp_ldstmdb),
19076 cCE("fldmeas", d300a00, 2, (RRnpctw, VRSLST), vfp_sp_ldstmdb),
19077 cCE("fldmiax", c900b00, 2, (RRnpctw, VRDLST), vfp_xp_ldstmia),
19078 cCE("fldmfdx", c900b00, 2, (RRnpctw, VRDLST), vfp_xp_ldstmia),
19079 cCE("fldmdbx", d300b00, 2, (RRnpctw, VRDLST), vfp_xp_ldstmdb),
19080 cCE("fldmeax", d300b00, 2, (RRnpctw, VRDLST), vfp_xp_ldstmdb),
19081 cCE("fstmias", c800a00, 2, (RRnpctw, VRSLST), vfp_sp_ldstmia),
19082 cCE("fstmeas", c800a00, 2, (RRnpctw, VRSLST), vfp_sp_ldstmia),
19083 cCE("fstmdbs", d200a00, 2, (RRnpctw, VRSLST), vfp_sp_ldstmdb),
19084 cCE("fstmfds", d200a00, 2, (RRnpctw, VRSLST), vfp_sp_ldstmdb),
19085 cCE("fstmiax", c800b00, 2, (RRnpctw, VRDLST), vfp_xp_ldstmia),
19086 cCE("fstmeax", c800b00, 2, (RRnpctw, VRDLST), vfp_xp_ldstmia),
19087 cCE("fstmdbx", d200b00, 2, (RRnpctw, VRDLST), vfp_xp_ldstmdb),
19088 cCE("fstmfdx", d200b00, 2, (RRnpctw, VRDLST), vfp_xp_ldstmdb),
bfae80f2 19089
c19d1205 19090 /* Monadic operations. */
21d799b5
NC
19091 cCE("fabss", eb00ac0, 2, (RVS, RVS), vfp_sp_monadic),
19092 cCE("fnegs", eb10a40, 2, (RVS, RVS), vfp_sp_monadic),
19093 cCE("fsqrts", eb10ac0, 2, (RVS, RVS), vfp_sp_monadic),
c19d1205
ZW
19094
19095 /* Dyadic operations. */
21d799b5
NC
19096 cCE("fadds", e300a00, 3, (RVS, RVS, RVS), vfp_sp_dyadic),
19097 cCE("fsubs", e300a40, 3, (RVS, RVS, RVS), vfp_sp_dyadic),
19098 cCE("fmuls", e200a00, 3, (RVS, RVS, RVS), vfp_sp_dyadic),
19099 cCE("fdivs", e800a00, 3, (RVS, RVS, RVS), vfp_sp_dyadic),
19100 cCE("fmacs", e000a00, 3, (RVS, RVS, RVS), vfp_sp_dyadic),
19101 cCE("fmscs", e100a00, 3, (RVS, RVS, RVS), vfp_sp_dyadic),
19102 cCE("fnmuls", e200a40, 3, (RVS, RVS, RVS), vfp_sp_dyadic),
19103 cCE("fnmacs", e000a40, 3, (RVS, RVS, RVS), vfp_sp_dyadic),
19104 cCE("fnmscs", e100a40, 3, (RVS, RVS, RVS), vfp_sp_dyadic),
b99bd4ef 19105
c19d1205 19106 /* Comparisons. */
21d799b5
NC
19107 cCE("fcmps", eb40a40, 2, (RVS, RVS), vfp_sp_monadic),
19108 cCE("fcmpzs", eb50a40, 1, (RVS), vfp_sp_compare_z),
19109 cCE("fcmpes", eb40ac0, 2, (RVS, RVS), vfp_sp_monadic),
19110 cCE("fcmpezs", eb50ac0, 1, (RVS), vfp_sp_compare_z),
b99bd4ef 19111
62f3b8c8
PB
19112 /* Double precision load/store are still present on single precision
19113 implementations. */
19114 cCE("fldd", d100b00, 2, (RVD, ADDRGLDC), vfp_dp_ldst),
19115 cCE("fstd", d000b00, 2, (RVD, ADDRGLDC), vfp_dp_ldst),
55881a11
MGD
19116 cCE("fldmiad", c900b00, 2, (RRnpctw, VRDLST), vfp_dp_ldstmia),
19117 cCE("fldmfdd", c900b00, 2, (RRnpctw, VRDLST), vfp_dp_ldstmia),
19118 cCE("fldmdbd", d300b00, 2, (RRnpctw, VRDLST), vfp_dp_ldstmdb),
19119 cCE("fldmead", d300b00, 2, (RRnpctw, VRDLST), vfp_dp_ldstmdb),
19120 cCE("fstmiad", c800b00, 2, (RRnpctw, VRDLST), vfp_dp_ldstmia),
19121 cCE("fstmead", c800b00, 2, (RRnpctw, VRDLST), vfp_dp_ldstmia),
19122 cCE("fstmdbd", d200b00, 2, (RRnpctw, VRDLST), vfp_dp_ldstmdb),
19123 cCE("fstmfdd", d200b00, 2, (RRnpctw, VRDLST), vfp_dp_ldstmdb),
62f3b8c8 19124
c921be7d
NC
19125#undef ARM_VARIANT
19126#define ARM_VARIANT & fpu_vfp_ext_v1 /* VFP V1 (Double precision). */
19127
c19d1205 19128 /* Moves and type conversions. */
21d799b5
NC
19129 cCE("fcpyd", eb00b40, 2, (RVD, RVD), vfp_dp_rd_rm),
19130 cCE("fcvtds", eb70ac0, 2, (RVD, RVS), vfp_dp_sp_cvt),
19131 cCE("fcvtsd", eb70bc0, 2, (RVS, RVD), vfp_sp_dp_cvt),
19132 cCE("fmdhr", e200b10, 2, (RVD, RR), vfp_dp_rn_rd),
19133 cCE("fmdlr", e000b10, 2, (RVD, RR), vfp_dp_rn_rd),
19134 cCE("fmrdh", e300b10, 2, (RR, RVD), vfp_dp_rd_rn),
19135 cCE("fmrdl", e100b10, 2, (RR, RVD), vfp_dp_rd_rn),
19136 cCE("fsitod", eb80bc0, 2, (RVD, RVS), vfp_dp_sp_cvt),
19137 cCE("fuitod", eb80b40, 2, (RVD, RVS), vfp_dp_sp_cvt),
19138 cCE("ftosid", ebd0b40, 2, (RVS, RVD), vfp_sp_dp_cvt),
19139 cCE("ftosizd", ebd0bc0, 2, (RVS, RVD), vfp_sp_dp_cvt),
19140 cCE("ftouid", ebc0b40, 2, (RVS, RVD), vfp_sp_dp_cvt),
19141 cCE("ftouizd", ebc0bc0, 2, (RVS, RVD), vfp_sp_dp_cvt),
c19d1205 19142
c19d1205 19143 /* Monadic operations. */
21d799b5
NC
19144 cCE("fabsd", eb00bc0, 2, (RVD, RVD), vfp_dp_rd_rm),
19145 cCE("fnegd", eb10b40, 2, (RVD, RVD), vfp_dp_rd_rm),
19146 cCE("fsqrtd", eb10bc0, 2, (RVD, RVD), vfp_dp_rd_rm),
c19d1205
ZW
19147
19148 /* Dyadic operations. */
21d799b5
NC
19149 cCE("faddd", e300b00, 3, (RVD, RVD, RVD), vfp_dp_rd_rn_rm),
19150 cCE("fsubd", e300b40, 3, (RVD, RVD, RVD), vfp_dp_rd_rn_rm),
19151 cCE("fmuld", e200b00, 3, (RVD, RVD, RVD), vfp_dp_rd_rn_rm),
19152 cCE("fdivd", e800b00, 3, (RVD, RVD, RVD), vfp_dp_rd_rn_rm),
19153 cCE("fmacd", e000b00, 3, (RVD, RVD, RVD), vfp_dp_rd_rn_rm),
19154 cCE("fmscd", e100b00, 3, (RVD, RVD, RVD), vfp_dp_rd_rn_rm),
19155 cCE("fnmuld", e200b40, 3, (RVD, RVD, RVD), vfp_dp_rd_rn_rm),
19156 cCE("fnmacd", e000b40, 3, (RVD, RVD, RVD), vfp_dp_rd_rn_rm),
19157 cCE("fnmscd", e100b40, 3, (RVD, RVD, RVD), vfp_dp_rd_rn_rm),
b99bd4ef 19158
c19d1205 19159 /* Comparisons. */
21d799b5
NC
19160 cCE("fcmpd", eb40b40, 2, (RVD, RVD), vfp_dp_rd_rm),
19161 cCE("fcmpzd", eb50b40, 1, (RVD), vfp_dp_rd),
19162 cCE("fcmped", eb40bc0, 2, (RVD, RVD), vfp_dp_rd_rm),
19163 cCE("fcmpezd", eb50bc0, 1, (RVD), vfp_dp_rd),
c19d1205 19164
c921be7d
NC
19165#undef ARM_VARIANT
19166#define ARM_VARIANT & fpu_vfp_ext_v2
19167
21d799b5
NC
19168 cCE("fmsrr", c400a10, 3, (VRSLST, RR, RR), vfp_sp2_from_reg2),
19169 cCE("fmrrs", c500a10, 3, (RR, RR, VRSLST), vfp_reg2_from_sp2),
19170 cCE("fmdrr", c400b10, 3, (RVD, RR, RR), vfp_dp_rm_rd_rn),
19171 cCE("fmrrd", c500b10, 3, (RR, RR, RVD), vfp_dp_rd_rn_rm),
5287ad62 19172
037e8744
JB
19173/* Instructions which may belong to either the Neon or VFP instruction sets.
19174 Individual encoder functions perform additional architecture checks. */
c921be7d
NC
19175#undef ARM_VARIANT
19176#define ARM_VARIANT & fpu_vfp_ext_v1xd
19177#undef THUMB_VARIANT
19178#define THUMB_VARIANT & fpu_vfp_ext_v1xd
19179
037e8744
JB
19180 /* These mnemonics are unique to VFP. */
19181 NCE(vsqrt, 0, 2, (RVSD, RVSD), vfp_nsyn_sqrt),
19182 NCE(vdiv, 0, 3, (RVSD, RVSD, RVSD), vfp_nsyn_div),
21d799b5
NC
19183 nCE(vnmul, _vnmul, 3, (RVSD, RVSD, RVSD), vfp_nsyn_nmul),
19184 nCE(vnmla, _vnmla, 3, (RVSD, RVSD, RVSD), vfp_nsyn_nmul),
19185 nCE(vnmls, _vnmls, 3, (RVSD, RVSD, RVSD), vfp_nsyn_nmul),
19186 nCE(vcmp, _vcmp, 2, (RVSD, RVSD_I0), vfp_nsyn_cmp),
19187 nCE(vcmpe, _vcmpe, 2, (RVSD, RVSD_I0), vfp_nsyn_cmp),
037e8744
JB
19188 NCE(vpush, 0, 1, (VRSDLST), vfp_nsyn_push),
19189 NCE(vpop, 0, 1, (VRSDLST), vfp_nsyn_pop),
19190 NCE(vcvtz, 0, 2, (RVSD, RVSD), vfp_nsyn_cvtz),
19191
19192 /* Mnemonics shared by Neon and VFP. */
21d799b5
NC
19193 nCEF(vmul, _vmul, 3, (RNSDQ, oRNSDQ, RNSDQ_RNSC), neon_mul),
19194 nCEF(vmla, _vmla, 3, (RNSDQ, oRNSDQ, RNSDQ_RNSC), neon_mac_maybe_scalar),
19195 nCEF(vmls, _vmls, 3, (RNSDQ, oRNSDQ, RNSDQ_RNSC), neon_mac_maybe_scalar),
037e8744 19196
21d799b5
NC
19197 nCEF(vadd, _vadd, 3, (RNSDQ, oRNSDQ, RNSDQ), neon_addsub_if_i),
19198 nCEF(vsub, _vsub, 3, (RNSDQ, oRNSDQ, RNSDQ), neon_addsub_if_i),
037e8744
JB
19199
19200 NCEF(vabs, 1b10300, 2, (RNSDQ, RNSDQ), neon_abs_neg),
19201 NCEF(vneg, 1b10380, 2, (RNSDQ, RNSDQ), neon_abs_neg),
19202
55881a11
MGD
19203 NCE(vldm, c900b00, 2, (RRnpctw, VRSDLST), neon_ldm_stm),
19204 NCE(vldmia, c900b00, 2, (RRnpctw, VRSDLST), neon_ldm_stm),
19205 NCE(vldmdb, d100b00, 2, (RRnpctw, VRSDLST), neon_ldm_stm),
19206 NCE(vstm, c800b00, 2, (RRnpctw, VRSDLST), neon_ldm_stm),
19207 NCE(vstmia, c800b00, 2, (RRnpctw, VRSDLST), neon_ldm_stm),
19208 NCE(vstmdb, d000b00, 2, (RRnpctw, VRSDLST), neon_ldm_stm),
4962c51a
MS
19209 NCE(vldr, d100b00, 2, (RVSD, ADDRGLDC), neon_ldr_str),
19210 NCE(vstr, d000b00, 2, (RVSD, ADDRGLDC), neon_ldr_str),
037e8744 19211
5f1af56b 19212 nCEF(vcvt, _vcvt, 3, (RNSDQ, RNSDQ, oI32z), neon_cvt),
e3e535bc 19213 nCEF(vcvtr, _vcvt, 2, (RNSDQ, RNSDQ), neon_cvtr),
c70a8987
MGD
19214 NCEF(vcvtb, eb20a40, 2, (RVSD, RVSD), neon_cvtb),
19215 NCEF(vcvtt, eb20a40, 2, (RVSD, RVSD), neon_cvtt),
f31fef98 19216
037e8744
JB
19217
19218 /* NOTE: All VMOV encoding is special-cased! */
19219 NCE(vmov, 0, 1, (VMOV), neon_mov),
19220 NCE(vmovq, 0, 1, (VMOV), neon_mov),
19221
c921be7d
NC
19222#undef THUMB_VARIANT
19223#define THUMB_VARIANT & fpu_neon_ext_v1
19224#undef ARM_VARIANT
19225#define ARM_VARIANT & fpu_neon_ext_v1
19226
5287ad62
JB
19227 /* Data processing with three registers of the same length. */
19228 /* integer ops, valid types S8 S16 S32 U8 U16 U32. */
19229 NUF(vaba, 0000710, 3, (RNDQ, RNDQ, RNDQ), neon_dyadic_i_su),
19230 NUF(vabaq, 0000710, 3, (RNQ, RNQ, RNQ), neon_dyadic_i_su),
19231 NUF(vhadd, 0000000, 3, (RNDQ, oRNDQ, RNDQ), neon_dyadic_i_su),
19232 NUF(vhaddq, 0000000, 3, (RNQ, oRNQ, RNQ), neon_dyadic_i_su),
19233 NUF(vrhadd, 0000100, 3, (RNDQ, oRNDQ, RNDQ), neon_dyadic_i_su),
19234 NUF(vrhaddq, 0000100, 3, (RNQ, oRNQ, RNQ), neon_dyadic_i_su),
19235 NUF(vhsub, 0000200, 3, (RNDQ, oRNDQ, RNDQ), neon_dyadic_i_su),
19236 NUF(vhsubq, 0000200, 3, (RNQ, oRNQ, RNQ), neon_dyadic_i_su),
19237 /* integer ops, valid types S8 S16 S32 S64 U8 U16 U32 U64. */
19238 NUF(vqadd, 0000010, 3, (RNDQ, oRNDQ, RNDQ), neon_dyadic_i64_su),
19239 NUF(vqaddq, 0000010, 3, (RNQ, oRNQ, RNQ), neon_dyadic_i64_su),
19240 NUF(vqsub, 0000210, 3, (RNDQ, oRNDQ, RNDQ), neon_dyadic_i64_su),
19241 NUF(vqsubq, 0000210, 3, (RNQ, oRNQ, RNQ), neon_dyadic_i64_su),
627907b7
JB
19242 NUF(vrshl, 0000500, 3, (RNDQ, oRNDQ, RNDQ), neon_rshl),
19243 NUF(vrshlq, 0000500, 3, (RNQ, oRNQ, RNQ), neon_rshl),
19244 NUF(vqrshl, 0000510, 3, (RNDQ, oRNDQ, RNDQ), neon_rshl),
19245 NUF(vqrshlq, 0000510, 3, (RNQ, oRNQ, RNQ), neon_rshl),
5287ad62
JB
19246 /* If not immediate, fall back to neon_dyadic_i64_su.
19247 shl_imm should accept I8 I16 I32 I64,
19248 qshl_imm should accept S8 S16 S32 S64 U8 U16 U32 U64. */
21d799b5
NC
19249 nUF(vshl, _vshl, 3, (RNDQ, oRNDQ, RNDQ_I63b), neon_shl_imm),
19250 nUF(vshlq, _vshl, 3, (RNQ, oRNQ, RNDQ_I63b), neon_shl_imm),
19251 nUF(vqshl, _vqshl, 3, (RNDQ, oRNDQ, RNDQ_I63b), neon_qshl_imm),
19252 nUF(vqshlq, _vqshl, 3, (RNQ, oRNQ, RNDQ_I63b), neon_qshl_imm),
5287ad62 19253 /* Logic ops, types optional & ignored. */
4316f0d2
DG
19254 nUF(vand, _vand, 3, (RNDQ, oRNDQ, RNDQ_Ibig), neon_logic),
19255 nUF(vandq, _vand, 3, (RNQ, oRNQ, RNDQ_Ibig), neon_logic),
19256 nUF(vbic, _vbic, 3, (RNDQ, oRNDQ, RNDQ_Ibig), neon_logic),
19257 nUF(vbicq, _vbic, 3, (RNQ, oRNQ, RNDQ_Ibig), neon_logic),
19258 nUF(vorr, _vorr, 3, (RNDQ, oRNDQ, RNDQ_Ibig), neon_logic),
19259 nUF(vorrq, _vorr, 3, (RNQ, oRNQ, RNDQ_Ibig), neon_logic),
19260 nUF(vorn, _vorn, 3, (RNDQ, oRNDQ, RNDQ_Ibig), neon_logic),
19261 nUF(vornq, _vorn, 3, (RNQ, oRNQ, RNDQ_Ibig), neon_logic),
19262 nUF(veor, _veor, 3, (RNDQ, oRNDQ, RNDQ), neon_logic),
19263 nUF(veorq, _veor, 3, (RNQ, oRNQ, RNQ), neon_logic),
5287ad62
JB
19264 /* Bitfield ops, untyped. */
19265 NUF(vbsl, 1100110, 3, (RNDQ, RNDQ, RNDQ), neon_bitfield),
19266 NUF(vbslq, 1100110, 3, (RNQ, RNQ, RNQ), neon_bitfield),
19267 NUF(vbit, 1200110, 3, (RNDQ, RNDQ, RNDQ), neon_bitfield),
19268 NUF(vbitq, 1200110, 3, (RNQ, RNQ, RNQ), neon_bitfield),
19269 NUF(vbif, 1300110, 3, (RNDQ, RNDQ, RNDQ), neon_bitfield),
19270 NUF(vbifq, 1300110, 3, (RNQ, RNQ, RNQ), neon_bitfield),
19271 /* Int and float variants, types S8 S16 S32 U8 U16 U32 F32. */
21d799b5
NC
19272 nUF(vabd, _vabd, 3, (RNDQ, oRNDQ, RNDQ), neon_dyadic_if_su),
19273 nUF(vabdq, _vabd, 3, (RNQ, oRNQ, RNQ), neon_dyadic_if_su),
19274 nUF(vmax, _vmax, 3, (RNDQ, oRNDQ, RNDQ), neon_dyadic_if_su),
19275 nUF(vmaxq, _vmax, 3, (RNQ, oRNQ, RNQ), neon_dyadic_if_su),
19276 nUF(vmin, _vmin, 3, (RNDQ, oRNDQ, RNDQ), neon_dyadic_if_su),
19277 nUF(vminq, _vmin, 3, (RNQ, oRNQ, RNQ), neon_dyadic_if_su),
5287ad62
JB
19278 /* Comparisons. Types S8 S16 S32 U8 U16 U32 F32. Non-immediate versions fall
19279 back to neon_dyadic_if_su. */
21d799b5
NC
19280 nUF(vcge, _vcge, 3, (RNDQ, oRNDQ, RNDQ_I0), neon_cmp),
19281 nUF(vcgeq, _vcge, 3, (RNQ, oRNQ, RNDQ_I0), neon_cmp),
19282 nUF(vcgt, _vcgt, 3, (RNDQ, oRNDQ, RNDQ_I0), neon_cmp),
19283 nUF(vcgtq, _vcgt, 3, (RNQ, oRNQ, RNDQ_I0), neon_cmp),
19284 nUF(vclt, _vclt, 3, (RNDQ, oRNDQ, RNDQ_I0), neon_cmp_inv),
19285 nUF(vcltq, _vclt, 3, (RNQ, oRNQ, RNDQ_I0), neon_cmp_inv),
19286 nUF(vcle, _vcle, 3, (RNDQ, oRNDQ, RNDQ_I0), neon_cmp_inv),
19287 nUF(vcleq, _vcle, 3, (RNQ, oRNQ, RNDQ_I0), neon_cmp_inv),
428e3f1f 19288 /* Comparison. Type I8 I16 I32 F32. */
21d799b5
NC
19289 nUF(vceq, _vceq, 3, (RNDQ, oRNDQ, RNDQ_I0), neon_ceq),
19290 nUF(vceqq, _vceq, 3, (RNQ, oRNQ, RNDQ_I0), neon_ceq),
5287ad62 19291 /* As above, D registers only. */
21d799b5
NC
19292 nUF(vpmax, _vpmax, 3, (RND, oRND, RND), neon_dyadic_if_su_d),
19293 nUF(vpmin, _vpmin, 3, (RND, oRND, RND), neon_dyadic_if_su_d),
5287ad62 19294 /* Int and float variants, signedness unimportant. */
21d799b5
NC
19295 nUF(vmlaq, _vmla, 3, (RNQ, oRNQ, RNDQ_RNSC), neon_mac_maybe_scalar),
19296 nUF(vmlsq, _vmls, 3, (RNQ, oRNQ, RNDQ_RNSC), neon_mac_maybe_scalar),
19297 nUF(vpadd, _vpadd, 3, (RND, oRND, RND), neon_dyadic_if_i_d),
5287ad62 19298 /* Add/sub take types I8 I16 I32 I64 F32. */
21d799b5
NC
19299 nUF(vaddq, _vadd, 3, (RNQ, oRNQ, RNQ), neon_addsub_if_i),
19300 nUF(vsubq, _vsub, 3, (RNQ, oRNQ, RNQ), neon_addsub_if_i),
5287ad62
JB
19301 /* vtst takes sizes 8, 16, 32. */
19302 NUF(vtst, 0000810, 3, (RNDQ, oRNDQ, RNDQ), neon_tst),
19303 NUF(vtstq, 0000810, 3, (RNQ, oRNQ, RNQ), neon_tst),
19304 /* VMUL takes I8 I16 I32 F32 P8. */
21d799b5 19305 nUF(vmulq, _vmul, 3, (RNQ, oRNQ, RNDQ_RNSC), neon_mul),
5287ad62 19306 /* VQD{R}MULH takes S16 S32. */
21d799b5
NC
19307 nUF(vqdmulh, _vqdmulh, 3, (RNDQ, oRNDQ, RNDQ_RNSC), neon_qdmulh),
19308 nUF(vqdmulhq, _vqdmulh, 3, (RNQ, oRNQ, RNDQ_RNSC), neon_qdmulh),
19309 nUF(vqrdmulh, _vqrdmulh, 3, (RNDQ, oRNDQ, RNDQ_RNSC), neon_qdmulh),
19310 nUF(vqrdmulhq, _vqrdmulh, 3, (RNQ, oRNQ, RNDQ_RNSC), neon_qdmulh),
5287ad62
JB
19311 NUF(vacge, 0000e10, 3, (RNDQ, oRNDQ, RNDQ), neon_fcmp_absolute),
19312 NUF(vacgeq, 0000e10, 3, (RNQ, oRNQ, RNQ), neon_fcmp_absolute),
19313 NUF(vacgt, 0200e10, 3, (RNDQ, oRNDQ, RNDQ), neon_fcmp_absolute),
19314 NUF(vacgtq, 0200e10, 3, (RNQ, oRNQ, RNQ), neon_fcmp_absolute),
92559b5b
PB
19315 NUF(vaclt, 0200e10, 3, (RNDQ, oRNDQ, RNDQ), neon_fcmp_absolute_inv),
19316 NUF(vacltq, 0200e10, 3, (RNQ, oRNQ, RNQ), neon_fcmp_absolute_inv),
19317 NUF(vacle, 0000e10, 3, (RNDQ, oRNDQ, RNDQ), neon_fcmp_absolute_inv),
19318 NUF(vacleq, 0000e10, 3, (RNQ, oRNQ, RNQ), neon_fcmp_absolute_inv),
5287ad62
JB
19319 NUF(vrecps, 0000f10, 3, (RNDQ, oRNDQ, RNDQ), neon_step),
19320 NUF(vrecpsq, 0000f10, 3, (RNQ, oRNQ, RNQ), neon_step),
19321 NUF(vrsqrts, 0200f10, 3, (RNDQ, oRNDQ, RNDQ), neon_step),
19322 NUF(vrsqrtsq, 0200f10, 3, (RNQ, oRNQ, RNQ), neon_step),
19323
19324 /* Two address, int/float. Types S8 S16 S32 F32. */
5287ad62 19325 NUF(vabsq, 1b10300, 2, (RNQ, RNQ), neon_abs_neg),
5287ad62
JB
19326 NUF(vnegq, 1b10380, 2, (RNQ, RNQ), neon_abs_neg),
19327
19328 /* Data processing with two registers and a shift amount. */
19329 /* Right shifts, and variants with rounding.
19330 Types accepted S8 S16 S32 S64 U8 U16 U32 U64. */
19331 NUF(vshr, 0800010, 3, (RNDQ, oRNDQ, I64z), neon_rshift_round_imm),
19332 NUF(vshrq, 0800010, 3, (RNQ, oRNQ, I64z), neon_rshift_round_imm),
19333 NUF(vrshr, 0800210, 3, (RNDQ, oRNDQ, I64z), neon_rshift_round_imm),
19334 NUF(vrshrq, 0800210, 3, (RNQ, oRNQ, I64z), neon_rshift_round_imm),
19335 NUF(vsra, 0800110, 3, (RNDQ, oRNDQ, I64), neon_rshift_round_imm),
19336 NUF(vsraq, 0800110, 3, (RNQ, oRNQ, I64), neon_rshift_round_imm),
19337 NUF(vrsra, 0800310, 3, (RNDQ, oRNDQ, I64), neon_rshift_round_imm),
19338 NUF(vrsraq, 0800310, 3, (RNQ, oRNQ, I64), neon_rshift_round_imm),
19339 /* Shift and insert. Sizes accepted 8 16 32 64. */
19340 NUF(vsli, 1800510, 3, (RNDQ, oRNDQ, I63), neon_sli),
19341 NUF(vsliq, 1800510, 3, (RNQ, oRNQ, I63), neon_sli),
19342 NUF(vsri, 1800410, 3, (RNDQ, oRNDQ, I64), neon_sri),
19343 NUF(vsriq, 1800410, 3, (RNQ, oRNQ, I64), neon_sri),
19344 /* QSHL{U} immediate accepts S8 S16 S32 S64 U8 U16 U32 U64. */
19345 NUF(vqshlu, 1800610, 3, (RNDQ, oRNDQ, I63), neon_qshlu_imm),
19346 NUF(vqshluq, 1800610, 3, (RNQ, oRNQ, I63), neon_qshlu_imm),
19347 /* Right shift immediate, saturating & narrowing, with rounding variants.
19348 Types accepted S16 S32 S64 U16 U32 U64. */
19349 NUF(vqshrn, 0800910, 3, (RND, RNQ, I32z), neon_rshift_sat_narrow),
19350 NUF(vqrshrn, 0800950, 3, (RND, RNQ, I32z), neon_rshift_sat_narrow),
19351 /* As above, unsigned. Types accepted S16 S32 S64. */
19352 NUF(vqshrun, 0800810, 3, (RND, RNQ, I32z), neon_rshift_sat_narrow_u),
19353 NUF(vqrshrun, 0800850, 3, (RND, RNQ, I32z), neon_rshift_sat_narrow_u),
19354 /* Right shift narrowing. Types accepted I16 I32 I64. */
19355 NUF(vshrn, 0800810, 3, (RND, RNQ, I32z), neon_rshift_narrow),
19356 NUF(vrshrn, 0800850, 3, (RND, RNQ, I32z), neon_rshift_narrow),
19357 /* Special case. Types S8 S16 S32 U8 U16 U32. Handles max shift variant. */
21d799b5 19358 nUF(vshll, _vshll, 3, (RNQ, RND, I32), neon_shll),
5287ad62 19359 /* CVT with optional immediate for fixed-point variant. */
21d799b5 19360 nUF(vcvtq, _vcvt, 3, (RNQ, RNQ, oI32b), neon_cvt),
b7fc2769 19361
4316f0d2
DG
19362 nUF(vmvn, _vmvn, 2, (RNDQ, RNDQ_Ibig), neon_mvn),
19363 nUF(vmvnq, _vmvn, 2, (RNQ, RNDQ_Ibig), neon_mvn),
5287ad62
JB
19364
19365 /* Data processing, three registers of different lengths. */
19366 /* Dyadic, long insns. Types S8 S16 S32 U8 U16 U32. */
19367 NUF(vabal, 0800500, 3, (RNQ, RND, RND), neon_abal),
19368 NUF(vabdl, 0800700, 3, (RNQ, RND, RND), neon_dyadic_long),
19369 NUF(vaddl, 0800000, 3, (RNQ, RND, RND), neon_dyadic_long),
19370 NUF(vsubl, 0800200, 3, (RNQ, RND, RND), neon_dyadic_long),
19371 /* If not scalar, fall back to neon_dyadic_long.
19372 Vector types as above, scalar types S16 S32 U16 U32. */
21d799b5
NC
19373 nUF(vmlal, _vmlal, 3, (RNQ, RND, RND_RNSC), neon_mac_maybe_scalar_long),
19374 nUF(vmlsl, _vmlsl, 3, (RNQ, RND, RND_RNSC), neon_mac_maybe_scalar_long),
5287ad62
JB
19375 /* Dyadic, widening insns. Types S8 S16 S32 U8 U16 U32. */
19376 NUF(vaddw, 0800100, 3, (RNQ, oRNQ, RND), neon_dyadic_wide),
19377 NUF(vsubw, 0800300, 3, (RNQ, oRNQ, RND), neon_dyadic_wide),
19378 /* Dyadic, narrowing insns. Types I16 I32 I64. */
19379 NUF(vaddhn, 0800400, 3, (RND, RNQ, RNQ), neon_dyadic_narrow),
19380 NUF(vraddhn, 1800400, 3, (RND, RNQ, RNQ), neon_dyadic_narrow),
19381 NUF(vsubhn, 0800600, 3, (RND, RNQ, RNQ), neon_dyadic_narrow),
19382 NUF(vrsubhn, 1800600, 3, (RND, RNQ, RNQ), neon_dyadic_narrow),
19383 /* Saturating doubling multiplies. Types S16 S32. */
21d799b5
NC
19384 nUF(vqdmlal, _vqdmlal, 3, (RNQ, RND, RND_RNSC), neon_mul_sat_scalar_long),
19385 nUF(vqdmlsl, _vqdmlsl, 3, (RNQ, RND, RND_RNSC), neon_mul_sat_scalar_long),
19386 nUF(vqdmull, _vqdmull, 3, (RNQ, RND, RND_RNSC), neon_mul_sat_scalar_long),
5287ad62
JB
19387 /* VMULL. Vector types S8 S16 S32 U8 U16 U32 P8, scalar types
19388 S16 S32 U16 U32. */
21d799b5 19389 nUF(vmull, _vmull, 3, (RNQ, RND, RND_RNSC), neon_vmull),
5287ad62
JB
19390
19391 /* Extract. Size 8. */
3b8d421e
PB
19392 NUF(vext, 0b00000, 4, (RNDQ, oRNDQ, RNDQ, I15), neon_ext),
19393 NUF(vextq, 0b00000, 4, (RNQ, oRNQ, RNQ, I15), neon_ext),
5287ad62
JB
19394
19395 /* Two registers, miscellaneous. */
19396 /* Reverse. Sizes 8 16 32 (must be < size in opcode). */
19397 NUF(vrev64, 1b00000, 2, (RNDQ, RNDQ), neon_rev),
19398 NUF(vrev64q, 1b00000, 2, (RNQ, RNQ), neon_rev),
19399 NUF(vrev32, 1b00080, 2, (RNDQ, RNDQ), neon_rev),
19400 NUF(vrev32q, 1b00080, 2, (RNQ, RNQ), neon_rev),
19401 NUF(vrev16, 1b00100, 2, (RNDQ, RNDQ), neon_rev),
19402 NUF(vrev16q, 1b00100, 2, (RNQ, RNQ), neon_rev),
19403 /* Vector replicate. Sizes 8 16 32. */
21d799b5
NC
19404 nCE(vdup, _vdup, 2, (RNDQ, RR_RNSC), neon_dup),
19405 nCE(vdupq, _vdup, 2, (RNQ, RR_RNSC), neon_dup),
5287ad62
JB
19406 /* VMOVL. Types S8 S16 S32 U8 U16 U32. */
19407 NUF(vmovl, 0800a10, 2, (RNQ, RND), neon_movl),
19408 /* VMOVN. Types I16 I32 I64. */
21d799b5 19409 nUF(vmovn, _vmovn, 2, (RND, RNQ), neon_movn),
5287ad62 19410 /* VQMOVN. Types S16 S32 S64 U16 U32 U64. */
21d799b5 19411 nUF(vqmovn, _vqmovn, 2, (RND, RNQ), neon_qmovn),
5287ad62 19412 /* VQMOVUN. Types S16 S32 S64. */
21d799b5 19413 nUF(vqmovun, _vqmovun, 2, (RND, RNQ), neon_qmovun),
5287ad62
JB
19414 /* VZIP / VUZP. Sizes 8 16 32. */
19415 NUF(vzip, 1b20180, 2, (RNDQ, RNDQ), neon_zip_uzp),
19416 NUF(vzipq, 1b20180, 2, (RNQ, RNQ), neon_zip_uzp),
19417 NUF(vuzp, 1b20100, 2, (RNDQ, RNDQ), neon_zip_uzp),
19418 NUF(vuzpq, 1b20100, 2, (RNQ, RNQ), neon_zip_uzp),
19419 /* VQABS / VQNEG. Types S8 S16 S32. */
19420 NUF(vqabs, 1b00700, 2, (RNDQ, RNDQ), neon_sat_abs_neg),
19421 NUF(vqabsq, 1b00700, 2, (RNQ, RNQ), neon_sat_abs_neg),
19422 NUF(vqneg, 1b00780, 2, (RNDQ, RNDQ), neon_sat_abs_neg),
19423 NUF(vqnegq, 1b00780, 2, (RNQ, RNQ), neon_sat_abs_neg),
19424 /* Pairwise, lengthening. Types S8 S16 S32 U8 U16 U32. */
19425 NUF(vpadal, 1b00600, 2, (RNDQ, RNDQ), neon_pair_long),
19426 NUF(vpadalq, 1b00600, 2, (RNQ, RNQ), neon_pair_long),
19427 NUF(vpaddl, 1b00200, 2, (RNDQ, RNDQ), neon_pair_long),
19428 NUF(vpaddlq, 1b00200, 2, (RNQ, RNQ), neon_pair_long),
19429 /* Reciprocal estimates. Types U32 F32. */
19430 NUF(vrecpe, 1b30400, 2, (RNDQ, RNDQ), neon_recip_est),
19431 NUF(vrecpeq, 1b30400, 2, (RNQ, RNQ), neon_recip_est),
19432 NUF(vrsqrte, 1b30480, 2, (RNDQ, RNDQ), neon_recip_est),
19433 NUF(vrsqrteq, 1b30480, 2, (RNQ, RNQ), neon_recip_est),
19434 /* VCLS. Types S8 S16 S32. */
19435 NUF(vcls, 1b00400, 2, (RNDQ, RNDQ), neon_cls),
19436 NUF(vclsq, 1b00400, 2, (RNQ, RNQ), neon_cls),
19437 /* VCLZ. Types I8 I16 I32. */
19438 NUF(vclz, 1b00480, 2, (RNDQ, RNDQ), neon_clz),
19439 NUF(vclzq, 1b00480, 2, (RNQ, RNQ), neon_clz),
19440 /* VCNT. Size 8. */
19441 NUF(vcnt, 1b00500, 2, (RNDQ, RNDQ), neon_cnt),
19442 NUF(vcntq, 1b00500, 2, (RNQ, RNQ), neon_cnt),
19443 /* Two address, untyped. */
19444 NUF(vswp, 1b20000, 2, (RNDQ, RNDQ), neon_swp),
19445 NUF(vswpq, 1b20000, 2, (RNQ, RNQ), neon_swp),
19446 /* VTRN. Sizes 8 16 32. */
21d799b5
NC
19447 nUF(vtrn, _vtrn, 2, (RNDQ, RNDQ), neon_trn),
19448 nUF(vtrnq, _vtrn, 2, (RNQ, RNQ), neon_trn),
5287ad62
JB
19449
19450 /* Table lookup. Size 8. */
19451 NUF(vtbl, 1b00800, 3, (RND, NRDLST, RND), neon_tbl_tbx),
19452 NUF(vtbx, 1b00840, 3, (RND, NRDLST, RND), neon_tbl_tbx),
19453
c921be7d
NC
19454#undef THUMB_VARIANT
19455#define THUMB_VARIANT & fpu_vfp_v3_or_neon_ext
19456#undef ARM_VARIANT
19457#define ARM_VARIANT & fpu_vfp_v3_or_neon_ext
19458
5287ad62 19459 /* Neon element/structure load/store. */
21d799b5
NC
19460 nUF(vld1, _vld1, 2, (NSTRLST, ADDR), neon_ldx_stx),
19461 nUF(vst1, _vst1, 2, (NSTRLST, ADDR), neon_ldx_stx),
19462 nUF(vld2, _vld2, 2, (NSTRLST, ADDR), neon_ldx_stx),
19463 nUF(vst2, _vst2, 2, (NSTRLST, ADDR), neon_ldx_stx),
19464 nUF(vld3, _vld3, 2, (NSTRLST, ADDR), neon_ldx_stx),
19465 nUF(vst3, _vst3, 2, (NSTRLST, ADDR), neon_ldx_stx),
19466 nUF(vld4, _vld4, 2, (NSTRLST, ADDR), neon_ldx_stx),
19467 nUF(vst4, _vst4, 2, (NSTRLST, ADDR), neon_ldx_stx),
5287ad62 19468
c921be7d 19469#undef THUMB_VARIANT
62f3b8c8
PB
19470#define THUMB_VARIANT &fpu_vfp_ext_v3xd
19471#undef ARM_VARIANT
19472#define ARM_VARIANT &fpu_vfp_ext_v3xd
19473 cCE("fconsts", eb00a00, 2, (RVS, I255), vfp_sp_const),
19474 cCE("fshtos", eba0a40, 2, (RVS, I16z), vfp_sp_conv_16),
19475 cCE("fsltos", eba0ac0, 2, (RVS, I32), vfp_sp_conv_32),
19476 cCE("fuhtos", ebb0a40, 2, (RVS, I16z), vfp_sp_conv_16),
19477 cCE("fultos", ebb0ac0, 2, (RVS, I32), vfp_sp_conv_32),
19478 cCE("ftoshs", ebe0a40, 2, (RVS, I16z), vfp_sp_conv_16),
19479 cCE("ftosls", ebe0ac0, 2, (RVS, I32), vfp_sp_conv_32),
19480 cCE("ftouhs", ebf0a40, 2, (RVS, I16z), vfp_sp_conv_16),
19481 cCE("ftouls", ebf0ac0, 2, (RVS, I32), vfp_sp_conv_32),
19482
19483#undef THUMB_VARIANT
c921be7d
NC
19484#define THUMB_VARIANT & fpu_vfp_ext_v3
19485#undef ARM_VARIANT
19486#define ARM_VARIANT & fpu_vfp_ext_v3
19487
21d799b5 19488 cCE("fconstd", eb00b00, 2, (RVD, I255), vfp_dp_const),
21d799b5 19489 cCE("fshtod", eba0b40, 2, (RVD, I16z), vfp_dp_conv_16),
21d799b5 19490 cCE("fsltod", eba0bc0, 2, (RVD, I32), vfp_dp_conv_32),
21d799b5 19491 cCE("fuhtod", ebb0b40, 2, (RVD, I16z), vfp_dp_conv_16),
21d799b5 19492 cCE("fultod", ebb0bc0, 2, (RVD, I32), vfp_dp_conv_32),
21d799b5 19493 cCE("ftoshd", ebe0b40, 2, (RVD, I16z), vfp_dp_conv_16),
21d799b5 19494 cCE("ftosld", ebe0bc0, 2, (RVD, I32), vfp_dp_conv_32),
21d799b5 19495 cCE("ftouhd", ebf0b40, 2, (RVD, I16z), vfp_dp_conv_16),
21d799b5 19496 cCE("ftould", ebf0bc0, 2, (RVD, I32), vfp_dp_conv_32),
c19d1205 19497
62f3b8c8
PB
19498#undef ARM_VARIANT
19499#define ARM_VARIANT &fpu_vfp_ext_fma
19500#undef THUMB_VARIANT
19501#define THUMB_VARIANT &fpu_vfp_ext_fma
19502 /* Mnemonics shared by Neon and VFP. These are included in the
19503 VFP FMA variant; NEON and VFP FMA always includes the NEON
19504 FMA instructions. */
19505 nCEF(vfma, _vfma, 3, (RNSDQ, oRNSDQ, RNSDQ), neon_fmac),
19506 nCEF(vfms, _vfms, 3, (RNSDQ, oRNSDQ, RNSDQ), neon_fmac),
19507 /* ffmas/ffmad/ffmss/ffmsd are dummy mnemonics to satisfy gas;
19508 the v form should always be used. */
19509 cCE("ffmas", ea00a00, 3, (RVS, RVS, RVS), vfp_sp_dyadic),
19510 cCE("ffnmas", ea00a40, 3, (RVS, RVS, RVS), vfp_sp_dyadic),
19511 cCE("ffmad", ea00b00, 3, (RVD, RVD, RVD), vfp_dp_rd_rn_rm),
19512 cCE("ffnmad", ea00b40, 3, (RVD, RVD, RVD), vfp_dp_rd_rn_rm),
19513 nCE(vfnma, _vfnma, 3, (RVSD, RVSD, RVSD), vfp_nsyn_nmul),
19514 nCE(vfnms, _vfnms, 3, (RVSD, RVSD, RVSD), vfp_nsyn_nmul),
19515
5287ad62 19516#undef THUMB_VARIANT
c921be7d
NC
19517#undef ARM_VARIANT
19518#define ARM_VARIANT & arm_cext_xscale /* Intel XScale extensions. */
19519
21d799b5
NC
19520 cCE("mia", e200010, 3, (RXA, RRnpc, RRnpc), xsc_mia),
19521 cCE("miaph", e280010, 3, (RXA, RRnpc, RRnpc), xsc_mia),
19522 cCE("miabb", e2c0010, 3, (RXA, RRnpc, RRnpc), xsc_mia),
19523 cCE("miabt", e2d0010, 3, (RXA, RRnpc, RRnpc), xsc_mia),
19524 cCE("miatb", e2e0010, 3, (RXA, RRnpc, RRnpc), xsc_mia),
19525 cCE("miatt", e2f0010, 3, (RXA, RRnpc, RRnpc), xsc_mia),
19526 cCE("mar", c400000, 3, (RXA, RRnpc, RRnpc), xsc_mar),
19527 cCE("mra", c500000, 3, (RRnpc, RRnpc, RXA), xsc_mra),
c19d1205 19528
c921be7d
NC
19529#undef ARM_VARIANT
19530#define ARM_VARIANT & arm_cext_iwmmxt /* Intel Wireless MMX technology. */
19531
21d799b5
NC
19532 cCE("tandcb", e13f130, 1, (RR), iwmmxt_tandorc),
19533 cCE("tandch", e53f130, 1, (RR), iwmmxt_tandorc),
19534 cCE("tandcw", e93f130, 1, (RR), iwmmxt_tandorc),
19535 cCE("tbcstb", e400010, 2, (RIWR, RR), rn_rd),
19536 cCE("tbcsth", e400050, 2, (RIWR, RR), rn_rd),
19537 cCE("tbcstw", e400090, 2, (RIWR, RR), rn_rd),
19538 cCE("textrcb", e130170, 2, (RR, I7), iwmmxt_textrc),
19539 cCE("textrch", e530170, 2, (RR, I7), iwmmxt_textrc),
19540 cCE("textrcw", e930170, 2, (RR, I7), iwmmxt_textrc),
19541 cCE("textrmub", e100070, 3, (RR, RIWR, I7), iwmmxt_textrm),
19542 cCE("textrmuh", e500070, 3, (RR, RIWR, I7), iwmmxt_textrm),
19543 cCE("textrmuw", e900070, 3, (RR, RIWR, I7), iwmmxt_textrm),
19544 cCE("textrmsb", e100078, 3, (RR, RIWR, I7), iwmmxt_textrm),
19545 cCE("textrmsh", e500078, 3, (RR, RIWR, I7), iwmmxt_textrm),
19546 cCE("textrmsw", e900078, 3, (RR, RIWR, I7), iwmmxt_textrm),
19547 cCE("tinsrb", e600010, 3, (RIWR, RR, I7), iwmmxt_tinsr),
19548 cCE("tinsrh", e600050, 3, (RIWR, RR, I7), iwmmxt_tinsr),
19549 cCE("tinsrw", e600090, 3, (RIWR, RR, I7), iwmmxt_tinsr),
19550 cCE("tmcr", e000110, 2, (RIWC_RIWG, RR), rn_rd),
19551 cCE("tmcrr", c400000, 3, (RIWR, RR, RR), rm_rd_rn),
19552 cCE("tmia", e200010, 3, (RIWR, RR, RR), iwmmxt_tmia),
19553 cCE("tmiaph", e280010, 3, (RIWR, RR, RR), iwmmxt_tmia),
19554 cCE("tmiabb", e2c0010, 3, (RIWR, RR, RR), iwmmxt_tmia),
19555 cCE("tmiabt", e2d0010, 3, (RIWR, RR, RR), iwmmxt_tmia),
19556 cCE("tmiatb", e2e0010, 3, (RIWR, RR, RR), iwmmxt_tmia),
19557 cCE("tmiatt", e2f0010, 3, (RIWR, RR, RR), iwmmxt_tmia),
19558 cCE("tmovmskb", e100030, 2, (RR, RIWR), rd_rn),
19559 cCE("tmovmskh", e500030, 2, (RR, RIWR), rd_rn),
19560 cCE("tmovmskw", e900030, 2, (RR, RIWR), rd_rn),
19561 cCE("tmrc", e100110, 2, (RR, RIWC_RIWG), rd_rn),
19562 cCE("tmrrc", c500000, 3, (RR, RR, RIWR), rd_rn_rm),
19563 cCE("torcb", e13f150, 1, (RR), iwmmxt_tandorc),
19564 cCE("torch", e53f150, 1, (RR), iwmmxt_tandorc),
19565 cCE("torcw", e93f150, 1, (RR), iwmmxt_tandorc),
19566 cCE("waccb", e0001c0, 2, (RIWR, RIWR), rd_rn),
19567 cCE("wacch", e4001c0, 2, (RIWR, RIWR), rd_rn),
19568 cCE("waccw", e8001c0, 2, (RIWR, RIWR), rd_rn),
19569 cCE("waddbss", e300180, 3, (RIWR, RIWR, RIWR), rd_rn_rm),
19570 cCE("waddb", e000180, 3, (RIWR, RIWR, RIWR), rd_rn_rm),
19571 cCE("waddbus", e100180, 3, (RIWR, RIWR, RIWR), rd_rn_rm),
19572 cCE("waddhss", e700180, 3, (RIWR, RIWR, RIWR), rd_rn_rm),
19573 cCE("waddh", e400180, 3, (RIWR, RIWR, RIWR), rd_rn_rm),
19574 cCE("waddhus", e500180, 3, (RIWR, RIWR, RIWR), rd_rn_rm),
19575 cCE("waddwss", eb00180, 3, (RIWR, RIWR, RIWR), rd_rn_rm),
19576 cCE("waddw", e800180, 3, (RIWR, RIWR, RIWR), rd_rn_rm),
19577 cCE("waddwus", e900180, 3, (RIWR, RIWR, RIWR), rd_rn_rm),
19578 cCE("waligni", e000020, 4, (RIWR, RIWR, RIWR, I7), iwmmxt_waligni),
19579 cCE("walignr0", e800020, 3, (RIWR, RIWR, RIWR), rd_rn_rm),
19580 cCE("walignr1", e900020, 3, (RIWR, RIWR, RIWR), rd_rn_rm),
19581 cCE("walignr2", ea00020, 3, (RIWR, RIWR, RIWR), rd_rn_rm),
19582 cCE("walignr3", eb00020, 3, (RIWR, RIWR, RIWR), rd_rn_rm),
19583 cCE("wand", e200000, 3, (RIWR, RIWR, RIWR), rd_rn_rm),
19584 cCE("wandn", e300000, 3, (RIWR, RIWR, RIWR), rd_rn_rm),
19585 cCE("wavg2b", e800000, 3, (RIWR, RIWR, RIWR), rd_rn_rm),
19586 cCE("wavg2br", e900000, 3, (RIWR, RIWR, RIWR), rd_rn_rm),
19587 cCE("wavg2h", ec00000, 3, (RIWR, RIWR, RIWR), rd_rn_rm),
19588 cCE("wavg2hr", ed00000, 3, (RIWR, RIWR, RIWR), rd_rn_rm),
19589 cCE("wcmpeqb", e000060, 3, (RIWR, RIWR, RIWR), rd_rn_rm),
19590 cCE("wcmpeqh", e400060, 3, (RIWR, RIWR, RIWR), rd_rn_rm),
19591 cCE("wcmpeqw", e800060, 3, (RIWR, RIWR, RIWR), rd_rn_rm),
19592 cCE("wcmpgtub", e100060, 3, (RIWR, RIWR, RIWR), rd_rn_rm),
19593 cCE("wcmpgtuh", e500060, 3, (RIWR, RIWR, RIWR), rd_rn_rm),
19594 cCE("wcmpgtuw", e900060, 3, (RIWR, RIWR, RIWR), rd_rn_rm),
19595 cCE("wcmpgtsb", e300060, 3, (RIWR, RIWR, RIWR), rd_rn_rm),
19596 cCE("wcmpgtsh", e700060, 3, (RIWR, RIWR, RIWR), rd_rn_rm),
19597 cCE("wcmpgtsw", eb00060, 3, (RIWR, RIWR, RIWR), rd_rn_rm),
19598 cCE("wldrb", c100000, 2, (RIWR, ADDR), iwmmxt_wldstbh),
19599 cCE("wldrh", c500000, 2, (RIWR, ADDR), iwmmxt_wldstbh),
19600 cCE("wldrw", c100100, 2, (RIWR_RIWC, ADDR), iwmmxt_wldstw),
19601 cCE("wldrd", c500100, 2, (RIWR, ADDR), iwmmxt_wldstd),
19602 cCE("wmacs", e600100, 3, (RIWR, RIWR, RIWR), rd_rn_rm),
19603 cCE("wmacsz", e700100, 3, (RIWR, RIWR, RIWR), rd_rn_rm),
19604 cCE("wmacu", e400100, 3, (RIWR, RIWR, RIWR), rd_rn_rm),
19605 cCE("wmacuz", e500100, 3, (RIWR, RIWR, RIWR), rd_rn_rm),
19606 cCE("wmadds", ea00100, 3, (RIWR, RIWR, RIWR), rd_rn_rm),
19607 cCE("wmaddu", e800100, 3, (RIWR, RIWR, RIWR), rd_rn_rm),
19608 cCE("wmaxsb", e200160, 3, (RIWR, RIWR, RIWR), rd_rn_rm),
19609 cCE("wmaxsh", e600160, 3, (RIWR, RIWR, RIWR), rd_rn_rm),
19610 cCE("wmaxsw", ea00160, 3, (RIWR, RIWR, RIWR), rd_rn_rm),
19611 cCE("wmaxub", e000160, 3, (RIWR, RIWR, RIWR), rd_rn_rm),
19612 cCE("wmaxuh", e400160, 3, (RIWR, RIWR, RIWR), rd_rn_rm),
19613 cCE("wmaxuw", e800160, 3, (RIWR, RIWR, RIWR), rd_rn_rm),
19614 cCE("wminsb", e300160, 3, (RIWR, RIWR, RIWR), rd_rn_rm),
19615 cCE("wminsh", e700160, 3, (RIWR, RIWR, RIWR), rd_rn_rm),
19616 cCE("wminsw", eb00160, 3, (RIWR, RIWR, RIWR), rd_rn_rm),
19617 cCE("wminub", e100160, 3, (RIWR, RIWR, RIWR), rd_rn_rm),
19618 cCE("wminuh", e500160, 3, (RIWR, RIWR, RIWR), rd_rn_rm),
19619 cCE("wminuw", e900160, 3, (RIWR, RIWR, RIWR), rd_rn_rm),
19620 cCE("wmov", e000000, 2, (RIWR, RIWR), iwmmxt_wmov),
19621 cCE("wmulsm", e300100, 3, (RIWR, RIWR, RIWR), rd_rn_rm),
19622 cCE("wmulsl", e200100, 3, (RIWR, RIWR, RIWR), rd_rn_rm),
19623 cCE("wmulum", e100100, 3, (RIWR, RIWR, RIWR), rd_rn_rm),
19624 cCE("wmulul", e000100, 3, (RIWR, RIWR, RIWR), rd_rn_rm),
19625 cCE("wor", e000000, 3, (RIWR, RIWR, RIWR), rd_rn_rm),
19626 cCE("wpackhss", e700080, 3, (RIWR, RIWR, RIWR), rd_rn_rm),
19627 cCE("wpackhus", e500080, 3, (RIWR, RIWR, RIWR), rd_rn_rm),
19628 cCE("wpackwss", eb00080, 3, (RIWR, RIWR, RIWR), rd_rn_rm),
19629 cCE("wpackwus", e900080, 3, (RIWR, RIWR, RIWR), rd_rn_rm),
19630 cCE("wpackdss", ef00080, 3, (RIWR, RIWR, RIWR), rd_rn_rm),
19631 cCE("wpackdus", ed00080, 3, (RIWR, RIWR, RIWR), rd_rn_rm),
19632 cCE("wrorh", e700040, 3, (RIWR, RIWR, RIWR_I32z),iwmmxt_wrwrwr_or_imm5),
19633 cCE("wrorhg", e700148, 3, (RIWR, RIWR, RIWG), rd_rn_rm),
19634 cCE("wrorw", eb00040, 3, (RIWR, RIWR, RIWR_I32z),iwmmxt_wrwrwr_or_imm5),
19635 cCE("wrorwg", eb00148, 3, (RIWR, RIWR, RIWG), rd_rn_rm),
19636 cCE("wrord", ef00040, 3, (RIWR, RIWR, RIWR_I32z),iwmmxt_wrwrwr_or_imm5),
19637 cCE("wrordg", ef00148, 3, (RIWR, RIWR, RIWG), rd_rn_rm),
19638 cCE("wsadb", e000120, 3, (RIWR, RIWR, RIWR), rd_rn_rm),
19639 cCE("wsadbz", e100120, 3, (RIWR, RIWR, RIWR), rd_rn_rm),
19640 cCE("wsadh", e400120, 3, (RIWR, RIWR, RIWR), rd_rn_rm),
19641 cCE("wsadhz", e500120, 3, (RIWR, RIWR, RIWR), rd_rn_rm),
19642 cCE("wshufh", e0001e0, 3, (RIWR, RIWR, I255), iwmmxt_wshufh),
19643 cCE("wsllh", e500040, 3, (RIWR, RIWR, RIWR_I32z),iwmmxt_wrwrwr_or_imm5),
19644 cCE("wsllhg", e500148, 3, (RIWR, RIWR, RIWG), rd_rn_rm),
19645 cCE("wsllw", e900040, 3, (RIWR, RIWR, RIWR_I32z),iwmmxt_wrwrwr_or_imm5),
19646 cCE("wsllwg", e900148, 3, (RIWR, RIWR, RIWG), rd_rn_rm),
19647 cCE("wslld", ed00040, 3, (RIWR, RIWR, RIWR_I32z),iwmmxt_wrwrwr_or_imm5),
19648 cCE("wslldg", ed00148, 3, (RIWR, RIWR, RIWG), rd_rn_rm),
19649 cCE("wsrah", e400040, 3, (RIWR, RIWR, RIWR_I32z),iwmmxt_wrwrwr_or_imm5),
19650 cCE("wsrahg", e400148, 3, (RIWR, RIWR, RIWG), rd_rn_rm),
19651 cCE("wsraw", e800040, 3, (RIWR, RIWR, RIWR_I32z),iwmmxt_wrwrwr_or_imm5),
19652 cCE("wsrawg", e800148, 3, (RIWR, RIWR, RIWG), rd_rn_rm),
19653 cCE("wsrad", ec00040, 3, (RIWR, RIWR, RIWR_I32z),iwmmxt_wrwrwr_or_imm5),
19654 cCE("wsradg", ec00148, 3, (RIWR, RIWR, RIWG), rd_rn_rm),
19655 cCE("wsrlh", e600040, 3, (RIWR, RIWR, RIWR_I32z),iwmmxt_wrwrwr_or_imm5),
19656 cCE("wsrlhg", e600148, 3, (RIWR, RIWR, RIWG), rd_rn_rm),
19657 cCE("wsrlw", ea00040, 3, (RIWR, RIWR, RIWR_I32z),iwmmxt_wrwrwr_or_imm5),
19658 cCE("wsrlwg", ea00148, 3, (RIWR, RIWR, RIWG), rd_rn_rm),
19659 cCE("wsrld", ee00040, 3, (RIWR, RIWR, RIWR_I32z),iwmmxt_wrwrwr_or_imm5),
19660 cCE("wsrldg", ee00148, 3, (RIWR, RIWR, RIWG), rd_rn_rm),
19661 cCE("wstrb", c000000, 2, (RIWR, ADDR), iwmmxt_wldstbh),
19662 cCE("wstrh", c400000, 2, (RIWR, ADDR), iwmmxt_wldstbh),
19663 cCE("wstrw", c000100, 2, (RIWR_RIWC, ADDR), iwmmxt_wldstw),
19664 cCE("wstrd", c400100, 2, (RIWR, ADDR), iwmmxt_wldstd),
19665 cCE("wsubbss", e3001a0, 3, (RIWR, RIWR, RIWR), rd_rn_rm),
19666 cCE("wsubb", e0001a0, 3, (RIWR, RIWR, RIWR), rd_rn_rm),
19667 cCE("wsubbus", e1001a0, 3, (RIWR, RIWR, RIWR), rd_rn_rm),
19668 cCE("wsubhss", e7001a0, 3, (RIWR, RIWR, RIWR), rd_rn_rm),
19669 cCE("wsubh", e4001a0, 3, (RIWR, RIWR, RIWR), rd_rn_rm),
19670 cCE("wsubhus", e5001a0, 3, (RIWR, RIWR, RIWR), rd_rn_rm),
19671 cCE("wsubwss", eb001a0, 3, (RIWR, RIWR, RIWR), rd_rn_rm),
19672 cCE("wsubw", e8001a0, 3, (RIWR, RIWR, RIWR), rd_rn_rm),
19673 cCE("wsubwus", e9001a0, 3, (RIWR, RIWR, RIWR), rd_rn_rm),
19674 cCE("wunpckehub",e0000c0, 2, (RIWR, RIWR), rd_rn),
19675 cCE("wunpckehuh",e4000c0, 2, (RIWR, RIWR), rd_rn),
19676 cCE("wunpckehuw",e8000c0, 2, (RIWR, RIWR), rd_rn),
19677 cCE("wunpckehsb",e2000c0, 2, (RIWR, RIWR), rd_rn),
19678 cCE("wunpckehsh",e6000c0, 2, (RIWR, RIWR), rd_rn),
19679 cCE("wunpckehsw",ea000c0, 2, (RIWR, RIWR), rd_rn),
19680 cCE("wunpckihb", e1000c0, 3, (RIWR, RIWR, RIWR), rd_rn_rm),
19681 cCE("wunpckihh", e5000c0, 3, (RIWR, RIWR, RIWR), rd_rn_rm),
19682 cCE("wunpckihw", e9000c0, 3, (RIWR, RIWR, RIWR), rd_rn_rm),
19683 cCE("wunpckelub",e0000e0, 2, (RIWR, RIWR), rd_rn),
19684 cCE("wunpckeluh",e4000e0, 2, (RIWR, RIWR), rd_rn),
19685 cCE("wunpckeluw",e8000e0, 2, (RIWR, RIWR), rd_rn),
19686 cCE("wunpckelsb",e2000e0, 2, (RIWR, RIWR), rd_rn),
19687 cCE("wunpckelsh",e6000e0, 2, (RIWR, RIWR), rd_rn),
19688 cCE("wunpckelsw",ea000e0, 2, (RIWR, RIWR), rd_rn),
19689 cCE("wunpckilb", e1000e0, 3, (RIWR, RIWR, RIWR), rd_rn_rm),
19690 cCE("wunpckilh", e5000e0, 3, (RIWR, RIWR, RIWR), rd_rn_rm),
19691 cCE("wunpckilw", e9000e0, 3, (RIWR, RIWR, RIWR), rd_rn_rm),
19692 cCE("wxor", e100000, 3, (RIWR, RIWR, RIWR), rd_rn_rm),
19693 cCE("wzero", e300000, 1, (RIWR), iwmmxt_wzero),
c19d1205 19694
c921be7d
NC
19695#undef ARM_VARIANT
19696#define ARM_VARIANT & arm_cext_iwmmxt2 /* Intel Wireless MMX technology, version 2. */
19697
21d799b5
NC
19698 cCE("torvscb", e12f190, 1, (RR), iwmmxt_tandorc),
19699 cCE("torvsch", e52f190, 1, (RR), iwmmxt_tandorc),
19700 cCE("torvscw", e92f190, 1, (RR), iwmmxt_tandorc),
19701 cCE("wabsb", e2001c0, 2, (RIWR, RIWR), rd_rn),
19702 cCE("wabsh", e6001c0, 2, (RIWR, RIWR), rd_rn),
19703 cCE("wabsw", ea001c0, 2, (RIWR, RIWR), rd_rn),
19704 cCE("wabsdiffb", e1001c0, 3, (RIWR, RIWR, RIWR), rd_rn_rm),
19705 cCE("wabsdiffh", e5001c0, 3, (RIWR, RIWR, RIWR), rd_rn_rm),
19706 cCE("wabsdiffw", e9001c0, 3, (RIWR, RIWR, RIWR), rd_rn_rm),
19707 cCE("waddbhusl", e2001a0, 3, (RIWR, RIWR, RIWR), rd_rn_rm),
19708 cCE("waddbhusm", e6001a0, 3, (RIWR, RIWR, RIWR), rd_rn_rm),
19709 cCE("waddhc", e600180, 3, (RIWR, RIWR, RIWR), rd_rn_rm),
19710 cCE("waddwc", ea00180, 3, (RIWR, RIWR, RIWR), rd_rn_rm),
19711 cCE("waddsubhx", ea001a0, 3, (RIWR, RIWR, RIWR), rd_rn_rm),
19712 cCE("wavg4", e400000, 3, (RIWR, RIWR, RIWR), rd_rn_rm),
19713 cCE("wavg4r", e500000, 3, (RIWR, RIWR, RIWR), rd_rn_rm),
19714 cCE("wmaddsn", ee00100, 3, (RIWR, RIWR, RIWR), rd_rn_rm),
19715 cCE("wmaddsx", eb00100, 3, (RIWR, RIWR, RIWR), rd_rn_rm),
19716 cCE("wmaddun", ec00100, 3, (RIWR, RIWR, RIWR), rd_rn_rm),
19717 cCE("wmaddux", e900100, 3, (RIWR, RIWR, RIWR), rd_rn_rm),
19718 cCE("wmerge", e000080, 4, (RIWR, RIWR, RIWR, I7), iwmmxt_wmerge),
19719 cCE("wmiabb", e0000a0, 3, (RIWR, RIWR, RIWR), rd_rn_rm),
19720 cCE("wmiabt", e1000a0, 3, (RIWR, RIWR, RIWR), rd_rn_rm),
19721 cCE("wmiatb", e2000a0, 3, (RIWR, RIWR, RIWR), rd_rn_rm),
19722 cCE("wmiatt", e3000a0, 3, (RIWR, RIWR, RIWR), rd_rn_rm),
19723 cCE("wmiabbn", e4000a0, 3, (RIWR, RIWR, RIWR), rd_rn_rm),
19724 cCE("wmiabtn", e5000a0, 3, (RIWR, RIWR, RIWR), rd_rn_rm),
19725 cCE("wmiatbn", e6000a0, 3, (RIWR, RIWR, RIWR), rd_rn_rm),
19726 cCE("wmiattn", e7000a0, 3, (RIWR, RIWR, RIWR), rd_rn_rm),
19727 cCE("wmiawbb", e800120, 3, (RIWR, RIWR, RIWR), rd_rn_rm),
19728 cCE("wmiawbt", e900120, 3, (RIWR, RIWR, RIWR), rd_rn_rm),
19729 cCE("wmiawtb", ea00120, 3, (RIWR, RIWR, RIWR), rd_rn_rm),
19730 cCE("wmiawtt", eb00120, 3, (RIWR, RIWR, RIWR), rd_rn_rm),
19731 cCE("wmiawbbn", ec00120, 3, (RIWR, RIWR, RIWR), rd_rn_rm),
19732 cCE("wmiawbtn", ed00120, 3, (RIWR, RIWR, RIWR), rd_rn_rm),
19733 cCE("wmiawtbn", ee00120, 3, (RIWR, RIWR, RIWR), rd_rn_rm),
19734 cCE("wmiawttn", ef00120, 3, (RIWR, RIWR, RIWR), rd_rn_rm),
19735 cCE("wmulsmr", ef00100, 3, (RIWR, RIWR, RIWR), rd_rn_rm),
19736 cCE("wmulumr", ed00100, 3, (RIWR, RIWR, RIWR), rd_rn_rm),
19737 cCE("wmulwumr", ec000c0, 3, (RIWR, RIWR, RIWR), rd_rn_rm),
19738 cCE("wmulwsmr", ee000c0, 3, (RIWR, RIWR, RIWR), rd_rn_rm),
19739 cCE("wmulwum", ed000c0, 3, (RIWR, RIWR, RIWR), rd_rn_rm),
19740 cCE("wmulwsm", ef000c0, 3, (RIWR, RIWR, RIWR), rd_rn_rm),
19741 cCE("wmulwl", eb000c0, 3, (RIWR, RIWR, RIWR), rd_rn_rm),
19742 cCE("wqmiabb", e8000a0, 3, (RIWR, RIWR, RIWR), rd_rn_rm),
19743 cCE("wqmiabt", e9000a0, 3, (RIWR, RIWR, RIWR), rd_rn_rm),
19744 cCE("wqmiatb", ea000a0, 3, (RIWR, RIWR, RIWR), rd_rn_rm),
19745 cCE("wqmiatt", eb000a0, 3, (RIWR, RIWR, RIWR), rd_rn_rm),
19746 cCE("wqmiabbn", ec000a0, 3, (RIWR, RIWR, RIWR), rd_rn_rm),
19747 cCE("wqmiabtn", ed000a0, 3, (RIWR, RIWR, RIWR), rd_rn_rm),
19748 cCE("wqmiatbn", ee000a0, 3, (RIWR, RIWR, RIWR), rd_rn_rm),
19749 cCE("wqmiattn", ef000a0, 3, (RIWR, RIWR, RIWR), rd_rn_rm),
19750 cCE("wqmulm", e100080, 3, (RIWR, RIWR, RIWR), rd_rn_rm),
19751 cCE("wqmulmr", e300080, 3, (RIWR, RIWR, RIWR), rd_rn_rm),
19752 cCE("wqmulwm", ec000e0, 3, (RIWR, RIWR, RIWR), rd_rn_rm),
19753 cCE("wqmulwmr", ee000e0, 3, (RIWR, RIWR, RIWR), rd_rn_rm),
19754 cCE("wsubaddhx", ed001c0, 3, (RIWR, RIWR, RIWR), rd_rn_rm),
2d447fca 19755
c921be7d
NC
19756#undef ARM_VARIANT
19757#define ARM_VARIANT & arm_cext_maverick /* Cirrus Maverick instructions. */
19758
21d799b5
NC
19759 cCE("cfldrs", c100400, 2, (RMF, ADDRGLDC), rd_cpaddr),
19760 cCE("cfldrd", c500400, 2, (RMD, ADDRGLDC), rd_cpaddr),
19761 cCE("cfldr32", c100500, 2, (RMFX, ADDRGLDC), rd_cpaddr),
19762 cCE("cfldr64", c500500, 2, (RMDX, ADDRGLDC), rd_cpaddr),
19763 cCE("cfstrs", c000400, 2, (RMF, ADDRGLDC), rd_cpaddr),
19764 cCE("cfstrd", c400400, 2, (RMD, ADDRGLDC), rd_cpaddr),
19765 cCE("cfstr32", c000500, 2, (RMFX, ADDRGLDC), rd_cpaddr),
19766 cCE("cfstr64", c400500, 2, (RMDX, ADDRGLDC), rd_cpaddr),
19767 cCE("cfmvsr", e000450, 2, (RMF, RR), rn_rd),
19768 cCE("cfmvrs", e100450, 2, (RR, RMF), rd_rn),
19769 cCE("cfmvdlr", e000410, 2, (RMD, RR), rn_rd),
19770 cCE("cfmvrdl", e100410, 2, (RR, RMD), rd_rn),
19771 cCE("cfmvdhr", e000430, 2, (RMD, RR), rn_rd),
19772 cCE("cfmvrdh", e100430, 2, (RR, RMD), rd_rn),
19773 cCE("cfmv64lr", e000510, 2, (RMDX, RR), rn_rd),
19774 cCE("cfmvr64l", e100510, 2, (RR, RMDX), rd_rn),
19775 cCE("cfmv64hr", e000530, 2, (RMDX, RR), rn_rd),
19776 cCE("cfmvr64h", e100530, 2, (RR, RMDX), rd_rn),
19777 cCE("cfmval32", e200440, 2, (RMAX, RMFX), rd_rn),
19778 cCE("cfmv32al", e100440, 2, (RMFX, RMAX), rd_rn),
19779 cCE("cfmvam32", e200460, 2, (RMAX, RMFX), rd_rn),
19780 cCE("cfmv32am", e100460, 2, (RMFX, RMAX), rd_rn),
19781 cCE("cfmvah32", e200480, 2, (RMAX, RMFX), rd_rn),
19782 cCE("cfmv32ah", e100480, 2, (RMFX, RMAX), rd_rn),
19783 cCE("cfmva32", e2004a0, 2, (RMAX, RMFX), rd_rn),
19784 cCE("cfmv32a", e1004a0, 2, (RMFX, RMAX), rd_rn),
19785 cCE("cfmva64", e2004c0, 2, (RMAX, RMDX), rd_rn),
19786 cCE("cfmv64a", e1004c0, 2, (RMDX, RMAX), rd_rn),
19787 cCE("cfmvsc32", e2004e0, 2, (RMDS, RMDX), mav_dspsc),
19788 cCE("cfmv32sc", e1004e0, 2, (RMDX, RMDS), rd),
19789 cCE("cfcpys", e000400, 2, (RMF, RMF), rd_rn),
19790 cCE("cfcpyd", e000420, 2, (RMD, RMD), rd_rn),
19791 cCE("cfcvtsd", e000460, 2, (RMD, RMF), rd_rn),
19792 cCE("cfcvtds", e000440, 2, (RMF, RMD), rd_rn),
19793 cCE("cfcvt32s", e000480, 2, (RMF, RMFX), rd_rn),
19794 cCE("cfcvt32d", e0004a0, 2, (RMD, RMFX), rd_rn),
19795 cCE("cfcvt64s", e0004c0, 2, (RMF, RMDX), rd_rn),
19796 cCE("cfcvt64d", e0004e0, 2, (RMD, RMDX), rd_rn),
19797 cCE("cfcvts32", e100580, 2, (RMFX, RMF), rd_rn),
19798 cCE("cfcvtd32", e1005a0, 2, (RMFX, RMD), rd_rn),
19799 cCE("cftruncs32",e1005c0, 2, (RMFX, RMF), rd_rn),
19800 cCE("cftruncd32",e1005e0, 2, (RMFX, RMD), rd_rn),
19801 cCE("cfrshl32", e000550, 3, (RMFX, RMFX, RR), mav_triple),
19802 cCE("cfrshl64", e000570, 3, (RMDX, RMDX, RR), mav_triple),
19803 cCE("cfsh32", e000500, 3, (RMFX, RMFX, I63s), mav_shift),
19804 cCE("cfsh64", e200500, 3, (RMDX, RMDX, I63s), mav_shift),
19805 cCE("cfcmps", e100490, 3, (RR, RMF, RMF), rd_rn_rm),
19806 cCE("cfcmpd", e1004b0, 3, (RR, RMD, RMD), rd_rn_rm),
19807 cCE("cfcmp32", e100590, 3, (RR, RMFX, RMFX), rd_rn_rm),
19808 cCE("cfcmp64", e1005b0, 3, (RR, RMDX, RMDX), rd_rn_rm),
19809 cCE("cfabss", e300400, 2, (RMF, RMF), rd_rn),
19810 cCE("cfabsd", e300420, 2, (RMD, RMD), rd_rn),
19811 cCE("cfnegs", e300440, 2, (RMF, RMF), rd_rn),
19812 cCE("cfnegd", e300460, 2, (RMD, RMD), rd_rn),
19813 cCE("cfadds", e300480, 3, (RMF, RMF, RMF), rd_rn_rm),
19814 cCE("cfaddd", e3004a0, 3, (RMD, RMD, RMD), rd_rn_rm),
19815 cCE("cfsubs", e3004c0, 3, (RMF, RMF, RMF), rd_rn_rm),
19816 cCE("cfsubd", e3004e0, 3, (RMD, RMD, RMD), rd_rn_rm),
19817 cCE("cfmuls", e100400, 3, (RMF, RMF, RMF), rd_rn_rm),
19818 cCE("cfmuld", e100420, 3, (RMD, RMD, RMD), rd_rn_rm),
19819 cCE("cfabs32", e300500, 2, (RMFX, RMFX), rd_rn),
19820 cCE("cfabs64", e300520, 2, (RMDX, RMDX), rd_rn),
19821 cCE("cfneg32", e300540, 2, (RMFX, RMFX), rd_rn),
19822 cCE("cfneg64", e300560, 2, (RMDX, RMDX), rd_rn),
19823 cCE("cfadd32", e300580, 3, (RMFX, RMFX, RMFX), rd_rn_rm),
19824 cCE("cfadd64", e3005a0, 3, (RMDX, RMDX, RMDX), rd_rn_rm),
19825 cCE("cfsub32", e3005c0, 3, (RMFX, RMFX, RMFX), rd_rn_rm),
19826 cCE("cfsub64", e3005e0, 3, (RMDX, RMDX, RMDX), rd_rn_rm),
19827 cCE("cfmul32", e100500, 3, (RMFX, RMFX, RMFX), rd_rn_rm),
19828 cCE("cfmul64", e100520, 3, (RMDX, RMDX, RMDX), rd_rn_rm),
19829 cCE("cfmac32", e100540, 3, (RMFX, RMFX, RMFX), rd_rn_rm),
19830 cCE("cfmsc32", e100560, 3, (RMFX, RMFX, RMFX), rd_rn_rm),
19831 cCE("cfmadd32", e000600, 4, (RMAX, RMFX, RMFX, RMFX), mav_quad),
19832 cCE("cfmsub32", e100600, 4, (RMAX, RMFX, RMFX, RMFX), mav_quad),
19833 cCE("cfmadda32", e200600, 4, (RMAX, RMAX, RMFX, RMFX), mav_quad),
19834 cCE("cfmsuba32", e300600, 4, (RMAX, RMAX, RMFX, RMFX), mav_quad),
c19d1205
ZW
19835};
19836#undef ARM_VARIANT
19837#undef THUMB_VARIANT
19838#undef TCE
c19d1205
ZW
19839#undef TUE
19840#undef TUF
19841#undef TCC
8f06b2d8 19842#undef cCE
e3cb604e
PB
19843#undef cCL
19844#undef C3E
c19d1205
ZW
19845#undef CE
19846#undef CM
19847#undef UE
19848#undef UF
19849#undef UT
5287ad62
JB
19850#undef NUF
19851#undef nUF
19852#undef NCE
19853#undef nCE
c19d1205
ZW
19854#undef OPS0
19855#undef OPS1
19856#undef OPS2
19857#undef OPS3
19858#undef OPS4
19859#undef OPS5
19860#undef OPS6
19861#undef do_0
19862\f
19863/* MD interface: bits in the object file. */
bfae80f2 19864
c19d1205
ZW
19865/* Turn an integer of n bytes (in val) into a stream of bytes appropriate
19866 for use in the a.out file, and stores them in the array pointed to by buf.
19867 This knows about the endian-ness of the target machine and does
19868 THE RIGHT THING, whatever it is. Possible values for n are 1 (byte)
19869 2 (short) and 4 (long) Floating numbers are put out as a series of
19870 LITTLENUMS (shorts, here at least). */
b99bd4ef 19871
c19d1205
ZW
19872void
19873md_number_to_chars (char * buf, valueT val, int n)
19874{
19875 if (target_big_endian)
19876 number_to_chars_bigendian (buf, val, n);
19877 else
19878 number_to_chars_littleendian (buf, val, n);
bfae80f2
RE
19879}
19880
c19d1205
ZW
19881static valueT
19882md_chars_to_number (char * buf, int n)
bfae80f2 19883{
c19d1205
ZW
19884 valueT result = 0;
19885 unsigned char * where = (unsigned char *) buf;
bfae80f2 19886
c19d1205 19887 if (target_big_endian)
b99bd4ef 19888 {
c19d1205
ZW
19889 while (n--)
19890 {
19891 result <<= 8;
19892 result |= (*where++ & 255);
19893 }
b99bd4ef 19894 }
c19d1205 19895 else
b99bd4ef 19896 {
c19d1205
ZW
19897 while (n--)
19898 {
19899 result <<= 8;
19900 result |= (where[n] & 255);
19901 }
bfae80f2 19902 }
b99bd4ef 19903
c19d1205 19904 return result;
bfae80f2 19905}
b99bd4ef 19906
c19d1205 19907/* MD interface: Sections. */
b99bd4ef 19908
fa94de6b
RM
19909/* Calculate the maximum variable size (i.e., excluding fr_fix)
19910 that an rs_machine_dependent frag may reach. */
19911
19912unsigned int
19913arm_frag_max_var (fragS *fragp)
19914{
19915 /* We only use rs_machine_dependent for variable-size Thumb instructions,
19916 which are either THUMB_SIZE (2) or INSN_SIZE (4).
19917
19918 Note that we generate relaxable instructions even for cases that don't
19919 really need it, like an immediate that's a trivial constant. So we're
19920 overestimating the instruction size for some of those cases. Rather
19921 than putting more intelligence here, it would probably be better to
19922 avoid generating a relaxation frag in the first place when it can be
19923 determined up front that a short instruction will suffice. */
19924
19925 gas_assert (fragp->fr_type == rs_machine_dependent);
19926 return INSN_SIZE;
19927}
19928
0110f2b8
PB
19929/* Estimate the size of a frag before relaxing. Assume everything fits in
19930 2 bytes. */
19931
c19d1205 19932int
0110f2b8 19933md_estimate_size_before_relax (fragS * fragp,
c19d1205
ZW
19934 segT segtype ATTRIBUTE_UNUSED)
19935{
0110f2b8
PB
19936 fragp->fr_var = 2;
19937 return 2;
19938}
19939
19940/* Convert a machine dependent frag. */
19941
19942void
19943md_convert_frag (bfd *abfd, segT asec ATTRIBUTE_UNUSED, fragS *fragp)
19944{
19945 unsigned long insn;
19946 unsigned long old_op;
19947 char *buf;
19948 expressionS exp;
19949 fixS *fixp;
19950 int reloc_type;
19951 int pc_rel;
19952 int opcode;
19953
19954 buf = fragp->fr_literal + fragp->fr_fix;
19955
19956 old_op = bfd_get_16(abfd, buf);
5f4273c7
NC
19957 if (fragp->fr_symbol)
19958 {
0110f2b8
PB
19959 exp.X_op = O_symbol;
19960 exp.X_add_symbol = fragp->fr_symbol;
5f4273c7
NC
19961 }
19962 else
19963 {
0110f2b8 19964 exp.X_op = O_constant;
5f4273c7 19965 }
0110f2b8
PB
19966 exp.X_add_number = fragp->fr_offset;
19967 opcode = fragp->fr_subtype;
19968 switch (opcode)
19969 {
19970 case T_MNEM_ldr_pc:
19971 case T_MNEM_ldr_pc2:
19972 case T_MNEM_ldr_sp:
19973 case T_MNEM_str_sp:
19974 case T_MNEM_ldr:
19975 case T_MNEM_ldrb:
19976 case T_MNEM_ldrh:
19977 case T_MNEM_str:
19978 case T_MNEM_strb:
19979 case T_MNEM_strh:
19980 if (fragp->fr_var == 4)
19981 {
5f4273c7 19982 insn = THUMB_OP32 (opcode);
0110f2b8
PB
19983 if ((old_op >> 12) == 4 || (old_op >> 12) == 9)
19984 {
19985 insn |= (old_op & 0x700) << 4;
19986 }
19987 else
19988 {
19989 insn |= (old_op & 7) << 12;
19990 insn |= (old_op & 0x38) << 13;
19991 }
19992 insn |= 0x00000c00;
19993 put_thumb32_insn (buf, insn);
19994 reloc_type = BFD_RELOC_ARM_T32_OFFSET_IMM;
19995 }
19996 else
19997 {
19998 reloc_type = BFD_RELOC_ARM_THUMB_OFFSET;
19999 }
20000 pc_rel = (opcode == T_MNEM_ldr_pc2);
20001 break;
20002 case T_MNEM_adr:
20003 if (fragp->fr_var == 4)
20004 {
20005 insn = THUMB_OP32 (opcode);
20006 insn |= (old_op & 0xf0) << 4;
20007 put_thumb32_insn (buf, insn);
20008 reloc_type = BFD_RELOC_ARM_T32_ADD_PC12;
20009 }
20010 else
20011 {
20012 reloc_type = BFD_RELOC_ARM_THUMB_ADD;
20013 exp.X_add_number -= 4;
20014 }
20015 pc_rel = 1;
20016 break;
20017 case T_MNEM_mov:
20018 case T_MNEM_movs:
20019 case T_MNEM_cmp:
20020 case T_MNEM_cmn:
20021 if (fragp->fr_var == 4)
20022 {
20023 int r0off = (opcode == T_MNEM_mov
20024 || opcode == T_MNEM_movs) ? 0 : 8;
20025 insn = THUMB_OP32 (opcode);
20026 insn = (insn & 0xe1ffffff) | 0x10000000;
20027 insn |= (old_op & 0x700) << r0off;
20028 put_thumb32_insn (buf, insn);
20029 reloc_type = BFD_RELOC_ARM_T32_IMMEDIATE;
20030 }
20031 else
20032 {
20033 reloc_type = BFD_RELOC_ARM_THUMB_IMM;
20034 }
20035 pc_rel = 0;
20036 break;
20037 case T_MNEM_b:
20038 if (fragp->fr_var == 4)
20039 {
20040 insn = THUMB_OP32(opcode);
20041 put_thumb32_insn (buf, insn);
20042 reloc_type = BFD_RELOC_THUMB_PCREL_BRANCH25;
20043 }
20044 else
20045 reloc_type = BFD_RELOC_THUMB_PCREL_BRANCH12;
20046 pc_rel = 1;
20047 break;
20048 case T_MNEM_bcond:
20049 if (fragp->fr_var == 4)
20050 {
20051 insn = THUMB_OP32(opcode);
20052 insn |= (old_op & 0xf00) << 14;
20053 put_thumb32_insn (buf, insn);
20054 reloc_type = BFD_RELOC_THUMB_PCREL_BRANCH20;
20055 }
20056 else
20057 reloc_type = BFD_RELOC_THUMB_PCREL_BRANCH9;
20058 pc_rel = 1;
20059 break;
20060 case T_MNEM_add_sp:
20061 case T_MNEM_add_pc:
20062 case T_MNEM_inc_sp:
20063 case T_MNEM_dec_sp:
20064 if (fragp->fr_var == 4)
20065 {
20066 /* ??? Choose between add and addw. */
20067 insn = THUMB_OP32 (opcode);
20068 insn |= (old_op & 0xf0) << 4;
20069 put_thumb32_insn (buf, insn);
16805f35
PB
20070 if (opcode == T_MNEM_add_pc)
20071 reloc_type = BFD_RELOC_ARM_T32_IMM12;
20072 else
20073 reloc_type = BFD_RELOC_ARM_T32_ADD_IMM;
0110f2b8
PB
20074 }
20075 else
20076 reloc_type = BFD_RELOC_ARM_THUMB_ADD;
20077 pc_rel = 0;
20078 break;
20079
20080 case T_MNEM_addi:
20081 case T_MNEM_addis:
20082 case T_MNEM_subi:
20083 case T_MNEM_subis:
20084 if (fragp->fr_var == 4)
20085 {
20086 insn = THUMB_OP32 (opcode);
20087 insn |= (old_op & 0xf0) << 4;
20088 insn |= (old_op & 0xf) << 16;
20089 put_thumb32_insn (buf, insn);
16805f35
PB
20090 if (insn & (1 << 20))
20091 reloc_type = BFD_RELOC_ARM_T32_ADD_IMM;
20092 else
20093 reloc_type = BFD_RELOC_ARM_T32_IMMEDIATE;
0110f2b8
PB
20094 }
20095 else
20096 reloc_type = BFD_RELOC_ARM_THUMB_ADD;
20097 pc_rel = 0;
20098 break;
20099 default:
5f4273c7 20100 abort ();
0110f2b8
PB
20101 }
20102 fixp = fix_new_exp (fragp, fragp->fr_fix, fragp->fr_var, &exp, pc_rel,
21d799b5 20103 (enum bfd_reloc_code_real) reloc_type);
0110f2b8
PB
20104 fixp->fx_file = fragp->fr_file;
20105 fixp->fx_line = fragp->fr_line;
20106 fragp->fr_fix += fragp->fr_var;
20107}
20108
20109/* Return the size of a relaxable immediate operand instruction.
20110 SHIFT and SIZE specify the form of the allowable immediate. */
20111static int
20112relax_immediate (fragS *fragp, int size, int shift)
20113{
20114 offsetT offset;
20115 offsetT mask;
20116 offsetT low;
20117
20118 /* ??? Should be able to do better than this. */
20119 if (fragp->fr_symbol)
20120 return 4;
20121
20122 low = (1 << shift) - 1;
20123 mask = (1 << (shift + size)) - (1 << shift);
20124 offset = fragp->fr_offset;
20125 /* Force misaligned offsets to 32-bit variant. */
20126 if (offset & low)
5e77afaa 20127 return 4;
0110f2b8
PB
20128 if (offset & ~mask)
20129 return 4;
20130 return 2;
20131}
20132
5e77afaa
PB
20133/* Get the address of a symbol during relaxation. */
20134static addressT
5f4273c7 20135relaxed_symbol_addr (fragS *fragp, long stretch)
5e77afaa
PB
20136{
20137 fragS *sym_frag;
20138 addressT addr;
20139 symbolS *sym;
20140
20141 sym = fragp->fr_symbol;
20142 sym_frag = symbol_get_frag (sym);
20143 know (S_GET_SEGMENT (sym) != absolute_section
20144 || sym_frag == &zero_address_frag);
20145 addr = S_GET_VALUE (sym) + fragp->fr_offset;
20146
20147 /* If frag has yet to be reached on this pass, assume it will
20148 move by STRETCH just as we did. If this is not so, it will
20149 be because some frag between grows, and that will force
20150 another pass. */
20151
20152 if (stretch != 0
20153 && sym_frag->relax_marker != fragp->relax_marker)
4396b686
PB
20154 {
20155 fragS *f;
20156
20157 /* Adjust stretch for any alignment frag. Note that if have
20158 been expanding the earlier code, the symbol may be
20159 defined in what appears to be an earlier frag. FIXME:
20160 This doesn't handle the fr_subtype field, which specifies
20161 a maximum number of bytes to skip when doing an
20162 alignment. */
20163 for (f = fragp; f != NULL && f != sym_frag; f = f->fr_next)
20164 {
20165 if (f->fr_type == rs_align || f->fr_type == rs_align_code)
20166 {
20167 if (stretch < 0)
20168 stretch = - ((- stretch)
20169 & ~ ((1 << (int) f->fr_offset) - 1));
20170 else
20171 stretch &= ~ ((1 << (int) f->fr_offset) - 1);
20172 if (stretch == 0)
20173 break;
20174 }
20175 }
20176 if (f != NULL)
20177 addr += stretch;
20178 }
5e77afaa
PB
20179
20180 return addr;
20181}
20182
0110f2b8
PB
20183/* Return the size of a relaxable adr pseudo-instruction or PC-relative
20184 load. */
20185static int
5e77afaa 20186relax_adr (fragS *fragp, asection *sec, long stretch)
0110f2b8
PB
20187{
20188 addressT addr;
20189 offsetT val;
20190
20191 /* Assume worst case for symbols not known to be in the same section. */
974da60d
NC
20192 if (fragp->fr_symbol == NULL
20193 || !S_IS_DEFINED (fragp->fr_symbol)
77db8e2e
NC
20194 || sec != S_GET_SEGMENT (fragp->fr_symbol)
20195 || S_IS_WEAK (fragp->fr_symbol))
0110f2b8
PB
20196 return 4;
20197
5f4273c7 20198 val = relaxed_symbol_addr (fragp, stretch);
0110f2b8
PB
20199 addr = fragp->fr_address + fragp->fr_fix;
20200 addr = (addr + 4) & ~3;
5e77afaa 20201 /* Force misaligned targets to 32-bit variant. */
0110f2b8 20202 if (val & 3)
5e77afaa 20203 return 4;
0110f2b8
PB
20204 val -= addr;
20205 if (val < 0 || val > 1020)
20206 return 4;
20207 return 2;
20208}
20209
20210/* Return the size of a relaxable add/sub immediate instruction. */
20211static int
20212relax_addsub (fragS *fragp, asection *sec)
20213{
20214 char *buf;
20215 int op;
20216
20217 buf = fragp->fr_literal + fragp->fr_fix;
20218 op = bfd_get_16(sec->owner, buf);
20219 if ((op & 0xf) == ((op >> 4) & 0xf))
20220 return relax_immediate (fragp, 8, 0);
20221 else
20222 return relax_immediate (fragp, 3, 0);
20223}
20224
e83a675f
RE
20225/* Return TRUE iff the definition of symbol S could be pre-empted
20226 (overridden) at link or load time. */
20227static bfd_boolean
20228symbol_preemptible (symbolS *s)
20229{
20230 /* Weak symbols can always be pre-empted. */
20231 if (S_IS_WEAK (s))
20232 return TRUE;
20233
20234 /* Non-global symbols cannot be pre-empted. */
20235 if (! S_IS_EXTERNAL (s))
20236 return FALSE;
20237
20238#ifdef OBJ_ELF
20239 /* In ELF, a global symbol can be marked protected, or private. In that
20240 case it can't be pre-empted (other definitions in the same link unit
20241 would violate the ODR). */
20242 if (ELF_ST_VISIBILITY (S_GET_OTHER (s)) > STV_DEFAULT)
20243 return FALSE;
20244#endif
20245
20246 /* Other global symbols might be pre-empted. */
20247 return TRUE;
20248}
0110f2b8
PB
20249
20250/* Return the size of a relaxable branch instruction. BITS is the
20251 size of the offset field in the narrow instruction. */
20252
20253static int
5e77afaa 20254relax_branch (fragS *fragp, asection *sec, int bits, long stretch)
0110f2b8
PB
20255{
20256 addressT addr;
20257 offsetT val;
20258 offsetT limit;
20259
20260 /* Assume worst case for symbols not known to be in the same section. */
5f4273c7 20261 if (!S_IS_DEFINED (fragp->fr_symbol)
77db8e2e
NC
20262 || sec != S_GET_SEGMENT (fragp->fr_symbol)
20263 || S_IS_WEAK (fragp->fr_symbol))
0110f2b8
PB
20264 return 4;
20265
267bf995 20266#ifdef OBJ_ELF
e83a675f 20267 /* A branch to a function in ARM state will require interworking. */
267bf995
RR
20268 if (S_IS_DEFINED (fragp->fr_symbol)
20269 && ARM_IS_FUNC (fragp->fr_symbol))
20270 return 4;
e83a675f 20271#endif
0d9b4b55 20272
e83a675f 20273 if (symbol_preemptible (fragp->fr_symbol))
0d9b4b55 20274 return 4;
267bf995 20275
5f4273c7 20276 val = relaxed_symbol_addr (fragp, stretch);
0110f2b8
PB
20277 addr = fragp->fr_address + fragp->fr_fix + 4;
20278 val -= addr;
20279
20280 /* Offset is a signed value *2 */
20281 limit = 1 << bits;
20282 if (val >= limit || val < -limit)
20283 return 4;
20284 return 2;
20285}
20286
20287
20288/* Relax a machine dependent frag. This returns the amount by which
20289 the current size of the frag should change. */
20290
20291int
5e77afaa 20292arm_relax_frag (asection *sec, fragS *fragp, long stretch)
0110f2b8
PB
20293{
20294 int oldsize;
20295 int newsize;
20296
20297 oldsize = fragp->fr_var;
20298 switch (fragp->fr_subtype)
20299 {
20300 case T_MNEM_ldr_pc2:
5f4273c7 20301 newsize = relax_adr (fragp, sec, stretch);
0110f2b8
PB
20302 break;
20303 case T_MNEM_ldr_pc:
20304 case T_MNEM_ldr_sp:
20305 case T_MNEM_str_sp:
5f4273c7 20306 newsize = relax_immediate (fragp, 8, 2);
0110f2b8
PB
20307 break;
20308 case T_MNEM_ldr:
20309 case T_MNEM_str:
5f4273c7 20310 newsize = relax_immediate (fragp, 5, 2);
0110f2b8
PB
20311 break;
20312 case T_MNEM_ldrh:
20313 case T_MNEM_strh:
5f4273c7 20314 newsize = relax_immediate (fragp, 5, 1);
0110f2b8
PB
20315 break;
20316 case T_MNEM_ldrb:
20317 case T_MNEM_strb:
5f4273c7 20318 newsize = relax_immediate (fragp, 5, 0);
0110f2b8
PB
20319 break;
20320 case T_MNEM_adr:
5f4273c7 20321 newsize = relax_adr (fragp, sec, stretch);
0110f2b8
PB
20322 break;
20323 case T_MNEM_mov:
20324 case T_MNEM_movs:
20325 case T_MNEM_cmp:
20326 case T_MNEM_cmn:
5f4273c7 20327 newsize = relax_immediate (fragp, 8, 0);
0110f2b8
PB
20328 break;
20329 case T_MNEM_b:
5f4273c7 20330 newsize = relax_branch (fragp, sec, 11, stretch);
0110f2b8
PB
20331 break;
20332 case T_MNEM_bcond:
5f4273c7 20333 newsize = relax_branch (fragp, sec, 8, stretch);
0110f2b8
PB
20334 break;
20335 case T_MNEM_add_sp:
20336 case T_MNEM_add_pc:
20337 newsize = relax_immediate (fragp, 8, 2);
20338 break;
20339 case T_MNEM_inc_sp:
20340 case T_MNEM_dec_sp:
20341 newsize = relax_immediate (fragp, 7, 2);
20342 break;
20343 case T_MNEM_addi:
20344 case T_MNEM_addis:
20345 case T_MNEM_subi:
20346 case T_MNEM_subis:
20347 newsize = relax_addsub (fragp, sec);
20348 break;
20349 default:
5f4273c7 20350 abort ();
0110f2b8 20351 }
5e77afaa
PB
20352
20353 fragp->fr_var = newsize;
20354 /* Freeze wide instructions that are at or before the same location as
20355 in the previous pass. This avoids infinite loops.
5f4273c7
NC
20356 Don't freeze them unconditionally because targets may be artificially
20357 misaligned by the expansion of preceding frags. */
5e77afaa 20358 if (stretch <= 0 && newsize > 2)
0110f2b8 20359 {
0110f2b8 20360 md_convert_frag (sec->owner, sec, fragp);
5f4273c7 20361 frag_wane (fragp);
0110f2b8 20362 }
5e77afaa 20363
0110f2b8 20364 return newsize - oldsize;
c19d1205 20365}
b99bd4ef 20366
c19d1205 20367/* Round up a section size to the appropriate boundary. */
b99bd4ef 20368
c19d1205
ZW
20369valueT
20370md_section_align (segT segment ATTRIBUTE_UNUSED,
20371 valueT size)
20372{
f0927246
NC
20373#if (defined (OBJ_AOUT) || defined (OBJ_MAYBE_AOUT))
20374 if (OUTPUT_FLAVOR == bfd_target_aout_flavour)
20375 {
20376 /* For a.out, force the section size to be aligned. If we don't do
20377 this, BFD will align it for us, but it will not write out the
20378 final bytes of the section. This may be a bug in BFD, but it is
20379 easier to fix it here since that is how the other a.out targets
20380 work. */
20381 int align;
20382
20383 align = bfd_get_section_alignment (stdoutput, segment);
20384 size = ((size + (1 << align) - 1) & ((valueT) -1 << align));
20385 }
c19d1205 20386#endif
f0927246
NC
20387
20388 return size;
bfae80f2 20389}
b99bd4ef 20390
c19d1205
ZW
20391/* This is called from HANDLE_ALIGN in write.c. Fill in the contents
20392 of an rs_align_code fragment. */
20393
20394void
20395arm_handle_align (fragS * fragP)
bfae80f2 20396{
e7495e45
NS
20397 static char const arm_noop[2][2][4] =
20398 {
20399 { /* ARMv1 */
20400 {0x00, 0x00, 0xa0, 0xe1}, /* LE */
20401 {0xe1, 0xa0, 0x00, 0x00}, /* BE */
20402 },
20403 { /* ARMv6k */
20404 {0x00, 0xf0, 0x20, 0xe3}, /* LE */
20405 {0xe3, 0x20, 0xf0, 0x00}, /* BE */
20406 },
20407 };
20408 static char const thumb_noop[2][2][2] =
20409 {
20410 { /* Thumb-1 */
20411 {0xc0, 0x46}, /* LE */
20412 {0x46, 0xc0}, /* BE */
20413 },
20414 { /* Thumb-2 */
20415 {0x00, 0xbf}, /* LE */
20416 {0xbf, 0x00} /* BE */
20417 }
20418 };
20419 static char const wide_thumb_noop[2][4] =
20420 { /* Wide Thumb-2 */
20421 {0xaf, 0xf3, 0x00, 0x80}, /* LE */
20422 {0xf3, 0xaf, 0x80, 0x00}, /* BE */
20423 };
c921be7d 20424
e7495e45 20425 unsigned bytes, fix, noop_size;
c19d1205
ZW
20426 char * p;
20427 const char * noop;
e7495e45 20428 const char *narrow_noop = NULL;
cd000bff
DJ
20429#ifdef OBJ_ELF
20430 enum mstate state;
20431#endif
bfae80f2 20432
c19d1205 20433 if (fragP->fr_type != rs_align_code)
bfae80f2
RE
20434 return;
20435
c19d1205
ZW
20436 bytes = fragP->fr_next->fr_address - fragP->fr_address - fragP->fr_fix;
20437 p = fragP->fr_literal + fragP->fr_fix;
20438 fix = 0;
bfae80f2 20439
c19d1205
ZW
20440 if (bytes > MAX_MEM_FOR_RS_ALIGN_CODE)
20441 bytes &= MAX_MEM_FOR_RS_ALIGN_CODE;
bfae80f2 20442
cd000bff 20443 gas_assert ((fragP->tc_frag_data.thumb_mode & MODE_RECORDED) != 0);
8dc2430f 20444
cd000bff 20445 if (fragP->tc_frag_data.thumb_mode & (~ MODE_RECORDED))
a737bd4d 20446 {
e7495e45
NS
20447 if (ARM_CPU_HAS_FEATURE (selected_cpu, arm_ext_v6t2))
20448 {
20449 narrow_noop = thumb_noop[1][target_big_endian];
20450 noop = wide_thumb_noop[target_big_endian];
20451 }
c19d1205 20452 else
e7495e45
NS
20453 noop = thumb_noop[0][target_big_endian];
20454 noop_size = 2;
cd000bff
DJ
20455#ifdef OBJ_ELF
20456 state = MAP_THUMB;
20457#endif
7ed4c4c5
NC
20458 }
20459 else
20460 {
e7495e45
NS
20461 noop = arm_noop[ARM_CPU_HAS_FEATURE (selected_cpu, arm_ext_v6k) != 0]
20462 [target_big_endian];
20463 noop_size = 4;
cd000bff
DJ
20464#ifdef OBJ_ELF
20465 state = MAP_ARM;
20466#endif
7ed4c4c5 20467 }
c921be7d 20468
e7495e45 20469 fragP->fr_var = noop_size;
c921be7d 20470
c19d1205 20471 if (bytes & (noop_size - 1))
7ed4c4c5 20472 {
c19d1205 20473 fix = bytes & (noop_size - 1);
cd000bff
DJ
20474#ifdef OBJ_ELF
20475 insert_data_mapping_symbol (state, fragP->fr_fix, fragP, fix);
20476#endif
c19d1205
ZW
20477 memset (p, 0, fix);
20478 p += fix;
20479 bytes -= fix;
a737bd4d 20480 }
a737bd4d 20481
e7495e45
NS
20482 if (narrow_noop)
20483 {
20484 if (bytes & noop_size)
20485 {
20486 /* Insert a narrow noop. */
20487 memcpy (p, narrow_noop, noop_size);
20488 p += noop_size;
20489 bytes -= noop_size;
20490 fix += noop_size;
20491 }
20492
20493 /* Use wide noops for the remainder */
20494 noop_size = 4;
20495 }
20496
c19d1205 20497 while (bytes >= noop_size)
a737bd4d 20498 {
c19d1205
ZW
20499 memcpy (p, noop, noop_size);
20500 p += noop_size;
20501 bytes -= noop_size;
20502 fix += noop_size;
a737bd4d
NC
20503 }
20504
c19d1205 20505 fragP->fr_fix += fix;
a737bd4d
NC
20506}
20507
c19d1205
ZW
20508/* Called from md_do_align. Used to create an alignment
20509 frag in a code section. */
20510
20511void
20512arm_frag_align_code (int n, int max)
bfae80f2 20513{
c19d1205 20514 char * p;
7ed4c4c5 20515
c19d1205 20516 /* We assume that there will never be a requirement
6ec8e702 20517 to support alignments greater than MAX_MEM_FOR_RS_ALIGN_CODE bytes. */
c19d1205 20518 if (max > MAX_MEM_FOR_RS_ALIGN_CODE)
6ec8e702
NC
20519 {
20520 char err_msg[128];
20521
fa94de6b 20522 sprintf (err_msg,
477330fc
RM
20523 _("alignments greater than %d bytes not supported in .text sections."),
20524 MAX_MEM_FOR_RS_ALIGN_CODE + 1);
20203fb9 20525 as_fatal ("%s", err_msg);
6ec8e702 20526 }
bfae80f2 20527
c19d1205
ZW
20528 p = frag_var (rs_align_code,
20529 MAX_MEM_FOR_RS_ALIGN_CODE,
20530 1,
20531 (relax_substateT) max,
20532 (symbolS *) NULL,
20533 (offsetT) n,
20534 (char *) NULL);
20535 *p = 0;
20536}
bfae80f2 20537
8dc2430f
NC
20538/* Perform target specific initialisation of a frag.
20539 Note - despite the name this initialisation is not done when the frag
20540 is created, but only when its type is assigned. A frag can be created
20541 and used a long time before its type is set, so beware of assuming that
20542 this initialisationis performed first. */
bfae80f2 20543
cd000bff
DJ
20544#ifndef OBJ_ELF
20545void
20546arm_init_frag (fragS * fragP, int max_chars ATTRIBUTE_UNUSED)
20547{
20548 /* Record whether this frag is in an ARM or a THUMB area. */
2e98972e 20549 fragP->tc_frag_data.thumb_mode = thumb_mode | MODE_RECORDED;
cd000bff
DJ
20550}
20551
20552#else /* OBJ_ELF is defined. */
c19d1205 20553void
cd000bff 20554arm_init_frag (fragS * fragP, int max_chars)
c19d1205 20555{
8dc2430f
NC
20556 /* If the current ARM vs THUMB mode has not already
20557 been recorded into this frag then do so now. */
cd000bff
DJ
20558 if ((fragP->tc_frag_data.thumb_mode & MODE_RECORDED) == 0)
20559 {
20560 fragP->tc_frag_data.thumb_mode = thumb_mode | MODE_RECORDED;
20561
20562 /* Record a mapping symbol for alignment frags. We will delete this
20563 later if the alignment ends up empty. */
20564 switch (fragP->fr_type)
20565 {
20566 case rs_align:
20567 case rs_align_test:
20568 case rs_fill:
20569 mapping_state_2 (MAP_DATA, max_chars);
20570 break;
20571 case rs_align_code:
20572 mapping_state_2 (thumb_mode ? MAP_THUMB : MAP_ARM, max_chars);
20573 break;
20574 default:
20575 break;
20576 }
20577 }
bfae80f2
RE
20578}
20579
c19d1205
ZW
20580/* When we change sections we need to issue a new mapping symbol. */
20581
20582void
20583arm_elf_change_section (void)
bfae80f2 20584{
c19d1205
ZW
20585 /* Link an unlinked unwind index table section to the .text section. */
20586 if (elf_section_type (now_seg) == SHT_ARM_EXIDX
20587 && elf_linked_to_section (now_seg) == NULL)
20588 elf_linked_to_section (now_seg) = text_section;
bfae80f2
RE
20589}
20590
c19d1205
ZW
20591int
20592arm_elf_section_type (const char * str, size_t len)
e45d0630 20593{
c19d1205
ZW
20594 if (len == 5 && strncmp (str, "exidx", 5) == 0)
20595 return SHT_ARM_EXIDX;
e45d0630 20596
c19d1205
ZW
20597 return -1;
20598}
20599\f
20600/* Code to deal with unwinding tables. */
e45d0630 20601
c19d1205 20602static void add_unwind_adjustsp (offsetT);
e45d0630 20603
5f4273c7 20604/* Generate any deferred unwind frame offset. */
e45d0630 20605
bfae80f2 20606static void
c19d1205 20607flush_pending_unwind (void)
bfae80f2 20608{
c19d1205 20609 offsetT offset;
bfae80f2 20610
c19d1205
ZW
20611 offset = unwind.pending_offset;
20612 unwind.pending_offset = 0;
20613 if (offset != 0)
20614 add_unwind_adjustsp (offset);
bfae80f2
RE
20615}
20616
c19d1205
ZW
20617/* Add an opcode to this list for this function. Two-byte opcodes should
20618 be passed as op[0] << 8 | op[1]. The list of opcodes is built in reverse
20619 order. */
20620
bfae80f2 20621static void
c19d1205 20622add_unwind_opcode (valueT op, int length)
bfae80f2 20623{
c19d1205
ZW
20624 /* Add any deferred stack adjustment. */
20625 if (unwind.pending_offset)
20626 flush_pending_unwind ();
bfae80f2 20627
c19d1205 20628 unwind.sp_restored = 0;
bfae80f2 20629
c19d1205 20630 if (unwind.opcode_count + length > unwind.opcode_alloc)
bfae80f2 20631 {
c19d1205
ZW
20632 unwind.opcode_alloc += ARM_OPCODE_CHUNK_SIZE;
20633 if (unwind.opcodes)
21d799b5 20634 unwind.opcodes = (unsigned char *) xrealloc (unwind.opcodes,
477330fc 20635 unwind.opcode_alloc);
c19d1205 20636 else
21d799b5 20637 unwind.opcodes = (unsigned char *) xmalloc (unwind.opcode_alloc);
bfae80f2 20638 }
c19d1205 20639 while (length > 0)
bfae80f2 20640 {
c19d1205
ZW
20641 length--;
20642 unwind.opcodes[unwind.opcode_count] = op & 0xff;
20643 op >>= 8;
20644 unwind.opcode_count++;
bfae80f2 20645 }
bfae80f2
RE
20646}
20647
c19d1205
ZW
20648/* Add unwind opcodes to adjust the stack pointer. */
20649
bfae80f2 20650static void
c19d1205 20651add_unwind_adjustsp (offsetT offset)
bfae80f2 20652{
c19d1205 20653 valueT op;
bfae80f2 20654
c19d1205 20655 if (offset > 0x200)
bfae80f2 20656 {
c19d1205
ZW
20657 /* We need at most 5 bytes to hold a 32-bit value in a uleb128. */
20658 char bytes[5];
20659 int n;
20660 valueT o;
bfae80f2 20661
c19d1205
ZW
20662 /* Long form: 0xb2, uleb128. */
20663 /* This might not fit in a word so add the individual bytes,
20664 remembering the list is built in reverse order. */
20665 o = (valueT) ((offset - 0x204) >> 2);
20666 if (o == 0)
20667 add_unwind_opcode (0, 1);
bfae80f2 20668
c19d1205
ZW
20669 /* Calculate the uleb128 encoding of the offset. */
20670 n = 0;
20671 while (o)
20672 {
20673 bytes[n] = o & 0x7f;
20674 o >>= 7;
20675 if (o)
20676 bytes[n] |= 0x80;
20677 n++;
20678 }
20679 /* Add the insn. */
20680 for (; n; n--)
20681 add_unwind_opcode (bytes[n - 1], 1);
20682 add_unwind_opcode (0xb2, 1);
20683 }
20684 else if (offset > 0x100)
bfae80f2 20685 {
c19d1205
ZW
20686 /* Two short opcodes. */
20687 add_unwind_opcode (0x3f, 1);
20688 op = (offset - 0x104) >> 2;
20689 add_unwind_opcode (op, 1);
bfae80f2 20690 }
c19d1205
ZW
20691 else if (offset > 0)
20692 {
20693 /* Short opcode. */
20694 op = (offset - 4) >> 2;
20695 add_unwind_opcode (op, 1);
20696 }
20697 else if (offset < 0)
bfae80f2 20698 {
c19d1205
ZW
20699 offset = -offset;
20700 while (offset > 0x100)
bfae80f2 20701 {
c19d1205
ZW
20702 add_unwind_opcode (0x7f, 1);
20703 offset -= 0x100;
bfae80f2 20704 }
c19d1205
ZW
20705 op = ((offset - 4) >> 2) | 0x40;
20706 add_unwind_opcode (op, 1);
bfae80f2 20707 }
bfae80f2
RE
20708}
20709
c19d1205
ZW
20710/* Finish the list of unwind opcodes for this function. */
20711static void
20712finish_unwind_opcodes (void)
bfae80f2 20713{
c19d1205 20714 valueT op;
bfae80f2 20715
c19d1205 20716 if (unwind.fp_used)
bfae80f2 20717 {
708587a4 20718 /* Adjust sp as necessary. */
c19d1205
ZW
20719 unwind.pending_offset += unwind.fp_offset - unwind.frame_size;
20720 flush_pending_unwind ();
bfae80f2 20721
c19d1205
ZW
20722 /* After restoring sp from the frame pointer. */
20723 op = 0x90 | unwind.fp_reg;
20724 add_unwind_opcode (op, 1);
20725 }
20726 else
20727 flush_pending_unwind ();
bfae80f2
RE
20728}
20729
bfae80f2 20730
c19d1205
ZW
20731/* Start an exception table entry. If idx is nonzero this is an index table
20732 entry. */
bfae80f2
RE
20733
20734static void
c19d1205 20735start_unwind_section (const segT text_seg, int idx)
bfae80f2 20736{
c19d1205
ZW
20737 const char * text_name;
20738 const char * prefix;
20739 const char * prefix_once;
20740 const char * group_name;
20741 size_t prefix_len;
20742 size_t text_len;
20743 char * sec_name;
20744 size_t sec_name_len;
20745 int type;
20746 int flags;
20747 int linkonce;
bfae80f2 20748
c19d1205 20749 if (idx)
bfae80f2 20750 {
c19d1205
ZW
20751 prefix = ELF_STRING_ARM_unwind;
20752 prefix_once = ELF_STRING_ARM_unwind_once;
20753 type = SHT_ARM_EXIDX;
bfae80f2 20754 }
c19d1205 20755 else
bfae80f2 20756 {
c19d1205
ZW
20757 prefix = ELF_STRING_ARM_unwind_info;
20758 prefix_once = ELF_STRING_ARM_unwind_info_once;
20759 type = SHT_PROGBITS;
bfae80f2
RE
20760 }
20761
c19d1205
ZW
20762 text_name = segment_name (text_seg);
20763 if (streq (text_name, ".text"))
20764 text_name = "";
20765
20766 if (strncmp (text_name, ".gnu.linkonce.t.",
20767 strlen (".gnu.linkonce.t.")) == 0)
bfae80f2 20768 {
c19d1205
ZW
20769 prefix = prefix_once;
20770 text_name += strlen (".gnu.linkonce.t.");
bfae80f2
RE
20771 }
20772
c19d1205
ZW
20773 prefix_len = strlen (prefix);
20774 text_len = strlen (text_name);
20775 sec_name_len = prefix_len + text_len;
21d799b5 20776 sec_name = (char *) xmalloc (sec_name_len + 1);
c19d1205
ZW
20777 memcpy (sec_name, prefix, prefix_len);
20778 memcpy (sec_name + prefix_len, text_name, text_len);
20779 sec_name[prefix_len + text_len] = '\0';
bfae80f2 20780
c19d1205
ZW
20781 flags = SHF_ALLOC;
20782 linkonce = 0;
20783 group_name = 0;
bfae80f2 20784
c19d1205
ZW
20785 /* Handle COMDAT group. */
20786 if (prefix != prefix_once && (text_seg->flags & SEC_LINK_ONCE) != 0)
bfae80f2 20787 {
c19d1205
ZW
20788 group_name = elf_group_name (text_seg);
20789 if (group_name == NULL)
20790 {
bd3ba5d1 20791 as_bad (_("Group section `%s' has no group signature"),
c19d1205
ZW
20792 segment_name (text_seg));
20793 ignore_rest_of_line ();
20794 return;
20795 }
20796 flags |= SHF_GROUP;
20797 linkonce = 1;
bfae80f2
RE
20798 }
20799
c19d1205 20800 obj_elf_change_section (sec_name, type, flags, 0, group_name, linkonce, 0);
bfae80f2 20801
5f4273c7 20802 /* Set the section link for index tables. */
c19d1205
ZW
20803 if (idx)
20804 elf_linked_to_section (now_seg) = text_seg;
bfae80f2
RE
20805}
20806
bfae80f2 20807
c19d1205
ZW
20808/* Start an unwind table entry. HAVE_DATA is nonzero if we have additional
20809 personality routine data. Returns zero, or the index table value for
20810 and inline entry. */
20811
20812static valueT
20813create_unwind_entry (int have_data)
bfae80f2 20814{
c19d1205
ZW
20815 int size;
20816 addressT where;
20817 char *ptr;
20818 /* The current word of data. */
20819 valueT data;
20820 /* The number of bytes left in this word. */
20821 int n;
bfae80f2 20822
c19d1205 20823 finish_unwind_opcodes ();
bfae80f2 20824
c19d1205
ZW
20825 /* Remember the current text section. */
20826 unwind.saved_seg = now_seg;
20827 unwind.saved_subseg = now_subseg;
bfae80f2 20828
c19d1205 20829 start_unwind_section (now_seg, 0);
bfae80f2 20830
c19d1205 20831 if (unwind.personality_routine == NULL)
bfae80f2 20832 {
c19d1205
ZW
20833 if (unwind.personality_index == -2)
20834 {
20835 if (have_data)
5f4273c7 20836 as_bad (_("handlerdata in cantunwind frame"));
c19d1205
ZW
20837 return 1; /* EXIDX_CANTUNWIND. */
20838 }
bfae80f2 20839
c19d1205
ZW
20840 /* Use a default personality routine if none is specified. */
20841 if (unwind.personality_index == -1)
20842 {
20843 if (unwind.opcode_count > 3)
20844 unwind.personality_index = 1;
20845 else
20846 unwind.personality_index = 0;
20847 }
bfae80f2 20848
c19d1205
ZW
20849 /* Space for the personality routine entry. */
20850 if (unwind.personality_index == 0)
20851 {
20852 if (unwind.opcode_count > 3)
20853 as_bad (_("too many unwind opcodes for personality routine 0"));
bfae80f2 20854
c19d1205
ZW
20855 if (!have_data)
20856 {
20857 /* All the data is inline in the index table. */
20858 data = 0x80;
20859 n = 3;
20860 while (unwind.opcode_count > 0)
20861 {
20862 unwind.opcode_count--;
20863 data = (data << 8) | unwind.opcodes[unwind.opcode_count];
20864 n--;
20865 }
bfae80f2 20866
c19d1205
ZW
20867 /* Pad with "finish" opcodes. */
20868 while (n--)
20869 data = (data << 8) | 0xb0;
bfae80f2 20870
c19d1205
ZW
20871 return data;
20872 }
20873 size = 0;
20874 }
20875 else
20876 /* We get two opcodes "free" in the first word. */
20877 size = unwind.opcode_count - 2;
20878 }
20879 else
5011093d
NC
20880 {
20881 gas_assert (unwind.personality_index == -1);
20882
20883 /* An extra byte is required for the opcode count. */
20884 size = unwind.opcode_count + 1;
20885 }
bfae80f2 20886
c19d1205
ZW
20887 size = (size + 3) >> 2;
20888 if (size > 0xff)
20889 as_bad (_("too many unwind opcodes"));
bfae80f2 20890
c19d1205
ZW
20891 frag_align (2, 0, 0);
20892 record_alignment (now_seg, 2);
20893 unwind.table_entry = expr_build_dot ();
20894
20895 /* Allocate the table entry. */
20896 ptr = frag_more ((size << 2) + 4);
74929e7b
NC
20897 /* PR 13449: Zero the table entries in case some of them are not used. */
20898 memset (ptr, 0, (size << 2) + 4);
c19d1205 20899 where = frag_now_fix () - ((size << 2) + 4);
bfae80f2 20900
c19d1205 20901 switch (unwind.personality_index)
bfae80f2 20902 {
c19d1205
ZW
20903 case -1:
20904 /* ??? Should this be a PLT generating relocation? */
20905 /* Custom personality routine. */
20906 fix_new (frag_now, where, 4, unwind.personality_routine, 0, 1,
20907 BFD_RELOC_ARM_PREL31);
bfae80f2 20908
c19d1205
ZW
20909 where += 4;
20910 ptr += 4;
bfae80f2 20911
c19d1205 20912 /* Set the first byte to the number of additional words. */
5011093d 20913 data = size > 0 ? size - 1 : 0;
c19d1205
ZW
20914 n = 3;
20915 break;
bfae80f2 20916
c19d1205
ZW
20917 /* ABI defined personality routines. */
20918 case 0:
20919 /* Three opcodes bytes are packed into the first word. */
20920 data = 0x80;
20921 n = 3;
20922 break;
bfae80f2 20923
c19d1205
ZW
20924 case 1:
20925 case 2:
20926 /* The size and first two opcode bytes go in the first word. */
20927 data = ((0x80 + unwind.personality_index) << 8) | size;
20928 n = 2;
20929 break;
bfae80f2 20930
c19d1205
ZW
20931 default:
20932 /* Should never happen. */
20933 abort ();
20934 }
bfae80f2 20935
c19d1205
ZW
20936 /* Pack the opcodes into words (MSB first), reversing the list at the same
20937 time. */
20938 while (unwind.opcode_count > 0)
20939 {
20940 if (n == 0)
20941 {
20942 md_number_to_chars (ptr, data, 4);
20943 ptr += 4;
20944 n = 4;
20945 data = 0;
20946 }
20947 unwind.opcode_count--;
20948 n--;
20949 data = (data << 8) | unwind.opcodes[unwind.opcode_count];
20950 }
20951
20952 /* Finish off the last word. */
20953 if (n < 4)
20954 {
20955 /* Pad with "finish" opcodes. */
20956 while (n--)
20957 data = (data << 8) | 0xb0;
20958
20959 md_number_to_chars (ptr, data, 4);
20960 }
20961
20962 if (!have_data)
20963 {
20964 /* Add an empty descriptor if there is no user-specified data. */
20965 ptr = frag_more (4);
20966 md_number_to_chars (ptr, 0, 4);
20967 }
20968
20969 return 0;
bfae80f2
RE
20970}
20971
f0927246
NC
20972
20973/* Initialize the DWARF-2 unwind information for this procedure. */
20974
20975void
20976tc_arm_frame_initial_instructions (void)
20977{
20978 cfi_add_CFA_def_cfa (REG_SP, 0);
20979}
20980#endif /* OBJ_ELF */
20981
c19d1205
ZW
20982/* Convert REGNAME to a DWARF-2 register number. */
20983
20984int
1df69f4f 20985tc_arm_regname_to_dw2regnum (char *regname)
bfae80f2 20986{
1df69f4f 20987 int reg = arm_reg_parse (&regname, REG_TYPE_RN);
c19d1205
ZW
20988
20989 if (reg == FAIL)
20990 return -1;
20991
20992 return reg;
bfae80f2
RE
20993}
20994
f0927246 20995#ifdef TE_PE
c19d1205 20996void
f0927246 20997tc_pe_dwarf2_emit_offset (symbolS *symbol, unsigned int size)
bfae80f2 20998{
91d6fa6a 20999 expressionS exp;
bfae80f2 21000
91d6fa6a
NC
21001 exp.X_op = O_secrel;
21002 exp.X_add_symbol = symbol;
21003 exp.X_add_number = 0;
21004 emit_expr (&exp, size);
f0927246
NC
21005}
21006#endif
bfae80f2 21007
c19d1205 21008/* MD interface: Symbol and relocation handling. */
bfae80f2 21009
2fc8bdac
ZW
21010/* Return the address within the segment that a PC-relative fixup is
21011 relative to. For ARM, PC-relative fixups applied to instructions
21012 are generally relative to the location of the fixup plus 8 bytes.
21013 Thumb branches are offset by 4, and Thumb loads relative to PC
21014 require special handling. */
bfae80f2 21015
c19d1205 21016long
2fc8bdac 21017md_pcrel_from_section (fixS * fixP, segT seg)
bfae80f2 21018{
2fc8bdac
ZW
21019 offsetT base = fixP->fx_where + fixP->fx_frag->fr_address;
21020
21021 /* If this is pc-relative and we are going to emit a relocation
21022 then we just want to put out any pipeline compensation that the linker
53baae48
NC
21023 will need. Otherwise we want to use the calculated base.
21024 For WinCE we skip the bias for externals as well, since this
21025 is how the MS ARM-CE assembler behaves and we want to be compatible. */
5f4273c7 21026 if (fixP->fx_pcrel
2fc8bdac 21027 && ((fixP->fx_addsy && S_GET_SEGMENT (fixP->fx_addsy) != seg)
53baae48
NC
21028 || (arm_force_relocation (fixP)
21029#ifdef TE_WINCE
21030 && !S_IS_EXTERNAL (fixP->fx_addsy)
21031#endif
21032 )))
2fc8bdac 21033 base = 0;
bfae80f2 21034
267bf995 21035
c19d1205 21036 switch (fixP->fx_r_type)
bfae80f2 21037 {
2fc8bdac
ZW
21038 /* PC relative addressing on the Thumb is slightly odd as the
21039 bottom two bits of the PC are forced to zero for the
21040 calculation. This happens *after* application of the
21041 pipeline offset. However, Thumb adrl already adjusts for
21042 this, so we need not do it again. */
c19d1205 21043 case BFD_RELOC_ARM_THUMB_ADD:
2fc8bdac 21044 return base & ~3;
c19d1205
ZW
21045
21046 case BFD_RELOC_ARM_THUMB_OFFSET:
21047 case BFD_RELOC_ARM_T32_OFFSET_IMM:
e9f89963 21048 case BFD_RELOC_ARM_T32_ADD_PC12:
8f06b2d8 21049 case BFD_RELOC_ARM_T32_CP_OFF_IMM:
2fc8bdac 21050 return (base + 4) & ~3;
c19d1205 21051
2fc8bdac
ZW
21052 /* Thumb branches are simply offset by +4. */
21053 case BFD_RELOC_THUMB_PCREL_BRANCH7:
21054 case BFD_RELOC_THUMB_PCREL_BRANCH9:
21055 case BFD_RELOC_THUMB_PCREL_BRANCH12:
21056 case BFD_RELOC_THUMB_PCREL_BRANCH20:
2fc8bdac 21057 case BFD_RELOC_THUMB_PCREL_BRANCH25:
2fc8bdac 21058 return base + 4;
bfae80f2 21059
267bf995 21060 case BFD_RELOC_THUMB_PCREL_BRANCH23:
486499d0
CL
21061 if (fixP->fx_addsy
21062 && (S_GET_SEGMENT (fixP->fx_addsy) == seg)
34e77a92 21063 && !S_FORCE_RELOC (fixP->fx_addsy, TRUE)
267bf995 21064 && ARM_IS_FUNC (fixP->fx_addsy)
477330fc
RM
21065 && ARM_CPU_HAS_FEATURE (selected_cpu, arm_ext_v5t))
21066 base = fixP->fx_where + fixP->fx_frag->fr_address;
267bf995
RR
21067 return base + 4;
21068
00adf2d4
JB
21069 /* BLX is like branches above, but forces the low two bits of PC to
21070 zero. */
486499d0
CL
21071 case BFD_RELOC_THUMB_PCREL_BLX:
21072 if (fixP->fx_addsy
21073 && (S_GET_SEGMENT (fixP->fx_addsy) == seg)
34e77a92 21074 && !S_FORCE_RELOC (fixP->fx_addsy, TRUE)
477330fc
RM
21075 && THUMB_IS_FUNC (fixP->fx_addsy)
21076 && ARM_CPU_HAS_FEATURE (selected_cpu, arm_ext_v5t))
21077 base = fixP->fx_where + fixP->fx_frag->fr_address;
00adf2d4
JB
21078 return (base + 4) & ~3;
21079
2fc8bdac
ZW
21080 /* ARM mode branches are offset by +8. However, the Windows CE
21081 loader expects the relocation not to take this into account. */
267bf995 21082 case BFD_RELOC_ARM_PCREL_BLX:
486499d0
CL
21083 if (fixP->fx_addsy
21084 && (S_GET_SEGMENT (fixP->fx_addsy) == seg)
34e77a92 21085 && !S_FORCE_RELOC (fixP->fx_addsy, TRUE)
477330fc
RM
21086 && ARM_IS_FUNC (fixP->fx_addsy)
21087 && ARM_CPU_HAS_FEATURE (selected_cpu, arm_ext_v5t))
21088 base = fixP->fx_where + fixP->fx_frag->fr_address;
486499d0 21089 return base + 8;
267bf995 21090
486499d0
CL
21091 case BFD_RELOC_ARM_PCREL_CALL:
21092 if (fixP->fx_addsy
21093 && (S_GET_SEGMENT (fixP->fx_addsy) == seg)
34e77a92 21094 && !S_FORCE_RELOC (fixP->fx_addsy, TRUE)
477330fc
RM
21095 && THUMB_IS_FUNC (fixP->fx_addsy)
21096 && ARM_CPU_HAS_FEATURE (selected_cpu, arm_ext_v5t))
21097 base = fixP->fx_where + fixP->fx_frag->fr_address;
486499d0 21098 return base + 8;
267bf995 21099
2fc8bdac 21100 case BFD_RELOC_ARM_PCREL_BRANCH:
39b41c9c 21101 case BFD_RELOC_ARM_PCREL_JUMP:
2fc8bdac 21102 case BFD_RELOC_ARM_PLT32:
c19d1205 21103#ifdef TE_WINCE
5f4273c7 21104 /* When handling fixups immediately, because we have already
477330fc 21105 discovered the value of a symbol, or the address of the frag involved
53baae48 21106 we must account for the offset by +8, as the OS loader will never see the reloc.
477330fc
RM
21107 see fixup_segment() in write.c
21108 The S_IS_EXTERNAL test handles the case of global symbols.
21109 Those need the calculated base, not just the pipe compensation the linker will need. */
53baae48
NC
21110 if (fixP->fx_pcrel
21111 && fixP->fx_addsy != NULL
21112 && (S_GET_SEGMENT (fixP->fx_addsy) == seg)
21113 && (S_IS_EXTERNAL (fixP->fx_addsy) || !arm_force_relocation (fixP)))
21114 return base + 8;
2fc8bdac 21115 return base;
c19d1205 21116#else
2fc8bdac 21117 return base + 8;
c19d1205 21118#endif
2fc8bdac 21119
267bf995 21120
2fc8bdac
ZW
21121 /* ARM mode loads relative to PC are also offset by +8. Unlike
21122 branches, the Windows CE loader *does* expect the relocation
21123 to take this into account. */
21124 case BFD_RELOC_ARM_OFFSET_IMM:
21125 case BFD_RELOC_ARM_OFFSET_IMM8:
21126 case BFD_RELOC_ARM_HWLITERAL:
21127 case BFD_RELOC_ARM_LITERAL:
21128 case BFD_RELOC_ARM_CP_OFF_IMM:
21129 return base + 8;
21130
21131
21132 /* Other PC-relative relocations are un-offset. */
21133 default:
21134 return base;
21135 }
bfae80f2
RE
21136}
21137
c19d1205
ZW
21138/* Under ELF we need to default _GLOBAL_OFFSET_TABLE.
21139 Otherwise we have no need to default values of symbols. */
21140
21141symbolS *
21142md_undefined_symbol (char * name ATTRIBUTE_UNUSED)
bfae80f2 21143{
c19d1205
ZW
21144#ifdef OBJ_ELF
21145 if (name[0] == '_' && name[1] == 'G'
21146 && streq (name, GLOBAL_OFFSET_TABLE_NAME))
21147 {
21148 if (!GOT_symbol)
21149 {
21150 if (symbol_find (name))
bd3ba5d1 21151 as_bad (_("GOT already in the symbol table"));
bfae80f2 21152
c19d1205
ZW
21153 GOT_symbol = symbol_new (name, undefined_section,
21154 (valueT) 0, & zero_address_frag);
21155 }
bfae80f2 21156
c19d1205 21157 return GOT_symbol;
bfae80f2 21158 }
c19d1205 21159#endif
bfae80f2 21160
c921be7d 21161 return NULL;
bfae80f2
RE
21162}
21163
55cf6793 21164/* Subroutine of md_apply_fix. Check to see if an immediate can be
c19d1205
ZW
21165 computed as two separate immediate values, added together. We
21166 already know that this value cannot be computed by just one ARM
21167 instruction. */
21168
21169static unsigned int
21170validate_immediate_twopart (unsigned int val,
21171 unsigned int * highpart)
bfae80f2 21172{
c19d1205
ZW
21173 unsigned int a;
21174 unsigned int i;
bfae80f2 21175
c19d1205
ZW
21176 for (i = 0; i < 32; i += 2)
21177 if (((a = rotate_left (val, i)) & 0xff) != 0)
21178 {
21179 if (a & 0xff00)
21180 {
21181 if (a & ~ 0xffff)
21182 continue;
21183 * highpart = (a >> 8) | ((i + 24) << 7);
21184 }
21185 else if (a & 0xff0000)
21186 {
21187 if (a & 0xff000000)
21188 continue;
21189 * highpart = (a >> 16) | ((i + 16) << 7);
21190 }
21191 else
21192 {
9c2799c2 21193 gas_assert (a & 0xff000000);
c19d1205
ZW
21194 * highpart = (a >> 24) | ((i + 8) << 7);
21195 }
bfae80f2 21196
c19d1205
ZW
21197 return (a & 0xff) | (i << 7);
21198 }
bfae80f2 21199
c19d1205 21200 return FAIL;
bfae80f2
RE
21201}
21202
c19d1205
ZW
21203static int
21204validate_offset_imm (unsigned int val, int hwse)
21205{
21206 if ((hwse && val > 255) || val > 4095)
21207 return FAIL;
21208 return val;
21209}
bfae80f2 21210
55cf6793 21211/* Subroutine of md_apply_fix. Do those data_ops which can take a
c19d1205
ZW
21212 negative immediate constant by altering the instruction. A bit of
21213 a hack really.
21214 MOV <-> MVN
21215 AND <-> BIC
21216 ADC <-> SBC
21217 by inverting the second operand, and
21218 ADD <-> SUB
21219 CMP <-> CMN
21220 by negating the second operand. */
bfae80f2 21221
c19d1205
ZW
21222static int
21223negate_data_op (unsigned long * instruction,
21224 unsigned long value)
bfae80f2 21225{
c19d1205
ZW
21226 int op, new_inst;
21227 unsigned long negated, inverted;
bfae80f2 21228
c19d1205
ZW
21229 negated = encode_arm_immediate (-value);
21230 inverted = encode_arm_immediate (~value);
bfae80f2 21231
c19d1205
ZW
21232 op = (*instruction >> DATA_OP_SHIFT) & 0xf;
21233 switch (op)
bfae80f2 21234 {
c19d1205
ZW
21235 /* First negates. */
21236 case OPCODE_SUB: /* ADD <-> SUB */
21237 new_inst = OPCODE_ADD;
21238 value = negated;
21239 break;
bfae80f2 21240
c19d1205
ZW
21241 case OPCODE_ADD:
21242 new_inst = OPCODE_SUB;
21243 value = negated;
21244 break;
bfae80f2 21245
c19d1205
ZW
21246 case OPCODE_CMP: /* CMP <-> CMN */
21247 new_inst = OPCODE_CMN;
21248 value = negated;
21249 break;
bfae80f2 21250
c19d1205
ZW
21251 case OPCODE_CMN:
21252 new_inst = OPCODE_CMP;
21253 value = negated;
21254 break;
bfae80f2 21255
c19d1205
ZW
21256 /* Now Inverted ops. */
21257 case OPCODE_MOV: /* MOV <-> MVN */
21258 new_inst = OPCODE_MVN;
21259 value = inverted;
21260 break;
bfae80f2 21261
c19d1205
ZW
21262 case OPCODE_MVN:
21263 new_inst = OPCODE_MOV;
21264 value = inverted;
21265 break;
bfae80f2 21266
c19d1205
ZW
21267 case OPCODE_AND: /* AND <-> BIC */
21268 new_inst = OPCODE_BIC;
21269 value = inverted;
21270 break;
bfae80f2 21271
c19d1205
ZW
21272 case OPCODE_BIC:
21273 new_inst = OPCODE_AND;
21274 value = inverted;
21275 break;
bfae80f2 21276
c19d1205
ZW
21277 case OPCODE_ADC: /* ADC <-> SBC */
21278 new_inst = OPCODE_SBC;
21279 value = inverted;
21280 break;
bfae80f2 21281
c19d1205
ZW
21282 case OPCODE_SBC:
21283 new_inst = OPCODE_ADC;
21284 value = inverted;
21285 break;
bfae80f2 21286
c19d1205
ZW
21287 /* We cannot do anything. */
21288 default:
21289 return FAIL;
b99bd4ef
NC
21290 }
21291
c19d1205
ZW
21292 if (value == (unsigned) FAIL)
21293 return FAIL;
21294
21295 *instruction &= OPCODE_MASK;
21296 *instruction |= new_inst << DATA_OP_SHIFT;
21297 return value;
b99bd4ef
NC
21298}
21299
ef8d22e6
PB
21300/* Like negate_data_op, but for Thumb-2. */
21301
21302static unsigned int
16dd5e42 21303thumb32_negate_data_op (offsetT *instruction, unsigned int value)
ef8d22e6
PB
21304{
21305 int op, new_inst;
21306 int rd;
16dd5e42 21307 unsigned int negated, inverted;
ef8d22e6
PB
21308
21309 negated = encode_thumb32_immediate (-value);
21310 inverted = encode_thumb32_immediate (~value);
21311
21312 rd = (*instruction >> 8) & 0xf;
21313 op = (*instruction >> T2_DATA_OP_SHIFT) & 0xf;
21314 switch (op)
21315 {
21316 /* ADD <-> SUB. Includes CMP <-> CMN. */
21317 case T2_OPCODE_SUB:
21318 new_inst = T2_OPCODE_ADD;
21319 value = negated;
21320 break;
21321
21322 case T2_OPCODE_ADD:
21323 new_inst = T2_OPCODE_SUB;
21324 value = negated;
21325 break;
21326
21327 /* ORR <-> ORN. Includes MOV <-> MVN. */
21328 case T2_OPCODE_ORR:
21329 new_inst = T2_OPCODE_ORN;
21330 value = inverted;
21331 break;
21332
21333 case T2_OPCODE_ORN:
21334 new_inst = T2_OPCODE_ORR;
21335 value = inverted;
21336 break;
21337
21338 /* AND <-> BIC. TST has no inverted equivalent. */
21339 case T2_OPCODE_AND:
21340 new_inst = T2_OPCODE_BIC;
21341 if (rd == 15)
21342 value = FAIL;
21343 else
21344 value = inverted;
21345 break;
21346
21347 case T2_OPCODE_BIC:
21348 new_inst = T2_OPCODE_AND;
21349 value = inverted;
21350 break;
21351
21352 /* ADC <-> SBC */
21353 case T2_OPCODE_ADC:
21354 new_inst = T2_OPCODE_SBC;
21355 value = inverted;
21356 break;
21357
21358 case T2_OPCODE_SBC:
21359 new_inst = T2_OPCODE_ADC;
21360 value = inverted;
21361 break;
21362
21363 /* We cannot do anything. */
21364 default:
21365 return FAIL;
21366 }
21367
16dd5e42 21368 if (value == (unsigned int)FAIL)
ef8d22e6
PB
21369 return FAIL;
21370
21371 *instruction &= T2_OPCODE_MASK;
21372 *instruction |= new_inst << T2_DATA_OP_SHIFT;
21373 return value;
21374}
21375
8f06b2d8
PB
21376/* Read a 32-bit thumb instruction from buf. */
21377static unsigned long
21378get_thumb32_insn (char * buf)
21379{
21380 unsigned long insn;
21381 insn = md_chars_to_number (buf, THUMB_SIZE) << 16;
21382 insn |= md_chars_to_number (buf + THUMB_SIZE, THUMB_SIZE);
21383
21384 return insn;
21385}
21386
a8bc6c78
PB
21387
21388/* We usually want to set the low bit on the address of thumb function
21389 symbols. In particular .word foo - . should have the low bit set.
21390 Generic code tries to fold the difference of two symbols to
21391 a constant. Prevent this and force a relocation when the first symbols
21392 is a thumb function. */
c921be7d
NC
21393
21394bfd_boolean
a8bc6c78
PB
21395arm_optimize_expr (expressionS *l, operatorT op, expressionS *r)
21396{
21397 if (op == O_subtract
21398 && l->X_op == O_symbol
21399 && r->X_op == O_symbol
21400 && THUMB_IS_FUNC (l->X_add_symbol))
21401 {
21402 l->X_op = O_subtract;
21403 l->X_op_symbol = r->X_add_symbol;
21404 l->X_add_number -= r->X_add_number;
c921be7d 21405 return TRUE;
a8bc6c78 21406 }
c921be7d 21407
a8bc6c78 21408 /* Process as normal. */
c921be7d 21409 return FALSE;
a8bc6c78
PB
21410}
21411
4a42ebbc
RR
21412/* Encode Thumb2 unconditional branches and calls. The encoding
21413 for the 2 are identical for the immediate values. */
21414
21415static void
21416encode_thumb2_b_bl_offset (char * buf, offsetT value)
21417{
21418#define T2I1I2MASK ((1 << 13) | (1 << 11))
21419 offsetT newval;
21420 offsetT newval2;
21421 addressT S, I1, I2, lo, hi;
21422
21423 S = (value >> 24) & 0x01;
21424 I1 = (value >> 23) & 0x01;
21425 I2 = (value >> 22) & 0x01;
21426 hi = (value >> 12) & 0x3ff;
fa94de6b 21427 lo = (value >> 1) & 0x7ff;
4a42ebbc
RR
21428 newval = md_chars_to_number (buf, THUMB_SIZE);
21429 newval2 = md_chars_to_number (buf + THUMB_SIZE, THUMB_SIZE);
21430 newval |= (S << 10) | hi;
21431 newval2 &= ~T2I1I2MASK;
21432 newval2 |= (((I1 ^ S) << 13) | ((I2 ^ S) << 11) | lo) ^ T2I1I2MASK;
21433 md_number_to_chars (buf, newval, THUMB_SIZE);
21434 md_number_to_chars (buf + THUMB_SIZE, newval2, THUMB_SIZE);
21435}
21436
c19d1205 21437void
55cf6793 21438md_apply_fix (fixS * fixP,
c19d1205
ZW
21439 valueT * valP,
21440 segT seg)
21441{
21442 offsetT value = * valP;
21443 offsetT newval;
21444 unsigned int newimm;
21445 unsigned long temp;
21446 int sign;
21447 char * buf = fixP->fx_where + fixP->fx_frag->fr_literal;
b99bd4ef 21448
9c2799c2 21449 gas_assert (fixP->fx_r_type <= BFD_RELOC_UNUSED);
b99bd4ef 21450
c19d1205 21451 /* Note whether this will delete the relocation. */
4962c51a 21452
c19d1205
ZW
21453 if (fixP->fx_addsy == 0 && !fixP->fx_pcrel)
21454 fixP->fx_done = 1;
b99bd4ef 21455
adbaf948 21456 /* On a 64-bit host, silently truncate 'value' to 32 bits for
5f4273c7 21457 consistency with the behaviour on 32-bit hosts. Remember value
adbaf948
ZW
21458 for emit_reloc. */
21459 value &= 0xffffffff;
21460 value ^= 0x80000000;
5f4273c7 21461 value -= 0x80000000;
adbaf948
ZW
21462
21463 *valP = value;
c19d1205 21464 fixP->fx_addnumber = value;
b99bd4ef 21465
adbaf948
ZW
21466 /* Same treatment for fixP->fx_offset. */
21467 fixP->fx_offset &= 0xffffffff;
21468 fixP->fx_offset ^= 0x80000000;
21469 fixP->fx_offset -= 0x80000000;
21470
c19d1205 21471 switch (fixP->fx_r_type)
b99bd4ef 21472 {
c19d1205
ZW
21473 case BFD_RELOC_NONE:
21474 /* This will need to go in the object file. */
21475 fixP->fx_done = 0;
21476 break;
b99bd4ef 21477
c19d1205
ZW
21478 case BFD_RELOC_ARM_IMMEDIATE:
21479 /* We claim that this fixup has been processed here,
21480 even if in fact we generate an error because we do
21481 not have a reloc for it, so tc_gen_reloc will reject it. */
21482 fixP->fx_done = 1;
b99bd4ef 21483
77db8e2e 21484 if (fixP->fx_addsy)
b99bd4ef 21485 {
77db8e2e 21486 const char *msg = 0;
b99bd4ef 21487
77db8e2e
NC
21488 if (! S_IS_DEFINED (fixP->fx_addsy))
21489 msg = _("undefined symbol %s used as an immediate value");
21490 else if (S_GET_SEGMENT (fixP->fx_addsy) != seg)
21491 msg = _("symbol %s is in a different section");
21492 else if (S_IS_WEAK (fixP->fx_addsy))
21493 msg = _("symbol %s is weak and may be overridden later");
21494
21495 if (msg)
21496 {
21497 as_bad_where (fixP->fx_file, fixP->fx_line,
21498 msg, S_GET_NAME (fixP->fx_addsy));
21499 break;
21500 }
42e5fcbf
AS
21501 }
21502
c19d1205
ZW
21503 temp = md_chars_to_number (buf, INSN_SIZE);
21504
5e73442d
SL
21505 /* If the offset is negative, we should use encoding A2 for ADR. */
21506 if ((temp & 0xfff0000) == 0x28f0000 && value < 0)
21507 newimm = negate_data_op (&temp, value);
21508 else
21509 {
21510 newimm = encode_arm_immediate (value);
21511
21512 /* If the instruction will fail, see if we can fix things up by
21513 changing the opcode. */
21514 if (newimm == (unsigned int) FAIL)
21515 newimm = negate_data_op (&temp, value);
21516 }
21517
21518 if (newimm == (unsigned int) FAIL)
b99bd4ef 21519 {
c19d1205
ZW
21520 as_bad_where (fixP->fx_file, fixP->fx_line,
21521 _("invalid constant (%lx) after fixup"),
21522 (unsigned long) value);
21523 break;
b99bd4ef 21524 }
b99bd4ef 21525
c19d1205
ZW
21526 newimm |= (temp & 0xfffff000);
21527 md_number_to_chars (buf, (valueT) newimm, INSN_SIZE);
21528 break;
b99bd4ef 21529
c19d1205
ZW
21530 case BFD_RELOC_ARM_ADRL_IMMEDIATE:
21531 {
21532 unsigned int highpart = 0;
21533 unsigned int newinsn = 0xe1a00000; /* nop. */
b99bd4ef 21534
77db8e2e 21535 if (fixP->fx_addsy)
42e5fcbf 21536 {
77db8e2e 21537 const char *msg = 0;
42e5fcbf 21538
77db8e2e
NC
21539 if (! S_IS_DEFINED (fixP->fx_addsy))
21540 msg = _("undefined symbol %s used as an immediate value");
21541 else if (S_GET_SEGMENT (fixP->fx_addsy) != seg)
21542 msg = _("symbol %s is in a different section");
21543 else if (S_IS_WEAK (fixP->fx_addsy))
21544 msg = _("symbol %s is weak and may be overridden later");
42e5fcbf 21545
77db8e2e
NC
21546 if (msg)
21547 {
21548 as_bad_where (fixP->fx_file, fixP->fx_line,
21549 msg, S_GET_NAME (fixP->fx_addsy));
21550 break;
21551 }
21552 }
fa94de6b 21553
c19d1205
ZW
21554 newimm = encode_arm_immediate (value);
21555 temp = md_chars_to_number (buf, INSN_SIZE);
b99bd4ef 21556
c19d1205
ZW
21557 /* If the instruction will fail, see if we can fix things up by
21558 changing the opcode. */
21559 if (newimm == (unsigned int) FAIL
21560 && (newimm = negate_data_op (& temp, value)) == (unsigned int) FAIL)
21561 {
21562 /* No ? OK - try using two ADD instructions to generate
21563 the value. */
21564 newimm = validate_immediate_twopart (value, & highpart);
b99bd4ef 21565
c19d1205
ZW
21566 /* Yes - then make sure that the second instruction is
21567 also an add. */
21568 if (newimm != (unsigned int) FAIL)
21569 newinsn = temp;
21570 /* Still No ? Try using a negated value. */
21571 else if ((newimm = validate_immediate_twopart (- value, & highpart)) != (unsigned int) FAIL)
21572 temp = newinsn = (temp & OPCODE_MASK) | OPCODE_SUB << DATA_OP_SHIFT;
21573 /* Otherwise - give up. */
21574 else
21575 {
21576 as_bad_where (fixP->fx_file, fixP->fx_line,
21577 _("unable to compute ADRL instructions for PC offset of 0x%lx"),
21578 (long) value);
21579 break;
21580 }
b99bd4ef 21581
c19d1205
ZW
21582 /* Replace the first operand in the 2nd instruction (which
21583 is the PC) with the destination register. We have
21584 already added in the PC in the first instruction and we
21585 do not want to do it again. */
21586 newinsn &= ~ 0xf0000;
21587 newinsn |= ((newinsn & 0x0f000) << 4);
21588 }
b99bd4ef 21589
c19d1205
ZW
21590 newimm |= (temp & 0xfffff000);
21591 md_number_to_chars (buf, (valueT) newimm, INSN_SIZE);
b99bd4ef 21592
c19d1205
ZW
21593 highpart |= (newinsn & 0xfffff000);
21594 md_number_to_chars (buf + INSN_SIZE, (valueT) highpart, INSN_SIZE);
21595 }
21596 break;
b99bd4ef 21597
c19d1205 21598 case BFD_RELOC_ARM_OFFSET_IMM:
00a97672
RS
21599 if (!fixP->fx_done && seg->use_rela_p)
21600 value = 0;
21601
c19d1205 21602 case BFD_RELOC_ARM_LITERAL:
26d97720 21603 sign = value > 0;
b99bd4ef 21604
c19d1205
ZW
21605 if (value < 0)
21606 value = - value;
b99bd4ef 21607
c19d1205 21608 if (validate_offset_imm (value, 0) == FAIL)
f03698e6 21609 {
c19d1205
ZW
21610 if (fixP->fx_r_type == BFD_RELOC_ARM_LITERAL)
21611 as_bad_where (fixP->fx_file, fixP->fx_line,
21612 _("invalid literal constant: pool needs to be closer"));
21613 else
21614 as_bad_where (fixP->fx_file, fixP->fx_line,
21615 _("bad immediate value for offset (%ld)"),
21616 (long) value);
21617 break;
f03698e6
RE
21618 }
21619
c19d1205 21620 newval = md_chars_to_number (buf, INSN_SIZE);
26d97720
NS
21621 if (value == 0)
21622 newval &= 0xfffff000;
21623 else
21624 {
21625 newval &= 0xff7ff000;
21626 newval |= value | (sign ? INDEX_UP : 0);
21627 }
c19d1205
ZW
21628 md_number_to_chars (buf, newval, INSN_SIZE);
21629 break;
b99bd4ef 21630
c19d1205
ZW
21631 case BFD_RELOC_ARM_OFFSET_IMM8:
21632 case BFD_RELOC_ARM_HWLITERAL:
26d97720 21633 sign = value > 0;
b99bd4ef 21634
c19d1205
ZW
21635 if (value < 0)
21636 value = - value;
b99bd4ef 21637
c19d1205 21638 if (validate_offset_imm (value, 1) == FAIL)
b99bd4ef 21639 {
c19d1205
ZW
21640 if (fixP->fx_r_type == BFD_RELOC_ARM_HWLITERAL)
21641 as_bad_where (fixP->fx_file, fixP->fx_line,
21642 _("invalid literal constant: pool needs to be closer"));
21643 else
427d0db6
RM
21644 as_bad_where (fixP->fx_file, fixP->fx_line,
21645 _("bad immediate value for 8-bit offset (%ld)"),
21646 (long) value);
c19d1205 21647 break;
b99bd4ef
NC
21648 }
21649
c19d1205 21650 newval = md_chars_to_number (buf, INSN_SIZE);
26d97720
NS
21651 if (value == 0)
21652 newval &= 0xfffff0f0;
21653 else
21654 {
21655 newval &= 0xff7ff0f0;
21656 newval |= ((value >> 4) << 8) | (value & 0xf) | (sign ? INDEX_UP : 0);
21657 }
c19d1205
ZW
21658 md_number_to_chars (buf, newval, INSN_SIZE);
21659 break;
b99bd4ef 21660
c19d1205
ZW
21661 case BFD_RELOC_ARM_T32_OFFSET_U8:
21662 if (value < 0 || value > 1020 || value % 4 != 0)
21663 as_bad_where (fixP->fx_file, fixP->fx_line,
21664 _("bad immediate value for offset (%ld)"), (long) value);
21665 value /= 4;
b99bd4ef 21666
c19d1205 21667 newval = md_chars_to_number (buf+2, THUMB_SIZE);
c19d1205
ZW
21668 newval |= value;
21669 md_number_to_chars (buf+2, newval, THUMB_SIZE);
21670 break;
b99bd4ef 21671
c19d1205
ZW
21672 case BFD_RELOC_ARM_T32_OFFSET_IMM:
21673 /* This is a complicated relocation used for all varieties of Thumb32
21674 load/store instruction with immediate offset:
21675
21676 1110 100P u1WL NNNN XXXX YYYY iiii iiii - +/-(U) pre/post(P) 8-bit,
477330fc 21677 *4, optional writeback(W)
c19d1205
ZW
21678 (doubleword load/store)
21679
21680 1111 100S uTTL 1111 XXXX iiii iiii iiii - +/-(U) 12-bit PC-rel
21681 1111 100S 0TTL NNNN XXXX 1Pu1 iiii iiii - +/-(U) pre/post(P) 8-bit
21682 1111 100S 0TTL NNNN XXXX 1110 iiii iiii - positive 8-bit (T instruction)
21683 1111 100S 1TTL NNNN XXXX iiii iiii iiii - positive 12-bit
21684 1111 100S 0TTL NNNN XXXX 1100 iiii iiii - negative 8-bit
21685
21686 Uppercase letters indicate bits that are already encoded at
21687 this point. Lowercase letters are our problem. For the
21688 second block of instructions, the secondary opcode nybble
21689 (bits 8..11) is present, and bit 23 is zero, even if this is
21690 a PC-relative operation. */
21691 newval = md_chars_to_number (buf, THUMB_SIZE);
21692 newval <<= 16;
21693 newval |= md_chars_to_number (buf+THUMB_SIZE, THUMB_SIZE);
b99bd4ef 21694
c19d1205 21695 if ((newval & 0xf0000000) == 0xe0000000)
b99bd4ef 21696 {
c19d1205
ZW
21697 /* Doubleword load/store: 8-bit offset, scaled by 4. */
21698 if (value >= 0)
21699 newval |= (1 << 23);
21700 else
21701 value = -value;
21702 if (value % 4 != 0)
21703 {
21704 as_bad_where (fixP->fx_file, fixP->fx_line,
21705 _("offset not a multiple of 4"));
21706 break;
21707 }
21708 value /= 4;
216d22bc 21709 if (value > 0xff)
c19d1205
ZW
21710 {
21711 as_bad_where (fixP->fx_file, fixP->fx_line,
21712 _("offset out of range"));
21713 break;
21714 }
21715 newval &= ~0xff;
b99bd4ef 21716 }
c19d1205 21717 else if ((newval & 0x000f0000) == 0x000f0000)
b99bd4ef 21718 {
c19d1205
ZW
21719 /* PC-relative, 12-bit offset. */
21720 if (value >= 0)
21721 newval |= (1 << 23);
21722 else
21723 value = -value;
216d22bc 21724 if (value > 0xfff)
c19d1205
ZW
21725 {
21726 as_bad_where (fixP->fx_file, fixP->fx_line,
21727 _("offset out of range"));
21728 break;
21729 }
21730 newval &= ~0xfff;
b99bd4ef 21731 }
c19d1205 21732 else if ((newval & 0x00000100) == 0x00000100)
b99bd4ef 21733 {
c19d1205
ZW
21734 /* Writeback: 8-bit, +/- offset. */
21735 if (value >= 0)
21736 newval |= (1 << 9);
21737 else
21738 value = -value;
216d22bc 21739 if (value > 0xff)
c19d1205
ZW
21740 {
21741 as_bad_where (fixP->fx_file, fixP->fx_line,
21742 _("offset out of range"));
21743 break;
21744 }
21745 newval &= ~0xff;
b99bd4ef 21746 }
c19d1205 21747 else if ((newval & 0x00000f00) == 0x00000e00)
b99bd4ef 21748 {
c19d1205 21749 /* T-instruction: positive 8-bit offset. */
216d22bc 21750 if (value < 0 || value > 0xff)
b99bd4ef 21751 {
c19d1205
ZW
21752 as_bad_where (fixP->fx_file, fixP->fx_line,
21753 _("offset out of range"));
21754 break;
b99bd4ef 21755 }
c19d1205
ZW
21756 newval &= ~0xff;
21757 newval |= value;
b99bd4ef
NC
21758 }
21759 else
b99bd4ef 21760 {
c19d1205
ZW
21761 /* Positive 12-bit or negative 8-bit offset. */
21762 int limit;
21763 if (value >= 0)
b99bd4ef 21764 {
c19d1205
ZW
21765 newval |= (1 << 23);
21766 limit = 0xfff;
21767 }
21768 else
21769 {
21770 value = -value;
21771 limit = 0xff;
21772 }
21773 if (value > limit)
21774 {
21775 as_bad_where (fixP->fx_file, fixP->fx_line,
21776 _("offset out of range"));
21777 break;
b99bd4ef 21778 }
c19d1205 21779 newval &= ~limit;
b99bd4ef 21780 }
b99bd4ef 21781
c19d1205
ZW
21782 newval |= value;
21783 md_number_to_chars (buf, (newval >> 16) & 0xffff, THUMB_SIZE);
21784 md_number_to_chars (buf + THUMB_SIZE, newval & 0xffff, THUMB_SIZE);
21785 break;
404ff6b5 21786
c19d1205
ZW
21787 case BFD_RELOC_ARM_SHIFT_IMM:
21788 newval = md_chars_to_number (buf, INSN_SIZE);
21789 if (((unsigned long) value) > 32
21790 || (value == 32
21791 && (((newval & 0x60) == 0) || (newval & 0x60) == 0x60)))
21792 {
21793 as_bad_where (fixP->fx_file, fixP->fx_line,
21794 _("shift expression is too large"));
21795 break;
21796 }
404ff6b5 21797
c19d1205
ZW
21798 if (value == 0)
21799 /* Shifts of zero must be done as lsl. */
21800 newval &= ~0x60;
21801 else if (value == 32)
21802 value = 0;
21803 newval &= 0xfffff07f;
21804 newval |= (value & 0x1f) << 7;
21805 md_number_to_chars (buf, newval, INSN_SIZE);
21806 break;
404ff6b5 21807
c19d1205 21808 case BFD_RELOC_ARM_T32_IMMEDIATE:
16805f35 21809 case BFD_RELOC_ARM_T32_ADD_IMM:
92e90b6e 21810 case BFD_RELOC_ARM_T32_IMM12:
e9f89963 21811 case BFD_RELOC_ARM_T32_ADD_PC12:
c19d1205
ZW
21812 /* We claim that this fixup has been processed here,
21813 even if in fact we generate an error because we do
21814 not have a reloc for it, so tc_gen_reloc will reject it. */
21815 fixP->fx_done = 1;
404ff6b5 21816
c19d1205
ZW
21817 if (fixP->fx_addsy
21818 && ! S_IS_DEFINED (fixP->fx_addsy))
21819 {
21820 as_bad_where (fixP->fx_file, fixP->fx_line,
21821 _("undefined symbol %s used as an immediate value"),
21822 S_GET_NAME (fixP->fx_addsy));
21823 break;
21824 }
404ff6b5 21825
c19d1205
ZW
21826 newval = md_chars_to_number (buf, THUMB_SIZE);
21827 newval <<= 16;
21828 newval |= md_chars_to_number (buf+2, THUMB_SIZE);
404ff6b5 21829
16805f35
PB
21830 newimm = FAIL;
21831 if (fixP->fx_r_type == BFD_RELOC_ARM_T32_IMMEDIATE
21832 || fixP->fx_r_type == BFD_RELOC_ARM_T32_ADD_IMM)
ef8d22e6
PB
21833 {
21834 newimm = encode_thumb32_immediate (value);
21835 if (newimm == (unsigned int) FAIL)
21836 newimm = thumb32_negate_data_op (&newval, value);
21837 }
16805f35
PB
21838 if (fixP->fx_r_type != BFD_RELOC_ARM_T32_IMMEDIATE
21839 && newimm == (unsigned int) FAIL)
92e90b6e 21840 {
16805f35
PB
21841 /* Turn add/sum into addw/subw. */
21842 if (fixP->fx_r_type == BFD_RELOC_ARM_T32_ADD_IMM)
21843 newval = (newval & 0xfeffffff) | 0x02000000;
40f246e3
NC
21844 /* No flat 12-bit imm encoding for addsw/subsw. */
21845 if ((newval & 0x00100000) == 0)
e9f89963 21846 {
40f246e3
NC
21847 /* 12 bit immediate for addw/subw. */
21848 if (value < 0)
21849 {
21850 value = -value;
21851 newval ^= 0x00a00000;
21852 }
21853 if (value > 0xfff)
21854 newimm = (unsigned int) FAIL;
21855 else
21856 newimm = value;
e9f89963 21857 }
92e90b6e 21858 }
cc8a6dd0 21859
c19d1205 21860 if (newimm == (unsigned int)FAIL)
3631a3c8 21861 {
c19d1205
ZW
21862 as_bad_where (fixP->fx_file, fixP->fx_line,
21863 _("invalid constant (%lx) after fixup"),
21864 (unsigned long) value);
21865 break;
3631a3c8
NC
21866 }
21867
c19d1205
ZW
21868 newval |= (newimm & 0x800) << 15;
21869 newval |= (newimm & 0x700) << 4;
21870 newval |= (newimm & 0x0ff);
cc8a6dd0 21871
c19d1205
ZW
21872 md_number_to_chars (buf, (valueT) ((newval >> 16) & 0xffff), THUMB_SIZE);
21873 md_number_to_chars (buf+2, (valueT) (newval & 0xffff), THUMB_SIZE);
21874 break;
a737bd4d 21875
3eb17e6b 21876 case BFD_RELOC_ARM_SMC:
c19d1205
ZW
21877 if (((unsigned long) value) > 0xffff)
21878 as_bad_where (fixP->fx_file, fixP->fx_line,
3eb17e6b 21879 _("invalid smc expression"));
2fc8bdac 21880 newval = md_chars_to_number (buf, INSN_SIZE);
c19d1205
ZW
21881 newval |= (value & 0xf) | ((value & 0xfff0) << 4);
21882 md_number_to_chars (buf, newval, INSN_SIZE);
21883 break;
a737bd4d 21884
90ec0d68
MGD
21885 case BFD_RELOC_ARM_HVC:
21886 if (((unsigned long) value) > 0xffff)
21887 as_bad_where (fixP->fx_file, fixP->fx_line,
21888 _("invalid hvc expression"));
21889 newval = md_chars_to_number (buf, INSN_SIZE);
21890 newval |= (value & 0xf) | ((value & 0xfff0) << 4);
21891 md_number_to_chars (buf, newval, INSN_SIZE);
21892 break;
21893
c19d1205 21894 case BFD_RELOC_ARM_SWI:
adbaf948 21895 if (fixP->tc_fix_data != 0)
c19d1205
ZW
21896 {
21897 if (((unsigned long) value) > 0xff)
21898 as_bad_where (fixP->fx_file, fixP->fx_line,
21899 _("invalid swi expression"));
2fc8bdac 21900 newval = md_chars_to_number (buf, THUMB_SIZE);
c19d1205
ZW
21901 newval |= value;
21902 md_number_to_chars (buf, newval, THUMB_SIZE);
21903 }
21904 else
21905 {
21906 if (((unsigned long) value) > 0x00ffffff)
21907 as_bad_where (fixP->fx_file, fixP->fx_line,
21908 _("invalid swi expression"));
2fc8bdac 21909 newval = md_chars_to_number (buf, INSN_SIZE);
c19d1205
ZW
21910 newval |= value;
21911 md_number_to_chars (buf, newval, INSN_SIZE);
21912 }
21913 break;
a737bd4d 21914
c19d1205
ZW
21915 case BFD_RELOC_ARM_MULTI:
21916 if (((unsigned long) value) > 0xffff)
21917 as_bad_where (fixP->fx_file, fixP->fx_line,
21918 _("invalid expression in load/store multiple"));
21919 newval = value | md_chars_to_number (buf, INSN_SIZE);
21920 md_number_to_chars (buf, newval, INSN_SIZE);
21921 break;
a737bd4d 21922
c19d1205 21923#ifdef OBJ_ELF
39b41c9c 21924 case BFD_RELOC_ARM_PCREL_CALL:
267bf995
RR
21925
21926 if (ARM_CPU_HAS_FEATURE (selected_cpu, arm_ext_v5t)
21927 && fixP->fx_addsy
34e77a92 21928 && !S_FORCE_RELOC (fixP->fx_addsy, TRUE)
267bf995
RR
21929 && (S_GET_SEGMENT (fixP->fx_addsy) == seg)
21930 && THUMB_IS_FUNC (fixP->fx_addsy))
21931 /* Flip the bl to blx. This is a simple flip
21932 bit here because we generate PCREL_CALL for
21933 unconditional bls. */
21934 {
21935 newval = md_chars_to_number (buf, INSN_SIZE);
21936 newval = newval | 0x10000000;
21937 md_number_to_chars (buf, newval, INSN_SIZE);
21938 temp = 1;
21939 fixP->fx_done = 1;
21940 }
39b41c9c
PB
21941 else
21942 temp = 3;
21943 goto arm_branch_common;
21944
21945 case BFD_RELOC_ARM_PCREL_JUMP:
267bf995
RR
21946 if (ARM_CPU_HAS_FEATURE (selected_cpu, arm_ext_v5t)
21947 && fixP->fx_addsy
34e77a92 21948 && !S_FORCE_RELOC (fixP->fx_addsy, TRUE)
267bf995
RR
21949 && (S_GET_SEGMENT (fixP->fx_addsy) == seg)
21950 && THUMB_IS_FUNC (fixP->fx_addsy))
21951 {
21952 /* This would map to a bl<cond>, b<cond>,
21953 b<always> to a Thumb function. We
21954 need to force a relocation for this particular
21955 case. */
21956 newval = md_chars_to_number (buf, INSN_SIZE);
21957 fixP->fx_done = 0;
21958 }
21959
2fc8bdac 21960 case BFD_RELOC_ARM_PLT32:
c19d1205 21961#endif
39b41c9c
PB
21962 case BFD_RELOC_ARM_PCREL_BRANCH:
21963 temp = 3;
21964 goto arm_branch_common;
a737bd4d 21965
39b41c9c 21966 case BFD_RELOC_ARM_PCREL_BLX:
267bf995 21967
39b41c9c 21968 temp = 1;
267bf995
RR
21969 if (ARM_CPU_HAS_FEATURE (selected_cpu, arm_ext_v5t)
21970 && fixP->fx_addsy
34e77a92 21971 && !S_FORCE_RELOC (fixP->fx_addsy, TRUE)
267bf995
RR
21972 && (S_GET_SEGMENT (fixP->fx_addsy) == seg)
21973 && ARM_IS_FUNC (fixP->fx_addsy))
21974 {
21975 /* Flip the blx to a bl and warn. */
21976 const char *name = S_GET_NAME (fixP->fx_addsy);
21977 newval = 0xeb000000;
21978 as_warn_where (fixP->fx_file, fixP->fx_line,
21979 _("blx to '%s' an ARM ISA state function changed to bl"),
21980 name);
21981 md_number_to_chars (buf, newval, INSN_SIZE);
21982 temp = 3;
21983 fixP->fx_done = 1;
21984 }
21985
21986#ifdef OBJ_ELF
21987 if (EF_ARM_EABI_VERSION (meabi_flags) >= EF_ARM_EABI_VER4)
477330fc 21988 fixP->fx_r_type = BFD_RELOC_ARM_PCREL_CALL;
267bf995
RR
21989#endif
21990
39b41c9c 21991 arm_branch_common:
c19d1205 21992 /* We are going to store value (shifted right by two) in the
39b41c9c
PB
21993 instruction, in a 24 bit, signed field. Bits 26 through 32 either
21994 all clear or all set and bit 0 must be clear. For B/BL bit 1 must
21995 also be be clear. */
21996 if (value & temp)
c19d1205 21997 as_bad_where (fixP->fx_file, fixP->fx_line,
2fc8bdac
ZW
21998 _("misaligned branch destination"));
21999 if ((value & (offsetT)0xfe000000) != (offsetT)0
22000 && (value & (offsetT)0xfe000000) != (offsetT)0xfe000000)
08f10d51 22001 as_bad_where (fixP->fx_file, fixP->fx_line, BAD_RANGE);
a737bd4d 22002
2fc8bdac 22003 if (fixP->fx_done || !seg->use_rela_p)
c19d1205 22004 {
2fc8bdac
ZW
22005 newval = md_chars_to_number (buf, INSN_SIZE);
22006 newval |= (value >> 2) & 0x00ffffff;
7ae2971b
PB
22007 /* Set the H bit on BLX instructions. */
22008 if (temp == 1)
22009 {
22010 if (value & 2)
22011 newval |= 0x01000000;
22012 else
22013 newval &= ~0x01000000;
22014 }
2fc8bdac 22015 md_number_to_chars (buf, newval, INSN_SIZE);
c19d1205 22016 }
c19d1205 22017 break;
a737bd4d 22018
25fe350b
MS
22019 case BFD_RELOC_THUMB_PCREL_BRANCH7: /* CBZ */
22020 /* CBZ can only branch forward. */
a737bd4d 22021
738755b0 22022 /* Attempts to use CBZ to branch to the next instruction
477330fc
RM
22023 (which, strictly speaking, are prohibited) will be turned into
22024 no-ops.
738755b0
MS
22025
22026 FIXME: It may be better to remove the instruction completely and
22027 perform relaxation. */
22028 if (value == -2)
2fc8bdac
ZW
22029 {
22030 newval = md_chars_to_number (buf, THUMB_SIZE);
738755b0 22031 newval = 0xbf00; /* NOP encoding T1 */
2fc8bdac
ZW
22032 md_number_to_chars (buf, newval, THUMB_SIZE);
22033 }
738755b0
MS
22034 else
22035 {
22036 if (value & ~0x7e)
08f10d51 22037 as_bad_where (fixP->fx_file, fixP->fx_line, BAD_RANGE);
738755b0 22038
477330fc 22039 if (fixP->fx_done || !seg->use_rela_p)
738755b0
MS
22040 {
22041 newval = md_chars_to_number (buf, THUMB_SIZE);
22042 newval |= ((value & 0x3e) << 2) | ((value & 0x40) << 3);
22043 md_number_to_chars (buf, newval, THUMB_SIZE);
22044 }
22045 }
c19d1205 22046 break;
a737bd4d 22047
c19d1205 22048 case BFD_RELOC_THUMB_PCREL_BRANCH9: /* Conditional branch. */
2fc8bdac 22049 if ((value & ~0xff) && ((value & ~0xff) != ~0xff))
08f10d51 22050 as_bad_where (fixP->fx_file, fixP->fx_line, BAD_RANGE);
a737bd4d 22051
2fc8bdac
ZW
22052 if (fixP->fx_done || !seg->use_rela_p)
22053 {
22054 newval = md_chars_to_number (buf, THUMB_SIZE);
22055 newval |= (value & 0x1ff) >> 1;
22056 md_number_to_chars (buf, newval, THUMB_SIZE);
22057 }
c19d1205 22058 break;
a737bd4d 22059
c19d1205 22060 case BFD_RELOC_THUMB_PCREL_BRANCH12: /* Unconditional branch. */
2fc8bdac 22061 if ((value & ~0x7ff) && ((value & ~0x7ff) != ~0x7ff))
08f10d51 22062 as_bad_where (fixP->fx_file, fixP->fx_line, BAD_RANGE);
a737bd4d 22063
2fc8bdac
ZW
22064 if (fixP->fx_done || !seg->use_rela_p)
22065 {
22066 newval = md_chars_to_number (buf, THUMB_SIZE);
22067 newval |= (value & 0xfff) >> 1;
22068 md_number_to_chars (buf, newval, THUMB_SIZE);
22069 }
c19d1205 22070 break;
a737bd4d 22071
c19d1205 22072 case BFD_RELOC_THUMB_PCREL_BRANCH20:
267bf995
RR
22073 if (fixP->fx_addsy
22074 && (S_GET_SEGMENT (fixP->fx_addsy) == seg)
34e77a92 22075 && !S_FORCE_RELOC (fixP->fx_addsy, TRUE)
267bf995
RR
22076 && ARM_IS_FUNC (fixP->fx_addsy)
22077 && ARM_CPU_HAS_FEATURE (selected_cpu, arm_ext_v5t))
22078 {
22079 /* Force a relocation for a branch 20 bits wide. */
22080 fixP->fx_done = 0;
22081 }
08f10d51 22082 if ((value & ~0x1fffff) && ((value & ~0x0fffff) != ~0x0fffff))
2fc8bdac
ZW
22083 as_bad_where (fixP->fx_file, fixP->fx_line,
22084 _("conditional branch out of range"));
404ff6b5 22085
2fc8bdac
ZW
22086 if (fixP->fx_done || !seg->use_rela_p)
22087 {
22088 offsetT newval2;
22089 addressT S, J1, J2, lo, hi;
404ff6b5 22090
2fc8bdac
ZW
22091 S = (value & 0x00100000) >> 20;
22092 J2 = (value & 0x00080000) >> 19;
22093 J1 = (value & 0x00040000) >> 18;
22094 hi = (value & 0x0003f000) >> 12;
22095 lo = (value & 0x00000ffe) >> 1;
6c43fab6 22096
2fc8bdac
ZW
22097 newval = md_chars_to_number (buf, THUMB_SIZE);
22098 newval2 = md_chars_to_number (buf + THUMB_SIZE, THUMB_SIZE);
22099 newval |= (S << 10) | hi;
22100 newval2 |= (J1 << 13) | (J2 << 11) | lo;
22101 md_number_to_chars (buf, newval, THUMB_SIZE);
22102 md_number_to_chars (buf + THUMB_SIZE, newval2, THUMB_SIZE);
22103 }
c19d1205 22104 break;
6c43fab6 22105
c19d1205 22106 case BFD_RELOC_THUMB_PCREL_BLX:
267bf995
RR
22107 /* If there is a blx from a thumb state function to
22108 another thumb function flip this to a bl and warn
22109 about it. */
22110
22111 if (fixP->fx_addsy
34e77a92 22112 && !S_FORCE_RELOC (fixP->fx_addsy, TRUE)
267bf995
RR
22113 && (S_GET_SEGMENT (fixP->fx_addsy) == seg)
22114 && THUMB_IS_FUNC (fixP->fx_addsy))
22115 {
22116 const char *name = S_GET_NAME (fixP->fx_addsy);
22117 as_warn_where (fixP->fx_file, fixP->fx_line,
22118 _("blx to Thumb func '%s' from Thumb ISA state changed to bl"),
22119 name);
22120 newval = md_chars_to_number (buf + THUMB_SIZE, THUMB_SIZE);
22121 newval = newval | 0x1000;
22122 md_number_to_chars (buf+THUMB_SIZE, newval, THUMB_SIZE);
22123 fixP->fx_r_type = BFD_RELOC_THUMB_PCREL_BRANCH23;
22124 fixP->fx_done = 1;
22125 }
22126
22127
22128 goto thumb_bl_common;
22129
c19d1205 22130 case BFD_RELOC_THUMB_PCREL_BRANCH23:
267bf995
RR
22131 /* A bl from Thumb state ISA to an internal ARM state function
22132 is converted to a blx. */
22133 if (fixP->fx_addsy
22134 && (S_GET_SEGMENT (fixP->fx_addsy) == seg)
34e77a92 22135 && !S_FORCE_RELOC (fixP->fx_addsy, TRUE)
267bf995
RR
22136 && ARM_IS_FUNC (fixP->fx_addsy)
22137 && ARM_CPU_HAS_FEATURE (selected_cpu, arm_ext_v5t))
22138 {
22139 newval = md_chars_to_number (buf + THUMB_SIZE, THUMB_SIZE);
22140 newval = newval & ~0x1000;
22141 md_number_to_chars (buf+THUMB_SIZE, newval, THUMB_SIZE);
22142 fixP->fx_r_type = BFD_RELOC_THUMB_PCREL_BLX;
22143 fixP->fx_done = 1;
22144 }
22145
22146 thumb_bl_common:
22147
2fc8bdac
ZW
22148 if (fixP->fx_r_type == BFD_RELOC_THUMB_PCREL_BLX)
22149 /* For a BLX instruction, make sure that the relocation is rounded up
22150 to a word boundary. This follows the semantics of the instruction
22151 which specifies that bit 1 of the target address will come from bit
22152 1 of the base address. */
d406f3e4
JB
22153 value = (value + 3) & ~ 3;
22154
22155#ifdef OBJ_ELF
22156 if (EF_ARM_EABI_VERSION (meabi_flags) >= EF_ARM_EABI_VER4
22157 && fixP->fx_r_type == BFD_RELOC_THUMB_PCREL_BLX)
22158 fixP->fx_r_type = BFD_RELOC_THUMB_PCREL_BRANCH23;
22159#endif
404ff6b5 22160
2b2f5df9
NC
22161 if ((value & ~0x3fffff) && ((value & ~0x3fffff) != ~0x3fffff))
22162 {
22163 if (!(ARM_CPU_HAS_FEATURE (cpu_variant, arm_arch_t2)))
22164 as_bad_where (fixP->fx_file, fixP->fx_line, BAD_RANGE);
22165 else if ((value & ~0x1ffffff)
22166 && ((value & ~0x1ffffff) != ~0x1ffffff))
22167 as_bad_where (fixP->fx_file, fixP->fx_line,
22168 _("Thumb2 branch out of range"));
22169 }
4a42ebbc
RR
22170
22171 if (fixP->fx_done || !seg->use_rela_p)
22172 encode_thumb2_b_bl_offset (buf, value);
22173
c19d1205 22174 break;
404ff6b5 22175
c19d1205 22176 case BFD_RELOC_THUMB_PCREL_BRANCH25:
08f10d51
NC
22177 if ((value & ~0x0ffffff) && ((value & ~0x0ffffff) != ~0x0ffffff))
22178 as_bad_where (fixP->fx_file, fixP->fx_line, BAD_RANGE);
6c43fab6 22179
2fc8bdac 22180 if (fixP->fx_done || !seg->use_rela_p)
4a42ebbc 22181 encode_thumb2_b_bl_offset (buf, value);
6c43fab6 22182
2fc8bdac 22183 break;
a737bd4d 22184
2fc8bdac
ZW
22185 case BFD_RELOC_8:
22186 if (fixP->fx_done || !seg->use_rela_p)
22187 md_number_to_chars (buf, value, 1);
c19d1205 22188 break;
a737bd4d 22189
c19d1205 22190 case BFD_RELOC_16:
2fc8bdac 22191 if (fixP->fx_done || !seg->use_rela_p)
c19d1205 22192 md_number_to_chars (buf, value, 2);
c19d1205 22193 break;
a737bd4d 22194
c19d1205 22195#ifdef OBJ_ELF
0855e32b
NS
22196 case BFD_RELOC_ARM_TLS_CALL:
22197 case BFD_RELOC_ARM_THM_TLS_CALL:
22198 case BFD_RELOC_ARM_TLS_DESCSEQ:
22199 case BFD_RELOC_ARM_THM_TLS_DESCSEQ:
22200 S_SET_THREAD_LOCAL (fixP->fx_addsy);
22201 break;
22202
22203 case BFD_RELOC_ARM_TLS_GOTDESC:
c19d1205
ZW
22204 case BFD_RELOC_ARM_TLS_GD32:
22205 case BFD_RELOC_ARM_TLS_LE32:
22206 case BFD_RELOC_ARM_TLS_IE32:
22207 case BFD_RELOC_ARM_TLS_LDM32:
22208 case BFD_RELOC_ARM_TLS_LDO32:
22209 S_SET_THREAD_LOCAL (fixP->fx_addsy);
22210 /* fall through */
6c43fab6 22211
c19d1205
ZW
22212 case BFD_RELOC_ARM_GOT32:
22213 case BFD_RELOC_ARM_GOTOFF:
2fc8bdac
ZW
22214 if (fixP->fx_done || !seg->use_rela_p)
22215 md_number_to_chars (buf, 0, 4);
c19d1205 22216 break;
b43420e6
NC
22217
22218 case BFD_RELOC_ARM_GOT_PREL:
22219 if (fixP->fx_done || !seg->use_rela_p)
477330fc 22220 md_number_to_chars (buf, value, 4);
b43420e6
NC
22221 break;
22222
9a6f4e97
NS
22223 case BFD_RELOC_ARM_TARGET2:
22224 /* TARGET2 is not partial-inplace, so we need to write the
477330fc
RM
22225 addend here for REL targets, because it won't be written out
22226 during reloc processing later. */
9a6f4e97
NS
22227 if (fixP->fx_done || !seg->use_rela_p)
22228 md_number_to_chars (buf, fixP->fx_offset, 4);
22229 break;
c19d1205 22230#endif
6c43fab6 22231
c19d1205
ZW
22232 case BFD_RELOC_RVA:
22233 case BFD_RELOC_32:
22234 case BFD_RELOC_ARM_TARGET1:
22235 case BFD_RELOC_ARM_ROSEGREL32:
22236 case BFD_RELOC_ARM_SBREL32:
22237 case BFD_RELOC_32_PCREL:
f0927246
NC
22238#ifdef TE_PE
22239 case BFD_RELOC_32_SECREL:
22240#endif
2fc8bdac 22241 if (fixP->fx_done || !seg->use_rela_p)
53baae48
NC
22242#ifdef TE_WINCE
22243 /* For WinCE we only do this for pcrel fixups. */
22244 if (fixP->fx_done || fixP->fx_pcrel)
22245#endif
22246 md_number_to_chars (buf, value, 4);
c19d1205 22247 break;
6c43fab6 22248
c19d1205
ZW
22249#ifdef OBJ_ELF
22250 case BFD_RELOC_ARM_PREL31:
2fc8bdac 22251 if (fixP->fx_done || !seg->use_rela_p)
c19d1205
ZW
22252 {
22253 newval = md_chars_to_number (buf, 4) & 0x80000000;
22254 if ((value ^ (value >> 1)) & 0x40000000)
22255 {
22256 as_bad_where (fixP->fx_file, fixP->fx_line,
22257 _("rel31 relocation overflow"));
22258 }
22259 newval |= value & 0x7fffffff;
22260 md_number_to_chars (buf, newval, 4);
22261 }
22262 break;
c19d1205 22263#endif
a737bd4d 22264
c19d1205 22265 case BFD_RELOC_ARM_CP_OFF_IMM:
8f06b2d8 22266 case BFD_RELOC_ARM_T32_CP_OFF_IMM:
c19d1205
ZW
22267 if (value < -1023 || value > 1023 || (value & 3))
22268 as_bad_where (fixP->fx_file, fixP->fx_line,
22269 _("co-processor offset out of range"));
22270 cp_off_common:
26d97720 22271 sign = value > 0;
c19d1205
ZW
22272 if (value < 0)
22273 value = -value;
8f06b2d8
PB
22274 if (fixP->fx_r_type == BFD_RELOC_ARM_CP_OFF_IMM
22275 || fixP->fx_r_type == BFD_RELOC_ARM_CP_OFF_IMM_S2)
22276 newval = md_chars_to_number (buf, INSN_SIZE);
22277 else
22278 newval = get_thumb32_insn (buf);
26d97720
NS
22279 if (value == 0)
22280 newval &= 0xffffff00;
22281 else
22282 {
22283 newval &= 0xff7fff00;
22284 newval |= (value >> 2) | (sign ? INDEX_UP : 0);
22285 }
8f06b2d8
PB
22286 if (fixP->fx_r_type == BFD_RELOC_ARM_CP_OFF_IMM
22287 || fixP->fx_r_type == BFD_RELOC_ARM_CP_OFF_IMM_S2)
22288 md_number_to_chars (buf, newval, INSN_SIZE);
22289 else
22290 put_thumb32_insn (buf, newval);
c19d1205 22291 break;
a737bd4d 22292
c19d1205 22293 case BFD_RELOC_ARM_CP_OFF_IMM_S2:
8f06b2d8 22294 case BFD_RELOC_ARM_T32_CP_OFF_IMM_S2:
c19d1205
ZW
22295 if (value < -255 || value > 255)
22296 as_bad_where (fixP->fx_file, fixP->fx_line,
22297 _("co-processor offset out of range"));
df7849c5 22298 value *= 4;
c19d1205 22299 goto cp_off_common;
6c43fab6 22300
c19d1205
ZW
22301 case BFD_RELOC_ARM_THUMB_OFFSET:
22302 newval = md_chars_to_number (buf, THUMB_SIZE);
22303 /* Exactly what ranges, and where the offset is inserted depends
22304 on the type of instruction, we can establish this from the
22305 top 4 bits. */
22306 switch (newval >> 12)
22307 {
22308 case 4: /* PC load. */
22309 /* Thumb PC loads are somewhat odd, bit 1 of the PC is
22310 forced to zero for these loads; md_pcrel_from has already
22311 compensated for this. */
22312 if (value & 3)
22313 as_bad_where (fixP->fx_file, fixP->fx_line,
22314 _("invalid offset, target not word aligned (0x%08lX)"),
0359e808
NC
22315 (((unsigned long) fixP->fx_frag->fr_address
22316 + (unsigned long) fixP->fx_where) & ~3)
22317 + (unsigned long) value);
a737bd4d 22318
c19d1205
ZW
22319 if (value & ~0x3fc)
22320 as_bad_where (fixP->fx_file, fixP->fx_line,
22321 _("invalid offset, value too big (0x%08lX)"),
22322 (long) value);
a737bd4d 22323
c19d1205
ZW
22324 newval |= value >> 2;
22325 break;
a737bd4d 22326
c19d1205
ZW
22327 case 9: /* SP load/store. */
22328 if (value & ~0x3fc)
22329 as_bad_where (fixP->fx_file, fixP->fx_line,
22330 _("invalid offset, value too big (0x%08lX)"),
22331 (long) value);
22332 newval |= value >> 2;
22333 break;
6c43fab6 22334
c19d1205
ZW
22335 case 6: /* Word load/store. */
22336 if (value & ~0x7c)
22337 as_bad_where (fixP->fx_file, fixP->fx_line,
22338 _("invalid offset, value too big (0x%08lX)"),
22339 (long) value);
22340 newval |= value << 4; /* 6 - 2. */
22341 break;
a737bd4d 22342
c19d1205
ZW
22343 case 7: /* Byte load/store. */
22344 if (value & ~0x1f)
22345 as_bad_where (fixP->fx_file, fixP->fx_line,
22346 _("invalid offset, value too big (0x%08lX)"),
22347 (long) value);
22348 newval |= value << 6;
22349 break;
a737bd4d 22350
c19d1205
ZW
22351 case 8: /* Halfword load/store. */
22352 if (value & ~0x3e)
22353 as_bad_where (fixP->fx_file, fixP->fx_line,
22354 _("invalid offset, value too big (0x%08lX)"),
22355 (long) value);
22356 newval |= value << 5; /* 6 - 1. */
22357 break;
a737bd4d 22358
c19d1205
ZW
22359 default:
22360 as_bad_where (fixP->fx_file, fixP->fx_line,
22361 "Unable to process relocation for thumb opcode: %lx",
22362 (unsigned long) newval);
22363 break;
22364 }
22365 md_number_to_chars (buf, newval, THUMB_SIZE);
22366 break;
a737bd4d 22367
c19d1205
ZW
22368 case BFD_RELOC_ARM_THUMB_ADD:
22369 /* This is a complicated relocation, since we use it for all of
22370 the following immediate relocations:
a737bd4d 22371
c19d1205
ZW
22372 3bit ADD/SUB
22373 8bit ADD/SUB
22374 9bit ADD/SUB SP word-aligned
22375 10bit ADD PC/SP word-aligned
a737bd4d 22376
c19d1205
ZW
22377 The type of instruction being processed is encoded in the
22378 instruction field:
a737bd4d 22379
c19d1205
ZW
22380 0x8000 SUB
22381 0x00F0 Rd
22382 0x000F Rs
22383 */
22384 newval = md_chars_to_number (buf, THUMB_SIZE);
22385 {
22386 int rd = (newval >> 4) & 0xf;
22387 int rs = newval & 0xf;
22388 int subtract = !!(newval & 0x8000);
a737bd4d 22389
c19d1205
ZW
22390 /* Check for HI regs, only very restricted cases allowed:
22391 Adjusting SP, and using PC or SP to get an address. */
22392 if ((rd > 7 && (rd != REG_SP || rs != REG_SP))
22393 || (rs > 7 && rs != REG_SP && rs != REG_PC))
22394 as_bad_where (fixP->fx_file, fixP->fx_line,
22395 _("invalid Hi register with immediate"));
a737bd4d 22396
c19d1205
ZW
22397 /* If value is negative, choose the opposite instruction. */
22398 if (value < 0)
22399 {
22400 value = -value;
22401 subtract = !subtract;
22402 if (value < 0)
22403 as_bad_where (fixP->fx_file, fixP->fx_line,
22404 _("immediate value out of range"));
22405 }
a737bd4d 22406
c19d1205
ZW
22407 if (rd == REG_SP)
22408 {
22409 if (value & ~0x1fc)
22410 as_bad_where (fixP->fx_file, fixP->fx_line,
22411 _("invalid immediate for stack address calculation"));
22412 newval = subtract ? T_OPCODE_SUB_ST : T_OPCODE_ADD_ST;
22413 newval |= value >> 2;
22414 }
22415 else if (rs == REG_PC || rs == REG_SP)
22416 {
22417 if (subtract || value & ~0x3fc)
22418 as_bad_where (fixP->fx_file, fixP->fx_line,
22419 _("invalid immediate for address calculation (value = 0x%08lX)"),
22420 (unsigned long) value);
22421 newval = (rs == REG_PC ? T_OPCODE_ADD_PC : T_OPCODE_ADD_SP);
22422 newval |= rd << 8;
22423 newval |= value >> 2;
22424 }
22425 else if (rs == rd)
22426 {
22427 if (value & ~0xff)
22428 as_bad_where (fixP->fx_file, fixP->fx_line,
22429 _("immediate value out of range"));
22430 newval = subtract ? T_OPCODE_SUB_I8 : T_OPCODE_ADD_I8;
22431 newval |= (rd << 8) | value;
22432 }
22433 else
22434 {
22435 if (value & ~0x7)
22436 as_bad_where (fixP->fx_file, fixP->fx_line,
22437 _("immediate value out of range"));
22438 newval = subtract ? T_OPCODE_SUB_I3 : T_OPCODE_ADD_I3;
22439 newval |= rd | (rs << 3) | (value << 6);
22440 }
22441 }
22442 md_number_to_chars (buf, newval, THUMB_SIZE);
22443 break;
a737bd4d 22444
c19d1205
ZW
22445 case BFD_RELOC_ARM_THUMB_IMM:
22446 newval = md_chars_to_number (buf, THUMB_SIZE);
22447 if (value < 0 || value > 255)
22448 as_bad_where (fixP->fx_file, fixP->fx_line,
4e6e072b 22449 _("invalid immediate: %ld is out of range"),
c19d1205
ZW
22450 (long) value);
22451 newval |= value;
22452 md_number_to_chars (buf, newval, THUMB_SIZE);
22453 break;
a737bd4d 22454
c19d1205
ZW
22455 case BFD_RELOC_ARM_THUMB_SHIFT:
22456 /* 5bit shift value (0..32). LSL cannot take 32. */
22457 newval = md_chars_to_number (buf, THUMB_SIZE) & 0xf83f;
22458 temp = newval & 0xf800;
22459 if (value < 0 || value > 32 || (value == 32 && temp == T_OPCODE_LSL_I))
22460 as_bad_where (fixP->fx_file, fixP->fx_line,
22461 _("invalid shift value: %ld"), (long) value);
22462 /* Shifts of zero must be encoded as LSL. */
22463 if (value == 0)
22464 newval = (newval & 0x003f) | T_OPCODE_LSL_I;
22465 /* Shifts of 32 are encoded as zero. */
22466 else if (value == 32)
22467 value = 0;
22468 newval |= value << 6;
22469 md_number_to_chars (buf, newval, THUMB_SIZE);
22470 break;
a737bd4d 22471
c19d1205
ZW
22472 case BFD_RELOC_VTABLE_INHERIT:
22473 case BFD_RELOC_VTABLE_ENTRY:
22474 fixP->fx_done = 0;
22475 return;
6c43fab6 22476
b6895b4f
PB
22477 case BFD_RELOC_ARM_MOVW:
22478 case BFD_RELOC_ARM_MOVT:
22479 case BFD_RELOC_ARM_THUMB_MOVW:
22480 case BFD_RELOC_ARM_THUMB_MOVT:
22481 if (fixP->fx_done || !seg->use_rela_p)
22482 {
22483 /* REL format relocations are limited to a 16-bit addend. */
22484 if (!fixP->fx_done)
22485 {
39623e12 22486 if (value < -0x8000 || value > 0x7fff)
b6895b4f 22487 as_bad_where (fixP->fx_file, fixP->fx_line,
ff5075ca 22488 _("offset out of range"));
b6895b4f
PB
22489 }
22490 else if (fixP->fx_r_type == BFD_RELOC_ARM_MOVT
22491 || fixP->fx_r_type == BFD_RELOC_ARM_THUMB_MOVT)
22492 {
22493 value >>= 16;
22494 }
22495
22496 if (fixP->fx_r_type == BFD_RELOC_ARM_THUMB_MOVW
22497 || fixP->fx_r_type == BFD_RELOC_ARM_THUMB_MOVT)
22498 {
22499 newval = get_thumb32_insn (buf);
22500 newval &= 0xfbf08f00;
22501 newval |= (value & 0xf000) << 4;
22502 newval |= (value & 0x0800) << 15;
22503 newval |= (value & 0x0700) << 4;
22504 newval |= (value & 0x00ff);
22505 put_thumb32_insn (buf, newval);
22506 }
22507 else
22508 {
22509 newval = md_chars_to_number (buf, 4);
22510 newval &= 0xfff0f000;
22511 newval |= value & 0x0fff;
22512 newval |= (value & 0xf000) << 4;
22513 md_number_to_chars (buf, newval, 4);
22514 }
22515 }
22516 return;
22517
4962c51a
MS
22518 case BFD_RELOC_ARM_ALU_PC_G0_NC:
22519 case BFD_RELOC_ARM_ALU_PC_G0:
22520 case BFD_RELOC_ARM_ALU_PC_G1_NC:
22521 case BFD_RELOC_ARM_ALU_PC_G1:
22522 case BFD_RELOC_ARM_ALU_PC_G2:
22523 case BFD_RELOC_ARM_ALU_SB_G0_NC:
22524 case BFD_RELOC_ARM_ALU_SB_G0:
22525 case BFD_RELOC_ARM_ALU_SB_G1_NC:
22526 case BFD_RELOC_ARM_ALU_SB_G1:
22527 case BFD_RELOC_ARM_ALU_SB_G2:
9c2799c2 22528 gas_assert (!fixP->fx_done);
4962c51a
MS
22529 if (!seg->use_rela_p)
22530 {
477330fc
RM
22531 bfd_vma insn;
22532 bfd_vma encoded_addend;
22533 bfd_vma addend_abs = abs (value);
22534
22535 /* Check that the absolute value of the addend can be
22536 expressed as an 8-bit constant plus a rotation. */
22537 encoded_addend = encode_arm_immediate (addend_abs);
22538 if (encoded_addend == (unsigned int) FAIL)
4962c51a 22539 as_bad_where (fixP->fx_file, fixP->fx_line,
477330fc
RM
22540 _("the offset 0x%08lX is not representable"),
22541 (unsigned long) addend_abs);
22542
22543 /* Extract the instruction. */
22544 insn = md_chars_to_number (buf, INSN_SIZE);
22545
22546 /* If the addend is positive, use an ADD instruction.
22547 Otherwise use a SUB. Take care not to destroy the S bit. */
22548 insn &= 0xff1fffff;
22549 if (value < 0)
22550 insn |= 1 << 22;
22551 else
22552 insn |= 1 << 23;
22553
22554 /* Place the encoded addend into the first 12 bits of the
22555 instruction. */
22556 insn &= 0xfffff000;
22557 insn |= encoded_addend;
22558
22559 /* Update the instruction. */
22560 md_number_to_chars (buf, insn, INSN_SIZE);
4962c51a
MS
22561 }
22562 break;
22563
22564 case BFD_RELOC_ARM_LDR_PC_G0:
22565 case BFD_RELOC_ARM_LDR_PC_G1:
22566 case BFD_RELOC_ARM_LDR_PC_G2:
22567 case BFD_RELOC_ARM_LDR_SB_G0:
22568 case BFD_RELOC_ARM_LDR_SB_G1:
22569 case BFD_RELOC_ARM_LDR_SB_G2:
9c2799c2 22570 gas_assert (!fixP->fx_done);
4962c51a 22571 if (!seg->use_rela_p)
477330fc
RM
22572 {
22573 bfd_vma insn;
22574 bfd_vma addend_abs = abs (value);
4962c51a 22575
477330fc
RM
22576 /* Check that the absolute value of the addend can be
22577 encoded in 12 bits. */
22578 if (addend_abs >= 0x1000)
4962c51a 22579 as_bad_where (fixP->fx_file, fixP->fx_line,
477330fc
RM
22580 _("bad offset 0x%08lX (only 12 bits available for the magnitude)"),
22581 (unsigned long) addend_abs);
22582
22583 /* Extract the instruction. */
22584 insn = md_chars_to_number (buf, INSN_SIZE);
22585
22586 /* If the addend is negative, clear bit 23 of the instruction.
22587 Otherwise set it. */
22588 if (value < 0)
22589 insn &= ~(1 << 23);
22590 else
22591 insn |= 1 << 23;
22592
22593 /* Place the absolute value of the addend into the first 12 bits
22594 of the instruction. */
22595 insn &= 0xfffff000;
22596 insn |= addend_abs;
22597
22598 /* Update the instruction. */
22599 md_number_to_chars (buf, insn, INSN_SIZE);
22600 }
4962c51a
MS
22601 break;
22602
22603 case BFD_RELOC_ARM_LDRS_PC_G0:
22604 case BFD_RELOC_ARM_LDRS_PC_G1:
22605 case BFD_RELOC_ARM_LDRS_PC_G2:
22606 case BFD_RELOC_ARM_LDRS_SB_G0:
22607 case BFD_RELOC_ARM_LDRS_SB_G1:
22608 case BFD_RELOC_ARM_LDRS_SB_G2:
9c2799c2 22609 gas_assert (!fixP->fx_done);
4962c51a 22610 if (!seg->use_rela_p)
477330fc
RM
22611 {
22612 bfd_vma insn;
22613 bfd_vma addend_abs = abs (value);
4962c51a 22614
477330fc
RM
22615 /* Check that the absolute value of the addend can be
22616 encoded in 8 bits. */
22617 if (addend_abs >= 0x100)
4962c51a 22618 as_bad_where (fixP->fx_file, fixP->fx_line,
477330fc
RM
22619 _("bad offset 0x%08lX (only 8 bits available for the magnitude)"),
22620 (unsigned long) addend_abs);
22621
22622 /* Extract the instruction. */
22623 insn = md_chars_to_number (buf, INSN_SIZE);
22624
22625 /* If the addend is negative, clear bit 23 of the instruction.
22626 Otherwise set it. */
22627 if (value < 0)
22628 insn &= ~(1 << 23);
22629 else
22630 insn |= 1 << 23;
22631
22632 /* Place the first four bits of the absolute value of the addend
22633 into the first 4 bits of the instruction, and the remaining
22634 four into bits 8 .. 11. */
22635 insn &= 0xfffff0f0;
22636 insn |= (addend_abs & 0xf) | ((addend_abs & 0xf0) << 4);
22637
22638 /* Update the instruction. */
22639 md_number_to_chars (buf, insn, INSN_SIZE);
22640 }
4962c51a
MS
22641 break;
22642
22643 case BFD_RELOC_ARM_LDC_PC_G0:
22644 case BFD_RELOC_ARM_LDC_PC_G1:
22645 case BFD_RELOC_ARM_LDC_PC_G2:
22646 case BFD_RELOC_ARM_LDC_SB_G0:
22647 case BFD_RELOC_ARM_LDC_SB_G1:
22648 case BFD_RELOC_ARM_LDC_SB_G2:
9c2799c2 22649 gas_assert (!fixP->fx_done);
4962c51a 22650 if (!seg->use_rela_p)
477330fc
RM
22651 {
22652 bfd_vma insn;
22653 bfd_vma addend_abs = abs (value);
4962c51a 22654
477330fc
RM
22655 /* Check that the absolute value of the addend is a multiple of
22656 four and, when divided by four, fits in 8 bits. */
22657 if (addend_abs & 0x3)
4962c51a 22658 as_bad_where (fixP->fx_file, fixP->fx_line,
477330fc
RM
22659 _("bad offset 0x%08lX (must be word-aligned)"),
22660 (unsigned long) addend_abs);
4962c51a 22661
477330fc 22662 if ((addend_abs >> 2) > 0xff)
4962c51a 22663 as_bad_where (fixP->fx_file, fixP->fx_line,
477330fc
RM
22664 _("bad offset 0x%08lX (must be an 8-bit number of words)"),
22665 (unsigned long) addend_abs);
22666
22667 /* Extract the instruction. */
22668 insn = md_chars_to_number (buf, INSN_SIZE);
22669
22670 /* If the addend is negative, clear bit 23 of the instruction.
22671 Otherwise set it. */
22672 if (value < 0)
22673 insn &= ~(1 << 23);
22674 else
22675 insn |= 1 << 23;
22676
22677 /* Place the addend (divided by four) into the first eight
22678 bits of the instruction. */
22679 insn &= 0xfffffff0;
22680 insn |= addend_abs >> 2;
22681
22682 /* Update the instruction. */
22683 md_number_to_chars (buf, insn, INSN_SIZE);
22684 }
4962c51a
MS
22685 break;
22686
845b51d6
PB
22687 case BFD_RELOC_ARM_V4BX:
22688 /* This will need to go in the object file. */
22689 fixP->fx_done = 0;
22690 break;
22691
c19d1205
ZW
22692 case BFD_RELOC_UNUSED:
22693 default:
22694 as_bad_where (fixP->fx_file, fixP->fx_line,
22695 _("bad relocation fixup type (%d)"), fixP->fx_r_type);
22696 }
6c43fab6
RE
22697}
22698
c19d1205
ZW
22699/* Translate internal representation of relocation info to BFD target
22700 format. */
a737bd4d 22701
c19d1205 22702arelent *
00a97672 22703tc_gen_reloc (asection *section, fixS *fixp)
a737bd4d 22704{
c19d1205
ZW
22705 arelent * reloc;
22706 bfd_reloc_code_real_type code;
a737bd4d 22707
21d799b5 22708 reloc = (arelent *) xmalloc (sizeof (arelent));
a737bd4d 22709
21d799b5 22710 reloc->sym_ptr_ptr = (asymbol **) xmalloc (sizeof (asymbol *));
c19d1205
ZW
22711 *reloc->sym_ptr_ptr = symbol_get_bfdsym (fixp->fx_addsy);
22712 reloc->address = fixp->fx_frag->fr_address + fixp->fx_where;
a737bd4d 22713
2fc8bdac 22714 if (fixp->fx_pcrel)
00a97672
RS
22715 {
22716 if (section->use_rela_p)
22717 fixp->fx_offset -= md_pcrel_from_section (fixp, section);
22718 else
22719 fixp->fx_offset = reloc->address;
22720 }
c19d1205 22721 reloc->addend = fixp->fx_offset;
a737bd4d 22722
c19d1205 22723 switch (fixp->fx_r_type)
a737bd4d 22724 {
c19d1205
ZW
22725 case BFD_RELOC_8:
22726 if (fixp->fx_pcrel)
22727 {
22728 code = BFD_RELOC_8_PCREL;
22729 break;
22730 }
a737bd4d 22731
c19d1205
ZW
22732 case BFD_RELOC_16:
22733 if (fixp->fx_pcrel)
22734 {
22735 code = BFD_RELOC_16_PCREL;
22736 break;
22737 }
6c43fab6 22738
c19d1205
ZW
22739 case BFD_RELOC_32:
22740 if (fixp->fx_pcrel)
22741 {
22742 code = BFD_RELOC_32_PCREL;
22743 break;
22744 }
a737bd4d 22745
b6895b4f
PB
22746 case BFD_RELOC_ARM_MOVW:
22747 if (fixp->fx_pcrel)
22748 {
22749 code = BFD_RELOC_ARM_MOVW_PCREL;
22750 break;
22751 }
22752
22753 case BFD_RELOC_ARM_MOVT:
22754 if (fixp->fx_pcrel)
22755 {
22756 code = BFD_RELOC_ARM_MOVT_PCREL;
22757 break;
22758 }
22759
22760 case BFD_RELOC_ARM_THUMB_MOVW:
22761 if (fixp->fx_pcrel)
22762 {
22763 code = BFD_RELOC_ARM_THUMB_MOVW_PCREL;
22764 break;
22765 }
22766
22767 case BFD_RELOC_ARM_THUMB_MOVT:
22768 if (fixp->fx_pcrel)
22769 {
22770 code = BFD_RELOC_ARM_THUMB_MOVT_PCREL;
22771 break;
22772 }
22773
c19d1205
ZW
22774 case BFD_RELOC_NONE:
22775 case BFD_RELOC_ARM_PCREL_BRANCH:
22776 case BFD_RELOC_ARM_PCREL_BLX:
22777 case BFD_RELOC_RVA:
22778 case BFD_RELOC_THUMB_PCREL_BRANCH7:
22779 case BFD_RELOC_THUMB_PCREL_BRANCH9:
22780 case BFD_RELOC_THUMB_PCREL_BRANCH12:
22781 case BFD_RELOC_THUMB_PCREL_BRANCH20:
22782 case BFD_RELOC_THUMB_PCREL_BRANCH23:
22783 case BFD_RELOC_THUMB_PCREL_BRANCH25:
c19d1205
ZW
22784 case BFD_RELOC_VTABLE_ENTRY:
22785 case BFD_RELOC_VTABLE_INHERIT:
f0927246
NC
22786#ifdef TE_PE
22787 case BFD_RELOC_32_SECREL:
22788#endif
c19d1205
ZW
22789 code = fixp->fx_r_type;
22790 break;
a737bd4d 22791
00adf2d4
JB
22792 case BFD_RELOC_THUMB_PCREL_BLX:
22793#ifdef OBJ_ELF
22794 if (EF_ARM_EABI_VERSION (meabi_flags) >= EF_ARM_EABI_VER4)
22795 code = BFD_RELOC_THUMB_PCREL_BRANCH23;
22796 else
22797#endif
22798 code = BFD_RELOC_THUMB_PCREL_BLX;
22799 break;
22800
c19d1205
ZW
22801 case BFD_RELOC_ARM_LITERAL:
22802 case BFD_RELOC_ARM_HWLITERAL:
22803 /* If this is called then the a literal has
22804 been referenced across a section boundary. */
22805 as_bad_where (fixp->fx_file, fixp->fx_line,
22806 _("literal referenced across section boundary"));
22807 return NULL;
a737bd4d 22808
c19d1205 22809#ifdef OBJ_ELF
0855e32b
NS
22810 case BFD_RELOC_ARM_TLS_CALL:
22811 case BFD_RELOC_ARM_THM_TLS_CALL:
22812 case BFD_RELOC_ARM_TLS_DESCSEQ:
22813 case BFD_RELOC_ARM_THM_TLS_DESCSEQ:
c19d1205
ZW
22814 case BFD_RELOC_ARM_GOT32:
22815 case BFD_RELOC_ARM_GOTOFF:
b43420e6 22816 case BFD_RELOC_ARM_GOT_PREL:
c19d1205
ZW
22817 case BFD_RELOC_ARM_PLT32:
22818 case BFD_RELOC_ARM_TARGET1:
22819 case BFD_RELOC_ARM_ROSEGREL32:
22820 case BFD_RELOC_ARM_SBREL32:
22821 case BFD_RELOC_ARM_PREL31:
22822 case BFD_RELOC_ARM_TARGET2:
22823 case BFD_RELOC_ARM_TLS_LE32:
22824 case BFD_RELOC_ARM_TLS_LDO32:
39b41c9c
PB
22825 case BFD_RELOC_ARM_PCREL_CALL:
22826 case BFD_RELOC_ARM_PCREL_JUMP:
4962c51a
MS
22827 case BFD_RELOC_ARM_ALU_PC_G0_NC:
22828 case BFD_RELOC_ARM_ALU_PC_G0:
22829 case BFD_RELOC_ARM_ALU_PC_G1_NC:
22830 case BFD_RELOC_ARM_ALU_PC_G1:
22831 case BFD_RELOC_ARM_ALU_PC_G2:
22832 case BFD_RELOC_ARM_LDR_PC_G0:
22833 case BFD_RELOC_ARM_LDR_PC_G1:
22834 case BFD_RELOC_ARM_LDR_PC_G2:
22835 case BFD_RELOC_ARM_LDRS_PC_G0:
22836 case BFD_RELOC_ARM_LDRS_PC_G1:
22837 case BFD_RELOC_ARM_LDRS_PC_G2:
22838 case BFD_RELOC_ARM_LDC_PC_G0:
22839 case BFD_RELOC_ARM_LDC_PC_G1:
22840 case BFD_RELOC_ARM_LDC_PC_G2:
22841 case BFD_RELOC_ARM_ALU_SB_G0_NC:
22842 case BFD_RELOC_ARM_ALU_SB_G0:
22843 case BFD_RELOC_ARM_ALU_SB_G1_NC:
22844 case BFD_RELOC_ARM_ALU_SB_G1:
22845 case BFD_RELOC_ARM_ALU_SB_G2:
22846 case BFD_RELOC_ARM_LDR_SB_G0:
22847 case BFD_RELOC_ARM_LDR_SB_G1:
22848 case BFD_RELOC_ARM_LDR_SB_G2:
22849 case BFD_RELOC_ARM_LDRS_SB_G0:
22850 case BFD_RELOC_ARM_LDRS_SB_G1:
22851 case BFD_RELOC_ARM_LDRS_SB_G2:
22852 case BFD_RELOC_ARM_LDC_SB_G0:
22853 case BFD_RELOC_ARM_LDC_SB_G1:
22854 case BFD_RELOC_ARM_LDC_SB_G2:
845b51d6 22855 case BFD_RELOC_ARM_V4BX:
c19d1205
ZW
22856 code = fixp->fx_r_type;
22857 break;
a737bd4d 22858
0855e32b 22859 case BFD_RELOC_ARM_TLS_GOTDESC:
c19d1205
ZW
22860 case BFD_RELOC_ARM_TLS_GD32:
22861 case BFD_RELOC_ARM_TLS_IE32:
22862 case BFD_RELOC_ARM_TLS_LDM32:
22863 /* BFD will include the symbol's address in the addend.
22864 But we don't want that, so subtract it out again here. */
22865 if (!S_IS_COMMON (fixp->fx_addsy))
22866 reloc->addend -= (*reloc->sym_ptr_ptr)->value;
22867 code = fixp->fx_r_type;
22868 break;
22869#endif
a737bd4d 22870
c19d1205
ZW
22871 case BFD_RELOC_ARM_IMMEDIATE:
22872 as_bad_where (fixp->fx_file, fixp->fx_line,
22873 _("internal relocation (type: IMMEDIATE) not fixed up"));
22874 return NULL;
a737bd4d 22875
c19d1205
ZW
22876 case BFD_RELOC_ARM_ADRL_IMMEDIATE:
22877 as_bad_where (fixp->fx_file, fixp->fx_line,
22878 _("ADRL used for a symbol not defined in the same file"));
22879 return NULL;
a737bd4d 22880
c19d1205 22881 case BFD_RELOC_ARM_OFFSET_IMM:
00a97672
RS
22882 if (section->use_rela_p)
22883 {
22884 code = fixp->fx_r_type;
22885 break;
22886 }
22887
c19d1205
ZW
22888 if (fixp->fx_addsy != NULL
22889 && !S_IS_DEFINED (fixp->fx_addsy)
22890 && S_IS_LOCAL (fixp->fx_addsy))
a737bd4d 22891 {
c19d1205
ZW
22892 as_bad_where (fixp->fx_file, fixp->fx_line,
22893 _("undefined local label `%s'"),
22894 S_GET_NAME (fixp->fx_addsy));
22895 return NULL;
a737bd4d
NC
22896 }
22897
c19d1205
ZW
22898 as_bad_where (fixp->fx_file, fixp->fx_line,
22899 _("internal_relocation (type: OFFSET_IMM) not fixed up"));
22900 return NULL;
a737bd4d 22901
c19d1205
ZW
22902 default:
22903 {
22904 char * type;
6c43fab6 22905
c19d1205
ZW
22906 switch (fixp->fx_r_type)
22907 {
22908 case BFD_RELOC_NONE: type = "NONE"; break;
22909 case BFD_RELOC_ARM_OFFSET_IMM8: type = "OFFSET_IMM8"; break;
22910 case BFD_RELOC_ARM_SHIFT_IMM: type = "SHIFT_IMM"; break;
3eb17e6b 22911 case BFD_RELOC_ARM_SMC: type = "SMC"; break;
c19d1205
ZW
22912 case BFD_RELOC_ARM_SWI: type = "SWI"; break;
22913 case BFD_RELOC_ARM_MULTI: type = "MULTI"; break;
22914 case BFD_RELOC_ARM_CP_OFF_IMM: type = "CP_OFF_IMM"; break;
db187cb9 22915 case BFD_RELOC_ARM_T32_OFFSET_IMM: type = "T32_OFFSET_IMM"; break;
8f06b2d8 22916 case BFD_RELOC_ARM_T32_CP_OFF_IMM: type = "T32_CP_OFF_IMM"; break;
c19d1205
ZW
22917 case BFD_RELOC_ARM_THUMB_ADD: type = "THUMB_ADD"; break;
22918 case BFD_RELOC_ARM_THUMB_SHIFT: type = "THUMB_SHIFT"; break;
22919 case BFD_RELOC_ARM_THUMB_IMM: type = "THUMB_IMM"; break;
22920 case BFD_RELOC_ARM_THUMB_OFFSET: type = "THUMB_OFFSET"; break;
22921 default: type = _("<unknown>"); break;
22922 }
22923 as_bad_where (fixp->fx_file, fixp->fx_line,
22924 _("cannot represent %s relocation in this object file format"),
22925 type);
22926 return NULL;
22927 }
a737bd4d 22928 }
6c43fab6 22929
c19d1205
ZW
22930#ifdef OBJ_ELF
22931 if ((code == BFD_RELOC_32_PCREL || code == BFD_RELOC_32)
22932 && GOT_symbol
22933 && fixp->fx_addsy == GOT_symbol)
22934 {
22935 code = BFD_RELOC_ARM_GOTPC;
22936 reloc->addend = fixp->fx_offset = reloc->address;
22937 }
22938#endif
6c43fab6 22939
c19d1205 22940 reloc->howto = bfd_reloc_type_lookup (stdoutput, code);
6c43fab6 22941
c19d1205
ZW
22942 if (reloc->howto == NULL)
22943 {
22944 as_bad_where (fixp->fx_file, fixp->fx_line,
22945 _("cannot represent %s relocation in this object file format"),
22946 bfd_get_reloc_code_name (code));
22947 return NULL;
22948 }
6c43fab6 22949
c19d1205
ZW
22950 /* HACK: Since arm ELF uses Rel instead of Rela, encode the
22951 vtable entry to be used in the relocation's section offset. */
22952 if (fixp->fx_r_type == BFD_RELOC_VTABLE_ENTRY)
22953 reloc->address = fixp->fx_offset;
6c43fab6 22954
c19d1205 22955 return reloc;
6c43fab6
RE
22956}
22957
c19d1205 22958/* This fix_new is called by cons via TC_CONS_FIX_NEW. */
6c43fab6 22959
c19d1205
ZW
22960void
22961cons_fix_new_arm (fragS * frag,
22962 int where,
22963 int size,
22964 expressionS * exp)
6c43fab6 22965{
c19d1205
ZW
22966 bfd_reloc_code_real_type type;
22967 int pcrel = 0;
6c43fab6 22968
c19d1205
ZW
22969 /* Pick a reloc.
22970 FIXME: @@ Should look at CPU word size. */
22971 switch (size)
22972 {
22973 case 1:
22974 type = BFD_RELOC_8;
22975 break;
22976 case 2:
22977 type = BFD_RELOC_16;
22978 break;
22979 case 4:
22980 default:
22981 type = BFD_RELOC_32;
22982 break;
22983 case 8:
22984 type = BFD_RELOC_64;
22985 break;
22986 }
6c43fab6 22987
f0927246
NC
22988#ifdef TE_PE
22989 if (exp->X_op == O_secrel)
22990 {
22991 exp->X_op = O_symbol;
22992 type = BFD_RELOC_32_SECREL;
22993 }
22994#endif
22995
c19d1205
ZW
22996 fix_new_exp (frag, where, (int) size, exp, pcrel, type);
22997}
6c43fab6 22998
4343666d 22999#if defined (OBJ_COFF)
c19d1205
ZW
23000void
23001arm_validate_fix (fixS * fixP)
6c43fab6 23002{
c19d1205
ZW
23003 /* If the destination of the branch is a defined symbol which does not have
23004 the THUMB_FUNC attribute, then we must be calling a function which has
23005 the (interfacearm) attribute. We look for the Thumb entry point to that
23006 function and change the branch to refer to that function instead. */
23007 if (fixP->fx_r_type == BFD_RELOC_THUMB_PCREL_BRANCH23
23008 && fixP->fx_addsy != NULL
23009 && S_IS_DEFINED (fixP->fx_addsy)
23010 && ! THUMB_IS_FUNC (fixP->fx_addsy))
6c43fab6 23011 {
c19d1205 23012 fixP->fx_addsy = find_real_start (fixP->fx_addsy);
6c43fab6 23013 }
c19d1205
ZW
23014}
23015#endif
6c43fab6 23016
267bf995 23017
c19d1205
ZW
23018int
23019arm_force_relocation (struct fix * fixp)
23020{
23021#if defined (OBJ_COFF) && defined (TE_PE)
23022 if (fixp->fx_r_type == BFD_RELOC_RVA)
23023 return 1;
23024#endif
6c43fab6 23025
267bf995
RR
23026 /* In case we have a call or a branch to a function in ARM ISA mode from
23027 a thumb function or vice-versa force the relocation. These relocations
23028 are cleared off for some cores that might have blx and simple transformations
23029 are possible. */
23030
23031#ifdef OBJ_ELF
23032 switch (fixp->fx_r_type)
23033 {
23034 case BFD_RELOC_ARM_PCREL_JUMP:
23035 case BFD_RELOC_ARM_PCREL_CALL:
23036 case BFD_RELOC_THUMB_PCREL_BLX:
23037 if (THUMB_IS_FUNC (fixp->fx_addsy))
23038 return 1;
23039 break;
23040
23041 case BFD_RELOC_ARM_PCREL_BLX:
23042 case BFD_RELOC_THUMB_PCREL_BRANCH25:
23043 case BFD_RELOC_THUMB_PCREL_BRANCH20:
23044 case BFD_RELOC_THUMB_PCREL_BRANCH23:
23045 if (ARM_IS_FUNC (fixp->fx_addsy))
23046 return 1;
23047 break;
23048
23049 default:
23050 break;
23051 }
23052#endif
23053
b5884301
PB
23054 /* Resolve these relocations even if the symbol is extern or weak.
23055 Technically this is probably wrong due to symbol preemption.
23056 In practice these relocations do not have enough range to be useful
23057 at dynamic link time, and some code (e.g. in the Linux kernel)
23058 expects these references to be resolved. */
c19d1205
ZW
23059 if (fixp->fx_r_type == BFD_RELOC_ARM_IMMEDIATE
23060 || fixp->fx_r_type == BFD_RELOC_ARM_OFFSET_IMM
b5884301 23061 || fixp->fx_r_type == BFD_RELOC_ARM_OFFSET_IMM8
0110f2b8 23062 || fixp->fx_r_type == BFD_RELOC_ARM_ADRL_IMMEDIATE
b5884301
PB
23063 || fixp->fx_r_type == BFD_RELOC_ARM_CP_OFF_IMM
23064 || fixp->fx_r_type == BFD_RELOC_ARM_CP_OFF_IMM_S2
23065 || fixp->fx_r_type == BFD_RELOC_ARM_THUMB_OFFSET
16805f35 23066 || fixp->fx_r_type == BFD_RELOC_ARM_T32_ADD_IMM
0110f2b8
PB
23067 || fixp->fx_r_type == BFD_RELOC_ARM_T32_IMMEDIATE
23068 || fixp->fx_r_type == BFD_RELOC_ARM_T32_IMM12
b5884301
PB
23069 || fixp->fx_r_type == BFD_RELOC_ARM_T32_OFFSET_IMM
23070 || fixp->fx_r_type == BFD_RELOC_ARM_T32_ADD_PC12
23071 || fixp->fx_r_type == BFD_RELOC_ARM_T32_CP_OFF_IMM
23072 || fixp->fx_r_type == BFD_RELOC_ARM_T32_CP_OFF_IMM_S2)
c19d1205 23073 return 0;
a737bd4d 23074
4962c51a
MS
23075 /* Always leave these relocations for the linker. */
23076 if ((fixp->fx_r_type >= BFD_RELOC_ARM_ALU_PC_G0_NC
23077 && fixp->fx_r_type <= BFD_RELOC_ARM_LDC_SB_G2)
23078 || fixp->fx_r_type == BFD_RELOC_ARM_LDR_PC_G0)
23079 return 1;
23080
f0291e4c
PB
23081 /* Always generate relocations against function symbols. */
23082 if (fixp->fx_r_type == BFD_RELOC_32
23083 && fixp->fx_addsy
23084 && (symbol_get_bfdsym (fixp->fx_addsy)->flags & BSF_FUNCTION))
23085 return 1;
23086
c19d1205 23087 return generic_force_reloc (fixp);
404ff6b5
AH
23088}
23089
0ffdc86c 23090#if defined (OBJ_ELF) || defined (OBJ_COFF)
e28387c3
PB
23091/* Relocations against function names must be left unadjusted,
23092 so that the linker can use this information to generate interworking
23093 stubs. The MIPS version of this function
c19d1205
ZW
23094 also prevents relocations that are mips-16 specific, but I do not
23095 know why it does this.
404ff6b5 23096
c19d1205
ZW
23097 FIXME:
23098 There is one other problem that ought to be addressed here, but
23099 which currently is not: Taking the address of a label (rather
23100 than a function) and then later jumping to that address. Such
23101 addresses also ought to have their bottom bit set (assuming that
23102 they reside in Thumb code), but at the moment they will not. */
404ff6b5 23103
c19d1205
ZW
23104bfd_boolean
23105arm_fix_adjustable (fixS * fixP)
404ff6b5 23106{
c19d1205
ZW
23107 if (fixP->fx_addsy == NULL)
23108 return 1;
404ff6b5 23109
e28387c3
PB
23110 /* Preserve relocations against symbols with function type. */
23111 if (symbol_get_bfdsym (fixP->fx_addsy)->flags & BSF_FUNCTION)
c921be7d 23112 return FALSE;
e28387c3 23113
c19d1205
ZW
23114 if (THUMB_IS_FUNC (fixP->fx_addsy)
23115 && fixP->fx_subsy == NULL)
c921be7d 23116 return FALSE;
a737bd4d 23117
c19d1205
ZW
23118 /* We need the symbol name for the VTABLE entries. */
23119 if ( fixP->fx_r_type == BFD_RELOC_VTABLE_INHERIT
23120 || fixP->fx_r_type == BFD_RELOC_VTABLE_ENTRY)
c921be7d 23121 return FALSE;
404ff6b5 23122
c19d1205
ZW
23123 /* Don't allow symbols to be discarded on GOT related relocs. */
23124 if (fixP->fx_r_type == BFD_RELOC_ARM_PLT32
23125 || fixP->fx_r_type == BFD_RELOC_ARM_GOT32
23126 || fixP->fx_r_type == BFD_RELOC_ARM_GOTOFF
23127 || fixP->fx_r_type == BFD_RELOC_ARM_TLS_GD32
23128 || fixP->fx_r_type == BFD_RELOC_ARM_TLS_LE32
23129 || fixP->fx_r_type == BFD_RELOC_ARM_TLS_IE32
23130 || fixP->fx_r_type == BFD_RELOC_ARM_TLS_LDM32
23131 || fixP->fx_r_type == BFD_RELOC_ARM_TLS_LDO32
0855e32b
NS
23132 || fixP->fx_r_type == BFD_RELOC_ARM_TLS_GOTDESC
23133 || fixP->fx_r_type == BFD_RELOC_ARM_TLS_CALL
23134 || fixP->fx_r_type == BFD_RELOC_ARM_THM_TLS_CALL
23135 || fixP->fx_r_type == BFD_RELOC_ARM_TLS_DESCSEQ
23136 || fixP->fx_r_type == BFD_RELOC_ARM_THM_TLS_DESCSEQ
c19d1205 23137 || fixP->fx_r_type == BFD_RELOC_ARM_TARGET2)
c921be7d 23138 return FALSE;
a737bd4d 23139
4962c51a
MS
23140 /* Similarly for group relocations. */
23141 if ((fixP->fx_r_type >= BFD_RELOC_ARM_ALU_PC_G0_NC
23142 && fixP->fx_r_type <= BFD_RELOC_ARM_LDC_SB_G2)
23143 || fixP->fx_r_type == BFD_RELOC_ARM_LDR_PC_G0)
c921be7d 23144 return FALSE;
4962c51a 23145
79947c54
CD
23146 /* MOVW/MOVT REL relocations have limited offsets, so keep the symbols. */
23147 if (fixP->fx_r_type == BFD_RELOC_ARM_MOVW
23148 || fixP->fx_r_type == BFD_RELOC_ARM_MOVT
23149 || fixP->fx_r_type == BFD_RELOC_ARM_MOVW_PCREL
23150 || fixP->fx_r_type == BFD_RELOC_ARM_MOVT_PCREL
23151 || fixP->fx_r_type == BFD_RELOC_ARM_THUMB_MOVW
23152 || fixP->fx_r_type == BFD_RELOC_ARM_THUMB_MOVT
23153 || fixP->fx_r_type == BFD_RELOC_ARM_THUMB_MOVW_PCREL
23154 || fixP->fx_r_type == BFD_RELOC_ARM_THUMB_MOVT_PCREL)
c921be7d 23155 return FALSE;
79947c54 23156
c921be7d 23157 return TRUE;
a737bd4d 23158}
0ffdc86c
NC
23159#endif /* defined (OBJ_ELF) || defined (OBJ_COFF) */
23160
23161#ifdef OBJ_ELF
404ff6b5 23162
c19d1205
ZW
23163const char *
23164elf32_arm_target_format (void)
404ff6b5 23165{
c19d1205
ZW
23166#ifdef TE_SYMBIAN
23167 return (target_big_endian
23168 ? "elf32-bigarm-symbian"
23169 : "elf32-littlearm-symbian");
23170#elif defined (TE_VXWORKS)
23171 return (target_big_endian
23172 ? "elf32-bigarm-vxworks"
23173 : "elf32-littlearm-vxworks");
b38cadfb
NC
23174#elif defined (TE_NACL)
23175 return (target_big_endian
23176 ? "elf32-bigarm-nacl"
23177 : "elf32-littlearm-nacl");
c19d1205
ZW
23178#else
23179 if (target_big_endian)
23180 return "elf32-bigarm";
23181 else
23182 return "elf32-littlearm";
23183#endif
404ff6b5
AH
23184}
23185
c19d1205
ZW
23186void
23187armelf_frob_symbol (symbolS * symp,
23188 int * puntp)
404ff6b5 23189{
c19d1205
ZW
23190 elf_frob_symbol (symp, puntp);
23191}
23192#endif
404ff6b5 23193
c19d1205 23194/* MD interface: Finalization. */
a737bd4d 23195
c19d1205
ZW
23196void
23197arm_cleanup (void)
23198{
23199 literal_pool * pool;
a737bd4d 23200
e07e6e58
NC
23201 /* Ensure that all the IT blocks are properly closed. */
23202 check_it_blocks_finished ();
23203
c19d1205
ZW
23204 for (pool = list_of_pools; pool; pool = pool->next)
23205 {
5f4273c7 23206 /* Put it at the end of the relevant section. */
c19d1205
ZW
23207 subseg_set (pool->section, pool->sub_section);
23208#ifdef OBJ_ELF
23209 arm_elf_change_section ();
23210#endif
23211 s_ltorg (0);
23212 }
404ff6b5
AH
23213}
23214
cd000bff
DJ
23215#ifdef OBJ_ELF
23216/* Remove any excess mapping symbols generated for alignment frags in
23217 SEC. We may have created a mapping symbol before a zero byte
23218 alignment; remove it if there's a mapping symbol after the
23219 alignment. */
23220static void
23221check_mapping_symbols (bfd *abfd ATTRIBUTE_UNUSED, asection *sec,
23222 void *dummy ATTRIBUTE_UNUSED)
23223{
23224 segment_info_type *seginfo = seg_info (sec);
23225 fragS *fragp;
23226
23227 if (seginfo == NULL || seginfo->frchainP == NULL)
23228 return;
23229
23230 for (fragp = seginfo->frchainP->frch_root;
23231 fragp != NULL;
23232 fragp = fragp->fr_next)
23233 {
23234 symbolS *sym = fragp->tc_frag_data.last_map;
23235 fragS *next = fragp->fr_next;
23236
23237 /* Variable-sized frags have been converted to fixed size by
23238 this point. But if this was variable-sized to start with,
23239 there will be a fixed-size frag after it. So don't handle
23240 next == NULL. */
23241 if (sym == NULL || next == NULL)
23242 continue;
23243
23244 if (S_GET_VALUE (sym) < next->fr_address)
23245 /* Not at the end of this frag. */
23246 continue;
23247 know (S_GET_VALUE (sym) == next->fr_address);
23248
23249 do
23250 {
23251 if (next->tc_frag_data.first_map != NULL)
23252 {
23253 /* Next frag starts with a mapping symbol. Discard this
23254 one. */
23255 symbol_remove (sym, &symbol_rootP, &symbol_lastP);
23256 break;
23257 }
23258
23259 if (next->fr_next == NULL)
23260 {
23261 /* This mapping symbol is at the end of the section. Discard
23262 it. */
23263 know (next->fr_fix == 0 && next->fr_var == 0);
23264 symbol_remove (sym, &symbol_rootP, &symbol_lastP);
23265 break;
23266 }
23267
23268 /* As long as we have empty frags without any mapping symbols,
23269 keep looking. */
23270 /* If the next frag is non-empty and does not start with a
23271 mapping symbol, then this mapping symbol is required. */
23272 if (next->fr_address != next->fr_next->fr_address)
23273 break;
23274
23275 next = next->fr_next;
23276 }
23277 while (next != NULL);
23278 }
23279}
23280#endif
23281
c19d1205
ZW
23282/* Adjust the symbol table. This marks Thumb symbols as distinct from
23283 ARM ones. */
404ff6b5 23284
c19d1205
ZW
23285void
23286arm_adjust_symtab (void)
404ff6b5 23287{
c19d1205
ZW
23288#ifdef OBJ_COFF
23289 symbolS * sym;
404ff6b5 23290
c19d1205
ZW
23291 for (sym = symbol_rootP; sym != NULL; sym = symbol_next (sym))
23292 {
23293 if (ARM_IS_THUMB (sym))
23294 {
23295 if (THUMB_IS_FUNC (sym))
23296 {
23297 /* Mark the symbol as a Thumb function. */
23298 if ( S_GET_STORAGE_CLASS (sym) == C_STAT
23299 || S_GET_STORAGE_CLASS (sym) == C_LABEL) /* This can happen! */
23300 S_SET_STORAGE_CLASS (sym, C_THUMBSTATFUNC);
404ff6b5 23301
c19d1205
ZW
23302 else if (S_GET_STORAGE_CLASS (sym) == C_EXT)
23303 S_SET_STORAGE_CLASS (sym, C_THUMBEXTFUNC);
23304 else
23305 as_bad (_("%s: unexpected function type: %d"),
23306 S_GET_NAME (sym), S_GET_STORAGE_CLASS (sym));
23307 }
23308 else switch (S_GET_STORAGE_CLASS (sym))
23309 {
23310 case C_EXT:
23311 S_SET_STORAGE_CLASS (sym, C_THUMBEXT);
23312 break;
23313 case C_STAT:
23314 S_SET_STORAGE_CLASS (sym, C_THUMBSTAT);
23315 break;
23316 case C_LABEL:
23317 S_SET_STORAGE_CLASS (sym, C_THUMBLABEL);
23318 break;
23319 default:
23320 /* Do nothing. */
23321 break;
23322 }
23323 }
a737bd4d 23324
c19d1205
ZW
23325 if (ARM_IS_INTERWORK (sym))
23326 coffsymbol (symbol_get_bfdsym (sym))->native->u.syment.n_flags = 0xFF;
404ff6b5 23327 }
c19d1205
ZW
23328#endif
23329#ifdef OBJ_ELF
23330 symbolS * sym;
23331 char bind;
404ff6b5 23332
c19d1205 23333 for (sym = symbol_rootP; sym != NULL; sym = symbol_next (sym))
404ff6b5 23334 {
c19d1205
ZW
23335 if (ARM_IS_THUMB (sym))
23336 {
23337 elf_symbol_type * elf_sym;
404ff6b5 23338
c19d1205
ZW
23339 elf_sym = elf_symbol (symbol_get_bfdsym (sym));
23340 bind = ELF_ST_BIND (elf_sym->internal_elf_sym.st_info);
404ff6b5 23341
b0796911
PB
23342 if (! bfd_is_arm_special_symbol_name (elf_sym->symbol.name,
23343 BFD_ARM_SPECIAL_SYM_TYPE_ANY))
c19d1205
ZW
23344 {
23345 /* If it's a .thumb_func, declare it as so,
23346 otherwise tag label as .code 16. */
23347 if (THUMB_IS_FUNC (sym))
35fc36a8
RS
23348 elf_sym->internal_elf_sym.st_target_internal
23349 = ST_BRANCH_TO_THUMB;
3ba67470 23350 else if (EF_ARM_EABI_VERSION (meabi_flags) < EF_ARM_EABI_VER4)
c19d1205
ZW
23351 elf_sym->internal_elf_sym.st_info =
23352 ELF_ST_INFO (bind, STT_ARM_16BIT);
23353 }
23354 }
23355 }
cd000bff
DJ
23356
23357 /* Remove any overlapping mapping symbols generated by alignment frags. */
23358 bfd_map_over_sections (stdoutput, check_mapping_symbols, (char *) 0);
709001e9
MM
23359 /* Now do generic ELF adjustments. */
23360 elf_adjust_symtab ();
c19d1205 23361#endif
404ff6b5
AH
23362}
23363
c19d1205 23364/* MD interface: Initialization. */
404ff6b5 23365
a737bd4d 23366static void
c19d1205 23367set_constant_flonums (void)
a737bd4d 23368{
c19d1205 23369 int i;
404ff6b5 23370
c19d1205
ZW
23371 for (i = 0; i < NUM_FLOAT_VALS; i++)
23372 if (atof_ieee ((char *) fp_const[i], 'x', fp_values[i]) == NULL)
23373 abort ();
a737bd4d 23374}
404ff6b5 23375
3e9e4fcf
JB
23376/* Auto-select Thumb mode if it's the only available instruction set for the
23377 given architecture. */
23378
23379static void
23380autoselect_thumb_from_cpu_variant (void)
23381{
23382 if (!ARM_CPU_HAS_FEATURE (cpu_variant, arm_ext_v1))
23383 opcode_select (16);
23384}
23385
c19d1205
ZW
23386void
23387md_begin (void)
a737bd4d 23388{
c19d1205
ZW
23389 unsigned mach;
23390 unsigned int i;
404ff6b5 23391
c19d1205
ZW
23392 if ( (arm_ops_hsh = hash_new ()) == NULL
23393 || (arm_cond_hsh = hash_new ()) == NULL
23394 || (arm_shift_hsh = hash_new ()) == NULL
23395 || (arm_psr_hsh = hash_new ()) == NULL
62b3e311 23396 || (arm_v7m_psr_hsh = hash_new ()) == NULL
c19d1205 23397 || (arm_reg_hsh = hash_new ()) == NULL
62b3e311
PB
23398 || (arm_reloc_hsh = hash_new ()) == NULL
23399 || (arm_barrier_opt_hsh = hash_new ()) == NULL)
c19d1205
ZW
23400 as_fatal (_("virtual memory exhausted"));
23401
23402 for (i = 0; i < sizeof (insns) / sizeof (struct asm_opcode); i++)
d3ce72d0 23403 hash_insert (arm_ops_hsh, insns[i].template_name, (void *) (insns + i));
c19d1205 23404 for (i = 0; i < sizeof (conds) / sizeof (struct asm_cond); i++)
d3ce72d0 23405 hash_insert (arm_cond_hsh, conds[i].template_name, (void *) (conds + i));
c19d1205 23406 for (i = 0; i < sizeof (shift_names) / sizeof (struct asm_shift_name); i++)
5a49b8ac 23407 hash_insert (arm_shift_hsh, shift_names[i].name, (void *) (shift_names + i));
c19d1205 23408 for (i = 0; i < sizeof (psrs) / sizeof (struct asm_psr); i++)
d3ce72d0 23409 hash_insert (arm_psr_hsh, psrs[i].template_name, (void *) (psrs + i));
62b3e311 23410 for (i = 0; i < sizeof (v7m_psrs) / sizeof (struct asm_psr); i++)
d3ce72d0 23411 hash_insert (arm_v7m_psr_hsh, v7m_psrs[i].template_name,
477330fc 23412 (void *) (v7m_psrs + i));
c19d1205 23413 for (i = 0; i < sizeof (reg_names) / sizeof (struct reg_entry); i++)
5a49b8ac 23414 hash_insert (arm_reg_hsh, reg_names[i].name, (void *) (reg_names + i));
62b3e311
PB
23415 for (i = 0;
23416 i < sizeof (barrier_opt_names) / sizeof (struct asm_barrier_opt);
23417 i++)
d3ce72d0 23418 hash_insert (arm_barrier_opt_hsh, barrier_opt_names[i].template_name,
5a49b8ac 23419 (void *) (barrier_opt_names + i));
c19d1205 23420#ifdef OBJ_ELF
3da1d841
NC
23421 for (i = 0; i < ARRAY_SIZE (reloc_names); i++)
23422 {
23423 struct reloc_entry * entry = reloc_names + i;
23424
23425 if (arm_is_eabi() && entry->reloc == BFD_RELOC_ARM_PLT32)
23426 /* This makes encode_branch() use the EABI versions of this relocation. */
23427 entry->reloc = BFD_RELOC_UNUSED;
23428
23429 hash_insert (arm_reloc_hsh, entry->name, (void *) entry);
23430 }
c19d1205
ZW
23431#endif
23432
23433 set_constant_flonums ();
404ff6b5 23434
c19d1205
ZW
23435 /* Set the cpu variant based on the command-line options. We prefer
23436 -mcpu= over -march= if both are set (as for GCC); and we prefer
23437 -mfpu= over any other way of setting the floating point unit.
23438 Use of legacy options with new options are faulted. */
e74cfd16 23439 if (legacy_cpu)
404ff6b5 23440 {
e74cfd16 23441 if (mcpu_cpu_opt || march_cpu_opt)
c19d1205
ZW
23442 as_bad (_("use of old and new-style options to set CPU type"));
23443
23444 mcpu_cpu_opt = legacy_cpu;
404ff6b5 23445 }
e74cfd16 23446 else if (!mcpu_cpu_opt)
c19d1205 23447 mcpu_cpu_opt = march_cpu_opt;
404ff6b5 23448
e74cfd16 23449 if (legacy_fpu)
c19d1205 23450 {
e74cfd16 23451 if (mfpu_opt)
c19d1205 23452 as_bad (_("use of old and new-style options to set FPU type"));
03b1477f
RE
23453
23454 mfpu_opt = legacy_fpu;
23455 }
e74cfd16 23456 else if (!mfpu_opt)
03b1477f 23457 {
45eb4c1b
NS
23458#if !(defined (EABI_DEFAULT) || defined (TE_LINUX) \
23459 || defined (TE_NetBSD) || defined (TE_VXWORKS))
39c2da32
RE
23460 /* Some environments specify a default FPU. If they don't, infer it
23461 from the processor. */
e74cfd16 23462 if (mcpu_fpu_opt)
03b1477f
RE
23463 mfpu_opt = mcpu_fpu_opt;
23464 else
23465 mfpu_opt = march_fpu_opt;
39c2da32 23466#else
e74cfd16 23467 mfpu_opt = &fpu_default;
39c2da32 23468#endif
03b1477f
RE
23469 }
23470
e74cfd16 23471 if (!mfpu_opt)
03b1477f 23472 {
493cb6ef 23473 if (mcpu_cpu_opt != NULL)
e74cfd16 23474 mfpu_opt = &fpu_default;
493cb6ef 23475 else if (mcpu_fpu_opt != NULL && ARM_CPU_HAS_FEATURE (*mcpu_fpu_opt, arm_ext_v5))
e74cfd16 23476 mfpu_opt = &fpu_arch_vfp_v2;
03b1477f 23477 else
e74cfd16 23478 mfpu_opt = &fpu_arch_fpa;
03b1477f
RE
23479 }
23480
ee065d83 23481#ifdef CPU_DEFAULT
e74cfd16 23482 if (!mcpu_cpu_opt)
ee065d83 23483 {
e74cfd16
PB
23484 mcpu_cpu_opt = &cpu_default;
23485 selected_cpu = cpu_default;
ee065d83 23486 }
e74cfd16
PB
23487#else
23488 if (mcpu_cpu_opt)
23489 selected_cpu = *mcpu_cpu_opt;
ee065d83 23490 else
e74cfd16 23491 mcpu_cpu_opt = &arm_arch_any;
ee065d83 23492#endif
03b1477f 23493
e74cfd16 23494 ARM_MERGE_FEATURE_SETS (cpu_variant, *mcpu_cpu_opt, *mfpu_opt);
03b1477f 23495
3e9e4fcf
JB
23496 autoselect_thumb_from_cpu_variant ();
23497
e74cfd16 23498 arm_arch_used = thumb_arch_used = arm_arch_none;
ee065d83 23499
f17c130b 23500#if defined OBJ_COFF || defined OBJ_ELF
b99bd4ef 23501 {
7cc69913
NC
23502 unsigned int flags = 0;
23503
23504#if defined OBJ_ELF
23505 flags = meabi_flags;
d507cf36
PB
23506
23507 switch (meabi_flags)
33a392fb 23508 {
d507cf36 23509 case EF_ARM_EABI_UNKNOWN:
7cc69913 23510#endif
d507cf36
PB
23511 /* Set the flags in the private structure. */
23512 if (uses_apcs_26) flags |= F_APCS26;
23513 if (support_interwork) flags |= F_INTERWORK;
23514 if (uses_apcs_float) flags |= F_APCS_FLOAT;
c19d1205 23515 if (pic_code) flags |= F_PIC;
e74cfd16 23516 if (!ARM_CPU_HAS_FEATURE (cpu_variant, fpu_any_hard))
7cc69913
NC
23517 flags |= F_SOFT_FLOAT;
23518
d507cf36
PB
23519 switch (mfloat_abi_opt)
23520 {
23521 case ARM_FLOAT_ABI_SOFT:
23522 case ARM_FLOAT_ABI_SOFTFP:
23523 flags |= F_SOFT_FLOAT;
23524 break;
33a392fb 23525
d507cf36
PB
23526 case ARM_FLOAT_ABI_HARD:
23527 if (flags & F_SOFT_FLOAT)
23528 as_bad (_("hard-float conflicts with specified fpu"));
23529 break;
23530 }
03b1477f 23531
e74cfd16
PB
23532 /* Using pure-endian doubles (even if soft-float). */
23533 if (ARM_CPU_HAS_FEATURE (cpu_variant, fpu_endian_pure))
7cc69913 23534 flags |= F_VFP_FLOAT;
f17c130b 23535
fde78edd 23536#if defined OBJ_ELF
e74cfd16 23537 if (ARM_CPU_HAS_FEATURE (cpu_variant, fpu_arch_maverick))
d507cf36 23538 flags |= EF_ARM_MAVERICK_FLOAT;
d507cf36
PB
23539 break;
23540
8cb51566 23541 case EF_ARM_EABI_VER4:
3a4a14e9 23542 case EF_ARM_EABI_VER5:
c19d1205 23543 /* No additional flags to set. */
d507cf36
PB
23544 break;
23545
23546 default:
23547 abort ();
23548 }
7cc69913 23549#endif
b99bd4ef
NC
23550 bfd_set_private_flags (stdoutput, flags);
23551
23552 /* We have run out flags in the COFF header to encode the
23553 status of ATPCS support, so instead we create a dummy,
c19d1205 23554 empty, debug section called .arm.atpcs. */
b99bd4ef
NC
23555 if (atpcs)
23556 {
23557 asection * sec;
23558
23559 sec = bfd_make_section (stdoutput, ".arm.atpcs");
23560
23561 if (sec != NULL)
23562 {
23563 bfd_set_section_flags
23564 (stdoutput, sec, SEC_READONLY | SEC_DEBUGGING /* | SEC_HAS_CONTENTS */);
23565 bfd_set_section_size (stdoutput, sec, 0);
23566 bfd_set_section_contents (stdoutput, sec, NULL, 0, 0);
23567 }
23568 }
7cc69913 23569 }
f17c130b 23570#endif
b99bd4ef
NC
23571
23572 /* Record the CPU type as well. */
2d447fca
JM
23573 if (ARM_CPU_HAS_FEATURE (cpu_variant, arm_cext_iwmmxt2))
23574 mach = bfd_mach_arm_iWMMXt2;
23575 else if (ARM_CPU_HAS_FEATURE (cpu_variant, arm_cext_iwmmxt))
e16bb312 23576 mach = bfd_mach_arm_iWMMXt;
e74cfd16 23577 else if (ARM_CPU_HAS_FEATURE (cpu_variant, arm_cext_xscale))
b99bd4ef 23578 mach = bfd_mach_arm_XScale;
e74cfd16 23579 else if (ARM_CPU_HAS_FEATURE (cpu_variant, arm_cext_maverick))
fde78edd 23580 mach = bfd_mach_arm_ep9312;
e74cfd16 23581 else if (ARM_CPU_HAS_FEATURE (cpu_variant, arm_ext_v5e))
b99bd4ef 23582 mach = bfd_mach_arm_5TE;
e74cfd16 23583 else if (ARM_CPU_HAS_FEATURE (cpu_variant, arm_ext_v5))
b99bd4ef 23584 {
e74cfd16 23585 if (ARM_CPU_HAS_FEATURE (cpu_variant, arm_ext_v4t))
b99bd4ef
NC
23586 mach = bfd_mach_arm_5T;
23587 else
23588 mach = bfd_mach_arm_5;
23589 }
e74cfd16 23590 else if (ARM_CPU_HAS_FEATURE (cpu_variant, arm_ext_v4))
b99bd4ef 23591 {
e74cfd16 23592 if (ARM_CPU_HAS_FEATURE (cpu_variant, arm_ext_v4t))
b99bd4ef
NC
23593 mach = bfd_mach_arm_4T;
23594 else
23595 mach = bfd_mach_arm_4;
23596 }
e74cfd16 23597 else if (ARM_CPU_HAS_FEATURE (cpu_variant, arm_ext_v3m))
b99bd4ef 23598 mach = bfd_mach_arm_3M;
e74cfd16
PB
23599 else if (ARM_CPU_HAS_FEATURE (cpu_variant, arm_ext_v3))
23600 mach = bfd_mach_arm_3;
23601 else if (ARM_CPU_HAS_FEATURE (cpu_variant, arm_ext_v2s))
23602 mach = bfd_mach_arm_2a;
23603 else if (ARM_CPU_HAS_FEATURE (cpu_variant, arm_ext_v2))
23604 mach = bfd_mach_arm_2;
23605 else
23606 mach = bfd_mach_arm_unknown;
b99bd4ef
NC
23607
23608 bfd_set_arch_mach (stdoutput, TARGET_ARCH, mach);
23609}
23610
c19d1205 23611/* Command line processing. */
b99bd4ef 23612
c19d1205
ZW
23613/* md_parse_option
23614 Invocation line includes a switch not recognized by the base assembler.
23615 See if it's a processor-specific option.
b99bd4ef 23616
c19d1205
ZW
23617 This routine is somewhat complicated by the need for backwards
23618 compatibility (since older releases of gcc can't be changed).
23619 The new options try to make the interface as compatible as
23620 possible with GCC.
b99bd4ef 23621
c19d1205 23622 New options (supported) are:
b99bd4ef 23623
c19d1205
ZW
23624 -mcpu=<cpu name> Assemble for selected processor
23625 -march=<architecture name> Assemble for selected architecture
23626 -mfpu=<fpu architecture> Assemble for selected FPU.
23627 -EB/-mbig-endian Big-endian
23628 -EL/-mlittle-endian Little-endian
23629 -k Generate PIC code
23630 -mthumb Start in Thumb mode
23631 -mthumb-interwork Code supports ARM/Thumb interworking
b99bd4ef 23632
278df34e 23633 -m[no-]warn-deprecated Warn about deprecated features
267bf995 23634
c19d1205 23635 For now we will also provide support for:
b99bd4ef 23636
c19d1205
ZW
23637 -mapcs-32 32-bit Program counter
23638 -mapcs-26 26-bit Program counter
23639 -macps-float Floats passed in FP registers
23640 -mapcs-reentrant Reentrant code
23641 -matpcs
23642 (sometime these will probably be replaced with -mapcs=<list of options>
23643 and -matpcs=<list of options>)
b99bd4ef 23644
c19d1205
ZW
23645 The remaining options are only supported for back-wards compatibility.
23646 Cpu variants, the arm part is optional:
23647 -m[arm]1 Currently not supported.
23648 -m[arm]2, -m[arm]250 Arm 2 and Arm 250 processor
23649 -m[arm]3 Arm 3 processor
23650 -m[arm]6[xx], Arm 6 processors
23651 -m[arm]7[xx][t][[d]m] Arm 7 processors
23652 -m[arm]8[10] Arm 8 processors
23653 -m[arm]9[20][tdmi] Arm 9 processors
23654 -mstrongarm[110[0]] StrongARM processors
23655 -mxscale XScale processors
23656 -m[arm]v[2345[t[e]]] Arm architectures
23657 -mall All (except the ARM1)
23658 FP variants:
23659 -mfpa10, -mfpa11 FPA10 and 11 co-processor instructions
23660 -mfpe-old (No float load/store multiples)
23661 -mvfpxd VFP Single precision
23662 -mvfp All VFP
23663 -mno-fpu Disable all floating point instructions
b99bd4ef 23664
c19d1205
ZW
23665 The following CPU names are recognized:
23666 arm1, arm2, arm250, arm3, arm6, arm600, arm610, arm620,
23667 arm7, arm7m, arm7d, arm7dm, arm7di, arm7dmi, arm70, arm700,
23668 arm700i, arm710 arm710t, arm720, arm720t, arm740t, arm710c,
23669 arm7100, arm7500, arm7500fe, arm7tdmi, arm8, arm810, arm9,
23670 arm920, arm920t, arm940t, arm946, arm966, arm9tdmi, arm9e,
23671 arm10t arm10e, arm1020t, arm1020e, arm10200e,
23672 strongarm, strongarm110, strongarm1100, strongarm1110, xscale.
b99bd4ef 23673
c19d1205 23674 */
b99bd4ef 23675
c19d1205 23676const char * md_shortopts = "m:k";
b99bd4ef 23677
c19d1205
ZW
23678#ifdef ARM_BI_ENDIAN
23679#define OPTION_EB (OPTION_MD_BASE + 0)
23680#define OPTION_EL (OPTION_MD_BASE + 1)
b99bd4ef 23681#else
c19d1205
ZW
23682#if TARGET_BYTES_BIG_ENDIAN
23683#define OPTION_EB (OPTION_MD_BASE + 0)
b99bd4ef 23684#else
c19d1205
ZW
23685#define OPTION_EL (OPTION_MD_BASE + 1)
23686#endif
b99bd4ef 23687#endif
845b51d6 23688#define OPTION_FIX_V4BX (OPTION_MD_BASE + 2)
b99bd4ef 23689
c19d1205 23690struct option md_longopts[] =
b99bd4ef 23691{
c19d1205
ZW
23692#ifdef OPTION_EB
23693 {"EB", no_argument, NULL, OPTION_EB},
23694#endif
23695#ifdef OPTION_EL
23696 {"EL", no_argument, NULL, OPTION_EL},
b99bd4ef 23697#endif
845b51d6 23698 {"fix-v4bx", no_argument, NULL, OPTION_FIX_V4BX},
c19d1205
ZW
23699 {NULL, no_argument, NULL, 0}
23700};
b99bd4ef 23701
c19d1205 23702size_t md_longopts_size = sizeof (md_longopts);
b99bd4ef 23703
c19d1205 23704struct arm_option_table
b99bd4ef 23705{
c19d1205
ZW
23706 char *option; /* Option name to match. */
23707 char *help; /* Help information. */
23708 int *var; /* Variable to change. */
23709 int value; /* What to change it to. */
23710 char *deprecated; /* If non-null, print this message. */
23711};
b99bd4ef 23712
c19d1205
ZW
23713struct arm_option_table arm_opts[] =
23714{
23715 {"k", N_("generate PIC code"), &pic_code, 1, NULL},
23716 {"mthumb", N_("assemble Thumb code"), &thumb_mode, 1, NULL},
23717 {"mthumb-interwork", N_("support ARM/Thumb interworking"),
23718 &support_interwork, 1, NULL},
23719 {"mapcs-32", N_("code uses 32-bit program counter"), &uses_apcs_26, 0, NULL},
23720 {"mapcs-26", N_("code uses 26-bit program counter"), &uses_apcs_26, 1, NULL},
23721 {"mapcs-float", N_("floating point args are in fp regs"), &uses_apcs_float,
23722 1, NULL},
23723 {"mapcs-reentrant", N_("re-entrant code"), &pic_code, 1, NULL},
23724 {"matpcs", N_("code is ATPCS conformant"), &atpcs, 1, NULL},
23725 {"mbig-endian", N_("assemble for big-endian"), &target_big_endian, 1, NULL},
23726 {"mlittle-endian", N_("assemble for little-endian"), &target_big_endian, 0,
23727 NULL},
b99bd4ef 23728
c19d1205
ZW
23729 /* These are recognized by the assembler, but have no affect on code. */
23730 {"mapcs-frame", N_("use frame pointer"), NULL, 0, NULL},
23731 {"mapcs-stack-check", N_("use stack size checking"), NULL, 0, NULL},
278df34e
NS
23732
23733 {"mwarn-deprecated", NULL, &warn_on_deprecated, 1, NULL},
23734 {"mno-warn-deprecated", N_("do not warn on use of deprecated feature"),
23735 &warn_on_deprecated, 0, NULL},
e74cfd16
PB
23736 {NULL, NULL, NULL, 0, NULL}
23737};
23738
23739struct arm_legacy_option_table
23740{
23741 char *option; /* Option name to match. */
23742 const arm_feature_set **var; /* Variable to change. */
23743 const arm_feature_set value; /* What to change it to. */
23744 char *deprecated; /* If non-null, print this message. */
23745};
b99bd4ef 23746
e74cfd16
PB
23747const struct arm_legacy_option_table arm_legacy_opts[] =
23748{
c19d1205
ZW
23749 /* DON'T add any new processors to this list -- we want the whole list
23750 to go away... Add them to the processors table instead. */
e74cfd16
PB
23751 {"marm1", &legacy_cpu, ARM_ARCH_V1, N_("use -mcpu=arm1")},
23752 {"m1", &legacy_cpu, ARM_ARCH_V1, N_("use -mcpu=arm1")},
23753 {"marm2", &legacy_cpu, ARM_ARCH_V2, N_("use -mcpu=arm2")},
23754 {"m2", &legacy_cpu, ARM_ARCH_V2, N_("use -mcpu=arm2")},
23755 {"marm250", &legacy_cpu, ARM_ARCH_V2S, N_("use -mcpu=arm250")},
23756 {"m250", &legacy_cpu, ARM_ARCH_V2S, N_("use -mcpu=arm250")},
23757 {"marm3", &legacy_cpu, ARM_ARCH_V2S, N_("use -mcpu=arm3")},
23758 {"m3", &legacy_cpu, ARM_ARCH_V2S, N_("use -mcpu=arm3")},
23759 {"marm6", &legacy_cpu, ARM_ARCH_V3, N_("use -mcpu=arm6")},
23760 {"m6", &legacy_cpu, ARM_ARCH_V3, N_("use -mcpu=arm6")},
23761 {"marm600", &legacy_cpu, ARM_ARCH_V3, N_("use -mcpu=arm600")},
23762 {"m600", &legacy_cpu, ARM_ARCH_V3, N_("use -mcpu=arm600")},
23763 {"marm610", &legacy_cpu, ARM_ARCH_V3, N_("use -mcpu=arm610")},
23764 {"m610", &legacy_cpu, ARM_ARCH_V3, N_("use -mcpu=arm610")},
23765 {"marm620", &legacy_cpu, ARM_ARCH_V3, N_("use -mcpu=arm620")},
23766 {"m620", &legacy_cpu, ARM_ARCH_V3, N_("use -mcpu=arm620")},
23767 {"marm7", &legacy_cpu, ARM_ARCH_V3, N_("use -mcpu=arm7")},
23768 {"m7", &legacy_cpu, ARM_ARCH_V3, N_("use -mcpu=arm7")},
23769 {"marm70", &legacy_cpu, ARM_ARCH_V3, N_("use -mcpu=arm70")},
23770 {"m70", &legacy_cpu, ARM_ARCH_V3, N_("use -mcpu=arm70")},
23771 {"marm700", &legacy_cpu, ARM_ARCH_V3, N_("use -mcpu=arm700")},
23772 {"m700", &legacy_cpu, ARM_ARCH_V3, N_("use -mcpu=arm700")},
23773 {"marm700i", &legacy_cpu, ARM_ARCH_V3, N_("use -mcpu=arm700i")},
23774 {"m700i", &legacy_cpu, ARM_ARCH_V3, N_("use -mcpu=arm700i")},
23775 {"marm710", &legacy_cpu, ARM_ARCH_V3, N_("use -mcpu=arm710")},
23776 {"m710", &legacy_cpu, ARM_ARCH_V3, N_("use -mcpu=arm710")},
23777 {"marm710c", &legacy_cpu, ARM_ARCH_V3, N_("use -mcpu=arm710c")},
23778 {"m710c", &legacy_cpu, ARM_ARCH_V3, N_("use -mcpu=arm710c")},
23779 {"marm720", &legacy_cpu, ARM_ARCH_V3, N_("use -mcpu=arm720")},
23780 {"m720", &legacy_cpu, ARM_ARCH_V3, N_("use -mcpu=arm720")},
23781 {"marm7d", &legacy_cpu, ARM_ARCH_V3, N_("use -mcpu=arm7d")},
23782 {"m7d", &legacy_cpu, ARM_ARCH_V3, N_("use -mcpu=arm7d")},
23783 {"marm7di", &legacy_cpu, ARM_ARCH_V3, N_("use -mcpu=arm7di")},
23784 {"m7di", &legacy_cpu, ARM_ARCH_V3, N_("use -mcpu=arm7di")},
23785 {"marm7m", &legacy_cpu, ARM_ARCH_V3M, N_("use -mcpu=arm7m")},
23786 {"m7m", &legacy_cpu, ARM_ARCH_V3M, N_("use -mcpu=arm7m")},
23787 {"marm7dm", &legacy_cpu, ARM_ARCH_V3M, N_("use -mcpu=arm7dm")},
23788 {"m7dm", &legacy_cpu, ARM_ARCH_V3M, N_("use -mcpu=arm7dm")},
23789 {"marm7dmi", &legacy_cpu, ARM_ARCH_V3M, N_("use -mcpu=arm7dmi")},
23790 {"m7dmi", &legacy_cpu, ARM_ARCH_V3M, N_("use -mcpu=arm7dmi")},
23791 {"marm7100", &legacy_cpu, ARM_ARCH_V3, N_("use -mcpu=arm7100")},
23792 {"m7100", &legacy_cpu, ARM_ARCH_V3, N_("use -mcpu=arm7100")},
23793 {"marm7500", &legacy_cpu, ARM_ARCH_V3, N_("use -mcpu=arm7500")},
23794 {"m7500", &legacy_cpu, ARM_ARCH_V3, N_("use -mcpu=arm7500")},
23795 {"marm7500fe", &legacy_cpu, ARM_ARCH_V3, N_("use -mcpu=arm7500fe")},
23796 {"m7500fe", &legacy_cpu, ARM_ARCH_V3, N_("use -mcpu=arm7500fe")},
23797 {"marm7t", &legacy_cpu, ARM_ARCH_V4T, N_("use -mcpu=arm7tdmi")},
23798 {"m7t", &legacy_cpu, ARM_ARCH_V4T, N_("use -mcpu=arm7tdmi")},
23799 {"marm7tdmi", &legacy_cpu, ARM_ARCH_V4T, N_("use -mcpu=arm7tdmi")},
23800 {"m7tdmi", &legacy_cpu, ARM_ARCH_V4T, N_("use -mcpu=arm7tdmi")},
23801 {"marm710t", &legacy_cpu, ARM_ARCH_V4T, N_("use -mcpu=arm710t")},
23802 {"m710t", &legacy_cpu, ARM_ARCH_V4T, N_("use -mcpu=arm710t")},
23803 {"marm720t", &legacy_cpu, ARM_ARCH_V4T, N_("use -mcpu=arm720t")},
23804 {"m720t", &legacy_cpu, ARM_ARCH_V4T, N_("use -mcpu=arm720t")},
23805 {"marm740t", &legacy_cpu, ARM_ARCH_V4T, N_("use -mcpu=arm740t")},
23806 {"m740t", &legacy_cpu, ARM_ARCH_V4T, N_("use -mcpu=arm740t")},
23807 {"marm8", &legacy_cpu, ARM_ARCH_V4, N_("use -mcpu=arm8")},
23808 {"m8", &legacy_cpu, ARM_ARCH_V4, N_("use -mcpu=arm8")},
23809 {"marm810", &legacy_cpu, ARM_ARCH_V4, N_("use -mcpu=arm810")},
23810 {"m810", &legacy_cpu, ARM_ARCH_V4, N_("use -mcpu=arm810")},
23811 {"marm9", &legacy_cpu, ARM_ARCH_V4T, N_("use -mcpu=arm9")},
23812 {"m9", &legacy_cpu, ARM_ARCH_V4T, N_("use -mcpu=arm9")},
23813 {"marm9tdmi", &legacy_cpu, ARM_ARCH_V4T, N_("use -mcpu=arm9tdmi")},
23814 {"m9tdmi", &legacy_cpu, ARM_ARCH_V4T, N_("use -mcpu=arm9tdmi")},
23815 {"marm920", &legacy_cpu, ARM_ARCH_V4T, N_("use -mcpu=arm920")},
23816 {"m920", &legacy_cpu, ARM_ARCH_V4T, N_("use -mcpu=arm920")},
23817 {"marm940", &legacy_cpu, ARM_ARCH_V4T, N_("use -mcpu=arm940")},
23818 {"m940", &legacy_cpu, ARM_ARCH_V4T, N_("use -mcpu=arm940")},
23819 {"mstrongarm", &legacy_cpu, ARM_ARCH_V4, N_("use -mcpu=strongarm")},
23820 {"mstrongarm110", &legacy_cpu, ARM_ARCH_V4,
c19d1205 23821 N_("use -mcpu=strongarm110")},
e74cfd16 23822 {"mstrongarm1100", &legacy_cpu, ARM_ARCH_V4,
c19d1205 23823 N_("use -mcpu=strongarm1100")},
e74cfd16 23824 {"mstrongarm1110", &legacy_cpu, ARM_ARCH_V4,
c19d1205 23825 N_("use -mcpu=strongarm1110")},
e74cfd16
PB
23826 {"mxscale", &legacy_cpu, ARM_ARCH_XSCALE, N_("use -mcpu=xscale")},
23827 {"miwmmxt", &legacy_cpu, ARM_ARCH_IWMMXT, N_("use -mcpu=iwmmxt")},
23828 {"mall", &legacy_cpu, ARM_ANY, N_("use -mcpu=all")},
7ed4c4c5 23829
c19d1205 23830 /* Architecture variants -- don't add any more to this list either. */
e74cfd16
PB
23831 {"mv2", &legacy_cpu, ARM_ARCH_V2, N_("use -march=armv2")},
23832 {"marmv2", &legacy_cpu, ARM_ARCH_V2, N_("use -march=armv2")},
23833 {"mv2a", &legacy_cpu, ARM_ARCH_V2S, N_("use -march=armv2a")},
23834 {"marmv2a", &legacy_cpu, ARM_ARCH_V2S, N_("use -march=armv2a")},
23835 {"mv3", &legacy_cpu, ARM_ARCH_V3, N_("use -march=armv3")},
23836 {"marmv3", &legacy_cpu, ARM_ARCH_V3, N_("use -march=armv3")},
23837 {"mv3m", &legacy_cpu, ARM_ARCH_V3M, N_("use -march=armv3m")},
23838 {"marmv3m", &legacy_cpu, ARM_ARCH_V3M, N_("use -march=armv3m")},
23839 {"mv4", &legacy_cpu, ARM_ARCH_V4, N_("use -march=armv4")},
23840 {"marmv4", &legacy_cpu, ARM_ARCH_V4, N_("use -march=armv4")},
23841 {"mv4t", &legacy_cpu, ARM_ARCH_V4T, N_("use -march=armv4t")},
23842 {"marmv4t", &legacy_cpu, ARM_ARCH_V4T, N_("use -march=armv4t")},
23843 {"mv5", &legacy_cpu, ARM_ARCH_V5, N_("use -march=armv5")},
23844 {"marmv5", &legacy_cpu, ARM_ARCH_V5, N_("use -march=armv5")},
23845 {"mv5t", &legacy_cpu, ARM_ARCH_V5T, N_("use -march=armv5t")},
23846 {"marmv5t", &legacy_cpu, ARM_ARCH_V5T, N_("use -march=armv5t")},
23847 {"mv5e", &legacy_cpu, ARM_ARCH_V5TE, N_("use -march=armv5te")},
23848 {"marmv5e", &legacy_cpu, ARM_ARCH_V5TE, N_("use -march=armv5te")},
7ed4c4c5 23849
c19d1205 23850 /* Floating point variants -- don't add any more to this list either. */
e74cfd16
PB
23851 {"mfpe-old", &legacy_fpu, FPU_ARCH_FPE, N_("use -mfpu=fpe")},
23852 {"mfpa10", &legacy_fpu, FPU_ARCH_FPA, N_("use -mfpu=fpa10")},
23853 {"mfpa11", &legacy_fpu, FPU_ARCH_FPA, N_("use -mfpu=fpa11")},
23854 {"mno-fpu", &legacy_fpu, ARM_ARCH_NONE,
c19d1205 23855 N_("use either -mfpu=softfpa or -mfpu=softvfp")},
7ed4c4c5 23856
e74cfd16 23857 {NULL, NULL, ARM_ARCH_NONE, NULL}
c19d1205 23858};
7ed4c4c5 23859
c19d1205 23860struct arm_cpu_option_table
7ed4c4c5 23861{
c19d1205 23862 char *name;
f3bad469 23863 size_t name_len;
e74cfd16 23864 const arm_feature_set value;
c19d1205
ZW
23865 /* For some CPUs we assume an FPU unless the user explicitly sets
23866 -mfpu=... */
e74cfd16 23867 const arm_feature_set default_fpu;
ee065d83
PB
23868 /* The canonical name of the CPU, or NULL to use NAME converted to upper
23869 case. */
23870 const char *canonical_name;
c19d1205 23871};
7ed4c4c5 23872
c19d1205
ZW
23873/* This list should, at a minimum, contain all the cpu names
23874 recognized by GCC. */
f3bad469 23875#define ARM_CPU_OPT(N, V, DF, CN) { N, sizeof (N) - 1, V, DF, CN }
e74cfd16 23876static const struct arm_cpu_option_table arm_cpus[] =
c19d1205 23877{
f3bad469
MGD
23878 ARM_CPU_OPT ("all", ARM_ANY, FPU_ARCH_FPA, NULL),
23879 ARM_CPU_OPT ("arm1", ARM_ARCH_V1, FPU_ARCH_FPA, NULL),
23880 ARM_CPU_OPT ("arm2", ARM_ARCH_V2, FPU_ARCH_FPA, NULL),
23881 ARM_CPU_OPT ("arm250", ARM_ARCH_V2S, FPU_ARCH_FPA, NULL),
23882 ARM_CPU_OPT ("arm3", ARM_ARCH_V2S, FPU_ARCH_FPA, NULL),
23883 ARM_CPU_OPT ("arm6", ARM_ARCH_V3, FPU_ARCH_FPA, NULL),
23884 ARM_CPU_OPT ("arm60", ARM_ARCH_V3, FPU_ARCH_FPA, NULL),
23885 ARM_CPU_OPT ("arm600", ARM_ARCH_V3, FPU_ARCH_FPA, NULL),
23886 ARM_CPU_OPT ("arm610", ARM_ARCH_V3, FPU_ARCH_FPA, NULL),
23887 ARM_CPU_OPT ("arm620", ARM_ARCH_V3, FPU_ARCH_FPA, NULL),
23888 ARM_CPU_OPT ("arm7", ARM_ARCH_V3, FPU_ARCH_FPA, NULL),
23889 ARM_CPU_OPT ("arm7m", ARM_ARCH_V3M, FPU_ARCH_FPA, NULL),
23890 ARM_CPU_OPT ("arm7d", ARM_ARCH_V3, FPU_ARCH_FPA, NULL),
23891 ARM_CPU_OPT ("arm7dm", ARM_ARCH_V3M, FPU_ARCH_FPA, NULL),
23892 ARM_CPU_OPT ("arm7di", ARM_ARCH_V3, FPU_ARCH_FPA, NULL),
23893 ARM_CPU_OPT ("arm7dmi", ARM_ARCH_V3M, FPU_ARCH_FPA, NULL),
23894 ARM_CPU_OPT ("arm70", ARM_ARCH_V3, FPU_ARCH_FPA, NULL),
23895 ARM_CPU_OPT ("arm700", ARM_ARCH_V3, FPU_ARCH_FPA, NULL),
23896 ARM_CPU_OPT ("arm700i", ARM_ARCH_V3, FPU_ARCH_FPA, NULL),
23897 ARM_CPU_OPT ("arm710", ARM_ARCH_V3, FPU_ARCH_FPA, NULL),
23898 ARM_CPU_OPT ("arm710t", ARM_ARCH_V4T, FPU_ARCH_FPA, NULL),
23899 ARM_CPU_OPT ("arm720", ARM_ARCH_V3, FPU_ARCH_FPA, NULL),
23900 ARM_CPU_OPT ("arm720t", ARM_ARCH_V4T, FPU_ARCH_FPA, NULL),
23901 ARM_CPU_OPT ("arm740t", ARM_ARCH_V4T, FPU_ARCH_FPA, NULL),
23902 ARM_CPU_OPT ("arm710c", ARM_ARCH_V3, FPU_ARCH_FPA, NULL),
23903 ARM_CPU_OPT ("arm7100", ARM_ARCH_V3, FPU_ARCH_FPA, NULL),
23904 ARM_CPU_OPT ("arm7500", ARM_ARCH_V3, FPU_ARCH_FPA, NULL),
23905 ARM_CPU_OPT ("arm7500fe", ARM_ARCH_V3, FPU_ARCH_FPA, NULL),
23906 ARM_CPU_OPT ("arm7t", ARM_ARCH_V4T, FPU_ARCH_FPA, NULL),
23907 ARM_CPU_OPT ("arm7tdmi", ARM_ARCH_V4T, FPU_ARCH_FPA, NULL),
23908 ARM_CPU_OPT ("arm7tdmi-s", ARM_ARCH_V4T, FPU_ARCH_FPA, NULL),
23909 ARM_CPU_OPT ("arm8", ARM_ARCH_V4, FPU_ARCH_FPA, NULL),
23910 ARM_CPU_OPT ("arm810", ARM_ARCH_V4, FPU_ARCH_FPA, NULL),
23911 ARM_CPU_OPT ("strongarm", ARM_ARCH_V4, FPU_ARCH_FPA, NULL),
23912 ARM_CPU_OPT ("strongarm1", ARM_ARCH_V4, FPU_ARCH_FPA, NULL),
23913 ARM_CPU_OPT ("strongarm110", ARM_ARCH_V4, FPU_ARCH_FPA, NULL),
23914 ARM_CPU_OPT ("strongarm1100", ARM_ARCH_V4, FPU_ARCH_FPA, NULL),
23915 ARM_CPU_OPT ("strongarm1110", ARM_ARCH_V4, FPU_ARCH_FPA, NULL),
23916 ARM_CPU_OPT ("arm9", ARM_ARCH_V4T, FPU_ARCH_FPA, NULL),
23917 ARM_CPU_OPT ("arm920", ARM_ARCH_V4T, FPU_ARCH_FPA, "ARM920T"),
23918 ARM_CPU_OPT ("arm920t", ARM_ARCH_V4T, FPU_ARCH_FPA, NULL),
23919 ARM_CPU_OPT ("arm922t", ARM_ARCH_V4T, FPU_ARCH_FPA, NULL),
23920 ARM_CPU_OPT ("arm940t", ARM_ARCH_V4T, FPU_ARCH_FPA, NULL),
23921 ARM_CPU_OPT ("arm9tdmi", ARM_ARCH_V4T, FPU_ARCH_FPA, NULL),
23922 ARM_CPU_OPT ("fa526", ARM_ARCH_V4, FPU_ARCH_FPA, NULL),
23923 ARM_CPU_OPT ("fa626", ARM_ARCH_V4, FPU_ARCH_FPA, NULL),
c19d1205
ZW
23924 /* For V5 or later processors we default to using VFP; but the user
23925 should really set the FPU type explicitly. */
f3bad469
MGD
23926 ARM_CPU_OPT ("arm9e-r0", ARM_ARCH_V5TExP, FPU_ARCH_VFP_V2, NULL),
23927 ARM_CPU_OPT ("arm9e", ARM_ARCH_V5TE, FPU_ARCH_VFP_V2, NULL),
23928 ARM_CPU_OPT ("arm926ej", ARM_ARCH_V5TEJ, FPU_ARCH_VFP_V2, "ARM926EJ-S"),
23929 ARM_CPU_OPT ("arm926ejs", ARM_ARCH_V5TEJ, FPU_ARCH_VFP_V2, "ARM926EJ-S"),
23930 ARM_CPU_OPT ("arm926ej-s", ARM_ARCH_V5TEJ, FPU_ARCH_VFP_V2, NULL),
23931 ARM_CPU_OPT ("arm946e-r0", ARM_ARCH_V5TExP, FPU_ARCH_VFP_V2, NULL),
23932 ARM_CPU_OPT ("arm946e", ARM_ARCH_V5TE, FPU_ARCH_VFP_V2, "ARM946E-S"),
23933 ARM_CPU_OPT ("arm946e-s", ARM_ARCH_V5TE, FPU_ARCH_VFP_V2, NULL),
23934 ARM_CPU_OPT ("arm966e-r0", ARM_ARCH_V5TExP, FPU_ARCH_VFP_V2, NULL),
23935 ARM_CPU_OPT ("arm966e", ARM_ARCH_V5TE, FPU_ARCH_VFP_V2, "ARM966E-S"),
23936 ARM_CPU_OPT ("arm966e-s", ARM_ARCH_V5TE, FPU_ARCH_VFP_V2, NULL),
23937 ARM_CPU_OPT ("arm968e-s", ARM_ARCH_V5TE, FPU_ARCH_VFP_V2, NULL),
23938 ARM_CPU_OPT ("arm10t", ARM_ARCH_V5T, FPU_ARCH_VFP_V1, NULL),
23939 ARM_CPU_OPT ("arm10tdmi", ARM_ARCH_V5T, FPU_ARCH_VFP_V1, NULL),
23940 ARM_CPU_OPT ("arm10e", ARM_ARCH_V5TE, FPU_ARCH_VFP_V2, NULL),
23941 ARM_CPU_OPT ("arm1020", ARM_ARCH_V5TE, FPU_ARCH_VFP_V2, "ARM1020E"),
23942 ARM_CPU_OPT ("arm1020t", ARM_ARCH_V5T, FPU_ARCH_VFP_V1, NULL),
23943 ARM_CPU_OPT ("arm1020e", ARM_ARCH_V5TE, FPU_ARCH_VFP_V2, NULL),
23944 ARM_CPU_OPT ("arm1022e", ARM_ARCH_V5TE, FPU_ARCH_VFP_V2, NULL),
23945 ARM_CPU_OPT ("arm1026ejs", ARM_ARCH_V5TEJ, FPU_ARCH_VFP_V2,
23946 "ARM1026EJ-S"),
23947 ARM_CPU_OPT ("arm1026ej-s", ARM_ARCH_V5TEJ, FPU_ARCH_VFP_V2, NULL),
23948 ARM_CPU_OPT ("fa606te", ARM_ARCH_V5TE, FPU_ARCH_VFP_V2, NULL),
23949 ARM_CPU_OPT ("fa616te", ARM_ARCH_V5TE, FPU_ARCH_VFP_V2, NULL),
23950 ARM_CPU_OPT ("fa626te", ARM_ARCH_V5TE, FPU_ARCH_VFP_V2, NULL),
23951 ARM_CPU_OPT ("fmp626", ARM_ARCH_V5TE, FPU_ARCH_VFP_V2, NULL),
23952 ARM_CPU_OPT ("fa726te", ARM_ARCH_V5TE, FPU_ARCH_VFP_V2, NULL),
23953 ARM_CPU_OPT ("arm1136js", ARM_ARCH_V6, FPU_NONE, "ARM1136J-S"),
23954 ARM_CPU_OPT ("arm1136j-s", ARM_ARCH_V6, FPU_NONE, NULL),
23955 ARM_CPU_OPT ("arm1136jfs", ARM_ARCH_V6, FPU_ARCH_VFP_V2,
23956 "ARM1136JF-S"),
23957 ARM_CPU_OPT ("arm1136jf-s", ARM_ARCH_V6, FPU_ARCH_VFP_V2, NULL),
23958 ARM_CPU_OPT ("mpcore", ARM_ARCH_V6K, FPU_ARCH_VFP_V2, "MPCore"),
23959 ARM_CPU_OPT ("mpcorenovfp", ARM_ARCH_V6K, FPU_NONE, "MPCore"),
23960 ARM_CPU_OPT ("arm1156t2-s", ARM_ARCH_V6T2, FPU_NONE, NULL),
23961 ARM_CPU_OPT ("arm1156t2f-s", ARM_ARCH_V6T2, FPU_ARCH_VFP_V2, NULL),
23962 ARM_CPU_OPT ("arm1176jz-s", ARM_ARCH_V6ZK, FPU_NONE, NULL),
23963 ARM_CPU_OPT ("arm1176jzf-s", ARM_ARCH_V6ZK, FPU_ARCH_VFP_V2, NULL),
23964 ARM_CPU_OPT ("cortex-a5", ARM_ARCH_V7A_MP_SEC,
23965 FPU_NONE, "Cortex-A5"),
23966 ARM_CPU_OPT ("cortex-a7", ARM_ARCH_V7A_IDIV_MP_SEC_VIRT,
23967 FPU_ARCH_NEON_VFP_V4,
23968 "Cortex-A7"),
23969 ARM_CPU_OPT ("cortex-a8", ARM_ARCH_V7A_SEC,
23970 ARM_FEATURE (0, FPU_VFP_V3
477330fc 23971 | FPU_NEON_EXT_V1),
f3bad469
MGD
23972 "Cortex-A8"),
23973 ARM_CPU_OPT ("cortex-a9", ARM_ARCH_V7A_MP_SEC,
23974 ARM_FEATURE (0, FPU_VFP_V3
477330fc 23975 | FPU_NEON_EXT_V1),
f3bad469 23976 "Cortex-A9"),
63a4bc21
KT
23977 ARM_CPU_OPT ("cortex-a12", ARM_ARCH_V7A_IDIV_MP_SEC_VIRT,
23978 FPU_ARCH_NEON_VFP_V4,
23979 "Cortex-A12"),
f3bad469
MGD
23980 ARM_CPU_OPT ("cortex-a15", ARM_ARCH_V7A_IDIV_MP_SEC_VIRT,
23981 FPU_ARCH_NEON_VFP_V4,
23982 "Cortex-A15"),
92eb40d9 23983 ARM_CPU_OPT ("cortex-a53", ARM_ARCH_V8A, FPU_ARCH_CRYPTO_NEON_VFP_ARMV8,
477330fc 23984 "Cortex-A53"),
92eb40d9 23985 ARM_CPU_OPT ("cortex-a57", ARM_ARCH_V8A, FPU_ARCH_CRYPTO_NEON_VFP_ARMV8,
477330fc 23986 "Cortex-A57"),
f3bad469
MGD
23987 ARM_CPU_OPT ("cortex-r4", ARM_ARCH_V7R, FPU_NONE, "Cortex-R4"),
23988 ARM_CPU_OPT ("cortex-r4f", ARM_ARCH_V7R, FPU_ARCH_VFP_V3D16,
23989 "Cortex-R4F"),
23990 ARM_CPU_OPT ("cortex-r5", ARM_ARCH_V7R_IDIV,
23991 FPU_NONE, "Cortex-R5"),
70a8bc5b 23992 ARM_CPU_OPT ("cortex-r7", ARM_ARCH_V7R_IDIV,
23993 FPU_ARCH_VFP_V3D16,
23994 "Cortex-R7"),
f3bad469
MGD
23995 ARM_CPU_OPT ("cortex-m4", ARM_ARCH_V7EM, FPU_NONE, "Cortex-M4"),
23996 ARM_CPU_OPT ("cortex-m3", ARM_ARCH_V7M, FPU_NONE, "Cortex-M3"),
23997 ARM_CPU_OPT ("cortex-m1", ARM_ARCH_V6SM, FPU_NONE, "Cortex-M1"),
23998 ARM_CPU_OPT ("cortex-m0", ARM_ARCH_V6SM, FPU_NONE, "Cortex-M0"),
ce32bd10 23999 ARM_CPU_OPT ("cortex-m0plus", ARM_ARCH_V6SM, FPU_NONE, "Cortex-M0+"),
c19d1205 24000 /* ??? XSCALE is really an architecture. */
f3bad469 24001 ARM_CPU_OPT ("xscale", ARM_ARCH_XSCALE, FPU_ARCH_VFP_V2, NULL),
c19d1205 24002 /* ??? iwmmxt is not a processor. */
f3bad469
MGD
24003 ARM_CPU_OPT ("iwmmxt", ARM_ARCH_IWMMXT, FPU_ARCH_VFP_V2, NULL),
24004 ARM_CPU_OPT ("iwmmxt2", ARM_ARCH_IWMMXT2,FPU_ARCH_VFP_V2, NULL),
24005 ARM_CPU_OPT ("i80200", ARM_ARCH_XSCALE, FPU_ARCH_VFP_V2, NULL),
c19d1205 24006 /* Maverick */
f3bad469 24007 ARM_CPU_OPT ("ep9312", ARM_FEATURE (ARM_AEXT_V4T, ARM_CEXT_MAVERICK),
da4339ed
NC
24008 FPU_ARCH_MAVERICK, "ARM920T"),
24009 /* Marvell processors. */
4a81b02a 24010 ARM_CPU_OPT ("marvell-pj4", ARM_FEATURE (ARM_AEXT_V7A | ARM_EXT_MP | ARM_EXT_SEC, 0),
477330fc 24011 FPU_ARCH_VFP_V3D16, NULL),
da4339ed 24012
f3bad469 24013 { NULL, 0, ARM_ARCH_NONE, ARM_ARCH_NONE, NULL }
c19d1205 24014};
f3bad469 24015#undef ARM_CPU_OPT
7ed4c4c5 24016
c19d1205 24017struct arm_arch_option_table
7ed4c4c5 24018{
c19d1205 24019 char *name;
f3bad469 24020 size_t name_len;
e74cfd16
PB
24021 const arm_feature_set value;
24022 const arm_feature_set default_fpu;
c19d1205 24023};
7ed4c4c5 24024
c19d1205
ZW
24025/* This list should, at a minimum, contain all the architecture names
24026 recognized by GCC. */
f3bad469 24027#define ARM_ARCH_OPT(N, V, DF) { N, sizeof (N) - 1, V, DF }
e74cfd16 24028static const struct arm_arch_option_table arm_archs[] =
c19d1205 24029{
f3bad469
MGD
24030 ARM_ARCH_OPT ("all", ARM_ANY, FPU_ARCH_FPA),
24031 ARM_ARCH_OPT ("armv1", ARM_ARCH_V1, FPU_ARCH_FPA),
24032 ARM_ARCH_OPT ("armv2", ARM_ARCH_V2, FPU_ARCH_FPA),
24033 ARM_ARCH_OPT ("armv2a", ARM_ARCH_V2S, FPU_ARCH_FPA),
24034 ARM_ARCH_OPT ("armv2s", ARM_ARCH_V2S, FPU_ARCH_FPA),
24035 ARM_ARCH_OPT ("armv3", ARM_ARCH_V3, FPU_ARCH_FPA),
24036 ARM_ARCH_OPT ("armv3m", ARM_ARCH_V3M, FPU_ARCH_FPA),
24037 ARM_ARCH_OPT ("armv4", ARM_ARCH_V4, FPU_ARCH_FPA),
24038 ARM_ARCH_OPT ("armv4xm", ARM_ARCH_V4xM, FPU_ARCH_FPA),
24039 ARM_ARCH_OPT ("armv4t", ARM_ARCH_V4T, FPU_ARCH_FPA),
24040 ARM_ARCH_OPT ("armv4txm", ARM_ARCH_V4TxM, FPU_ARCH_FPA),
24041 ARM_ARCH_OPT ("armv5", ARM_ARCH_V5, FPU_ARCH_VFP),
24042 ARM_ARCH_OPT ("armv5t", ARM_ARCH_V5T, FPU_ARCH_VFP),
24043 ARM_ARCH_OPT ("armv5txm", ARM_ARCH_V5TxM, FPU_ARCH_VFP),
24044 ARM_ARCH_OPT ("armv5te", ARM_ARCH_V5TE, FPU_ARCH_VFP),
24045 ARM_ARCH_OPT ("armv5texp", ARM_ARCH_V5TExP, FPU_ARCH_VFP),
24046 ARM_ARCH_OPT ("armv5tej", ARM_ARCH_V5TEJ, FPU_ARCH_VFP),
24047 ARM_ARCH_OPT ("armv6", ARM_ARCH_V6, FPU_ARCH_VFP),
24048 ARM_ARCH_OPT ("armv6j", ARM_ARCH_V6, FPU_ARCH_VFP),
24049 ARM_ARCH_OPT ("armv6k", ARM_ARCH_V6K, FPU_ARCH_VFP),
24050 ARM_ARCH_OPT ("armv6z", ARM_ARCH_V6Z, FPU_ARCH_VFP),
24051 ARM_ARCH_OPT ("armv6zk", ARM_ARCH_V6ZK, FPU_ARCH_VFP),
24052 ARM_ARCH_OPT ("armv6t2", ARM_ARCH_V6T2, FPU_ARCH_VFP),
24053 ARM_ARCH_OPT ("armv6kt2", ARM_ARCH_V6KT2, FPU_ARCH_VFP),
24054 ARM_ARCH_OPT ("armv6zt2", ARM_ARCH_V6ZT2, FPU_ARCH_VFP),
24055 ARM_ARCH_OPT ("armv6zkt2", ARM_ARCH_V6ZKT2, FPU_ARCH_VFP),
24056 ARM_ARCH_OPT ("armv6-m", ARM_ARCH_V6M, FPU_ARCH_VFP),
24057 ARM_ARCH_OPT ("armv6s-m", ARM_ARCH_V6SM, FPU_ARCH_VFP),
24058 ARM_ARCH_OPT ("armv7", ARM_ARCH_V7, FPU_ARCH_VFP),
c450d570
PB
24059 /* The official spelling of the ARMv7 profile variants is the dashed form.
24060 Accept the non-dashed form for compatibility with old toolchains. */
f3bad469
MGD
24061 ARM_ARCH_OPT ("armv7a", ARM_ARCH_V7A, FPU_ARCH_VFP),
24062 ARM_ARCH_OPT ("armv7r", ARM_ARCH_V7R, FPU_ARCH_VFP),
24063 ARM_ARCH_OPT ("armv7m", ARM_ARCH_V7M, FPU_ARCH_VFP),
24064 ARM_ARCH_OPT ("armv7-a", ARM_ARCH_V7A, FPU_ARCH_VFP),
24065 ARM_ARCH_OPT ("armv7-r", ARM_ARCH_V7R, FPU_ARCH_VFP),
24066 ARM_ARCH_OPT ("armv7-m", ARM_ARCH_V7M, FPU_ARCH_VFP),
24067 ARM_ARCH_OPT ("armv7e-m", ARM_ARCH_V7EM, FPU_ARCH_VFP),
bca38921 24068 ARM_ARCH_OPT ("armv8-a", ARM_ARCH_V8A, FPU_ARCH_VFP),
f3bad469
MGD
24069 ARM_ARCH_OPT ("xscale", ARM_ARCH_XSCALE, FPU_ARCH_VFP),
24070 ARM_ARCH_OPT ("iwmmxt", ARM_ARCH_IWMMXT, FPU_ARCH_VFP),
24071 ARM_ARCH_OPT ("iwmmxt2", ARM_ARCH_IWMMXT2,FPU_ARCH_VFP),
24072 { NULL, 0, ARM_ARCH_NONE, ARM_ARCH_NONE }
c19d1205 24073};
f3bad469 24074#undef ARM_ARCH_OPT
7ed4c4c5 24075
69133863
MGD
24076/* ISA extensions in the co-processor and main instruction set space. */
24077struct arm_option_extension_value_table
c19d1205
ZW
24078{
24079 char *name;
f3bad469 24080 size_t name_len;
e74cfd16 24081 const arm_feature_set value;
69133863 24082 const arm_feature_set allowed_archs;
c19d1205 24083};
7ed4c4c5 24084
69133863
MGD
24085/* The following table must be in alphabetical order with a NULL last entry.
24086 */
f3bad469 24087#define ARM_EXT_OPT(N, V, AA) { N, sizeof (N) - 1, V, AA }
69133863 24088static const struct arm_option_extension_value_table arm_extensions[] =
c19d1205 24089{
dd5181d5 24090 ARM_EXT_OPT ("crc", ARCH_CRC_ARMV8, ARM_FEATURE (ARM_EXT_V8, 0)),
bca38921
MGD
24091 ARM_EXT_OPT ("crypto", FPU_ARCH_CRYPTO_NEON_VFP_ARMV8,
24092 ARM_FEATURE (ARM_EXT_V8, 0)),
24093 ARM_EXT_OPT ("fp", FPU_ARCH_VFP_ARMV8,
24094 ARM_FEATURE (ARM_EXT_V8, 0)),
f3bad469
MGD
24095 ARM_EXT_OPT ("idiv", ARM_FEATURE (ARM_EXT_ADIV | ARM_EXT_DIV, 0),
24096 ARM_FEATURE (ARM_EXT_V7A | ARM_EXT_V7R, 0)),
24097 ARM_EXT_OPT ("iwmmxt",ARM_FEATURE (0, ARM_CEXT_IWMMXT), ARM_ANY),
24098 ARM_EXT_OPT ("iwmmxt2",
24099 ARM_FEATURE (0, ARM_CEXT_IWMMXT2), ARM_ANY),
24100 ARM_EXT_OPT ("maverick",
477330fc 24101 ARM_FEATURE (0, ARM_CEXT_MAVERICK), ARM_ANY),
f3bad469
MGD
24102 ARM_EXT_OPT ("mp", ARM_FEATURE (ARM_EXT_MP, 0),
24103 ARM_FEATURE (ARM_EXT_V7A | ARM_EXT_V7R, 0)),
bca38921
MGD
24104 ARM_EXT_OPT ("simd", FPU_ARCH_NEON_VFP_ARMV8,
24105 ARM_FEATURE (ARM_EXT_V8, 0)),
f3bad469
MGD
24106 ARM_EXT_OPT ("os", ARM_FEATURE (ARM_EXT_OS, 0),
24107 ARM_FEATURE (ARM_EXT_V6M, 0)),
24108 ARM_EXT_OPT ("sec", ARM_FEATURE (ARM_EXT_SEC, 0),
24109 ARM_FEATURE (ARM_EXT_V6K | ARM_EXT_V7A, 0)),
24110 ARM_EXT_OPT ("virt", ARM_FEATURE (ARM_EXT_VIRT | ARM_EXT_ADIV
24111 | ARM_EXT_DIV, 0),
24112 ARM_FEATURE (ARM_EXT_V7A, 0)),
24113 ARM_EXT_OPT ("xscale",ARM_FEATURE (0, ARM_CEXT_XSCALE), ARM_ANY),
24114 { NULL, 0, ARM_ARCH_NONE, ARM_ARCH_NONE }
69133863 24115};
f3bad469 24116#undef ARM_EXT_OPT
69133863
MGD
24117
24118/* ISA floating-point and Advanced SIMD extensions. */
24119struct arm_option_fpu_value_table
24120{
24121 char *name;
24122 const arm_feature_set value;
c19d1205 24123};
7ed4c4c5 24124
c19d1205
ZW
24125/* This list should, at a minimum, contain all the fpu names
24126 recognized by GCC. */
69133863 24127static const struct arm_option_fpu_value_table arm_fpus[] =
c19d1205
ZW
24128{
24129 {"softfpa", FPU_NONE},
24130 {"fpe", FPU_ARCH_FPE},
24131 {"fpe2", FPU_ARCH_FPE},
24132 {"fpe3", FPU_ARCH_FPA}, /* Third release supports LFM/SFM. */
24133 {"fpa", FPU_ARCH_FPA},
24134 {"fpa10", FPU_ARCH_FPA},
24135 {"fpa11", FPU_ARCH_FPA},
24136 {"arm7500fe", FPU_ARCH_FPA},
24137 {"softvfp", FPU_ARCH_VFP},
24138 {"softvfp+vfp", FPU_ARCH_VFP_V2},
24139 {"vfp", FPU_ARCH_VFP_V2},
24140 {"vfp9", FPU_ARCH_VFP_V2},
b1cc4aeb 24141 {"vfp3", FPU_ARCH_VFP_V3}, /* For backwards compatbility. */
c19d1205
ZW
24142 {"vfp10", FPU_ARCH_VFP_V2},
24143 {"vfp10-r0", FPU_ARCH_VFP_V1},
24144 {"vfpxd", FPU_ARCH_VFP_V1xD},
b1cc4aeb
PB
24145 {"vfpv2", FPU_ARCH_VFP_V2},
24146 {"vfpv3", FPU_ARCH_VFP_V3},
62f3b8c8 24147 {"vfpv3-fp16", FPU_ARCH_VFP_V3_FP16},
b1cc4aeb 24148 {"vfpv3-d16", FPU_ARCH_VFP_V3D16},
62f3b8c8
PB
24149 {"vfpv3-d16-fp16", FPU_ARCH_VFP_V3D16_FP16},
24150 {"vfpv3xd", FPU_ARCH_VFP_V3xD},
24151 {"vfpv3xd-fp16", FPU_ARCH_VFP_V3xD_FP16},
c19d1205
ZW
24152 {"arm1020t", FPU_ARCH_VFP_V1},
24153 {"arm1020e", FPU_ARCH_VFP_V2},
24154 {"arm1136jfs", FPU_ARCH_VFP_V2},
24155 {"arm1136jf-s", FPU_ARCH_VFP_V2},
24156 {"maverick", FPU_ARCH_MAVERICK},
5287ad62 24157 {"neon", FPU_ARCH_VFP_V3_PLUS_NEON_V1},
8e79c3df 24158 {"neon-fp16", FPU_ARCH_NEON_FP16},
62f3b8c8
PB
24159 {"vfpv4", FPU_ARCH_VFP_V4},
24160 {"vfpv4-d16", FPU_ARCH_VFP_V4D16},
ada65aa3 24161 {"fpv4-sp-d16", FPU_ARCH_VFP_V4_SP_D16},
62f3b8c8 24162 {"neon-vfpv4", FPU_ARCH_NEON_VFP_V4},
bca38921
MGD
24163 {"fp-armv8", FPU_ARCH_VFP_ARMV8},
24164 {"neon-fp-armv8", FPU_ARCH_NEON_VFP_ARMV8},
24165 {"crypto-neon-fp-armv8",
24166 FPU_ARCH_CRYPTO_NEON_VFP_ARMV8},
e74cfd16
PB
24167 {NULL, ARM_ARCH_NONE}
24168};
24169
24170struct arm_option_value_table
24171{
24172 char *name;
24173 long value;
c19d1205 24174};
7ed4c4c5 24175
e74cfd16 24176static const struct arm_option_value_table arm_float_abis[] =
c19d1205
ZW
24177{
24178 {"hard", ARM_FLOAT_ABI_HARD},
24179 {"softfp", ARM_FLOAT_ABI_SOFTFP},
24180 {"soft", ARM_FLOAT_ABI_SOFT},
e74cfd16 24181 {NULL, 0}
c19d1205 24182};
7ed4c4c5 24183
c19d1205 24184#ifdef OBJ_ELF
3a4a14e9 24185/* We only know how to output GNU and ver 4/5 (AAELF) formats. */
e74cfd16 24186static const struct arm_option_value_table arm_eabis[] =
c19d1205
ZW
24187{
24188 {"gnu", EF_ARM_EABI_UNKNOWN},
24189 {"4", EF_ARM_EABI_VER4},
3a4a14e9 24190 {"5", EF_ARM_EABI_VER5},
e74cfd16 24191 {NULL, 0}
c19d1205
ZW
24192};
24193#endif
7ed4c4c5 24194
c19d1205
ZW
24195struct arm_long_option_table
24196{
24197 char * option; /* Substring to match. */
24198 char * help; /* Help information. */
24199 int (* func) (char * subopt); /* Function to decode sub-option. */
24200 char * deprecated; /* If non-null, print this message. */
24201};
7ed4c4c5 24202
c921be7d 24203static bfd_boolean
f3bad469 24204arm_parse_extension (char *str, const arm_feature_set **opt_p)
7ed4c4c5 24205{
21d799b5
NC
24206 arm_feature_set *ext_set = (arm_feature_set *)
24207 xmalloc (sizeof (arm_feature_set));
e74cfd16 24208
69133863 24209 /* We insist on extensions being specified in alphabetical order, and with
fa94de6b
RM
24210 extensions being added before being removed. We achieve this by having
24211 the global ARM_EXTENSIONS table in alphabetical order, and using the
69133863 24212 ADDING_VALUE variable to indicate whether we are adding an extension (1)
fa94de6b 24213 or removing it (0) and only allowing it to change in the order
69133863
MGD
24214 -1 -> 1 -> 0. */
24215 const struct arm_option_extension_value_table * opt = NULL;
24216 int adding_value = -1;
24217
e74cfd16
PB
24218 /* Copy the feature set, so that we can modify it. */
24219 *ext_set = **opt_p;
24220 *opt_p = ext_set;
24221
c19d1205 24222 while (str != NULL && *str != 0)
7ed4c4c5 24223 {
f3bad469
MGD
24224 char *ext;
24225 size_t len;
7ed4c4c5 24226
c19d1205
ZW
24227 if (*str != '+')
24228 {
24229 as_bad (_("invalid architectural extension"));
c921be7d 24230 return FALSE;
c19d1205 24231 }
7ed4c4c5 24232
c19d1205
ZW
24233 str++;
24234 ext = strchr (str, '+');
7ed4c4c5 24235
c19d1205 24236 if (ext != NULL)
f3bad469 24237 len = ext - str;
c19d1205 24238 else
f3bad469 24239 len = strlen (str);
7ed4c4c5 24240
f3bad469 24241 if (len >= 2 && strncmp (str, "no", 2) == 0)
69133863
MGD
24242 {
24243 if (adding_value != 0)
24244 {
24245 adding_value = 0;
24246 opt = arm_extensions;
24247 }
24248
f3bad469 24249 len -= 2;
69133863
MGD
24250 str += 2;
24251 }
f3bad469 24252 else if (len > 0)
69133863
MGD
24253 {
24254 if (adding_value == -1)
24255 {
24256 adding_value = 1;
24257 opt = arm_extensions;
24258 }
24259 else if (adding_value != 1)
24260 {
24261 as_bad (_("must specify extensions to add before specifying "
24262 "those to remove"));
24263 return FALSE;
24264 }
24265 }
24266
f3bad469 24267 if (len == 0)
c19d1205
ZW
24268 {
24269 as_bad (_("missing architectural extension"));
c921be7d 24270 return FALSE;
c19d1205 24271 }
7ed4c4c5 24272
69133863
MGD
24273 gas_assert (adding_value != -1);
24274 gas_assert (opt != NULL);
24275
24276 /* Scan over the options table trying to find an exact match. */
24277 for (; opt->name != NULL; opt++)
f3bad469 24278 if (opt->name_len == len && strncmp (opt->name, str, len) == 0)
c19d1205 24279 {
69133863
MGD
24280 /* Check we can apply the extension to this architecture. */
24281 if (!ARM_CPU_HAS_FEATURE (*ext_set, opt->allowed_archs))
24282 {
24283 as_bad (_("extension does not apply to the base architecture"));
24284 return FALSE;
24285 }
24286
24287 /* Add or remove the extension. */
24288 if (adding_value)
24289 ARM_MERGE_FEATURE_SETS (*ext_set, *ext_set, opt->value);
24290 else
24291 ARM_CLEAR_FEATURE (*ext_set, *ext_set, opt->value);
24292
c19d1205
ZW
24293 break;
24294 }
7ed4c4c5 24295
c19d1205
ZW
24296 if (opt->name == NULL)
24297 {
69133863
MGD
24298 /* Did we fail to find an extension because it wasn't specified in
24299 alphabetical order, or because it does not exist? */
24300
24301 for (opt = arm_extensions; opt->name != NULL; opt++)
f3bad469 24302 if (opt->name_len == len && strncmp (opt->name, str, len) == 0)
69133863
MGD
24303 break;
24304
24305 if (opt->name == NULL)
24306 as_bad (_("unknown architectural extension `%s'"), str);
24307 else
24308 as_bad (_("architectural extensions must be specified in "
24309 "alphabetical order"));
24310
c921be7d 24311 return FALSE;
c19d1205 24312 }
69133863
MGD
24313 else
24314 {
24315 /* We should skip the extension we've just matched the next time
24316 round. */
24317 opt++;
24318 }
7ed4c4c5 24319
c19d1205
ZW
24320 str = ext;
24321 };
7ed4c4c5 24322
c921be7d 24323 return TRUE;
c19d1205 24324}
7ed4c4c5 24325
c921be7d 24326static bfd_boolean
f3bad469 24327arm_parse_cpu (char *str)
7ed4c4c5 24328{
f3bad469
MGD
24329 const struct arm_cpu_option_table *opt;
24330 char *ext = strchr (str, '+');
24331 size_t len;
7ed4c4c5 24332
c19d1205 24333 if (ext != NULL)
f3bad469 24334 len = ext - str;
7ed4c4c5 24335 else
f3bad469 24336 len = strlen (str);
7ed4c4c5 24337
f3bad469 24338 if (len == 0)
7ed4c4c5 24339 {
c19d1205 24340 as_bad (_("missing cpu name `%s'"), str);
c921be7d 24341 return FALSE;
7ed4c4c5
NC
24342 }
24343
c19d1205 24344 for (opt = arm_cpus; opt->name != NULL; opt++)
f3bad469 24345 if (opt->name_len == len && strncmp (opt->name, str, len) == 0)
c19d1205 24346 {
e74cfd16
PB
24347 mcpu_cpu_opt = &opt->value;
24348 mcpu_fpu_opt = &opt->default_fpu;
ee065d83 24349 if (opt->canonical_name)
5f4273c7 24350 strcpy (selected_cpu_name, opt->canonical_name);
ee065d83
PB
24351 else
24352 {
f3bad469 24353 size_t i;
c921be7d 24354
f3bad469 24355 for (i = 0; i < len; i++)
ee065d83
PB
24356 selected_cpu_name[i] = TOUPPER (opt->name[i]);
24357 selected_cpu_name[i] = 0;
24358 }
7ed4c4c5 24359
c19d1205
ZW
24360 if (ext != NULL)
24361 return arm_parse_extension (ext, &mcpu_cpu_opt);
7ed4c4c5 24362
c921be7d 24363 return TRUE;
c19d1205 24364 }
7ed4c4c5 24365
c19d1205 24366 as_bad (_("unknown cpu `%s'"), str);
c921be7d 24367 return FALSE;
7ed4c4c5
NC
24368}
24369
c921be7d 24370static bfd_boolean
f3bad469 24371arm_parse_arch (char *str)
7ed4c4c5 24372{
e74cfd16 24373 const struct arm_arch_option_table *opt;
c19d1205 24374 char *ext = strchr (str, '+');
f3bad469 24375 size_t len;
7ed4c4c5 24376
c19d1205 24377 if (ext != NULL)
f3bad469 24378 len = ext - str;
7ed4c4c5 24379 else
f3bad469 24380 len = strlen (str);
7ed4c4c5 24381
f3bad469 24382 if (len == 0)
7ed4c4c5 24383 {
c19d1205 24384 as_bad (_("missing architecture name `%s'"), str);
c921be7d 24385 return FALSE;
7ed4c4c5
NC
24386 }
24387
c19d1205 24388 for (opt = arm_archs; opt->name != NULL; opt++)
f3bad469 24389 if (opt->name_len == len && strncmp (opt->name, str, len) == 0)
c19d1205 24390 {
e74cfd16
PB
24391 march_cpu_opt = &opt->value;
24392 march_fpu_opt = &opt->default_fpu;
5f4273c7 24393 strcpy (selected_cpu_name, opt->name);
7ed4c4c5 24394
c19d1205
ZW
24395 if (ext != NULL)
24396 return arm_parse_extension (ext, &march_cpu_opt);
7ed4c4c5 24397
c921be7d 24398 return TRUE;
c19d1205
ZW
24399 }
24400
24401 as_bad (_("unknown architecture `%s'\n"), str);
c921be7d 24402 return FALSE;
7ed4c4c5 24403}
eb043451 24404
c921be7d 24405static bfd_boolean
c19d1205
ZW
24406arm_parse_fpu (char * str)
24407{
69133863 24408 const struct arm_option_fpu_value_table * opt;
b99bd4ef 24409
c19d1205
ZW
24410 for (opt = arm_fpus; opt->name != NULL; opt++)
24411 if (streq (opt->name, str))
24412 {
e74cfd16 24413 mfpu_opt = &opt->value;
c921be7d 24414 return TRUE;
c19d1205 24415 }
b99bd4ef 24416
c19d1205 24417 as_bad (_("unknown floating point format `%s'\n"), str);
c921be7d 24418 return FALSE;
c19d1205
ZW
24419}
24420
c921be7d 24421static bfd_boolean
c19d1205 24422arm_parse_float_abi (char * str)
b99bd4ef 24423{
e74cfd16 24424 const struct arm_option_value_table * opt;
b99bd4ef 24425
c19d1205
ZW
24426 for (opt = arm_float_abis; opt->name != NULL; opt++)
24427 if (streq (opt->name, str))
24428 {
24429 mfloat_abi_opt = opt->value;
c921be7d 24430 return TRUE;
c19d1205 24431 }
cc8a6dd0 24432
c19d1205 24433 as_bad (_("unknown floating point abi `%s'\n"), str);
c921be7d 24434 return FALSE;
c19d1205 24435}
b99bd4ef 24436
c19d1205 24437#ifdef OBJ_ELF
c921be7d 24438static bfd_boolean
c19d1205
ZW
24439arm_parse_eabi (char * str)
24440{
e74cfd16 24441 const struct arm_option_value_table *opt;
cc8a6dd0 24442
c19d1205
ZW
24443 for (opt = arm_eabis; opt->name != NULL; opt++)
24444 if (streq (opt->name, str))
24445 {
24446 meabi_flags = opt->value;
c921be7d 24447 return TRUE;
c19d1205
ZW
24448 }
24449 as_bad (_("unknown EABI `%s'\n"), str);
c921be7d 24450 return FALSE;
c19d1205
ZW
24451}
24452#endif
cc8a6dd0 24453
c921be7d 24454static bfd_boolean
e07e6e58
NC
24455arm_parse_it_mode (char * str)
24456{
c921be7d 24457 bfd_boolean ret = TRUE;
e07e6e58
NC
24458
24459 if (streq ("arm", str))
24460 implicit_it_mode = IMPLICIT_IT_MODE_ARM;
24461 else if (streq ("thumb", str))
24462 implicit_it_mode = IMPLICIT_IT_MODE_THUMB;
24463 else if (streq ("always", str))
24464 implicit_it_mode = IMPLICIT_IT_MODE_ALWAYS;
24465 else if (streq ("never", str))
24466 implicit_it_mode = IMPLICIT_IT_MODE_NEVER;
24467 else
24468 {
24469 as_bad (_("unknown implicit IT mode `%s', should be "\
477330fc 24470 "arm, thumb, always, or never."), str);
c921be7d 24471 ret = FALSE;
e07e6e58
NC
24472 }
24473
24474 return ret;
24475}
24476
c19d1205
ZW
24477struct arm_long_option_table arm_long_opts[] =
24478{
24479 {"mcpu=", N_("<cpu name>\t assemble for CPU <cpu name>"),
24480 arm_parse_cpu, NULL},
24481 {"march=", N_("<arch name>\t assemble for architecture <arch name>"),
24482 arm_parse_arch, NULL},
24483 {"mfpu=", N_("<fpu name>\t assemble for FPU architecture <fpu name>"),
24484 arm_parse_fpu, NULL},
24485 {"mfloat-abi=", N_("<abi>\t assemble for floating point ABI <abi>"),
24486 arm_parse_float_abi, NULL},
24487#ifdef OBJ_ELF
7fac0536 24488 {"meabi=", N_("<ver>\t\t assemble for eabi version <ver>"),
c19d1205
ZW
24489 arm_parse_eabi, NULL},
24490#endif
e07e6e58
NC
24491 {"mimplicit-it=", N_("<mode>\t controls implicit insertion of IT instructions"),
24492 arm_parse_it_mode, NULL},
c19d1205
ZW
24493 {NULL, NULL, 0, NULL}
24494};
cc8a6dd0 24495
c19d1205
ZW
24496int
24497md_parse_option (int c, char * arg)
24498{
24499 struct arm_option_table *opt;
e74cfd16 24500 const struct arm_legacy_option_table *fopt;
c19d1205 24501 struct arm_long_option_table *lopt;
b99bd4ef 24502
c19d1205 24503 switch (c)
b99bd4ef 24504 {
c19d1205
ZW
24505#ifdef OPTION_EB
24506 case OPTION_EB:
24507 target_big_endian = 1;
24508 break;
24509#endif
cc8a6dd0 24510
c19d1205
ZW
24511#ifdef OPTION_EL
24512 case OPTION_EL:
24513 target_big_endian = 0;
24514 break;
24515#endif
b99bd4ef 24516
845b51d6
PB
24517 case OPTION_FIX_V4BX:
24518 fix_v4bx = TRUE;
24519 break;
24520
c19d1205
ZW
24521 case 'a':
24522 /* Listing option. Just ignore these, we don't support additional
24523 ones. */
24524 return 0;
b99bd4ef 24525
c19d1205
ZW
24526 default:
24527 for (opt = arm_opts; opt->option != NULL; opt++)
24528 {
24529 if (c == opt->option[0]
24530 && ((arg == NULL && opt->option[1] == 0)
24531 || streq (arg, opt->option + 1)))
24532 {
c19d1205 24533 /* If the option is deprecated, tell the user. */
278df34e 24534 if (warn_on_deprecated && opt->deprecated != NULL)
c19d1205
ZW
24535 as_tsktsk (_("option `-%c%s' is deprecated: %s"), c,
24536 arg ? arg : "", _(opt->deprecated));
b99bd4ef 24537
c19d1205
ZW
24538 if (opt->var != NULL)
24539 *opt->var = opt->value;
cc8a6dd0 24540
c19d1205
ZW
24541 return 1;
24542 }
24543 }
b99bd4ef 24544
e74cfd16
PB
24545 for (fopt = arm_legacy_opts; fopt->option != NULL; fopt++)
24546 {
24547 if (c == fopt->option[0]
24548 && ((arg == NULL && fopt->option[1] == 0)
24549 || streq (arg, fopt->option + 1)))
24550 {
e74cfd16 24551 /* If the option is deprecated, tell the user. */
278df34e 24552 if (warn_on_deprecated && fopt->deprecated != NULL)
e74cfd16
PB
24553 as_tsktsk (_("option `-%c%s' is deprecated: %s"), c,
24554 arg ? arg : "", _(fopt->deprecated));
e74cfd16
PB
24555
24556 if (fopt->var != NULL)
24557 *fopt->var = &fopt->value;
24558
24559 return 1;
24560 }
24561 }
24562
c19d1205
ZW
24563 for (lopt = arm_long_opts; lopt->option != NULL; lopt++)
24564 {
24565 /* These options are expected to have an argument. */
24566 if (c == lopt->option[0]
24567 && arg != NULL
24568 && strncmp (arg, lopt->option + 1,
24569 strlen (lopt->option + 1)) == 0)
24570 {
c19d1205 24571 /* If the option is deprecated, tell the user. */
278df34e 24572 if (warn_on_deprecated && lopt->deprecated != NULL)
c19d1205
ZW
24573 as_tsktsk (_("option `-%c%s' is deprecated: %s"), c, arg,
24574 _(lopt->deprecated));
b99bd4ef 24575
c19d1205
ZW
24576 /* Call the sup-option parser. */
24577 return lopt->func (arg + strlen (lopt->option) - 1);
24578 }
24579 }
a737bd4d 24580
c19d1205
ZW
24581 return 0;
24582 }
a394c00f 24583
c19d1205
ZW
24584 return 1;
24585}
a394c00f 24586
c19d1205
ZW
24587void
24588md_show_usage (FILE * fp)
a394c00f 24589{
c19d1205
ZW
24590 struct arm_option_table *opt;
24591 struct arm_long_option_table *lopt;
a394c00f 24592
c19d1205 24593 fprintf (fp, _(" ARM-specific assembler options:\n"));
a394c00f 24594
c19d1205
ZW
24595 for (opt = arm_opts; opt->option != NULL; opt++)
24596 if (opt->help != NULL)
24597 fprintf (fp, " -%-23s%s\n", opt->option, _(opt->help));
a394c00f 24598
c19d1205
ZW
24599 for (lopt = arm_long_opts; lopt->option != NULL; lopt++)
24600 if (lopt->help != NULL)
24601 fprintf (fp, " -%s%s\n", lopt->option, _(lopt->help));
a394c00f 24602
c19d1205
ZW
24603#ifdef OPTION_EB
24604 fprintf (fp, _("\
24605 -EB assemble code for a big-endian cpu\n"));
a394c00f
NC
24606#endif
24607
c19d1205
ZW
24608#ifdef OPTION_EL
24609 fprintf (fp, _("\
24610 -EL assemble code for a little-endian cpu\n"));
a737bd4d 24611#endif
845b51d6
PB
24612
24613 fprintf (fp, _("\
24614 --fix-v4bx Allow BX in ARMv4 code\n"));
c19d1205 24615}
ee065d83
PB
24616
24617
24618#ifdef OBJ_ELF
62b3e311
PB
24619typedef struct
24620{
24621 int val;
24622 arm_feature_set flags;
24623} cpu_arch_ver_table;
24624
24625/* Mapping from CPU features to EABI CPU arch values. Table must be sorted
24626 least features first. */
24627static const cpu_arch_ver_table cpu_arch_ver[] =
24628{
24629 {1, ARM_ARCH_V4},
24630 {2, ARM_ARCH_V4T},
24631 {3, ARM_ARCH_V5},
ee3c0378 24632 {3, ARM_ARCH_V5T},
62b3e311
PB
24633 {4, ARM_ARCH_V5TE},
24634 {5, ARM_ARCH_V5TEJ},
24635 {6, ARM_ARCH_V6},
7e806470 24636 {9, ARM_ARCH_V6K},
f4c65163 24637 {7, ARM_ARCH_V6Z},
91e22acd 24638 {11, ARM_ARCH_V6M},
b2a5fbdc 24639 {12, ARM_ARCH_V6SM},
7e806470 24640 {8, ARM_ARCH_V6T2},
bca38921 24641 {10, ARM_ARCH_V7A_IDIV_MP_SEC_VIRT},
62b3e311
PB
24642 {10, ARM_ARCH_V7R},
24643 {10, ARM_ARCH_V7M},
bca38921 24644 {14, ARM_ARCH_V8A},
62b3e311
PB
24645 {0, ARM_ARCH_NONE}
24646};
24647
ee3c0378
AS
24648/* Set an attribute if it has not already been set by the user. */
24649static void
24650aeabi_set_attribute_int (int tag, int value)
24651{
24652 if (tag < 1
24653 || tag >= NUM_KNOWN_OBJ_ATTRIBUTES
24654 || !attributes_set_explicitly[tag])
24655 bfd_elf_add_proc_attr_int (stdoutput, tag, value);
24656}
24657
24658static void
24659aeabi_set_attribute_string (int tag, const char *value)
24660{
24661 if (tag < 1
24662 || tag >= NUM_KNOWN_OBJ_ATTRIBUTES
24663 || !attributes_set_explicitly[tag])
24664 bfd_elf_add_proc_attr_string (stdoutput, tag, value);
24665}
24666
ee065d83
PB
24667/* Set the public EABI object attributes. */
24668static void
24669aeabi_set_public_attributes (void)
24670{
24671 int arch;
69239280 24672 char profile;
90ec0d68 24673 int virt_sec = 0;
bca38921 24674 int fp16_optional = 0;
e74cfd16 24675 arm_feature_set flags;
62b3e311
PB
24676 arm_feature_set tmp;
24677 const cpu_arch_ver_table *p;
ee065d83
PB
24678
24679 /* Choose the architecture based on the capabilities of the requested cpu
24680 (if any) and/or the instructions actually used. */
e74cfd16
PB
24681 ARM_MERGE_FEATURE_SETS (flags, arm_arch_used, thumb_arch_used);
24682 ARM_MERGE_FEATURE_SETS (flags, flags, *mfpu_opt);
24683 ARM_MERGE_FEATURE_SETS (flags, flags, selected_cpu);
ddd7f988
RE
24684
24685 if (ARM_CPU_HAS_FEATURE (arm_arch_used, arm_arch_any))
24686 ARM_MERGE_FEATURE_SETS (flags, flags, arm_ext_v1);
24687
24688 if (ARM_CPU_HAS_FEATURE (thumb_arch_used, arm_arch_any))
24689 ARM_MERGE_FEATURE_SETS (flags, flags, arm_ext_v4t);
24690
24691 /* Allow the user to override the reported architecture. */
7a1d4c38
PB
24692 if (object_arch)
24693 {
24694 ARM_CLEAR_FEATURE (flags, flags, arm_arch_any);
24695 ARM_MERGE_FEATURE_SETS (flags, flags, *object_arch);
24696 }
24697
251665fc
MGD
24698 /* We need to make sure that the attributes do not identify us as v6S-M
24699 when the only v6S-M feature in use is the Operating System Extensions. */
24700 if (ARM_CPU_HAS_FEATURE (flags, arm_ext_os))
24701 if (!ARM_CPU_HAS_FEATURE (flags, arm_arch_v6m_only))
477330fc 24702 ARM_CLEAR_FEATURE (flags, flags, arm_ext_os);
251665fc 24703
62b3e311
PB
24704 tmp = flags;
24705 arch = 0;
24706 for (p = cpu_arch_ver; p->val; p++)
24707 {
24708 if (ARM_CPU_HAS_FEATURE (tmp, p->flags))
24709 {
24710 arch = p->val;
24711 ARM_CLEAR_FEATURE (tmp, tmp, p->flags);
24712 }
24713 }
ee065d83 24714
9e3c6df6
PB
24715 /* The table lookup above finds the last architecture to contribute
24716 a new feature. Unfortunately, Tag13 is a subset of the union of
24717 v6T2 and v7-M, so it is never seen as contributing a new feature.
24718 We can not search for the last entry which is entirely used,
24719 because if no CPU is specified we build up only those flags
24720 actually used. Perhaps we should separate out the specified
24721 and implicit cases. Avoid taking this path for -march=all by
24722 checking for contradictory v7-A / v7-M features. */
24723 if (arch == 10
24724 && !ARM_CPU_HAS_FEATURE (flags, arm_ext_v7a)
24725 && ARM_CPU_HAS_FEATURE (flags, arm_ext_v7m)
24726 && ARM_CPU_HAS_FEATURE (flags, arm_ext_v6_dsp))
24727 arch = 13;
24728
ee065d83
PB
24729 /* Tag_CPU_name. */
24730 if (selected_cpu_name[0])
24731 {
91d6fa6a 24732 char *q;
ee065d83 24733
91d6fa6a
NC
24734 q = selected_cpu_name;
24735 if (strncmp (q, "armv", 4) == 0)
ee065d83
PB
24736 {
24737 int i;
5f4273c7 24738
91d6fa6a
NC
24739 q += 4;
24740 for (i = 0; q[i]; i++)
24741 q[i] = TOUPPER (q[i]);
ee065d83 24742 }
91d6fa6a 24743 aeabi_set_attribute_string (Tag_CPU_name, q);
ee065d83 24744 }
62f3b8c8 24745
ee065d83 24746 /* Tag_CPU_arch. */
ee3c0378 24747 aeabi_set_attribute_int (Tag_CPU_arch, arch);
62f3b8c8 24748
62b3e311
PB
24749 /* Tag_CPU_arch_profile. */
24750 if (ARM_CPU_HAS_FEATURE (flags, arm_ext_v7a))
69239280 24751 profile = 'A';
62b3e311 24752 else if (ARM_CPU_HAS_FEATURE (flags, arm_ext_v7r))
69239280 24753 profile = 'R';
7e806470 24754 else if (ARM_CPU_HAS_FEATURE (flags, arm_ext_m))
69239280
MGD
24755 profile = 'M';
24756 else
24757 profile = '\0';
24758
24759 if (profile != '\0')
24760 aeabi_set_attribute_int (Tag_CPU_arch_profile, profile);
62f3b8c8 24761
ee065d83 24762 /* Tag_ARM_ISA_use. */
ee3c0378
AS
24763 if (ARM_CPU_HAS_FEATURE (flags, arm_ext_v1)
24764 || arch == 0)
24765 aeabi_set_attribute_int (Tag_ARM_ISA_use, 1);
62f3b8c8 24766
ee065d83 24767 /* Tag_THUMB_ISA_use. */
ee3c0378
AS
24768 if (ARM_CPU_HAS_FEATURE (flags, arm_ext_v4t)
24769 || arch == 0)
24770 aeabi_set_attribute_int (Tag_THUMB_ISA_use,
24771 ARM_CPU_HAS_FEATURE (flags, arm_arch_t2) ? 2 : 1);
62f3b8c8 24772
ee065d83 24773 /* Tag_VFP_arch. */
bca38921
MGD
24774 if (ARM_CPU_HAS_FEATURE (flags, fpu_vfp_ext_armv8))
24775 aeabi_set_attribute_int (Tag_VFP_arch, 7);
24776 else if (ARM_CPU_HAS_FEATURE (flags, fpu_vfp_ext_fma))
62f3b8c8
PB
24777 aeabi_set_attribute_int (Tag_VFP_arch,
24778 ARM_CPU_HAS_FEATURE (flags, fpu_vfp_ext_d32)
24779 ? 5 : 6);
24780 else if (ARM_CPU_HAS_FEATURE (flags, fpu_vfp_ext_d32))
bca38921
MGD
24781 {
24782 fp16_optional = 1;
24783 aeabi_set_attribute_int (Tag_VFP_arch, 3);
24784 }
ada65aa3 24785 else if (ARM_CPU_HAS_FEATURE (flags, fpu_vfp_ext_v3xd))
bca38921
MGD
24786 {
24787 aeabi_set_attribute_int (Tag_VFP_arch, 4);
24788 fp16_optional = 1;
24789 }
ee3c0378
AS
24790 else if (ARM_CPU_HAS_FEATURE (flags, fpu_vfp_ext_v2))
24791 aeabi_set_attribute_int (Tag_VFP_arch, 2);
24792 else if (ARM_CPU_HAS_FEATURE (flags, fpu_vfp_ext_v1)
477330fc 24793 || ARM_CPU_HAS_FEATURE (flags, fpu_vfp_ext_v1xd))
ee3c0378 24794 aeabi_set_attribute_int (Tag_VFP_arch, 1);
62f3b8c8 24795
4547cb56
NC
24796 /* Tag_ABI_HardFP_use. */
24797 if (ARM_CPU_HAS_FEATURE (flags, fpu_vfp_ext_v1xd)
24798 && !ARM_CPU_HAS_FEATURE (flags, fpu_vfp_ext_v1))
24799 aeabi_set_attribute_int (Tag_ABI_HardFP_use, 1);
24800
ee065d83 24801 /* Tag_WMMX_arch. */
ee3c0378
AS
24802 if (ARM_CPU_HAS_FEATURE (flags, arm_cext_iwmmxt2))
24803 aeabi_set_attribute_int (Tag_WMMX_arch, 2);
24804 else if (ARM_CPU_HAS_FEATURE (flags, arm_cext_iwmmxt))
24805 aeabi_set_attribute_int (Tag_WMMX_arch, 1);
62f3b8c8 24806
ee3c0378 24807 /* Tag_Advanced_SIMD_arch (formerly Tag_NEON_arch). */
bca38921
MGD
24808 if (ARM_CPU_HAS_FEATURE (flags, fpu_neon_ext_armv8))
24809 aeabi_set_attribute_int (Tag_Advanced_SIMD_arch, 3);
24810 else if (ARM_CPU_HAS_FEATURE (flags, fpu_neon_ext_v1))
24811 {
24812 if (ARM_CPU_HAS_FEATURE (flags, fpu_neon_ext_fma))
24813 {
24814 aeabi_set_attribute_int (Tag_Advanced_SIMD_arch, 2);
24815 }
24816 else
24817 {
24818 aeabi_set_attribute_int (Tag_Advanced_SIMD_arch, 1);
24819 fp16_optional = 1;
24820 }
24821 }
fa94de6b 24822
ee3c0378 24823 /* Tag_VFP_HP_extension (formerly Tag_NEON_FP16_arch). */
bca38921 24824 if (ARM_CPU_HAS_FEATURE (flags, fpu_vfp_fp16) && fp16_optional)
ee3c0378 24825 aeabi_set_attribute_int (Tag_VFP_HP_extension, 1);
4547cb56 24826
69239280
MGD
24827 /* Tag_DIV_use.
24828
24829 We set Tag_DIV_use to two when integer divide instructions have been used
24830 in ARM state, or when Thumb integer divide instructions have been used,
24831 but we have no architecture profile set, nor have we any ARM instructions.
24832
bca38921
MGD
24833 For ARMv8 we set the tag to 0 as integer divide is implied by the base
24834 architecture.
24835
69239280 24836 For new architectures we will have to check these tests. */
bca38921
MGD
24837 gas_assert (arch <= TAG_CPU_ARCH_V8);
24838 if (ARM_CPU_HAS_FEATURE (flags, arm_ext_v8))
24839 aeabi_set_attribute_int (Tag_DIV_use, 0);
24840 else if (ARM_CPU_HAS_FEATURE (flags, arm_ext_adiv)
24841 || (profile == '\0'
24842 && ARM_CPU_HAS_FEATURE (flags, arm_ext_div)
24843 && !ARM_CPU_HAS_FEATURE (arm_arch_used, arm_arch_any)))
eea54501 24844 aeabi_set_attribute_int (Tag_DIV_use, 2);
60e5ef9f
MGD
24845
24846 /* Tag_MP_extension_use. */
24847 if (ARM_CPU_HAS_FEATURE (flags, arm_ext_mp))
24848 aeabi_set_attribute_int (Tag_MPextension_use, 1);
f4c65163
MGD
24849
24850 /* Tag Virtualization_use. */
24851 if (ARM_CPU_HAS_FEATURE (flags, arm_ext_sec))
90ec0d68
MGD
24852 virt_sec |= 1;
24853 if (ARM_CPU_HAS_FEATURE (flags, arm_ext_virt))
24854 virt_sec |= 2;
24855 if (virt_sec != 0)
24856 aeabi_set_attribute_int (Tag_Virtualization_use, virt_sec);
ee065d83
PB
24857}
24858
104d59d1 24859/* Add the default contents for the .ARM.attributes section. */
ee065d83
PB
24860void
24861arm_md_end (void)
24862{
ee065d83
PB
24863 if (EF_ARM_EABI_VERSION (meabi_flags) < EF_ARM_EABI_VER4)
24864 return;
24865
24866 aeabi_set_public_attributes ();
ee065d83 24867}
8463be01 24868#endif /* OBJ_ELF */
ee065d83
PB
24869
24870
24871/* Parse a .cpu directive. */
24872
24873static void
24874s_arm_cpu (int ignored ATTRIBUTE_UNUSED)
24875{
e74cfd16 24876 const struct arm_cpu_option_table *opt;
ee065d83
PB
24877 char *name;
24878 char saved_char;
24879
24880 name = input_line_pointer;
5f4273c7 24881 while (*input_line_pointer && !ISSPACE (*input_line_pointer))
ee065d83
PB
24882 input_line_pointer++;
24883 saved_char = *input_line_pointer;
24884 *input_line_pointer = 0;
24885
24886 /* Skip the first "all" entry. */
24887 for (opt = arm_cpus + 1; opt->name != NULL; opt++)
24888 if (streq (opt->name, name))
24889 {
e74cfd16
PB
24890 mcpu_cpu_opt = &opt->value;
24891 selected_cpu = opt->value;
ee065d83 24892 if (opt->canonical_name)
5f4273c7 24893 strcpy (selected_cpu_name, opt->canonical_name);
ee065d83
PB
24894 else
24895 {
24896 int i;
24897 for (i = 0; opt->name[i]; i++)
24898 selected_cpu_name[i] = TOUPPER (opt->name[i]);
f3bad469 24899
ee065d83
PB
24900 selected_cpu_name[i] = 0;
24901 }
e74cfd16 24902 ARM_MERGE_FEATURE_SETS (cpu_variant, *mcpu_cpu_opt, *mfpu_opt);
ee065d83
PB
24903 *input_line_pointer = saved_char;
24904 demand_empty_rest_of_line ();
24905 return;
24906 }
24907 as_bad (_("unknown cpu `%s'"), name);
24908 *input_line_pointer = saved_char;
24909 ignore_rest_of_line ();
24910}
24911
24912
24913/* Parse a .arch directive. */
24914
24915static void
24916s_arm_arch (int ignored ATTRIBUTE_UNUSED)
24917{
e74cfd16 24918 const struct arm_arch_option_table *opt;
ee065d83
PB
24919 char saved_char;
24920 char *name;
24921
24922 name = input_line_pointer;
5f4273c7 24923 while (*input_line_pointer && !ISSPACE (*input_line_pointer))
ee065d83
PB
24924 input_line_pointer++;
24925 saved_char = *input_line_pointer;
24926 *input_line_pointer = 0;
24927
24928 /* Skip the first "all" entry. */
24929 for (opt = arm_archs + 1; opt->name != NULL; opt++)
24930 if (streq (opt->name, name))
24931 {
e74cfd16
PB
24932 mcpu_cpu_opt = &opt->value;
24933 selected_cpu = opt->value;
5f4273c7 24934 strcpy (selected_cpu_name, opt->name);
e74cfd16 24935 ARM_MERGE_FEATURE_SETS (cpu_variant, *mcpu_cpu_opt, *mfpu_opt);
ee065d83
PB
24936 *input_line_pointer = saved_char;
24937 demand_empty_rest_of_line ();
24938 return;
24939 }
24940
24941 as_bad (_("unknown architecture `%s'\n"), name);
24942 *input_line_pointer = saved_char;
24943 ignore_rest_of_line ();
24944}
24945
24946
7a1d4c38
PB
24947/* Parse a .object_arch directive. */
24948
24949static void
24950s_arm_object_arch (int ignored ATTRIBUTE_UNUSED)
24951{
24952 const struct arm_arch_option_table *opt;
24953 char saved_char;
24954 char *name;
24955
24956 name = input_line_pointer;
5f4273c7 24957 while (*input_line_pointer && !ISSPACE (*input_line_pointer))
7a1d4c38
PB
24958 input_line_pointer++;
24959 saved_char = *input_line_pointer;
24960 *input_line_pointer = 0;
24961
24962 /* Skip the first "all" entry. */
24963 for (opt = arm_archs + 1; opt->name != NULL; opt++)
24964 if (streq (opt->name, name))
24965 {
24966 object_arch = &opt->value;
24967 *input_line_pointer = saved_char;
24968 demand_empty_rest_of_line ();
24969 return;
24970 }
24971
24972 as_bad (_("unknown architecture `%s'\n"), name);
24973 *input_line_pointer = saved_char;
24974 ignore_rest_of_line ();
24975}
24976
69133863
MGD
24977/* Parse a .arch_extension directive. */
24978
24979static void
24980s_arm_arch_extension (int ignored ATTRIBUTE_UNUSED)
24981{
24982 const struct arm_option_extension_value_table *opt;
24983 char saved_char;
24984 char *name;
24985 int adding_value = 1;
24986
24987 name = input_line_pointer;
24988 while (*input_line_pointer && !ISSPACE (*input_line_pointer))
24989 input_line_pointer++;
24990 saved_char = *input_line_pointer;
24991 *input_line_pointer = 0;
24992
24993 if (strlen (name) >= 2
24994 && strncmp (name, "no", 2) == 0)
24995 {
24996 adding_value = 0;
24997 name += 2;
24998 }
24999
25000 for (opt = arm_extensions; opt->name != NULL; opt++)
25001 if (streq (opt->name, name))
25002 {
25003 if (!ARM_CPU_HAS_FEATURE (*mcpu_cpu_opt, opt->allowed_archs))
25004 {
25005 as_bad (_("architectural extension `%s' is not allowed for the "
25006 "current base architecture"), name);
25007 break;
25008 }
25009
25010 if (adding_value)
25011 ARM_MERGE_FEATURE_SETS (selected_cpu, selected_cpu, opt->value);
25012 else
25013 ARM_CLEAR_FEATURE (selected_cpu, selected_cpu, opt->value);
25014
25015 mcpu_cpu_opt = &selected_cpu;
25016 ARM_MERGE_FEATURE_SETS (cpu_variant, *mcpu_cpu_opt, *mfpu_opt);
25017 *input_line_pointer = saved_char;
25018 demand_empty_rest_of_line ();
25019 return;
25020 }
25021
25022 if (opt->name == NULL)
25023 as_bad (_("unknown architecture `%s'\n"), name);
25024
25025 *input_line_pointer = saved_char;
25026 ignore_rest_of_line ();
25027}
25028
ee065d83
PB
25029/* Parse a .fpu directive. */
25030
25031static void
25032s_arm_fpu (int ignored ATTRIBUTE_UNUSED)
25033{
69133863 25034 const struct arm_option_fpu_value_table *opt;
ee065d83
PB
25035 char saved_char;
25036 char *name;
25037
25038 name = input_line_pointer;
5f4273c7 25039 while (*input_line_pointer && !ISSPACE (*input_line_pointer))
ee065d83
PB
25040 input_line_pointer++;
25041 saved_char = *input_line_pointer;
25042 *input_line_pointer = 0;
5f4273c7 25043
ee065d83
PB
25044 for (opt = arm_fpus; opt->name != NULL; opt++)
25045 if (streq (opt->name, name))
25046 {
e74cfd16
PB
25047 mfpu_opt = &opt->value;
25048 ARM_MERGE_FEATURE_SETS (cpu_variant, *mcpu_cpu_opt, *mfpu_opt);
ee065d83
PB
25049 *input_line_pointer = saved_char;
25050 demand_empty_rest_of_line ();
25051 return;
25052 }
25053
25054 as_bad (_("unknown floating point format `%s'\n"), name);
25055 *input_line_pointer = saved_char;
25056 ignore_rest_of_line ();
25057}
ee065d83 25058
794ba86a 25059/* Copy symbol information. */
f31fef98 25060
794ba86a
DJ
25061void
25062arm_copy_symbol_attributes (symbolS *dest, symbolS *src)
25063{
25064 ARM_GET_FLAG (dest) = ARM_GET_FLAG (src);
25065}
e04befd0 25066
f31fef98 25067#ifdef OBJ_ELF
e04befd0
AS
25068/* Given a symbolic attribute NAME, return the proper integer value.
25069 Returns -1 if the attribute is not known. */
f31fef98 25070
e04befd0
AS
25071int
25072arm_convert_symbolic_attribute (const char *name)
25073{
f31fef98
NC
25074 static const struct
25075 {
25076 const char * name;
25077 const int tag;
25078 }
25079 attribute_table[] =
25080 {
25081 /* When you modify this table you should
25082 also modify the list in doc/c-arm.texi. */
e04befd0 25083#define T(tag) {#tag, tag}
f31fef98
NC
25084 T (Tag_CPU_raw_name),
25085 T (Tag_CPU_name),
25086 T (Tag_CPU_arch),
25087 T (Tag_CPU_arch_profile),
25088 T (Tag_ARM_ISA_use),
25089 T (Tag_THUMB_ISA_use),
75375b3e 25090 T (Tag_FP_arch),
f31fef98
NC
25091 T (Tag_VFP_arch),
25092 T (Tag_WMMX_arch),
25093 T (Tag_Advanced_SIMD_arch),
25094 T (Tag_PCS_config),
25095 T (Tag_ABI_PCS_R9_use),
25096 T (Tag_ABI_PCS_RW_data),
25097 T (Tag_ABI_PCS_RO_data),
25098 T (Tag_ABI_PCS_GOT_use),
25099 T (Tag_ABI_PCS_wchar_t),
25100 T (Tag_ABI_FP_rounding),
25101 T (Tag_ABI_FP_denormal),
25102 T (Tag_ABI_FP_exceptions),
25103 T (Tag_ABI_FP_user_exceptions),
25104 T (Tag_ABI_FP_number_model),
75375b3e 25105 T (Tag_ABI_align_needed),
f31fef98 25106 T (Tag_ABI_align8_needed),
75375b3e 25107 T (Tag_ABI_align_preserved),
f31fef98
NC
25108 T (Tag_ABI_align8_preserved),
25109 T (Tag_ABI_enum_size),
25110 T (Tag_ABI_HardFP_use),
25111 T (Tag_ABI_VFP_args),
25112 T (Tag_ABI_WMMX_args),
25113 T (Tag_ABI_optimization_goals),
25114 T (Tag_ABI_FP_optimization_goals),
25115 T (Tag_compatibility),
25116 T (Tag_CPU_unaligned_access),
75375b3e 25117 T (Tag_FP_HP_extension),
f31fef98
NC
25118 T (Tag_VFP_HP_extension),
25119 T (Tag_ABI_FP_16bit_format),
cd21e546
MGD
25120 T (Tag_MPextension_use),
25121 T (Tag_DIV_use),
f31fef98
NC
25122 T (Tag_nodefaults),
25123 T (Tag_also_compatible_with),
25124 T (Tag_conformance),
25125 T (Tag_T2EE_use),
25126 T (Tag_Virtualization_use),
cd21e546 25127 /* We deliberately do not include Tag_MPextension_use_legacy. */
e04befd0 25128#undef T
f31fef98 25129 };
e04befd0
AS
25130 unsigned int i;
25131
25132 if (name == NULL)
25133 return -1;
25134
f31fef98 25135 for (i = 0; i < ARRAY_SIZE (attribute_table); i++)
c921be7d 25136 if (streq (name, attribute_table[i].name))
e04befd0
AS
25137 return attribute_table[i].tag;
25138
25139 return -1;
25140}
267bf995
RR
25141
25142
25143/* Apply sym value for relocations only in the case that
25144 they are for local symbols and you have the respective
25145 architectural feature for blx and simple switches. */
25146int
25147arm_apply_sym_value (struct fix * fixP)
25148{
25149 if (fixP->fx_addsy
25150 && ARM_CPU_HAS_FEATURE (selected_cpu, arm_ext_v5t)
34e77a92 25151 && !S_FORCE_RELOC (fixP->fx_addsy, TRUE))
267bf995
RR
25152 {
25153 switch (fixP->fx_r_type)
25154 {
25155 case BFD_RELOC_ARM_PCREL_BLX:
25156 case BFD_RELOC_THUMB_PCREL_BRANCH23:
25157 if (ARM_IS_FUNC (fixP->fx_addsy))
25158 return 1;
25159 break;
25160
25161 case BFD_RELOC_ARM_PCREL_CALL:
25162 case BFD_RELOC_THUMB_PCREL_BLX:
25163 if (THUMB_IS_FUNC (fixP->fx_addsy))
25164 return 1;
25165 break;
25166
25167 default:
25168 break;
25169 }
25170
25171 }
25172 return 0;
25173}
f31fef98 25174#endif /* OBJ_ELF */