2011-06-13 Pedro Alves <pedro@codesourcery.com>
[deliverable/binutils-gdb.git] / gas / config / tc-arm.c
CommitLineData
b99bd4ef 1/* tc-arm.c -- Assemble for the ARM
f17c130b 2 Copyright 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003,
4a58c4bd 3 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011
b99bd4ef
NC
4 Free Software Foundation, Inc.
5 Contributed by Richard Earnshaw (rwe@pegasus.esprit.ec.org)
6 Modified by David Taylor (dtaylor@armltd.co.uk)
22d9c8c5 7 Cirrus coprocessor mods by Aldy Hernandez (aldyh@redhat.com)
34920d91
NC
8 Cirrus coprocessor fixes by Petko Manolov (petkan@nucleusys.com)
9 Cirrus coprocessor fixes by Vladimir Ivanov (vladitx@nucleusys.com)
b99bd4ef
NC
10
11 This file is part of GAS, the GNU Assembler.
12
13 GAS is free software; you can redistribute it and/or modify
14 it under the terms of the GNU General Public License as published by
ec2655a6 15 the Free Software Foundation; either version 3, or (at your option)
b99bd4ef
NC
16 any later version.
17
18 GAS is distributed in the hope that it will be useful,
19 but WITHOUT ANY WARRANTY; without even the implied warranty of
c19d1205 20 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
b99bd4ef
NC
21 GNU General Public License for more details.
22
23 You should have received a copy of the GNU General Public License
24 along with GAS; see the file COPYING. If not, write to the Free
699d2810
NC
25 Software Foundation, 51 Franklin Street - Fifth Floor, Boston, MA
26 02110-1301, USA. */
b99bd4ef 27
42a68e18 28#include "as.h"
5287ad62 29#include <limits.h>
037e8744 30#include <stdarg.h>
c19d1205 31#define NO_RELOC 0
3882b010 32#include "safe-ctype.h"
b99bd4ef
NC
33#include "subsegs.h"
34#include "obstack.h"
b99bd4ef 35
f263249b
RE
36#include "opcode/arm.h"
37
b99bd4ef
NC
38#ifdef OBJ_ELF
39#include "elf/arm.h"
a394c00f 40#include "dw2gencfi.h"
b99bd4ef
NC
41#endif
42
f0927246
NC
43#include "dwarf2dbg.h"
44
7ed4c4c5
NC
45#ifdef OBJ_ELF
46/* Must be at least the size of the largest unwind opcode (currently two). */
47#define ARM_OPCODE_CHUNK_SIZE 8
48
49/* This structure holds the unwinding state. */
50
51static struct
52{
c19d1205
ZW
53 symbolS * proc_start;
54 symbolS * table_entry;
55 symbolS * personality_routine;
56 int personality_index;
7ed4c4c5 57 /* The segment containing the function. */
c19d1205
ZW
58 segT saved_seg;
59 subsegT saved_subseg;
7ed4c4c5
NC
60 /* Opcodes generated from this function. */
61 unsigned char * opcodes;
c19d1205
ZW
62 int opcode_count;
63 int opcode_alloc;
7ed4c4c5 64 /* The number of bytes pushed to the stack. */
c19d1205 65 offsetT frame_size;
7ed4c4c5
NC
66 /* We don't add stack adjustment opcodes immediately so that we can merge
67 multiple adjustments. We can also omit the final adjustment
68 when using a frame pointer. */
c19d1205 69 offsetT pending_offset;
7ed4c4c5 70 /* These two fields are set by both unwind_movsp and unwind_setfp. They
c19d1205
ZW
71 hold the reg+offset to use when restoring sp from a frame pointer. */
72 offsetT fp_offset;
73 int fp_reg;
7ed4c4c5 74 /* Nonzero if an unwind_setfp directive has been seen. */
c19d1205 75 unsigned fp_used:1;
7ed4c4c5 76 /* Nonzero if the last opcode restores sp from fp_reg. */
c19d1205 77 unsigned sp_restored:1;
7ed4c4c5
NC
78} unwind;
79
8b1ad454
NC
80#endif /* OBJ_ELF */
81
4962c51a
MS
82/* Results from operand parsing worker functions. */
83
84typedef enum
85{
86 PARSE_OPERAND_SUCCESS,
87 PARSE_OPERAND_FAIL,
88 PARSE_OPERAND_FAIL_NO_BACKTRACK
89} parse_operand_result;
90
33a392fb
PB
91enum arm_float_abi
92{
93 ARM_FLOAT_ABI_HARD,
94 ARM_FLOAT_ABI_SOFTFP,
95 ARM_FLOAT_ABI_SOFT
96};
97
c19d1205 98/* Types of processor to assemble for. */
b99bd4ef 99#ifndef CPU_DEFAULT
8a59fff3
MGD
100/* The code that was here used to select a default CPU depending on compiler
101 pre-defines which were only present when doing native builds, thus
102 changing gas' default behaviour depending upon the build host.
103
104 If you have a target that requires a default CPU option then the you
105 should define CPU_DEFAULT here. */
b99bd4ef
NC
106#endif
107
108#ifndef FPU_DEFAULT
c820d418
MM
109# ifdef TE_LINUX
110# define FPU_DEFAULT FPU_ARCH_FPA
111# elif defined (TE_NetBSD)
112# ifdef OBJ_ELF
113# define FPU_DEFAULT FPU_ARCH_VFP /* Soft-float, but VFP order. */
114# else
115 /* Legacy a.out format. */
116# define FPU_DEFAULT FPU_ARCH_FPA /* Soft-float, but FPA order. */
117# endif
4e7fd91e
PB
118# elif defined (TE_VXWORKS)
119# define FPU_DEFAULT FPU_ARCH_VFP /* Soft-float, VFP order. */
c820d418
MM
120# else
121 /* For backwards compatibility, default to FPA. */
122# define FPU_DEFAULT FPU_ARCH_FPA
123# endif
124#endif /* ifndef FPU_DEFAULT */
b99bd4ef 125
c19d1205 126#define streq(a, b) (strcmp (a, b) == 0)
b99bd4ef 127
e74cfd16
PB
128static arm_feature_set cpu_variant;
129static arm_feature_set arm_arch_used;
130static arm_feature_set thumb_arch_used;
b99bd4ef 131
b99bd4ef 132/* Flags stored in private area of BFD structure. */
c19d1205
ZW
133static int uses_apcs_26 = FALSE;
134static int atpcs = FALSE;
b34976b6
AM
135static int support_interwork = FALSE;
136static int uses_apcs_float = FALSE;
c19d1205 137static int pic_code = FALSE;
845b51d6 138static int fix_v4bx = FALSE;
278df34e
NS
139/* Warn on using deprecated features. */
140static int warn_on_deprecated = TRUE;
141
03b1477f
RE
142
143/* Variables that we set while parsing command-line options. Once all
144 options have been read we re-process these values to set the real
145 assembly flags. */
e74cfd16
PB
146static const arm_feature_set *legacy_cpu = NULL;
147static const arm_feature_set *legacy_fpu = NULL;
148
149static const arm_feature_set *mcpu_cpu_opt = NULL;
150static const arm_feature_set *mcpu_fpu_opt = NULL;
151static const arm_feature_set *march_cpu_opt = NULL;
152static const arm_feature_set *march_fpu_opt = NULL;
153static const arm_feature_set *mfpu_opt = NULL;
7a1d4c38 154static const arm_feature_set *object_arch = NULL;
e74cfd16
PB
155
156/* Constants for known architecture features. */
157static const arm_feature_set fpu_default = FPU_DEFAULT;
158static const arm_feature_set fpu_arch_vfp_v1 = FPU_ARCH_VFP_V1;
159static const arm_feature_set fpu_arch_vfp_v2 = FPU_ARCH_VFP_V2;
5287ad62
JB
160static const arm_feature_set fpu_arch_vfp_v3 = FPU_ARCH_VFP_V3;
161static const arm_feature_set fpu_arch_neon_v1 = FPU_ARCH_NEON_V1;
e74cfd16
PB
162static const arm_feature_set fpu_arch_fpa = FPU_ARCH_FPA;
163static const arm_feature_set fpu_any_hard = FPU_ANY_HARD;
164static const arm_feature_set fpu_arch_maverick = FPU_ARCH_MAVERICK;
165static const arm_feature_set fpu_endian_pure = FPU_ARCH_ENDIAN_PURE;
166
167#ifdef CPU_DEFAULT
168static const arm_feature_set cpu_default = CPU_DEFAULT;
169#endif
170
171static const arm_feature_set arm_ext_v1 = ARM_FEATURE (ARM_EXT_V1, 0);
172static const arm_feature_set arm_ext_v2 = ARM_FEATURE (ARM_EXT_V1, 0);
173static const arm_feature_set arm_ext_v2s = ARM_FEATURE (ARM_EXT_V2S, 0);
174static const arm_feature_set arm_ext_v3 = ARM_FEATURE (ARM_EXT_V3, 0);
175static const arm_feature_set arm_ext_v3m = ARM_FEATURE (ARM_EXT_V3M, 0);
176static const arm_feature_set arm_ext_v4 = ARM_FEATURE (ARM_EXT_V4, 0);
177static const arm_feature_set arm_ext_v4t = ARM_FEATURE (ARM_EXT_V4T, 0);
178static const arm_feature_set arm_ext_v5 = ARM_FEATURE (ARM_EXT_V5, 0);
179static const arm_feature_set arm_ext_v4t_5 =
180 ARM_FEATURE (ARM_EXT_V4T | ARM_EXT_V5, 0);
181static const arm_feature_set arm_ext_v5t = ARM_FEATURE (ARM_EXT_V5T, 0);
182static const arm_feature_set arm_ext_v5e = ARM_FEATURE (ARM_EXT_V5E, 0);
183static const arm_feature_set arm_ext_v5exp = ARM_FEATURE (ARM_EXT_V5ExP, 0);
184static const arm_feature_set arm_ext_v5j = ARM_FEATURE (ARM_EXT_V5J, 0);
185static const arm_feature_set arm_ext_v6 = ARM_FEATURE (ARM_EXT_V6, 0);
186static const arm_feature_set arm_ext_v6k = ARM_FEATURE (ARM_EXT_V6K, 0);
e74cfd16 187static const arm_feature_set arm_ext_v6t2 = ARM_FEATURE (ARM_EXT_V6T2, 0);
b2a5fbdc 188static const arm_feature_set arm_ext_v6m = ARM_FEATURE (ARM_EXT_V6M, 0);
62b3e311 189static const arm_feature_set arm_ext_v6_notm = ARM_FEATURE (ARM_EXT_V6_NOTM, 0);
9e3c6df6 190static const arm_feature_set arm_ext_v6_dsp = ARM_FEATURE (ARM_EXT_V6_DSP, 0);
7e806470
PB
191static const arm_feature_set arm_ext_barrier = ARM_FEATURE (ARM_EXT_BARRIER, 0);
192static const arm_feature_set arm_ext_msr = ARM_FEATURE (ARM_EXT_THUMB_MSR, 0);
62b3e311
PB
193static const arm_feature_set arm_ext_div = ARM_FEATURE (ARM_EXT_DIV, 0);
194static const arm_feature_set arm_ext_v7 = ARM_FEATURE (ARM_EXT_V7, 0);
195static const arm_feature_set arm_ext_v7a = ARM_FEATURE (ARM_EXT_V7A, 0);
196static const arm_feature_set arm_ext_v7r = ARM_FEATURE (ARM_EXT_V7R, 0);
9e3c6df6 197static const arm_feature_set arm_ext_v7m = ARM_FEATURE (ARM_EXT_V7M, 0);
7e806470 198static const arm_feature_set arm_ext_m =
b2a5fbdc 199 ARM_FEATURE (ARM_EXT_V6M | ARM_EXT_OS | ARM_EXT_V7M, 0);
60e5ef9f 200static const arm_feature_set arm_ext_mp = ARM_FEATURE (ARM_EXT_MP, 0);
f4c65163 201static const arm_feature_set arm_ext_sec = ARM_FEATURE (ARM_EXT_SEC, 0);
b2a5fbdc 202static const arm_feature_set arm_ext_os = ARM_FEATURE (ARM_EXT_OS, 0);
eea54501 203static const arm_feature_set arm_ext_adiv = ARM_FEATURE (ARM_EXT_ADIV, 0);
90ec0d68 204static const arm_feature_set arm_ext_virt = ARM_FEATURE (ARM_EXT_VIRT, 0);
e74cfd16
PB
205
206static const arm_feature_set arm_arch_any = ARM_ANY;
207static const arm_feature_set arm_arch_full = ARM_FEATURE (-1, -1);
208static const arm_feature_set arm_arch_t2 = ARM_ARCH_THUMB2;
209static const arm_feature_set arm_arch_none = ARM_ARCH_NONE;
251665fc 210static const arm_feature_set arm_arch_v6m_only = ARM_ARCH_V6M_ONLY;
e74cfd16 211
2d447fca
JM
212static const arm_feature_set arm_cext_iwmmxt2 =
213 ARM_FEATURE (0, ARM_CEXT_IWMMXT2);
e74cfd16
PB
214static const arm_feature_set arm_cext_iwmmxt =
215 ARM_FEATURE (0, ARM_CEXT_IWMMXT);
216static const arm_feature_set arm_cext_xscale =
217 ARM_FEATURE (0, ARM_CEXT_XSCALE);
218static const arm_feature_set arm_cext_maverick =
219 ARM_FEATURE (0, ARM_CEXT_MAVERICK);
220static const arm_feature_set fpu_fpa_ext_v1 = ARM_FEATURE (0, FPU_FPA_EXT_V1);
221static const arm_feature_set fpu_fpa_ext_v2 = ARM_FEATURE (0, FPU_FPA_EXT_V2);
222static const arm_feature_set fpu_vfp_ext_v1xd =
223 ARM_FEATURE (0, FPU_VFP_EXT_V1xD);
224static const arm_feature_set fpu_vfp_ext_v1 = ARM_FEATURE (0, FPU_VFP_EXT_V1);
225static const arm_feature_set fpu_vfp_ext_v2 = ARM_FEATURE (0, FPU_VFP_EXT_V2);
62f3b8c8 226static const arm_feature_set fpu_vfp_ext_v3xd = ARM_FEATURE (0, FPU_VFP_EXT_V3xD);
5287ad62 227static const arm_feature_set fpu_vfp_ext_v3 = ARM_FEATURE (0, FPU_VFP_EXT_V3);
b1cc4aeb
PB
228static const arm_feature_set fpu_vfp_ext_d32 =
229 ARM_FEATURE (0, FPU_VFP_EXT_D32);
5287ad62
JB
230static const arm_feature_set fpu_neon_ext_v1 = ARM_FEATURE (0, FPU_NEON_EXT_V1);
231static const arm_feature_set fpu_vfp_v3_or_neon_ext =
232 ARM_FEATURE (0, FPU_NEON_EXT_V1 | FPU_VFP_EXT_V3);
62f3b8c8
PB
233static const arm_feature_set fpu_vfp_fp16 = ARM_FEATURE (0, FPU_VFP_EXT_FP16);
234static const arm_feature_set fpu_neon_ext_fma = ARM_FEATURE (0, FPU_NEON_EXT_FMA);
235static const arm_feature_set fpu_vfp_ext_fma = ARM_FEATURE (0, FPU_VFP_EXT_FMA);
e74cfd16 236
33a392fb 237static int mfloat_abi_opt = -1;
e74cfd16
PB
238/* Record user cpu selection for object attributes. */
239static arm_feature_set selected_cpu = ARM_ARCH_NONE;
ee065d83
PB
240/* Must be long enough to hold any of the names in arm_cpus. */
241static char selected_cpu_name[16];
8d67f500
NC
242
243/* Return if no cpu was selected on command-line. */
244static bfd_boolean
245no_cpu_selected (void)
246{
247 return selected_cpu.core == arm_arch_none.core
248 && selected_cpu.coproc == arm_arch_none.coproc;
249}
250
7cc69913 251#ifdef OBJ_ELF
deeaaff8
DJ
252# ifdef EABI_DEFAULT
253static int meabi_flags = EABI_DEFAULT;
254# else
d507cf36 255static int meabi_flags = EF_ARM_EABI_UNKNOWN;
deeaaff8 256# endif
e1da3f5b 257
ee3c0378
AS
258static int attributes_set_explicitly[NUM_KNOWN_OBJ_ATTRIBUTES];
259
e1da3f5b 260bfd_boolean
5f4273c7 261arm_is_eabi (void)
e1da3f5b
PB
262{
263 return (EF_ARM_EABI_VERSION (meabi_flags) >= EF_ARM_EABI_VER4);
264}
7cc69913 265#endif
b99bd4ef 266
b99bd4ef 267#ifdef OBJ_ELF
c19d1205 268/* Pre-defined "_GLOBAL_OFFSET_TABLE_" */
b99bd4ef
NC
269symbolS * GOT_symbol;
270#endif
271
b99bd4ef
NC
272/* 0: assemble for ARM,
273 1: assemble for Thumb,
274 2: assemble for Thumb even though target CPU does not support thumb
275 instructions. */
276static int thumb_mode = 0;
8dc2430f
NC
277/* A value distinct from the possible values for thumb_mode that we
278 can use to record whether thumb_mode has been copied into the
279 tc_frag_data field of a frag. */
280#define MODE_RECORDED (1 << 4)
b99bd4ef 281
e07e6e58
NC
282/* Specifies the intrinsic IT insn behavior mode. */
283enum implicit_it_mode
284{
285 IMPLICIT_IT_MODE_NEVER = 0x00,
286 IMPLICIT_IT_MODE_ARM = 0x01,
287 IMPLICIT_IT_MODE_THUMB = 0x02,
288 IMPLICIT_IT_MODE_ALWAYS = (IMPLICIT_IT_MODE_ARM | IMPLICIT_IT_MODE_THUMB)
289};
290static int implicit_it_mode = IMPLICIT_IT_MODE_ARM;
291
c19d1205
ZW
292/* If unified_syntax is true, we are processing the new unified
293 ARM/Thumb syntax. Important differences from the old ARM mode:
294
295 - Immediate operands do not require a # prefix.
296 - Conditional affixes always appear at the end of the
297 instruction. (For backward compatibility, those instructions
298 that formerly had them in the middle, continue to accept them
299 there.)
300 - The IT instruction may appear, and if it does is validated
301 against subsequent conditional affixes. It does not generate
302 machine code.
303
304 Important differences from the old Thumb mode:
305
306 - Immediate operands do not require a # prefix.
307 - Most of the V6T2 instructions are only available in unified mode.
308 - The .N and .W suffixes are recognized and honored (it is an error
309 if they cannot be honored).
310 - All instructions set the flags if and only if they have an 's' affix.
311 - Conditional affixes may be used. They are validated against
312 preceding IT instructions. Unlike ARM mode, you cannot use a
313 conditional affix except in the scope of an IT instruction. */
314
315static bfd_boolean unified_syntax = FALSE;
b99bd4ef 316
5287ad62
JB
317enum neon_el_type
318{
dcbf9037 319 NT_invtype,
5287ad62
JB
320 NT_untyped,
321 NT_integer,
322 NT_float,
323 NT_poly,
324 NT_signed,
dcbf9037 325 NT_unsigned
5287ad62
JB
326};
327
328struct neon_type_el
329{
330 enum neon_el_type type;
331 unsigned size;
332};
333
334#define NEON_MAX_TYPE_ELS 4
335
336struct neon_type
337{
338 struct neon_type_el el[NEON_MAX_TYPE_ELS];
339 unsigned elems;
340};
341
e07e6e58
NC
342enum it_instruction_type
343{
344 OUTSIDE_IT_INSN,
345 INSIDE_IT_INSN,
346 INSIDE_IT_LAST_INSN,
347 IF_INSIDE_IT_LAST_INSN, /* Either outside or inside;
348 if inside, should be the last one. */
349 NEUTRAL_IT_INSN, /* This could be either inside or outside,
350 i.e. BKPT and NOP. */
351 IT_INSN /* The IT insn has been parsed. */
352};
353
b99bd4ef
NC
354struct arm_it
355{
c19d1205 356 const char * error;
b99bd4ef 357 unsigned long instruction;
c19d1205
ZW
358 int size;
359 int size_req;
360 int cond;
037e8744
JB
361 /* "uncond_value" is set to the value in place of the conditional field in
362 unconditional versions of the instruction, or -1 if nothing is
363 appropriate. */
364 int uncond_value;
5287ad62 365 struct neon_type vectype;
88714cb8
DG
366 /* This does not indicate an actual NEON instruction, only that
367 the mnemonic accepts neon-style type suffixes. */
368 int is_neon;
0110f2b8
PB
369 /* Set to the opcode if the instruction needs relaxation.
370 Zero if the instruction is not relaxed. */
371 unsigned long relax;
b99bd4ef
NC
372 struct
373 {
374 bfd_reloc_code_real_type type;
c19d1205
ZW
375 expressionS exp;
376 int pc_rel;
b99bd4ef 377 } reloc;
b99bd4ef 378
e07e6e58
NC
379 enum it_instruction_type it_insn_type;
380
c19d1205
ZW
381 struct
382 {
383 unsigned reg;
ca3f61f7 384 signed int imm;
dcbf9037 385 struct neon_type_el vectype;
ca3f61f7
NC
386 unsigned present : 1; /* Operand present. */
387 unsigned isreg : 1; /* Operand was a register. */
388 unsigned immisreg : 1; /* .imm field is a second register. */
5287ad62
JB
389 unsigned isscalar : 1; /* Operand is a (Neon) scalar. */
390 unsigned immisalign : 1; /* Immediate is an alignment specifier. */
c96612cc 391 unsigned immisfloat : 1; /* Immediate was parsed as a float. */
5287ad62
JB
392 /* Note: we abuse "regisimm" to mean "is Neon register" in VMOV
393 instructions. This allows us to disambiguate ARM <-> vector insns. */
394 unsigned regisimm : 1; /* 64-bit immediate, reg forms high 32 bits. */
037e8744 395 unsigned isvec : 1; /* Is a single, double or quad VFP/Neon reg. */
5287ad62 396 unsigned isquad : 1; /* Operand is Neon quad-precision register. */
037e8744 397 unsigned issingle : 1; /* Operand is VFP single-precision register. */
ca3f61f7
NC
398 unsigned hasreloc : 1; /* Operand has relocation suffix. */
399 unsigned writeback : 1; /* Operand has trailing ! */
400 unsigned preind : 1; /* Preindexed address. */
401 unsigned postind : 1; /* Postindexed address. */
402 unsigned negative : 1; /* Index register was negated. */
403 unsigned shifted : 1; /* Shift applied to operation. */
404 unsigned shift_kind : 3; /* Shift operation (enum shift_kind). */
c19d1205 405 } operands[6];
b99bd4ef
NC
406};
407
c19d1205 408static struct arm_it inst;
b99bd4ef
NC
409
410#define NUM_FLOAT_VALS 8
411
05d2d07e 412const char * fp_const[] =
b99bd4ef
NC
413{
414 "0.0", "1.0", "2.0", "3.0", "4.0", "5.0", "0.5", "10.0", 0
415};
416
c19d1205 417/* Number of littlenums required to hold an extended precision number. */
b99bd4ef
NC
418#define MAX_LITTLENUMS 6
419
420LITTLENUM_TYPE fp_values[NUM_FLOAT_VALS][MAX_LITTLENUMS];
421
422#define FAIL (-1)
423#define SUCCESS (0)
424
425#define SUFF_S 1
426#define SUFF_D 2
427#define SUFF_E 3
428#define SUFF_P 4
429
c19d1205
ZW
430#define CP_T_X 0x00008000
431#define CP_T_Y 0x00400000
b99bd4ef 432
c19d1205
ZW
433#define CONDS_BIT 0x00100000
434#define LOAD_BIT 0x00100000
b99bd4ef
NC
435
436#define DOUBLE_LOAD_FLAG 0x00000001
437
438struct asm_cond
439{
d3ce72d0 440 const char * template_name;
c921be7d 441 unsigned long value;
b99bd4ef
NC
442};
443
c19d1205 444#define COND_ALWAYS 0xE
b99bd4ef 445
b99bd4ef
NC
446struct asm_psr
447{
d3ce72d0 448 const char * template_name;
c921be7d 449 unsigned long field;
b99bd4ef
NC
450};
451
62b3e311
PB
452struct asm_barrier_opt
453{
d3ce72d0 454 const char * template_name;
c921be7d 455 unsigned long value;
62b3e311
PB
456};
457
2d2255b5 458/* The bit that distinguishes CPSR and SPSR. */
b99bd4ef
NC
459#define SPSR_BIT (1 << 22)
460
c19d1205
ZW
461/* The individual PSR flag bits. */
462#define PSR_c (1 << 16)
463#define PSR_x (1 << 17)
464#define PSR_s (1 << 18)
465#define PSR_f (1 << 19)
b99bd4ef 466
c19d1205 467struct reloc_entry
bfae80f2 468{
c921be7d
NC
469 char * name;
470 bfd_reloc_code_real_type reloc;
bfae80f2
RE
471};
472
5287ad62 473enum vfp_reg_pos
bfae80f2 474{
5287ad62
JB
475 VFP_REG_Sd, VFP_REG_Sm, VFP_REG_Sn,
476 VFP_REG_Dd, VFP_REG_Dm, VFP_REG_Dn
bfae80f2
RE
477};
478
479enum vfp_ldstm_type
480{
481 VFP_LDSTMIA, VFP_LDSTMDB, VFP_LDSTMIAX, VFP_LDSTMDBX
482};
483
dcbf9037
JB
484/* Bits for DEFINED field in neon_typed_alias. */
485#define NTA_HASTYPE 1
486#define NTA_HASINDEX 2
487
488struct neon_typed_alias
489{
c921be7d
NC
490 unsigned char defined;
491 unsigned char index;
492 struct neon_type_el eltype;
dcbf9037
JB
493};
494
c19d1205
ZW
495/* ARM register categories. This includes coprocessor numbers and various
496 architecture extensions' registers. */
497enum arm_reg_type
bfae80f2 498{
c19d1205
ZW
499 REG_TYPE_RN,
500 REG_TYPE_CP,
501 REG_TYPE_CN,
502 REG_TYPE_FN,
503 REG_TYPE_VFS,
504 REG_TYPE_VFD,
5287ad62 505 REG_TYPE_NQ,
037e8744 506 REG_TYPE_VFSD,
5287ad62 507 REG_TYPE_NDQ,
037e8744 508 REG_TYPE_NSDQ,
c19d1205
ZW
509 REG_TYPE_VFC,
510 REG_TYPE_MVF,
511 REG_TYPE_MVD,
512 REG_TYPE_MVFX,
513 REG_TYPE_MVDX,
514 REG_TYPE_MVAX,
515 REG_TYPE_DSPSC,
516 REG_TYPE_MMXWR,
517 REG_TYPE_MMXWC,
518 REG_TYPE_MMXWCG,
519 REG_TYPE_XSCALE,
90ec0d68 520 REG_TYPE_RNB
bfae80f2
RE
521};
522
dcbf9037
JB
523/* Structure for a hash table entry for a register.
524 If TYPE is REG_TYPE_VFD or REG_TYPE_NQ, the NEON field can point to extra
525 information which states whether a vector type or index is specified (for a
526 register alias created with .dn or .qn). Otherwise NEON should be NULL. */
6c43fab6
RE
527struct reg_entry
528{
c921be7d 529 const char * name;
90ec0d68 530 unsigned int number;
c921be7d
NC
531 unsigned char type;
532 unsigned char builtin;
533 struct neon_typed_alias * neon;
6c43fab6
RE
534};
535
c19d1205 536/* Diagnostics used when we don't get a register of the expected type. */
c921be7d 537const char * const reg_expected_msgs[] =
c19d1205
ZW
538{
539 N_("ARM register expected"),
540 N_("bad or missing co-processor number"),
541 N_("co-processor register expected"),
542 N_("FPA register expected"),
543 N_("VFP single precision register expected"),
5287ad62
JB
544 N_("VFP/Neon double precision register expected"),
545 N_("Neon quad precision register expected"),
037e8744 546 N_("VFP single or double precision register expected"),
5287ad62 547 N_("Neon double or quad precision register expected"),
037e8744 548 N_("VFP single, double or Neon quad precision register expected"),
c19d1205
ZW
549 N_("VFP system register expected"),
550 N_("Maverick MVF register expected"),
551 N_("Maverick MVD register expected"),
552 N_("Maverick MVFX register expected"),
553 N_("Maverick MVDX register expected"),
554 N_("Maverick MVAX register expected"),
555 N_("Maverick DSPSC register expected"),
556 N_("iWMMXt data register expected"),
557 N_("iWMMXt control register expected"),
558 N_("iWMMXt scalar register expected"),
559 N_("XScale accumulator register expected"),
6c43fab6
RE
560};
561
c19d1205
ZW
562/* Some well known registers that we refer to directly elsewhere. */
563#define REG_SP 13
564#define REG_LR 14
565#define REG_PC 15
404ff6b5 566
b99bd4ef
NC
567/* ARM instructions take 4bytes in the object file, Thumb instructions
568 take 2: */
c19d1205 569#define INSN_SIZE 4
b99bd4ef
NC
570
571struct asm_opcode
572{
573 /* Basic string to match. */
d3ce72d0 574 const char * template_name;
c19d1205
ZW
575
576 /* Parameters to instruction. */
5be8be5d 577 unsigned int operands[8];
c19d1205
ZW
578
579 /* Conditional tag - see opcode_lookup. */
580 unsigned int tag : 4;
b99bd4ef
NC
581
582 /* Basic instruction code. */
c19d1205 583 unsigned int avalue : 28;
b99bd4ef 584
c19d1205
ZW
585 /* Thumb-format instruction code. */
586 unsigned int tvalue;
b99bd4ef 587
90e4755a 588 /* Which architecture variant provides this instruction. */
c921be7d
NC
589 const arm_feature_set * avariant;
590 const arm_feature_set * tvariant;
c19d1205
ZW
591
592 /* Function to call to encode instruction in ARM format. */
593 void (* aencode) (void);
b99bd4ef 594
c19d1205
ZW
595 /* Function to call to encode instruction in Thumb format. */
596 void (* tencode) (void);
b99bd4ef
NC
597};
598
a737bd4d
NC
599/* Defines for various bits that we will want to toggle. */
600#define INST_IMMEDIATE 0x02000000
601#define OFFSET_REG 0x02000000
c19d1205 602#define HWOFFSET_IMM 0x00400000
a737bd4d
NC
603#define SHIFT_BY_REG 0x00000010
604#define PRE_INDEX 0x01000000
605#define INDEX_UP 0x00800000
606#define WRITE_BACK 0x00200000
607#define LDM_TYPE_2_OR_3 0x00400000
a028a6f5 608#define CPSI_MMOD 0x00020000
90e4755a 609
a737bd4d
NC
610#define LITERAL_MASK 0xf000f000
611#define OPCODE_MASK 0xfe1fffff
612#define V4_STR_BIT 0x00000020
90e4755a 613
efd81785
PB
614#define T2_SUBS_PC_LR 0xf3de8f00
615
a737bd4d 616#define DATA_OP_SHIFT 21
90e4755a 617
ef8d22e6
PB
618#define T2_OPCODE_MASK 0xfe1fffff
619#define T2_DATA_OP_SHIFT 21
620
a737bd4d
NC
621/* Codes to distinguish the arithmetic instructions. */
622#define OPCODE_AND 0
623#define OPCODE_EOR 1
624#define OPCODE_SUB 2
625#define OPCODE_RSB 3
626#define OPCODE_ADD 4
627#define OPCODE_ADC 5
628#define OPCODE_SBC 6
629#define OPCODE_RSC 7
630#define OPCODE_TST 8
631#define OPCODE_TEQ 9
632#define OPCODE_CMP 10
633#define OPCODE_CMN 11
634#define OPCODE_ORR 12
635#define OPCODE_MOV 13
636#define OPCODE_BIC 14
637#define OPCODE_MVN 15
90e4755a 638
ef8d22e6
PB
639#define T2_OPCODE_AND 0
640#define T2_OPCODE_BIC 1
641#define T2_OPCODE_ORR 2
642#define T2_OPCODE_ORN 3
643#define T2_OPCODE_EOR 4
644#define T2_OPCODE_ADD 8
645#define T2_OPCODE_ADC 10
646#define T2_OPCODE_SBC 11
647#define T2_OPCODE_SUB 13
648#define T2_OPCODE_RSB 14
649
a737bd4d
NC
650#define T_OPCODE_MUL 0x4340
651#define T_OPCODE_TST 0x4200
652#define T_OPCODE_CMN 0x42c0
653#define T_OPCODE_NEG 0x4240
654#define T_OPCODE_MVN 0x43c0
90e4755a 655
a737bd4d
NC
656#define T_OPCODE_ADD_R3 0x1800
657#define T_OPCODE_SUB_R3 0x1a00
658#define T_OPCODE_ADD_HI 0x4400
659#define T_OPCODE_ADD_ST 0xb000
660#define T_OPCODE_SUB_ST 0xb080
661#define T_OPCODE_ADD_SP 0xa800
662#define T_OPCODE_ADD_PC 0xa000
663#define T_OPCODE_ADD_I8 0x3000
664#define T_OPCODE_SUB_I8 0x3800
665#define T_OPCODE_ADD_I3 0x1c00
666#define T_OPCODE_SUB_I3 0x1e00
b99bd4ef 667
a737bd4d
NC
668#define T_OPCODE_ASR_R 0x4100
669#define T_OPCODE_LSL_R 0x4080
c19d1205
ZW
670#define T_OPCODE_LSR_R 0x40c0
671#define T_OPCODE_ROR_R 0x41c0
a737bd4d
NC
672#define T_OPCODE_ASR_I 0x1000
673#define T_OPCODE_LSL_I 0x0000
674#define T_OPCODE_LSR_I 0x0800
b99bd4ef 675
a737bd4d
NC
676#define T_OPCODE_MOV_I8 0x2000
677#define T_OPCODE_CMP_I8 0x2800
678#define T_OPCODE_CMP_LR 0x4280
679#define T_OPCODE_MOV_HR 0x4600
680#define T_OPCODE_CMP_HR 0x4500
b99bd4ef 681
a737bd4d
NC
682#define T_OPCODE_LDR_PC 0x4800
683#define T_OPCODE_LDR_SP 0x9800
684#define T_OPCODE_STR_SP 0x9000
685#define T_OPCODE_LDR_IW 0x6800
686#define T_OPCODE_STR_IW 0x6000
687#define T_OPCODE_LDR_IH 0x8800
688#define T_OPCODE_STR_IH 0x8000
689#define T_OPCODE_LDR_IB 0x7800
690#define T_OPCODE_STR_IB 0x7000
691#define T_OPCODE_LDR_RW 0x5800
692#define T_OPCODE_STR_RW 0x5000
693#define T_OPCODE_LDR_RH 0x5a00
694#define T_OPCODE_STR_RH 0x5200
695#define T_OPCODE_LDR_RB 0x5c00
696#define T_OPCODE_STR_RB 0x5400
c9b604bd 697
a737bd4d
NC
698#define T_OPCODE_PUSH 0xb400
699#define T_OPCODE_POP 0xbc00
b99bd4ef 700
2fc8bdac 701#define T_OPCODE_BRANCH 0xe000
b99bd4ef 702
a737bd4d 703#define THUMB_SIZE 2 /* Size of thumb instruction. */
a737bd4d 704#define THUMB_PP_PC_LR 0x0100
c19d1205 705#define THUMB_LOAD_BIT 0x0800
53365c0d 706#define THUMB2_LOAD_BIT 0x00100000
c19d1205
ZW
707
708#define BAD_ARGS _("bad arguments to instruction")
fdfde340 709#define BAD_SP _("r13 not allowed here")
c19d1205
ZW
710#define BAD_PC _("r15 not allowed here")
711#define BAD_COND _("instruction cannot be conditional")
712#define BAD_OVERLAP _("registers may not be the same")
713#define BAD_HIREG _("lo register required")
714#define BAD_THUMB32 _("instruction not supported in Thumb16 mode")
01cfc07f 715#define BAD_ADDR_MODE _("instruction does not accept this addressing mode");
dfa9f0d5
PB
716#define BAD_BRANCH _("branch must be last instruction in IT block")
717#define BAD_NOT_IT _("instruction not allowed in IT block")
037e8744 718#define BAD_FPU _("selected FPU does not support instruction")
e07e6e58
NC
719#define BAD_OUT_IT _("thumb conditional instruction should be in IT block")
720#define BAD_IT_COND _("incorrect condition in IT block")
721#define BAD_IT_IT _("IT falling in the range of a previous IT block")
921e5f0a 722#define MISSING_FNSTART _("missing .fnstart before unwinding directive")
5be8be5d
DG
723#define BAD_PC_ADDRESSING \
724 _("cannot use register index with PC-relative addressing")
725#define BAD_PC_WRITEBACK \
726 _("cannot use writeback with PC-relative addressing")
c19d1205 727
c921be7d
NC
728static struct hash_control * arm_ops_hsh;
729static struct hash_control * arm_cond_hsh;
730static struct hash_control * arm_shift_hsh;
731static struct hash_control * arm_psr_hsh;
732static struct hash_control * arm_v7m_psr_hsh;
733static struct hash_control * arm_reg_hsh;
734static struct hash_control * arm_reloc_hsh;
735static struct hash_control * arm_barrier_opt_hsh;
b99bd4ef 736
b99bd4ef
NC
737/* Stuff needed to resolve the label ambiguity
738 As:
739 ...
740 label: <insn>
741 may differ from:
742 ...
743 label:
5f4273c7 744 <insn> */
b99bd4ef
NC
745
746symbolS * last_label_seen;
b34976b6 747static int label_is_thumb_function_name = FALSE;
e07e6e58 748
3d0c9500
NC
749/* Literal pool structure. Held on a per-section
750 and per-sub-section basis. */
a737bd4d 751
c19d1205 752#define MAX_LITERAL_POOL_SIZE 1024
3d0c9500 753typedef struct literal_pool
b99bd4ef 754{
c921be7d
NC
755 expressionS literals [MAX_LITERAL_POOL_SIZE];
756 unsigned int next_free_entry;
757 unsigned int id;
758 symbolS * symbol;
759 segT section;
760 subsegT sub_section;
761 struct literal_pool * next;
3d0c9500 762} literal_pool;
b99bd4ef 763
3d0c9500
NC
764/* Pointer to a linked list of literal pools. */
765literal_pool * list_of_pools = NULL;
e27ec89e 766
e07e6e58
NC
767#ifdef OBJ_ELF
768# define now_it seg_info (now_seg)->tc_segment_info_data.current_it
769#else
770static struct current_it now_it;
771#endif
772
773static inline int
774now_it_compatible (int cond)
775{
776 return (cond & ~1) == (now_it.cc & ~1);
777}
778
779static inline int
780conditional_insn (void)
781{
782 return inst.cond != COND_ALWAYS;
783}
784
785static int in_it_block (void);
786
787static int handle_it_state (void);
788
789static void force_automatic_it_block_close (void);
790
c921be7d
NC
791static void it_fsm_post_encode (void);
792
e07e6e58
NC
793#define set_it_insn_type(type) \
794 do \
795 { \
796 inst.it_insn_type = type; \
797 if (handle_it_state () == FAIL) \
798 return; \
799 } \
800 while (0)
801
c921be7d
NC
802#define set_it_insn_type_nonvoid(type, failret) \
803 do \
804 { \
805 inst.it_insn_type = type; \
806 if (handle_it_state () == FAIL) \
807 return failret; \
808 } \
809 while(0)
810
e07e6e58
NC
811#define set_it_insn_type_last() \
812 do \
813 { \
814 if (inst.cond == COND_ALWAYS) \
815 set_it_insn_type (IF_INSIDE_IT_LAST_INSN); \
816 else \
817 set_it_insn_type (INSIDE_IT_LAST_INSN); \
818 } \
819 while (0)
820
c19d1205 821/* Pure syntax. */
b99bd4ef 822
c19d1205
ZW
823/* This array holds the chars that always start a comment. If the
824 pre-processor is disabled, these aren't very useful. */
825const char comment_chars[] = "@";
3d0c9500 826
c19d1205
ZW
827/* This array holds the chars that only start a comment at the beginning of
828 a line. If the line seems to have the form '# 123 filename'
829 .line and .file directives will appear in the pre-processed output. */
830/* Note that input_file.c hand checks for '#' at the beginning of the
831 first line of the input file. This is because the compiler outputs
832 #NO_APP at the beginning of its output. */
833/* Also note that comments like this one will always work. */
834const char line_comment_chars[] = "#";
3d0c9500 835
c19d1205 836const char line_separator_chars[] = ";";
b99bd4ef 837
c19d1205
ZW
838/* Chars that can be used to separate mant
839 from exp in floating point numbers. */
840const char EXP_CHARS[] = "eE";
3d0c9500 841
c19d1205
ZW
842/* Chars that mean this number is a floating point constant. */
843/* As in 0f12.456 */
844/* or 0d1.2345e12 */
b99bd4ef 845
c19d1205 846const char FLT_CHARS[] = "rRsSfFdDxXeEpP";
3d0c9500 847
c19d1205
ZW
848/* Prefix characters that indicate the start of an immediate
849 value. */
850#define is_immediate_prefix(C) ((C) == '#' || (C) == '$')
3d0c9500 851
c19d1205
ZW
852/* Separator character handling. */
853
854#define skip_whitespace(str) do { if (*(str) == ' ') ++(str); } while (0)
855
856static inline int
857skip_past_char (char ** str, char c)
858{
859 if (**str == c)
860 {
861 (*str)++;
862 return SUCCESS;
3d0c9500 863 }
c19d1205
ZW
864 else
865 return FAIL;
866}
c921be7d 867
c19d1205 868#define skip_past_comma(str) skip_past_char (str, ',')
3d0c9500 869
c19d1205
ZW
870/* Arithmetic expressions (possibly involving symbols). */
871
872/* Return TRUE if anything in the expression is a bignum. */
873
874static int
875walk_no_bignums (symbolS * sp)
876{
877 if (symbol_get_value_expression (sp)->X_op == O_big)
878 return 1;
879
880 if (symbol_get_value_expression (sp)->X_add_symbol)
3d0c9500 881 {
c19d1205
ZW
882 return (walk_no_bignums (symbol_get_value_expression (sp)->X_add_symbol)
883 || (symbol_get_value_expression (sp)->X_op_symbol
884 && walk_no_bignums (symbol_get_value_expression (sp)->X_op_symbol)));
3d0c9500
NC
885 }
886
c19d1205 887 return 0;
3d0c9500
NC
888}
889
c19d1205
ZW
890static int in_my_get_expression = 0;
891
892/* Third argument to my_get_expression. */
893#define GE_NO_PREFIX 0
894#define GE_IMM_PREFIX 1
895#define GE_OPT_PREFIX 2
5287ad62
JB
896/* This is a bit of a hack. Use an optional prefix, and also allow big (64-bit)
897 immediates, as can be used in Neon VMVN and VMOV immediate instructions. */
898#define GE_OPT_PREFIX_BIG 3
a737bd4d 899
b99bd4ef 900static int
c19d1205 901my_get_expression (expressionS * ep, char ** str, int prefix_mode)
b99bd4ef 902{
c19d1205
ZW
903 char * save_in;
904 segT seg;
b99bd4ef 905
c19d1205
ZW
906 /* In unified syntax, all prefixes are optional. */
907 if (unified_syntax)
5287ad62
JB
908 prefix_mode = (prefix_mode == GE_OPT_PREFIX_BIG) ? prefix_mode
909 : GE_OPT_PREFIX;
b99bd4ef 910
c19d1205 911 switch (prefix_mode)
b99bd4ef 912 {
c19d1205
ZW
913 case GE_NO_PREFIX: break;
914 case GE_IMM_PREFIX:
915 if (!is_immediate_prefix (**str))
916 {
917 inst.error = _("immediate expression requires a # prefix");
918 return FAIL;
919 }
920 (*str)++;
921 break;
922 case GE_OPT_PREFIX:
5287ad62 923 case GE_OPT_PREFIX_BIG:
c19d1205
ZW
924 if (is_immediate_prefix (**str))
925 (*str)++;
926 break;
927 default: abort ();
928 }
b99bd4ef 929
c19d1205 930 memset (ep, 0, sizeof (expressionS));
b99bd4ef 931
c19d1205
ZW
932 save_in = input_line_pointer;
933 input_line_pointer = *str;
934 in_my_get_expression = 1;
935 seg = expression (ep);
936 in_my_get_expression = 0;
937
f86adc07 938 if (ep->X_op == O_illegal || ep->X_op == O_absent)
b99bd4ef 939 {
f86adc07 940 /* We found a bad or missing expression in md_operand(). */
c19d1205
ZW
941 *str = input_line_pointer;
942 input_line_pointer = save_in;
943 if (inst.error == NULL)
f86adc07
NS
944 inst.error = (ep->X_op == O_absent
945 ? _("missing expression") :_("bad expression"));
c19d1205
ZW
946 return 1;
947 }
b99bd4ef 948
c19d1205
ZW
949#ifdef OBJ_AOUT
950 if (seg != absolute_section
951 && seg != text_section
952 && seg != data_section
953 && seg != bss_section
954 && seg != undefined_section)
955 {
956 inst.error = _("bad segment");
957 *str = input_line_pointer;
958 input_line_pointer = save_in;
959 return 1;
b99bd4ef 960 }
87975d2a
AM
961#else
962 (void) seg;
c19d1205 963#endif
b99bd4ef 964
c19d1205
ZW
965 /* Get rid of any bignums now, so that we don't generate an error for which
966 we can't establish a line number later on. Big numbers are never valid
967 in instructions, which is where this routine is always called. */
5287ad62
JB
968 if (prefix_mode != GE_OPT_PREFIX_BIG
969 && (ep->X_op == O_big
970 || (ep->X_add_symbol
971 && (walk_no_bignums (ep->X_add_symbol)
972 || (ep->X_op_symbol
973 && walk_no_bignums (ep->X_op_symbol))))))
c19d1205
ZW
974 {
975 inst.error = _("invalid constant");
976 *str = input_line_pointer;
977 input_line_pointer = save_in;
978 return 1;
979 }
b99bd4ef 980
c19d1205
ZW
981 *str = input_line_pointer;
982 input_line_pointer = save_in;
983 return 0;
b99bd4ef
NC
984}
985
c19d1205
ZW
986/* Turn a string in input_line_pointer into a floating point constant
987 of type TYPE, and store the appropriate bytes in *LITP. The number
988 of LITTLENUMS emitted is stored in *SIZEP. An error message is
989 returned, or NULL on OK.
b99bd4ef 990
c19d1205
ZW
991 Note that fp constants aren't represent in the normal way on the ARM.
992 In big endian mode, things are as expected. However, in little endian
993 mode fp constants are big-endian word-wise, and little-endian byte-wise
994 within the words. For example, (double) 1.1 in big endian mode is
995 the byte sequence 3f f1 99 99 99 99 99 9a, and in little endian mode is
996 the byte sequence 99 99 f1 3f 9a 99 99 99.
b99bd4ef 997
c19d1205 998 ??? The format of 12 byte floats is uncertain according to gcc's arm.h. */
b99bd4ef 999
c19d1205
ZW
1000char *
1001md_atof (int type, char * litP, int * sizeP)
1002{
1003 int prec;
1004 LITTLENUM_TYPE words[MAX_LITTLENUMS];
1005 char *t;
1006 int i;
b99bd4ef 1007
c19d1205
ZW
1008 switch (type)
1009 {
1010 case 'f':
1011 case 'F':
1012 case 's':
1013 case 'S':
1014 prec = 2;
1015 break;
b99bd4ef 1016
c19d1205
ZW
1017 case 'd':
1018 case 'D':
1019 case 'r':
1020 case 'R':
1021 prec = 4;
1022 break;
b99bd4ef 1023
c19d1205
ZW
1024 case 'x':
1025 case 'X':
499ac353 1026 prec = 5;
c19d1205 1027 break;
b99bd4ef 1028
c19d1205
ZW
1029 case 'p':
1030 case 'P':
499ac353 1031 prec = 5;
c19d1205 1032 break;
a737bd4d 1033
c19d1205
ZW
1034 default:
1035 *sizeP = 0;
499ac353 1036 return _("Unrecognized or unsupported floating point constant");
c19d1205 1037 }
b99bd4ef 1038
c19d1205
ZW
1039 t = atof_ieee (input_line_pointer, type, words);
1040 if (t)
1041 input_line_pointer = t;
499ac353 1042 *sizeP = prec * sizeof (LITTLENUM_TYPE);
b99bd4ef 1043
c19d1205
ZW
1044 if (target_big_endian)
1045 {
1046 for (i = 0; i < prec; i++)
1047 {
499ac353
NC
1048 md_number_to_chars (litP, (valueT) words[i], sizeof (LITTLENUM_TYPE));
1049 litP += sizeof (LITTLENUM_TYPE);
c19d1205
ZW
1050 }
1051 }
1052 else
1053 {
e74cfd16 1054 if (ARM_CPU_HAS_FEATURE (cpu_variant, fpu_endian_pure))
c19d1205
ZW
1055 for (i = prec - 1; i >= 0; i--)
1056 {
499ac353
NC
1057 md_number_to_chars (litP, (valueT) words[i], sizeof (LITTLENUM_TYPE));
1058 litP += sizeof (LITTLENUM_TYPE);
c19d1205
ZW
1059 }
1060 else
1061 /* For a 4 byte float the order of elements in `words' is 1 0.
1062 For an 8 byte float the order is 1 0 3 2. */
1063 for (i = 0; i < prec; i += 2)
1064 {
499ac353
NC
1065 md_number_to_chars (litP, (valueT) words[i + 1],
1066 sizeof (LITTLENUM_TYPE));
1067 md_number_to_chars (litP + sizeof (LITTLENUM_TYPE),
1068 (valueT) words[i], sizeof (LITTLENUM_TYPE));
1069 litP += 2 * sizeof (LITTLENUM_TYPE);
c19d1205
ZW
1070 }
1071 }
b99bd4ef 1072
499ac353 1073 return NULL;
c19d1205 1074}
b99bd4ef 1075
c19d1205
ZW
1076/* We handle all bad expressions here, so that we can report the faulty
1077 instruction in the error message. */
1078void
91d6fa6a 1079md_operand (expressionS * exp)
c19d1205
ZW
1080{
1081 if (in_my_get_expression)
91d6fa6a 1082 exp->X_op = O_illegal;
b99bd4ef
NC
1083}
1084
c19d1205 1085/* Immediate values. */
b99bd4ef 1086
c19d1205
ZW
1087/* Generic immediate-value read function for use in directives.
1088 Accepts anything that 'expression' can fold to a constant.
1089 *val receives the number. */
1090#ifdef OBJ_ELF
1091static int
1092immediate_for_directive (int *val)
b99bd4ef 1093{
c19d1205
ZW
1094 expressionS exp;
1095 exp.X_op = O_illegal;
b99bd4ef 1096
c19d1205
ZW
1097 if (is_immediate_prefix (*input_line_pointer))
1098 {
1099 input_line_pointer++;
1100 expression (&exp);
1101 }
b99bd4ef 1102
c19d1205
ZW
1103 if (exp.X_op != O_constant)
1104 {
1105 as_bad (_("expected #constant"));
1106 ignore_rest_of_line ();
1107 return FAIL;
1108 }
1109 *val = exp.X_add_number;
1110 return SUCCESS;
b99bd4ef 1111}
c19d1205 1112#endif
b99bd4ef 1113
c19d1205 1114/* Register parsing. */
b99bd4ef 1115
c19d1205
ZW
1116/* Generic register parser. CCP points to what should be the
1117 beginning of a register name. If it is indeed a valid register
1118 name, advance CCP over it and return the reg_entry structure;
1119 otherwise return NULL. Does not issue diagnostics. */
1120
1121static struct reg_entry *
1122arm_reg_parse_multi (char **ccp)
b99bd4ef 1123{
c19d1205
ZW
1124 char *start = *ccp;
1125 char *p;
1126 struct reg_entry *reg;
b99bd4ef 1127
c19d1205
ZW
1128#ifdef REGISTER_PREFIX
1129 if (*start != REGISTER_PREFIX)
01cfc07f 1130 return NULL;
c19d1205
ZW
1131 start++;
1132#endif
1133#ifdef OPTIONAL_REGISTER_PREFIX
1134 if (*start == OPTIONAL_REGISTER_PREFIX)
1135 start++;
1136#endif
b99bd4ef 1137
c19d1205
ZW
1138 p = start;
1139 if (!ISALPHA (*p) || !is_name_beginner (*p))
1140 return NULL;
b99bd4ef 1141
c19d1205
ZW
1142 do
1143 p++;
1144 while (ISALPHA (*p) || ISDIGIT (*p) || *p == '_');
1145
1146 reg = (struct reg_entry *) hash_find_n (arm_reg_hsh, start, p - start);
1147
1148 if (!reg)
1149 return NULL;
1150
1151 *ccp = p;
1152 return reg;
b99bd4ef
NC
1153}
1154
1155static int
dcbf9037
JB
1156arm_reg_alt_syntax (char **ccp, char *start, struct reg_entry *reg,
1157 enum arm_reg_type type)
b99bd4ef 1158{
c19d1205
ZW
1159 /* Alternative syntaxes are accepted for a few register classes. */
1160 switch (type)
1161 {
1162 case REG_TYPE_MVF:
1163 case REG_TYPE_MVD:
1164 case REG_TYPE_MVFX:
1165 case REG_TYPE_MVDX:
1166 /* Generic coprocessor register names are allowed for these. */
79134647 1167 if (reg && reg->type == REG_TYPE_CN)
c19d1205
ZW
1168 return reg->number;
1169 break;
69b97547 1170
c19d1205
ZW
1171 case REG_TYPE_CP:
1172 /* For backward compatibility, a bare number is valid here. */
1173 {
1174 unsigned long processor = strtoul (start, ccp, 10);
1175 if (*ccp != start && processor <= 15)
1176 return processor;
1177 }
6057a28f 1178
c19d1205
ZW
1179 case REG_TYPE_MMXWC:
1180 /* WC includes WCG. ??? I'm not sure this is true for all
1181 instructions that take WC registers. */
79134647 1182 if (reg && reg->type == REG_TYPE_MMXWCG)
c19d1205 1183 return reg->number;
6057a28f 1184 break;
c19d1205 1185
6057a28f 1186 default:
c19d1205 1187 break;
6057a28f
NC
1188 }
1189
dcbf9037
JB
1190 return FAIL;
1191}
1192
1193/* As arm_reg_parse_multi, but the register must be of type TYPE, and the
1194 return value is the register number or FAIL. */
1195
1196static int
1197arm_reg_parse (char **ccp, enum arm_reg_type type)
1198{
1199 char *start = *ccp;
1200 struct reg_entry *reg = arm_reg_parse_multi (ccp);
1201 int ret;
1202
1203 /* Do not allow a scalar (reg+index) to parse as a register. */
1204 if (reg && reg->neon && (reg->neon->defined & NTA_HASINDEX))
1205 return FAIL;
1206
1207 if (reg && reg->type == type)
1208 return reg->number;
1209
1210 if ((ret = arm_reg_alt_syntax (ccp, start, reg, type)) != FAIL)
1211 return ret;
1212
c19d1205
ZW
1213 *ccp = start;
1214 return FAIL;
1215}
69b97547 1216
dcbf9037
JB
1217/* Parse a Neon type specifier. *STR should point at the leading '.'
1218 character. Does no verification at this stage that the type fits the opcode
1219 properly. E.g.,
1220
1221 .i32.i32.s16
1222 .s32.f32
1223 .u16
1224
1225 Can all be legally parsed by this function.
1226
1227 Fills in neon_type struct pointer with parsed information, and updates STR
1228 to point after the parsed type specifier. Returns SUCCESS if this was a legal
1229 type, FAIL if not. */
1230
1231static int
1232parse_neon_type (struct neon_type *type, char **str)
1233{
1234 char *ptr = *str;
1235
1236 if (type)
1237 type->elems = 0;
1238
1239 while (type->elems < NEON_MAX_TYPE_ELS)
1240 {
1241 enum neon_el_type thistype = NT_untyped;
1242 unsigned thissize = -1u;
1243
1244 if (*ptr != '.')
1245 break;
1246
1247 ptr++;
1248
1249 /* Just a size without an explicit type. */
1250 if (ISDIGIT (*ptr))
1251 goto parsesize;
1252
1253 switch (TOLOWER (*ptr))
1254 {
1255 case 'i': thistype = NT_integer; break;
1256 case 'f': thistype = NT_float; break;
1257 case 'p': thistype = NT_poly; break;
1258 case 's': thistype = NT_signed; break;
1259 case 'u': thistype = NT_unsigned; break;
037e8744
JB
1260 case 'd':
1261 thistype = NT_float;
1262 thissize = 64;
1263 ptr++;
1264 goto done;
dcbf9037
JB
1265 default:
1266 as_bad (_("unexpected character `%c' in type specifier"), *ptr);
1267 return FAIL;
1268 }
1269
1270 ptr++;
1271
1272 /* .f is an abbreviation for .f32. */
1273 if (thistype == NT_float && !ISDIGIT (*ptr))
1274 thissize = 32;
1275 else
1276 {
1277 parsesize:
1278 thissize = strtoul (ptr, &ptr, 10);
1279
1280 if (thissize != 8 && thissize != 16 && thissize != 32
1281 && thissize != 64)
1282 {
1283 as_bad (_("bad size %d in type specifier"), thissize);
1284 return FAIL;
1285 }
1286 }
1287
037e8744 1288 done:
dcbf9037
JB
1289 if (type)
1290 {
1291 type->el[type->elems].type = thistype;
1292 type->el[type->elems].size = thissize;
1293 type->elems++;
1294 }
1295 }
1296
1297 /* Empty/missing type is not a successful parse. */
1298 if (type->elems == 0)
1299 return FAIL;
1300
1301 *str = ptr;
1302
1303 return SUCCESS;
1304}
1305
1306/* Errors may be set multiple times during parsing or bit encoding
1307 (particularly in the Neon bits), but usually the earliest error which is set
1308 will be the most meaningful. Avoid overwriting it with later (cascading)
1309 errors by calling this function. */
1310
1311static void
1312first_error (const char *err)
1313{
1314 if (!inst.error)
1315 inst.error = err;
1316}
1317
1318/* Parse a single type, e.g. ".s32", leading period included. */
1319static int
1320parse_neon_operand_type (struct neon_type_el *vectype, char **ccp)
1321{
1322 char *str = *ccp;
1323 struct neon_type optype;
1324
1325 if (*str == '.')
1326 {
1327 if (parse_neon_type (&optype, &str) == SUCCESS)
1328 {
1329 if (optype.elems == 1)
1330 *vectype = optype.el[0];
1331 else
1332 {
1333 first_error (_("only one type should be specified for operand"));
1334 return FAIL;
1335 }
1336 }
1337 else
1338 {
1339 first_error (_("vector type expected"));
1340 return FAIL;
1341 }
1342 }
1343 else
1344 return FAIL;
5f4273c7 1345
dcbf9037 1346 *ccp = str;
5f4273c7 1347
dcbf9037
JB
1348 return SUCCESS;
1349}
1350
1351/* Special meanings for indices (which have a range of 0-7), which will fit into
1352 a 4-bit integer. */
1353
1354#define NEON_ALL_LANES 15
1355#define NEON_INTERLEAVE_LANES 14
1356
1357/* Parse either a register or a scalar, with an optional type. Return the
1358 register number, and optionally fill in the actual type of the register
1359 when multiple alternatives were given (NEON_TYPE_NDQ) in *RTYPE, and
1360 type/index information in *TYPEINFO. */
1361
1362static int
1363parse_typed_reg_or_scalar (char **ccp, enum arm_reg_type type,
1364 enum arm_reg_type *rtype,
1365 struct neon_typed_alias *typeinfo)
1366{
1367 char *str = *ccp;
1368 struct reg_entry *reg = arm_reg_parse_multi (&str);
1369 struct neon_typed_alias atype;
1370 struct neon_type_el parsetype;
1371
1372 atype.defined = 0;
1373 atype.index = -1;
1374 atype.eltype.type = NT_invtype;
1375 atype.eltype.size = -1;
1376
1377 /* Try alternate syntax for some types of register. Note these are mutually
1378 exclusive with the Neon syntax extensions. */
1379 if (reg == NULL)
1380 {
1381 int altreg = arm_reg_alt_syntax (&str, *ccp, reg, type);
1382 if (altreg != FAIL)
1383 *ccp = str;
1384 if (typeinfo)
1385 *typeinfo = atype;
1386 return altreg;
1387 }
1388
037e8744
JB
1389 /* Undo polymorphism when a set of register types may be accepted. */
1390 if ((type == REG_TYPE_NDQ
1391 && (reg->type == REG_TYPE_NQ || reg->type == REG_TYPE_VFD))
1392 || (type == REG_TYPE_VFSD
1393 && (reg->type == REG_TYPE_VFS || reg->type == REG_TYPE_VFD))
1394 || (type == REG_TYPE_NSDQ
1395 && (reg->type == REG_TYPE_VFS || reg->type == REG_TYPE_VFD
f512f76f
NC
1396 || reg->type == REG_TYPE_NQ))
1397 || (type == REG_TYPE_MMXWC
1398 && (reg->type == REG_TYPE_MMXWCG)))
21d799b5 1399 type = (enum arm_reg_type) reg->type;
dcbf9037
JB
1400
1401 if (type != reg->type)
1402 return FAIL;
1403
1404 if (reg->neon)
1405 atype = *reg->neon;
5f4273c7 1406
dcbf9037
JB
1407 if (parse_neon_operand_type (&parsetype, &str) == SUCCESS)
1408 {
1409 if ((atype.defined & NTA_HASTYPE) != 0)
1410 {
1411 first_error (_("can't redefine type for operand"));
1412 return FAIL;
1413 }
1414 atype.defined |= NTA_HASTYPE;
1415 atype.eltype = parsetype;
1416 }
5f4273c7 1417
dcbf9037
JB
1418 if (skip_past_char (&str, '[') == SUCCESS)
1419 {
1420 if (type != REG_TYPE_VFD)
1421 {
1422 first_error (_("only D registers may be indexed"));
1423 return FAIL;
1424 }
5f4273c7 1425
dcbf9037
JB
1426 if ((atype.defined & NTA_HASINDEX) != 0)
1427 {
1428 first_error (_("can't change index for operand"));
1429 return FAIL;
1430 }
1431
1432 atype.defined |= NTA_HASINDEX;
1433
1434 if (skip_past_char (&str, ']') == SUCCESS)
1435 atype.index = NEON_ALL_LANES;
1436 else
1437 {
1438 expressionS exp;
1439
1440 my_get_expression (&exp, &str, GE_NO_PREFIX);
1441
1442 if (exp.X_op != O_constant)
1443 {
1444 first_error (_("constant expression required"));
1445 return FAIL;
1446 }
1447
1448 if (skip_past_char (&str, ']') == FAIL)
1449 return FAIL;
1450
1451 atype.index = exp.X_add_number;
1452 }
1453 }
5f4273c7 1454
dcbf9037
JB
1455 if (typeinfo)
1456 *typeinfo = atype;
5f4273c7 1457
dcbf9037
JB
1458 if (rtype)
1459 *rtype = type;
5f4273c7 1460
dcbf9037 1461 *ccp = str;
5f4273c7 1462
dcbf9037
JB
1463 return reg->number;
1464}
1465
1466/* Like arm_reg_parse, but allow allow the following extra features:
1467 - If RTYPE is non-zero, return the (possibly restricted) type of the
1468 register (e.g. Neon double or quad reg when either has been requested).
1469 - If this is a Neon vector type with additional type information, fill
1470 in the struct pointed to by VECTYPE (if non-NULL).
5f4273c7 1471 This function will fault on encountering a scalar. */
dcbf9037
JB
1472
1473static int
1474arm_typed_reg_parse (char **ccp, enum arm_reg_type type,
1475 enum arm_reg_type *rtype, struct neon_type_el *vectype)
1476{
1477 struct neon_typed_alias atype;
1478 char *str = *ccp;
1479 int reg = parse_typed_reg_or_scalar (&str, type, rtype, &atype);
1480
1481 if (reg == FAIL)
1482 return FAIL;
1483
0855e32b
NS
1484 /* Do not allow regname(... to parse as a register. */
1485 if (*str == '(')
1486 return FAIL;
1487
dcbf9037
JB
1488 /* Do not allow a scalar (reg+index) to parse as a register. */
1489 if ((atype.defined & NTA_HASINDEX) != 0)
1490 {
1491 first_error (_("register operand expected, but got scalar"));
1492 return FAIL;
1493 }
1494
1495 if (vectype)
1496 *vectype = atype.eltype;
1497
1498 *ccp = str;
1499
1500 return reg;
1501}
1502
1503#define NEON_SCALAR_REG(X) ((X) >> 4)
1504#define NEON_SCALAR_INDEX(X) ((X) & 15)
1505
5287ad62
JB
1506/* Parse a Neon scalar. Most of the time when we're parsing a scalar, we don't
1507 have enough information to be able to do a good job bounds-checking. So, we
1508 just do easy checks here, and do further checks later. */
1509
1510static int
dcbf9037 1511parse_scalar (char **ccp, int elsize, struct neon_type_el *type)
5287ad62 1512{
dcbf9037 1513 int reg;
5287ad62 1514 char *str = *ccp;
dcbf9037 1515 struct neon_typed_alias atype;
5f4273c7 1516
dcbf9037 1517 reg = parse_typed_reg_or_scalar (&str, REG_TYPE_VFD, NULL, &atype);
5f4273c7 1518
dcbf9037 1519 if (reg == FAIL || (atype.defined & NTA_HASINDEX) == 0)
5287ad62 1520 return FAIL;
5f4273c7 1521
dcbf9037 1522 if (atype.index == NEON_ALL_LANES)
5287ad62 1523 {
dcbf9037 1524 first_error (_("scalar must have an index"));
5287ad62
JB
1525 return FAIL;
1526 }
dcbf9037 1527 else if (atype.index >= 64 / elsize)
5287ad62 1528 {
dcbf9037 1529 first_error (_("scalar index out of range"));
5287ad62
JB
1530 return FAIL;
1531 }
5f4273c7 1532
dcbf9037
JB
1533 if (type)
1534 *type = atype.eltype;
5f4273c7 1535
5287ad62 1536 *ccp = str;
5f4273c7 1537
dcbf9037 1538 return reg * 16 + atype.index;
5287ad62
JB
1539}
1540
c19d1205 1541/* Parse an ARM register list. Returns the bitmask, or FAIL. */
e07e6e58 1542
c19d1205
ZW
1543static long
1544parse_reg_list (char ** strp)
1545{
1546 char * str = * strp;
1547 long range = 0;
1548 int another_range;
a737bd4d 1549
c19d1205
ZW
1550 /* We come back here if we get ranges concatenated by '+' or '|'. */
1551 do
6057a28f 1552 {
c19d1205 1553 another_range = 0;
a737bd4d 1554
c19d1205
ZW
1555 if (*str == '{')
1556 {
1557 int in_range = 0;
1558 int cur_reg = -1;
a737bd4d 1559
c19d1205
ZW
1560 str++;
1561 do
1562 {
1563 int reg;
6057a28f 1564
dcbf9037 1565 if ((reg = arm_reg_parse (&str, REG_TYPE_RN)) == FAIL)
c19d1205 1566 {
dcbf9037 1567 first_error (_(reg_expected_msgs[REG_TYPE_RN]));
c19d1205
ZW
1568 return FAIL;
1569 }
a737bd4d 1570
c19d1205
ZW
1571 if (in_range)
1572 {
1573 int i;
a737bd4d 1574
c19d1205
ZW
1575 if (reg <= cur_reg)
1576 {
dcbf9037 1577 first_error (_("bad range in register list"));
c19d1205
ZW
1578 return FAIL;
1579 }
40a18ebd 1580
c19d1205
ZW
1581 for (i = cur_reg + 1; i < reg; i++)
1582 {
1583 if (range & (1 << i))
1584 as_tsktsk
1585 (_("Warning: duplicated register (r%d) in register list"),
1586 i);
1587 else
1588 range |= 1 << i;
1589 }
1590 in_range = 0;
1591 }
a737bd4d 1592
c19d1205
ZW
1593 if (range & (1 << reg))
1594 as_tsktsk (_("Warning: duplicated register (r%d) in register list"),
1595 reg);
1596 else if (reg <= cur_reg)
1597 as_tsktsk (_("Warning: register range not in ascending order"));
a737bd4d 1598
c19d1205
ZW
1599 range |= 1 << reg;
1600 cur_reg = reg;
1601 }
1602 while (skip_past_comma (&str) != FAIL
1603 || (in_range = 1, *str++ == '-'));
1604 str--;
a737bd4d 1605
c19d1205
ZW
1606 if (*str++ != '}')
1607 {
dcbf9037 1608 first_error (_("missing `}'"));
c19d1205
ZW
1609 return FAIL;
1610 }
1611 }
1612 else
1613 {
91d6fa6a 1614 expressionS exp;
40a18ebd 1615
91d6fa6a 1616 if (my_get_expression (&exp, &str, GE_NO_PREFIX))
c19d1205 1617 return FAIL;
40a18ebd 1618
91d6fa6a 1619 if (exp.X_op == O_constant)
c19d1205 1620 {
91d6fa6a
NC
1621 if (exp.X_add_number
1622 != (exp.X_add_number & 0x0000ffff))
c19d1205
ZW
1623 {
1624 inst.error = _("invalid register mask");
1625 return FAIL;
1626 }
a737bd4d 1627
91d6fa6a 1628 if ((range & exp.X_add_number) != 0)
c19d1205 1629 {
91d6fa6a 1630 int regno = range & exp.X_add_number;
a737bd4d 1631
c19d1205
ZW
1632 regno &= -regno;
1633 regno = (1 << regno) - 1;
1634 as_tsktsk
1635 (_("Warning: duplicated register (r%d) in register list"),
1636 regno);
1637 }
a737bd4d 1638
91d6fa6a 1639 range |= exp.X_add_number;
c19d1205
ZW
1640 }
1641 else
1642 {
1643 if (inst.reloc.type != 0)
1644 {
1645 inst.error = _("expression too complex");
1646 return FAIL;
1647 }
a737bd4d 1648
91d6fa6a 1649 memcpy (&inst.reloc.exp, &exp, sizeof (expressionS));
c19d1205
ZW
1650 inst.reloc.type = BFD_RELOC_ARM_MULTI;
1651 inst.reloc.pc_rel = 0;
1652 }
1653 }
a737bd4d 1654
c19d1205
ZW
1655 if (*str == '|' || *str == '+')
1656 {
1657 str++;
1658 another_range = 1;
1659 }
a737bd4d 1660 }
c19d1205 1661 while (another_range);
a737bd4d 1662
c19d1205
ZW
1663 *strp = str;
1664 return range;
a737bd4d
NC
1665}
1666
5287ad62
JB
1667/* Types of registers in a list. */
1668
1669enum reg_list_els
1670{
1671 REGLIST_VFP_S,
1672 REGLIST_VFP_D,
1673 REGLIST_NEON_D
1674};
1675
c19d1205
ZW
1676/* Parse a VFP register list. If the string is invalid return FAIL.
1677 Otherwise return the number of registers, and set PBASE to the first
5287ad62
JB
1678 register. Parses registers of type ETYPE.
1679 If REGLIST_NEON_D is used, several syntax enhancements are enabled:
1680 - Q registers can be used to specify pairs of D registers
1681 - { } can be omitted from around a singleton register list
1682 FIXME: This is not implemented, as it would require backtracking in
1683 some cases, e.g.:
1684 vtbl.8 d3,d4,d5
1685 This could be done (the meaning isn't really ambiguous), but doesn't
1686 fit in well with the current parsing framework.
dcbf9037
JB
1687 - 32 D registers may be used (also true for VFPv3).
1688 FIXME: Types are ignored in these register lists, which is probably a
1689 bug. */
6057a28f 1690
c19d1205 1691static int
037e8744 1692parse_vfp_reg_list (char **ccp, unsigned int *pbase, enum reg_list_els etype)
6057a28f 1693{
037e8744 1694 char *str = *ccp;
c19d1205
ZW
1695 int base_reg;
1696 int new_base;
21d799b5 1697 enum arm_reg_type regtype = (enum arm_reg_type) 0;
5287ad62 1698 int max_regs = 0;
c19d1205
ZW
1699 int count = 0;
1700 int warned = 0;
1701 unsigned long mask = 0;
a737bd4d 1702 int i;
6057a28f 1703
037e8744 1704 if (*str != '{')
5287ad62
JB
1705 {
1706 inst.error = _("expecting {");
1707 return FAIL;
1708 }
6057a28f 1709
037e8744 1710 str++;
6057a28f 1711
5287ad62 1712 switch (etype)
c19d1205 1713 {
5287ad62 1714 case REGLIST_VFP_S:
c19d1205
ZW
1715 regtype = REG_TYPE_VFS;
1716 max_regs = 32;
5287ad62 1717 break;
5f4273c7 1718
5287ad62
JB
1719 case REGLIST_VFP_D:
1720 regtype = REG_TYPE_VFD;
b7fc2769 1721 break;
5f4273c7 1722
b7fc2769
JB
1723 case REGLIST_NEON_D:
1724 regtype = REG_TYPE_NDQ;
1725 break;
1726 }
1727
1728 if (etype != REGLIST_VFP_S)
1729 {
b1cc4aeb
PB
1730 /* VFPv3 allows 32 D registers, except for the VFPv3-D16 variant. */
1731 if (ARM_CPU_HAS_FEATURE (cpu_variant, fpu_vfp_ext_d32))
5287ad62
JB
1732 {
1733 max_regs = 32;
1734 if (thumb_mode)
1735 ARM_MERGE_FEATURE_SETS (thumb_arch_used, thumb_arch_used,
b1cc4aeb 1736 fpu_vfp_ext_d32);
5287ad62
JB
1737 else
1738 ARM_MERGE_FEATURE_SETS (arm_arch_used, arm_arch_used,
b1cc4aeb 1739 fpu_vfp_ext_d32);
5287ad62
JB
1740 }
1741 else
1742 max_regs = 16;
c19d1205 1743 }
6057a28f 1744
c19d1205 1745 base_reg = max_regs;
a737bd4d 1746
c19d1205
ZW
1747 do
1748 {
5287ad62 1749 int setmask = 1, addregs = 1;
dcbf9037 1750
037e8744 1751 new_base = arm_typed_reg_parse (&str, regtype, &regtype, NULL);
dcbf9037 1752
c19d1205 1753 if (new_base == FAIL)
a737bd4d 1754 {
dcbf9037 1755 first_error (_(reg_expected_msgs[regtype]));
c19d1205
ZW
1756 return FAIL;
1757 }
5f4273c7 1758
b7fc2769
JB
1759 if (new_base >= max_regs)
1760 {
1761 first_error (_("register out of range in list"));
1762 return FAIL;
1763 }
5f4273c7 1764
5287ad62
JB
1765 /* Note: a value of 2 * n is returned for the register Q<n>. */
1766 if (regtype == REG_TYPE_NQ)
1767 {
1768 setmask = 3;
1769 addregs = 2;
1770 }
1771
c19d1205
ZW
1772 if (new_base < base_reg)
1773 base_reg = new_base;
a737bd4d 1774
5287ad62 1775 if (mask & (setmask << new_base))
c19d1205 1776 {
dcbf9037 1777 first_error (_("invalid register list"));
c19d1205 1778 return FAIL;
a737bd4d 1779 }
a737bd4d 1780
c19d1205
ZW
1781 if ((mask >> new_base) != 0 && ! warned)
1782 {
1783 as_tsktsk (_("register list not in ascending order"));
1784 warned = 1;
1785 }
0bbf2aa4 1786
5287ad62
JB
1787 mask |= setmask << new_base;
1788 count += addregs;
0bbf2aa4 1789
037e8744 1790 if (*str == '-') /* We have the start of a range expression */
c19d1205
ZW
1791 {
1792 int high_range;
0bbf2aa4 1793
037e8744 1794 str++;
0bbf2aa4 1795
037e8744 1796 if ((high_range = arm_typed_reg_parse (&str, regtype, NULL, NULL))
dcbf9037 1797 == FAIL)
c19d1205
ZW
1798 {
1799 inst.error = gettext (reg_expected_msgs[regtype]);
1800 return FAIL;
1801 }
0bbf2aa4 1802
b7fc2769
JB
1803 if (high_range >= max_regs)
1804 {
1805 first_error (_("register out of range in list"));
1806 return FAIL;
1807 }
1808
5287ad62
JB
1809 if (regtype == REG_TYPE_NQ)
1810 high_range = high_range + 1;
1811
c19d1205
ZW
1812 if (high_range <= new_base)
1813 {
1814 inst.error = _("register range not in ascending order");
1815 return FAIL;
1816 }
0bbf2aa4 1817
5287ad62 1818 for (new_base += addregs; new_base <= high_range; new_base += addregs)
0bbf2aa4 1819 {
5287ad62 1820 if (mask & (setmask << new_base))
0bbf2aa4 1821 {
c19d1205
ZW
1822 inst.error = _("invalid register list");
1823 return FAIL;
0bbf2aa4 1824 }
c19d1205 1825
5287ad62
JB
1826 mask |= setmask << new_base;
1827 count += addregs;
0bbf2aa4 1828 }
0bbf2aa4 1829 }
0bbf2aa4 1830 }
037e8744 1831 while (skip_past_comma (&str) != FAIL);
0bbf2aa4 1832
037e8744 1833 str++;
0bbf2aa4 1834
c19d1205
ZW
1835 /* Sanity check -- should have raised a parse error above. */
1836 if (count == 0 || count > max_regs)
1837 abort ();
1838
1839 *pbase = base_reg;
1840
1841 /* Final test -- the registers must be consecutive. */
1842 mask >>= base_reg;
1843 for (i = 0; i < count; i++)
1844 {
1845 if ((mask & (1u << i)) == 0)
1846 {
1847 inst.error = _("non-contiguous register range");
1848 return FAIL;
1849 }
1850 }
1851
037e8744
JB
1852 *ccp = str;
1853
c19d1205 1854 return count;
b99bd4ef
NC
1855}
1856
dcbf9037
JB
1857/* True if two alias types are the same. */
1858
c921be7d 1859static bfd_boolean
dcbf9037
JB
1860neon_alias_types_same (struct neon_typed_alias *a, struct neon_typed_alias *b)
1861{
1862 if (!a && !b)
c921be7d 1863 return TRUE;
5f4273c7 1864
dcbf9037 1865 if (!a || !b)
c921be7d 1866 return FALSE;
dcbf9037
JB
1867
1868 if (a->defined != b->defined)
c921be7d 1869 return FALSE;
5f4273c7 1870
dcbf9037
JB
1871 if ((a->defined & NTA_HASTYPE) != 0
1872 && (a->eltype.type != b->eltype.type
1873 || a->eltype.size != b->eltype.size))
c921be7d 1874 return FALSE;
dcbf9037
JB
1875
1876 if ((a->defined & NTA_HASINDEX) != 0
1877 && (a->index != b->index))
c921be7d 1878 return FALSE;
5f4273c7 1879
c921be7d 1880 return TRUE;
dcbf9037
JB
1881}
1882
5287ad62
JB
1883/* Parse element/structure lists for Neon VLD<n> and VST<n> instructions.
1884 The base register is put in *PBASE.
dcbf9037 1885 The lane (or one of the NEON_*_LANES constants) is placed in bits [3:0] of
5287ad62
JB
1886 the return value.
1887 The register stride (minus one) is put in bit 4 of the return value.
dcbf9037
JB
1888 Bits [6:5] encode the list length (minus one).
1889 The type of the list elements is put in *ELTYPE, if non-NULL. */
5287ad62 1890
5287ad62 1891#define NEON_LANE(X) ((X) & 0xf)
dcbf9037 1892#define NEON_REG_STRIDE(X) ((((X) >> 4) & 1) + 1)
5287ad62
JB
1893#define NEON_REGLIST_LENGTH(X) ((((X) >> 5) & 3) + 1)
1894
1895static int
dcbf9037
JB
1896parse_neon_el_struct_list (char **str, unsigned *pbase,
1897 struct neon_type_el *eltype)
5287ad62
JB
1898{
1899 char *ptr = *str;
1900 int base_reg = -1;
1901 int reg_incr = -1;
1902 int count = 0;
1903 int lane = -1;
1904 int leading_brace = 0;
1905 enum arm_reg_type rtype = REG_TYPE_NDQ;
20203fb9
NC
1906 const char *const incr_error = _("register stride must be 1 or 2");
1907 const char *const type_error = _("mismatched element/structure types in list");
dcbf9037 1908 struct neon_typed_alias firsttype;
5f4273c7 1909
5287ad62
JB
1910 if (skip_past_char (&ptr, '{') == SUCCESS)
1911 leading_brace = 1;
5f4273c7 1912
5287ad62
JB
1913 do
1914 {
dcbf9037
JB
1915 struct neon_typed_alias atype;
1916 int getreg = parse_typed_reg_or_scalar (&ptr, rtype, &rtype, &atype);
1917
5287ad62
JB
1918 if (getreg == FAIL)
1919 {
dcbf9037 1920 first_error (_(reg_expected_msgs[rtype]));
5287ad62
JB
1921 return FAIL;
1922 }
5f4273c7 1923
5287ad62
JB
1924 if (base_reg == -1)
1925 {
1926 base_reg = getreg;
1927 if (rtype == REG_TYPE_NQ)
1928 {
1929 reg_incr = 1;
5287ad62 1930 }
dcbf9037 1931 firsttype = atype;
5287ad62
JB
1932 }
1933 else if (reg_incr == -1)
1934 {
1935 reg_incr = getreg - base_reg;
1936 if (reg_incr < 1 || reg_incr > 2)
1937 {
dcbf9037 1938 first_error (_(incr_error));
5287ad62
JB
1939 return FAIL;
1940 }
1941 }
1942 else if (getreg != base_reg + reg_incr * count)
1943 {
dcbf9037
JB
1944 first_error (_(incr_error));
1945 return FAIL;
1946 }
1947
c921be7d 1948 if (! neon_alias_types_same (&atype, &firsttype))
dcbf9037
JB
1949 {
1950 first_error (_(type_error));
5287ad62
JB
1951 return FAIL;
1952 }
5f4273c7 1953
5287ad62
JB
1954 /* Handle Dn-Dm or Qn-Qm syntax. Can only be used with non-indexed list
1955 modes. */
1956 if (ptr[0] == '-')
1957 {
dcbf9037 1958 struct neon_typed_alias htype;
5287ad62
JB
1959 int hireg, dregs = (rtype == REG_TYPE_NQ) ? 2 : 1;
1960 if (lane == -1)
1961 lane = NEON_INTERLEAVE_LANES;
1962 else if (lane != NEON_INTERLEAVE_LANES)
1963 {
dcbf9037 1964 first_error (_(type_error));
5287ad62
JB
1965 return FAIL;
1966 }
1967 if (reg_incr == -1)
1968 reg_incr = 1;
1969 else if (reg_incr != 1)
1970 {
dcbf9037 1971 first_error (_("don't use Rn-Rm syntax with non-unit stride"));
5287ad62
JB
1972 return FAIL;
1973 }
1974 ptr++;
dcbf9037 1975 hireg = parse_typed_reg_or_scalar (&ptr, rtype, NULL, &htype);
5287ad62
JB
1976 if (hireg == FAIL)
1977 {
dcbf9037
JB
1978 first_error (_(reg_expected_msgs[rtype]));
1979 return FAIL;
1980 }
c921be7d 1981 if (! neon_alias_types_same (&htype, &firsttype))
dcbf9037
JB
1982 {
1983 first_error (_(type_error));
5287ad62
JB
1984 return FAIL;
1985 }
1986 count += hireg + dregs - getreg;
1987 continue;
1988 }
5f4273c7 1989
5287ad62
JB
1990 /* If we're using Q registers, we can't use [] or [n] syntax. */
1991 if (rtype == REG_TYPE_NQ)
1992 {
1993 count += 2;
1994 continue;
1995 }
5f4273c7 1996
dcbf9037 1997 if ((atype.defined & NTA_HASINDEX) != 0)
5287ad62 1998 {
dcbf9037
JB
1999 if (lane == -1)
2000 lane = atype.index;
2001 else if (lane != atype.index)
5287ad62 2002 {
dcbf9037
JB
2003 first_error (_(type_error));
2004 return FAIL;
5287ad62
JB
2005 }
2006 }
2007 else if (lane == -1)
2008 lane = NEON_INTERLEAVE_LANES;
2009 else if (lane != NEON_INTERLEAVE_LANES)
2010 {
dcbf9037 2011 first_error (_(type_error));
5287ad62
JB
2012 return FAIL;
2013 }
2014 count++;
2015 }
2016 while ((count != 1 || leading_brace) && skip_past_comma (&ptr) != FAIL);
5f4273c7 2017
5287ad62
JB
2018 /* No lane set by [x]. We must be interleaving structures. */
2019 if (lane == -1)
2020 lane = NEON_INTERLEAVE_LANES;
5f4273c7 2021
5287ad62
JB
2022 /* Sanity check. */
2023 if (lane == -1 || base_reg == -1 || count < 1 || count > 4
2024 || (count > 1 && reg_incr == -1))
2025 {
dcbf9037 2026 first_error (_("error parsing element/structure list"));
5287ad62
JB
2027 return FAIL;
2028 }
2029
2030 if ((count > 1 || leading_brace) && skip_past_char (&ptr, '}') == FAIL)
2031 {
dcbf9037 2032 first_error (_("expected }"));
5287ad62
JB
2033 return FAIL;
2034 }
5f4273c7 2035
5287ad62
JB
2036 if (reg_incr == -1)
2037 reg_incr = 1;
2038
dcbf9037
JB
2039 if (eltype)
2040 *eltype = firsttype.eltype;
2041
5287ad62
JB
2042 *pbase = base_reg;
2043 *str = ptr;
5f4273c7 2044
5287ad62
JB
2045 return lane | ((reg_incr - 1) << 4) | ((count - 1) << 5);
2046}
2047
c19d1205
ZW
2048/* Parse an explicit relocation suffix on an expression. This is
2049 either nothing, or a word in parentheses. Note that if !OBJ_ELF,
2050 arm_reloc_hsh contains no entries, so this function can only
2051 succeed if there is no () after the word. Returns -1 on error,
2052 BFD_RELOC_UNUSED if there wasn't any suffix. */
2053static int
2054parse_reloc (char **str)
b99bd4ef 2055{
c19d1205
ZW
2056 struct reloc_entry *r;
2057 char *p, *q;
b99bd4ef 2058
c19d1205
ZW
2059 if (**str != '(')
2060 return BFD_RELOC_UNUSED;
b99bd4ef 2061
c19d1205
ZW
2062 p = *str + 1;
2063 q = p;
2064
2065 while (*q && *q != ')' && *q != ',')
2066 q++;
2067 if (*q != ')')
2068 return -1;
2069
21d799b5
NC
2070 if ((r = (struct reloc_entry *)
2071 hash_find_n (arm_reloc_hsh, p, q - p)) == NULL)
c19d1205
ZW
2072 return -1;
2073
2074 *str = q + 1;
2075 return r->reloc;
b99bd4ef
NC
2076}
2077
c19d1205
ZW
2078/* Directives: register aliases. */
2079
dcbf9037 2080static struct reg_entry *
90ec0d68 2081insert_reg_alias (char *str, unsigned number, int type)
b99bd4ef 2082{
d3ce72d0 2083 struct reg_entry *new_reg;
c19d1205 2084 const char *name;
b99bd4ef 2085
d3ce72d0 2086 if ((new_reg = (struct reg_entry *) hash_find (arm_reg_hsh, str)) != 0)
c19d1205 2087 {
d3ce72d0 2088 if (new_reg->builtin)
c19d1205 2089 as_warn (_("ignoring attempt to redefine built-in register '%s'"), str);
b99bd4ef 2090
c19d1205
ZW
2091 /* Only warn about a redefinition if it's not defined as the
2092 same register. */
d3ce72d0 2093 else if (new_reg->number != number || new_reg->type != type)
c19d1205 2094 as_warn (_("ignoring redefinition of register alias '%s'"), str);
69b97547 2095
d929913e 2096 return NULL;
c19d1205 2097 }
b99bd4ef 2098
c19d1205 2099 name = xstrdup (str);
d3ce72d0 2100 new_reg = (struct reg_entry *) xmalloc (sizeof (struct reg_entry));
b99bd4ef 2101
d3ce72d0
NC
2102 new_reg->name = name;
2103 new_reg->number = number;
2104 new_reg->type = type;
2105 new_reg->builtin = FALSE;
2106 new_reg->neon = NULL;
b99bd4ef 2107
d3ce72d0 2108 if (hash_insert (arm_reg_hsh, name, (void *) new_reg))
c19d1205 2109 abort ();
5f4273c7 2110
d3ce72d0 2111 return new_reg;
dcbf9037
JB
2112}
2113
2114static void
2115insert_neon_reg_alias (char *str, int number, int type,
2116 struct neon_typed_alias *atype)
2117{
2118 struct reg_entry *reg = insert_reg_alias (str, number, type);
5f4273c7 2119
dcbf9037
JB
2120 if (!reg)
2121 {
2122 first_error (_("attempt to redefine typed alias"));
2123 return;
2124 }
5f4273c7 2125
dcbf9037
JB
2126 if (atype)
2127 {
21d799b5
NC
2128 reg->neon = (struct neon_typed_alias *)
2129 xmalloc (sizeof (struct neon_typed_alias));
dcbf9037
JB
2130 *reg->neon = *atype;
2131 }
c19d1205 2132}
b99bd4ef 2133
c19d1205 2134/* Look for the .req directive. This is of the form:
b99bd4ef 2135
c19d1205 2136 new_register_name .req existing_register_name
b99bd4ef 2137
c19d1205 2138 If we find one, or if it looks sufficiently like one that we want to
d929913e 2139 handle any error here, return TRUE. Otherwise return FALSE. */
b99bd4ef 2140
d929913e 2141static bfd_boolean
c19d1205
ZW
2142create_register_alias (char * newname, char *p)
2143{
2144 struct reg_entry *old;
2145 char *oldname, *nbuf;
2146 size_t nlen;
b99bd4ef 2147
c19d1205
ZW
2148 /* The input scrubber ensures that whitespace after the mnemonic is
2149 collapsed to single spaces. */
2150 oldname = p;
2151 if (strncmp (oldname, " .req ", 6) != 0)
d929913e 2152 return FALSE;
b99bd4ef 2153
c19d1205
ZW
2154 oldname += 6;
2155 if (*oldname == '\0')
d929913e 2156 return FALSE;
b99bd4ef 2157
21d799b5 2158 old = (struct reg_entry *) hash_find (arm_reg_hsh, oldname);
c19d1205 2159 if (!old)
b99bd4ef 2160 {
c19d1205 2161 as_warn (_("unknown register '%s' -- .req ignored"), oldname);
d929913e 2162 return TRUE;
b99bd4ef
NC
2163 }
2164
c19d1205
ZW
2165 /* If TC_CASE_SENSITIVE is defined, then newname already points to
2166 the desired alias name, and p points to its end. If not, then
2167 the desired alias name is in the global original_case_string. */
2168#ifdef TC_CASE_SENSITIVE
2169 nlen = p - newname;
2170#else
2171 newname = original_case_string;
2172 nlen = strlen (newname);
2173#endif
b99bd4ef 2174
21d799b5 2175 nbuf = (char *) alloca (nlen + 1);
c19d1205
ZW
2176 memcpy (nbuf, newname, nlen);
2177 nbuf[nlen] = '\0';
b99bd4ef 2178
c19d1205
ZW
2179 /* Create aliases under the new name as stated; an all-lowercase
2180 version of the new name; and an all-uppercase version of the new
2181 name. */
d929913e
NC
2182 if (insert_reg_alias (nbuf, old->number, old->type) != NULL)
2183 {
2184 for (p = nbuf; *p; p++)
2185 *p = TOUPPER (*p);
c19d1205 2186
d929913e
NC
2187 if (strncmp (nbuf, newname, nlen))
2188 {
2189 /* If this attempt to create an additional alias fails, do not bother
2190 trying to create the all-lower case alias. We will fail and issue
2191 a second, duplicate error message. This situation arises when the
2192 programmer does something like:
2193 foo .req r0
2194 Foo .req r1
2195 The second .req creates the "Foo" alias but then fails to create
5f4273c7 2196 the artificial FOO alias because it has already been created by the
d929913e
NC
2197 first .req. */
2198 if (insert_reg_alias (nbuf, old->number, old->type) == NULL)
2199 return TRUE;
2200 }
c19d1205 2201
d929913e
NC
2202 for (p = nbuf; *p; p++)
2203 *p = TOLOWER (*p);
c19d1205 2204
d929913e
NC
2205 if (strncmp (nbuf, newname, nlen))
2206 insert_reg_alias (nbuf, old->number, old->type);
2207 }
c19d1205 2208
d929913e 2209 return TRUE;
b99bd4ef
NC
2210}
2211
dcbf9037
JB
2212/* Create a Neon typed/indexed register alias using directives, e.g.:
2213 X .dn d5.s32[1]
2214 Y .qn 6.s16
2215 Z .dn d7
2216 T .dn Z[0]
2217 These typed registers can be used instead of the types specified after the
2218 Neon mnemonic, so long as all operands given have types. Types can also be
2219 specified directly, e.g.:
5f4273c7 2220 vadd d0.s32, d1.s32, d2.s32 */
dcbf9037 2221
c921be7d 2222static bfd_boolean
dcbf9037
JB
2223create_neon_reg_alias (char *newname, char *p)
2224{
2225 enum arm_reg_type basetype;
2226 struct reg_entry *basereg;
2227 struct reg_entry mybasereg;
2228 struct neon_type ntype;
2229 struct neon_typed_alias typeinfo;
12d6b0b7 2230 char *namebuf, *nameend ATTRIBUTE_UNUSED;
dcbf9037 2231 int namelen;
5f4273c7 2232
dcbf9037
JB
2233 typeinfo.defined = 0;
2234 typeinfo.eltype.type = NT_invtype;
2235 typeinfo.eltype.size = -1;
2236 typeinfo.index = -1;
5f4273c7 2237
dcbf9037 2238 nameend = p;
5f4273c7 2239
dcbf9037
JB
2240 if (strncmp (p, " .dn ", 5) == 0)
2241 basetype = REG_TYPE_VFD;
2242 else if (strncmp (p, " .qn ", 5) == 0)
2243 basetype = REG_TYPE_NQ;
2244 else
c921be7d 2245 return FALSE;
5f4273c7 2246
dcbf9037 2247 p += 5;
5f4273c7 2248
dcbf9037 2249 if (*p == '\0')
c921be7d 2250 return FALSE;
5f4273c7 2251
dcbf9037
JB
2252 basereg = arm_reg_parse_multi (&p);
2253
2254 if (basereg && basereg->type != basetype)
2255 {
2256 as_bad (_("bad type for register"));
c921be7d 2257 return FALSE;
dcbf9037
JB
2258 }
2259
2260 if (basereg == NULL)
2261 {
2262 expressionS exp;
2263 /* Try parsing as an integer. */
2264 my_get_expression (&exp, &p, GE_NO_PREFIX);
2265 if (exp.X_op != O_constant)
2266 {
2267 as_bad (_("expression must be constant"));
c921be7d 2268 return FALSE;
dcbf9037
JB
2269 }
2270 basereg = &mybasereg;
2271 basereg->number = (basetype == REG_TYPE_NQ) ? exp.X_add_number * 2
2272 : exp.X_add_number;
2273 basereg->neon = 0;
2274 }
2275
2276 if (basereg->neon)
2277 typeinfo = *basereg->neon;
2278
2279 if (parse_neon_type (&ntype, &p) == SUCCESS)
2280 {
2281 /* We got a type. */
2282 if (typeinfo.defined & NTA_HASTYPE)
2283 {
2284 as_bad (_("can't redefine the type of a register alias"));
c921be7d 2285 return FALSE;
dcbf9037 2286 }
5f4273c7 2287
dcbf9037
JB
2288 typeinfo.defined |= NTA_HASTYPE;
2289 if (ntype.elems != 1)
2290 {
2291 as_bad (_("you must specify a single type only"));
c921be7d 2292 return FALSE;
dcbf9037
JB
2293 }
2294 typeinfo.eltype = ntype.el[0];
2295 }
5f4273c7 2296
dcbf9037
JB
2297 if (skip_past_char (&p, '[') == SUCCESS)
2298 {
2299 expressionS exp;
2300 /* We got a scalar index. */
5f4273c7 2301
dcbf9037
JB
2302 if (typeinfo.defined & NTA_HASINDEX)
2303 {
2304 as_bad (_("can't redefine the index of a scalar alias"));
c921be7d 2305 return FALSE;
dcbf9037 2306 }
5f4273c7 2307
dcbf9037 2308 my_get_expression (&exp, &p, GE_NO_PREFIX);
5f4273c7 2309
dcbf9037
JB
2310 if (exp.X_op != O_constant)
2311 {
2312 as_bad (_("scalar index must be constant"));
c921be7d 2313 return FALSE;
dcbf9037 2314 }
5f4273c7 2315
dcbf9037
JB
2316 typeinfo.defined |= NTA_HASINDEX;
2317 typeinfo.index = exp.X_add_number;
5f4273c7 2318
dcbf9037
JB
2319 if (skip_past_char (&p, ']') == FAIL)
2320 {
2321 as_bad (_("expecting ]"));
c921be7d 2322 return FALSE;
dcbf9037
JB
2323 }
2324 }
2325
15735687
NS
2326 /* If TC_CASE_SENSITIVE is defined, then newname already points to
2327 the desired alias name, and p points to its end. If not, then
2328 the desired alias name is in the global original_case_string. */
2329#ifdef TC_CASE_SENSITIVE
dcbf9037 2330 namelen = nameend - newname;
15735687
NS
2331#else
2332 newname = original_case_string;
2333 namelen = strlen (newname);
2334#endif
2335
21d799b5 2336 namebuf = (char *) alloca (namelen + 1);
dcbf9037
JB
2337 strncpy (namebuf, newname, namelen);
2338 namebuf[namelen] = '\0';
5f4273c7 2339
dcbf9037
JB
2340 insert_neon_reg_alias (namebuf, basereg->number, basetype,
2341 typeinfo.defined != 0 ? &typeinfo : NULL);
5f4273c7 2342
dcbf9037
JB
2343 /* Insert name in all uppercase. */
2344 for (p = namebuf; *p; p++)
2345 *p = TOUPPER (*p);
5f4273c7 2346
dcbf9037
JB
2347 if (strncmp (namebuf, newname, namelen))
2348 insert_neon_reg_alias (namebuf, basereg->number, basetype,
2349 typeinfo.defined != 0 ? &typeinfo : NULL);
5f4273c7 2350
dcbf9037
JB
2351 /* Insert name in all lowercase. */
2352 for (p = namebuf; *p; p++)
2353 *p = TOLOWER (*p);
5f4273c7 2354
dcbf9037
JB
2355 if (strncmp (namebuf, newname, namelen))
2356 insert_neon_reg_alias (namebuf, basereg->number, basetype,
2357 typeinfo.defined != 0 ? &typeinfo : NULL);
5f4273c7 2358
c921be7d 2359 return TRUE;
dcbf9037
JB
2360}
2361
c19d1205
ZW
2362/* Should never be called, as .req goes between the alias and the
2363 register name, not at the beginning of the line. */
c921be7d 2364
b99bd4ef 2365static void
c19d1205 2366s_req (int a ATTRIBUTE_UNUSED)
b99bd4ef 2367{
c19d1205
ZW
2368 as_bad (_("invalid syntax for .req directive"));
2369}
b99bd4ef 2370
dcbf9037
JB
2371static void
2372s_dn (int a ATTRIBUTE_UNUSED)
2373{
2374 as_bad (_("invalid syntax for .dn directive"));
2375}
2376
2377static void
2378s_qn (int a ATTRIBUTE_UNUSED)
2379{
2380 as_bad (_("invalid syntax for .qn directive"));
2381}
2382
c19d1205
ZW
2383/* The .unreq directive deletes an alias which was previously defined
2384 by .req. For example:
b99bd4ef 2385
c19d1205
ZW
2386 my_alias .req r11
2387 .unreq my_alias */
b99bd4ef
NC
2388
2389static void
c19d1205 2390s_unreq (int a ATTRIBUTE_UNUSED)
b99bd4ef 2391{
c19d1205
ZW
2392 char * name;
2393 char saved_char;
b99bd4ef 2394
c19d1205
ZW
2395 name = input_line_pointer;
2396
2397 while (*input_line_pointer != 0
2398 && *input_line_pointer != ' '
2399 && *input_line_pointer != '\n')
2400 ++input_line_pointer;
2401
2402 saved_char = *input_line_pointer;
2403 *input_line_pointer = 0;
2404
2405 if (!*name)
2406 as_bad (_("invalid syntax for .unreq directive"));
2407 else
2408 {
21d799b5
NC
2409 struct reg_entry *reg = (struct reg_entry *) hash_find (arm_reg_hsh,
2410 name);
c19d1205
ZW
2411
2412 if (!reg)
2413 as_bad (_("unknown register alias '%s'"), name);
2414 else if (reg->builtin)
a1727c1a 2415 as_warn (_("ignoring attempt to use .unreq on fixed register name: '%s'"),
c19d1205
ZW
2416 name);
2417 else
2418 {
d929913e
NC
2419 char * p;
2420 char * nbuf;
2421
db0bc284 2422 hash_delete (arm_reg_hsh, name, FALSE);
c19d1205 2423 free ((char *) reg->name);
dcbf9037
JB
2424 if (reg->neon)
2425 free (reg->neon);
c19d1205 2426 free (reg);
d929913e
NC
2427
2428 /* Also locate the all upper case and all lower case versions.
2429 Do not complain if we cannot find one or the other as it
2430 was probably deleted above. */
5f4273c7 2431
d929913e
NC
2432 nbuf = strdup (name);
2433 for (p = nbuf; *p; p++)
2434 *p = TOUPPER (*p);
21d799b5 2435 reg = (struct reg_entry *) hash_find (arm_reg_hsh, nbuf);
d929913e
NC
2436 if (reg)
2437 {
db0bc284 2438 hash_delete (arm_reg_hsh, nbuf, FALSE);
d929913e
NC
2439 free ((char *) reg->name);
2440 if (reg->neon)
2441 free (reg->neon);
2442 free (reg);
2443 }
2444
2445 for (p = nbuf; *p; p++)
2446 *p = TOLOWER (*p);
21d799b5 2447 reg = (struct reg_entry *) hash_find (arm_reg_hsh, nbuf);
d929913e
NC
2448 if (reg)
2449 {
db0bc284 2450 hash_delete (arm_reg_hsh, nbuf, FALSE);
d929913e
NC
2451 free ((char *) reg->name);
2452 if (reg->neon)
2453 free (reg->neon);
2454 free (reg);
2455 }
2456
2457 free (nbuf);
c19d1205
ZW
2458 }
2459 }
b99bd4ef 2460
c19d1205 2461 *input_line_pointer = saved_char;
b99bd4ef
NC
2462 demand_empty_rest_of_line ();
2463}
2464
c19d1205
ZW
2465/* Directives: Instruction set selection. */
2466
2467#ifdef OBJ_ELF
2468/* This code is to handle mapping symbols as defined in the ARM ELF spec.
2469 (See "Mapping symbols", section 4.5.5, ARM AAELF version 1.0).
2470 Note that previously, $a and $t has type STT_FUNC (BSF_OBJECT flag),
2471 and $d has type STT_OBJECT (BSF_OBJECT flag). Now all three are untyped. */
2472
cd000bff
DJ
2473/* Create a new mapping symbol for the transition to STATE. */
2474
2475static void
2476make_mapping_symbol (enum mstate state, valueT value, fragS *frag)
b99bd4ef 2477{
a737bd4d 2478 symbolS * symbolP;
c19d1205
ZW
2479 const char * symname;
2480 int type;
b99bd4ef 2481
c19d1205 2482 switch (state)
b99bd4ef 2483 {
c19d1205
ZW
2484 case MAP_DATA:
2485 symname = "$d";
2486 type = BSF_NO_FLAGS;
2487 break;
2488 case MAP_ARM:
2489 symname = "$a";
2490 type = BSF_NO_FLAGS;
2491 break;
2492 case MAP_THUMB:
2493 symname = "$t";
2494 type = BSF_NO_FLAGS;
2495 break;
c19d1205
ZW
2496 default:
2497 abort ();
2498 }
2499
cd000bff 2500 symbolP = symbol_new (symname, now_seg, value, frag);
c19d1205
ZW
2501 symbol_get_bfdsym (symbolP)->flags |= type | BSF_LOCAL;
2502
2503 switch (state)
2504 {
2505 case MAP_ARM:
2506 THUMB_SET_FUNC (symbolP, 0);
2507 ARM_SET_THUMB (symbolP, 0);
2508 ARM_SET_INTERWORK (symbolP, support_interwork);
2509 break;
2510
2511 case MAP_THUMB:
2512 THUMB_SET_FUNC (symbolP, 1);
2513 ARM_SET_THUMB (symbolP, 1);
2514 ARM_SET_INTERWORK (symbolP, support_interwork);
2515 break;
2516
2517 case MAP_DATA:
2518 default:
cd000bff
DJ
2519 break;
2520 }
2521
2522 /* Save the mapping symbols for future reference. Also check that
2523 we do not place two mapping symbols at the same offset within a
2524 frag. We'll handle overlap between frags in
2de7820f
JZ
2525 check_mapping_symbols.
2526
2527 If .fill or other data filling directive generates zero sized data,
2528 the mapping symbol for the following code will have the same value
2529 as the one generated for the data filling directive. In this case,
2530 we replace the old symbol with the new one at the same address. */
cd000bff
DJ
2531 if (value == 0)
2532 {
2de7820f
JZ
2533 if (frag->tc_frag_data.first_map != NULL)
2534 {
2535 know (S_GET_VALUE (frag->tc_frag_data.first_map) == 0);
2536 symbol_remove (frag->tc_frag_data.first_map, &symbol_rootP, &symbol_lastP);
2537 }
cd000bff
DJ
2538 frag->tc_frag_data.first_map = symbolP;
2539 }
2540 if (frag->tc_frag_data.last_map != NULL)
0f020cef
JZ
2541 {
2542 know (S_GET_VALUE (frag->tc_frag_data.last_map) <= S_GET_VALUE (symbolP));
0f020cef
JZ
2543 if (S_GET_VALUE (frag->tc_frag_data.last_map) == S_GET_VALUE (symbolP))
2544 symbol_remove (frag->tc_frag_data.last_map, &symbol_rootP, &symbol_lastP);
2545 }
cd000bff
DJ
2546 frag->tc_frag_data.last_map = symbolP;
2547}
2548
2549/* We must sometimes convert a region marked as code to data during
2550 code alignment, if an odd number of bytes have to be padded. The
2551 code mapping symbol is pushed to an aligned address. */
2552
2553static void
2554insert_data_mapping_symbol (enum mstate state,
2555 valueT value, fragS *frag, offsetT bytes)
2556{
2557 /* If there was already a mapping symbol, remove it. */
2558 if (frag->tc_frag_data.last_map != NULL
2559 && S_GET_VALUE (frag->tc_frag_data.last_map) == frag->fr_address + value)
2560 {
2561 symbolS *symp = frag->tc_frag_data.last_map;
2562
2563 if (value == 0)
2564 {
2565 know (frag->tc_frag_data.first_map == symp);
2566 frag->tc_frag_data.first_map = NULL;
2567 }
2568 frag->tc_frag_data.last_map = NULL;
2569 symbol_remove (symp, &symbol_rootP, &symbol_lastP);
c19d1205 2570 }
cd000bff
DJ
2571
2572 make_mapping_symbol (MAP_DATA, value, frag);
2573 make_mapping_symbol (state, value + bytes, frag);
2574}
2575
2576static void mapping_state_2 (enum mstate state, int max_chars);
2577
2578/* Set the mapping state to STATE. Only call this when about to
2579 emit some STATE bytes to the file. */
2580
2581void
2582mapping_state (enum mstate state)
2583{
940b5ce0
DJ
2584 enum mstate mapstate = seg_info (now_seg)->tc_segment_info_data.mapstate;
2585
cd000bff
DJ
2586#define TRANSITION(from, to) (mapstate == (from) && state == (to))
2587
2588 if (mapstate == state)
2589 /* The mapping symbol has already been emitted.
2590 There is nothing else to do. */
2591 return;
2592 else if (TRANSITION (MAP_UNDEFINED, MAP_DATA))
2593 /* This case will be evaluated later in the next else. */
2594 return;
2595 else if (TRANSITION (MAP_UNDEFINED, MAP_ARM)
2596 || TRANSITION (MAP_UNDEFINED, MAP_THUMB))
2597 {
2598 /* Only add the symbol if the offset is > 0:
2599 if we're at the first frag, check it's size > 0;
2600 if we're not at the first frag, then for sure
2601 the offset is > 0. */
2602 struct frag * const frag_first = seg_info (now_seg)->frchainP->frch_root;
2603 const int add_symbol = (frag_now != frag_first) || (frag_now_fix () > 0);
2604
2605 if (add_symbol)
2606 make_mapping_symbol (MAP_DATA, (valueT) 0, frag_first);
2607 }
2608
2609 mapping_state_2 (state, 0);
2610#undef TRANSITION
2611}
2612
2613/* Same as mapping_state, but MAX_CHARS bytes have already been
2614 allocated. Put the mapping symbol that far back. */
2615
2616static void
2617mapping_state_2 (enum mstate state, int max_chars)
2618{
940b5ce0
DJ
2619 enum mstate mapstate = seg_info (now_seg)->tc_segment_info_data.mapstate;
2620
2621 if (!SEG_NORMAL (now_seg))
2622 return;
2623
cd000bff
DJ
2624 if (mapstate == state)
2625 /* The mapping symbol has already been emitted.
2626 There is nothing else to do. */
2627 return;
2628
cd000bff
DJ
2629 seg_info (now_seg)->tc_segment_info_data.mapstate = state;
2630 make_mapping_symbol (state, (valueT) frag_now_fix () - max_chars, frag_now);
c19d1205
ZW
2631}
2632#else
d3106081
NS
2633#define mapping_state(x) ((void)0)
2634#define mapping_state_2(x, y) ((void)0)
c19d1205
ZW
2635#endif
2636
2637/* Find the real, Thumb encoded start of a Thumb function. */
2638
4343666d 2639#ifdef OBJ_COFF
c19d1205
ZW
2640static symbolS *
2641find_real_start (symbolS * symbolP)
2642{
2643 char * real_start;
2644 const char * name = S_GET_NAME (symbolP);
2645 symbolS * new_target;
2646
2647 /* This definition must agree with the one in gcc/config/arm/thumb.c. */
2648#define STUB_NAME ".real_start_of"
2649
2650 if (name == NULL)
2651 abort ();
2652
37f6032b
ZW
2653 /* The compiler may generate BL instructions to local labels because
2654 it needs to perform a branch to a far away location. These labels
2655 do not have a corresponding ".real_start_of" label. We check
2656 both for S_IS_LOCAL and for a leading dot, to give a way to bypass
2657 the ".real_start_of" convention for nonlocal branches. */
2658 if (S_IS_LOCAL (symbolP) || name[0] == '.')
c19d1205
ZW
2659 return symbolP;
2660
37f6032b 2661 real_start = ACONCAT ((STUB_NAME, name, NULL));
c19d1205
ZW
2662 new_target = symbol_find (real_start);
2663
2664 if (new_target == NULL)
2665 {
bd3ba5d1 2666 as_warn (_("Failed to find real start of function: %s\n"), name);
c19d1205
ZW
2667 new_target = symbolP;
2668 }
2669
c19d1205
ZW
2670 return new_target;
2671}
4343666d 2672#endif
c19d1205
ZW
2673
2674static void
2675opcode_select (int width)
2676{
2677 switch (width)
2678 {
2679 case 16:
2680 if (! thumb_mode)
2681 {
e74cfd16 2682 if (!ARM_CPU_HAS_FEATURE (cpu_variant, arm_ext_v4t))
c19d1205
ZW
2683 as_bad (_("selected processor does not support THUMB opcodes"));
2684
2685 thumb_mode = 1;
2686 /* No need to force the alignment, since we will have been
2687 coming from ARM mode, which is word-aligned. */
2688 record_alignment (now_seg, 1);
2689 }
c19d1205
ZW
2690 break;
2691
2692 case 32:
2693 if (thumb_mode)
2694 {
e74cfd16 2695 if (!ARM_CPU_HAS_FEATURE (cpu_variant, arm_ext_v1))
c19d1205
ZW
2696 as_bad (_("selected processor does not support ARM opcodes"));
2697
2698 thumb_mode = 0;
2699
2700 if (!need_pass_2)
2701 frag_align (2, 0, 0);
2702
2703 record_alignment (now_seg, 1);
2704 }
c19d1205
ZW
2705 break;
2706
2707 default:
2708 as_bad (_("invalid instruction size selected (%d)"), width);
2709 }
2710}
2711
2712static void
2713s_arm (int ignore ATTRIBUTE_UNUSED)
2714{
2715 opcode_select (32);
2716 demand_empty_rest_of_line ();
2717}
2718
2719static void
2720s_thumb (int ignore ATTRIBUTE_UNUSED)
2721{
2722 opcode_select (16);
2723 demand_empty_rest_of_line ();
2724}
2725
2726static void
2727s_code (int unused ATTRIBUTE_UNUSED)
2728{
2729 int temp;
2730
2731 temp = get_absolute_expression ();
2732 switch (temp)
2733 {
2734 case 16:
2735 case 32:
2736 opcode_select (temp);
2737 break;
2738
2739 default:
2740 as_bad (_("invalid operand to .code directive (%d) (expecting 16 or 32)"), temp);
2741 }
2742}
2743
2744static void
2745s_force_thumb (int ignore ATTRIBUTE_UNUSED)
2746{
2747 /* If we are not already in thumb mode go into it, EVEN if
2748 the target processor does not support thumb instructions.
2749 This is used by gcc/config/arm/lib1funcs.asm for example
2750 to compile interworking support functions even if the
2751 target processor should not support interworking. */
2752 if (! thumb_mode)
2753 {
2754 thumb_mode = 2;
2755 record_alignment (now_seg, 1);
2756 }
2757
2758 demand_empty_rest_of_line ();
2759}
2760
2761static void
2762s_thumb_func (int ignore ATTRIBUTE_UNUSED)
2763{
2764 s_thumb (0);
2765
2766 /* The following label is the name/address of the start of a Thumb function.
2767 We need to know this for the interworking support. */
2768 label_is_thumb_function_name = TRUE;
2769}
2770
2771/* Perform a .set directive, but also mark the alias as
2772 being a thumb function. */
2773
2774static void
2775s_thumb_set (int equiv)
2776{
2777 /* XXX the following is a duplicate of the code for s_set() in read.c
2778 We cannot just call that code as we need to get at the symbol that
2779 is created. */
2780 char * name;
2781 char delim;
2782 char * end_name;
2783 symbolS * symbolP;
2784
2785 /* Especial apologies for the random logic:
2786 This just grew, and could be parsed much more simply!
2787 Dean - in haste. */
2788 name = input_line_pointer;
2789 delim = get_symbol_end ();
2790 end_name = input_line_pointer;
2791 *end_name = delim;
2792
2793 if (*input_line_pointer != ',')
2794 {
2795 *end_name = 0;
2796 as_bad (_("expected comma after name \"%s\""), name);
b99bd4ef
NC
2797 *end_name = delim;
2798 ignore_rest_of_line ();
2799 return;
2800 }
2801
2802 input_line_pointer++;
2803 *end_name = 0;
2804
2805 if (name[0] == '.' && name[1] == '\0')
2806 {
2807 /* XXX - this should not happen to .thumb_set. */
2808 abort ();
2809 }
2810
2811 if ((symbolP = symbol_find (name)) == NULL
2812 && (symbolP = md_undefined_symbol (name)) == NULL)
2813 {
2814#ifndef NO_LISTING
2815 /* When doing symbol listings, play games with dummy fragments living
2816 outside the normal fragment chain to record the file and line info
c19d1205 2817 for this symbol. */
b99bd4ef
NC
2818 if (listing & LISTING_SYMBOLS)
2819 {
2820 extern struct list_info_struct * listing_tail;
21d799b5 2821 fragS * dummy_frag = (fragS * ) xmalloc (sizeof (fragS));
b99bd4ef
NC
2822
2823 memset (dummy_frag, 0, sizeof (fragS));
2824 dummy_frag->fr_type = rs_fill;
2825 dummy_frag->line = listing_tail;
2826 symbolP = symbol_new (name, undefined_section, 0, dummy_frag);
2827 dummy_frag->fr_symbol = symbolP;
2828 }
2829 else
2830#endif
2831 symbolP = symbol_new (name, undefined_section, 0, &zero_address_frag);
2832
2833#ifdef OBJ_COFF
2834 /* "set" symbols are local unless otherwise specified. */
2835 SF_SET_LOCAL (symbolP);
2836#endif /* OBJ_COFF */
2837 } /* Make a new symbol. */
2838
2839 symbol_table_insert (symbolP);
2840
2841 * end_name = delim;
2842
2843 if (equiv
2844 && S_IS_DEFINED (symbolP)
2845 && S_GET_SEGMENT (symbolP) != reg_section)
2846 as_bad (_("symbol `%s' already defined"), S_GET_NAME (symbolP));
2847
2848 pseudo_set (symbolP);
2849
2850 demand_empty_rest_of_line ();
2851
c19d1205 2852 /* XXX Now we come to the Thumb specific bit of code. */
b99bd4ef
NC
2853
2854 THUMB_SET_FUNC (symbolP, 1);
2855 ARM_SET_THUMB (symbolP, 1);
2856#if defined OBJ_ELF || defined OBJ_COFF
2857 ARM_SET_INTERWORK (symbolP, support_interwork);
2858#endif
2859}
2860
c19d1205 2861/* Directives: Mode selection. */
b99bd4ef 2862
c19d1205
ZW
2863/* .syntax [unified|divided] - choose the new unified syntax
2864 (same for Arm and Thumb encoding, modulo slight differences in what
2865 can be represented) or the old divergent syntax for each mode. */
b99bd4ef 2866static void
c19d1205 2867s_syntax (int unused ATTRIBUTE_UNUSED)
b99bd4ef 2868{
c19d1205
ZW
2869 char *name, delim;
2870
2871 name = input_line_pointer;
2872 delim = get_symbol_end ();
2873
2874 if (!strcasecmp (name, "unified"))
2875 unified_syntax = TRUE;
2876 else if (!strcasecmp (name, "divided"))
2877 unified_syntax = FALSE;
2878 else
2879 {
2880 as_bad (_("unrecognized syntax mode \"%s\""), name);
2881 return;
2882 }
2883 *input_line_pointer = delim;
b99bd4ef
NC
2884 demand_empty_rest_of_line ();
2885}
2886
c19d1205
ZW
2887/* Directives: sectioning and alignment. */
2888
2889/* Same as s_align_ptwo but align 0 => align 2. */
2890
b99bd4ef 2891static void
c19d1205 2892s_align (int unused ATTRIBUTE_UNUSED)
b99bd4ef 2893{
a737bd4d 2894 int temp;
dce323d1 2895 bfd_boolean fill_p;
c19d1205
ZW
2896 long temp_fill;
2897 long max_alignment = 15;
b99bd4ef
NC
2898
2899 temp = get_absolute_expression ();
c19d1205
ZW
2900 if (temp > max_alignment)
2901 as_bad (_("alignment too large: %d assumed"), temp = max_alignment);
2902 else if (temp < 0)
b99bd4ef 2903 {
c19d1205
ZW
2904 as_bad (_("alignment negative. 0 assumed."));
2905 temp = 0;
2906 }
b99bd4ef 2907
c19d1205
ZW
2908 if (*input_line_pointer == ',')
2909 {
2910 input_line_pointer++;
2911 temp_fill = get_absolute_expression ();
dce323d1 2912 fill_p = TRUE;
b99bd4ef 2913 }
c19d1205 2914 else
dce323d1
PB
2915 {
2916 fill_p = FALSE;
2917 temp_fill = 0;
2918 }
b99bd4ef 2919
c19d1205
ZW
2920 if (!temp)
2921 temp = 2;
b99bd4ef 2922
c19d1205
ZW
2923 /* Only make a frag if we HAVE to. */
2924 if (temp && !need_pass_2)
dce323d1
PB
2925 {
2926 if (!fill_p && subseg_text_p (now_seg))
2927 frag_align_code (temp, 0);
2928 else
2929 frag_align (temp, (int) temp_fill, 0);
2930 }
c19d1205
ZW
2931 demand_empty_rest_of_line ();
2932
2933 record_alignment (now_seg, temp);
b99bd4ef
NC
2934}
2935
c19d1205
ZW
2936static void
2937s_bss (int ignore ATTRIBUTE_UNUSED)
b99bd4ef 2938{
c19d1205
ZW
2939 /* We don't support putting frags in the BSS segment, we fake it by
2940 marking in_bss, then looking at s_skip for clues. */
2941 subseg_set (bss_section, 0);
2942 demand_empty_rest_of_line ();
cd000bff
DJ
2943
2944#ifdef md_elf_section_change_hook
2945 md_elf_section_change_hook ();
2946#endif
c19d1205 2947}
b99bd4ef 2948
c19d1205
ZW
2949static void
2950s_even (int ignore ATTRIBUTE_UNUSED)
2951{
2952 /* Never make frag if expect extra pass. */
2953 if (!need_pass_2)
2954 frag_align (1, 0, 0);
b99bd4ef 2955
c19d1205 2956 record_alignment (now_seg, 1);
b99bd4ef 2957
c19d1205 2958 demand_empty_rest_of_line ();
b99bd4ef
NC
2959}
2960
c19d1205 2961/* Directives: Literal pools. */
a737bd4d 2962
c19d1205
ZW
2963static literal_pool *
2964find_literal_pool (void)
a737bd4d 2965{
c19d1205 2966 literal_pool * pool;
a737bd4d 2967
c19d1205 2968 for (pool = list_of_pools; pool != NULL; pool = pool->next)
a737bd4d 2969 {
c19d1205
ZW
2970 if (pool->section == now_seg
2971 && pool->sub_section == now_subseg)
2972 break;
a737bd4d
NC
2973 }
2974
c19d1205 2975 return pool;
a737bd4d
NC
2976}
2977
c19d1205
ZW
2978static literal_pool *
2979find_or_make_literal_pool (void)
a737bd4d 2980{
c19d1205
ZW
2981 /* Next literal pool ID number. */
2982 static unsigned int latest_pool_num = 1;
2983 literal_pool * pool;
a737bd4d 2984
c19d1205 2985 pool = find_literal_pool ();
a737bd4d 2986
c19d1205 2987 if (pool == NULL)
a737bd4d 2988 {
c19d1205 2989 /* Create a new pool. */
21d799b5 2990 pool = (literal_pool *) xmalloc (sizeof (* pool));
c19d1205
ZW
2991 if (! pool)
2992 return NULL;
a737bd4d 2993
c19d1205
ZW
2994 pool->next_free_entry = 0;
2995 pool->section = now_seg;
2996 pool->sub_section = now_subseg;
2997 pool->next = list_of_pools;
2998 pool->symbol = NULL;
2999
3000 /* Add it to the list. */
3001 list_of_pools = pool;
a737bd4d 3002 }
a737bd4d 3003
c19d1205
ZW
3004 /* New pools, and emptied pools, will have a NULL symbol. */
3005 if (pool->symbol == NULL)
a737bd4d 3006 {
c19d1205
ZW
3007 pool->symbol = symbol_create (FAKE_LABEL_NAME, undefined_section,
3008 (valueT) 0, &zero_address_frag);
3009 pool->id = latest_pool_num ++;
a737bd4d
NC
3010 }
3011
c19d1205
ZW
3012 /* Done. */
3013 return pool;
a737bd4d
NC
3014}
3015
c19d1205 3016/* Add the literal in the global 'inst'
5f4273c7 3017 structure to the relevant literal pool. */
b99bd4ef
NC
3018
3019static int
c19d1205 3020add_to_lit_pool (void)
b99bd4ef 3021{
c19d1205
ZW
3022 literal_pool * pool;
3023 unsigned int entry;
b99bd4ef 3024
c19d1205
ZW
3025 pool = find_or_make_literal_pool ();
3026
3027 /* Check if this literal value is already in the pool. */
3028 for (entry = 0; entry < pool->next_free_entry; entry ++)
b99bd4ef 3029 {
c19d1205
ZW
3030 if ((pool->literals[entry].X_op == inst.reloc.exp.X_op)
3031 && (inst.reloc.exp.X_op == O_constant)
3032 && (pool->literals[entry].X_add_number
3033 == inst.reloc.exp.X_add_number)
3034 && (pool->literals[entry].X_unsigned
3035 == inst.reloc.exp.X_unsigned))
3036 break;
3037
3038 if ((pool->literals[entry].X_op == inst.reloc.exp.X_op)
3039 && (inst.reloc.exp.X_op == O_symbol)
3040 && (pool->literals[entry].X_add_number
3041 == inst.reloc.exp.X_add_number)
3042 && (pool->literals[entry].X_add_symbol
3043 == inst.reloc.exp.X_add_symbol)
3044 && (pool->literals[entry].X_op_symbol
3045 == inst.reloc.exp.X_op_symbol))
3046 break;
b99bd4ef
NC
3047 }
3048
c19d1205
ZW
3049 /* Do we need to create a new entry? */
3050 if (entry == pool->next_free_entry)
3051 {
3052 if (entry >= MAX_LITERAL_POOL_SIZE)
3053 {
3054 inst.error = _("literal pool overflow");
3055 return FAIL;
3056 }
3057
3058 pool->literals[entry] = inst.reloc.exp;
3059 pool->next_free_entry += 1;
3060 }
b99bd4ef 3061
c19d1205
ZW
3062 inst.reloc.exp.X_op = O_symbol;
3063 inst.reloc.exp.X_add_number = ((int) entry) * 4;
3064 inst.reloc.exp.X_add_symbol = pool->symbol;
b99bd4ef 3065
c19d1205 3066 return SUCCESS;
b99bd4ef
NC
3067}
3068
c19d1205
ZW
3069/* Can't use symbol_new here, so have to create a symbol and then at
3070 a later date assign it a value. Thats what these functions do. */
e16bb312 3071
c19d1205
ZW
3072static void
3073symbol_locate (symbolS * symbolP,
3074 const char * name, /* It is copied, the caller can modify. */
3075 segT segment, /* Segment identifier (SEG_<something>). */
3076 valueT valu, /* Symbol value. */
3077 fragS * frag) /* Associated fragment. */
3078{
3079 unsigned int name_length;
3080 char * preserved_copy_of_name;
e16bb312 3081
c19d1205
ZW
3082 name_length = strlen (name) + 1; /* +1 for \0. */
3083 obstack_grow (&notes, name, name_length);
21d799b5 3084 preserved_copy_of_name = (char *) obstack_finish (&notes);
e16bb312 3085
c19d1205
ZW
3086#ifdef tc_canonicalize_symbol_name
3087 preserved_copy_of_name =
3088 tc_canonicalize_symbol_name (preserved_copy_of_name);
3089#endif
b99bd4ef 3090
c19d1205 3091 S_SET_NAME (symbolP, preserved_copy_of_name);
b99bd4ef 3092
c19d1205
ZW
3093 S_SET_SEGMENT (symbolP, segment);
3094 S_SET_VALUE (symbolP, valu);
3095 symbol_clear_list_pointers (symbolP);
b99bd4ef 3096
c19d1205 3097 symbol_set_frag (symbolP, frag);
b99bd4ef 3098
c19d1205
ZW
3099 /* Link to end of symbol chain. */
3100 {
3101 extern int symbol_table_frozen;
b99bd4ef 3102
c19d1205
ZW
3103 if (symbol_table_frozen)
3104 abort ();
3105 }
b99bd4ef 3106
c19d1205 3107 symbol_append (symbolP, symbol_lastP, & symbol_rootP, & symbol_lastP);
b99bd4ef 3108
c19d1205 3109 obj_symbol_new_hook (symbolP);
b99bd4ef 3110
c19d1205
ZW
3111#ifdef tc_symbol_new_hook
3112 tc_symbol_new_hook (symbolP);
3113#endif
3114
3115#ifdef DEBUG_SYMS
3116 verify_symbol_chain (symbol_rootP, symbol_lastP);
3117#endif /* DEBUG_SYMS */
b99bd4ef
NC
3118}
3119
b99bd4ef 3120
c19d1205
ZW
3121static void
3122s_ltorg (int ignored ATTRIBUTE_UNUSED)
b99bd4ef 3123{
c19d1205
ZW
3124 unsigned int entry;
3125 literal_pool * pool;
3126 char sym_name[20];
b99bd4ef 3127
c19d1205
ZW
3128 pool = find_literal_pool ();
3129 if (pool == NULL
3130 || pool->symbol == NULL
3131 || pool->next_free_entry == 0)
3132 return;
b99bd4ef 3133
c19d1205 3134 mapping_state (MAP_DATA);
b99bd4ef 3135
c19d1205
ZW
3136 /* Align pool as you have word accesses.
3137 Only make a frag if we have to. */
3138 if (!need_pass_2)
3139 frag_align (2, 0, 0);
b99bd4ef 3140
c19d1205 3141 record_alignment (now_seg, 2);
b99bd4ef 3142
c19d1205 3143 sprintf (sym_name, "$$lit_\002%x", pool->id);
b99bd4ef 3144
c19d1205
ZW
3145 symbol_locate (pool->symbol, sym_name, now_seg,
3146 (valueT) frag_now_fix (), frag_now);
3147 symbol_table_insert (pool->symbol);
b99bd4ef 3148
c19d1205 3149 ARM_SET_THUMB (pool->symbol, thumb_mode);
b99bd4ef 3150
c19d1205
ZW
3151#if defined OBJ_COFF || defined OBJ_ELF
3152 ARM_SET_INTERWORK (pool->symbol, support_interwork);
3153#endif
6c43fab6 3154
c19d1205
ZW
3155 for (entry = 0; entry < pool->next_free_entry; entry ++)
3156 /* First output the expression in the instruction to the pool. */
3157 emit_expr (&(pool->literals[entry]), 4); /* .word */
b99bd4ef 3158
c19d1205
ZW
3159 /* Mark the pool as empty. */
3160 pool->next_free_entry = 0;
3161 pool->symbol = NULL;
b99bd4ef
NC
3162}
3163
c19d1205
ZW
3164#ifdef OBJ_ELF
3165/* Forward declarations for functions below, in the MD interface
3166 section. */
3167static void fix_new_arm (fragS *, int, short, expressionS *, int, int);
3168static valueT create_unwind_entry (int);
3169static void start_unwind_section (const segT, int);
3170static void add_unwind_opcode (valueT, int);
3171static void flush_pending_unwind (void);
b99bd4ef 3172
c19d1205 3173/* Directives: Data. */
b99bd4ef 3174
c19d1205
ZW
3175static void
3176s_arm_elf_cons (int nbytes)
3177{
3178 expressionS exp;
b99bd4ef 3179
c19d1205
ZW
3180#ifdef md_flush_pending_output
3181 md_flush_pending_output ();
3182#endif
b99bd4ef 3183
c19d1205 3184 if (is_it_end_of_statement ())
b99bd4ef 3185 {
c19d1205
ZW
3186 demand_empty_rest_of_line ();
3187 return;
b99bd4ef
NC
3188 }
3189
c19d1205
ZW
3190#ifdef md_cons_align
3191 md_cons_align (nbytes);
3192#endif
b99bd4ef 3193
c19d1205
ZW
3194 mapping_state (MAP_DATA);
3195 do
b99bd4ef 3196 {
c19d1205
ZW
3197 int reloc;
3198 char *base = input_line_pointer;
b99bd4ef 3199
c19d1205 3200 expression (& exp);
b99bd4ef 3201
c19d1205
ZW
3202 if (exp.X_op != O_symbol)
3203 emit_expr (&exp, (unsigned int) nbytes);
3204 else
3205 {
3206 char *before_reloc = input_line_pointer;
3207 reloc = parse_reloc (&input_line_pointer);
3208 if (reloc == -1)
3209 {
3210 as_bad (_("unrecognized relocation suffix"));
3211 ignore_rest_of_line ();
3212 return;
3213 }
3214 else if (reloc == BFD_RELOC_UNUSED)
3215 emit_expr (&exp, (unsigned int) nbytes);
3216 else
3217 {
21d799b5
NC
3218 reloc_howto_type *howto = (reloc_howto_type *)
3219 bfd_reloc_type_lookup (stdoutput,
3220 (bfd_reloc_code_real_type) reloc);
c19d1205 3221 int size = bfd_get_reloc_size (howto);
b99bd4ef 3222
2fc8bdac
ZW
3223 if (reloc == BFD_RELOC_ARM_PLT32)
3224 {
3225 as_bad (_("(plt) is only valid on branch targets"));
3226 reloc = BFD_RELOC_UNUSED;
3227 size = 0;
3228 }
3229
c19d1205 3230 if (size > nbytes)
2fc8bdac 3231 as_bad (_("%s relocations do not fit in %d bytes"),
c19d1205
ZW
3232 howto->name, nbytes);
3233 else
3234 {
3235 /* We've parsed an expression stopping at O_symbol.
3236 But there may be more expression left now that we
3237 have parsed the relocation marker. Parse it again.
3238 XXX Surely there is a cleaner way to do this. */
3239 char *p = input_line_pointer;
3240 int offset;
21d799b5 3241 char *save_buf = (char *) alloca (input_line_pointer - base);
c19d1205
ZW
3242 memcpy (save_buf, base, input_line_pointer - base);
3243 memmove (base + (input_line_pointer - before_reloc),
3244 base, before_reloc - base);
3245
3246 input_line_pointer = base + (input_line_pointer-before_reloc);
3247 expression (&exp);
3248 memcpy (base, save_buf, p - base);
3249
3250 offset = nbytes - size;
3251 p = frag_more ((int) nbytes);
3252 fix_new_exp (frag_now, p - frag_now->fr_literal + offset,
21d799b5 3253 size, &exp, 0, (enum bfd_reloc_code_real) reloc);
c19d1205
ZW
3254 }
3255 }
3256 }
b99bd4ef 3257 }
c19d1205 3258 while (*input_line_pointer++ == ',');
b99bd4ef 3259
c19d1205
ZW
3260 /* Put terminator back into stream. */
3261 input_line_pointer --;
3262 demand_empty_rest_of_line ();
b99bd4ef
NC
3263}
3264
c921be7d
NC
3265/* Emit an expression containing a 32-bit thumb instruction.
3266 Implementation based on put_thumb32_insn. */
3267
3268static void
3269emit_thumb32_expr (expressionS * exp)
3270{
3271 expressionS exp_high = *exp;
3272
3273 exp_high.X_add_number = (unsigned long)exp_high.X_add_number >> 16;
3274 emit_expr (& exp_high, (unsigned int) THUMB_SIZE);
3275 exp->X_add_number &= 0xffff;
3276 emit_expr (exp, (unsigned int) THUMB_SIZE);
3277}
3278
3279/* Guess the instruction size based on the opcode. */
3280
3281static int
3282thumb_insn_size (int opcode)
3283{
3284 if ((unsigned int) opcode < 0xe800u)
3285 return 2;
3286 else if ((unsigned int) opcode >= 0xe8000000u)
3287 return 4;
3288 else
3289 return 0;
3290}
3291
3292static bfd_boolean
3293emit_insn (expressionS *exp, int nbytes)
3294{
3295 int size = 0;
3296
3297 if (exp->X_op == O_constant)
3298 {
3299 size = nbytes;
3300
3301 if (size == 0)
3302 size = thumb_insn_size (exp->X_add_number);
3303
3304 if (size != 0)
3305 {
3306 if (size == 2 && (unsigned int)exp->X_add_number > 0xffffu)
3307 {
3308 as_bad (_(".inst.n operand too big. "\
3309 "Use .inst.w instead"));
3310 size = 0;
3311 }
3312 else
3313 {
3314 if (now_it.state == AUTOMATIC_IT_BLOCK)
3315 set_it_insn_type_nonvoid (OUTSIDE_IT_INSN, 0);
3316 else
3317 set_it_insn_type_nonvoid (NEUTRAL_IT_INSN, 0);
3318
3319 if (thumb_mode && (size > THUMB_SIZE) && !target_big_endian)
3320 emit_thumb32_expr (exp);
3321 else
3322 emit_expr (exp, (unsigned int) size);
3323
3324 it_fsm_post_encode ();
3325 }
3326 }
3327 else
3328 as_bad (_("cannot determine Thumb instruction size. " \
3329 "Use .inst.n/.inst.w instead"));
3330 }
3331 else
3332 as_bad (_("constant expression required"));
3333
3334 return (size != 0);
3335}
3336
3337/* Like s_arm_elf_cons but do not use md_cons_align and
3338 set the mapping state to MAP_ARM/MAP_THUMB. */
3339
3340static void
3341s_arm_elf_inst (int nbytes)
3342{
3343 if (is_it_end_of_statement ())
3344 {
3345 demand_empty_rest_of_line ();
3346 return;
3347 }
3348
3349 /* Calling mapping_state () here will not change ARM/THUMB,
3350 but will ensure not to be in DATA state. */
3351
3352 if (thumb_mode)
3353 mapping_state (MAP_THUMB);
3354 else
3355 {
3356 if (nbytes != 0)
3357 {
3358 as_bad (_("width suffixes are invalid in ARM mode"));
3359 ignore_rest_of_line ();
3360 return;
3361 }
3362
3363 nbytes = 4;
3364
3365 mapping_state (MAP_ARM);
3366 }
3367
3368 do
3369 {
3370 expressionS exp;
3371
3372 expression (& exp);
3373
3374 if (! emit_insn (& exp, nbytes))
3375 {
3376 ignore_rest_of_line ();
3377 return;
3378 }
3379 }
3380 while (*input_line_pointer++ == ',');
3381
3382 /* Put terminator back into stream. */
3383 input_line_pointer --;
3384 demand_empty_rest_of_line ();
3385}
b99bd4ef 3386
c19d1205 3387/* Parse a .rel31 directive. */
b99bd4ef 3388
c19d1205
ZW
3389static void
3390s_arm_rel31 (int ignored ATTRIBUTE_UNUSED)
3391{
3392 expressionS exp;
3393 char *p;
3394 valueT highbit;
b99bd4ef 3395
c19d1205
ZW
3396 highbit = 0;
3397 if (*input_line_pointer == '1')
3398 highbit = 0x80000000;
3399 else if (*input_line_pointer != '0')
3400 as_bad (_("expected 0 or 1"));
b99bd4ef 3401
c19d1205
ZW
3402 input_line_pointer++;
3403 if (*input_line_pointer != ',')
3404 as_bad (_("missing comma"));
3405 input_line_pointer++;
b99bd4ef 3406
c19d1205
ZW
3407#ifdef md_flush_pending_output
3408 md_flush_pending_output ();
3409#endif
b99bd4ef 3410
c19d1205
ZW
3411#ifdef md_cons_align
3412 md_cons_align (4);
3413#endif
b99bd4ef 3414
c19d1205 3415 mapping_state (MAP_DATA);
b99bd4ef 3416
c19d1205 3417 expression (&exp);
b99bd4ef 3418
c19d1205
ZW
3419 p = frag_more (4);
3420 md_number_to_chars (p, highbit, 4);
3421 fix_new_arm (frag_now, p - frag_now->fr_literal, 4, &exp, 1,
3422 BFD_RELOC_ARM_PREL31);
b99bd4ef 3423
c19d1205 3424 demand_empty_rest_of_line ();
b99bd4ef
NC
3425}
3426
c19d1205 3427/* Directives: AEABI stack-unwind tables. */
b99bd4ef 3428
c19d1205 3429/* Parse an unwind_fnstart directive. Simply records the current location. */
b99bd4ef 3430
c19d1205
ZW
3431static void
3432s_arm_unwind_fnstart (int ignored ATTRIBUTE_UNUSED)
3433{
3434 demand_empty_rest_of_line ();
921e5f0a
PB
3435 if (unwind.proc_start)
3436 {
c921be7d 3437 as_bad (_("duplicate .fnstart directive"));
921e5f0a
PB
3438 return;
3439 }
3440
c19d1205
ZW
3441 /* Mark the start of the function. */
3442 unwind.proc_start = expr_build_dot ();
b99bd4ef 3443
c19d1205
ZW
3444 /* Reset the rest of the unwind info. */
3445 unwind.opcode_count = 0;
3446 unwind.table_entry = NULL;
3447 unwind.personality_routine = NULL;
3448 unwind.personality_index = -1;
3449 unwind.frame_size = 0;
3450 unwind.fp_offset = 0;
fdfde340 3451 unwind.fp_reg = REG_SP;
c19d1205
ZW
3452 unwind.fp_used = 0;
3453 unwind.sp_restored = 0;
3454}
b99bd4ef 3455
b99bd4ef 3456
c19d1205
ZW
3457/* Parse a handlerdata directive. Creates the exception handling table entry
3458 for the function. */
b99bd4ef 3459
c19d1205
ZW
3460static void
3461s_arm_unwind_handlerdata (int ignored ATTRIBUTE_UNUSED)
3462{
3463 demand_empty_rest_of_line ();
921e5f0a 3464 if (!unwind.proc_start)
c921be7d 3465 as_bad (MISSING_FNSTART);
921e5f0a 3466
c19d1205 3467 if (unwind.table_entry)
6decc662 3468 as_bad (_("duplicate .handlerdata directive"));
f02232aa 3469
c19d1205
ZW
3470 create_unwind_entry (1);
3471}
a737bd4d 3472
c19d1205 3473/* Parse an unwind_fnend directive. Generates the index table entry. */
b99bd4ef 3474
c19d1205
ZW
3475static void
3476s_arm_unwind_fnend (int ignored ATTRIBUTE_UNUSED)
3477{
3478 long where;
3479 char *ptr;
3480 valueT val;
940b5ce0 3481 unsigned int marked_pr_dependency;
f02232aa 3482
c19d1205 3483 demand_empty_rest_of_line ();
f02232aa 3484
921e5f0a
PB
3485 if (!unwind.proc_start)
3486 {
c921be7d 3487 as_bad (_(".fnend directive without .fnstart"));
921e5f0a
PB
3488 return;
3489 }
3490
c19d1205
ZW
3491 /* Add eh table entry. */
3492 if (unwind.table_entry == NULL)
3493 val = create_unwind_entry (0);
3494 else
3495 val = 0;
f02232aa 3496
c19d1205
ZW
3497 /* Add index table entry. This is two words. */
3498 start_unwind_section (unwind.saved_seg, 1);
3499 frag_align (2, 0, 0);
3500 record_alignment (now_seg, 2);
b99bd4ef 3501
c19d1205
ZW
3502 ptr = frag_more (8);
3503 where = frag_now_fix () - 8;
f02232aa 3504
c19d1205
ZW
3505 /* Self relative offset of the function start. */
3506 fix_new (frag_now, where, 4, unwind.proc_start, 0, 1,
3507 BFD_RELOC_ARM_PREL31);
f02232aa 3508
c19d1205
ZW
3509 /* Indicate dependency on EHABI-defined personality routines to the
3510 linker, if it hasn't been done already. */
940b5ce0
DJ
3511 marked_pr_dependency
3512 = seg_info (now_seg)->tc_segment_info_data.marked_pr_dependency;
c19d1205
ZW
3513 if (unwind.personality_index >= 0 && unwind.personality_index < 3
3514 && !(marked_pr_dependency & (1 << unwind.personality_index)))
3515 {
5f4273c7
NC
3516 static const char *const name[] =
3517 {
3518 "__aeabi_unwind_cpp_pr0",
3519 "__aeabi_unwind_cpp_pr1",
3520 "__aeabi_unwind_cpp_pr2"
3521 };
c19d1205
ZW
3522 symbolS *pr = symbol_find_or_make (name[unwind.personality_index]);
3523 fix_new (frag_now, where, 0, pr, 0, 1, BFD_RELOC_NONE);
c19d1205 3524 seg_info (now_seg)->tc_segment_info_data.marked_pr_dependency
940b5ce0 3525 |= 1 << unwind.personality_index;
c19d1205 3526 }
f02232aa 3527
c19d1205
ZW
3528 if (val)
3529 /* Inline exception table entry. */
3530 md_number_to_chars (ptr + 4, val, 4);
3531 else
3532 /* Self relative offset of the table entry. */
3533 fix_new (frag_now, where + 4, 4, unwind.table_entry, 0, 1,
3534 BFD_RELOC_ARM_PREL31);
f02232aa 3535
c19d1205
ZW
3536 /* Restore the original section. */
3537 subseg_set (unwind.saved_seg, unwind.saved_subseg);
921e5f0a
PB
3538
3539 unwind.proc_start = NULL;
c19d1205 3540}
f02232aa 3541
f02232aa 3542
c19d1205 3543/* Parse an unwind_cantunwind directive. */
b99bd4ef 3544
c19d1205
ZW
3545static void
3546s_arm_unwind_cantunwind (int ignored ATTRIBUTE_UNUSED)
3547{
3548 demand_empty_rest_of_line ();
921e5f0a 3549 if (!unwind.proc_start)
c921be7d 3550 as_bad (MISSING_FNSTART);
921e5f0a 3551
c19d1205
ZW
3552 if (unwind.personality_routine || unwind.personality_index != -1)
3553 as_bad (_("personality routine specified for cantunwind frame"));
b99bd4ef 3554
c19d1205
ZW
3555 unwind.personality_index = -2;
3556}
b99bd4ef 3557
b99bd4ef 3558
c19d1205 3559/* Parse a personalityindex directive. */
b99bd4ef 3560
c19d1205
ZW
3561static void
3562s_arm_unwind_personalityindex (int ignored ATTRIBUTE_UNUSED)
3563{
3564 expressionS exp;
b99bd4ef 3565
921e5f0a 3566 if (!unwind.proc_start)
c921be7d 3567 as_bad (MISSING_FNSTART);
921e5f0a 3568
c19d1205
ZW
3569 if (unwind.personality_routine || unwind.personality_index != -1)
3570 as_bad (_("duplicate .personalityindex directive"));
b99bd4ef 3571
c19d1205 3572 expression (&exp);
b99bd4ef 3573
c19d1205
ZW
3574 if (exp.X_op != O_constant
3575 || exp.X_add_number < 0 || exp.X_add_number > 15)
b99bd4ef 3576 {
c19d1205
ZW
3577 as_bad (_("bad personality routine number"));
3578 ignore_rest_of_line ();
3579 return;
b99bd4ef
NC
3580 }
3581
c19d1205 3582 unwind.personality_index = exp.X_add_number;
b99bd4ef 3583
c19d1205
ZW
3584 demand_empty_rest_of_line ();
3585}
e16bb312 3586
e16bb312 3587
c19d1205 3588/* Parse a personality directive. */
e16bb312 3589
c19d1205
ZW
3590static void
3591s_arm_unwind_personality (int ignored ATTRIBUTE_UNUSED)
3592{
3593 char *name, *p, c;
a737bd4d 3594
921e5f0a 3595 if (!unwind.proc_start)
c921be7d 3596 as_bad (MISSING_FNSTART);
921e5f0a 3597
c19d1205
ZW
3598 if (unwind.personality_routine || unwind.personality_index != -1)
3599 as_bad (_("duplicate .personality directive"));
a737bd4d 3600
c19d1205
ZW
3601 name = input_line_pointer;
3602 c = get_symbol_end ();
3603 p = input_line_pointer;
3604 unwind.personality_routine = symbol_find_or_make (name);
3605 *p = c;
3606 demand_empty_rest_of_line ();
3607}
e16bb312 3608
e16bb312 3609
c19d1205 3610/* Parse a directive saving core registers. */
e16bb312 3611
c19d1205
ZW
3612static void
3613s_arm_unwind_save_core (void)
e16bb312 3614{
c19d1205
ZW
3615 valueT op;
3616 long range;
3617 int n;
e16bb312 3618
c19d1205
ZW
3619 range = parse_reg_list (&input_line_pointer);
3620 if (range == FAIL)
e16bb312 3621 {
c19d1205
ZW
3622 as_bad (_("expected register list"));
3623 ignore_rest_of_line ();
3624 return;
3625 }
e16bb312 3626
c19d1205 3627 demand_empty_rest_of_line ();
e16bb312 3628
c19d1205
ZW
3629 /* Turn .unwind_movsp ip followed by .unwind_save {..., ip, ...}
3630 into .unwind_save {..., sp...}. We aren't bothered about the value of
3631 ip because it is clobbered by calls. */
3632 if (unwind.sp_restored && unwind.fp_reg == 12
3633 && (range & 0x3000) == 0x1000)
3634 {
3635 unwind.opcode_count--;
3636 unwind.sp_restored = 0;
3637 range = (range | 0x2000) & ~0x1000;
3638 unwind.pending_offset = 0;
3639 }
e16bb312 3640
01ae4198
DJ
3641 /* Pop r4-r15. */
3642 if (range & 0xfff0)
c19d1205 3643 {
01ae4198
DJ
3644 /* See if we can use the short opcodes. These pop a block of up to 8
3645 registers starting with r4, plus maybe r14. */
3646 for (n = 0; n < 8; n++)
3647 {
3648 /* Break at the first non-saved register. */
3649 if ((range & (1 << (n + 4))) == 0)
3650 break;
3651 }
3652 /* See if there are any other bits set. */
3653 if (n == 0 || (range & (0xfff0 << n) & 0xbff0) != 0)
3654 {
3655 /* Use the long form. */
3656 op = 0x8000 | ((range >> 4) & 0xfff);
3657 add_unwind_opcode (op, 2);
3658 }
0dd132b6 3659 else
01ae4198
DJ
3660 {
3661 /* Use the short form. */
3662 if (range & 0x4000)
3663 op = 0xa8; /* Pop r14. */
3664 else
3665 op = 0xa0; /* Do not pop r14. */
3666 op |= (n - 1);
3667 add_unwind_opcode (op, 1);
3668 }
c19d1205 3669 }
0dd132b6 3670
c19d1205
ZW
3671 /* Pop r0-r3. */
3672 if (range & 0xf)
3673 {
3674 op = 0xb100 | (range & 0xf);
3675 add_unwind_opcode (op, 2);
0dd132b6
NC
3676 }
3677
c19d1205
ZW
3678 /* Record the number of bytes pushed. */
3679 for (n = 0; n < 16; n++)
3680 {
3681 if (range & (1 << n))
3682 unwind.frame_size += 4;
3683 }
0dd132b6
NC
3684}
3685
c19d1205
ZW
3686
3687/* Parse a directive saving FPA registers. */
b99bd4ef
NC
3688
3689static void
c19d1205 3690s_arm_unwind_save_fpa (int reg)
b99bd4ef 3691{
c19d1205
ZW
3692 expressionS exp;
3693 int num_regs;
3694 valueT op;
b99bd4ef 3695
c19d1205
ZW
3696 /* Get Number of registers to transfer. */
3697 if (skip_past_comma (&input_line_pointer) != FAIL)
3698 expression (&exp);
3699 else
3700 exp.X_op = O_illegal;
b99bd4ef 3701
c19d1205 3702 if (exp.X_op != O_constant)
b99bd4ef 3703 {
c19d1205
ZW
3704 as_bad (_("expected , <constant>"));
3705 ignore_rest_of_line ();
b99bd4ef
NC
3706 return;
3707 }
3708
c19d1205
ZW
3709 num_regs = exp.X_add_number;
3710
3711 if (num_regs < 1 || num_regs > 4)
b99bd4ef 3712 {
c19d1205
ZW
3713 as_bad (_("number of registers must be in the range [1:4]"));
3714 ignore_rest_of_line ();
b99bd4ef
NC
3715 return;
3716 }
3717
c19d1205 3718 demand_empty_rest_of_line ();
b99bd4ef 3719
c19d1205
ZW
3720 if (reg == 4)
3721 {
3722 /* Short form. */
3723 op = 0xb4 | (num_regs - 1);
3724 add_unwind_opcode (op, 1);
3725 }
b99bd4ef
NC
3726 else
3727 {
c19d1205
ZW
3728 /* Long form. */
3729 op = 0xc800 | (reg << 4) | (num_regs - 1);
3730 add_unwind_opcode (op, 2);
b99bd4ef 3731 }
c19d1205 3732 unwind.frame_size += num_regs * 12;
b99bd4ef
NC
3733}
3734
c19d1205 3735
fa073d69
MS
3736/* Parse a directive saving VFP registers for ARMv6 and above. */
3737
3738static void
3739s_arm_unwind_save_vfp_armv6 (void)
3740{
3741 int count;
3742 unsigned int start;
3743 valueT op;
3744 int num_vfpv3_regs = 0;
3745 int num_regs_below_16;
3746
3747 count = parse_vfp_reg_list (&input_line_pointer, &start, REGLIST_VFP_D);
3748 if (count == FAIL)
3749 {
3750 as_bad (_("expected register list"));
3751 ignore_rest_of_line ();
3752 return;
3753 }
3754
3755 demand_empty_rest_of_line ();
3756
3757 /* We always generate FSTMD/FLDMD-style unwinding opcodes (rather
3758 than FSTMX/FLDMX-style ones). */
3759
3760 /* Generate opcode for (VFPv3) registers numbered in the range 16 .. 31. */
3761 if (start >= 16)
3762 num_vfpv3_regs = count;
3763 else if (start + count > 16)
3764 num_vfpv3_regs = start + count - 16;
3765
3766 if (num_vfpv3_regs > 0)
3767 {
3768 int start_offset = start > 16 ? start - 16 : 0;
3769 op = 0xc800 | (start_offset << 4) | (num_vfpv3_regs - 1);
3770 add_unwind_opcode (op, 2);
3771 }
3772
3773 /* Generate opcode for registers numbered in the range 0 .. 15. */
3774 num_regs_below_16 = num_vfpv3_regs > 0 ? 16 - (int) start : count;
9c2799c2 3775 gas_assert (num_regs_below_16 + num_vfpv3_regs == count);
fa073d69
MS
3776 if (num_regs_below_16 > 0)
3777 {
3778 op = 0xc900 | (start << 4) | (num_regs_below_16 - 1);
3779 add_unwind_opcode (op, 2);
3780 }
3781
3782 unwind.frame_size += count * 8;
3783}
3784
3785
3786/* Parse a directive saving VFP registers for pre-ARMv6. */
b99bd4ef
NC
3787
3788static void
c19d1205 3789s_arm_unwind_save_vfp (void)
b99bd4ef 3790{
c19d1205 3791 int count;
ca3f61f7 3792 unsigned int reg;
c19d1205 3793 valueT op;
b99bd4ef 3794
5287ad62 3795 count = parse_vfp_reg_list (&input_line_pointer, &reg, REGLIST_VFP_D);
c19d1205 3796 if (count == FAIL)
b99bd4ef 3797 {
c19d1205
ZW
3798 as_bad (_("expected register list"));
3799 ignore_rest_of_line ();
b99bd4ef
NC
3800 return;
3801 }
3802
c19d1205 3803 demand_empty_rest_of_line ();
b99bd4ef 3804
c19d1205 3805 if (reg == 8)
b99bd4ef 3806 {
c19d1205
ZW
3807 /* Short form. */
3808 op = 0xb8 | (count - 1);
3809 add_unwind_opcode (op, 1);
b99bd4ef 3810 }
c19d1205 3811 else
b99bd4ef 3812 {
c19d1205
ZW
3813 /* Long form. */
3814 op = 0xb300 | (reg << 4) | (count - 1);
3815 add_unwind_opcode (op, 2);
b99bd4ef 3816 }
c19d1205
ZW
3817 unwind.frame_size += count * 8 + 4;
3818}
b99bd4ef 3819
b99bd4ef 3820
c19d1205
ZW
3821/* Parse a directive saving iWMMXt data registers. */
3822
3823static void
3824s_arm_unwind_save_mmxwr (void)
3825{
3826 int reg;
3827 int hi_reg;
3828 int i;
3829 unsigned mask = 0;
3830 valueT op;
b99bd4ef 3831
c19d1205
ZW
3832 if (*input_line_pointer == '{')
3833 input_line_pointer++;
b99bd4ef 3834
c19d1205 3835 do
b99bd4ef 3836 {
dcbf9037 3837 reg = arm_reg_parse (&input_line_pointer, REG_TYPE_MMXWR);
b99bd4ef 3838
c19d1205 3839 if (reg == FAIL)
b99bd4ef 3840 {
9b7132d3 3841 as_bad ("%s", _(reg_expected_msgs[REG_TYPE_MMXWR]));
c19d1205 3842 goto error;
b99bd4ef
NC
3843 }
3844
c19d1205
ZW
3845 if (mask >> reg)
3846 as_tsktsk (_("register list not in ascending order"));
3847 mask |= 1 << reg;
b99bd4ef 3848
c19d1205
ZW
3849 if (*input_line_pointer == '-')
3850 {
3851 input_line_pointer++;
dcbf9037 3852 hi_reg = arm_reg_parse (&input_line_pointer, REG_TYPE_MMXWR);
c19d1205
ZW
3853 if (hi_reg == FAIL)
3854 {
9b7132d3 3855 as_bad ("%s", _(reg_expected_msgs[REG_TYPE_MMXWR]));
c19d1205
ZW
3856 goto error;
3857 }
3858 else if (reg >= hi_reg)
3859 {
3860 as_bad (_("bad register range"));
3861 goto error;
3862 }
3863 for (; reg < hi_reg; reg++)
3864 mask |= 1 << reg;
3865 }
3866 }
3867 while (skip_past_comma (&input_line_pointer) != FAIL);
b99bd4ef 3868
c19d1205
ZW
3869 if (*input_line_pointer == '}')
3870 input_line_pointer++;
b99bd4ef 3871
c19d1205 3872 demand_empty_rest_of_line ();
b99bd4ef 3873
708587a4 3874 /* Generate any deferred opcodes because we're going to be looking at
c19d1205
ZW
3875 the list. */
3876 flush_pending_unwind ();
b99bd4ef 3877
c19d1205 3878 for (i = 0; i < 16; i++)
b99bd4ef 3879 {
c19d1205
ZW
3880 if (mask & (1 << i))
3881 unwind.frame_size += 8;
b99bd4ef
NC
3882 }
3883
c19d1205
ZW
3884 /* Attempt to combine with a previous opcode. We do this because gcc
3885 likes to output separate unwind directives for a single block of
3886 registers. */
3887 if (unwind.opcode_count > 0)
b99bd4ef 3888 {
c19d1205
ZW
3889 i = unwind.opcodes[unwind.opcode_count - 1];
3890 if ((i & 0xf8) == 0xc0)
3891 {
3892 i &= 7;
3893 /* Only merge if the blocks are contiguous. */
3894 if (i < 6)
3895 {
3896 if ((mask & 0xfe00) == (1 << 9))
3897 {
3898 mask |= ((1 << (i + 11)) - 1) & 0xfc00;
3899 unwind.opcode_count--;
3900 }
3901 }
3902 else if (i == 6 && unwind.opcode_count >= 2)
3903 {
3904 i = unwind.opcodes[unwind.opcode_count - 2];
3905 reg = i >> 4;
3906 i &= 0xf;
b99bd4ef 3907
c19d1205
ZW
3908 op = 0xffff << (reg - 1);
3909 if (reg > 0
87a1fd79 3910 && ((mask & op) == (1u << (reg - 1))))
c19d1205
ZW
3911 {
3912 op = (1 << (reg + i + 1)) - 1;
3913 op &= ~((1 << reg) - 1);
3914 mask |= op;
3915 unwind.opcode_count -= 2;
3916 }
3917 }
3918 }
b99bd4ef
NC
3919 }
3920
c19d1205
ZW
3921 hi_reg = 15;
3922 /* We want to generate opcodes in the order the registers have been
3923 saved, ie. descending order. */
3924 for (reg = 15; reg >= -1; reg--)
b99bd4ef 3925 {
c19d1205
ZW
3926 /* Save registers in blocks. */
3927 if (reg < 0
3928 || !(mask & (1 << reg)))
3929 {
3930 /* We found an unsaved reg. Generate opcodes to save the
5f4273c7 3931 preceding block. */
c19d1205
ZW
3932 if (reg != hi_reg)
3933 {
3934 if (reg == 9)
3935 {
3936 /* Short form. */
3937 op = 0xc0 | (hi_reg - 10);
3938 add_unwind_opcode (op, 1);
3939 }
3940 else
3941 {
3942 /* Long form. */
3943 op = 0xc600 | ((reg + 1) << 4) | ((hi_reg - reg) - 1);
3944 add_unwind_opcode (op, 2);
3945 }
3946 }
3947 hi_reg = reg - 1;
3948 }
b99bd4ef
NC
3949 }
3950
c19d1205
ZW
3951 return;
3952error:
3953 ignore_rest_of_line ();
b99bd4ef
NC
3954}
3955
3956static void
c19d1205 3957s_arm_unwind_save_mmxwcg (void)
b99bd4ef 3958{
c19d1205
ZW
3959 int reg;
3960 int hi_reg;
3961 unsigned mask = 0;
3962 valueT op;
b99bd4ef 3963
c19d1205
ZW
3964 if (*input_line_pointer == '{')
3965 input_line_pointer++;
b99bd4ef 3966
c19d1205 3967 do
b99bd4ef 3968 {
dcbf9037 3969 reg = arm_reg_parse (&input_line_pointer, REG_TYPE_MMXWCG);
b99bd4ef 3970
c19d1205
ZW
3971 if (reg == FAIL)
3972 {
9b7132d3 3973 as_bad ("%s", _(reg_expected_msgs[REG_TYPE_MMXWCG]));
c19d1205
ZW
3974 goto error;
3975 }
b99bd4ef 3976
c19d1205
ZW
3977 reg -= 8;
3978 if (mask >> reg)
3979 as_tsktsk (_("register list not in ascending order"));
3980 mask |= 1 << reg;
b99bd4ef 3981
c19d1205
ZW
3982 if (*input_line_pointer == '-')
3983 {
3984 input_line_pointer++;
dcbf9037 3985 hi_reg = arm_reg_parse (&input_line_pointer, REG_TYPE_MMXWCG);
c19d1205
ZW
3986 if (hi_reg == FAIL)
3987 {
9b7132d3 3988 as_bad ("%s", _(reg_expected_msgs[REG_TYPE_MMXWCG]));
c19d1205
ZW
3989 goto error;
3990 }
3991 else if (reg >= hi_reg)
3992 {
3993 as_bad (_("bad register range"));
3994 goto error;
3995 }
3996 for (; reg < hi_reg; reg++)
3997 mask |= 1 << reg;
3998 }
b99bd4ef 3999 }
c19d1205 4000 while (skip_past_comma (&input_line_pointer) != FAIL);
b99bd4ef 4001
c19d1205
ZW
4002 if (*input_line_pointer == '}')
4003 input_line_pointer++;
b99bd4ef 4004
c19d1205
ZW
4005 demand_empty_rest_of_line ();
4006
708587a4 4007 /* Generate any deferred opcodes because we're going to be looking at
c19d1205
ZW
4008 the list. */
4009 flush_pending_unwind ();
b99bd4ef 4010
c19d1205 4011 for (reg = 0; reg < 16; reg++)
b99bd4ef 4012 {
c19d1205
ZW
4013 if (mask & (1 << reg))
4014 unwind.frame_size += 4;
b99bd4ef 4015 }
c19d1205
ZW
4016 op = 0xc700 | mask;
4017 add_unwind_opcode (op, 2);
4018 return;
4019error:
4020 ignore_rest_of_line ();
b99bd4ef
NC
4021}
4022
c19d1205 4023
fa073d69
MS
4024/* Parse an unwind_save directive.
4025 If the argument is non-zero, this is a .vsave directive. */
c19d1205 4026
b99bd4ef 4027static void
fa073d69 4028s_arm_unwind_save (int arch_v6)
b99bd4ef 4029{
c19d1205
ZW
4030 char *peek;
4031 struct reg_entry *reg;
4032 bfd_boolean had_brace = FALSE;
b99bd4ef 4033
921e5f0a 4034 if (!unwind.proc_start)
c921be7d 4035 as_bad (MISSING_FNSTART);
921e5f0a 4036
c19d1205
ZW
4037 /* Figure out what sort of save we have. */
4038 peek = input_line_pointer;
b99bd4ef 4039
c19d1205 4040 if (*peek == '{')
b99bd4ef 4041 {
c19d1205
ZW
4042 had_brace = TRUE;
4043 peek++;
b99bd4ef
NC
4044 }
4045
c19d1205 4046 reg = arm_reg_parse_multi (&peek);
b99bd4ef 4047
c19d1205 4048 if (!reg)
b99bd4ef 4049 {
c19d1205
ZW
4050 as_bad (_("register expected"));
4051 ignore_rest_of_line ();
b99bd4ef
NC
4052 return;
4053 }
4054
c19d1205 4055 switch (reg->type)
b99bd4ef 4056 {
c19d1205
ZW
4057 case REG_TYPE_FN:
4058 if (had_brace)
4059 {
4060 as_bad (_("FPA .unwind_save does not take a register list"));
4061 ignore_rest_of_line ();
4062 return;
4063 }
93ac2687 4064 input_line_pointer = peek;
c19d1205 4065 s_arm_unwind_save_fpa (reg->number);
b99bd4ef 4066 return;
c19d1205
ZW
4067
4068 case REG_TYPE_RN: s_arm_unwind_save_core (); return;
fa073d69
MS
4069 case REG_TYPE_VFD:
4070 if (arch_v6)
4071 s_arm_unwind_save_vfp_armv6 ();
4072 else
4073 s_arm_unwind_save_vfp ();
4074 return;
c19d1205
ZW
4075 case REG_TYPE_MMXWR: s_arm_unwind_save_mmxwr (); return;
4076 case REG_TYPE_MMXWCG: s_arm_unwind_save_mmxwcg (); return;
4077
4078 default:
4079 as_bad (_(".unwind_save does not support this kind of register"));
4080 ignore_rest_of_line ();
b99bd4ef 4081 }
c19d1205 4082}
b99bd4ef 4083
b99bd4ef 4084
c19d1205
ZW
4085/* Parse an unwind_movsp directive. */
4086
4087static void
4088s_arm_unwind_movsp (int ignored ATTRIBUTE_UNUSED)
4089{
4090 int reg;
4091 valueT op;
4fa3602b 4092 int offset;
c19d1205 4093
921e5f0a 4094 if (!unwind.proc_start)
c921be7d 4095 as_bad (MISSING_FNSTART);
921e5f0a 4096
dcbf9037 4097 reg = arm_reg_parse (&input_line_pointer, REG_TYPE_RN);
c19d1205 4098 if (reg == FAIL)
b99bd4ef 4099 {
9b7132d3 4100 as_bad ("%s", _(reg_expected_msgs[REG_TYPE_RN]));
c19d1205 4101 ignore_rest_of_line ();
b99bd4ef
NC
4102 return;
4103 }
4fa3602b
PB
4104
4105 /* Optional constant. */
4106 if (skip_past_comma (&input_line_pointer) != FAIL)
4107 {
4108 if (immediate_for_directive (&offset) == FAIL)
4109 return;
4110 }
4111 else
4112 offset = 0;
4113
c19d1205 4114 demand_empty_rest_of_line ();
b99bd4ef 4115
c19d1205 4116 if (reg == REG_SP || reg == REG_PC)
b99bd4ef 4117 {
c19d1205 4118 as_bad (_("SP and PC not permitted in .unwind_movsp directive"));
b99bd4ef
NC
4119 return;
4120 }
4121
c19d1205
ZW
4122 if (unwind.fp_reg != REG_SP)
4123 as_bad (_("unexpected .unwind_movsp directive"));
b99bd4ef 4124
c19d1205
ZW
4125 /* Generate opcode to restore the value. */
4126 op = 0x90 | reg;
4127 add_unwind_opcode (op, 1);
4128
4129 /* Record the information for later. */
4130 unwind.fp_reg = reg;
4fa3602b 4131 unwind.fp_offset = unwind.frame_size - offset;
c19d1205 4132 unwind.sp_restored = 1;
b05fe5cf
ZW
4133}
4134
c19d1205
ZW
4135/* Parse an unwind_pad directive. */
4136
b05fe5cf 4137static void
c19d1205 4138s_arm_unwind_pad (int ignored ATTRIBUTE_UNUSED)
b05fe5cf 4139{
c19d1205 4140 int offset;
b05fe5cf 4141
921e5f0a 4142 if (!unwind.proc_start)
c921be7d 4143 as_bad (MISSING_FNSTART);
921e5f0a 4144
c19d1205
ZW
4145 if (immediate_for_directive (&offset) == FAIL)
4146 return;
b99bd4ef 4147
c19d1205
ZW
4148 if (offset & 3)
4149 {
4150 as_bad (_("stack increment must be multiple of 4"));
4151 ignore_rest_of_line ();
4152 return;
4153 }
b99bd4ef 4154
c19d1205
ZW
4155 /* Don't generate any opcodes, just record the details for later. */
4156 unwind.frame_size += offset;
4157 unwind.pending_offset += offset;
4158
4159 demand_empty_rest_of_line ();
4160}
4161
4162/* Parse an unwind_setfp directive. */
4163
4164static void
4165s_arm_unwind_setfp (int ignored ATTRIBUTE_UNUSED)
b99bd4ef 4166{
c19d1205
ZW
4167 int sp_reg;
4168 int fp_reg;
4169 int offset;
4170
921e5f0a 4171 if (!unwind.proc_start)
c921be7d 4172 as_bad (MISSING_FNSTART);
921e5f0a 4173
dcbf9037 4174 fp_reg = arm_reg_parse (&input_line_pointer, REG_TYPE_RN);
c19d1205
ZW
4175 if (skip_past_comma (&input_line_pointer) == FAIL)
4176 sp_reg = FAIL;
4177 else
dcbf9037 4178 sp_reg = arm_reg_parse (&input_line_pointer, REG_TYPE_RN);
b99bd4ef 4179
c19d1205
ZW
4180 if (fp_reg == FAIL || sp_reg == FAIL)
4181 {
4182 as_bad (_("expected <reg>, <reg>"));
4183 ignore_rest_of_line ();
4184 return;
4185 }
b99bd4ef 4186
c19d1205
ZW
4187 /* Optional constant. */
4188 if (skip_past_comma (&input_line_pointer) != FAIL)
4189 {
4190 if (immediate_for_directive (&offset) == FAIL)
4191 return;
4192 }
4193 else
4194 offset = 0;
a737bd4d 4195
c19d1205 4196 demand_empty_rest_of_line ();
a737bd4d 4197
fdfde340 4198 if (sp_reg != REG_SP && sp_reg != unwind.fp_reg)
a737bd4d 4199 {
c19d1205
ZW
4200 as_bad (_("register must be either sp or set by a previous"
4201 "unwind_movsp directive"));
4202 return;
a737bd4d
NC
4203 }
4204
c19d1205
ZW
4205 /* Don't generate any opcodes, just record the information for later. */
4206 unwind.fp_reg = fp_reg;
4207 unwind.fp_used = 1;
fdfde340 4208 if (sp_reg == REG_SP)
c19d1205
ZW
4209 unwind.fp_offset = unwind.frame_size - offset;
4210 else
4211 unwind.fp_offset -= offset;
a737bd4d
NC
4212}
4213
c19d1205
ZW
4214/* Parse an unwind_raw directive. */
4215
4216static void
4217s_arm_unwind_raw (int ignored ATTRIBUTE_UNUSED)
a737bd4d 4218{
c19d1205 4219 expressionS exp;
708587a4 4220 /* This is an arbitrary limit. */
c19d1205
ZW
4221 unsigned char op[16];
4222 int count;
a737bd4d 4223
921e5f0a 4224 if (!unwind.proc_start)
c921be7d 4225 as_bad (MISSING_FNSTART);
921e5f0a 4226
c19d1205
ZW
4227 expression (&exp);
4228 if (exp.X_op == O_constant
4229 && skip_past_comma (&input_line_pointer) != FAIL)
a737bd4d 4230 {
c19d1205
ZW
4231 unwind.frame_size += exp.X_add_number;
4232 expression (&exp);
4233 }
4234 else
4235 exp.X_op = O_illegal;
a737bd4d 4236
c19d1205
ZW
4237 if (exp.X_op != O_constant)
4238 {
4239 as_bad (_("expected <offset>, <opcode>"));
4240 ignore_rest_of_line ();
4241 return;
4242 }
a737bd4d 4243
c19d1205 4244 count = 0;
a737bd4d 4245
c19d1205
ZW
4246 /* Parse the opcode. */
4247 for (;;)
4248 {
4249 if (count >= 16)
4250 {
4251 as_bad (_("unwind opcode too long"));
4252 ignore_rest_of_line ();
a737bd4d 4253 }
c19d1205 4254 if (exp.X_op != O_constant || exp.X_add_number & ~0xff)
a737bd4d 4255 {
c19d1205
ZW
4256 as_bad (_("invalid unwind opcode"));
4257 ignore_rest_of_line ();
4258 return;
a737bd4d 4259 }
c19d1205 4260 op[count++] = exp.X_add_number;
a737bd4d 4261
c19d1205
ZW
4262 /* Parse the next byte. */
4263 if (skip_past_comma (&input_line_pointer) == FAIL)
4264 break;
a737bd4d 4265
c19d1205
ZW
4266 expression (&exp);
4267 }
b99bd4ef 4268
c19d1205
ZW
4269 /* Add the opcode bytes in reverse order. */
4270 while (count--)
4271 add_unwind_opcode (op[count], 1);
b99bd4ef 4272
c19d1205 4273 demand_empty_rest_of_line ();
b99bd4ef 4274}
ee065d83
PB
4275
4276
4277/* Parse a .eabi_attribute directive. */
4278
4279static void
4280s_arm_eabi_attribute (int ignored ATTRIBUTE_UNUSED)
4281{
ee3c0378
AS
4282 int tag = s_vendor_attribute (OBJ_ATTR_PROC);
4283
4284 if (tag < NUM_KNOWN_OBJ_ATTRIBUTES)
4285 attributes_set_explicitly[tag] = 1;
ee065d83
PB
4286}
4287
0855e32b
NS
4288/* Emit a tls fix for the symbol. */
4289
4290static void
4291s_arm_tls_descseq (int ignored ATTRIBUTE_UNUSED)
4292{
4293 char *p;
4294 expressionS exp;
4295#ifdef md_flush_pending_output
4296 md_flush_pending_output ();
4297#endif
4298
4299#ifdef md_cons_align
4300 md_cons_align (4);
4301#endif
4302
4303 /* Since we're just labelling the code, there's no need to define a
4304 mapping symbol. */
4305 expression (&exp);
4306 p = obstack_next_free (&frchain_now->frch_obstack);
4307 fix_new_arm (frag_now, p - frag_now->fr_literal, 4, &exp, 0,
4308 thumb_mode ? BFD_RELOC_ARM_THM_TLS_DESCSEQ
4309 : BFD_RELOC_ARM_TLS_DESCSEQ);
4310}
cdf9ccec 4311#endif /* OBJ_ELF */
0855e32b 4312
ee065d83 4313static void s_arm_arch (int);
7a1d4c38 4314static void s_arm_object_arch (int);
ee065d83
PB
4315static void s_arm_cpu (int);
4316static void s_arm_fpu (int);
69133863 4317static void s_arm_arch_extension (int);
b99bd4ef 4318
f0927246
NC
4319#ifdef TE_PE
4320
4321static void
5f4273c7 4322pe_directive_secrel (int dummy ATTRIBUTE_UNUSED)
f0927246
NC
4323{
4324 expressionS exp;
4325
4326 do
4327 {
4328 expression (&exp);
4329 if (exp.X_op == O_symbol)
4330 exp.X_op = O_secrel;
4331
4332 emit_expr (&exp, 4);
4333 }
4334 while (*input_line_pointer++ == ',');
4335
4336 input_line_pointer--;
4337 demand_empty_rest_of_line ();
4338}
4339#endif /* TE_PE */
4340
c19d1205
ZW
4341/* This table describes all the machine specific pseudo-ops the assembler
4342 has to support. The fields are:
4343 pseudo-op name without dot
4344 function to call to execute this pseudo-op
4345 Integer arg to pass to the function. */
b99bd4ef 4346
c19d1205 4347const pseudo_typeS md_pseudo_table[] =
b99bd4ef 4348{
c19d1205
ZW
4349 /* Never called because '.req' does not start a line. */
4350 { "req", s_req, 0 },
dcbf9037
JB
4351 /* Following two are likewise never called. */
4352 { "dn", s_dn, 0 },
4353 { "qn", s_qn, 0 },
c19d1205
ZW
4354 { "unreq", s_unreq, 0 },
4355 { "bss", s_bss, 0 },
4356 { "align", s_align, 0 },
4357 { "arm", s_arm, 0 },
4358 { "thumb", s_thumb, 0 },
4359 { "code", s_code, 0 },
4360 { "force_thumb", s_force_thumb, 0 },
4361 { "thumb_func", s_thumb_func, 0 },
4362 { "thumb_set", s_thumb_set, 0 },
4363 { "even", s_even, 0 },
4364 { "ltorg", s_ltorg, 0 },
4365 { "pool", s_ltorg, 0 },
4366 { "syntax", s_syntax, 0 },
8463be01
PB
4367 { "cpu", s_arm_cpu, 0 },
4368 { "arch", s_arm_arch, 0 },
7a1d4c38 4369 { "object_arch", s_arm_object_arch, 0 },
8463be01 4370 { "fpu", s_arm_fpu, 0 },
69133863 4371 { "arch_extension", s_arm_arch_extension, 0 },
c19d1205 4372#ifdef OBJ_ELF
c921be7d
NC
4373 { "word", s_arm_elf_cons, 4 },
4374 { "long", s_arm_elf_cons, 4 },
4375 { "inst.n", s_arm_elf_inst, 2 },
4376 { "inst.w", s_arm_elf_inst, 4 },
4377 { "inst", s_arm_elf_inst, 0 },
4378 { "rel31", s_arm_rel31, 0 },
c19d1205
ZW
4379 { "fnstart", s_arm_unwind_fnstart, 0 },
4380 { "fnend", s_arm_unwind_fnend, 0 },
4381 { "cantunwind", s_arm_unwind_cantunwind, 0 },
4382 { "personality", s_arm_unwind_personality, 0 },
4383 { "personalityindex", s_arm_unwind_personalityindex, 0 },
4384 { "handlerdata", s_arm_unwind_handlerdata, 0 },
4385 { "save", s_arm_unwind_save, 0 },
fa073d69 4386 { "vsave", s_arm_unwind_save, 1 },
c19d1205
ZW
4387 { "movsp", s_arm_unwind_movsp, 0 },
4388 { "pad", s_arm_unwind_pad, 0 },
4389 { "setfp", s_arm_unwind_setfp, 0 },
4390 { "unwind_raw", s_arm_unwind_raw, 0 },
ee065d83 4391 { "eabi_attribute", s_arm_eabi_attribute, 0 },
0855e32b 4392 { "tlsdescseq", s_arm_tls_descseq, 0 },
c19d1205
ZW
4393#else
4394 { "word", cons, 4},
f0927246
NC
4395
4396 /* These are used for dwarf. */
4397 {"2byte", cons, 2},
4398 {"4byte", cons, 4},
4399 {"8byte", cons, 8},
4400 /* These are used for dwarf2. */
4401 { "file", (void (*) (int)) dwarf2_directive_file, 0 },
4402 { "loc", dwarf2_directive_loc, 0 },
4403 { "loc_mark_labels", dwarf2_directive_loc_mark_labels, 0 },
c19d1205
ZW
4404#endif
4405 { "extend", float_cons, 'x' },
4406 { "ldouble", float_cons, 'x' },
4407 { "packed", float_cons, 'p' },
f0927246
NC
4408#ifdef TE_PE
4409 {"secrel32", pe_directive_secrel, 0},
4410#endif
c19d1205
ZW
4411 { 0, 0, 0 }
4412};
4413\f
4414/* Parser functions used exclusively in instruction operands. */
b99bd4ef 4415
c19d1205
ZW
4416/* Generic immediate-value read function for use in insn parsing.
4417 STR points to the beginning of the immediate (the leading #);
4418 VAL receives the value; if the value is outside [MIN, MAX]
4419 issue an error. PREFIX_OPT is true if the immediate prefix is
4420 optional. */
b99bd4ef 4421
c19d1205
ZW
4422static int
4423parse_immediate (char **str, int *val, int min, int max,
4424 bfd_boolean prefix_opt)
4425{
4426 expressionS exp;
4427 my_get_expression (&exp, str, prefix_opt ? GE_OPT_PREFIX : GE_IMM_PREFIX);
4428 if (exp.X_op != O_constant)
b99bd4ef 4429 {
c19d1205
ZW
4430 inst.error = _("constant expression required");
4431 return FAIL;
4432 }
b99bd4ef 4433
c19d1205
ZW
4434 if (exp.X_add_number < min || exp.X_add_number > max)
4435 {
4436 inst.error = _("immediate value out of range");
4437 return FAIL;
4438 }
b99bd4ef 4439
c19d1205
ZW
4440 *val = exp.X_add_number;
4441 return SUCCESS;
4442}
b99bd4ef 4443
5287ad62 4444/* Less-generic immediate-value read function with the possibility of loading a
036dc3f7 4445 big (64-bit) immediate, as required by Neon VMOV, VMVN and logic immediate
5287ad62
JB
4446 instructions. Puts the result directly in inst.operands[i]. */
4447
4448static int
4449parse_big_immediate (char **str, int i)
4450{
4451 expressionS exp;
4452 char *ptr = *str;
4453
4454 my_get_expression (&exp, &ptr, GE_OPT_PREFIX_BIG);
4455
4456 if (exp.X_op == O_constant)
036dc3f7
PB
4457 {
4458 inst.operands[i].imm = exp.X_add_number & 0xffffffff;
4459 /* If we're on a 64-bit host, then a 64-bit number can be returned using
4460 O_constant. We have to be careful not to break compilation for
4461 32-bit X_add_number, though. */
58ad575f 4462 if ((exp.X_add_number & ~(offsetT)(0xffffffffU)) != 0)
036dc3f7
PB
4463 {
4464 /* X >> 32 is illegal if sizeof (exp.X_add_number) == 4. */
4465 inst.operands[i].reg = ((exp.X_add_number >> 16) >> 16) & 0xffffffff;
4466 inst.operands[i].regisimm = 1;
4467 }
4468 }
5287ad62 4469 else if (exp.X_op == O_big
95b75c01 4470 && LITTLENUM_NUMBER_OF_BITS * exp.X_add_number > 32)
5287ad62
JB
4471 {
4472 unsigned parts = 32 / LITTLENUM_NUMBER_OF_BITS, j, idx = 0;
95b75c01 4473
5287ad62
JB
4474 /* Bignums have their least significant bits in
4475 generic_bignum[0]. Make sure we put 32 bits in imm and
4476 32 bits in reg, in a (hopefully) portable way. */
9c2799c2 4477 gas_assert (parts != 0);
95b75c01
NC
4478
4479 /* Make sure that the number is not too big.
4480 PR 11972: Bignums can now be sign-extended to the
4481 size of a .octa so check that the out of range bits
4482 are all zero or all one. */
4483 if (LITTLENUM_NUMBER_OF_BITS * exp.X_add_number > 64)
4484 {
4485 LITTLENUM_TYPE m = -1;
4486
4487 if (generic_bignum[parts * 2] != 0
4488 && generic_bignum[parts * 2] != m)
4489 return FAIL;
4490
4491 for (j = parts * 2 + 1; j < (unsigned) exp.X_add_number; j++)
4492 if (generic_bignum[j] != generic_bignum[j-1])
4493 return FAIL;
4494 }
4495
5287ad62
JB
4496 inst.operands[i].imm = 0;
4497 for (j = 0; j < parts; j++, idx++)
4498 inst.operands[i].imm |= generic_bignum[idx]
4499 << (LITTLENUM_NUMBER_OF_BITS * j);
4500 inst.operands[i].reg = 0;
4501 for (j = 0; j < parts; j++, idx++)
4502 inst.operands[i].reg |= generic_bignum[idx]
4503 << (LITTLENUM_NUMBER_OF_BITS * j);
4504 inst.operands[i].regisimm = 1;
4505 }
4506 else
4507 return FAIL;
5f4273c7 4508
5287ad62
JB
4509 *str = ptr;
4510
4511 return SUCCESS;
4512}
4513
c19d1205
ZW
4514/* Returns the pseudo-register number of an FPA immediate constant,
4515 or FAIL if there isn't a valid constant here. */
b99bd4ef 4516
c19d1205
ZW
4517static int
4518parse_fpa_immediate (char ** str)
4519{
4520 LITTLENUM_TYPE words[MAX_LITTLENUMS];
4521 char * save_in;
4522 expressionS exp;
4523 int i;
4524 int j;
b99bd4ef 4525
c19d1205
ZW
4526 /* First try and match exact strings, this is to guarantee
4527 that some formats will work even for cross assembly. */
b99bd4ef 4528
c19d1205
ZW
4529 for (i = 0; fp_const[i]; i++)
4530 {
4531 if (strncmp (*str, fp_const[i], strlen (fp_const[i])) == 0)
b99bd4ef 4532 {
c19d1205 4533 char *start = *str;
b99bd4ef 4534
c19d1205
ZW
4535 *str += strlen (fp_const[i]);
4536 if (is_end_of_line[(unsigned char) **str])
4537 return i + 8;
4538 *str = start;
4539 }
4540 }
b99bd4ef 4541
c19d1205
ZW
4542 /* Just because we didn't get a match doesn't mean that the constant
4543 isn't valid, just that it is in a format that we don't
4544 automatically recognize. Try parsing it with the standard
4545 expression routines. */
b99bd4ef 4546
c19d1205 4547 memset (words, 0, MAX_LITTLENUMS * sizeof (LITTLENUM_TYPE));
b99bd4ef 4548
c19d1205
ZW
4549 /* Look for a raw floating point number. */
4550 if ((save_in = atof_ieee (*str, 'x', words)) != NULL
4551 && is_end_of_line[(unsigned char) *save_in])
4552 {
4553 for (i = 0; i < NUM_FLOAT_VALS; i++)
4554 {
4555 for (j = 0; j < MAX_LITTLENUMS; j++)
b99bd4ef 4556 {
c19d1205
ZW
4557 if (words[j] != fp_values[i][j])
4558 break;
b99bd4ef
NC
4559 }
4560
c19d1205 4561 if (j == MAX_LITTLENUMS)
b99bd4ef 4562 {
c19d1205
ZW
4563 *str = save_in;
4564 return i + 8;
b99bd4ef
NC
4565 }
4566 }
4567 }
b99bd4ef 4568
c19d1205
ZW
4569 /* Try and parse a more complex expression, this will probably fail
4570 unless the code uses a floating point prefix (eg "0f"). */
4571 save_in = input_line_pointer;
4572 input_line_pointer = *str;
4573 if (expression (&exp) == absolute_section
4574 && exp.X_op == O_big
4575 && exp.X_add_number < 0)
4576 {
4577 /* FIXME: 5 = X_PRECISION, should be #define'd where we can use it.
4578 Ditto for 15. */
4579 if (gen_to_words (words, 5, (long) 15) == 0)
4580 {
4581 for (i = 0; i < NUM_FLOAT_VALS; i++)
4582 {
4583 for (j = 0; j < MAX_LITTLENUMS; j++)
4584 {
4585 if (words[j] != fp_values[i][j])
4586 break;
4587 }
b99bd4ef 4588
c19d1205
ZW
4589 if (j == MAX_LITTLENUMS)
4590 {
4591 *str = input_line_pointer;
4592 input_line_pointer = save_in;
4593 return i + 8;
4594 }
4595 }
4596 }
b99bd4ef
NC
4597 }
4598
c19d1205
ZW
4599 *str = input_line_pointer;
4600 input_line_pointer = save_in;
4601 inst.error = _("invalid FPA immediate expression");
4602 return FAIL;
b99bd4ef
NC
4603}
4604
136da414
JB
4605/* Returns 1 if a number has "quarter-precision" float format
4606 0baBbbbbbc defgh000 00000000 00000000. */
4607
4608static int
4609is_quarter_float (unsigned imm)
4610{
4611 int bs = (imm & 0x20000000) ? 0x3e000000 : 0x40000000;
4612 return (imm & 0x7ffff) == 0 && ((imm & 0x7e000000) ^ bs) == 0;
4613}
4614
4615/* Parse an 8-bit "quarter-precision" floating point number of the form:
4616 0baBbbbbbc defgh000 00000000 00000000.
c96612cc
JB
4617 The zero and minus-zero cases need special handling, since they can't be
4618 encoded in the "quarter-precision" float format, but can nonetheless be
4619 loaded as integer constants. */
136da414
JB
4620
4621static unsigned
4622parse_qfloat_immediate (char **ccp, int *immed)
4623{
4624 char *str = *ccp;
c96612cc 4625 char *fpnum;
136da414 4626 LITTLENUM_TYPE words[MAX_LITTLENUMS];
c96612cc 4627 int found_fpchar = 0;
5f4273c7 4628
136da414 4629 skip_past_char (&str, '#');
5f4273c7 4630
c96612cc
JB
4631 /* We must not accidentally parse an integer as a floating-point number. Make
4632 sure that the value we parse is not an integer by checking for special
4633 characters '.' or 'e'.
4634 FIXME: This is a horrible hack, but doing better is tricky because type
4635 information isn't in a very usable state at parse time. */
4636 fpnum = str;
4637 skip_whitespace (fpnum);
4638
4639 if (strncmp (fpnum, "0x", 2) == 0)
4640 return FAIL;
4641 else
4642 {
4643 for (; *fpnum != '\0' && *fpnum != ' ' && *fpnum != '\n'; fpnum++)
4644 if (*fpnum == '.' || *fpnum == 'e' || *fpnum == 'E')
4645 {
4646 found_fpchar = 1;
4647 break;
4648 }
4649
4650 if (!found_fpchar)
4651 return FAIL;
4652 }
5f4273c7 4653
136da414
JB
4654 if ((str = atof_ieee (str, 's', words)) != NULL)
4655 {
4656 unsigned fpword = 0;
4657 int i;
5f4273c7 4658
136da414
JB
4659 /* Our FP word must be 32 bits (single-precision FP). */
4660 for (i = 0; i < 32 / LITTLENUM_NUMBER_OF_BITS; i++)
4661 {
4662 fpword <<= LITTLENUM_NUMBER_OF_BITS;
4663 fpword |= words[i];
4664 }
5f4273c7 4665
c96612cc 4666 if (is_quarter_float (fpword) || (fpword & 0x7fffffff) == 0)
136da414
JB
4667 *immed = fpword;
4668 else
4669 return FAIL;
4670
4671 *ccp = str;
5f4273c7 4672
136da414
JB
4673 return SUCCESS;
4674 }
5f4273c7 4675
136da414
JB
4676 return FAIL;
4677}
4678
c19d1205
ZW
4679/* Shift operands. */
4680enum shift_kind
b99bd4ef 4681{
c19d1205
ZW
4682 SHIFT_LSL, SHIFT_LSR, SHIFT_ASR, SHIFT_ROR, SHIFT_RRX
4683};
b99bd4ef 4684
c19d1205
ZW
4685struct asm_shift_name
4686{
4687 const char *name;
4688 enum shift_kind kind;
4689};
b99bd4ef 4690
c19d1205
ZW
4691/* Third argument to parse_shift. */
4692enum parse_shift_mode
4693{
4694 NO_SHIFT_RESTRICT, /* Any kind of shift is accepted. */
4695 SHIFT_IMMEDIATE, /* Shift operand must be an immediate. */
4696 SHIFT_LSL_OR_ASR_IMMEDIATE, /* Shift must be LSL or ASR immediate. */
4697 SHIFT_ASR_IMMEDIATE, /* Shift must be ASR immediate. */
4698 SHIFT_LSL_IMMEDIATE, /* Shift must be LSL immediate. */
4699};
b99bd4ef 4700
c19d1205
ZW
4701/* Parse a <shift> specifier on an ARM data processing instruction.
4702 This has three forms:
b99bd4ef 4703
c19d1205
ZW
4704 (LSL|LSR|ASL|ASR|ROR) Rs
4705 (LSL|LSR|ASL|ASR|ROR) #imm
4706 RRX
b99bd4ef 4707
c19d1205
ZW
4708 Note that ASL is assimilated to LSL in the instruction encoding, and
4709 RRX to ROR #0 (which cannot be written as such). */
b99bd4ef 4710
c19d1205
ZW
4711static int
4712parse_shift (char **str, int i, enum parse_shift_mode mode)
b99bd4ef 4713{
c19d1205
ZW
4714 const struct asm_shift_name *shift_name;
4715 enum shift_kind shift;
4716 char *s = *str;
4717 char *p = s;
4718 int reg;
b99bd4ef 4719
c19d1205
ZW
4720 for (p = *str; ISALPHA (*p); p++)
4721 ;
b99bd4ef 4722
c19d1205 4723 if (p == *str)
b99bd4ef 4724 {
c19d1205
ZW
4725 inst.error = _("shift expression expected");
4726 return FAIL;
b99bd4ef
NC
4727 }
4728
21d799b5
NC
4729 shift_name = (const struct asm_shift_name *) hash_find_n (arm_shift_hsh, *str,
4730 p - *str);
c19d1205
ZW
4731
4732 if (shift_name == NULL)
b99bd4ef 4733 {
c19d1205
ZW
4734 inst.error = _("shift expression expected");
4735 return FAIL;
b99bd4ef
NC
4736 }
4737
c19d1205 4738 shift = shift_name->kind;
b99bd4ef 4739
c19d1205
ZW
4740 switch (mode)
4741 {
4742 case NO_SHIFT_RESTRICT:
4743 case SHIFT_IMMEDIATE: break;
b99bd4ef 4744
c19d1205
ZW
4745 case SHIFT_LSL_OR_ASR_IMMEDIATE:
4746 if (shift != SHIFT_LSL && shift != SHIFT_ASR)
4747 {
4748 inst.error = _("'LSL' or 'ASR' required");
4749 return FAIL;
4750 }
4751 break;
b99bd4ef 4752
c19d1205
ZW
4753 case SHIFT_LSL_IMMEDIATE:
4754 if (shift != SHIFT_LSL)
4755 {
4756 inst.error = _("'LSL' required");
4757 return FAIL;
4758 }
4759 break;
b99bd4ef 4760
c19d1205
ZW
4761 case SHIFT_ASR_IMMEDIATE:
4762 if (shift != SHIFT_ASR)
4763 {
4764 inst.error = _("'ASR' required");
4765 return FAIL;
4766 }
4767 break;
b99bd4ef 4768
c19d1205
ZW
4769 default: abort ();
4770 }
b99bd4ef 4771
c19d1205
ZW
4772 if (shift != SHIFT_RRX)
4773 {
4774 /* Whitespace can appear here if the next thing is a bare digit. */
4775 skip_whitespace (p);
b99bd4ef 4776
c19d1205 4777 if (mode == NO_SHIFT_RESTRICT
dcbf9037 4778 && (reg = arm_reg_parse (&p, REG_TYPE_RN)) != FAIL)
c19d1205
ZW
4779 {
4780 inst.operands[i].imm = reg;
4781 inst.operands[i].immisreg = 1;
4782 }
4783 else if (my_get_expression (&inst.reloc.exp, &p, GE_IMM_PREFIX))
4784 return FAIL;
4785 }
4786 inst.operands[i].shift_kind = shift;
4787 inst.operands[i].shifted = 1;
4788 *str = p;
4789 return SUCCESS;
b99bd4ef
NC
4790}
4791
c19d1205 4792/* Parse a <shifter_operand> for an ARM data processing instruction:
b99bd4ef 4793
c19d1205
ZW
4794 #<immediate>
4795 #<immediate>, <rotate>
4796 <Rm>
4797 <Rm>, <shift>
b99bd4ef 4798
c19d1205
ZW
4799 where <shift> is defined by parse_shift above, and <rotate> is a
4800 multiple of 2 between 0 and 30. Validation of immediate operands
55cf6793 4801 is deferred to md_apply_fix. */
b99bd4ef 4802
c19d1205
ZW
4803static int
4804parse_shifter_operand (char **str, int i)
4805{
4806 int value;
91d6fa6a 4807 expressionS exp;
b99bd4ef 4808
dcbf9037 4809 if ((value = arm_reg_parse (str, REG_TYPE_RN)) != FAIL)
c19d1205
ZW
4810 {
4811 inst.operands[i].reg = value;
4812 inst.operands[i].isreg = 1;
b99bd4ef 4813
c19d1205
ZW
4814 /* parse_shift will override this if appropriate */
4815 inst.reloc.exp.X_op = O_constant;
4816 inst.reloc.exp.X_add_number = 0;
b99bd4ef 4817
c19d1205
ZW
4818 if (skip_past_comma (str) == FAIL)
4819 return SUCCESS;
b99bd4ef 4820
c19d1205
ZW
4821 /* Shift operation on register. */
4822 return parse_shift (str, i, NO_SHIFT_RESTRICT);
b99bd4ef
NC
4823 }
4824
c19d1205
ZW
4825 if (my_get_expression (&inst.reloc.exp, str, GE_IMM_PREFIX))
4826 return FAIL;
b99bd4ef 4827
c19d1205 4828 if (skip_past_comma (str) == SUCCESS)
b99bd4ef 4829 {
c19d1205 4830 /* #x, y -- ie explicit rotation by Y. */
91d6fa6a 4831 if (my_get_expression (&exp, str, GE_NO_PREFIX))
c19d1205 4832 return FAIL;
b99bd4ef 4833
91d6fa6a 4834 if (exp.X_op != O_constant || inst.reloc.exp.X_op != O_constant)
c19d1205
ZW
4835 {
4836 inst.error = _("constant expression expected");
4837 return FAIL;
4838 }
b99bd4ef 4839
91d6fa6a 4840 value = exp.X_add_number;
c19d1205
ZW
4841 if (value < 0 || value > 30 || value % 2 != 0)
4842 {
4843 inst.error = _("invalid rotation");
4844 return FAIL;
4845 }
4846 if (inst.reloc.exp.X_add_number < 0 || inst.reloc.exp.X_add_number > 255)
4847 {
4848 inst.error = _("invalid constant");
4849 return FAIL;
4850 }
09d92015 4851
55cf6793 4852 /* Convert to decoded value. md_apply_fix will put it back. */
c19d1205
ZW
4853 inst.reloc.exp.X_add_number
4854 = (((inst.reloc.exp.X_add_number << (32 - value))
4855 | (inst.reloc.exp.X_add_number >> value)) & 0xffffffff);
09d92015
MM
4856 }
4857
c19d1205
ZW
4858 inst.reloc.type = BFD_RELOC_ARM_IMMEDIATE;
4859 inst.reloc.pc_rel = 0;
4860 return SUCCESS;
09d92015
MM
4861}
4862
4962c51a
MS
4863/* Group relocation information. Each entry in the table contains the
4864 textual name of the relocation as may appear in assembler source
4865 and must end with a colon.
4866 Along with this textual name are the relocation codes to be used if
4867 the corresponding instruction is an ALU instruction (ADD or SUB only),
4868 an LDR, an LDRS, or an LDC. */
4869
4870struct group_reloc_table_entry
4871{
4872 const char *name;
4873 int alu_code;
4874 int ldr_code;
4875 int ldrs_code;
4876 int ldc_code;
4877};
4878
4879typedef enum
4880{
4881 /* Varieties of non-ALU group relocation. */
4882
4883 GROUP_LDR,
4884 GROUP_LDRS,
4885 GROUP_LDC
4886} group_reloc_type;
4887
4888static struct group_reloc_table_entry group_reloc_table[] =
4889 { /* Program counter relative: */
4890 { "pc_g0_nc",
4891 BFD_RELOC_ARM_ALU_PC_G0_NC, /* ALU */
4892 0, /* LDR */
4893 0, /* LDRS */
4894 0 }, /* LDC */
4895 { "pc_g0",
4896 BFD_RELOC_ARM_ALU_PC_G0, /* ALU */
4897 BFD_RELOC_ARM_LDR_PC_G0, /* LDR */
4898 BFD_RELOC_ARM_LDRS_PC_G0, /* LDRS */
4899 BFD_RELOC_ARM_LDC_PC_G0 }, /* LDC */
4900 { "pc_g1_nc",
4901 BFD_RELOC_ARM_ALU_PC_G1_NC, /* ALU */
4902 0, /* LDR */
4903 0, /* LDRS */
4904 0 }, /* LDC */
4905 { "pc_g1",
4906 BFD_RELOC_ARM_ALU_PC_G1, /* ALU */
4907 BFD_RELOC_ARM_LDR_PC_G1, /* LDR */
4908 BFD_RELOC_ARM_LDRS_PC_G1, /* LDRS */
4909 BFD_RELOC_ARM_LDC_PC_G1 }, /* LDC */
4910 { "pc_g2",
4911 BFD_RELOC_ARM_ALU_PC_G2, /* ALU */
4912 BFD_RELOC_ARM_LDR_PC_G2, /* LDR */
4913 BFD_RELOC_ARM_LDRS_PC_G2, /* LDRS */
4914 BFD_RELOC_ARM_LDC_PC_G2 }, /* LDC */
4915 /* Section base relative */
4916 { "sb_g0_nc",
4917 BFD_RELOC_ARM_ALU_SB_G0_NC, /* ALU */
4918 0, /* LDR */
4919 0, /* LDRS */
4920 0 }, /* LDC */
4921 { "sb_g0",
4922 BFD_RELOC_ARM_ALU_SB_G0, /* ALU */
4923 BFD_RELOC_ARM_LDR_SB_G0, /* LDR */
4924 BFD_RELOC_ARM_LDRS_SB_G0, /* LDRS */
4925 BFD_RELOC_ARM_LDC_SB_G0 }, /* LDC */
4926 { "sb_g1_nc",
4927 BFD_RELOC_ARM_ALU_SB_G1_NC, /* ALU */
4928 0, /* LDR */
4929 0, /* LDRS */
4930 0 }, /* LDC */
4931 { "sb_g1",
4932 BFD_RELOC_ARM_ALU_SB_G1, /* ALU */
4933 BFD_RELOC_ARM_LDR_SB_G1, /* LDR */
4934 BFD_RELOC_ARM_LDRS_SB_G1, /* LDRS */
4935 BFD_RELOC_ARM_LDC_SB_G1 }, /* LDC */
4936 { "sb_g2",
4937 BFD_RELOC_ARM_ALU_SB_G2, /* ALU */
4938 BFD_RELOC_ARM_LDR_SB_G2, /* LDR */
4939 BFD_RELOC_ARM_LDRS_SB_G2, /* LDRS */
4940 BFD_RELOC_ARM_LDC_SB_G2 } }; /* LDC */
4941
4942/* Given the address of a pointer pointing to the textual name of a group
4943 relocation as may appear in assembler source, attempt to find its details
4944 in group_reloc_table. The pointer will be updated to the character after
4945 the trailing colon. On failure, FAIL will be returned; SUCCESS
4946 otherwise. On success, *entry will be updated to point at the relevant
4947 group_reloc_table entry. */
4948
4949static int
4950find_group_reloc_table_entry (char **str, struct group_reloc_table_entry **out)
4951{
4952 unsigned int i;
4953 for (i = 0; i < ARRAY_SIZE (group_reloc_table); i++)
4954 {
4955 int length = strlen (group_reloc_table[i].name);
4956
5f4273c7
NC
4957 if (strncasecmp (group_reloc_table[i].name, *str, length) == 0
4958 && (*str)[length] == ':')
4962c51a
MS
4959 {
4960 *out = &group_reloc_table[i];
4961 *str += (length + 1);
4962 return SUCCESS;
4963 }
4964 }
4965
4966 return FAIL;
4967}
4968
4969/* Parse a <shifter_operand> for an ARM data processing instruction
4970 (as for parse_shifter_operand) where group relocations are allowed:
4971
4972 #<immediate>
4973 #<immediate>, <rotate>
4974 #:<group_reloc>:<expression>
4975 <Rm>
4976 <Rm>, <shift>
4977
4978 where <group_reloc> is one of the strings defined in group_reloc_table.
4979 The hashes are optional.
4980
4981 Everything else is as for parse_shifter_operand. */
4982
4983static parse_operand_result
4984parse_shifter_operand_group_reloc (char **str, int i)
4985{
4986 /* Determine if we have the sequence of characters #: or just :
4987 coming next. If we do, then we check for a group relocation.
4988 If we don't, punt the whole lot to parse_shifter_operand. */
4989
4990 if (((*str)[0] == '#' && (*str)[1] == ':')
4991 || (*str)[0] == ':')
4992 {
4993 struct group_reloc_table_entry *entry;
4994
4995 if ((*str)[0] == '#')
4996 (*str) += 2;
4997 else
4998 (*str)++;
4999
5000 /* Try to parse a group relocation. Anything else is an error. */
5001 if (find_group_reloc_table_entry (str, &entry) == FAIL)
5002 {
5003 inst.error = _("unknown group relocation");
5004 return PARSE_OPERAND_FAIL_NO_BACKTRACK;
5005 }
5006
5007 /* We now have the group relocation table entry corresponding to
5008 the name in the assembler source. Next, we parse the expression. */
5009 if (my_get_expression (&inst.reloc.exp, str, GE_NO_PREFIX))
5010 return PARSE_OPERAND_FAIL_NO_BACKTRACK;
5011
5012 /* Record the relocation type (always the ALU variant here). */
21d799b5 5013 inst.reloc.type = (bfd_reloc_code_real_type) entry->alu_code;
9c2799c2 5014 gas_assert (inst.reloc.type != 0);
4962c51a
MS
5015
5016 return PARSE_OPERAND_SUCCESS;
5017 }
5018 else
5019 return parse_shifter_operand (str, i) == SUCCESS
5020 ? PARSE_OPERAND_SUCCESS : PARSE_OPERAND_FAIL;
5021
5022 /* Never reached. */
5023}
5024
8e560766
MGD
5025/* Parse a Neon alignment expression. Information is written to
5026 inst.operands[i]. We assume the initial ':' has been skipped.
5027
5028 align .imm = align << 8, .immisalign=1, .preind=0 */
5029static parse_operand_result
5030parse_neon_alignment (char **str, int i)
5031{
5032 char *p = *str;
5033 expressionS exp;
5034
5035 my_get_expression (&exp, &p, GE_NO_PREFIX);
5036
5037 if (exp.X_op != O_constant)
5038 {
5039 inst.error = _("alignment must be constant");
5040 return PARSE_OPERAND_FAIL;
5041 }
5042
5043 inst.operands[i].imm = exp.X_add_number << 8;
5044 inst.operands[i].immisalign = 1;
5045 /* Alignments are not pre-indexes. */
5046 inst.operands[i].preind = 0;
5047
5048 *str = p;
5049 return PARSE_OPERAND_SUCCESS;
5050}
5051
c19d1205
ZW
5052/* Parse all forms of an ARM address expression. Information is written
5053 to inst.operands[i] and/or inst.reloc.
09d92015 5054
c19d1205 5055 Preindexed addressing (.preind=1):
09d92015 5056
c19d1205
ZW
5057 [Rn, #offset] .reg=Rn .reloc.exp=offset
5058 [Rn, +/-Rm] .reg=Rn .imm=Rm .immisreg=1 .negative=0/1
5059 [Rn, +/-Rm, shift] .reg=Rn .imm=Rm .immisreg=1 .negative=0/1
5060 .shift_kind=shift .reloc.exp=shift_imm
09d92015 5061
c19d1205 5062 These three may have a trailing ! which causes .writeback to be set also.
09d92015 5063
c19d1205 5064 Postindexed addressing (.postind=1, .writeback=1):
09d92015 5065
c19d1205
ZW
5066 [Rn], #offset .reg=Rn .reloc.exp=offset
5067 [Rn], +/-Rm .reg=Rn .imm=Rm .immisreg=1 .negative=0/1
5068 [Rn], +/-Rm, shift .reg=Rn .imm=Rm .immisreg=1 .negative=0/1
5069 .shift_kind=shift .reloc.exp=shift_imm
09d92015 5070
c19d1205 5071 Unindexed addressing (.preind=0, .postind=0):
09d92015 5072
c19d1205 5073 [Rn], {option} .reg=Rn .imm=option .immisreg=0
09d92015 5074
c19d1205 5075 Other:
09d92015 5076
c19d1205
ZW
5077 [Rn]{!} shorthand for [Rn,#0]{!}
5078 =immediate .isreg=0 .reloc.exp=immediate
5079 label .reg=PC .reloc.pc_rel=1 .reloc.exp=label
09d92015 5080
c19d1205
ZW
5081 It is the caller's responsibility to check for addressing modes not
5082 supported by the instruction, and to set inst.reloc.type. */
5083
4962c51a
MS
5084static parse_operand_result
5085parse_address_main (char **str, int i, int group_relocations,
5086 group_reloc_type group_type)
09d92015 5087{
c19d1205
ZW
5088 char *p = *str;
5089 int reg;
09d92015 5090
c19d1205 5091 if (skip_past_char (&p, '[') == FAIL)
09d92015 5092 {
c19d1205
ZW
5093 if (skip_past_char (&p, '=') == FAIL)
5094 {
974da60d 5095 /* Bare address - translate to PC-relative offset. */
c19d1205
ZW
5096 inst.reloc.pc_rel = 1;
5097 inst.operands[i].reg = REG_PC;
5098 inst.operands[i].isreg = 1;
5099 inst.operands[i].preind = 1;
5100 }
974da60d 5101 /* Otherwise a load-constant pseudo op, no special treatment needed here. */
09d92015 5102
c19d1205 5103 if (my_get_expression (&inst.reloc.exp, &p, GE_NO_PREFIX))
4962c51a 5104 return PARSE_OPERAND_FAIL;
09d92015 5105
c19d1205 5106 *str = p;
4962c51a 5107 return PARSE_OPERAND_SUCCESS;
09d92015
MM
5108 }
5109
dcbf9037 5110 if ((reg = arm_reg_parse (&p, REG_TYPE_RN)) == FAIL)
09d92015 5111 {
c19d1205 5112 inst.error = _(reg_expected_msgs[REG_TYPE_RN]);
4962c51a 5113 return PARSE_OPERAND_FAIL;
09d92015 5114 }
c19d1205
ZW
5115 inst.operands[i].reg = reg;
5116 inst.operands[i].isreg = 1;
09d92015 5117
c19d1205 5118 if (skip_past_comma (&p) == SUCCESS)
09d92015 5119 {
c19d1205 5120 inst.operands[i].preind = 1;
09d92015 5121
c19d1205
ZW
5122 if (*p == '+') p++;
5123 else if (*p == '-') p++, inst.operands[i].negative = 1;
5124
dcbf9037 5125 if ((reg = arm_reg_parse (&p, REG_TYPE_RN)) != FAIL)
09d92015 5126 {
c19d1205
ZW
5127 inst.operands[i].imm = reg;
5128 inst.operands[i].immisreg = 1;
5129
5130 if (skip_past_comma (&p) == SUCCESS)
5131 if (parse_shift (&p, i, SHIFT_IMMEDIATE) == FAIL)
4962c51a 5132 return PARSE_OPERAND_FAIL;
c19d1205 5133 }
5287ad62 5134 else if (skip_past_char (&p, ':') == SUCCESS)
8e560766
MGD
5135 {
5136 /* FIXME: '@' should be used here, but it's filtered out by generic
5137 code before we get to see it here. This may be subject to
5138 change. */
5139 parse_operand_result result = parse_neon_alignment (&p, i);
5140
5141 if (result != PARSE_OPERAND_SUCCESS)
5142 return result;
5143 }
c19d1205
ZW
5144 else
5145 {
5146 if (inst.operands[i].negative)
5147 {
5148 inst.operands[i].negative = 0;
5149 p--;
5150 }
4962c51a 5151
5f4273c7
NC
5152 if (group_relocations
5153 && ((*p == '#' && *(p + 1) == ':') || *p == ':'))
4962c51a
MS
5154 {
5155 struct group_reloc_table_entry *entry;
5156
5157 /* Skip over the #: or : sequence. */
5158 if (*p == '#')
5159 p += 2;
5160 else
5161 p++;
5162
5163 /* Try to parse a group relocation. Anything else is an
5164 error. */
5165 if (find_group_reloc_table_entry (&p, &entry) == FAIL)
5166 {
5167 inst.error = _("unknown group relocation");
5168 return PARSE_OPERAND_FAIL_NO_BACKTRACK;
5169 }
5170
5171 /* We now have the group relocation table entry corresponding to
5172 the name in the assembler source. Next, we parse the
5173 expression. */
5174 if (my_get_expression (&inst.reloc.exp, &p, GE_NO_PREFIX))
5175 return PARSE_OPERAND_FAIL_NO_BACKTRACK;
5176
5177 /* Record the relocation type. */
5178 switch (group_type)
5179 {
5180 case GROUP_LDR:
21d799b5 5181 inst.reloc.type = (bfd_reloc_code_real_type) entry->ldr_code;
4962c51a
MS
5182 break;
5183
5184 case GROUP_LDRS:
21d799b5 5185 inst.reloc.type = (bfd_reloc_code_real_type) entry->ldrs_code;
4962c51a
MS
5186 break;
5187
5188 case GROUP_LDC:
21d799b5 5189 inst.reloc.type = (bfd_reloc_code_real_type) entry->ldc_code;
4962c51a
MS
5190 break;
5191
5192 default:
9c2799c2 5193 gas_assert (0);
4962c51a
MS
5194 }
5195
5196 if (inst.reloc.type == 0)
5197 {
5198 inst.error = _("this group relocation is not allowed on this instruction");
5199 return PARSE_OPERAND_FAIL_NO_BACKTRACK;
5200 }
5201 }
5202 else
26d97720
NS
5203 {
5204 char *q = p;
5205 if (my_get_expression (&inst.reloc.exp, &p, GE_IMM_PREFIX))
5206 return PARSE_OPERAND_FAIL;
5207 /* If the offset is 0, find out if it's a +0 or -0. */
5208 if (inst.reloc.exp.X_op == O_constant
5209 && inst.reloc.exp.X_add_number == 0)
5210 {
5211 skip_whitespace (q);
5212 if (*q == '#')
5213 {
5214 q++;
5215 skip_whitespace (q);
5216 }
5217 if (*q == '-')
5218 inst.operands[i].negative = 1;
5219 }
5220 }
09d92015
MM
5221 }
5222 }
8e560766
MGD
5223 else if (skip_past_char (&p, ':') == SUCCESS)
5224 {
5225 /* FIXME: '@' should be used here, but it's filtered out by generic code
5226 before we get to see it here. This may be subject to change. */
5227 parse_operand_result result = parse_neon_alignment (&p, i);
5228
5229 if (result != PARSE_OPERAND_SUCCESS)
5230 return result;
5231 }
09d92015 5232
c19d1205 5233 if (skip_past_char (&p, ']') == FAIL)
09d92015 5234 {
c19d1205 5235 inst.error = _("']' expected");
4962c51a 5236 return PARSE_OPERAND_FAIL;
09d92015
MM
5237 }
5238
c19d1205
ZW
5239 if (skip_past_char (&p, '!') == SUCCESS)
5240 inst.operands[i].writeback = 1;
09d92015 5241
c19d1205 5242 else if (skip_past_comma (&p) == SUCCESS)
09d92015 5243 {
c19d1205
ZW
5244 if (skip_past_char (&p, '{') == SUCCESS)
5245 {
5246 /* [Rn], {expr} - unindexed, with option */
5247 if (parse_immediate (&p, &inst.operands[i].imm,
ca3f61f7 5248 0, 255, TRUE) == FAIL)
4962c51a 5249 return PARSE_OPERAND_FAIL;
09d92015 5250
c19d1205
ZW
5251 if (skip_past_char (&p, '}') == FAIL)
5252 {
5253 inst.error = _("'}' expected at end of 'option' field");
4962c51a 5254 return PARSE_OPERAND_FAIL;
c19d1205
ZW
5255 }
5256 if (inst.operands[i].preind)
5257 {
5258 inst.error = _("cannot combine index with option");
4962c51a 5259 return PARSE_OPERAND_FAIL;
c19d1205
ZW
5260 }
5261 *str = p;
4962c51a 5262 return PARSE_OPERAND_SUCCESS;
09d92015 5263 }
c19d1205
ZW
5264 else
5265 {
5266 inst.operands[i].postind = 1;
5267 inst.operands[i].writeback = 1;
09d92015 5268
c19d1205
ZW
5269 if (inst.operands[i].preind)
5270 {
5271 inst.error = _("cannot combine pre- and post-indexing");
4962c51a 5272 return PARSE_OPERAND_FAIL;
c19d1205 5273 }
09d92015 5274
c19d1205
ZW
5275 if (*p == '+') p++;
5276 else if (*p == '-') p++, inst.operands[i].negative = 1;
a737bd4d 5277
dcbf9037 5278 if ((reg = arm_reg_parse (&p, REG_TYPE_RN)) != FAIL)
c19d1205 5279 {
5287ad62
JB
5280 /* We might be using the immediate for alignment already. If we
5281 are, OR the register number into the low-order bits. */
5282 if (inst.operands[i].immisalign)
5283 inst.operands[i].imm |= reg;
5284 else
5285 inst.operands[i].imm = reg;
c19d1205 5286 inst.operands[i].immisreg = 1;
a737bd4d 5287
c19d1205
ZW
5288 if (skip_past_comma (&p) == SUCCESS)
5289 if (parse_shift (&p, i, SHIFT_IMMEDIATE) == FAIL)
4962c51a 5290 return PARSE_OPERAND_FAIL;
c19d1205
ZW
5291 }
5292 else
5293 {
26d97720 5294 char *q = p;
c19d1205
ZW
5295 if (inst.operands[i].negative)
5296 {
5297 inst.operands[i].negative = 0;
5298 p--;
5299 }
5300 if (my_get_expression (&inst.reloc.exp, &p, GE_IMM_PREFIX))
4962c51a 5301 return PARSE_OPERAND_FAIL;
26d97720
NS
5302 /* If the offset is 0, find out if it's a +0 or -0. */
5303 if (inst.reloc.exp.X_op == O_constant
5304 && inst.reloc.exp.X_add_number == 0)
5305 {
5306 skip_whitespace (q);
5307 if (*q == '#')
5308 {
5309 q++;
5310 skip_whitespace (q);
5311 }
5312 if (*q == '-')
5313 inst.operands[i].negative = 1;
5314 }
c19d1205
ZW
5315 }
5316 }
a737bd4d
NC
5317 }
5318
c19d1205
ZW
5319 /* If at this point neither .preind nor .postind is set, we have a
5320 bare [Rn]{!}, which is shorthand for [Rn,#0]{!}. */
5321 if (inst.operands[i].preind == 0 && inst.operands[i].postind == 0)
5322 {
5323 inst.operands[i].preind = 1;
5324 inst.reloc.exp.X_op = O_constant;
5325 inst.reloc.exp.X_add_number = 0;
5326 }
5327 *str = p;
4962c51a
MS
5328 return PARSE_OPERAND_SUCCESS;
5329}
5330
5331static int
5332parse_address (char **str, int i)
5333{
21d799b5 5334 return parse_address_main (str, i, 0, GROUP_LDR) == PARSE_OPERAND_SUCCESS
4962c51a
MS
5335 ? SUCCESS : FAIL;
5336}
5337
5338static parse_operand_result
5339parse_address_group_reloc (char **str, int i, group_reloc_type type)
5340{
5341 return parse_address_main (str, i, 1, type);
a737bd4d
NC
5342}
5343
b6895b4f
PB
5344/* Parse an operand for a MOVW or MOVT instruction. */
5345static int
5346parse_half (char **str)
5347{
5348 char * p;
5f4273c7 5349
b6895b4f
PB
5350 p = *str;
5351 skip_past_char (&p, '#');
5f4273c7 5352 if (strncasecmp (p, ":lower16:", 9) == 0)
b6895b4f
PB
5353 inst.reloc.type = BFD_RELOC_ARM_MOVW;
5354 else if (strncasecmp (p, ":upper16:", 9) == 0)
5355 inst.reloc.type = BFD_RELOC_ARM_MOVT;
5356
5357 if (inst.reloc.type != BFD_RELOC_UNUSED)
5358 {
5359 p += 9;
5f4273c7 5360 skip_whitespace (p);
b6895b4f
PB
5361 }
5362
5363 if (my_get_expression (&inst.reloc.exp, &p, GE_NO_PREFIX))
5364 return FAIL;
5365
5366 if (inst.reloc.type == BFD_RELOC_UNUSED)
5367 {
5368 if (inst.reloc.exp.X_op != O_constant)
5369 {
5370 inst.error = _("constant expression expected");
5371 return FAIL;
5372 }
5373 if (inst.reloc.exp.X_add_number < 0
5374 || inst.reloc.exp.X_add_number > 0xffff)
5375 {
5376 inst.error = _("immediate value out of range");
5377 return FAIL;
5378 }
5379 }
5380 *str = p;
5381 return SUCCESS;
5382}
5383
c19d1205 5384/* Miscellaneous. */
a737bd4d 5385
c19d1205
ZW
5386/* Parse a PSR flag operand. The value returned is FAIL on syntax error,
5387 or a bitmask suitable to be or-ed into the ARM msr instruction. */
5388static int
d2cd1205 5389parse_psr (char **str, bfd_boolean lhs)
09d92015 5390{
c19d1205
ZW
5391 char *p;
5392 unsigned long psr_field;
62b3e311
PB
5393 const struct asm_psr *psr;
5394 char *start;
d2cd1205 5395 bfd_boolean is_apsr = FALSE;
ac7f631b 5396 bfd_boolean m_profile = ARM_CPU_HAS_FEATURE (selected_cpu, arm_ext_m);
09d92015 5397
a4482bb6
NC
5398 /* PR gas/12698: If the user has specified -march=all then m_profile will
5399 be TRUE, but we want to ignore it in this case as we are building for any
5400 CPU type, including non-m variants. */
5401 if (selected_cpu.core == arm_arch_any.core)
5402 m_profile = FALSE;
5403
c19d1205
ZW
5404 /* CPSR's and SPSR's can now be lowercase. This is just a convenience
5405 feature for ease of use and backwards compatibility. */
5406 p = *str;
62b3e311 5407 if (strncasecmp (p, "SPSR", 4) == 0)
d2cd1205
JB
5408 {
5409 if (m_profile)
5410 goto unsupported_psr;
5411
5412 psr_field = SPSR_BIT;
5413 }
5414 else if (strncasecmp (p, "CPSR", 4) == 0)
5415 {
5416 if (m_profile)
5417 goto unsupported_psr;
5418
5419 psr_field = 0;
5420 }
5421 else if (strncasecmp (p, "APSR", 4) == 0)
5422 {
5423 /* APSR[_<bits>] can be used as a synonym for CPSR[_<flags>] on ARMv7-A
5424 and ARMv7-R architecture CPUs. */
5425 is_apsr = TRUE;
5426 psr_field = 0;
5427 }
5428 else if (m_profile)
62b3e311
PB
5429 {
5430 start = p;
5431 do
5432 p++;
5433 while (ISALNUM (*p) || *p == '_');
5434
d2cd1205
JB
5435 if (strncasecmp (start, "iapsr", 5) == 0
5436 || strncasecmp (start, "eapsr", 5) == 0
5437 || strncasecmp (start, "xpsr", 4) == 0
5438 || strncasecmp (start, "psr", 3) == 0)
5439 p = start + strcspn (start, "rR") + 1;
5440
21d799b5
NC
5441 psr = (const struct asm_psr *) hash_find_n (arm_v7m_psr_hsh, start,
5442 p - start);
d2cd1205 5443
62b3e311
PB
5444 if (!psr)
5445 return FAIL;
09d92015 5446
d2cd1205
JB
5447 /* If APSR is being written, a bitfield may be specified. Note that
5448 APSR itself is handled above. */
5449 if (psr->field <= 3)
5450 {
5451 psr_field = psr->field;
5452 is_apsr = TRUE;
5453 goto check_suffix;
5454 }
5455
62b3e311 5456 *str = p;
d2cd1205
JB
5457 /* M-profile MSR instructions have the mask field set to "10", except
5458 *PSR variants which modify APSR, which may use a different mask (and
5459 have been handled already). Do that by setting the PSR_f field
5460 here. */
5461 return psr->field | (lhs ? PSR_f : 0);
62b3e311 5462 }
d2cd1205
JB
5463 else
5464 goto unsupported_psr;
09d92015 5465
62b3e311 5466 p += 4;
d2cd1205 5467check_suffix:
c19d1205
ZW
5468 if (*p == '_')
5469 {
5470 /* A suffix follows. */
c19d1205
ZW
5471 p++;
5472 start = p;
a737bd4d 5473
c19d1205
ZW
5474 do
5475 p++;
5476 while (ISALNUM (*p) || *p == '_');
a737bd4d 5477
d2cd1205
JB
5478 if (is_apsr)
5479 {
5480 /* APSR uses a notation for bits, rather than fields. */
5481 unsigned int nzcvq_bits = 0;
5482 unsigned int g_bit = 0;
5483 char *bit;
5484
5485 for (bit = start; bit != p; bit++)
5486 {
5487 switch (TOLOWER (*bit))
5488 {
5489 case 'n':
5490 nzcvq_bits |= (nzcvq_bits & 0x01) ? 0x20 : 0x01;
5491 break;
5492
5493 case 'z':
5494 nzcvq_bits |= (nzcvq_bits & 0x02) ? 0x20 : 0x02;
5495 break;
5496
5497 case 'c':
5498 nzcvq_bits |= (nzcvq_bits & 0x04) ? 0x20 : 0x04;
5499 break;
5500
5501 case 'v':
5502 nzcvq_bits |= (nzcvq_bits & 0x08) ? 0x20 : 0x08;
5503 break;
5504
5505 case 'q':
5506 nzcvq_bits |= (nzcvq_bits & 0x10) ? 0x20 : 0x10;
5507 break;
5508
5509 case 'g':
5510 g_bit |= (g_bit & 0x1) ? 0x2 : 0x1;
5511 break;
5512
5513 default:
5514 inst.error = _("unexpected bit specified after APSR");
5515 return FAIL;
5516 }
5517 }
5518
5519 if (nzcvq_bits == 0x1f)
5520 psr_field |= PSR_f;
5521
5522 if (g_bit == 0x1)
5523 {
5524 if (!ARM_CPU_HAS_FEATURE (selected_cpu, arm_ext_v6_dsp))
5525 {
5526 inst.error = _("selected processor does not "
5527 "support DSP extension");
5528 return FAIL;
5529 }
5530
5531 psr_field |= PSR_s;
5532 }
5533
5534 if ((nzcvq_bits & 0x20) != 0
5535 || (nzcvq_bits != 0x1f && nzcvq_bits != 0)
5536 || (g_bit & 0x2) != 0)
5537 {
5538 inst.error = _("bad bitmask specified after APSR");
5539 return FAIL;
5540 }
5541 }
5542 else
5543 {
5544 psr = (const struct asm_psr *) hash_find_n (arm_psr_hsh, start,
5545 p - start);
5546 if (!psr)
5547 goto error;
a737bd4d 5548
d2cd1205
JB
5549 psr_field |= psr->field;
5550 }
a737bd4d 5551 }
c19d1205 5552 else
a737bd4d 5553 {
c19d1205
ZW
5554 if (ISALNUM (*p))
5555 goto error; /* Garbage after "[CS]PSR". */
5556
d2cd1205
JB
5557 /* Unadorned APSR is equivalent to APSR_nzcvq/CPSR_f (for writes). This
5558 is deprecated, but allow it anyway. */
5559 if (is_apsr && lhs)
5560 {
5561 psr_field |= PSR_f;
5562 as_tsktsk (_("writing to APSR without specifying a bitmask is "
5563 "deprecated"));
5564 }
5565 else if (!m_profile)
5566 /* These bits are never right for M-profile devices: don't set them
5567 (only code paths which read/write APSR reach here). */
5568 psr_field |= (PSR_c | PSR_f);
a737bd4d 5569 }
c19d1205
ZW
5570 *str = p;
5571 return psr_field;
a737bd4d 5572
d2cd1205
JB
5573 unsupported_psr:
5574 inst.error = _("selected processor does not support requested special "
5575 "purpose register");
5576 return FAIL;
5577
c19d1205
ZW
5578 error:
5579 inst.error = _("flag for {c}psr instruction expected");
5580 return FAIL;
a737bd4d
NC
5581}
5582
c19d1205
ZW
5583/* Parse the flags argument to CPSI[ED]. Returns FAIL on error, or a
5584 value suitable for splatting into the AIF field of the instruction. */
a737bd4d 5585
c19d1205
ZW
5586static int
5587parse_cps_flags (char **str)
a737bd4d 5588{
c19d1205
ZW
5589 int val = 0;
5590 int saw_a_flag = 0;
5591 char *s = *str;
a737bd4d 5592
c19d1205
ZW
5593 for (;;)
5594 switch (*s++)
5595 {
5596 case '\0': case ',':
5597 goto done;
a737bd4d 5598
c19d1205
ZW
5599 case 'a': case 'A': saw_a_flag = 1; val |= 0x4; break;
5600 case 'i': case 'I': saw_a_flag = 1; val |= 0x2; break;
5601 case 'f': case 'F': saw_a_flag = 1; val |= 0x1; break;
a737bd4d 5602
c19d1205
ZW
5603 default:
5604 inst.error = _("unrecognized CPS flag");
5605 return FAIL;
5606 }
a737bd4d 5607
c19d1205
ZW
5608 done:
5609 if (saw_a_flag == 0)
a737bd4d 5610 {
c19d1205
ZW
5611 inst.error = _("missing CPS flags");
5612 return FAIL;
a737bd4d 5613 }
a737bd4d 5614
c19d1205
ZW
5615 *str = s - 1;
5616 return val;
a737bd4d
NC
5617}
5618
c19d1205
ZW
5619/* Parse an endian specifier ("BE" or "LE", case insensitive);
5620 returns 0 for big-endian, 1 for little-endian, FAIL for an error. */
a737bd4d
NC
5621
5622static int
c19d1205 5623parse_endian_specifier (char **str)
a737bd4d 5624{
c19d1205
ZW
5625 int little_endian;
5626 char *s = *str;
a737bd4d 5627
c19d1205
ZW
5628 if (strncasecmp (s, "BE", 2))
5629 little_endian = 0;
5630 else if (strncasecmp (s, "LE", 2))
5631 little_endian = 1;
5632 else
a737bd4d 5633 {
c19d1205 5634 inst.error = _("valid endian specifiers are be or le");
a737bd4d
NC
5635 return FAIL;
5636 }
5637
c19d1205 5638 if (ISALNUM (s[2]) || s[2] == '_')
a737bd4d 5639 {
c19d1205 5640 inst.error = _("valid endian specifiers are be or le");
a737bd4d
NC
5641 return FAIL;
5642 }
5643
c19d1205
ZW
5644 *str = s + 2;
5645 return little_endian;
5646}
a737bd4d 5647
c19d1205
ZW
5648/* Parse a rotation specifier: ROR #0, #8, #16, #24. *val receives a
5649 value suitable for poking into the rotate field of an sxt or sxta
5650 instruction, or FAIL on error. */
5651
5652static int
5653parse_ror (char **str)
5654{
5655 int rot;
5656 char *s = *str;
5657
5658 if (strncasecmp (s, "ROR", 3) == 0)
5659 s += 3;
5660 else
a737bd4d 5661 {
c19d1205 5662 inst.error = _("missing rotation field after comma");
a737bd4d
NC
5663 return FAIL;
5664 }
c19d1205
ZW
5665
5666 if (parse_immediate (&s, &rot, 0, 24, FALSE) == FAIL)
5667 return FAIL;
5668
5669 switch (rot)
a737bd4d 5670 {
c19d1205
ZW
5671 case 0: *str = s; return 0x0;
5672 case 8: *str = s; return 0x1;
5673 case 16: *str = s; return 0x2;
5674 case 24: *str = s; return 0x3;
5675
5676 default:
5677 inst.error = _("rotation can only be 0, 8, 16, or 24");
a737bd4d
NC
5678 return FAIL;
5679 }
c19d1205 5680}
a737bd4d 5681
c19d1205
ZW
5682/* Parse a conditional code (from conds[] below). The value returned is in the
5683 range 0 .. 14, or FAIL. */
5684static int
5685parse_cond (char **str)
5686{
c462b453 5687 char *q;
c19d1205 5688 const struct asm_cond *c;
c462b453
PB
5689 int n;
5690 /* Condition codes are always 2 characters, so matching up to
5691 3 characters is sufficient. */
5692 char cond[3];
a737bd4d 5693
c462b453
PB
5694 q = *str;
5695 n = 0;
5696 while (ISALPHA (*q) && n < 3)
5697 {
e07e6e58 5698 cond[n] = TOLOWER (*q);
c462b453
PB
5699 q++;
5700 n++;
5701 }
a737bd4d 5702
21d799b5 5703 c = (const struct asm_cond *) hash_find_n (arm_cond_hsh, cond, n);
c19d1205 5704 if (!c)
a737bd4d 5705 {
c19d1205 5706 inst.error = _("condition required");
a737bd4d
NC
5707 return FAIL;
5708 }
5709
c19d1205
ZW
5710 *str = q;
5711 return c->value;
5712}
5713
62b3e311
PB
5714/* Parse an option for a barrier instruction. Returns the encoding for the
5715 option, or FAIL. */
5716static int
5717parse_barrier (char **str)
5718{
5719 char *p, *q;
5720 const struct asm_barrier_opt *o;
5721
5722 p = q = *str;
5723 while (ISALPHA (*q))
5724 q++;
5725
21d799b5
NC
5726 o = (const struct asm_barrier_opt *) hash_find_n (arm_barrier_opt_hsh, p,
5727 q - p);
62b3e311
PB
5728 if (!o)
5729 return FAIL;
5730
5731 *str = q;
5732 return o->value;
5733}
5734
92e90b6e
PB
5735/* Parse the operands of a table branch instruction. Similar to a memory
5736 operand. */
5737static int
5738parse_tb (char **str)
5739{
5740 char * p = *str;
5741 int reg;
5742
5743 if (skip_past_char (&p, '[') == FAIL)
ab1eb5fe
PB
5744 {
5745 inst.error = _("'[' expected");
5746 return FAIL;
5747 }
92e90b6e 5748
dcbf9037 5749 if ((reg = arm_reg_parse (&p, REG_TYPE_RN)) == FAIL)
92e90b6e
PB
5750 {
5751 inst.error = _(reg_expected_msgs[REG_TYPE_RN]);
5752 return FAIL;
5753 }
5754 inst.operands[0].reg = reg;
5755
5756 if (skip_past_comma (&p) == FAIL)
ab1eb5fe
PB
5757 {
5758 inst.error = _("',' expected");
5759 return FAIL;
5760 }
5f4273c7 5761
dcbf9037 5762 if ((reg = arm_reg_parse (&p, REG_TYPE_RN)) == FAIL)
92e90b6e
PB
5763 {
5764 inst.error = _(reg_expected_msgs[REG_TYPE_RN]);
5765 return FAIL;
5766 }
5767 inst.operands[0].imm = reg;
5768
5769 if (skip_past_comma (&p) == SUCCESS)
5770 {
5771 if (parse_shift (&p, 0, SHIFT_LSL_IMMEDIATE) == FAIL)
5772 return FAIL;
5773 if (inst.reloc.exp.X_add_number != 1)
5774 {
5775 inst.error = _("invalid shift");
5776 return FAIL;
5777 }
5778 inst.operands[0].shifted = 1;
5779 }
5780
5781 if (skip_past_char (&p, ']') == FAIL)
5782 {
5783 inst.error = _("']' expected");
5784 return FAIL;
5785 }
5786 *str = p;
5787 return SUCCESS;
5788}
5789
5287ad62
JB
5790/* Parse the operands of a Neon VMOV instruction. See do_neon_mov for more
5791 information on the types the operands can take and how they are encoded.
037e8744
JB
5792 Up to four operands may be read; this function handles setting the
5793 ".present" field for each read operand itself.
5287ad62
JB
5794 Updates STR and WHICH_OPERAND if parsing is successful and returns SUCCESS,
5795 else returns FAIL. */
5796
5797static int
5798parse_neon_mov (char **str, int *which_operand)
5799{
5800 int i = *which_operand, val;
5801 enum arm_reg_type rtype;
5802 char *ptr = *str;
dcbf9037 5803 struct neon_type_el optype;
5f4273c7 5804
dcbf9037 5805 if ((val = parse_scalar (&ptr, 8, &optype)) != FAIL)
5287ad62
JB
5806 {
5807 /* Case 4: VMOV<c><q>.<size> <Dn[x]>, <Rd>. */
5808 inst.operands[i].reg = val;
5809 inst.operands[i].isscalar = 1;
dcbf9037 5810 inst.operands[i].vectype = optype;
5287ad62
JB
5811 inst.operands[i++].present = 1;
5812
5813 if (skip_past_comma (&ptr) == FAIL)
5814 goto wanted_comma;
5f4273c7 5815
dcbf9037 5816 if ((val = arm_reg_parse (&ptr, REG_TYPE_RN)) == FAIL)
5287ad62 5817 goto wanted_arm;
5f4273c7 5818
5287ad62
JB
5819 inst.operands[i].reg = val;
5820 inst.operands[i].isreg = 1;
5821 inst.operands[i].present = 1;
5822 }
037e8744 5823 else if ((val = arm_typed_reg_parse (&ptr, REG_TYPE_NSDQ, &rtype, &optype))
dcbf9037 5824 != FAIL)
5287ad62
JB
5825 {
5826 /* Cases 0, 1, 2, 3, 5 (D only). */
5827 if (skip_past_comma (&ptr) == FAIL)
5828 goto wanted_comma;
5f4273c7 5829
5287ad62
JB
5830 inst.operands[i].reg = val;
5831 inst.operands[i].isreg = 1;
5832 inst.operands[i].isquad = (rtype == REG_TYPE_NQ);
037e8744
JB
5833 inst.operands[i].issingle = (rtype == REG_TYPE_VFS);
5834 inst.operands[i].isvec = 1;
dcbf9037 5835 inst.operands[i].vectype = optype;
5287ad62
JB
5836 inst.operands[i++].present = 1;
5837
dcbf9037 5838 if ((val = arm_reg_parse (&ptr, REG_TYPE_RN)) != FAIL)
5287ad62 5839 {
037e8744
JB
5840 /* Case 5: VMOV<c><q> <Dm>, <Rd>, <Rn>.
5841 Case 13: VMOV <Sd>, <Rm> */
5287ad62
JB
5842 inst.operands[i].reg = val;
5843 inst.operands[i].isreg = 1;
037e8744 5844 inst.operands[i].present = 1;
5287ad62
JB
5845
5846 if (rtype == REG_TYPE_NQ)
5847 {
dcbf9037 5848 first_error (_("can't use Neon quad register here"));
5287ad62
JB
5849 return FAIL;
5850 }
037e8744
JB
5851 else if (rtype != REG_TYPE_VFS)
5852 {
5853 i++;
5854 if (skip_past_comma (&ptr) == FAIL)
5855 goto wanted_comma;
5856 if ((val = arm_reg_parse (&ptr, REG_TYPE_RN)) == FAIL)
5857 goto wanted_arm;
5858 inst.operands[i].reg = val;
5859 inst.operands[i].isreg = 1;
5860 inst.operands[i].present = 1;
5861 }
5287ad62 5862 }
037e8744
JB
5863 else if ((val = arm_typed_reg_parse (&ptr, REG_TYPE_NSDQ, &rtype,
5864 &optype)) != FAIL)
5287ad62
JB
5865 {
5866 /* Case 0: VMOV<c><q> <Qd>, <Qm>
037e8744
JB
5867 Case 1: VMOV<c><q> <Dd>, <Dm>
5868 Case 8: VMOV.F32 <Sd>, <Sm>
5869 Case 15: VMOV <Sd>, <Se>, <Rn>, <Rm> */
5287ad62
JB
5870
5871 inst.operands[i].reg = val;
5872 inst.operands[i].isreg = 1;
5873 inst.operands[i].isquad = (rtype == REG_TYPE_NQ);
037e8744
JB
5874 inst.operands[i].issingle = (rtype == REG_TYPE_VFS);
5875 inst.operands[i].isvec = 1;
dcbf9037 5876 inst.operands[i].vectype = optype;
5287ad62 5877 inst.operands[i].present = 1;
5f4273c7 5878
037e8744
JB
5879 if (skip_past_comma (&ptr) == SUCCESS)
5880 {
5881 /* Case 15. */
5882 i++;
5883
5884 if ((val = arm_reg_parse (&ptr, REG_TYPE_RN)) == FAIL)
5885 goto wanted_arm;
5886
5887 inst.operands[i].reg = val;
5888 inst.operands[i].isreg = 1;
5889 inst.operands[i++].present = 1;
5f4273c7 5890
037e8744
JB
5891 if (skip_past_comma (&ptr) == FAIL)
5892 goto wanted_comma;
5f4273c7 5893
037e8744
JB
5894 if ((val = arm_reg_parse (&ptr, REG_TYPE_RN)) == FAIL)
5895 goto wanted_arm;
5f4273c7 5896
037e8744
JB
5897 inst.operands[i].reg = val;
5898 inst.operands[i].isreg = 1;
5899 inst.operands[i++].present = 1;
5900 }
5287ad62 5901 }
4641781c
PB
5902 else if (parse_qfloat_immediate (&ptr, &inst.operands[i].imm) == SUCCESS)
5903 /* Case 2: VMOV<c><q>.<dt> <Qd>, #<float-imm>
5904 Case 3: VMOV<c><q>.<dt> <Dd>, #<float-imm>
5905 Case 10: VMOV.F32 <Sd>, #<imm>
5906 Case 11: VMOV.F64 <Dd>, #<imm> */
5907 inst.operands[i].immisfloat = 1;
5908 else if (parse_big_immediate (&ptr, i) == SUCCESS)
5909 /* Case 2: VMOV<c><q>.<dt> <Qd>, #<imm>
5910 Case 3: VMOV<c><q>.<dt> <Dd>, #<imm> */
5911 ;
5287ad62
JB
5912 else
5913 {
dcbf9037 5914 first_error (_("expected <Rm> or <Dm> or <Qm> operand"));
5287ad62
JB
5915 return FAIL;
5916 }
5917 }
dcbf9037 5918 else if ((val = arm_reg_parse (&ptr, REG_TYPE_RN)) != FAIL)
5287ad62
JB
5919 {
5920 /* Cases 6, 7. */
5921 inst.operands[i].reg = val;
5922 inst.operands[i].isreg = 1;
5923 inst.operands[i++].present = 1;
5f4273c7 5924
5287ad62
JB
5925 if (skip_past_comma (&ptr) == FAIL)
5926 goto wanted_comma;
5f4273c7 5927
dcbf9037 5928 if ((val = parse_scalar (&ptr, 8, &optype)) != FAIL)
5287ad62
JB
5929 {
5930 /* Case 6: VMOV<c><q>.<dt> <Rd>, <Dn[x]> */
5931 inst.operands[i].reg = val;
5932 inst.operands[i].isscalar = 1;
5933 inst.operands[i].present = 1;
dcbf9037 5934 inst.operands[i].vectype = optype;
5287ad62 5935 }
dcbf9037 5936 else if ((val = arm_reg_parse (&ptr, REG_TYPE_RN)) != FAIL)
5287ad62
JB
5937 {
5938 /* Case 7: VMOV<c><q> <Rd>, <Rn>, <Dm> */
5939 inst.operands[i].reg = val;
5940 inst.operands[i].isreg = 1;
5941 inst.operands[i++].present = 1;
5f4273c7 5942
5287ad62
JB
5943 if (skip_past_comma (&ptr) == FAIL)
5944 goto wanted_comma;
5f4273c7 5945
037e8744 5946 if ((val = arm_typed_reg_parse (&ptr, REG_TYPE_VFSD, &rtype, &optype))
dcbf9037 5947 == FAIL)
5287ad62 5948 {
037e8744 5949 first_error (_(reg_expected_msgs[REG_TYPE_VFSD]));
5287ad62
JB
5950 return FAIL;
5951 }
5952
5953 inst.operands[i].reg = val;
5954 inst.operands[i].isreg = 1;
037e8744
JB
5955 inst.operands[i].isvec = 1;
5956 inst.operands[i].issingle = (rtype == REG_TYPE_VFS);
dcbf9037 5957 inst.operands[i].vectype = optype;
5287ad62 5958 inst.operands[i].present = 1;
5f4273c7 5959
037e8744
JB
5960 if (rtype == REG_TYPE_VFS)
5961 {
5962 /* Case 14. */
5963 i++;
5964 if (skip_past_comma (&ptr) == FAIL)
5965 goto wanted_comma;
5966 if ((val = arm_typed_reg_parse (&ptr, REG_TYPE_VFS, NULL,
5967 &optype)) == FAIL)
5968 {
5969 first_error (_(reg_expected_msgs[REG_TYPE_VFS]));
5970 return FAIL;
5971 }
5972 inst.operands[i].reg = val;
5973 inst.operands[i].isreg = 1;
5974 inst.operands[i].isvec = 1;
5975 inst.operands[i].issingle = 1;
5976 inst.operands[i].vectype = optype;
5977 inst.operands[i].present = 1;
5978 }
5979 }
5980 else if ((val = arm_typed_reg_parse (&ptr, REG_TYPE_VFS, NULL, &optype))
5981 != FAIL)
5982 {
5983 /* Case 13. */
5984 inst.operands[i].reg = val;
5985 inst.operands[i].isreg = 1;
5986 inst.operands[i].isvec = 1;
5987 inst.operands[i].issingle = 1;
5988 inst.operands[i].vectype = optype;
5989 inst.operands[i++].present = 1;
5287ad62
JB
5990 }
5991 }
5992 else
5993 {
dcbf9037 5994 first_error (_("parse error"));
5287ad62
JB
5995 return FAIL;
5996 }
5997
5998 /* Successfully parsed the operands. Update args. */
5999 *which_operand = i;
6000 *str = ptr;
6001 return SUCCESS;
6002
5f4273c7 6003 wanted_comma:
dcbf9037 6004 first_error (_("expected comma"));
5287ad62 6005 return FAIL;
5f4273c7
NC
6006
6007 wanted_arm:
dcbf9037 6008 first_error (_(reg_expected_msgs[REG_TYPE_RN]));
5287ad62 6009 return FAIL;
5287ad62
JB
6010}
6011
5be8be5d
DG
6012/* Use this macro when the operand constraints are different
6013 for ARM and THUMB (e.g. ldrd). */
6014#define MIX_ARM_THUMB_OPERANDS(arm_operand, thumb_operand) \
6015 ((arm_operand) | ((thumb_operand) << 16))
6016
c19d1205
ZW
6017/* Matcher codes for parse_operands. */
6018enum operand_parse_code
6019{
6020 OP_stop, /* end of line */
6021
6022 OP_RR, /* ARM register */
6023 OP_RRnpc, /* ARM register, not r15 */
5be8be5d 6024 OP_RRnpcsp, /* ARM register, neither r15 nor r13 (a.k.a. 'BadReg') */
c19d1205 6025 OP_RRnpcb, /* ARM register, not r15, in square brackets */
55881a11
MGD
6026 OP_RRnpctw, /* ARM register, not r15 in Thumb-state or with writeback,
6027 optional trailing ! */
c19d1205
ZW
6028 OP_RRw, /* ARM register, not r15, optional trailing ! */
6029 OP_RCP, /* Coprocessor number */
6030 OP_RCN, /* Coprocessor register */
6031 OP_RF, /* FPA register */
6032 OP_RVS, /* VFP single precision register */
5287ad62
JB
6033 OP_RVD, /* VFP double precision register (0..15) */
6034 OP_RND, /* Neon double precision register (0..31) */
6035 OP_RNQ, /* Neon quad precision register */
037e8744 6036 OP_RVSD, /* VFP single or double precision register */
5287ad62 6037 OP_RNDQ, /* Neon double or quad precision register */
037e8744 6038 OP_RNSDQ, /* Neon single, double or quad precision register */
5287ad62 6039 OP_RNSC, /* Neon scalar D[X] */
c19d1205
ZW
6040 OP_RVC, /* VFP control register */
6041 OP_RMF, /* Maverick F register */
6042 OP_RMD, /* Maverick D register */
6043 OP_RMFX, /* Maverick FX register */
6044 OP_RMDX, /* Maverick DX register */
6045 OP_RMAX, /* Maverick AX register */
6046 OP_RMDS, /* Maverick DSPSC register */
6047 OP_RIWR, /* iWMMXt wR register */
6048 OP_RIWC, /* iWMMXt wC register */
6049 OP_RIWG, /* iWMMXt wCG register */
6050 OP_RXA, /* XScale accumulator register */
6051
6052 OP_REGLST, /* ARM register list */
6053 OP_VRSLST, /* VFP single-precision register list */
6054 OP_VRDLST, /* VFP double-precision register list */
037e8744 6055 OP_VRSDLST, /* VFP single or double-precision register list (& quad) */
5287ad62
JB
6056 OP_NRDLST, /* Neon double-precision register list (d0-d31, qN aliases) */
6057 OP_NSTRLST, /* Neon element/structure list */
6058
5287ad62 6059 OP_RNDQ_I0, /* Neon D or Q reg, or immediate zero. */
037e8744 6060 OP_RVSD_I0, /* VFP S or D reg, or immediate zero. */
5287ad62 6061 OP_RR_RNSC, /* ARM reg or Neon scalar. */
037e8744 6062 OP_RNSDQ_RNSC, /* Vector S, D or Q reg, or Neon scalar. */
5287ad62
JB
6063 OP_RNDQ_RNSC, /* Neon D or Q reg, or Neon scalar. */
6064 OP_RND_RNSC, /* Neon D reg, or Neon scalar. */
6065 OP_VMOV, /* Neon VMOV operands. */
4316f0d2 6066 OP_RNDQ_Ibig, /* Neon D or Q reg, or big immediate for logic and VMVN. */
5287ad62 6067 OP_RNDQ_I63b, /* Neon D or Q reg, or immediate for shift. */
2d447fca 6068 OP_RIWR_I32z, /* iWMMXt wR register, or immediate 0 .. 32 for iWMMXt2. */
5287ad62
JB
6069
6070 OP_I0, /* immediate zero */
c19d1205
ZW
6071 OP_I7, /* immediate value 0 .. 7 */
6072 OP_I15, /* 0 .. 15 */
6073 OP_I16, /* 1 .. 16 */
5287ad62 6074 OP_I16z, /* 0 .. 16 */
c19d1205
ZW
6075 OP_I31, /* 0 .. 31 */
6076 OP_I31w, /* 0 .. 31, optional trailing ! */
6077 OP_I32, /* 1 .. 32 */
5287ad62
JB
6078 OP_I32z, /* 0 .. 32 */
6079 OP_I63, /* 0 .. 63 */
c19d1205 6080 OP_I63s, /* -64 .. 63 */
5287ad62
JB
6081 OP_I64, /* 1 .. 64 */
6082 OP_I64z, /* 0 .. 64 */
c19d1205 6083 OP_I255, /* 0 .. 255 */
c19d1205
ZW
6084
6085 OP_I4b, /* immediate, prefix optional, 1 .. 4 */
6086 OP_I7b, /* 0 .. 7 */
6087 OP_I15b, /* 0 .. 15 */
6088 OP_I31b, /* 0 .. 31 */
6089
6090 OP_SH, /* shifter operand */
4962c51a 6091 OP_SHG, /* shifter operand with possible group relocation */
c19d1205 6092 OP_ADDR, /* Memory address expression (any mode) */
4962c51a
MS
6093 OP_ADDRGLDR, /* Mem addr expr (any mode) with possible LDR group reloc */
6094 OP_ADDRGLDRS, /* Mem addr expr (any mode) with possible LDRS group reloc */
6095 OP_ADDRGLDC, /* Mem addr expr (any mode) with possible LDC group reloc */
c19d1205
ZW
6096 OP_EXP, /* arbitrary expression */
6097 OP_EXPi, /* same, with optional immediate prefix */
6098 OP_EXPr, /* same, with optional relocation suffix */
b6895b4f 6099 OP_HALF, /* 0 .. 65535 or low/high reloc. */
c19d1205
ZW
6100
6101 OP_CPSF, /* CPS flags */
6102 OP_ENDI, /* Endianness specifier */
d2cd1205
JB
6103 OP_wPSR, /* CPSR/SPSR/APSR mask for msr (writing). */
6104 OP_rPSR, /* CPSR/SPSR/APSR mask for msr (reading). */
c19d1205 6105 OP_COND, /* conditional code */
92e90b6e 6106 OP_TB, /* Table branch. */
c19d1205 6107
037e8744
JB
6108 OP_APSR_RR, /* ARM register or "APSR_nzcv". */
6109
c19d1205
ZW
6110 OP_RRnpc_I0, /* ARM register or literal 0 */
6111 OP_RR_EXr, /* ARM register or expression with opt. reloc suff. */
6112 OP_RR_EXi, /* ARM register or expression with imm prefix */
6113 OP_RF_IF, /* FPA register or immediate */
6114 OP_RIWR_RIWC, /* iWMMXt R or C reg */
41adaa5c 6115 OP_RIWC_RIWG, /* iWMMXt wC or wCG reg */
c19d1205
ZW
6116
6117 /* Optional operands. */
6118 OP_oI7b, /* immediate, prefix optional, 0 .. 7 */
6119 OP_oI31b, /* 0 .. 31 */
5287ad62 6120 OP_oI32b, /* 1 .. 32 */
c19d1205
ZW
6121 OP_oIffffb, /* 0 .. 65535 */
6122 OP_oI255c, /* curly-brace enclosed, 0 .. 255 */
6123
6124 OP_oRR, /* ARM register */
6125 OP_oRRnpc, /* ARM register, not the PC */
5be8be5d 6126 OP_oRRnpcsp, /* ARM register, neither the PC nor the SP (a.k.a. BadReg) */
b6702015 6127 OP_oRRw, /* ARM register, not r15, optional trailing ! */
5287ad62
JB
6128 OP_oRND, /* Optional Neon double precision register */
6129 OP_oRNQ, /* Optional Neon quad precision register */
6130 OP_oRNDQ, /* Optional Neon double or quad precision register */
037e8744 6131 OP_oRNSDQ, /* Optional single, double or quad precision vector register */
c19d1205
ZW
6132 OP_oSHll, /* LSL immediate */
6133 OP_oSHar, /* ASR immediate */
6134 OP_oSHllar, /* LSL or ASR immediate */
6135 OP_oROR, /* ROR 0/8/16/24 */
52e7f43d 6136 OP_oBARRIER_I15, /* Option argument for a barrier instruction. */
c19d1205 6137
5be8be5d
DG
6138 /* Some pre-defined mixed (ARM/THUMB) operands. */
6139 OP_RR_npcsp = MIX_ARM_THUMB_OPERANDS (OP_RR, OP_RRnpcsp),
6140 OP_RRnpc_npcsp = MIX_ARM_THUMB_OPERANDS (OP_RRnpc, OP_RRnpcsp),
6141 OP_oRRnpc_npcsp = MIX_ARM_THUMB_OPERANDS (OP_oRRnpc, OP_oRRnpcsp),
6142
c19d1205
ZW
6143 OP_FIRST_OPTIONAL = OP_oI7b
6144};
a737bd4d 6145
c19d1205
ZW
6146/* Generic instruction operand parser. This does no encoding and no
6147 semantic validation; it merely squirrels values away in the inst
6148 structure. Returns SUCCESS or FAIL depending on whether the
6149 specified grammar matched. */
6150static int
5be8be5d 6151parse_operands (char *str, const unsigned int *pattern, bfd_boolean thumb)
c19d1205 6152{
5be8be5d 6153 unsigned const int *upat = pattern;
c19d1205
ZW
6154 char *backtrack_pos = 0;
6155 const char *backtrack_error = 0;
6156 int i, val, backtrack_index = 0;
5287ad62 6157 enum arm_reg_type rtype;
4962c51a 6158 parse_operand_result result;
5be8be5d 6159 unsigned int op_parse_code;
c19d1205 6160
e07e6e58
NC
6161#define po_char_or_fail(chr) \
6162 do \
6163 { \
6164 if (skip_past_char (&str, chr) == FAIL) \
6165 goto bad_args; \
6166 } \
6167 while (0)
c19d1205 6168
e07e6e58
NC
6169#define po_reg_or_fail(regtype) \
6170 do \
dcbf9037 6171 { \
e07e6e58
NC
6172 val = arm_typed_reg_parse (& str, regtype, & rtype, \
6173 & inst.operands[i].vectype); \
6174 if (val == FAIL) \
6175 { \
6176 first_error (_(reg_expected_msgs[regtype])); \
6177 goto failure; \
6178 } \
6179 inst.operands[i].reg = val; \
6180 inst.operands[i].isreg = 1; \
6181 inst.operands[i].isquad = (rtype == REG_TYPE_NQ); \
6182 inst.operands[i].issingle = (rtype == REG_TYPE_VFS); \
6183 inst.operands[i].isvec = (rtype == REG_TYPE_VFS \
6184 || rtype == REG_TYPE_VFD \
6185 || rtype == REG_TYPE_NQ); \
dcbf9037 6186 } \
e07e6e58
NC
6187 while (0)
6188
6189#define po_reg_or_goto(regtype, label) \
6190 do \
6191 { \
6192 val = arm_typed_reg_parse (& str, regtype, & rtype, \
6193 & inst.operands[i].vectype); \
6194 if (val == FAIL) \
6195 goto label; \
dcbf9037 6196 \
e07e6e58
NC
6197 inst.operands[i].reg = val; \
6198 inst.operands[i].isreg = 1; \
6199 inst.operands[i].isquad = (rtype == REG_TYPE_NQ); \
6200 inst.operands[i].issingle = (rtype == REG_TYPE_VFS); \
6201 inst.operands[i].isvec = (rtype == REG_TYPE_VFS \
6202 || rtype == REG_TYPE_VFD \
6203 || rtype == REG_TYPE_NQ); \
6204 } \
6205 while (0)
6206
6207#define po_imm_or_fail(min, max, popt) \
6208 do \
6209 { \
6210 if (parse_immediate (&str, &val, min, max, popt) == FAIL) \
6211 goto failure; \
6212 inst.operands[i].imm = val; \
6213 } \
6214 while (0)
6215
6216#define po_scalar_or_goto(elsz, label) \
6217 do \
6218 { \
6219 val = parse_scalar (& str, elsz, & inst.operands[i].vectype); \
6220 if (val == FAIL) \
6221 goto label; \
6222 inst.operands[i].reg = val; \
6223 inst.operands[i].isscalar = 1; \
6224 } \
6225 while (0)
6226
6227#define po_misc_or_fail(expr) \
6228 do \
6229 { \
6230 if (expr) \
6231 goto failure; \
6232 } \
6233 while (0)
6234
6235#define po_misc_or_fail_no_backtrack(expr) \
6236 do \
6237 { \
6238 result = expr; \
6239 if (result == PARSE_OPERAND_FAIL_NO_BACKTRACK) \
6240 backtrack_pos = 0; \
6241 if (result != PARSE_OPERAND_SUCCESS) \
6242 goto failure; \
6243 } \
6244 while (0)
4962c51a 6245
52e7f43d
RE
6246#define po_barrier_or_imm(str) \
6247 do \
6248 { \
6249 val = parse_barrier (&str); \
6250 if (val == FAIL) \
6251 { \
6252 if (ISALPHA (*str)) \
6253 goto failure; \
6254 else \
6255 goto immediate; \
6256 } \
6257 else \
6258 { \
6259 if ((inst.instruction & 0xf0) == 0x60 \
6260 && val != 0xf) \
6261 { \
6262 /* ISB can only take SY as an option. */ \
6263 inst.error = _("invalid barrier type"); \
6264 goto failure; \
6265 } \
6266 } \
6267 } \
6268 while (0)
6269
c19d1205
ZW
6270 skip_whitespace (str);
6271
6272 for (i = 0; upat[i] != OP_stop; i++)
6273 {
5be8be5d
DG
6274 op_parse_code = upat[i];
6275 if (op_parse_code >= 1<<16)
6276 op_parse_code = thumb ? (op_parse_code >> 16)
6277 : (op_parse_code & ((1<<16)-1));
6278
6279 if (op_parse_code >= OP_FIRST_OPTIONAL)
c19d1205
ZW
6280 {
6281 /* Remember where we are in case we need to backtrack. */
9c2799c2 6282 gas_assert (!backtrack_pos);
c19d1205
ZW
6283 backtrack_pos = str;
6284 backtrack_error = inst.error;
6285 backtrack_index = i;
6286 }
6287
b6702015 6288 if (i > 0 && (i > 1 || inst.operands[0].present))
c19d1205
ZW
6289 po_char_or_fail (',');
6290
5be8be5d 6291 switch (op_parse_code)
c19d1205
ZW
6292 {
6293 /* Registers */
6294 case OP_oRRnpc:
5be8be5d 6295 case OP_oRRnpcsp:
c19d1205 6296 case OP_RRnpc:
5be8be5d 6297 case OP_RRnpcsp:
c19d1205
ZW
6298 case OP_oRR:
6299 case OP_RR: po_reg_or_fail (REG_TYPE_RN); break;
6300 case OP_RCP: po_reg_or_fail (REG_TYPE_CP); break;
6301 case OP_RCN: po_reg_or_fail (REG_TYPE_CN); break;
6302 case OP_RF: po_reg_or_fail (REG_TYPE_FN); break;
6303 case OP_RVS: po_reg_or_fail (REG_TYPE_VFS); break;
6304 case OP_RVD: po_reg_or_fail (REG_TYPE_VFD); break;
5287ad62
JB
6305 case OP_oRND:
6306 case OP_RND: po_reg_or_fail (REG_TYPE_VFD); break;
cd2cf30b
PB
6307 case OP_RVC:
6308 po_reg_or_goto (REG_TYPE_VFC, coproc_reg);
6309 break;
6310 /* Also accept generic coprocessor regs for unknown registers. */
6311 coproc_reg:
6312 po_reg_or_fail (REG_TYPE_CN);
6313 break;
c19d1205
ZW
6314 case OP_RMF: po_reg_or_fail (REG_TYPE_MVF); break;
6315 case OP_RMD: po_reg_or_fail (REG_TYPE_MVD); break;
6316 case OP_RMFX: po_reg_or_fail (REG_TYPE_MVFX); break;
6317 case OP_RMDX: po_reg_or_fail (REG_TYPE_MVDX); break;
6318 case OP_RMAX: po_reg_or_fail (REG_TYPE_MVAX); break;
6319 case OP_RMDS: po_reg_or_fail (REG_TYPE_DSPSC); break;
6320 case OP_RIWR: po_reg_or_fail (REG_TYPE_MMXWR); break;
6321 case OP_RIWC: po_reg_or_fail (REG_TYPE_MMXWC); break;
6322 case OP_RIWG: po_reg_or_fail (REG_TYPE_MMXWCG); break;
6323 case OP_RXA: po_reg_or_fail (REG_TYPE_XSCALE); break;
5287ad62
JB
6324 case OP_oRNQ:
6325 case OP_RNQ: po_reg_or_fail (REG_TYPE_NQ); break;
6326 case OP_oRNDQ:
6327 case OP_RNDQ: po_reg_or_fail (REG_TYPE_NDQ); break;
037e8744
JB
6328 case OP_RVSD: po_reg_or_fail (REG_TYPE_VFSD); break;
6329 case OP_oRNSDQ:
6330 case OP_RNSDQ: po_reg_or_fail (REG_TYPE_NSDQ); break;
5287ad62
JB
6331
6332 /* Neon scalar. Using an element size of 8 means that some invalid
6333 scalars are accepted here, so deal with those in later code. */
6334 case OP_RNSC: po_scalar_or_goto (8, failure); break;
6335
5287ad62
JB
6336 case OP_RNDQ_I0:
6337 {
6338 po_reg_or_goto (REG_TYPE_NDQ, try_imm0);
6339 break;
6340 try_imm0:
6341 po_imm_or_fail (0, 0, TRUE);
6342 }
6343 break;
6344
037e8744
JB
6345 case OP_RVSD_I0:
6346 po_reg_or_goto (REG_TYPE_VFSD, try_imm0);
6347 break;
6348
5287ad62
JB
6349 case OP_RR_RNSC:
6350 {
6351 po_scalar_or_goto (8, try_rr);
6352 break;
6353 try_rr:
6354 po_reg_or_fail (REG_TYPE_RN);
6355 }
6356 break;
6357
037e8744
JB
6358 case OP_RNSDQ_RNSC:
6359 {
6360 po_scalar_or_goto (8, try_nsdq);
6361 break;
6362 try_nsdq:
6363 po_reg_or_fail (REG_TYPE_NSDQ);
6364 }
6365 break;
6366
5287ad62
JB
6367 case OP_RNDQ_RNSC:
6368 {
6369 po_scalar_or_goto (8, try_ndq);
6370 break;
6371 try_ndq:
6372 po_reg_or_fail (REG_TYPE_NDQ);
6373 }
6374 break;
6375
6376 case OP_RND_RNSC:
6377 {
6378 po_scalar_or_goto (8, try_vfd);
6379 break;
6380 try_vfd:
6381 po_reg_or_fail (REG_TYPE_VFD);
6382 }
6383 break;
6384
6385 case OP_VMOV:
6386 /* WARNING: parse_neon_mov can move the operand counter, i. If we're
6387 not careful then bad things might happen. */
6388 po_misc_or_fail (parse_neon_mov (&str, &i) == FAIL);
6389 break;
6390
4316f0d2 6391 case OP_RNDQ_Ibig:
5287ad62 6392 {
4316f0d2 6393 po_reg_or_goto (REG_TYPE_NDQ, try_immbig);
5287ad62 6394 break;
4316f0d2 6395 try_immbig:
5287ad62
JB
6396 /* There's a possibility of getting a 64-bit immediate here, so
6397 we need special handling. */
6398 if (parse_big_immediate (&str, i) == FAIL)
6399 {
6400 inst.error = _("immediate value is out of range");
6401 goto failure;
6402 }
6403 }
6404 break;
6405
6406 case OP_RNDQ_I63b:
6407 {
6408 po_reg_or_goto (REG_TYPE_NDQ, try_shimm);
6409 break;
6410 try_shimm:
6411 po_imm_or_fail (0, 63, TRUE);
6412 }
6413 break;
c19d1205
ZW
6414
6415 case OP_RRnpcb:
6416 po_char_or_fail ('[');
6417 po_reg_or_fail (REG_TYPE_RN);
6418 po_char_or_fail (']');
6419 break;
a737bd4d 6420
55881a11 6421 case OP_RRnpctw:
c19d1205 6422 case OP_RRw:
b6702015 6423 case OP_oRRw:
c19d1205
ZW
6424 po_reg_or_fail (REG_TYPE_RN);
6425 if (skip_past_char (&str, '!') == SUCCESS)
6426 inst.operands[i].writeback = 1;
6427 break;
6428
6429 /* Immediates */
6430 case OP_I7: po_imm_or_fail ( 0, 7, FALSE); break;
6431 case OP_I15: po_imm_or_fail ( 0, 15, FALSE); break;
6432 case OP_I16: po_imm_or_fail ( 1, 16, FALSE); break;
5287ad62 6433 case OP_I16z: po_imm_or_fail ( 0, 16, FALSE); break;
c19d1205
ZW
6434 case OP_I31: po_imm_or_fail ( 0, 31, FALSE); break;
6435 case OP_I32: po_imm_or_fail ( 1, 32, FALSE); break;
5287ad62 6436 case OP_I32z: po_imm_or_fail ( 0, 32, FALSE); break;
c19d1205 6437 case OP_I63s: po_imm_or_fail (-64, 63, FALSE); break;
5287ad62
JB
6438 case OP_I63: po_imm_or_fail ( 0, 63, FALSE); break;
6439 case OP_I64: po_imm_or_fail ( 1, 64, FALSE); break;
6440 case OP_I64z: po_imm_or_fail ( 0, 64, FALSE); break;
c19d1205 6441 case OP_I255: po_imm_or_fail ( 0, 255, FALSE); break;
c19d1205
ZW
6442
6443 case OP_I4b: po_imm_or_fail ( 1, 4, TRUE); break;
6444 case OP_oI7b:
6445 case OP_I7b: po_imm_or_fail ( 0, 7, TRUE); break;
6446 case OP_I15b: po_imm_or_fail ( 0, 15, TRUE); break;
6447 case OP_oI31b:
6448 case OP_I31b: po_imm_or_fail ( 0, 31, TRUE); break;
5287ad62 6449 case OP_oI32b: po_imm_or_fail ( 1, 32, TRUE); break;
c19d1205
ZW
6450 case OP_oIffffb: po_imm_or_fail ( 0, 0xffff, TRUE); break;
6451
6452 /* Immediate variants */
6453 case OP_oI255c:
6454 po_char_or_fail ('{');
6455 po_imm_or_fail (0, 255, TRUE);
6456 po_char_or_fail ('}');
6457 break;
6458
6459 case OP_I31w:
6460 /* The expression parser chokes on a trailing !, so we have
6461 to find it first and zap it. */
6462 {
6463 char *s = str;
6464 while (*s && *s != ',')
6465 s++;
6466 if (s[-1] == '!')
6467 {
6468 s[-1] = '\0';
6469 inst.operands[i].writeback = 1;
6470 }
6471 po_imm_or_fail (0, 31, TRUE);
6472 if (str == s - 1)
6473 str = s;
6474 }
6475 break;
6476
6477 /* Expressions */
6478 case OP_EXPi: EXPi:
6479 po_misc_or_fail (my_get_expression (&inst.reloc.exp, &str,
6480 GE_OPT_PREFIX));
6481 break;
6482
6483 case OP_EXP:
6484 po_misc_or_fail (my_get_expression (&inst.reloc.exp, &str,
6485 GE_NO_PREFIX));
6486 break;
6487
6488 case OP_EXPr: EXPr:
6489 po_misc_or_fail (my_get_expression (&inst.reloc.exp, &str,
6490 GE_NO_PREFIX));
6491 if (inst.reloc.exp.X_op == O_symbol)
a737bd4d 6492 {
c19d1205
ZW
6493 val = parse_reloc (&str);
6494 if (val == -1)
6495 {
6496 inst.error = _("unrecognized relocation suffix");
6497 goto failure;
6498 }
6499 else if (val != BFD_RELOC_UNUSED)
6500 {
6501 inst.operands[i].imm = val;
6502 inst.operands[i].hasreloc = 1;
6503 }
a737bd4d 6504 }
c19d1205 6505 break;
a737bd4d 6506
b6895b4f
PB
6507 /* Operand for MOVW or MOVT. */
6508 case OP_HALF:
6509 po_misc_or_fail (parse_half (&str));
6510 break;
6511
e07e6e58 6512 /* Register or expression. */
c19d1205
ZW
6513 case OP_RR_EXr: po_reg_or_goto (REG_TYPE_RN, EXPr); break;
6514 case OP_RR_EXi: po_reg_or_goto (REG_TYPE_RN, EXPi); break;
a737bd4d 6515
e07e6e58 6516 /* Register or immediate. */
c19d1205
ZW
6517 case OP_RRnpc_I0: po_reg_or_goto (REG_TYPE_RN, I0); break;
6518 I0: po_imm_or_fail (0, 0, FALSE); break;
a737bd4d 6519
c19d1205
ZW
6520 case OP_RF_IF: po_reg_or_goto (REG_TYPE_FN, IF); break;
6521 IF:
6522 if (!is_immediate_prefix (*str))
6523 goto bad_args;
6524 str++;
6525 val = parse_fpa_immediate (&str);
6526 if (val == FAIL)
6527 goto failure;
6528 /* FPA immediates are encoded as registers 8-15.
6529 parse_fpa_immediate has already applied the offset. */
6530 inst.operands[i].reg = val;
6531 inst.operands[i].isreg = 1;
6532 break;
09d92015 6533
2d447fca
JM
6534 case OP_RIWR_I32z: po_reg_or_goto (REG_TYPE_MMXWR, I32z); break;
6535 I32z: po_imm_or_fail (0, 32, FALSE); break;
6536
e07e6e58 6537 /* Two kinds of register. */
c19d1205
ZW
6538 case OP_RIWR_RIWC:
6539 {
6540 struct reg_entry *rege = arm_reg_parse_multi (&str);
97f87066
JM
6541 if (!rege
6542 || (rege->type != REG_TYPE_MMXWR
6543 && rege->type != REG_TYPE_MMXWC
6544 && rege->type != REG_TYPE_MMXWCG))
c19d1205
ZW
6545 {
6546 inst.error = _("iWMMXt data or control register expected");
6547 goto failure;
6548 }
6549 inst.operands[i].reg = rege->number;
6550 inst.operands[i].isreg = (rege->type == REG_TYPE_MMXWR);
6551 }
6552 break;
09d92015 6553
41adaa5c
JM
6554 case OP_RIWC_RIWG:
6555 {
6556 struct reg_entry *rege = arm_reg_parse_multi (&str);
6557 if (!rege
6558 || (rege->type != REG_TYPE_MMXWC
6559 && rege->type != REG_TYPE_MMXWCG))
6560 {
6561 inst.error = _("iWMMXt control register expected");
6562 goto failure;
6563 }
6564 inst.operands[i].reg = rege->number;
6565 inst.operands[i].isreg = 1;
6566 }
6567 break;
6568
c19d1205
ZW
6569 /* Misc */
6570 case OP_CPSF: val = parse_cps_flags (&str); break;
6571 case OP_ENDI: val = parse_endian_specifier (&str); break;
6572 case OP_oROR: val = parse_ror (&str); break;
c19d1205 6573 case OP_COND: val = parse_cond (&str); break;
52e7f43d
RE
6574 case OP_oBARRIER_I15:
6575 po_barrier_or_imm (str); break;
6576 immediate:
6577 if (parse_immediate (&str, &val, 0, 15, TRUE) == FAIL)
6578 goto failure;
6579 break;
c19d1205 6580
d2cd1205
JB
6581 case OP_wPSR:
6582 case OP_rPSR:
90ec0d68
MGD
6583 po_reg_or_goto (REG_TYPE_RNB, try_psr);
6584 if (!ARM_CPU_HAS_FEATURE (cpu_variant, arm_ext_virt))
6585 {
6586 inst.error = _("Banked registers are not available with this "
6587 "architecture.");
6588 goto failure;
6589 }
6590 break;
d2cd1205
JB
6591 try_psr:
6592 val = parse_psr (&str, op_parse_code == OP_wPSR);
6593 break;
037e8744
JB
6594
6595 case OP_APSR_RR:
6596 po_reg_or_goto (REG_TYPE_RN, try_apsr);
6597 break;
6598 try_apsr:
6599 /* Parse "APSR_nvzc" operand (for FMSTAT-equivalent MRS
6600 instruction). */
6601 if (strncasecmp (str, "APSR_", 5) == 0)
6602 {
6603 unsigned found = 0;
6604 str += 5;
6605 while (found < 15)
6606 switch (*str++)
6607 {
6608 case 'c': found = (found & 1) ? 16 : found | 1; break;
6609 case 'n': found = (found & 2) ? 16 : found | 2; break;
6610 case 'z': found = (found & 4) ? 16 : found | 4; break;
6611 case 'v': found = (found & 8) ? 16 : found | 8; break;
6612 default: found = 16;
6613 }
6614 if (found != 15)
6615 goto failure;
6616 inst.operands[i].isvec = 1;
f7c21dc7
NC
6617 /* APSR_nzcv is encoded in instructions as if it were the REG_PC. */
6618 inst.operands[i].reg = REG_PC;
037e8744
JB
6619 }
6620 else
6621 goto failure;
6622 break;
6623
92e90b6e
PB
6624 case OP_TB:
6625 po_misc_or_fail (parse_tb (&str));
6626 break;
6627
e07e6e58 6628 /* Register lists. */
c19d1205
ZW
6629 case OP_REGLST:
6630 val = parse_reg_list (&str);
6631 if (*str == '^')
6632 {
6633 inst.operands[1].writeback = 1;
6634 str++;
6635 }
6636 break;
09d92015 6637
c19d1205 6638 case OP_VRSLST:
5287ad62 6639 val = parse_vfp_reg_list (&str, &inst.operands[i].reg, REGLIST_VFP_S);
c19d1205 6640 break;
09d92015 6641
c19d1205 6642 case OP_VRDLST:
5287ad62 6643 val = parse_vfp_reg_list (&str, &inst.operands[i].reg, REGLIST_VFP_D);
c19d1205 6644 break;
a737bd4d 6645
037e8744
JB
6646 case OP_VRSDLST:
6647 /* Allow Q registers too. */
6648 val = parse_vfp_reg_list (&str, &inst.operands[i].reg,
6649 REGLIST_NEON_D);
6650 if (val == FAIL)
6651 {
6652 inst.error = NULL;
6653 val = parse_vfp_reg_list (&str, &inst.operands[i].reg,
6654 REGLIST_VFP_S);
6655 inst.operands[i].issingle = 1;
6656 }
6657 break;
6658
5287ad62
JB
6659 case OP_NRDLST:
6660 val = parse_vfp_reg_list (&str, &inst.operands[i].reg,
6661 REGLIST_NEON_D);
6662 break;
6663
6664 case OP_NSTRLST:
dcbf9037
JB
6665 val = parse_neon_el_struct_list (&str, &inst.operands[i].reg,
6666 &inst.operands[i].vectype);
5287ad62
JB
6667 break;
6668
c19d1205
ZW
6669 /* Addressing modes */
6670 case OP_ADDR:
6671 po_misc_or_fail (parse_address (&str, i));
6672 break;
09d92015 6673
4962c51a
MS
6674 case OP_ADDRGLDR:
6675 po_misc_or_fail_no_backtrack (
6676 parse_address_group_reloc (&str, i, GROUP_LDR));
6677 break;
6678
6679 case OP_ADDRGLDRS:
6680 po_misc_or_fail_no_backtrack (
6681 parse_address_group_reloc (&str, i, GROUP_LDRS));
6682 break;
6683
6684 case OP_ADDRGLDC:
6685 po_misc_or_fail_no_backtrack (
6686 parse_address_group_reloc (&str, i, GROUP_LDC));
6687 break;
6688
c19d1205
ZW
6689 case OP_SH:
6690 po_misc_or_fail (parse_shifter_operand (&str, i));
6691 break;
09d92015 6692
4962c51a
MS
6693 case OP_SHG:
6694 po_misc_or_fail_no_backtrack (
6695 parse_shifter_operand_group_reloc (&str, i));
6696 break;
6697
c19d1205
ZW
6698 case OP_oSHll:
6699 po_misc_or_fail (parse_shift (&str, i, SHIFT_LSL_IMMEDIATE));
6700 break;
09d92015 6701
c19d1205
ZW
6702 case OP_oSHar:
6703 po_misc_or_fail (parse_shift (&str, i, SHIFT_ASR_IMMEDIATE));
6704 break;
09d92015 6705
c19d1205
ZW
6706 case OP_oSHllar:
6707 po_misc_or_fail (parse_shift (&str, i, SHIFT_LSL_OR_ASR_IMMEDIATE));
6708 break;
09d92015 6709
c19d1205 6710 default:
5be8be5d 6711 as_fatal (_("unhandled operand code %d"), op_parse_code);
c19d1205 6712 }
09d92015 6713
c19d1205
ZW
6714 /* Various value-based sanity checks and shared operations. We
6715 do not signal immediate failures for the register constraints;
6716 this allows a syntax error to take precedence. */
5be8be5d 6717 switch (op_parse_code)
c19d1205
ZW
6718 {
6719 case OP_oRRnpc:
6720 case OP_RRnpc:
6721 case OP_RRnpcb:
6722 case OP_RRw:
b6702015 6723 case OP_oRRw:
c19d1205
ZW
6724 case OP_RRnpc_I0:
6725 if (inst.operands[i].isreg && inst.operands[i].reg == REG_PC)
6726 inst.error = BAD_PC;
6727 break;
09d92015 6728
5be8be5d
DG
6729 case OP_oRRnpcsp:
6730 case OP_RRnpcsp:
6731 if (inst.operands[i].isreg)
6732 {
6733 if (inst.operands[i].reg == REG_PC)
6734 inst.error = BAD_PC;
6735 else if (inst.operands[i].reg == REG_SP)
6736 inst.error = BAD_SP;
6737 }
6738 break;
6739
55881a11
MGD
6740 case OP_RRnpctw:
6741 if (inst.operands[i].isreg
6742 && inst.operands[i].reg == REG_PC
6743 && (inst.operands[i].writeback || thumb))
6744 inst.error = BAD_PC;
6745 break;
6746
c19d1205
ZW
6747 case OP_CPSF:
6748 case OP_ENDI:
6749 case OP_oROR:
d2cd1205
JB
6750 case OP_wPSR:
6751 case OP_rPSR:
c19d1205 6752 case OP_COND:
52e7f43d 6753 case OP_oBARRIER_I15:
c19d1205
ZW
6754 case OP_REGLST:
6755 case OP_VRSLST:
6756 case OP_VRDLST:
037e8744 6757 case OP_VRSDLST:
5287ad62
JB
6758 case OP_NRDLST:
6759 case OP_NSTRLST:
c19d1205
ZW
6760 if (val == FAIL)
6761 goto failure;
6762 inst.operands[i].imm = val;
6763 break;
a737bd4d 6764
c19d1205
ZW
6765 default:
6766 break;
6767 }
09d92015 6768
c19d1205
ZW
6769 /* If we get here, this operand was successfully parsed. */
6770 inst.operands[i].present = 1;
6771 continue;
09d92015 6772
c19d1205 6773 bad_args:
09d92015 6774 inst.error = BAD_ARGS;
c19d1205
ZW
6775
6776 failure:
6777 if (!backtrack_pos)
d252fdde
PB
6778 {
6779 /* The parse routine should already have set inst.error, but set a
5f4273c7 6780 default here just in case. */
d252fdde
PB
6781 if (!inst.error)
6782 inst.error = _("syntax error");
6783 return FAIL;
6784 }
c19d1205
ZW
6785
6786 /* Do not backtrack over a trailing optional argument that
6787 absorbed some text. We will only fail again, with the
6788 'garbage following instruction' error message, which is
6789 probably less helpful than the current one. */
6790 if (backtrack_index == i && backtrack_pos != str
6791 && upat[i+1] == OP_stop)
d252fdde
PB
6792 {
6793 if (!inst.error)
6794 inst.error = _("syntax error");
6795 return FAIL;
6796 }
c19d1205
ZW
6797
6798 /* Try again, skipping the optional argument at backtrack_pos. */
6799 str = backtrack_pos;
6800 inst.error = backtrack_error;
6801 inst.operands[backtrack_index].present = 0;
6802 i = backtrack_index;
6803 backtrack_pos = 0;
09d92015 6804 }
09d92015 6805
c19d1205
ZW
6806 /* Check that we have parsed all the arguments. */
6807 if (*str != '\0' && !inst.error)
6808 inst.error = _("garbage following instruction");
09d92015 6809
c19d1205 6810 return inst.error ? FAIL : SUCCESS;
09d92015
MM
6811}
6812
c19d1205
ZW
6813#undef po_char_or_fail
6814#undef po_reg_or_fail
6815#undef po_reg_or_goto
6816#undef po_imm_or_fail
5287ad62 6817#undef po_scalar_or_fail
52e7f43d 6818#undef po_barrier_or_imm
e07e6e58 6819
c19d1205 6820/* Shorthand macro for instruction encoding functions issuing errors. */
e07e6e58
NC
6821#define constraint(expr, err) \
6822 do \
c19d1205 6823 { \
e07e6e58
NC
6824 if (expr) \
6825 { \
6826 inst.error = err; \
6827 return; \
6828 } \
c19d1205 6829 } \
e07e6e58 6830 while (0)
c19d1205 6831
fdfde340
JM
6832/* Reject "bad registers" for Thumb-2 instructions. Many Thumb-2
6833 instructions are unpredictable if these registers are used. This
6834 is the BadReg predicate in ARM's Thumb-2 documentation. */
6835#define reject_bad_reg(reg) \
6836 do \
6837 if (reg == REG_SP || reg == REG_PC) \
6838 { \
6839 inst.error = (reg == REG_SP) ? BAD_SP : BAD_PC; \
6840 return; \
6841 } \
6842 while (0)
6843
94206790
MM
6844/* If REG is R13 (the stack pointer), warn that its use is
6845 deprecated. */
6846#define warn_deprecated_sp(reg) \
6847 do \
6848 if (warn_on_deprecated && reg == REG_SP) \
6849 as_warn (_("use of r13 is deprecated")); \
6850 while (0)
6851
c19d1205
ZW
6852/* Functions for operand encoding. ARM, then Thumb. */
6853
6854#define rotate_left(v, n) (v << n | v >> (32 - n))
6855
6856/* If VAL can be encoded in the immediate field of an ARM instruction,
6857 return the encoded form. Otherwise, return FAIL. */
6858
6859static unsigned int
6860encode_arm_immediate (unsigned int val)
09d92015 6861{
c19d1205
ZW
6862 unsigned int a, i;
6863
6864 for (i = 0; i < 32; i += 2)
6865 if ((a = rotate_left (val, i)) <= 0xff)
6866 return a | (i << 7); /* 12-bit pack: [shift-cnt,const]. */
6867
6868 return FAIL;
09d92015
MM
6869}
6870
c19d1205
ZW
6871/* If VAL can be encoded in the immediate field of a Thumb32 instruction,
6872 return the encoded form. Otherwise, return FAIL. */
6873static unsigned int
6874encode_thumb32_immediate (unsigned int val)
09d92015 6875{
c19d1205 6876 unsigned int a, i;
09d92015 6877
9c3c69f2 6878 if (val <= 0xff)
c19d1205 6879 return val;
a737bd4d 6880
9c3c69f2 6881 for (i = 1; i <= 24; i++)
09d92015 6882 {
9c3c69f2
PB
6883 a = val >> i;
6884 if ((val & ~(0xff << i)) == 0)
6885 return ((val >> i) & 0x7f) | ((32 - i) << 7);
09d92015 6886 }
a737bd4d 6887
c19d1205
ZW
6888 a = val & 0xff;
6889 if (val == ((a << 16) | a))
6890 return 0x100 | a;
6891 if (val == ((a << 24) | (a << 16) | (a << 8) | a))
6892 return 0x300 | a;
09d92015 6893
c19d1205
ZW
6894 a = val & 0xff00;
6895 if (val == ((a << 16) | a))
6896 return 0x200 | (a >> 8);
a737bd4d 6897
c19d1205 6898 return FAIL;
09d92015 6899}
5287ad62 6900/* Encode a VFP SP or DP register number into inst.instruction. */
09d92015
MM
6901
6902static void
5287ad62
JB
6903encode_arm_vfp_reg (int reg, enum vfp_reg_pos pos)
6904{
6905 if ((pos == VFP_REG_Dd || pos == VFP_REG_Dn || pos == VFP_REG_Dm)
6906 && reg > 15)
6907 {
b1cc4aeb 6908 if (ARM_CPU_HAS_FEATURE (cpu_variant, fpu_vfp_ext_d32))
5287ad62
JB
6909 {
6910 if (thumb_mode)
6911 ARM_MERGE_FEATURE_SETS (thumb_arch_used, thumb_arch_used,
b1cc4aeb 6912 fpu_vfp_ext_d32);
5287ad62
JB
6913 else
6914 ARM_MERGE_FEATURE_SETS (arm_arch_used, arm_arch_used,
b1cc4aeb 6915 fpu_vfp_ext_d32);
5287ad62
JB
6916 }
6917 else
6918 {
dcbf9037 6919 first_error (_("D register out of range for selected VFP version"));
5287ad62
JB
6920 return;
6921 }
6922 }
6923
c19d1205 6924 switch (pos)
09d92015 6925 {
c19d1205
ZW
6926 case VFP_REG_Sd:
6927 inst.instruction |= ((reg >> 1) << 12) | ((reg & 1) << 22);
6928 break;
6929
6930 case VFP_REG_Sn:
6931 inst.instruction |= ((reg >> 1) << 16) | ((reg & 1) << 7);
6932 break;
6933
6934 case VFP_REG_Sm:
6935 inst.instruction |= ((reg >> 1) << 0) | ((reg & 1) << 5);
6936 break;
6937
5287ad62
JB
6938 case VFP_REG_Dd:
6939 inst.instruction |= ((reg & 15) << 12) | ((reg >> 4) << 22);
6940 break;
5f4273c7 6941
5287ad62
JB
6942 case VFP_REG_Dn:
6943 inst.instruction |= ((reg & 15) << 16) | ((reg >> 4) << 7);
6944 break;
5f4273c7 6945
5287ad62
JB
6946 case VFP_REG_Dm:
6947 inst.instruction |= (reg & 15) | ((reg >> 4) << 5);
6948 break;
6949
c19d1205
ZW
6950 default:
6951 abort ();
09d92015 6952 }
09d92015
MM
6953}
6954
c19d1205 6955/* Encode a <shift> in an ARM-format instruction. The immediate,
55cf6793 6956 if any, is handled by md_apply_fix. */
09d92015 6957static void
c19d1205 6958encode_arm_shift (int i)
09d92015 6959{
c19d1205
ZW
6960 if (inst.operands[i].shift_kind == SHIFT_RRX)
6961 inst.instruction |= SHIFT_ROR << 5;
6962 else
09d92015 6963 {
c19d1205
ZW
6964 inst.instruction |= inst.operands[i].shift_kind << 5;
6965 if (inst.operands[i].immisreg)
6966 {
6967 inst.instruction |= SHIFT_BY_REG;
6968 inst.instruction |= inst.operands[i].imm << 8;
6969 }
6970 else
6971 inst.reloc.type = BFD_RELOC_ARM_SHIFT_IMM;
09d92015 6972 }
c19d1205 6973}
09d92015 6974
c19d1205
ZW
6975static void
6976encode_arm_shifter_operand (int i)
6977{
6978 if (inst.operands[i].isreg)
09d92015 6979 {
c19d1205
ZW
6980 inst.instruction |= inst.operands[i].reg;
6981 encode_arm_shift (i);
09d92015 6982 }
c19d1205
ZW
6983 else
6984 inst.instruction |= INST_IMMEDIATE;
09d92015
MM
6985}
6986
c19d1205 6987/* Subroutine of encode_arm_addr_mode_2 and encode_arm_addr_mode_3. */
09d92015 6988static void
c19d1205 6989encode_arm_addr_mode_common (int i, bfd_boolean is_t)
09d92015 6990{
9c2799c2 6991 gas_assert (inst.operands[i].isreg);
c19d1205 6992 inst.instruction |= inst.operands[i].reg << 16;
a737bd4d 6993
c19d1205 6994 if (inst.operands[i].preind)
09d92015 6995 {
c19d1205
ZW
6996 if (is_t)
6997 {
6998 inst.error = _("instruction does not accept preindexed addressing");
6999 return;
7000 }
7001 inst.instruction |= PRE_INDEX;
7002 if (inst.operands[i].writeback)
7003 inst.instruction |= WRITE_BACK;
09d92015 7004
c19d1205
ZW
7005 }
7006 else if (inst.operands[i].postind)
7007 {
9c2799c2 7008 gas_assert (inst.operands[i].writeback);
c19d1205
ZW
7009 if (is_t)
7010 inst.instruction |= WRITE_BACK;
7011 }
7012 else /* unindexed - only for coprocessor */
09d92015 7013 {
c19d1205 7014 inst.error = _("instruction does not accept unindexed addressing");
09d92015
MM
7015 return;
7016 }
7017
c19d1205
ZW
7018 if (((inst.instruction & WRITE_BACK) || !(inst.instruction & PRE_INDEX))
7019 && (((inst.instruction & 0x000f0000) >> 16)
7020 == ((inst.instruction & 0x0000f000) >> 12)))
7021 as_warn ((inst.instruction & LOAD_BIT)
7022 ? _("destination register same as write-back base")
7023 : _("source register same as write-back base"));
09d92015
MM
7024}
7025
c19d1205
ZW
7026/* inst.operands[i] was set up by parse_address. Encode it into an
7027 ARM-format mode 2 load or store instruction. If is_t is true,
7028 reject forms that cannot be used with a T instruction (i.e. not
7029 post-indexed). */
a737bd4d 7030static void
c19d1205 7031encode_arm_addr_mode_2 (int i, bfd_boolean is_t)
09d92015 7032{
5be8be5d
DG
7033 const bfd_boolean is_pc = (inst.operands[i].reg == REG_PC);
7034
c19d1205 7035 encode_arm_addr_mode_common (i, is_t);
a737bd4d 7036
c19d1205 7037 if (inst.operands[i].immisreg)
09d92015 7038 {
5be8be5d
DG
7039 constraint ((inst.operands[i].imm == REG_PC
7040 || (is_pc && inst.operands[i].writeback)),
7041 BAD_PC_ADDRESSING);
c19d1205
ZW
7042 inst.instruction |= INST_IMMEDIATE; /* yes, this is backwards */
7043 inst.instruction |= inst.operands[i].imm;
7044 if (!inst.operands[i].negative)
7045 inst.instruction |= INDEX_UP;
7046 if (inst.operands[i].shifted)
7047 {
7048 if (inst.operands[i].shift_kind == SHIFT_RRX)
7049 inst.instruction |= SHIFT_ROR << 5;
7050 else
7051 {
7052 inst.instruction |= inst.operands[i].shift_kind << 5;
7053 inst.reloc.type = BFD_RELOC_ARM_SHIFT_IMM;
7054 }
7055 }
09d92015 7056 }
c19d1205 7057 else /* immediate offset in inst.reloc */
09d92015 7058 {
5be8be5d
DG
7059 if (is_pc && !inst.reloc.pc_rel)
7060 {
7061 const bfd_boolean is_load = ((inst.instruction & LOAD_BIT) != 0);
23a10334
JZ
7062
7063 /* If is_t is TRUE, it's called from do_ldstt. ldrt/strt
7064 cannot use PC in addressing.
7065 PC cannot be used in writeback addressing, either. */
7066 constraint ((is_t || inst.operands[i].writeback),
5be8be5d 7067 BAD_PC_ADDRESSING);
23a10334 7068
dc5ec521 7069 /* Use of PC in str is deprecated for ARMv7. */
23a10334
JZ
7070 if (warn_on_deprecated
7071 && !is_load
7072 && ARM_CPU_HAS_FEATURE (selected_cpu, arm_ext_v7))
7073 as_warn (_("use of PC in this instruction is deprecated"));
5be8be5d
DG
7074 }
7075
c19d1205 7076 if (inst.reloc.type == BFD_RELOC_UNUSED)
26d97720
NS
7077 {
7078 /* Prefer + for zero encoded value. */
7079 if (!inst.operands[i].negative)
7080 inst.instruction |= INDEX_UP;
7081 inst.reloc.type = BFD_RELOC_ARM_OFFSET_IMM;
7082 }
09d92015 7083 }
09d92015
MM
7084}
7085
c19d1205
ZW
7086/* inst.operands[i] was set up by parse_address. Encode it into an
7087 ARM-format mode 3 load or store instruction. Reject forms that
7088 cannot be used with such instructions. If is_t is true, reject
7089 forms that cannot be used with a T instruction (i.e. not
7090 post-indexed). */
7091static void
7092encode_arm_addr_mode_3 (int i, bfd_boolean is_t)
09d92015 7093{
c19d1205 7094 if (inst.operands[i].immisreg && inst.operands[i].shifted)
09d92015 7095 {
c19d1205
ZW
7096 inst.error = _("instruction does not accept scaled register index");
7097 return;
09d92015 7098 }
a737bd4d 7099
c19d1205 7100 encode_arm_addr_mode_common (i, is_t);
a737bd4d 7101
c19d1205
ZW
7102 if (inst.operands[i].immisreg)
7103 {
5be8be5d
DG
7104 constraint ((inst.operands[i].imm == REG_PC
7105 || inst.operands[i].reg == REG_PC),
7106 BAD_PC_ADDRESSING);
c19d1205
ZW
7107 inst.instruction |= inst.operands[i].imm;
7108 if (!inst.operands[i].negative)
7109 inst.instruction |= INDEX_UP;
7110 }
7111 else /* immediate offset in inst.reloc */
7112 {
5be8be5d
DG
7113 constraint ((inst.operands[i].reg == REG_PC && !inst.reloc.pc_rel
7114 && inst.operands[i].writeback),
7115 BAD_PC_WRITEBACK);
c19d1205
ZW
7116 inst.instruction |= HWOFFSET_IMM;
7117 if (inst.reloc.type == BFD_RELOC_UNUSED)
26d97720
NS
7118 {
7119 /* Prefer + for zero encoded value. */
7120 if (!inst.operands[i].negative)
7121 inst.instruction |= INDEX_UP;
7122
7123 inst.reloc.type = BFD_RELOC_ARM_OFFSET_IMM8;
7124 }
c19d1205 7125 }
a737bd4d
NC
7126}
7127
c19d1205
ZW
7128/* inst.operands[i] was set up by parse_address. Encode it into an
7129 ARM-format instruction. Reject all forms which cannot be encoded
7130 into a coprocessor load/store instruction. If wb_ok is false,
7131 reject use of writeback; if unind_ok is false, reject use of
7132 unindexed addressing. If reloc_override is not 0, use it instead
4962c51a
MS
7133 of BFD_ARM_CP_OFF_IMM, unless the initial relocation is a group one
7134 (in which case it is preserved). */
09d92015 7135
c19d1205
ZW
7136static int
7137encode_arm_cp_address (int i, int wb_ok, int unind_ok, int reloc_override)
09d92015 7138{
c19d1205 7139 inst.instruction |= inst.operands[i].reg << 16;
a737bd4d 7140
9c2799c2 7141 gas_assert (!(inst.operands[i].preind && inst.operands[i].postind));
09d92015 7142
c19d1205 7143 if (!inst.operands[i].preind && !inst.operands[i].postind) /* unindexed */
09d92015 7144 {
9c2799c2 7145 gas_assert (!inst.operands[i].writeback);
c19d1205
ZW
7146 if (!unind_ok)
7147 {
7148 inst.error = _("instruction does not support unindexed addressing");
7149 return FAIL;
7150 }
7151 inst.instruction |= inst.operands[i].imm;
7152 inst.instruction |= INDEX_UP;
7153 return SUCCESS;
09d92015 7154 }
a737bd4d 7155
c19d1205
ZW
7156 if (inst.operands[i].preind)
7157 inst.instruction |= PRE_INDEX;
a737bd4d 7158
c19d1205 7159 if (inst.operands[i].writeback)
09d92015 7160 {
c19d1205
ZW
7161 if (inst.operands[i].reg == REG_PC)
7162 {
7163 inst.error = _("pc may not be used with write-back");
7164 return FAIL;
7165 }
7166 if (!wb_ok)
7167 {
7168 inst.error = _("instruction does not support writeback");
7169 return FAIL;
7170 }
7171 inst.instruction |= WRITE_BACK;
09d92015 7172 }
a737bd4d 7173
c19d1205 7174 if (reloc_override)
21d799b5 7175 inst.reloc.type = (bfd_reloc_code_real_type) reloc_override;
4962c51a
MS
7176 else if ((inst.reloc.type < BFD_RELOC_ARM_ALU_PC_G0_NC
7177 || inst.reloc.type > BFD_RELOC_ARM_LDC_SB_G2)
7178 && inst.reloc.type != BFD_RELOC_ARM_LDR_PC_G0)
7179 {
7180 if (thumb_mode)
7181 inst.reloc.type = BFD_RELOC_ARM_T32_CP_OFF_IMM;
7182 else
7183 inst.reloc.type = BFD_RELOC_ARM_CP_OFF_IMM;
7184 }
7185
26d97720
NS
7186 /* Prefer + for zero encoded value. */
7187 if (!inst.operands[i].negative)
7188 inst.instruction |= INDEX_UP;
7189
c19d1205
ZW
7190 return SUCCESS;
7191}
a737bd4d 7192
c19d1205
ZW
7193/* inst.reloc.exp describes an "=expr" load pseudo-operation.
7194 Determine whether it can be performed with a move instruction; if
7195 it can, convert inst.instruction to that move instruction and
c921be7d
NC
7196 return TRUE; if it can't, convert inst.instruction to a literal-pool
7197 load and return FALSE. If this is not a valid thing to do in the
7198 current context, set inst.error and return TRUE.
a737bd4d 7199
c19d1205
ZW
7200 inst.operands[i] describes the destination register. */
7201
c921be7d 7202static bfd_boolean
c19d1205
ZW
7203move_or_literal_pool (int i, bfd_boolean thumb_p, bfd_boolean mode_3)
7204{
53365c0d
PB
7205 unsigned long tbit;
7206
7207 if (thumb_p)
7208 tbit = (inst.instruction > 0xffff) ? THUMB2_LOAD_BIT : THUMB_LOAD_BIT;
7209 else
7210 tbit = LOAD_BIT;
7211
7212 if ((inst.instruction & tbit) == 0)
09d92015 7213 {
c19d1205 7214 inst.error = _("invalid pseudo operation");
c921be7d 7215 return TRUE;
09d92015 7216 }
c19d1205 7217 if (inst.reloc.exp.X_op != O_constant && inst.reloc.exp.X_op != O_symbol)
09d92015
MM
7218 {
7219 inst.error = _("constant expression expected");
c921be7d 7220 return TRUE;
09d92015 7221 }
c19d1205 7222 if (inst.reloc.exp.X_op == O_constant)
09d92015 7223 {
c19d1205
ZW
7224 if (thumb_p)
7225 {
53365c0d 7226 if (!unified_syntax && (inst.reloc.exp.X_add_number & ~0xFF) == 0)
c19d1205
ZW
7227 {
7228 /* This can be done with a mov(1) instruction. */
7229 inst.instruction = T_OPCODE_MOV_I8 | (inst.operands[i].reg << 8);
7230 inst.instruction |= inst.reloc.exp.X_add_number;
c921be7d 7231 return TRUE;
c19d1205
ZW
7232 }
7233 }
7234 else
7235 {
7236 int value = encode_arm_immediate (inst.reloc.exp.X_add_number);
7237 if (value != FAIL)
7238 {
7239 /* This can be done with a mov instruction. */
7240 inst.instruction &= LITERAL_MASK;
7241 inst.instruction |= INST_IMMEDIATE | (OPCODE_MOV << DATA_OP_SHIFT);
7242 inst.instruction |= value & 0xfff;
c921be7d 7243 return TRUE;
c19d1205 7244 }
09d92015 7245
c19d1205
ZW
7246 value = encode_arm_immediate (~inst.reloc.exp.X_add_number);
7247 if (value != FAIL)
7248 {
7249 /* This can be done with a mvn instruction. */
7250 inst.instruction &= LITERAL_MASK;
7251 inst.instruction |= INST_IMMEDIATE | (OPCODE_MVN << DATA_OP_SHIFT);
7252 inst.instruction |= value & 0xfff;
c921be7d 7253 return TRUE;
c19d1205
ZW
7254 }
7255 }
09d92015
MM
7256 }
7257
c19d1205
ZW
7258 if (add_to_lit_pool () == FAIL)
7259 {
7260 inst.error = _("literal pool insertion failed");
c921be7d 7261 return TRUE;
c19d1205
ZW
7262 }
7263 inst.operands[1].reg = REG_PC;
7264 inst.operands[1].isreg = 1;
7265 inst.operands[1].preind = 1;
7266 inst.reloc.pc_rel = 1;
7267 inst.reloc.type = (thumb_p
7268 ? BFD_RELOC_ARM_THUMB_OFFSET
7269 : (mode_3
7270 ? BFD_RELOC_ARM_HWLITERAL
7271 : BFD_RELOC_ARM_LITERAL));
c921be7d 7272 return FALSE;
09d92015
MM
7273}
7274
5f4273c7 7275/* Functions for instruction encoding, sorted by sub-architecture.
c19d1205
ZW
7276 First some generics; their names are taken from the conventional
7277 bit positions for register arguments in ARM format instructions. */
09d92015 7278
a737bd4d 7279static void
c19d1205 7280do_noargs (void)
09d92015 7281{
c19d1205 7282}
a737bd4d 7283
c19d1205
ZW
7284static void
7285do_rd (void)
7286{
7287 inst.instruction |= inst.operands[0].reg << 12;
7288}
a737bd4d 7289
c19d1205
ZW
7290static void
7291do_rd_rm (void)
7292{
7293 inst.instruction |= inst.operands[0].reg << 12;
7294 inst.instruction |= inst.operands[1].reg;
7295}
09d92015 7296
c19d1205
ZW
7297static void
7298do_rd_rn (void)
7299{
7300 inst.instruction |= inst.operands[0].reg << 12;
7301 inst.instruction |= inst.operands[1].reg << 16;
7302}
a737bd4d 7303
c19d1205
ZW
7304static void
7305do_rn_rd (void)
7306{
7307 inst.instruction |= inst.operands[0].reg << 16;
7308 inst.instruction |= inst.operands[1].reg << 12;
7309}
09d92015 7310
c19d1205
ZW
7311static void
7312do_rd_rm_rn (void)
7313{
9a64e435 7314 unsigned Rn = inst.operands[2].reg;
708587a4 7315 /* Enforce restrictions on SWP instruction. */
9a64e435 7316 if ((inst.instruction & 0x0fbfffff) == 0x01000090)
56adecf4
DG
7317 {
7318 constraint (Rn == inst.operands[0].reg || Rn == inst.operands[1].reg,
7319 _("Rn must not overlap other operands"));
7320
7321 /* SWP{b} is deprecated for ARMv6* and ARMv7. */
7322 if (warn_on_deprecated
7323 && ARM_CPU_HAS_FEATURE (selected_cpu, arm_ext_v6))
7324 as_warn (_("swp{b} use is deprecated for this architecture"));
7325
7326 }
c19d1205
ZW
7327 inst.instruction |= inst.operands[0].reg << 12;
7328 inst.instruction |= inst.operands[1].reg;
9a64e435 7329 inst.instruction |= Rn << 16;
c19d1205 7330}
09d92015 7331
c19d1205
ZW
7332static void
7333do_rd_rn_rm (void)
7334{
7335 inst.instruction |= inst.operands[0].reg << 12;
7336 inst.instruction |= inst.operands[1].reg << 16;
7337 inst.instruction |= inst.operands[2].reg;
7338}
a737bd4d 7339
c19d1205
ZW
7340static void
7341do_rm_rd_rn (void)
7342{
5be8be5d
DG
7343 constraint ((inst.operands[2].reg == REG_PC), BAD_PC);
7344 constraint (((inst.reloc.exp.X_op != O_constant
7345 && inst.reloc.exp.X_op != O_illegal)
7346 || inst.reloc.exp.X_add_number != 0),
7347 BAD_ADDR_MODE);
c19d1205
ZW
7348 inst.instruction |= inst.operands[0].reg;
7349 inst.instruction |= inst.operands[1].reg << 12;
7350 inst.instruction |= inst.operands[2].reg << 16;
7351}
09d92015 7352
c19d1205
ZW
7353static void
7354do_imm0 (void)
7355{
7356 inst.instruction |= inst.operands[0].imm;
7357}
09d92015 7358
c19d1205
ZW
7359static void
7360do_rd_cpaddr (void)
7361{
7362 inst.instruction |= inst.operands[0].reg << 12;
7363 encode_arm_cp_address (1, TRUE, TRUE, 0);
09d92015 7364}
a737bd4d 7365
c19d1205
ZW
7366/* ARM instructions, in alphabetical order by function name (except
7367 that wrapper functions appear immediately after the function they
7368 wrap). */
09d92015 7369
c19d1205
ZW
7370/* This is a pseudo-op of the form "adr rd, label" to be converted
7371 into a relative address of the form "add rd, pc, #label-.-8". */
09d92015
MM
7372
7373static void
c19d1205 7374do_adr (void)
09d92015 7375{
c19d1205 7376 inst.instruction |= (inst.operands[0].reg << 12); /* Rd */
a737bd4d 7377
c19d1205
ZW
7378 /* Frag hacking will turn this into a sub instruction if the offset turns
7379 out to be negative. */
7380 inst.reloc.type = BFD_RELOC_ARM_IMMEDIATE;
c19d1205 7381 inst.reloc.pc_rel = 1;
2fc8bdac 7382 inst.reloc.exp.X_add_number -= 8;
c19d1205 7383}
b99bd4ef 7384
c19d1205
ZW
7385/* This is a pseudo-op of the form "adrl rd, label" to be converted
7386 into a relative address of the form:
7387 add rd, pc, #low(label-.-8)"
7388 add rd, rd, #high(label-.-8)" */
b99bd4ef 7389
c19d1205
ZW
7390static void
7391do_adrl (void)
7392{
7393 inst.instruction |= (inst.operands[0].reg << 12); /* Rd */
a737bd4d 7394
c19d1205
ZW
7395 /* Frag hacking will turn this into a sub instruction if the offset turns
7396 out to be negative. */
7397 inst.reloc.type = BFD_RELOC_ARM_ADRL_IMMEDIATE;
c19d1205
ZW
7398 inst.reloc.pc_rel = 1;
7399 inst.size = INSN_SIZE * 2;
2fc8bdac 7400 inst.reloc.exp.X_add_number -= 8;
b99bd4ef
NC
7401}
7402
b99bd4ef 7403static void
c19d1205 7404do_arit (void)
b99bd4ef 7405{
c19d1205
ZW
7406 if (!inst.operands[1].present)
7407 inst.operands[1].reg = inst.operands[0].reg;
7408 inst.instruction |= inst.operands[0].reg << 12;
7409 inst.instruction |= inst.operands[1].reg << 16;
7410 encode_arm_shifter_operand (2);
7411}
b99bd4ef 7412
62b3e311
PB
7413static void
7414do_barrier (void)
7415{
7416 if (inst.operands[0].present)
7417 {
7418 constraint ((inst.instruction & 0xf0) != 0x40
52e7f43d
RE
7419 && inst.operands[0].imm > 0xf
7420 && inst.operands[0].imm < 0x0,
bd3ba5d1 7421 _("bad barrier type"));
62b3e311
PB
7422 inst.instruction |= inst.operands[0].imm;
7423 }
7424 else
7425 inst.instruction |= 0xf;
7426}
7427
c19d1205
ZW
7428static void
7429do_bfc (void)
7430{
7431 unsigned int msb = inst.operands[1].imm + inst.operands[2].imm;
7432 constraint (msb > 32, _("bit-field extends past end of register"));
7433 /* The instruction encoding stores the LSB and MSB,
7434 not the LSB and width. */
7435 inst.instruction |= inst.operands[0].reg << 12;
7436 inst.instruction |= inst.operands[1].imm << 7;
7437 inst.instruction |= (msb - 1) << 16;
7438}
b99bd4ef 7439
c19d1205
ZW
7440static void
7441do_bfi (void)
7442{
7443 unsigned int msb;
b99bd4ef 7444
c19d1205
ZW
7445 /* #0 in second position is alternative syntax for bfc, which is
7446 the same instruction but with REG_PC in the Rm field. */
7447 if (!inst.operands[1].isreg)
7448 inst.operands[1].reg = REG_PC;
b99bd4ef 7449
c19d1205
ZW
7450 msb = inst.operands[2].imm + inst.operands[3].imm;
7451 constraint (msb > 32, _("bit-field extends past end of register"));
7452 /* The instruction encoding stores the LSB and MSB,
7453 not the LSB and width. */
7454 inst.instruction |= inst.operands[0].reg << 12;
7455 inst.instruction |= inst.operands[1].reg;
7456 inst.instruction |= inst.operands[2].imm << 7;
7457 inst.instruction |= (msb - 1) << 16;
b99bd4ef
NC
7458}
7459
b99bd4ef 7460static void
c19d1205 7461do_bfx (void)
b99bd4ef 7462{
c19d1205
ZW
7463 constraint (inst.operands[2].imm + inst.operands[3].imm > 32,
7464 _("bit-field extends past end of register"));
7465 inst.instruction |= inst.operands[0].reg << 12;
7466 inst.instruction |= inst.operands[1].reg;
7467 inst.instruction |= inst.operands[2].imm << 7;
7468 inst.instruction |= (inst.operands[3].imm - 1) << 16;
7469}
09d92015 7470
c19d1205
ZW
7471/* ARM V5 breakpoint instruction (argument parse)
7472 BKPT <16 bit unsigned immediate>
7473 Instruction is not conditional.
7474 The bit pattern given in insns[] has the COND_ALWAYS condition,
7475 and it is an error if the caller tried to override that. */
b99bd4ef 7476
c19d1205
ZW
7477static void
7478do_bkpt (void)
7479{
7480 /* Top 12 of 16 bits to bits 19:8. */
7481 inst.instruction |= (inst.operands[0].imm & 0xfff0) << 4;
09d92015 7482
c19d1205
ZW
7483 /* Bottom 4 of 16 bits to bits 3:0. */
7484 inst.instruction |= inst.operands[0].imm & 0xf;
7485}
09d92015 7486
c19d1205
ZW
7487static void
7488encode_branch (int default_reloc)
7489{
7490 if (inst.operands[0].hasreloc)
7491 {
0855e32b
NS
7492 constraint (inst.operands[0].imm != BFD_RELOC_ARM_PLT32
7493 && inst.operands[0].imm != BFD_RELOC_ARM_TLS_CALL,
7494 _("the only valid suffixes here are '(plt)' and '(tlscall)'"));
7495 inst.reloc.type = inst.operands[0].imm == BFD_RELOC_ARM_PLT32
7496 ? BFD_RELOC_ARM_PLT32
7497 : thumb_mode ? BFD_RELOC_ARM_THM_TLS_CALL : BFD_RELOC_ARM_TLS_CALL;
c19d1205 7498 }
b99bd4ef 7499 else
9ae92b05 7500 inst.reloc.type = (bfd_reloc_code_real_type) default_reloc;
2fc8bdac 7501 inst.reloc.pc_rel = 1;
b99bd4ef
NC
7502}
7503
b99bd4ef 7504static void
c19d1205 7505do_branch (void)
b99bd4ef 7506{
39b41c9c
PB
7507#ifdef OBJ_ELF
7508 if (EF_ARM_EABI_VERSION (meabi_flags) >= EF_ARM_EABI_VER4)
7509 encode_branch (BFD_RELOC_ARM_PCREL_JUMP);
7510 else
7511#endif
7512 encode_branch (BFD_RELOC_ARM_PCREL_BRANCH);
7513}
7514
7515static void
7516do_bl (void)
7517{
7518#ifdef OBJ_ELF
7519 if (EF_ARM_EABI_VERSION (meabi_flags) >= EF_ARM_EABI_VER4)
7520 {
7521 if (inst.cond == COND_ALWAYS)
7522 encode_branch (BFD_RELOC_ARM_PCREL_CALL);
7523 else
7524 encode_branch (BFD_RELOC_ARM_PCREL_JUMP);
7525 }
7526 else
7527#endif
7528 encode_branch (BFD_RELOC_ARM_PCREL_BRANCH);
c19d1205 7529}
b99bd4ef 7530
c19d1205
ZW
7531/* ARM V5 branch-link-exchange instruction (argument parse)
7532 BLX <target_addr> ie BLX(1)
7533 BLX{<condition>} <Rm> ie BLX(2)
7534 Unfortunately, there are two different opcodes for this mnemonic.
7535 So, the insns[].value is not used, and the code here zaps values
7536 into inst.instruction.
7537 Also, the <target_addr> can be 25 bits, hence has its own reloc. */
b99bd4ef 7538
c19d1205
ZW
7539static void
7540do_blx (void)
7541{
7542 if (inst.operands[0].isreg)
b99bd4ef 7543 {
c19d1205
ZW
7544 /* Arg is a register; the opcode provided by insns[] is correct.
7545 It is not illegal to do "blx pc", just useless. */
7546 if (inst.operands[0].reg == REG_PC)
7547 as_tsktsk (_("use of r15 in blx in ARM mode is not really useful"));
b99bd4ef 7548
c19d1205
ZW
7549 inst.instruction |= inst.operands[0].reg;
7550 }
7551 else
b99bd4ef 7552 {
c19d1205 7553 /* Arg is an address; this instruction cannot be executed
267bf995
RR
7554 conditionally, and the opcode must be adjusted.
7555 We retain the BFD_RELOC_ARM_PCREL_BLX till the very end
7556 where we generate out a BFD_RELOC_ARM_PCREL_CALL instead. */
c19d1205 7557 constraint (inst.cond != COND_ALWAYS, BAD_COND);
2fc8bdac 7558 inst.instruction = 0xfa000000;
267bf995 7559 encode_branch (BFD_RELOC_ARM_PCREL_BLX);
b99bd4ef 7560 }
c19d1205
ZW
7561}
7562
7563static void
7564do_bx (void)
7565{
845b51d6
PB
7566 bfd_boolean want_reloc;
7567
c19d1205
ZW
7568 if (inst.operands[0].reg == REG_PC)
7569 as_tsktsk (_("use of r15 in bx in ARM mode is not really useful"));
b99bd4ef 7570
c19d1205 7571 inst.instruction |= inst.operands[0].reg;
845b51d6
PB
7572 /* Output R_ARM_V4BX relocations if is an EABI object that looks like
7573 it is for ARMv4t or earlier. */
7574 want_reloc = !ARM_CPU_HAS_FEATURE (selected_cpu, arm_ext_v5);
7575 if (object_arch && !ARM_CPU_HAS_FEATURE (*object_arch, arm_ext_v5))
7576 want_reloc = TRUE;
7577
5ad34203 7578#ifdef OBJ_ELF
845b51d6 7579 if (EF_ARM_EABI_VERSION (meabi_flags) < EF_ARM_EABI_VER4)
5ad34203 7580#endif
584206db 7581 want_reloc = FALSE;
845b51d6
PB
7582
7583 if (want_reloc)
7584 inst.reloc.type = BFD_RELOC_ARM_V4BX;
09d92015
MM
7585}
7586
c19d1205
ZW
7587
7588/* ARM v5TEJ. Jump to Jazelle code. */
a737bd4d
NC
7589
7590static void
c19d1205 7591do_bxj (void)
a737bd4d 7592{
c19d1205
ZW
7593 if (inst.operands[0].reg == REG_PC)
7594 as_tsktsk (_("use of r15 in bxj is not really useful"));
7595
7596 inst.instruction |= inst.operands[0].reg;
a737bd4d
NC
7597}
7598
c19d1205
ZW
7599/* Co-processor data operation:
7600 CDP{cond} <coproc>, <opcode_1>, <CRd>, <CRn>, <CRm>{, <opcode_2>}
7601 CDP2 <coproc>, <opcode_1>, <CRd>, <CRn>, <CRm>{, <opcode_2>} */
7602static void
7603do_cdp (void)
7604{
7605 inst.instruction |= inst.operands[0].reg << 8;
7606 inst.instruction |= inst.operands[1].imm << 20;
7607 inst.instruction |= inst.operands[2].reg << 12;
7608 inst.instruction |= inst.operands[3].reg << 16;
7609 inst.instruction |= inst.operands[4].reg;
7610 inst.instruction |= inst.operands[5].imm << 5;
7611}
a737bd4d
NC
7612
7613static void
c19d1205 7614do_cmp (void)
a737bd4d 7615{
c19d1205
ZW
7616 inst.instruction |= inst.operands[0].reg << 16;
7617 encode_arm_shifter_operand (1);
a737bd4d
NC
7618}
7619
c19d1205
ZW
7620/* Transfer between coprocessor and ARM registers.
7621 MRC{cond} <coproc>, <opcode_1>, <Rd>, <CRn>, <CRm>{, <opcode_2>}
7622 MRC2
7623 MCR{cond}
7624 MCR2
7625
7626 No special properties. */
09d92015
MM
7627
7628static void
c19d1205 7629do_co_reg (void)
09d92015 7630{
fdfde340
JM
7631 unsigned Rd;
7632
7633 Rd = inst.operands[2].reg;
7634 if (thumb_mode)
7635 {
7636 if (inst.instruction == 0xee000010
7637 || inst.instruction == 0xfe000010)
7638 /* MCR, MCR2 */
7639 reject_bad_reg (Rd);
7640 else
7641 /* MRC, MRC2 */
7642 constraint (Rd == REG_SP, BAD_SP);
7643 }
7644 else
7645 {
7646 /* MCR */
7647 if (inst.instruction == 0xe000010)
7648 constraint (Rd == REG_PC, BAD_PC);
7649 }
7650
7651
c19d1205
ZW
7652 inst.instruction |= inst.operands[0].reg << 8;
7653 inst.instruction |= inst.operands[1].imm << 21;
fdfde340 7654 inst.instruction |= Rd << 12;
c19d1205
ZW
7655 inst.instruction |= inst.operands[3].reg << 16;
7656 inst.instruction |= inst.operands[4].reg;
7657 inst.instruction |= inst.operands[5].imm << 5;
7658}
09d92015 7659
c19d1205
ZW
7660/* Transfer between coprocessor register and pair of ARM registers.
7661 MCRR{cond} <coproc>, <opcode>, <Rd>, <Rn>, <CRm>.
7662 MCRR2
7663 MRRC{cond}
7664 MRRC2
b99bd4ef 7665
c19d1205 7666 Two XScale instructions are special cases of these:
09d92015 7667
c19d1205
ZW
7668 MAR{cond} acc0, <RdLo>, <RdHi> == MCRR{cond} p0, #0, <RdLo>, <RdHi>, c0
7669 MRA{cond} acc0, <RdLo>, <RdHi> == MRRC{cond} p0, #0, <RdLo>, <RdHi>, c0
b99bd4ef 7670
5f4273c7 7671 Result unpredictable if Rd or Rn is R15. */
a737bd4d 7672
c19d1205
ZW
7673static void
7674do_co_reg2c (void)
7675{
fdfde340
JM
7676 unsigned Rd, Rn;
7677
7678 Rd = inst.operands[2].reg;
7679 Rn = inst.operands[3].reg;
7680
7681 if (thumb_mode)
7682 {
7683 reject_bad_reg (Rd);
7684 reject_bad_reg (Rn);
7685 }
7686 else
7687 {
7688 constraint (Rd == REG_PC, BAD_PC);
7689 constraint (Rn == REG_PC, BAD_PC);
7690 }
7691
c19d1205
ZW
7692 inst.instruction |= inst.operands[0].reg << 8;
7693 inst.instruction |= inst.operands[1].imm << 4;
fdfde340
JM
7694 inst.instruction |= Rd << 12;
7695 inst.instruction |= Rn << 16;
c19d1205 7696 inst.instruction |= inst.operands[4].reg;
b99bd4ef
NC
7697}
7698
c19d1205
ZW
7699static void
7700do_cpsi (void)
7701{
7702 inst.instruction |= inst.operands[0].imm << 6;
a028a6f5
PB
7703 if (inst.operands[1].present)
7704 {
7705 inst.instruction |= CPSI_MMOD;
7706 inst.instruction |= inst.operands[1].imm;
7707 }
c19d1205 7708}
b99bd4ef 7709
62b3e311
PB
7710static void
7711do_dbg (void)
7712{
7713 inst.instruction |= inst.operands[0].imm;
7714}
7715
eea54501
MGD
7716static void
7717do_div (void)
7718{
7719 unsigned Rd, Rn, Rm;
7720
7721 Rd = inst.operands[0].reg;
7722 Rn = (inst.operands[1].present
7723 ? inst.operands[1].reg : Rd);
7724 Rm = inst.operands[2].reg;
7725
7726 constraint ((Rd == REG_PC), BAD_PC);
7727 constraint ((Rn == REG_PC), BAD_PC);
7728 constraint ((Rm == REG_PC), BAD_PC);
7729
7730 inst.instruction |= Rd << 16;
7731 inst.instruction |= Rn << 0;
7732 inst.instruction |= Rm << 8;
7733}
7734
b99bd4ef 7735static void
c19d1205 7736do_it (void)
b99bd4ef 7737{
c19d1205 7738 /* There is no IT instruction in ARM mode. We
e07e6e58
NC
7739 process it to do the validation as if in
7740 thumb mode, just in case the code gets
7741 assembled for thumb using the unified syntax. */
7742
c19d1205 7743 inst.size = 0;
e07e6e58
NC
7744 if (unified_syntax)
7745 {
7746 set_it_insn_type (IT_INSN);
7747 now_it.mask = (inst.instruction & 0xf) | 0x10;
7748 now_it.cc = inst.operands[0].imm;
7749 }
09d92015 7750}
b99bd4ef 7751
09d92015 7752static void
c19d1205 7753do_ldmstm (void)
ea6ef066 7754{
c19d1205
ZW
7755 int base_reg = inst.operands[0].reg;
7756 int range = inst.operands[1].imm;
ea6ef066 7757
c19d1205
ZW
7758 inst.instruction |= base_reg << 16;
7759 inst.instruction |= range;
ea6ef066 7760
c19d1205
ZW
7761 if (inst.operands[1].writeback)
7762 inst.instruction |= LDM_TYPE_2_OR_3;
09d92015 7763
c19d1205 7764 if (inst.operands[0].writeback)
ea6ef066 7765 {
c19d1205
ZW
7766 inst.instruction |= WRITE_BACK;
7767 /* Check for unpredictable uses of writeback. */
7768 if (inst.instruction & LOAD_BIT)
09d92015 7769 {
c19d1205
ZW
7770 /* Not allowed in LDM type 2. */
7771 if ((inst.instruction & LDM_TYPE_2_OR_3)
7772 && ((range & (1 << REG_PC)) == 0))
7773 as_warn (_("writeback of base register is UNPREDICTABLE"));
7774 /* Only allowed if base reg not in list for other types. */
7775 else if (range & (1 << base_reg))
7776 as_warn (_("writeback of base register when in register list is UNPREDICTABLE"));
7777 }
7778 else /* STM. */
7779 {
7780 /* Not allowed for type 2. */
7781 if (inst.instruction & LDM_TYPE_2_OR_3)
7782 as_warn (_("writeback of base register is UNPREDICTABLE"));
7783 /* Only allowed if base reg not in list, or first in list. */
7784 else if ((range & (1 << base_reg))
7785 && (range & ((1 << base_reg) - 1)))
7786 as_warn (_("if writeback register is in list, it must be the lowest reg in the list"));
09d92015 7787 }
ea6ef066 7788 }
a737bd4d
NC
7789}
7790
c19d1205
ZW
7791/* ARMv5TE load-consecutive (argument parse)
7792 Mode is like LDRH.
7793
7794 LDRccD R, mode
7795 STRccD R, mode. */
7796
a737bd4d 7797static void
c19d1205 7798do_ldrd (void)
a737bd4d 7799{
c19d1205 7800 constraint (inst.operands[0].reg % 2 != 0,
c56791bb 7801 _("first transfer register must be even"));
c19d1205
ZW
7802 constraint (inst.operands[1].present
7803 && inst.operands[1].reg != inst.operands[0].reg + 1,
c56791bb 7804 _("can only transfer two consecutive registers"));
c19d1205
ZW
7805 constraint (inst.operands[0].reg == REG_LR, _("r14 not allowed here"));
7806 constraint (!inst.operands[2].isreg, _("'[' expected"));
a737bd4d 7807
c19d1205
ZW
7808 if (!inst.operands[1].present)
7809 inst.operands[1].reg = inst.operands[0].reg + 1;
5f4273c7 7810
c56791bb
RE
7811 /* encode_arm_addr_mode_3 will diagnose overlap between the base
7812 register and the first register written; we have to diagnose
7813 overlap between the base and the second register written here. */
ea6ef066 7814
c56791bb
RE
7815 if (inst.operands[2].reg == inst.operands[1].reg
7816 && (inst.operands[2].writeback || inst.operands[2].postind))
7817 as_warn (_("base register written back, and overlaps "
7818 "second transfer register"));
b05fe5cf 7819
c56791bb
RE
7820 if (!(inst.instruction & V4_STR_BIT))
7821 {
c19d1205 7822 /* For an index-register load, the index register must not overlap the
c56791bb
RE
7823 destination (even if not write-back). */
7824 if (inst.operands[2].immisreg
7825 && ((unsigned) inst.operands[2].imm == inst.operands[0].reg
7826 || (unsigned) inst.operands[2].imm == inst.operands[1].reg))
7827 as_warn (_("index register overlaps transfer register"));
b05fe5cf 7828 }
c19d1205
ZW
7829 inst.instruction |= inst.operands[0].reg << 12;
7830 encode_arm_addr_mode_3 (2, /*is_t=*/FALSE);
b05fe5cf
ZW
7831}
7832
7833static void
c19d1205 7834do_ldrex (void)
b05fe5cf 7835{
c19d1205
ZW
7836 constraint (!inst.operands[1].isreg || !inst.operands[1].preind
7837 || inst.operands[1].postind || inst.operands[1].writeback
7838 || inst.operands[1].immisreg || inst.operands[1].shifted
01cfc07f
NC
7839 || inst.operands[1].negative
7840 /* This can arise if the programmer has written
7841 strex rN, rM, foo
7842 or if they have mistakenly used a register name as the last
7843 operand, eg:
7844 strex rN, rM, rX
7845 It is very difficult to distinguish between these two cases
7846 because "rX" might actually be a label. ie the register
7847 name has been occluded by a symbol of the same name. So we
7848 just generate a general 'bad addressing mode' type error
7849 message and leave it up to the programmer to discover the
7850 true cause and fix their mistake. */
7851 || (inst.operands[1].reg == REG_PC),
7852 BAD_ADDR_MODE);
b05fe5cf 7853
c19d1205
ZW
7854 constraint (inst.reloc.exp.X_op != O_constant
7855 || inst.reloc.exp.X_add_number != 0,
7856 _("offset must be zero in ARM encoding"));
b05fe5cf 7857
5be8be5d
DG
7858 constraint ((inst.operands[1].reg == REG_PC), BAD_PC);
7859
c19d1205
ZW
7860 inst.instruction |= inst.operands[0].reg << 12;
7861 inst.instruction |= inst.operands[1].reg << 16;
7862 inst.reloc.type = BFD_RELOC_UNUSED;
b05fe5cf
ZW
7863}
7864
7865static void
c19d1205 7866do_ldrexd (void)
b05fe5cf 7867{
c19d1205
ZW
7868 constraint (inst.operands[0].reg % 2 != 0,
7869 _("even register required"));
7870 constraint (inst.operands[1].present
7871 && inst.operands[1].reg != inst.operands[0].reg + 1,
7872 _("can only load two consecutive registers"));
7873 /* If op 1 were present and equal to PC, this function wouldn't
7874 have been called in the first place. */
7875 constraint (inst.operands[0].reg == REG_LR, _("r14 not allowed here"));
b05fe5cf 7876
c19d1205
ZW
7877 inst.instruction |= inst.operands[0].reg << 12;
7878 inst.instruction |= inst.operands[2].reg << 16;
b05fe5cf
ZW
7879}
7880
7881static void
c19d1205 7882do_ldst (void)
b05fe5cf 7883{
c19d1205
ZW
7884 inst.instruction |= inst.operands[0].reg << 12;
7885 if (!inst.operands[1].isreg)
7886 if (move_or_literal_pool (0, /*thumb_p=*/FALSE, /*mode_3=*/FALSE))
b05fe5cf 7887 return;
c19d1205 7888 encode_arm_addr_mode_2 (1, /*is_t=*/FALSE);
b05fe5cf
ZW
7889}
7890
7891static void
c19d1205 7892do_ldstt (void)
b05fe5cf 7893{
c19d1205
ZW
7894 /* ldrt/strt always use post-indexed addressing. Turn [Rn] into [Rn]! and
7895 reject [Rn,...]. */
7896 if (inst.operands[1].preind)
b05fe5cf 7897 {
bd3ba5d1
NC
7898 constraint (inst.reloc.exp.X_op != O_constant
7899 || inst.reloc.exp.X_add_number != 0,
c19d1205 7900 _("this instruction requires a post-indexed address"));
b05fe5cf 7901
c19d1205
ZW
7902 inst.operands[1].preind = 0;
7903 inst.operands[1].postind = 1;
7904 inst.operands[1].writeback = 1;
b05fe5cf 7905 }
c19d1205
ZW
7906 inst.instruction |= inst.operands[0].reg << 12;
7907 encode_arm_addr_mode_2 (1, /*is_t=*/TRUE);
7908}
b05fe5cf 7909
c19d1205 7910/* Halfword and signed-byte load/store operations. */
b05fe5cf 7911
c19d1205
ZW
7912static void
7913do_ldstv4 (void)
7914{
ff4a8d2b 7915 constraint (inst.operands[0].reg == REG_PC, BAD_PC);
c19d1205
ZW
7916 inst.instruction |= inst.operands[0].reg << 12;
7917 if (!inst.operands[1].isreg)
7918 if (move_or_literal_pool (0, /*thumb_p=*/FALSE, /*mode_3=*/TRUE))
b05fe5cf 7919 return;
c19d1205 7920 encode_arm_addr_mode_3 (1, /*is_t=*/FALSE);
b05fe5cf
ZW
7921}
7922
7923static void
c19d1205 7924do_ldsttv4 (void)
b05fe5cf 7925{
c19d1205
ZW
7926 /* ldrt/strt always use post-indexed addressing. Turn [Rn] into [Rn]! and
7927 reject [Rn,...]. */
7928 if (inst.operands[1].preind)
b05fe5cf 7929 {
bd3ba5d1
NC
7930 constraint (inst.reloc.exp.X_op != O_constant
7931 || inst.reloc.exp.X_add_number != 0,
c19d1205 7932 _("this instruction requires a post-indexed address"));
b05fe5cf 7933
c19d1205
ZW
7934 inst.operands[1].preind = 0;
7935 inst.operands[1].postind = 1;
7936 inst.operands[1].writeback = 1;
b05fe5cf 7937 }
c19d1205
ZW
7938 inst.instruction |= inst.operands[0].reg << 12;
7939 encode_arm_addr_mode_3 (1, /*is_t=*/TRUE);
7940}
b05fe5cf 7941
c19d1205
ZW
7942/* Co-processor register load/store.
7943 Format: <LDC|STC>{cond}[L] CP#,CRd,<address> */
7944static void
7945do_lstc (void)
7946{
7947 inst.instruction |= inst.operands[0].reg << 8;
7948 inst.instruction |= inst.operands[1].reg << 12;
7949 encode_arm_cp_address (2, TRUE, TRUE, 0);
b05fe5cf
ZW
7950}
7951
b05fe5cf 7952static void
c19d1205 7953do_mlas (void)
b05fe5cf 7954{
8fb9d7b9 7955 /* This restriction does not apply to mls (nor to mla in v6 or later). */
c19d1205 7956 if (inst.operands[0].reg == inst.operands[1].reg
8fb9d7b9 7957 && !ARM_CPU_HAS_FEATURE (selected_cpu, arm_ext_v6)
c19d1205 7958 && !(inst.instruction & 0x00400000))
8fb9d7b9 7959 as_tsktsk (_("Rd and Rm should be different in mla"));
b05fe5cf 7960
c19d1205
ZW
7961 inst.instruction |= inst.operands[0].reg << 16;
7962 inst.instruction |= inst.operands[1].reg;
7963 inst.instruction |= inst.operands[2].reg << 8;
7964 inst.instruction |= inst.operands[3].reg << 12;
c19d1205 7965}
b05fe5cf 7966
c19d1205
ZW
7967static void
7968do_mov (void)
7969{
7970 inst.instruction |= inst.operands[0].reg << 12;
7971 encode_arm_shifter_operand (1);
7972}
b05fe5cf 7973
c19d1205
ZW
7974/* ARM V6T2 16-bit immediate register load: MOV[WT]{cond} Rd, #<imm16>. */
7975static void
7976do_mov16 (void)
7977{
b6895b4f
PB
7978 bfd_vma imm;
7979 bfd_boolean top;
7980
7981 top = (inst.instruction & 0x00400000) != 0;
7982 constraint (top && inst.reloc.type == BFD_RELOC_ARM_MOVW,
7983 _(":lower16: not allowed this instruction"));
7984 constraint (!top && inst.reloc.type == BFD_RELOC_ARM_MOVT,
7985 _(":upper16: not allowed instruction"));
c19d1205 7986 inst.instruction |= inst.operands[0].reg << 12;
b6895b4f
PB
7987 if (inst.reloc.type == BFD_RELOC_UNUSED)
7988 {
7989 imm = inst.reloc.exp.X_add_number;
7990 /* The value is in two pieces: 0:11, 16:19. */
7991 inst.instruction |= (imm & 0x00000fff);
7992 inst.instruction |= (imm & 0x0000f000) << 4;
7993 }
b05fe5cf 7994}
b99bd4ef 7995
037e8744
JB
7996static void do_vfp_nsyn_opcode (const char *);
7997
7998static int
7999do_vfp_nsyn_mrs (void)
8000{
8001 if (inst.operands[0].isvec)
8002 {
8003 if (inst.operands[1].reg != 1)
8004 first_error (_("operand 1 must be FPSCR"));
8005 memset (&inst.operands[0], '\0', sizeof (inst.operands[0]));
8006 memset (&inst.operands[1], '\0', sizeof (inst.operands[1]));
8007 do_vfp_nsyn_opcode ("fmstat");
8008 }
8009 else if (inst.operands[1].isvec)
8010 do_vfp_nsyn_opcode ("fmrx");
8011 else
8012 return FAIL;
5f4273c7 8013
037e8744
JB
8014 return SUCCESS;
8015}
8016
8017static int
8018do_vfp_nsyn_msr (void)
8019{
8020 if (inst.operands[0].isvec)
8021 do_vfp_nsyn_opcode ("fmxr");
8022 else
8023 return FAIL;
8024
8025 return SUCCESS;
8026}
8027
f7c21dc7
NC
8028static void
8029do_vmrs (void)
8030{
8031 unsigned Rt = inst.operands[0].reg;
8032
8033 if (thumb_mode && inst.operands[0].reg == REG_SP)
8034 {
8035 inst.error = BAD_SP;
8036 return;
8037 }
8038
8039 /* APSR_ sets isvec. All other refs to PC are illegal. */
8040 if (!inst.operands[0].isvec && inst.operands[0].reg == REG_PC)
8041 {
8042 inst.error = BAD_PC;
8043 return;
8044 }
8045
8046 if (inst.operands[1].reg != 1)
8047 first_error (_("operand 1 must be FPSCR"));
8048
8049 inst.instruction |= (Rt << 12);
8050}
8051
8052static void
8053do_vmsr (void)
8054{
8055 unsigned Rt = inst.operands[1].reg;
8056
8057 if (thumb_mode)
8058 reject_bad_reg (Rt);
8059 else if (Rt == REG_PC)
8060 {
8061 inst.error = BAD_PC;
8062 return;
8063 }
8064
8065 if (inst.operands[0].reg != 1)
8066 first_error (_("operand 0 must be FPSCR"));
8067
8068 inst.instruction |= (Rt << 12);
8069}
8070
b99bd4ef 8071static void
c19d1205 8072do_mrs (void)
b99bd4ef 8073{
90ec0d68
MGD
8074 unsigned br;
8075
037e8744
JB
8076 if (do_vfp_nsyn_mrs () == SUCCESS)
8077 return;
8078
ff4a8d2b 8079 constraint (inst.operands[0].reg == REG_PC, BAD_PC);
c19d1205 8080 inst.instruction |= inst.operands[0].reg << 12;
90ec0d68
MGD
8081
8082 if (inst.operands[1].isreg)
8083 {
8084 br = inst.operands[1].reg;
8085 if (((br & 0x200) == 0) && ((br & 0xf0000) != 0xf000))
8086 as_bad (_("bad register for mrs"));
8087 }
8088 else
8089 {
8090 /* mrs only accepts CPSR/SPSR/CPSR_all/SPSR_all. */
8091 constraint ((inst.operands[1].imm & (PSR_c|PSR_x|PSR_s|PSR_f))
8092 != (PSR_c|PSR_f),
d2cd1205 8093 _("'APSR', 'CPSR' or 'SPSR' expected"));
90ec0d68
MGD
8094 br = (15<<16) | (inst.operands[1].imm & SPSR_BIT);
8095 }
8096
8097 inst.instruction |= br;
c19d1205 8098}
b99bd4ef 8099
c19d1205
ZW
8100/* Two possible forms:
8101 "{C|S}PSR_<field>, Rm",
8102 "{C|S}PSR_f, #expression". */
b99bd4ef 8103
c19d1205
ZW
8104static void
8105do_msr (void)
8106{
037e8744
JB
8107 if (do_vfp_nsyn_msr () == SUCCESS)
8108 return;
8109
c19d1205
ZW
8110 inst.instruction |= inst.operands[0].imm;
8111 if (inst.operands[1].isreg)
8112 inst.instruction |= inst.operands[1].reg;
8113 else
b99bd4ef 8114 {
c19d1205
ZW
8115 inst.instruction |= INST_IMMEDIATE;
8116 inst.reloc.type = BFD_RELOC_ARM_IMMEDIATE;
8117 inst.reloc.pc_rel = 0;
b99bd4ef 8118 }
b99bd4ef
NC
8119}
8120
c19d1205
ZW
8121static void
8122do_mul (void)
a737bd4d 8123{
ff4a8d2b
NC
8124 constraint (inst.operands[2].reg == REG_PC, BAD_PC);
8125
c19d1205
ZW
8126 if (!inst.operands[2].present)
8127 inst.operands[2].reg = inst.operands[0].reg;
8128 inst.instruction |= inst.operands[0].reg << 16;
8129 inst.instruction |= inst.operands[1].reg;
8130 inst.instruction |= inst.operands[2].reg << 8;
a737bd4d 8131
8fb9d7b9
MS
8132 if (inst.operands[0].reg == inst.operands[1].reg
8133 && !ARM_CPU_HAS_FEATURE (selected_cpu, arm_ext_v6))
8134 as_tsktsk (_("Rd and Rm should be different in mul"));
a737bd4d
NC
8135}
8136
c19d1205
ZW
8137/* Long Multiply Parser
8138 UMULL RdLo, RdHi, Rm, Rs
8139 SMULL RdLo, RdHi, Rm, Rs
8140 UMLAL RdLo, RdHi, Rm, Rs
8141 SMLAL RdLo, RdHi, Rm, Rs. */
b99bd4ef
NC
8142
8143static void
c19d1205 8144do_mull (void)
b99bd4ef 8145{
c19d1205
ZW
8146 inst.instruction |= inst.operands[0].reg << 12;
8147 inst.instruction |= inst.operands[1].reg << 16;
8148 inst.instruction |= inst.operands[2].reg;
8149 inst.instruction |= inst.operands[3].reg << 8;
b99bd4ef 8150
682b27ad
PB
8151 /* rdhi and rdlo must be different. */
8152 if (inst.operands[0].reg == inst.operands[1].reg)
8153 as_tsktsk (_("rdhi and rdlo must be different"));
8154
8155 /* rdhi, rdlo and rm must all be different before armv6. */
8156 if ((inst.operands[0].reg == inst.operands[2].reg
c19d1205 8157 || inst.operands[1].reg == inst.operands[2].reg)
682b27ad 8158 && !ARM_CPU_HAS_FEATURE (selected_cpu, arm_ext_v6))
c19d1205
ZW
8159 as_tsktsk (_("rdhi, rdlo and rm must all be different"));
8160}
b99bd4ef 8161
c19d1205
ZW
8162static void
8163do_nop (void)
8164{
e7495e45
NS
8165 if (inst.operands[0].present
8166 || ARM_CPU_HAS_FEATURE (selected_cpu, arm_ext_v6k))
c19d1205
ZW
8167 {
8168 /* Architectural NOP hints are CPSR sets with no bits selected. */
8169 inst.instruction &= 0xf0000000;
e7495e45
NS
8170 inst.instruction |= 0x0320f000;
8171 if (inst.operands[0].present)
8172 inst.instruction |= inst.operands[0].imm;
c19d1205 8173 }
b99bd4ef
NC
8174}
8175
c19d1205
ZW
8176/* ARM V6 Pack Halfword Bottom Top instruction (argument parse).
8177 PKHBT {<cond>} <Rd>, <Rn>, <Rm> {, LSL #<shift_imm>}
8178 Condition defaults to COND_ALWAYS.
8179 Error if Rd, Rn or Rm are R15. */
b99bd4ef
NC
8180
8181static void
c19d1205 8182do_pkhbt (void)
b99bd4ef 8183{
c19d1205
ZW
8184 inst.instruction |= inst.operands[0].reg << 12;
8185 inst.instruction |= inst.operands[1].reg << 16;
8186 inst.instruction |= inst.operands[2].reg;
8187 if (inst.operands[3].present)
8188 encode_arm_shift (3);
8189}
b99bd4ef 8190
c19d1205 8191/* ARM V6 PKHTB (Argument Parse). */
b99bd4ef 8192
c19d1205
ZW
8193static void
8194do_pkhtb (void)
8195{
8196 if (!inst.operands[3].present)
b99bd4ef 8197 {
c19d1205
ZW
8198 /* If the shift specifier is omitted, turn the instruction
8199 into pkhbt rd, rm, rn. */
8200 inst.instruction &= 0xfff00010;
8201 inst.instruction |= inst.operands[0].reg << 12;
8202 inst.instruction |= inst.operands[1].reg;
8203 inst.instruction |= inst.operands[2].reg << 16;
b99bd4ef
NC
8204 }
8205 else
8206 {
c19d1205
ZW
8207 inst.instruction |= inst.operands[0].reg << 12;
8208 inst.instruction |= inst.operands[1].reg << 16;
8209 inst.instruction |= inst.operands[2].reg;
8210 encode_arm_shift (3);
b99bd4ef
NC
8211 }
8212}
8213
c19d1205 8214/* ARMv5TE: Preload-Cache
60e5ef9f 8215 MP Extensions: Preload for write
c19d1205 8216
60e5ef9f 8217 PLD(W) <addr_mode>
c19d1205
ZW
8218
8219 Syntactically, like LDR with B=1, W=0, L=1. */
b99bd4ef
NC
8220
8221static void
c19d1205 8222do_pld (void)
b99bd4ef 8223{
c19d1205
ZW
8224 constraint (!inst.operands[0].isreg,
8225 _("'[' expected after PLD mnemonic"));
8226 constraint (inst.operands[0].postind,
8227 _("post-indexed expression used in preload instruction"));
8228 constraint (inst.operands[0].writeback,
8229 _("writeback used in preload instruction"));
8230 constraint (!inst.operands[0].preind,
8231 _("unindexed addressing used in preload instruction"));
c19d1205
ZW
8232 encode_arm_addr_mode_2 (0, /*is_t=*/FALSE);
8233}
b99bd4ef 8234
62b3e311
PB
8235/* ARMv7: PLI <addr_mode> */
8236static void
8237do_pli (void)
8238{
8239 constraint (!inst.operands[0].isreg,
8240 _("'[' expected after PLI mnemonic"));
8241 constraint (inst.operands[0].postind,
8242 _("post-indexed expression used in preload instruction"));
8243 constraint (inst.operands[0].writeback,
8244 _("writeback used in preload instruction"));
8245 constraint (!inst.operands[0].preind,
8246 _("unindexed addressing used in preload instruction"));
8247 encode_arm_addr_mode_2 (0, /*is_t=*/FALSE);
8248 inst.instruction &= ~PRE_INDEX;
8249}
8250
c19d1205
ZW
8251static void
8252do_push_pop (void)
8253{
8254 inst.operands[1] = inst.operands[0];
8255 memset (&inst.operands[0], 0, sizeof inst.operands[0]);
8256 inst.operands[0].isreg = 1;
8257 inst.operands[0].writeback = 1;
8258 inst.operands[0].reg = REG_SP;
8259 do_ldmstm ();
8260}
b99bd4ef 8261
c19d1205
ZW
8262/* ARM V6 RFE (Return from Exception) loads the PC and CPSR from the
8263 word at the specified address and the following word
8264 respectively.
8265 Unconditionally executed.
8266 Error if Rn is R15. */
b99bd4ef 8267
c19d1205
ZW
8268static void
8269do_rfe (void)
8270{
8271 inst.instruction |= inst.operands[0].reg << 16;
8272 if (inst.operands[0].writeback)
8273 inst.instruction |= WRITE_BACK;
8274}
b99bd4ef 8275
c19d1205 8276/* ARM V6 ssat (argument parse). */
b99bd4ef 8277
c19d1205
ZW
8278static void
8279do_ssat (void)
8280{
8281 inst.instruction |= inst.operands[0].reg << 12;
8282 inst.instruction |= (inst.operands[1].imm - 1) << 16;
8283 inst.instruction |= inst.operands[2].reg;
b99bd4ef 8284
c19d1205
ZW
8285 if (inst.operands[3].present)
8286 encode_arm_shift (3);
b99bd4ef
NC
8287}
8288
c19d1205 8289/* ARM V6 usat (argument parse). */
b99bd4ef
NC
8290
8291static void
c19d1205 8292do_usat (void)
b99bd4ef 8293{
c19d1205
ZW
8294 inst.instruction |= inst.operands[0].reg << 12;
8295 inst.instruction |= inst.operands[1].imm << 16;
8296 inst.instruction |= inst.operands[2].reg;
b99bd4ef 8297
c19d1205
ZW
8298 if (inst.operands[3].present)
8299 encode_arm_shift (3);
b99bd4ef
NC
8300}
8301
c19d1205 8302/* ARM V6 ssat16 (argument parse). */
09d92015
MM
8303
8304static void
c19d1205 8305do_ssat16 (void)
09d92015 8306{
c19d1205
ZW
8307 inst.instruction |= inst.operands[0].reg << 12;
8308 inst.instruction |= ((inst.operands[1].imm - 1) << 16);
8309 inst.instruction |= inst.operands[2].reg;
09d92015
MM
8310}
8311
c19d1205
ZW
8312static void
8313do_usat16 (void)
a737bd4d 8314{
c19d1205
ZW
8315 inst.instruction |= inst.operands[0].reg << 12;
8316 inst.instruction |= inst.operands[1].imm << 16;
8317 inst.instruction |= inst.operands[2].reg;
8318}
a737bd4d 8319
c19d1205
ZW
8320/* ARM V6 SETEND (argument parse). Sets the E bit in the CPSR while
8321 preserving the other bits.
a737bd4d 8322
c19d1205
ZW
8323 setend <endian_specifier>, where <endian_specifier> is either
8324 BE or LE. */
a737bd4d 8325
c19d1205
ZW
8326static void
8327do_setend (void)
8328{
8329 if (inst.operands[0].imm)
8330 inst.instruction |= 0x200;
a737bd4d
NC
8331}
8332
8333static void
c19d1205 8334do_shift (void)
a737bd4d 8335{
c19d1205
ZW
8336 unsigned int Rm = (inst.operands[1].present
8337 ? inst.operands[1].reg
8338 : inst.operands[0].reg);
a737bd4d 8339
c19d1205
ZW
8340 inst.instruction |= inst.operands[0].reg << 12;
8341 inst.instruction |= Rm;
8342 if (inst.operands[2].isreg) /* Rd, {Rm,} Rs */
a737bd4d 8343 {
c19d1205
ZW
8344 inst.instruction |= inst.operands[2].reg << 8;
8345 inst.instruction |= SHIFT_BY_REG;
94342ec3
NC
8346 /* PR 12854: Error on extraneous shifts. */
8347 constraint (inst.operands[2].shifted,
8348 _("extraneous shift as part of operand to shift insn"));
a737bd4d
NC
8349 }
8350 else
c19d1205 8351 inst.reloc.type = BFD_RELOC_ARM_SHIFT_IMM;
a737bd4d
NC
8352}
8353
09d92015 8354static void
3eb17e6b 8355do_smc (void)
09d92015 8356{
3eb17e6b 8357 inst.reloc.type = BFD_RELOC_ARM_SMC;
c19d1205 8358 inst.reloc.pc_rel = 0;
09d92015
MM
8359}
8360
90ec0d68
MGD
8361static void
8362do_hvc (void)
8363{
8364 inst.reloc.type = BFD_RELOC_ARM_HVC;
8365 inst.reloc.pc_rel = 0;
8366}
8367
09d92015 8368static void
c19d1205 8369do_swi (void)
09d92015 8370{
c19d1205
ZW
8371 inst.reloc.type = BFD_RELOC_ARM_SWI;
8372 inst.reloc.pc_rel = 0;
09d92015
MM
8373}
8374
c19d1205
ZW
8375/* ARM V5E (El Segundo) signed-multiply-accumulate (argument parse)
8376 SMLAxy{cond} Rd,Rm,Rs,Rn
8377 SMLAWy{cond} Rd,Rm,Rs,Rn
8378 Error if any register is R15. */
e16bb312 8379
c19d1205
ZW
8380static void
8381do_smla (void)
e16bb312 8382{
c19d1205
ZW
8383 inst.instruction |= inst.operands[0].reg << 16;
8384 inst.instruction |= inst.operands[1].reg;
8385 inst.instruction |= inst.operands[2].reg << 8;
8386 inst.instruction |= inst.operands[3].reg << 12;
8387}
a737bd4d 8388
c19d1205
ZW
8389/* ARM V5E (El Segundo) signed-multiply-accumulate-long (argument parse)
8390 SMLALxy{cond} Rdlo,Rdhi,Rm,Rs
8391 Error if any register is R15.
8392 Warning if Rdlo == Rdhi. */
a737bd4d 8393
c19d1205
ZW
8394static void
8395do_smlal (void)
8396{
8397 inst.instruction |= inst.operands[0].reg << 12;
8398 inst.instruction |= inst.operands[1].reg << 16;
8399 inst.instruction |= inst.operands[2].reg;
8400 inst.instruction |= inst.operands[3].reg << 8;
a737bd4d 8401
c19d1205
ZW
8402 if (inst.operands[0].reg == inst.operands[1].reg)
8403 as_tsktsk (_("rdhi and rdlo must be different"));
8404}
a737bd4d 8405
c19d1205
ZW
8406/* ARM V5E (El Segundo) signed-multiply (argument parse)
8407 SMULxy{cond} Rd,Rm,Rs
8408 Error if any register is R15. */
a737bd4d 8409
c19d1205
ZW
8410static void
8411do_smul (void)
8412{
8413 inst.instruction |= inst.operands[0].reg << 16;
8414 inst.instruction |= inst.operands[1].reg;
8415 inst.instruction |= inst.operands[2].reg << 8;
8416}
a737bd4d 8417
b6702015
PB
8418/* ARM V6 srs (argument parse). The variable fields in the encoding are
8419 the same for both ARM and Thumb-2. */
a737bd4d 8420
c19d1205
ZW
8421static void
8422do_srs (void)
8423{
b6702015
PB
8424 int reg;
8425
8426 if (inst.operands[0].present)
8427 {
8428 reg = inst.operands[0].reg;
fdfde340 8429 constraint (reg != REG_SP, _("SRS base register must be r13"));
b6702015
PB
8430 }
8431 else
fdfde340 8432 reg = REG_SP;
b6702015
PB
8433
8434 inst.instruction |= reg << 16;
8435 inst.instruction |= inst.operands[1].imm;
8436 if (inst.operands[0].writeback || inst.operands[1].writeback)
c19d1205
ZW
8437 inst.instruction |= WRITE_BACK;
8438}
a737bd4d 8439
c19d1205 8440/* ARM V6 strex (argument parse). */
a737bd4d 8441
c19d1205
ZW
8442static void
8443do_strex (void)
8444{
8445 constraint (!inst.operands[2].isreg || !inst.operands[2].preind
8446 || inst.operands[2].postind || inst.operands[2].writeback
8447 || inst.operands[2].immisreg || inst.operands[2].shifted
01cfc07f
NC
8448 || inst.operands[2].negative
8449 /* See comment in do_ldrex(). */
8450 || (inst.operands[2].reg == REG_PC),
8451 BAD_ADDR_MODE);
a737bd4d 8452
c19d1205
ZW
8453 constraint (inst.operands[0].reg == inst.operands[1].reg
8454 || inst.operands[0].reg == inst.operands[2].reg, BAD_OVERLAP);
a737bd4d 8455
c19d1205
ZW
8456 constraint (inst.reloc.exp.X_op != O_constant
8457 || inst.reloc.exp.X_add_number != 0,
8458 _("offset must be zero in ARM encoding"));
a737bd4d 8459
c19d1205
ZW
8460 inst.instruction |= inst.operands[0].reg << 12;
8461 inst.instruction |= inst.operands[1].reg;
8462 inst.instruction |= inst.operands[2].reg << 16;
8463 inst.reloc.type = BFD_RELOC_UNUSED;
e16bb312
NC
8464}
8465
8466static void
c19d1205 8467do_strexd (void)
e16bb312 8468{
c19d1205
ZW
8469 constraint (inst.operands[1].reg % 2 != 0,
8470 _("even register required"));
8471 constraint (inst.operands[2].present
8472 && inst.operands[2].reg != inst.operands[1].reg + 1,
8473 _("can only store two consecutive registers"));
8474 /* If op 2 were present and equal to PC, this function wouldn't
8475 have been called in the first place. */
8476 constraint (inst.operands[1].reg == REG_LR, _("r14 not allowed here"));
e16bb312 8477
c19d1205
ZW
8478 constraint (inst.operands[0].reg == inst.operands[1].reg
8479 || inst.operands[0].reg == inst.operands[1].reg + 1
8480 || inst.operands[0].reg == inst.operands[3].reg,
8481 BAD_OVERLAP);
e16bb312 8482
c19d1205
ZW
8483 inst.instruction |= inst.operands[0].reg << 12;
8484 inst.instruction |= inst.operands[1].reg;
8485 inst.instruction |= inst.operands[3].reg << 16;
e16bb312
NC
8486}
8487
c19d1205
ZW
8488/* ARM V6 SXTAH extracts a 16-bit value from a register, sign
8489 extends it to 32-bits, and adds the result to a value in another
8490 register. You can specify a rotation by 0, 8, 16, or 24 bits
8491 before extracting the 16-bit value.
8492 SXTAH{<cond>} <Rd>, <Rn>, <Rm>{, <rotation>}
8493 Condition defaults to COND_ALWAYS.
8494 Error if any register uses R15. */
8495
e16bb312 8496static void
c19d1205 8497do_sxtah (void)
e16bb312 8498{
c19d1205
ZW
8499 inst.instruction |= inst.operands[0].reg << 12;
8500 inst.instruction |= inst.operands[1].reg << 16;
8501 inst.instruction |= inst.operands[2].reg;
8502 inst.instruction |= inst.operands[3].imm << 10;
8503}
e16bb312 8504
c19d1205 8505/* ARM V6 SXTH.
e16bb312 8506
c19d1205
ZW
8507 SXTH {<cond>} <Rd>, <Rm>{, <rotation>}
8508 Condition defaults to COND_ALWAYS.
8509 Error if any register uses R15. */
e16bb312
NC
8510
8511static void
c19d1205 8512do_sxth (void)
e16bb312 8513{
c19d1205
ZW
8514 inst.instruction |= inst.operands[0].reg << 12;
8515 inst.instruction |= inst.operands[1].reg;
8516 inst.instruction |= inst.operands[2].imm << 10;
e16bb312 8517}
c19d1205
ZW
8518\f
8519/* VFP instructions. In a logical order: SP variant first, monad
8520 before dyad, arithmetic then move then load/store. */
e16bb312
NC
8521
8522static void
c19d1205 8523do_vfp_sp_monadic (void)
e16bb312 8524{
5287ad62
JB
8525 encode_arm_vfp_reg (inst.operands[0].reg, VFP_REG_Sd);
8526 encode_arm_vfp_reg (inst.operands[1].reg, VFP_REG_Sm);
e16bb312
NC
8527}
8528
8529static void
c19d1205 8530do_vfp_sp_dyadic (void)
e16bb312 8531{
5287ad62
JB
8532 encode_arm_vfp_reg (inst.operands[0].reg, VFP_REG_Sd);
8533 encode_arm_vfp_reg (inst.operands[1].reg, VFP_REG_Sn);
8534 encode_arm_vfp_reg (inst.operands[2].reg, VFP_REG_Sm);
e16bb312
NC
8535}
8536
8537static void
c19d1205 8538do_vfp_sp_compare_z (void)
e16bb312 8539{
5287ad62 8540 encode_arm_vfp_reg (inst.operands[0].reg, VFP_REG_Sd);
e16bb312
NC
8541}
8542
8543static void
c19d1205 8544do_vfp_dp_sp_cvt (void)
e16bb312 8545{
5287ad62
JB
8546 encode_arm_vfp_reg (inst.operands[0].reg, VFP_REG_Dd);
8547 encode_arm_vfp_reg (inst.operands[1].reg, VFP_REG_Sm);
e16bb312
NC
8548}
8549
8550static void
c19d1205 8551do_vfp_sp_dp_cvt (void)
e16bb312 8552{
5287ad62
JB
8553 encode_arm_vfp_reg (inst.operands[0].reg, VFP_REG_Sd);
8554 encode_arm_vfp_reg (inst.operands[1].reg, VFP_REG_Dm);
e16bb312
NC
8555}
8556
8557static void
c19d1205 8558do_vfp_reg_from_sp (void)
e16bb312 8559{
c19d1205 8560 inst.instruction |= inst.operands[0].reg << 12;
5287ad62 8561 encode_arm_vfp_reg (inst.operands[1].reg, VFP_REG_Sn);
e16bb312
NC
8562}
8563
8564static void
c19d1205 8565do_vfp_reg2_from_sp2 (void)
e16bb312 8566{
c19d1205
ZW
8567 constraint (inst.operands[2].imm != 2,
8568 _("only two consecutive VFP SP registers allowed here"));
8569 inst.instruction |= inst.operands[0].reg << 12;
8570 inst.instruction |= inst.operands[1].reg << 16;
5287ad62 8571 encode_arm_vfp_reg (inst.operands[2].reg, VFP_REG_Sm);
e16bb312
NC
8572}
8573
8574static void
c19d1205 8575do_vfp_sp_from_reg (void)
e16bb312 8576{
5287ad62 8577 encode_arm_vfp_reg (inst.operands[0].reg, VFP_REG_Sn);
c19d1205 8578 inst.instruction |= inst.operands[1].reg << 12;
e16bb312
NC
8579}
8580
8581static void
c19d1205 8582do_vfp_sp2_from_reg2 (void)
e16bb312 8583{
c19d1205
ZW
8584 constraint (inst.operands[0].imm != 2,
8585 _("only two consecutive VFP SP registers allowed here"));
5287ad62 8586 encode_arm_vfp_reg (inst.operands[0].reg, VFP_REG_Sm);
c19d1205
ZW
8587 inst.instruction |= inst.operands[1].reg << 12;
8588 inst.instruction |= inst.operands[2].reg << 16;
e16bb312
NC
8589}
8590
8591static void
c19d1205 8592do_vfp_sp_ldst (void)
e16bb312 8593{
5287ad62 8594 encode_arm_vfp_reg (inst.operands[0].reg, VFP_REG_Sd);
c19d1205 8595 encode_arm_cp_address (1, FALSE, TRUE, 0);
e16bb312
NC
8596}
8597
8598static void
c19d1205 8599do_vfp_dp_ldst (void)
e16bb312 8600{
5287ad62 8601 encode_arm_vfp_reg (inst.operands[0].reg, VFP_REG_Dd);
c19d1205 8602 encode_arm_cp_address (1, FALSE, TRUE, 0);
e16bb312
NC
8603}
8604
c19d1205 8605
e16bb312 8606static void
c19d1205 8607vfp_sp_ldstm (enum vfp_ldstm_type ldstm_type)
e16bb312 8608{
c19d1205
ZW
8609 if (inst.operands[0].writeback)
8610 inst.instruction |= WRITE_BACK;
8611 else
8612 constraint (ldstm_type != VFP_LDSTMIA,
8613 _("this addressing mode requires base-register writeback"));
8614 inst.instruction |= inst.operands[0].reg << 16;
5287ad62 8615 encode_arm_vfp_reg (inst.operands[1].reg, VFP_REG_Sd);
c19d1205 8616 inst.instruction |= inst.operands[1].imm;
e16bb312
NC
8617}
8618
8619static void
c19d1205 8620vfp_dp_ldstm (enum vfp_ldstm_type ldstm_type)
e16bb312 8621{
c19d1205 8622 int count;
e16bb312 8623
c19d1205
ZW
8624 if (inst.operands[0].writeback)
8625 inst.instruction |= WRITE_BACK;
8626 else
8627 constraint (ldstm_type != VFP_LDSTMIA && ldstm_type != VFP_LDSTMIAX,
8628 _("this addressing mode requires base-register writeback"));
e16bb312 8629
c19d1205 8630 inst.instruction |= inst.operands[0].reg << 16;
5287ad62 8631 encode_arm_vfp_reg (inst.operands[1].reg, VFP_REG_Dd);
e16bb312 8632
c19d1205
ZW
8633 count = inst.operands[1].imm << 1;
8634 if (ldstm_type == VFP_LDSTMIAX || ldstm_type == VFP_LDSTMDBX)
8635 count += 1;
e16bb312 8636
c19d1205 8637 inst.instruction |= count;
e16bb312
NC
8638}
8639
8640static void
c19d1205 8641do_vfp_sp_ldstmia (void)
e16bb312 8642{
c19d1205 8643 vfp_sp_ldstm (VFP_LDSTMIA);
e16bb312
NC
8644}
8645
8646static void
c19d1205 8647do_vfp_sp_ldstmdb (void)
e16bb312 8648{
c19d1205 8649 vfp_sp_ldstm (VFP_LDSTMDB);
e16bb312
NC
8650}
8651
8652static void
c19d1205 8653do_vfp_dp_ldstmia (void)
e16bb312 8654{
c19d1205 8655 vfp_dp_ldstm (VFP_LDSTMIA);
e16bb312
NC
8656}
8657
8658static void
c19d1205 8659do_vfp_dp_ldstmdb (void)
e16bb312 8660{
c19d1205 8661 vfp_dp_ldstm (VFP_LDSTMDB);
e16bb312
NC
8662}
8663
8664static void
c19d1205 8665do_vfp_xp_ldstmia (void)
e16bb312 8666{
c19d1205
ZW
8667 vfp_dp_ldstm (VFP_LDSTMIAX);
8668}
e16bb312 8669
c19d1205
ZW
8670static void
8671do_vfp_xp_ldstmdb (void)
8672{
8673 vfp_dp_ldstm (VFP_LDSTMDBX);
e16bb312 8674}
5287ad62
JB
8675
8676static void
8677do_vfp_dp_rd_rm (void)
8678{
8679 encode_arm_vfp_reg (inst.operands[0].reg, VFP_REG_Dd);
8680 encode_arm_vfp_reg (inst.operands[1].reg, VFP_REG_Dm);
8681}
8682
8683static void
8684do_vfp_dp_rn_rd (void)
8685{
8686 encode_arm_vfp_reg (inst.operands[0].reg, VFP_REG_Dn);
8687 encode_arm_vfp_reg (inst.operands[1].reg, VFP_REG_Dd);
8688}
8689
8690static void
8691do_vfp_dp_rd_rn (void)
8692{
8693 encode_arm_vfp_reg (inst.operands[0].reg, VFP_REG_Dd);
8694 encode_arm_vfp_reg (inst.operands[1].reg, VFP_REG_Dn);
8695}
8696
8697static void
8698do_vfp_dp_rd_rn_rm (void)
8699{
8700 encode_arm_vfp_reg (inst.operands[0].reg, VFP_REG_Dd);
8701 encode_arm_vfp_reg (inst.operands[1].reg, VFP_REG_Dn);
8702 encode_arm_vfp_reg (inst.operands[2].reg, VFP_REG_Dm);
8703}
8704
8705static void
8706do_vfp_dp_rd (void)
8707{
8708 encode_arm_vfp_reg (inst.operands[0].reg, VFP_REG_Dd);
8709}
8710
8711static void
8712do_vfp_dp_rm_rd_rn (void)
8713{
8714 encode_arm_vfp_reg (inst.operands[0].reg, VFP_REG_Dm);
8715 encode_arm_vfp_reg (inst.operands[1].reg, VFP_REG_Dd);
8716 encode_arm_vfp_reg (inst.operands[2].reg, VFP_REG_Dn);
8717}
8718
8719/* VFPv3 instructions. */
8720static void
8721do_vfp_sp_const (void)
8722{
8723 encode_arm_vfp_reg (inst.operands[0].reg, VFP_REG_Sd);
00249aaa
PB
8724 inst.instruction |= (inst.operands[1].imm & 0xf0) << 12;
8725 inst.instruction |= (inst.operands[1].imm & 0x0f);
5287ad62
JB
8726}
8727
8728static void
8729do_vfp_dp_const (void)
8730{
8731 encode_arm_vfp_reg (inst.operands[0].reg, VFP_REG_Dd);
00249aaa
PB
8732 inst.instruction |= (inst.operands[1].imm & 0xf0) << 12;
8733 inst.instruction |= (inst.operands[1].imm & 0x0f);
5287ad62
JB
8734}
8735
8736static void
8737vfp_conv (int srcsize)
8738{
8739 unsigned immbits = srcsize - inst.operands[1].imm;
8740 inst.instruction |= (immbits & 1) << 5;
8741 inst.instruction |= (immbits >> 1);
8742}
8743
8744static void
8745do_vfp_sp_conv_16 (void)
8746{
8747 encode_arm_vfp_reg (inst.operands[0].reg, VFP_REG_Sd);
8748 vfp_conv (16);
8749}
8750
8751static void
8752do_vfp_dp_conv_16 (void)
8753{
8754 encode_arm_vfp_reg (inst.operands[0].reg, VFP_REG_Dd);
8755 vfp_conv (16);
8756}
8757
8758static void
8759do_vfp_sp_conv_32 (void)
8760{
8761 encode_arm_vfp_reg (inst.operands[0].reg, VFP_REG_Sd);
8762 vfp_conv (32);
8763}
8764
8765static void
8766do_vfp_dp_conv_32 (void)
8767{
8768 encode_arm_vfp_reg (inst.operands[0].reg, VFP_REG_Dd);
8769 vfp_conv (32);
8770}
c19d1205
ZW
8771\f
8772/* FPA instructions. Also in a logical order. */
e16bb312 8773
c19d1205
ZW
8774static void
8775do_fpa_cmp (void)
8776{
8777 inst.instruction |= inst.operands[0].reg << 16;
8778 inst.instruction |= inst.operands[1].reg;
8779}
b99bd4ef
NC
8780
8781static void
c19d1205 8782do_fpa_ldmstm (void)
b99bd4ef 8783{
c19d1205
ZW
8784 inst.instruction |= inst.operands[0].reg << 12;
8785 switch (inst.operands[1].imm)
8786 {
8787 case 1: inst.instruction |= CP_T_X; break;
8788 case 2: inst.instruction |= CP_T_Y; break;
8789 case 3: inst.instruction |= CP_T_Y | CP_T_X; break;
8790 case 4: break;
8791 default: abort ();
8792 }
b99bd4ef 8793
c19d1205
ZW
8794 if (inst.instruction & (PRE_INDEX | INDEX_UP))
8795 {
8796 /* The instruction specified "ea" or "fd", so we can only accept
8797 [Rn]{!}. The instruction does not really support stacking or
8798 unstacking, so we have to emulate these by setting appropriate
8799 bits and offsets. */
8800 constraint (inst.reloc.exp.X_op != O_constant
8801 || inst.reloc.exp.X_add_number != 0,
8802 _("this instruction does not support indexing"));
b99bd4ef 8803
c19d1205
ZW
8804 if ((inst.instruction & PRE_INDEX) || inst.operands[2].writeback)
8805 inst.reloc.exp.X_add_number = 12 * inst.operands[1].imm;
b99bd4ef 8806
c19d1205
ZW
8807 if (!(inst.instruction & INDEX_UP))
8808 inst.reloc.exp.X_add_number = -inst.reloc.exp.X_add_number;
b99bd4ef 8809
c19d1205
ZW
8810 if (!(inst.instruction & PRE_INDEX) && inst.operands[2].writeback)
8811 {
8812 inst.operands[2].preind = 0;
8813 inst.operands[2].postind = 1;
8814 }
8815 }
b99bd4ef 8816
c19d1205 8817 encode_arm_cp_address (2, TRUE, TRUE, 0);
b99bd4ef 8818}
c19d1205
ZW
8819\f
8820/* iWMMXt instructions: strictly in alphabetical order. */
b99bd4ef 8821
c19d1205
ZW
8822static void
8823do_iwmmxt_tandorc (void)
8824{
8825 constraint (inst.operands[0].reg != REG_PC, _("only r15 allowed here"));
8826}
b99bd4ef 8827
c19d1205
ZW
8828static void
8829do_iwmmxt_textrc (void)
8830{
8831 inst.instruction |= inst.operands[0].reg << 12;
8832 inst.instruction |= inst.operands[1].imm;
8833}
b99bd4ef
NC
8834
8835static void
c19d1205 8836do_iwmmxt_textrm (void)
b99bd4ef 8837{
c19d1205
ZW
8838 inst.instruction |= inst.operands[0].reg << 12;
8839 inst.instruction |= inst.operands[1].reg << 16;
8840 inst.instruction |= inst.operands[2].imm;
8841}
b99bd4ef 8842
c19d1205
ZW
8843static void
8844do_iwmmxt_tinsr (void)
8845{
8846 inst.instruction |= inst.operands[0].reg << 16;
8847 inst.instruction |= inst.operands[1].reg << 12;
8848 inst.instruction |= inst.operands[2].imm;
8849}
b99bd4ef 8850
c19d1205
ZW
8851static void
8852do_iwmmxt_tmia (void)
8853{
8854 inst.instruction |= inst.operands[0].reg << 5;
8855 inst.instruction |= inst.operands[1].reg;
8856 inst.instruction |= inst.operands[2].reg << 12;
8857}
b99bd4ef 8858
c19d1205
ZW
8859static void
8860do_iwmmxt_waligni (void)
8861{
8862 inst.instruction |= inst.operands[0].reg << 12;
8863 inst.instruction |= inst.operands[1].reg << 16;
8864 inst.instruction |= inst.operands[2].reg;
8865 inst.instruction |= inst.operands[3].imm << 20;
8866}
b99bd4ef 8867
2d447fca
JM
8868static void
8869do_iwmmxt_wmerge (void)
8870{
8871 inst.instruction |= inst.operands[0].reg << 12;
8872 inst.instruction |= inst.operands[1].reg << 16;
8873 inst.instruction |= inst.operands[2].reg;
8874 inst.instruction |= inst.operands[3].imm << 21;
8875}
8876
c19d1205
ZW
8877static void
8878do_iwmmxt_wmov (void)
8879{
8880 /* WMOV rD, rN is an alias for WOR rD, rN, rN. */
8881 inst.instruction |= inst.operands[0].reg << 12;
8882 inst.instruction |= inst.operands[1].reg << 16;
8883 inst.instruction |= inst.operands[1].reg;
8884}
b99bd4ef 8885
c19d1205
ZW
8886static void
8887do_iwmmxt_wldstbh (void)
8888{
8f06b2d8 8889 int reloc;
c19d1205 8890 inst.instruction |= inst.operands[0].reg << 12;
8f06b2d8
PB
8891 if (thumb_mode)
8892 reloc = BFD_RELOC_ARM_T32_CP_OFF_IMM_S2;
8893 else
8894 reloc = BFD_RELOC_ARM_CP_OFF_IMM_S2;
8895 encode_arm_cp_address (1, TRUE, FALSE, reloc);
b99bd4ef
NC
8896}
8897
c19d1205
ZW
8898static void
8899do_iwmmxt_wldstw (void)
8900{
8901 /* RIWR_RIWC clears .isreg for a control register. */
8902 if (!inst.operands[0].isreg)
8903 {
8904 constraint (inst.cond != COND_ALWAYS, BAD_COND);
8905 inst.instruction |= 0xf0000000;
8906 }
b99bd4ef 8907
c19d1205
ZW
8908 inst.instruction |= inst.operands[0].reg << 12;
8909 encode_arm_cp_address (1, TRUE, TRUE, 0);
8910}
b99bd4ef
NC
8911
8912static void
c19d1205 8913do_iwmmxt_wldstd (void)
b99bd4ef 8914{
c19d1205 8915 inst.instruction |= inst.operands[0].reg << 12;
2d447fca
JM
8916 if (ARM_CPU_HAS_FEATURE (cpu_variant, arm_cext_iwmmxt2)
8917 && inst.operands[1].immisreg)
8918 {
8919 inst.instruction &= ~0x1a000ff;
8920 inst.instruction |= (0xf << 28);
8921 if (inst.operands[1].preind)
8922 inst.instruction |= PRE_INDEX;
8923 if (!inst.operands[1].negative)
8924 inst.instruction |= INDEX_UP;
8925 if (inst.operands[1].writeback)
8926 inst.instruction |= WRITE_BACK;
8927 inst.instruction |= inst.operands[1].reg << 16;
8928 inst.instruction |= inst.reloc.exp.X_add_number << 4;
8929 inst.instruction |= inst.operands[1].imm;
8930 }
8931 else
8932 encode_arm_cp_address (1, TRUE, FALSE, 0);
c19d1205 8933}
b99bd4ef 8934
c19d1205
ZW
8935static void
8936do_iwmmxt_wshufh (void)
8937{
8938 inst.instruction |= inst.operands[0].reg << 12;
8939 inst.instruction |= inst.operands[1].reg << 16;
8940 inst.instruction |= ((inst.operands[2].imm & 0xf0) << 16);
8941 inst.instruction |= (inst.operands[2].imm & 0x0f);
8942}
b99bd4ef 8943
c19d1205
ZW
8944static void
8945do_iwmmxt_wzero (void)
8946{
8947 /* WZERO reg is an alias for WANDN reg, reg, reg. */
8948 inst.instruction |= inst.operands[0].reg;
8949 inst.instruction |= inst.operands[0].reg << 12;
8950 inst.instruction |= inst.operands[0].reg << 16;
8951}
2d447fca
JM
8952
8953static void
8954do_iwmmxt_wrwrwr_or_imm5 (void)
8955{
8956 if (inst.operands[2].isreg)
8957 do_rd_rn_rm ();
8958 else {
8959 constraint (!ARM_CPU_HAS_FEATURE (cpu_variant, arm_cext_iwmmxt2),
8960 _("immediate operand requires iWMMXt2"));
8961 do_rd_rn ();
8962 if (inst.operands[2].imm == 0)
8963 {
8964 switch ((inst.instruction >> 20) & 0xf)
8965 {
8966 case 4:
8967 case 5:
8968 case 6:
5f4273c7 8969 case 7:
2d447fca
JM
8970 /* w...h wrd, wrn, #0 -> wrorh wrd, wrn, #16. */
8971 inst.operands[2].imm = 16;
8972 inst.instruction = (inst.instruction & 0xff0fffff) | (0x7 << 20);
8973 break;
8974 case 8:
8975 case 9:
8976 case 10:
8977 case 11:
8978 /* w...w wrd, wrn, #0 -> wrorw wrd, wrn, #32. */
8979 inst.operands[2].imm = 32;
8980 inst.instruction = (inst.instruction & 0xff0fffff) | (0xb << 20);
8981 break;
8982 case 12:
8983 case 13:
8984 case 14:
8985 case 15:
8986 {
8987 /* w...d wrd, wrn, #0 -> wor wrd, wrn, wrn. */
8988 unsigned long wrn;
8989 wrn = (inst.instruction >> 16) & 0xf;
8990 inst.instruction &= 0xff0fff0f;
8991 inst.instruction |= wrn;
8992 /* Bail out here; the instruction is now assembled. */
8993 return;
8994 }
8995 }
8996 }
8997 /* Map 32 -> 0, etc. */
8998 inst.operands[2].imm &= 0x1f;
8999 inst.instruction |= (0xf << 28) | ((inst.operands[2].imm & 0x10) << 4) | (inst.operands[2].imm & 0xf);
9000 }
9001}
c19d1205
ZW
9002\f
9003/* Cirrus Maverick instructions. Simple 2-, 3-, and 4-register
9004 operations first, then control, shift, and load/store. */
b99bd4ef 9005
c19d1205 9006/* Insns like "foo X,Y,Z". */
b99bd4ef 9007
c19d1205
ZW
9008static void
9009do_mav_triple (void)
9010{
9011 inst.instruction |= inst.operands[0].reg << 16;
9012 inst.instruction |= inst.operands[1].reg;
9013 inst.instruction |= inst.operands[2].reg << 12;
9014}
b99bd4ef 9015
c19d1205
ZW
9016/* Insns like "foo W,X,Y,Z".
9017 where W=MVAX[0:3] and X,Y,Z=MVFX[0:15]. */
a737bd4d 9018
c19d1205
ZW
9019static void
9020do_mav_quad (void)
9021{
9022 inst.instruction |= inst.operands[0].reg << 5;
9023 inst.instruction |= inst.operands[1].reg << 12;
9024 inst.instruction |= inst.operands[2].reg << 16;
9025 inst.instruction |= inst.operands[3].reg;
a737bd4d
NC
9026}
9027
c19d1205
ZW
9028/* cfmvsc32<cond> DSPSC,MVDX[15:0]. */
9029static void
9030do_mav_dspsc (void)
a737bd4d 9031{
c19d1205
ZW
9032 inst.instruction |= inst.operands[1].reg << 12;
9033}
a737bd4d 9034
c19d1205
ZW
9035/* Maverick shift immediate instructions.
9036 cfsh32<cond> MVFX[15:0],MVFX[15:0],Shift[6:0].
9037 cfsh64<cond> MVDX[15:0],MVDX[15:0],Shift[6:0]. */
a737bd4d 9038
c19d1205
ZW
9039static void
9040do_mav_shift (void)
9041{
9042 int imm = inst.operands[2].imm;
a737bd4d 9043
c19d1205
ZW
9044 inst.instruction |= inst.operands[0].reg << 12;
9045 inst.instruction |= inst.operands[1].reg << 16;
a737bd4d 9046
c19d1205
ZW
9047 /* Bits 0-3 of the insn should have bits 0-3 of the immediate.
9048 Bits 5-7 of the insn should have bits 4-6 of the immediate.
9049 Bit 4 should be 0. */
9050 imm = (imm & 0xf) | ((imm & 0x70) << 1);
a737bd4d 9051
c19d1205
ZW
9052 inst.instruction |= imm;
9053}
9054\f
9055/* XScale instructions. Also sorted arithmetic before move. */
a737bd4d 9056
c19d1205
ZW
9057/* Xscale multiply-accumulate (argument parse)
9058 MIAcc acc0,Rm,Rs
9059 MIAPHcc acc0,Rm,Rs
9060 MIAxycc acc0,Rm,Rs. */
a737bd4d 9061
c19d1205
ZW
9062static void
9063do_xsc_mia (void)
9064{
9065 inst.instruction |= inst.operands[1].reg;
9066 inst.instruction |= inst.operands[2].reg << 12;
9067}
a737bd4d 9068
c19d1205 9069/* Xscale move-accumulator-register (argument parse)
a737bd4d 9070
c19d1205 9071 MARcc acc0,RdLo,RdHi. */
b99bd4ef 9072
c19d1205
ZW
9073static void
9074do_xsc_mar (void)
9075{
9076 inst.instruction |= inst.operands[1].reg << 12;
9077 inst.instruction |= inst.operands[2].reg << 16;
b99bd4ef
NC
9078}
9079
c19d1205 9080/* Xscale move-register-accumulator (argument parse)
b99bd4ef 9081
c19d1205 9082 MRAcc RdLo,RdHi,acc0. */
b99bd4ef
NC
9083
9084static void
c19d1205 9085do_xsc_mra (void)
b99bd4ef 9086{
c19d1205
ZW
9087 constraint (inst.operands[0].reg == inst.operands[1].reg, BAD_OVERLAP);
9088 inst.instruction |= inst.operands[0].reg << 12;
9089 inst.instruction |= inst.operands[1].reg << 16;
9090}
9091\f
9092/* Encoding functions relevant only to Thumb. */
b99bd4ef 9093
c19d1205
ZW
9094/* inst.operands[i] is a shifted-register operand; encode
9095 it into inst.instruction in the format used by Thumb32. */
9096
9097static void
9098encode_thumb32_shifted_operand (int i)
9099{
9100 unsigned int value = inst.reloc.exp.X_add_number;
9101 unsigned int shift = inst.operands[i].shift_kind;
b99bd4ef 9102
9c3c69f2
PB
9103 constraint (inst.operands[i].immisreg,
9104 _("shift by register not allowed in thumb mode"));
c19d1205
ZW
9105 inst.instruction |= inst.operands[i].reg;
9106 if (shift == SHIFT_RRX)
9107 inst.instruction |= SHIFT_ROR << 4;
9108 else
b99bd4ef 9109 {
c19d1205
ZW
9110 constraint (inst.reloc.exp.X_op != O_constant,
9111 _("expression too complex"));
9112
9113 constraint (value > 32
9114 || (value == 32 && (shift == SHIFT_LSL
9115 || shift == SHIFT_ROR)),
9116 _("shift expression is too large"));
9117
9118 if (value == 0)
9119 shift = SHIFT_LSL;
9120 else if (value == 32)
9121 value = 0;
9122
9123 inst.instruction |= shift << 4;
9124 inst.instruction |= (value & 0x1c) << 10;
9125 inst.instruction |= (value & 0x03) << 6;
b99bd4ef 9126 }
c19d1205 9127}
b99bd4ef 9128
b99bd4ef 9129
c19d1205
ZW
9130/* inst.operands[i] was set up by parse_address. Encode it into a
9131 Thumb32 format load or store instruction. Reject forms that cannot
9132 be used with such instructions. If is_t is true, reject forms that
9133 cannot be used with a T instruction; if is_d is true, reject forms
5be8be5d
DG
9134 that cannot be used with a D instruction. If it is a store insn,
9135 reject PC in Rn. */
b99bd4ef 9136
c19d1205
ZW
9137static void
9138encode_thumb32_addr_mode (int i, bfd_boolean is_t, bfd_boolean is_d)
9139{
5be8be5d 9140 const bfd_boolean is_pc = (inst.operands[i].reg == REG_PC);
c19d1205
ZW
9141
9142 constraint (!inst.operands[i].isreg,
53365c0d 9143 _("Instruction does not support =N addresses"));
b99bd4ef 9144
c19d1205
ZW
9145 inst.instruction |= inst.operands[i].reg << 16;
9146 if (inst.operands[i].immisreg)
b99bd4ef 9147 {
5be8be5d 9148 constraint (is_pc, BAD_PC_ADDRESSING);
c19d1205
ZW
9149 constraint (is_t || is_d, _("cannot use register index with this instruction"));
9150 constraint (inst.operands[i].negative,
9151 _("Thumb does not support negative register indexing"));
9152 constraint (inst.operands[i].postind,
9153 _("Thumb does not support register post-indexing"));
9154 constraint (inst.operands[i].writeback,
9155 _("Thumb does not support register indexing with writeback"));
9156 constraint (inst.operands[i].shifted && inst.operands[i].shift_kind != SHIFT_LSL,
9157 _("Thumb supports only LSL in shifted register indexing"));
b99bd4ef 9158
f40d1643 9159 inst.instruction |= inst.operands[i].imm;
c19d1205 9160 if (inst.operands[i].shifted)
b99bd4ef 9161 {
c19d1205
ZW
9162 constraint (inst.reloc.exp.X_op != O_constant,
9163 _("expression too complex"));
9c3c69f2
PB
9164 constraint (inst.reloc.exp.X_add_number < 0
9165 || inst.reloc.exp.X_add_number > 3,
c19d1205 9166 _("shift out of range"));
9c3c69f2 9167 inst.instruction |= inst.reloc.exp.X_add_number << 4;
c19d1205
ZW
9168 }
9169 inst.reloc.type = BFD_RELOC_UNUSED;
9170 }
9171 else if (inst.operands[i].preind)
9172 {
5be8be5d 9173 constraint (is_pc && inst.operands[i].writeback, BAD_PC_WRITEBACK);
f40d1643 9174 constraint (is_t && inst.operands[i].writeback,
c19d1205 9175 _("cannot use writeback with this instruction"));
5be8be5d
DG
9176 constraint (is_pc && ((inst.instruction & THUMB2_LOAD_BIT) == 0)
9177 && !inst.reloc.pc_rel, BAD_PC_ADDRESSING);
c19d1205
ZW
9178
9179 if (is_d)
9180 {
9181 inst.instruction |= 0x01000000;
9182 if (inst.operands[i].writeback)
9183 inst.instruction |= 0x00200000;
b99bd4ef 9184 }
c19d1205 9185 else
b99bd4ef 9186 {
c19d1205
ZW
9187 inst.instruction |= 0x00000c00;
9188 if (inst.operands[i].writeback)
9189 inst.instruction |= 0x00000100;
b99bd4ef 9190 }
c19d1205 9191 inst.reloc.type = BFD_RELOC_ARM_T32_OFFSET_IMM;
b99bd4ef 9192 }
c19d1205 9193 else if (inst.operands[i].postind)
b99bd4ef 9194 {
9c2799c2 9195 gas_assert (inst.operands[i].writeback);
c19d1205
ZW
9196 constraint (is_pc, _("cannot use post-indexing with PC-relative addressing"));
9197 constraint (is_t, _("cannot use post-indexing with this instruction"));
9198
9199 if (is_d)
9200 inst.instruction |= 0x00200000;
9201 else
9202 inst.instruction |= 0x00000900;
9203 inst.reloc.type = BFD_RELOC_ARM_T32_OFFSET_IMM;
9204 }
9205 else /* unindexed - only for coprocessor */
9206 inst.error = _("instruction does not accept unindexed addressing");
9207}
9208
9209/* Table of Thumb instructions which exist in both 16- and 32-bit
9210 encodings (the latter only in post-V6T2 cores). The index is the
9211 value used in the insns table below. When there is more than one
9212 possible 16-bit encoding for the instruction, this table always
0110f2b8
PB
9213 holds variant (1).
9214 Also contains several pseudo-instructions used during relaxation. */
c19d1205 9215#define T16_32_TAB \
21d799b5
NC
9216 X(_adc, 4140, eb400000), \
9217 X(_adcs, 4140, eb500000), \
9218 X(_add, 1c00, eb000000), \
9219 X(_adds, 1c00, eb100000), \
9220 X(_addi, 0000, f1000000), \
9221 X(_addis, 0000, f1100000), \
9222 X(_add_pc,000f, f20f0000), \
9223 X(_add_sp,000d, f10d0000), \
9224 X(_adr, 000f, f20f0000), \
9225 X(_and, 4000, ea000000), \
9226 X(_ands, 4000, ea100000), \
9227 X(_asr, 1000, fa40f000), \
9228 X(_asrs, 1000, fa50f000), \
9229 X(_b, e000, f000b000), \
9230 X(_bcond, d000, f0008000), \
9231 X(_bic, 4380, ea200000), \
9232 X(_bics, 4380, ea300000), \
9233 X(_cmn, 42c0, eb100f00), \
9234 X(_cmp, 2800, ebb00f00), \
9235 X(_cpsie, b660, f3af8400), \
9236 X(_cpsid, b670, f3af8600), \
9237 X(_cpy, 4600, ea4f0000), \
9238 X(_dec_sp,80dd, f1ad0d00), \
9239 X(_eor, 4040, ea800000), \
9240 X(_eors, 4040, ea900000), \
9241 X(_inc_sp,00dd, f10d0d00), \
9242 X(_ldmia, c800, e8900000), \
9243 X(_ldr, 6800, f8500000), \
9244 X(_ldrb, 7800, f8100000), \
9245 X(_ldrh, 8800, f8300000), \
9246 X(_ldrsb, 5600, f9100000), \
9247 X(_ldrsh, 5e00, f9300000), \
9248 X(_ldr_pc,4800, f85f0000), \
9249 X(_ldr_pc2,4800, f85f0000), \
9250 X(_ldr_sp,9800, f85d0000), \
9251 X(_lsl, 0000, fa00f000), \
9252 X(_lsls, 0000, fa10f000), \
9253 X(_lsr, 0800, fa20f000), \
9254 X(_lsrs, 0800, fa30f000), \
9255 X(_mov, 2000, ea4f0000), \
9256 X(_movs, 2000, ea5f0000), \
9257 X(_mul, 4340, fb00f000), \
9258 X(_muls, 4340, ffffffff), /* no 32b muls */ \
9259 X(_mvn, 43c0, ea6f0000), \
9260 X(_mvns, 43c0, ea7f0000), \
9261 X(_neg, 4240, f1c00000), /* rsb #0 */ \
9262 X(_negs, 4240, f1d00000), /* rsbs #0 */ \
9263 X(_orr, 4300, ea400000), \
9264 X(_orrs, 4300, ea500000), \
9265 X(_pop, bc00, e8bd0000), /* ldmia sp!,... */ \
9266 X(_push, b400, e92d0000), /* stmdb sp!,... */ \
9267 X(_rev, ba00, fa90f080), \
9268 X(_rev16, ba40, fa90f090), \
9269 X(_revsh, bac0, fa90f0b0), \
9270 X(_ror, 41c0, fa60f000), \
9271 X(_rors, 41c0, fa70f000), \
9272 X(_sbc, 4180, eb600000), \
9273 X(_sbcs, 4180, eb700000), \
9274 X(_stmia, c000, e8800000), \
9275 X(_str, 6000, f8400000), \
9276 X(_strb, 7000, f8000000), \
9277 X(_strh, 8000, f8200000), \
9278 X(_str_sp,9000, f84d0000), \
9279 X(_sub, 1e00, eba00000), \
9280 X(_subs, 1e00, ebb00000), \
9281 X(_subi, 8000, f1a00000), \
9282 X(_subis, 8000, f1b00000), \
9283 X(_sxtb, b240, fa4ff080), \
9284 X(_sxth, b200, fa0ff080), \
9285 X(_tst, 4200, ea100f00), \
9286 X(_uxtb, b2c0, fa5ff080), \
9287 X(_uxth, b280, fa1ff080), \
9288 X(_nop, bf00, f3af8000), \
9289 X(_yield, bf10, f3af8001), \
9290 X(_wfe, bf20, f3af8002), \
9291 X(_wfi, bf30, f3af8003), \
9292 X(_sev, bf40, f3af8004),
c19d1205
ZW
9293
9294/* To catch errors in encoding functions, the codes are all offset by
9295 0xF800, putting them in one of the 32-bit prefix ranges, ergo undefined
9296 as 16-bit instructions. */
21d799b5 9297#define X(a,b,c) T_MNEM##a
c19d1205
ZW
9298enum t16_32_codes { T16_32_OFFSET = 0xF7FF, T16_32_TAB };
9299#undef X
9300
9301#define X(a,b,c) 0x##b
9302static const unsigned short thumb_op16[] = { T16_32_TAB };
9303#define THUMB_OP16(n) (thumb_op16[(n) - (T16_32_OFFSET + 1)])
9304#undef X
9305
9306#define X(a,b,c) 0x##c
9307static const unsigned int thumb_op32[] = { T16_32_TAB };
c921be7d
NC
9308#define THUMB_OP32(n) (thumb_op32[(n) - (T16_32_OFFSET + 1)])
9309#define THUMB_SETS_FLAGS(n) (THUMB_OP32 (n) & 0x00100000)
c19d1205
ZW
9310#undef X
9311#undef T16_32_TAB
9312
9313/* Thumb instruction encoders, in alphabetical order. */
9314
92e90b6e 9315/* ADDW or SUBW. */
c921be7d 9316
92e90b6e
PB
9317static void
9318do_t_add_sub_w (void)
9319{
9320 int Rd, Rn;
9321
9322 Rd = inst.operands[0].reg;
9323 Rn = inst.operands[1].reg;
9324
539d4391
NC
9325 /* If Rn is REG_PC, this is ADR; if Rn is REG_SP, then this
9326 is the SP-{plus,minus}-immediate form of the instruction. */
9327 if (Rn == REG_SP)
9328 constraint (Rd == REG_PC, BAD_PC);
9329 else
9330 reject_bad_reg (Rd);
fdfde340 9331
92e90b6e
PB
9332 inst.instruction |= (Rn << 16) | (Rd << 8);
9333 inst.reloc.type = BFD_RELOC_ARM_T32_IMM12;
9334}
9335
c19d1205
ZW
9336/* Parse an add or subtract instruction. We get here with inst.instruction
9337 equalling any of THUMB_OPCODE_add, adds, sub, or subs. */
9338
9339static void
9340do_t_add_sub (void)
9341{
9342 int Rd, Rs, Rn;
9343
9344 Rd = inst.operands[0].reg;
9345 Rs = (inst.operands[1].present
9346 ? inst.operands[1].reg /* Rd, Rs, foo */
9347 : inst.operands[0].reg); /* Rd, foo -> Rd, Rd, foo */
9348
e07e6e58
NC
9349 if (Rd == REG_PC)
9350 set_it_insn_type_last ();
9351
c19d1205
ZW
9352 if (unified_syntax)
9353 {
0110f2b8
PB
9354 bfd_boolean flags;
9355 bfd_boolean narrow;
9356 int opcode;
9357
9358 flags = (inst.instruction == T_MNEM_adds
9359 || inst.instruction == T_MNEM_subs);
9360 if (flags)
e07e6e58 9361 narrow = !in_it_block ();
0110f2b8 9362 else
e07e6e58 9363 narrow = in_it_block ();
c19d1205 9364 if (!inst.operands[2].isreg)
b99bd4ef 9365 {
16805f35
PB
9366 int add;
9367
fdfde340
JM
9368 constraint (Rd == REG_SP && Rs != REG_SP, BAD_SP);
9369
16805f35
PB
9370 add = (inst.instruction == T_MNEM_add
9371 || inst.instruction == T_MNEM_adds);
0110f2b8
PB
9372 opcode = 0;
9373 if (inst.size_req != 4)
9374 {
0110f2b8
PB
9375 /* Attempt to use a narrow opcode, with relaxation if
9376 appropriate. */
9377 if (Rd == REG_SP && Rs == REG_SP && !flags)
9378 opcode = add ? T_MNEM_inc_sp : T_MNEM_dec_sp;
9379 else if (Rd <= 7 && Rs == REG_SP && add && !flags)
9380 opcode = T_MNEM_add_sp;
9381 else if (Rd <= 7 && Rs == REG_PC && add && !flags)
9382 opcode = T_MNEM_add_pc;
9383 else if (Rd <= 7 && Rs <= 7 && narrow)
9384 {
9385 if (flags)
9386 opcode = add ? T_MNEM_addis : T_MNEM_subis;
9387 else
9388 opcode = add ? T_MNEM_addi : T_MNEM_subi;
9389 }
9390 if (opcode)
9391 {
9392 inst.instruction = THUMB_OP16(opcode);
9393 inst.instruction |= (Rd << 4) | Rs;
9394 inst.reloc.type = BFD_RELOC_ARM_THUMB_ADD;
9395 if (inst.size_req != 2)
9396 inst.relax = opcode;
9397 }
9398 else
9399 constraint (inst.size_req == 2, BAD_HIREG);
9400 }
9401 if (inst.size_req == 4
9402 || (inst.size_req != 2 && !opcode))
9403 {
efd81785
PB
9404 if (Rd == REG_PC)
9405 {
fdfde340 9406 constraint (add, BAD_PC);
efd81785
PB
9407 constraint (Rs != REG_LR || inst.instruction != T_MNEM_subs,
9408 _("only SUBS PC, LR, #const allowed"));
9409 constraint (inst.reloc.exp.X_op != O_constant,
9410 _("expression too complex"));
9411 constraint (inst.reloc.exp.X_add_number < 0
9412 || inst.reloc.exp.X_add_number > 0xff,
9413 _("immediate value out of range"));
9414 inst.instruction = T2_SUBS_PC_LR
9415 | inst.reloc.exp.X_add_number;
9416 inst.reloc.type = BFD_RELOC_UNUSED;
9417 return;
9418 }
9419 else if (Rs == REG_PC)
16805f35
PB
9420 {
9421 /* Always use addw/subw. */
9422 inst.instruction = add ? 0xf20f0000 : 0xf2af0000;
9423 inst.reloc.type = BFD_RELOC_ARM_T32_IMM12;
9424 }
9425 else
9426 {
9427 inst.instruction = THUMB_OP32 (inst.instruction);
9428 inst.instruction = (inst.instruction & 0xe1ffffff)
9429 | 0x10000000;
9430 if (flags)
9431 inst.reloc.type = BFD_RELOC_ARM_T32_IMMEDIATE;
9432 else
9433 inst.reloc.type = BFD_RELOC_ARM_T32_ADD_IMM;
9434 }
dc4503c6
PB
9435 inst.instruction |= Rd << 8;
9436 inst.instruction |= Rs << 16;
0110f2b8 9437 }
b99bd4ef 9438 }
c19d1205
ZW
9439 else
9440 {
9441 Rn = inst.operands[2].reg;
9442 /* See if we can do this with a 16-bit instruction. */
9443 if (!inst.operands[2].shifted && inst.size_req != 4)
9444 {
e27ec89e
PB
9445 if (Rd > 7 || Rs > 7 || Rn > 7)
9446 narrow = FALSE;
9447
9448 if (narrow)
c19d1205 9449 {
e27ec89e
PB
9450 inst.instruction = ((inst.instruction == T_MNEM_adds
9451 || inst.instruction == T_MNEM_add)
c19d1205
ZW
9452 ? T_OPCODE_ADD_R3
9453 : T_OPCODE_SUB_R3);
9454 inst.instruction |= Rd | (Rs << 3) | (Rn << 6);
9455 return;
9456 }
b99bd4ef 9457
7e806470 9458 if (inst.instruction == T_MNEM_add && (Rd == Rs || Rd == Rn))
c19d1205 9459 {
7e806470
PB
9460 /* Thumb-1 cores (except v6-M) require at least one high
9461 register in a narrow non flag setting add. */
9462 if (Rd > 7 || Rn > 7
9463 || ARM_CPU_HAS_FEATURE (selected_cpu, arm_ext_v6t2)
9464 || ARM_CPU_HAS_FEATURE (selected_cpu, arm_ext_msr))
c19d1205 9465 {
7e806470
PB
9466 if (Rd == Rn)
9467 {
9468 Rn = Rs;
9469 Rs = Rd;
9470 }
c19d1205
ZW
9471 inst.instruction = T_OPCODE_ADD_HI;
9472 inst.instruction |= (Rd & 8) << 4;
9473 inst.instruction |= (Rd & 7);
9474 inst.instruction |= Rn << 3;
9475 return;
9476 }
c19d1205
ZW
9477 }
9478 }
c921be7d 9479
fdfde340
JM
9480 constraint (Rd == REG_PC, BAD_PC);
9481 constraint (Rd == REG_SP && Rs != REG_SP, BAD_SP);
9482 constraint (Rs == REG_PC, BAD_PC);
9483 reject_bad_reg (Rn);
9484
c19d1205
ZW
9485 /* If we get here, it can't be done in 16 bits. */
9486 constraint (inst.operands[2].shifted && inst.operands[2].immisreg,
9487 _("shift must be constant"));
9488 inst.instruction = THUMB_OP32 (inst.instruction);
9489 inst.instruction |= Rd << 8;
9490 inst.instruction |= Rs << 16;
9491 encode_thumb32_shifted_operand (2);
9492 }
9493 }
9494 else
9495 {
9496 constraint (inst.instruction == T_MNEM_adds
9497 || inst.instruction == T_MNEM_subs,
9498 BAD_THUMB32);
b99bd4ef 9499
c19d1205 9500 if (!inst.operands[2].isreg) /* Rd, Rs, #imm */
b99bd4ef 9501 {
c19d1205
ZW
9502 constraint ((Rd > 7 && (Rd != REG_SP || Rs != REG_SP))
9503 || (Rs > 7 && Rs != REG_SP && Rs != REG_PC),
9504 BAD_HIREG);
9505
9506 inst.instruction = (inst.instruction == T_MNEM_add
9507 ? 0x0000 : 0x8000);
9508 inst.instruction |= (Rd << 4) | Rs;
9509 inst.reloc.type = BFD_RELOC_ARM_THUMB_ADD;
b99bd4ef
NC
9510 return;
9511 }
9512
c19d1205
ZW
9513 Rn = inst.operands[2].reg;
9514 constraint (inst.operands[2].shifted, _("unshifted register required"));
b99bd4ef 9515
c19d1205
ZW
9516 /* We now have Rd, Rs, and Rn set to registers. */
9517 if (Rd > 7 || Rs > 7 || Rn > 7)
b99bd4ef 9518 {
c19d1205
ZW
9519 /* Can't do this for SUB. */
9520 constraint (inst.instruction == T_MNEM_sub, BAD_HIREG);
9521 inst.instruction = T_OPCODE_ADD_HI;
9522 inst.instruction |= (Rd & 8) << 4;
9523 inst.instruction |= (Rd & 7);
9524 if (Rs == Rd)
9525 inst.instruction |= Rn << 3;
9526 else if (Rn == Rd)
9527 inst.instruction |= Rs << 3;
9528 else
9529 constraint (1, _("dest must overlap one source register"));
9530 }
9531 else
9532 {
9533 inst.instruction = (inst.instruction == T_MNEM_add
9534 ? T_OPCODE_ADD_R3 : T_OPCODE_SUB_R3);
9535 inst.instruction |= Rd | (Rs << 3) | (Rn << 6);
b99bd4ef 9536 }
b99bd4ef 9537 }
b99bd4ef
NC
9538}
9539
c19d1205
ZW
9540static void
9541do_t_adr (void)
9542{
fdfde340
JM
9543 unsigned Rd;
9544
9545 Rd = inst.operands[0].reg;
9546 reject_bad_reg (Rd);
9547
9548 if (unified_syntax && inst.size_req == 0 && Rd <= 7)
0110f2b8
PB
9549 {
9550 /* Defer to section relaxation. */
9551 inst.relax = inst.instruction;
9552 inst.instruction = THUMB_OP16 (inst.instruction);
fdfde340 9553 inst.instruction |= Rd << 4;
0110f2b8
PB
9554 }
9555 else if (unified_syntax && inst.size_req != 2)
e9f89963 9556 {
0110f2b8 9557 /* Generate a 32-bit opcode. */
e9f89963 9558 inst.instruction = THUMB_OP32 (inst.instruction);
fdfde340 9559 inst.instruction |= Rd << 8;
e9f89963
PB
9560 inst.reloc.type = BFD_RELOC_ARM_T32_ADD_PC12;
9561 inst.reloc.pc_rel = 1;
9562 }
9563 else
9564 {
0110f2b8 9565 /* Generate a 16-bit opcode. */
e9f89963
PB
9566 inst.instruction = THUMB_OP16 (inst.instruction);
9567 inst.reloc.type = BFD_RELOC_ARM_THUMB_ADD;
9568 inst.reloc.exp.X_add_number -= 4; /* PC relative adjust. */
9569 inst.reloc.pc_rel = 1;
b99bd4ef 9570
fdfde340 9571 inst.instruction |= Rd << 4;
e9f89963 9572 }
c19d1205 9573}
b99bd4ef 9574
c19d1205
ZW
9575/* Arithmetic instructions for which there is just one 16-bit
9576 instruction encoding, and it allows only two low registers.
9577 For maximal compatibility with ARM syntax, we allow three register
9578 operands even when Thumb-32 instructions are not available, as long
9579 as the first two are identical. For instance, both "sbc r0,r1" and
9580 "sbc r0,r0,r1" are allowed. */
b99bd4ef 9581static void
c19d1205 9582do_t_arit3 (void)
b99bd4ef 9583{
c19d1205 9584 int Rd, Rs, Rn;
b99bd4ef 9585
c19d1205
ZW
9586 Rd = inst.operands[0].reg;
9587 Rs = (inst.operands[1].present
9588 ? inst.operands[1].reg /* Rd, Rs, foo */
9589 : inst.operands[0].reg); /* Rd, foo -> Rd, Rd, foo */
9590 Rn = inst.operands[2].reg;
b99bd4ef 9591
fdfde340
JM
9592 reject_bad_reg (Rd);
9593 reject_bad_reg (Rs);
9594 if (inst.operands[2].isreg)
9595 reject_bad_reg (Rn);
9596
c19d1205 9597 if (unified_syntax)
b99bd4ef 9598 {
c19d1205
ZW
9599 if (!inst.operands[2].isreg)
9600 {
9601 /* For an immediate, we always generate a 32-bit opcode;
9602 section relaxation will shrink it later if possible. */
9603 inst.instruction = THUMB_OP32 (inst.instruction);
9604 inst.instruction = (inst.instruction & 0xe1ffffff) | 0x10000000;
9605 inst.instruction |= Rd << 8;
9606 inst.instruction |= Rs << 16;
9607 inst.reloc.type = BFD_RELOC_ARM_T32_IMMEDIATE;
9608 }
9609 else
9610 {
e27ec89e
PB
9611 bfd_boolean narrow;
9612
c19d1205 9613 /* See if we can do this with a 16-bit instruction. */
e27ec89e 9614 if (THUMB_SETS_FLAGS (inst.instruction))
e07e6e58 9615 narrow = !in_it_block ();
e27ec89e 9616 else
e07e6e58 9617 narrow = in_it_block ();
e27ec89e
PB
9618
9619 if (Rd > 7 || Rn > 7 || Rs > 7)
9620 narrow = FALSE;
9621 if (inst.operands[2].shifted)
9622 narrow = FALSE;
9623 if (inst.size_req == 4)
9624 narrow = FALSE;
9625
9626 if (narrow
c19d1205
ZW
9627 && Rd == Rs)
9628 {
9629 inst.instruction = THUMB_OP16 (inst.instruction);
9630 inst.instruction |= Rd;
9631 inst.instruction |= Rn << 3;
9632 return;
9633 }
b99bd4ef 9634
c19d1205
ZW
9635 /* If we get here, it can't be done in 16 bits. */
9636 constraint (inst.operands[2].shifted
9637 && inst.operands[2].immisreg,
9638 _("shift must be constant"));
9639 inst.instruction = THUMB_OP32 (inst.instruction);
9640 inst.instruction |= Rd << 8;
9641 inst.instruction |= Rs << 16;
9642 encode_thumb32_shifted_operand (2);
9643 }
a737bd4d 9644 }
c19d1205 9645 else
b99bd4ef 9646 {
c19d1205
ZW
9647 /* On its face this is a lie - the instruction does set the
9648 flags. However, the only supported mnemonic in this mode
9649 says it doesn't. */
9650 constraint (THUMB_SETS_FLAGS (inst.instruction), BAD_THUMB32);
a737bd4d 9651
c19d1205
ZW
9652 constraint (!inst.operands[2].isreg || inst.operands[2].shifted,
9653 _("unshifted register required"));
9654 constraint (Rd > 7 || Rs > 7 || Rn > 7, BAD_HIREG);
9655 constraint (Rd != Rs,
9656 _("dest and source1 must be the same register"));
a737bd4d 9657
c19d1205
ZW
9658 inst.instruction = THUMB_OP16 (inst.instruction);
9659 inst.instruction |= Rd;
9660 inst.instruction |= Rn << 3;
b99bd4ef 9661 }
a737bd4d 9662}
b99bd4ef 9663
c19d1205
ZW
9664/* Similarly, but for instructions where the arithmetic operation is
9665 commutative, so we can allow either of them to be different from
9666 the destination operand in a 16-bit instruction. For instance, all
9667 three of "adc r0,r1", "adc r0,r0,r1", and "adc r0,r1,r0" are
9668 accepted. */
9669static void
9670do_t_arit3c (void)
a737bd4d 9671{
c19d1205 9672 int Rd, Rs, Rn;
b99bd4ef 9673
c19d1205
ZW
9674 Rd = inst.operands[0].reg;
9675 Rs = (inst.operands[1].present
9676 ? inst.operands[1].reg /* Rd, Rs, foo */
9677 : inst.operands[0].reg); /* Rd, foo -> Rd, Rd, foo */
9678 Rn = inst.operands[2].reg;
c921be7d 9679
fdfde340
JM
9680 reject_bad_reg (Rd);
9681 reject_bad_reg (Rs);
9682 if (inst.operands[2].isreg)
9683 reject_bad_reg (Rn);
a737bd4d 9684
c19d1205 9685 if (unified_syntax)
a737bd4d 9686 {
c19d1205 9687 if (!inst.operands[2].isreg)
b99bd4ef 9688 {
c19d1205
ZW
9689 /* For an immediate, we always generate a 32-bit opcode;
9690 section relaxation will shrink it later if possible. */
9691 inst.instruction = THUMB_OP32 (inst.instruction);
9692 inst.instruction = (inst.instruction & 0xe1ffffff) | 0x10000000;
9693 inst.instruction |= Rd << 8;
9694 inst.instruction |= Rs << 16;
9695 inst.reloc.type = BFD_RELOC_ARM_T32_IMMEDIATE;
b99bd4ef 9696 }
c19d1205 9697 else
a737bd4d 9698 {
e27ec89e
PB
9699 bfd_boolean narrow;
9700
c19d1205 9701 /* See if we can do this with a 16-bit instruction. */
e27ec89e 9702 if (THUMB_SETS_FLAGS (inst.instruction))
e07e6e58 9703 narrow = !in_it_block ();
e27ec89e 9704 else
e07e6e58 9705 narrow = in_it_block ();
e27ec89e
PB
9706
9707 if (Rd > 7 || Rn > 7 || Rs > 7)
9708 narrow = FALSE;
9709 if (inst.operands[2].shifted)
9710 narrow = FALSE;
9711 if (inst.size_req == 4)
9712 narrow = FALSE;
9713
9714 if (narrow)
a737bd4d 9715 {
c19d1205 9716 if (Rd == Rs)
a737bd4d 9717 {
c19d1205
ZW
9718 inst.instruction = THUMB_OP16 (inst.instruction);
9719 inst.instruction |= Rd;
9720 inst.instruction |= Rn << 3;
9721 return;
a737bd4d 9722 }
c19d1205 9723 if (Rd == Rn)
a737bd4d 9724 {
c19d1205
ZW
9725 inst.instruction = THUMB_OP16 (inst.instruction);
9726 inst.instruction |= Rd;
9727 inst.instruction |= Rs << 3;
9728 return;
a737bd4d
NC
9729 }
9730 }
c19d1205
ZW
9731
9732 /* If we get here, it can't be done in 16 bits. */
9733 constraint (inst.operands[2].shifted
9734 && inst.operands[2].immisreg,
9735 _("shift must be constant"));
9736 inst.instruction = THUMB_OP32 (inst.instruction);
9737 inst.instruction |= Rd << 8;
9738 inst.instruction |= Rs << 16;
9739 encode_thumb32_shifted_operand (2);
a737bd4d 9740 }
b99bd4ef 9741 }
c19d1205
ZW
9742 else
9743 {
9744 /* On its face this is a lie - the instruction does set the
9745 flags. However, the only supported mnemonic in this mode
9746 says it doesn't. */
9747 constraint (THUMB_SETS_FLAGS (inst.instruction), BAD_THUMB32);
a737bd4d 9748
c19d1205
ZW
9749 constraint (!inst.operands[2].isreg || inst.operands[2].shifted,
9750 _("unshifted register required"));
9751 constraint (Rd > 7 || Rs > 7 || Rn > 7, BAD_HIREG);
9752
9753 inst.instruction = THUMB_OP16 (inst.instruction);
9754 inst.instruction |= Rd;
9755
9756 if (Rd == Rs)
9757 inst.instruction |= Rn << 3;
9758 else if (Rd == Rn)
9759 inst.instruction |= Rs << 3;
9760 else
9761 constraint (1, _("dest must overlap one source register"));
9762 }
a737bd4d
NC
9763}
9764
62b3e311
PB
9765static void
9766do_t_barrier (void)
9767{
9768 if (inst.operands[0].present)
9769 {
9770 constraint ((inst.instruction & 0xf0) != 0x40
52e7f43d
RE
9771 && inst.operands[0].imm > 0xf
9772 && inst.operands[0].imm < 0x0,
bd3ba5d1 9773 _("bad barrier type"));
62b3e311
PB
9774 inst.instruction |= inst.operands[0].imm;
9775 }
9776 else
9777 inst.instruction |= 0xf;
9778}
9779
c19d1205
ZW
9780static void
9781do_t_bfc (void)
a737bd4d 9782{
fdfde340 9783 unsigned Rd;
c19d1205
ZW
9784 unsigned int msb = inst.operands[1].imm + inst.operands[2].imm;
9785 constraint (msb > 32, _("bit-field extends past end of register"));
9786 /* The instruction encoding stores the LSB and MSB,
9787 not the LSB and width. */
fdfde340
JM
9788 Rd = inst.operands[0].reg;
9789 reject_bad_reg (Rd);
9790 inst.instruction |= Rd << 8;
c19d1205
ZW
9791 inst.instruction |= (inst.operands[1].imm & 0x1c) << 10;
9792 inst.instruction |= (inst.operands[1].imm & 0x03) << 6;
9793 inst.instruction |= msb - 1;
b99bd4ef
NC
9794}
9795
c19d1205
ZW
9796static void
9797do_t_bfi (void)
b99bd4ef 9798{
fdfde340 9799 int Rd, Rn;
c19d1205 9800 unsigned int msb;
b99bd4ef 9801
fdfde340
JM
9802 Rd = inst.operands[0].reg;
9803 reject_bad_reg (Rd);
9804
c19d1205
ZW
9805 /* #0 in second position is alternative syntax for bfc, which is
9806 the same instruction but with REG_PC in the Rm field. */
9807 if (!inst.operands[1].isreg)
fdfde340
JM
9808 Rn = REG_PC;
9809 else
9810 {
9811 Rn = inst.operands[1].reg;
9812 reject_bad_reg (Rn);
9813 }
b99bd4ef 9814
c19d1205
ZW
9815 msb = inst.operands[2].imm + inst.operands[3].imm;
9816 constraint (msb > 32, _("bit-field extends past end of register"));
9817 /* The instruction encoding stores the LSB and MSB,
9818 not the LSB and width. */
fdfde340
JM
9819 inst.instruction |= Rd << 8;
9820 inst.instruction |= Rn << 16;
c19d1205
ZW
9821 inst.instruction |= (inst.operands[2].imm & 0x1c) << 10;
9822 inst.instruction |= (inst.operands[2].imm & 0x03) << 6;
9823 inst.instruction |= msb - 1;
b99bd4ef
NC
9824}
9825
c19d1205
ZW
9826static void
9827do_t_bfx (void)
b99bd4ef 9828{
fdfde340
JM
9829 unsigned Rd, Rn;
9830
9831 Rd = inst.operands[0].reg;
9832 Rn = inst.operands[1].reg;
9833
9834 reject_bad_reg (Rd);
9835 reject_bad_reg (Rn);
9836
c19d1205
ZW
9837 constraint (inst.operands[2].imm + inst.operands[3].imm > 32,
9838 _("bit-field extends past end of register"));
fdfde340
JM
9839 inst.instruction |= Rd << 8;
9840 inst.instruction |= Rn << 16;
c19d1205
ZW
9841 inst.instruction |= (inst.operands[2].imm & 0x1c) << 10;
9842 inst.instruction |= (inst.operands[2].imm & 0x03) << 6;
9843 inst.instruction |= inst.operands[3].imm - 1;
9844}
b99bd4ef 9845
c19d1205
ZW
9846/* ARM V5 Thumb BLX (argument parse)
9847 BLX <target_addr> which is BLX(1)
9848 BLX <Rm> which is BLX(2)
9849 Unfortunately, there are two different opcodes for this mnemonic.
9850 So, the insns[].value is not used, and the code here zaps values
9851 into inst.instruction.
b99bd4ef 9852
c19d1205
ZW
9853 ??? How to take advantage of the additional two bits of displacement
9854 available in Thumb32 mode? Need new relocation? */
b99bd4ef 9855
c19d1205
ZW
9856static void
9857do_t_blx (void)
9858{
e07e6e58
NC
9859 set_it_insn_type_last ();
9860
c19d1205 9861 if (inst.operands[0].isreg)
fdfde340
JM
9862 {
9863 constraint (inst.operands[0].reg == REG_PC, BAD_PC);
9864 /* We have a register, so this is BLX(2). */
9865 inst.instruction |= inst.operands[0].reg << 3;
9866 }
b99bd4ef
NC
9867 else
9868 {
c19d1205 9869 /* No register. This must be BLX(1). */
2fc8bdac 9870 inst.instruction = 0xf000e800;
0855e32b 9871 encode_branch (BFD_RELOC_THUMB_PCREL_BLX);
b99bd4ef
NC
9872 }
9873}
9874
c19d1205
ZW
9875static void
9876do_t_branch (void)
b99bd4ef 9877{
0110f2b8 9878 int opcode;
dfa9f0d5 9879 int cond;
9ae92b05 9880 int reloc;
dfa9f0d5 9881
e07e6e58
NC
9882 cond = inst.cond;
9883 set_it_insn_type (IF_INSIDE_IT_LAST_INSN);
9884
9885 if (in_it_block ())
dfa9f0d5
PB
9886 {
9887 /* Conditional branches inside IT blocks are encoded as unconditional
9888 branches. */
9889 cond = COND_ALWAYS;
dfa9f0d5
PB
9890 }
9891 else
9892 cond = inst.cond;
9893
9894 if (cond != COND_ALWAYS)
0110f2b8
PB
9895 opcode = T_MNEM_bcond;
9896 else
9897 opcode = inst.instruction;
9898
12d6b0b7
RS
9899 if (unified_syntax
9900 && (inst.size_req == 4
10960bfb
PB
9901 || (inst.size_req != 2
9902 && (inst.operands[0].hasreloc
9903 || inst.reloc.exp.X_op == O_constant))))
c19d1205 9904 {
0110f2b8 9905 inst.instruction = THUMB_OP32(opcode);
dfa9f0d5 9906 if (cond == COND_ALWAYS)
9ae92b05 9907 reloc = BFD_RELOC_THUMB_PCREL_BRANCH25;
c19d1205
ZW
9908 else
9909 {
9c2799c2 9910 gas_assert (cond != 0xF);
dfa9f0d5 9911 inst.instruction |= cond << 22;
9ae92b05 9912 reloc = BFD_RELOC_THUMB_PCREL_BRANCH20;
c19d1205
ZW
9913 }
9914 }
b99bd4ef
NC
9915 else
9916 {
0110f2b8 9917 inst.instruction = THUMB_OP16(opcode);
dfa9f0d5 9918 if (cond == COND_ALWAYS)
9ae92b05 9919 reloc = BFD_RELOC_THUMB_PCREL_BRANCH12;
c19d1205 9920 else
b99bd4ef 9921 {
dfa9f0d5 9922 inst.instruction |= cond << 8;
9ae92b05 9923 reloc = BFD_RELOC_THUMB_PCREL_BRANCH9;
b99bd4ef 9924 }
0110f2b8
PB
9925 /* Allow section relaxation. */
9926 if (unified_syntax && inst.size_req != 2)
9927 inst.relax = opcode;
b99bd4ef 9928 }
9ae92b05 9929 inst.reloc.type = reloc;
c19d1205 9930 inst.reloc.pc_rel = 1;
b99bd4ef
NC
9931}
9932
9933static void
c19d1205 9934do_t_bkpt (void)
b99bd4ef 9935{
dfa9f0d5
PB
9936 constraint (inst.cond != COND_ALWAYS,
9937 _("instruction is always unconditional"));
c19d1205 9938 if (inst.operands[0].present)
b99bd4ef 9939 {
c19d1205
ZW
9940 constraint (inst.operands[0].imm > 255,
9941 _("immediate value out of range"));
9942 inst.instruction |= inst.operands[0].imm;
e07e6e58 9943 set_it_insn_type (NEUTRAL_IT_INSN);
b99bd4ef 9944 }
b99bd4ef
NC
9945}
9946
9947static void
c19d1205 9948do_t_branch23 (void)
b99bd4ef 9949{
e07e6e58 9950 set_it_insn_type_last ();
0855e32b
NS
9951 encode_branch (BFD_RELOC_THUMB_PCREL_BRANCH23);
9952
9953 /* md_apply_fix blows up with 'bl foo(PLT)' where foo is defined in
9954 this file. We used to simply ignore the PLT reloc type here --
9955 the branch encoding is now needed to deal with TLSCALL relocs.
9956 So if we see a PLT reloc now, put it back to how it used to be to
9957 keep the preexisting behaviour. */
9958 if (inst.reloc.type == BFD_RELOC_ARM_PLT32)
9959 inst.reloc.type = BFD_RELOC_THUMB_PCREL_BRANCH23;
90e4755a 9960
4343666d 9961#if defined(OBJ_COFF)
c19d1205
ZW
9962 /* If the destination of the branch is a defined symbol which does not have
9963 the THUMB_FUNC attribute, then we must be calling a function which has
9964 the (interfacearm) attribute. We look for the Thumb entry point to that
9965 function and change the branch to refer to that function instead. */
9966 if ( inst.reloc.exp.X_op == O_symbol
9967 && inst.reloc.exp.X_add_symbol != NULL
9968 && S_IS_DEFINED (inst.reloc.exp.X_add_symbol)
9969 && ! THUMB_IS_FUNC (inst.reloc.exp.X_add_symbol))
9970 inst.reloc.exp.X_add_symbol =
9971 find_real_start (inst.reloc.exp.X_add_symbol);
4343666d 9972#endif
90e4755a
RE
9973}
9974
9975static void
c19d1205 9976do_t_bx (void)
90e4755a 9977{
e07e6e58 9978 set_it_insn_type_last ();
c19d1205
ZW
9979 inst.instruction |= inst.operands[0].reg << 3;
9980 /* ??? FIXME: Should add a hacky reloc here if reg is REG_PC. The reloc
9981 should cause the alignment to be checked once it is known. This is
9982 because BX PC only works if the instruction is word aligned. */
9983}
90e4755a 9984
c19d1205
ZW
9985static void
9986do_t_bxj (void)
9987{
fdfde340 9988 int Rm;
90e4755a 9989
e07e6e58 9990 set_it_insn_type_last ();
fdfde340
JM
9991 Rm = inst.operands[0].reg;
9992 reject_bad_reg (Rm);
9993 inst.instruction |= Rm << 16;
90e4755a
RE
9994}
9995
9996static void
c19d1205 9997do_t_clz (void)
90e4755a 9998{
fdfde340
JM
9999 unsigned Rd;
10000 unsigned Rm;
10001
10002 Rd = inst.operands[0].reg;
10003 Rm = inst.operands[1].reg;
10004
10005 reject_bad_reg (Rd);
10006 reject_bad_reg (Rm);
10007
10008 inst.instruction |= Rd << 8;
10009 inst.instruction |= Rm << 16;
10010 inst.instruction |= Rm;
c19d1205 10011}
90e4755a 10012
dfa9f0d5
PB
10013static void
10014do_t_cps (void)
10015{
e07e6e58 10016 set_it_insn_type (OUTSIDE_IT_INSN);
dfa9f0d5
PB
10017 inst.instruction |= inst.operands[0].imm;
10018}
10019
c19d1205
ZW
10020static void
10021do_t_cpsi (void)
10022{
e07e6e58 10023 set_it_insn_type (OUTSIDE_IT_INSN);
c19d1205 10024 if (unified_syntax
62b3e311
PB
10025 && (inst.operands[1].present || inst.size_req == 4)
10026 && ARM_CPU_HAS_FEATURE (cpu_variant, arm_ext_v6_notm))
90e4755a 10027 {
c19d1205
ZW
10028 unsigned int imod = (inst.instruction & 0x0030) >> 4;
10029 inst.instruction = 0xf3af8000;
10030 inst.instruction |= imod << 9;
10031 inst.instruction |= inst.operands[0].imm << 5;
10032 if (inst.operands[1].present)
10033 inst.instruction |= 0x100 | inst.operands[1].imm;
90e4755a 10034 }
c19d1205 10035 else
90e4755a 10036 {
62b3e311
PB
10037 constraint (!ARM_CPU_HAS_FEATURE (cpu_variant, arm_ext_v1)
10038 && (inst.operands[0].imm & 4),
10039 _("selected processor does not support 'A' form "
10040 "of this instruction"));
10041 constraint (inst.operands[1].present || inst.size_req == 4,
c19d1205
ZW
10042 _("Thumb does not support the 2-argument "
10043 "form of this instruction"));
10044 inst.instruction |= inst.operands[0].imm;
90e4755a 10045 }
90e4755a
RE
10046}
10047
c19d1205
ZW
10048/* THUMB CPY instruction (argument parse). */
10049
90e4755a 10050static void
c19d1205 10051do_t_cpy (void)
90e4755a 10052{
c19d1205 10053 if (inst.size_req == 4)
90e4755a 10054 {
c19d1205
ZW
10055 inst.instruction = THUMB_OP32 (T_MNEM_mov);
10056 inst.instruction |= inst.operands[0].reg << 8;
10057 inst.instruction |= inst.operands[1].reg;
90e4755a 10058 }
c19d1205 10059 else
90e4755a 10060 {
c19d1205
ZW
10061 inst.instruction |= (inst.operands[0].reg & 0x8) << 4;
10062 inst.instruction |= (inst.operands[0].reg & 0x7);
10063 inst.instruction |= inst.operands[1].reg << 3;
90e4755a 10064 }
90e4755a
RE
10065}
10066
90e4755a 10067static void
25fe350b 10068do_t_cbz (void)
90e4755a 10069{
e07e6e58 10070 set_it_insn_type (OUTSIDE_IT_INSN);
c19d1205
ZW
10071 constraint (inst.operands[0].reg > 7, BAD_HIREG);
10072 inst.instruction |= inst.operands[0].reg;
10073 inst.reloc.pc_rel = 1;
10074 inst.reloc.type = BFD_RELOC_THUMB_PCREL_BRANCH7;
10075}
90e4755a 10076
62b3e311
PB
10077static void
10078do_t_dbg (void)
10079{
10080 inst.instruction |= inst.operands[0].imm;
10081}
10082
10083static void
10084do_t_div (void)
10085{
fdfde340
JM
10086 unsigned Rd, Rn, Rm;
10087
10088 Rd = inst.operands[0].reg;
10089 Rn = (inst.operands[1].present
10090 ? inst.operands[1].reg : Rd);
10091 Rm = inst.operands[2].reg;
10092
10093 reject_bad_reg (Rd);
10094 reject_bad_reg (Rn);
10095 reject_bad_reg (Rm);
10096
10097 inst.instruction |= Rd << 8;
10098 inst.instruction |= Rn << 16;
10099 inst.instruction |= Rm;
62b3e311
PB
10100}
10101
c19d1205
ZW
10102static void
10103do_t_hint (void)
10104{
10105 if (unified_syntax && inst.size_req == 4)
10106 inst.instruction = THUMB_OP32 (inst.instruction);
10107 else
10108 inst.instruction = THUMB_OP16 (inst.instruction);
10109}
90e4755a 10110
c19d1205
ZW
10111static void
10112do_t_it (void)
10113{
10114 unsigned int cond = inst.operands[0].imm;
e27ec89e 10115
e07e6e58
NC
10116 set_it_insn_type (IT_INSN);
10117 now_it.mask = (inst.instruction & 0xf) | 0x10;
10118 now_it.cc = cond;
e27ec89e
PB
10119
10120 /* If the condition is a negative condition, invert the mask. */
c19d1205 10121 if ((cond & 0x1) == 0x0)
90e4755a 10122 {
c19d1205 10123 unsigned int mask = inst.instruction & 0x000f;
90e4755a 10124
c19d1205
ZW
10125 if ((mask & 0x7) == 0)
10126 /* no conversion needed */;
10127 else if ((mask & 0x3) == 0)
e27ec89e
PB
10128 mask ^= 0x8;
10129 else if ((mask & 0x1) == 0)
10130 mask ^= 0xC;
c19d1205 10131 else
e27ec89e 10132 mask ^= 0xE;
90e4755a 10133
e27ec89e
PB
10134 inst.instruction &= 0xfff0;
10135 inst.instruction |= mask;
c19d1205 10136 }
90e4755a 10137
c19d1205
ZW
10138 inst.instruction |= cond << 4;
10139}
90e4755a 10140
3c707909
PB
10141/* Helper function used for both push/pop and ldm/stm. */
10142static void
10143encode_thumb2_ldmstm (int base, unsigned mask, bfd_boolean writeback)
10144{
10145 bfd_boolean load;
10146
10147 load = (inst.instruction & (1 << 20)) != 0;
10148
10149 if (mask & (1 << 13))
10150 inst.error = _("SP not allowed in register list");
1e5b0379
NC
10151
10152 if ((mask & (1 << base)) != 0
10153 && writeback)
10154 inst.error = _("having the base register in the register list when "
10155 "using write back is UNPREDICTABLE");
10156
3c707909
PB
10157 if (load)
10158 {
e07e6e58
NC
10159 if (mask & (1 << 15))
10160 {
10161 if (mask & (1 << 14))
10162 inst.error = _("LR and PC should not both be in register list");
10163 else
10164 set_it_insn_type_last ();
10165 }
3c707909
PB
10166 }
10167 else
10168 {
10169 if (mask & (1 << 15))
10170 inst.error = _("PC not allowed in register list");
3c707909
PB
10171 }
10172
10173 if ((mask & (mask - 1)) == 0)
10174 {
10175 /* Single register transfers implemented as str/ldr. */
10176 if (writeback)
10177 {
10178 if (inst.instruction & (1 << 23))
10179 inst.instruction = 0x00000b04; /* ia! -> [base], #4 */
10180 else
10181 inst.instruction = 0x00000d04; /* db! -> [base, #-4]! */
10182 }
10183 else
10184 {
10185 if (inst.instruction & (1 << 23))
10186 inst.instruction = 0x00800000; /* ia -> [base] */
10187 else
10188 inst.instruction = 0x00000c04; /* db -> [base, #-4] */
10189 }
10190
10191 inst.instruction |= 0xf8400000;
10192 if (load)
10193 inst.instruction |= 0x00100000;
10194
5f4273c7 10195 mask = ffs (mask) - 1;
3c707909
PB
10196 mask <<= 12;
10197 }
10198 else if (writeback)
10199 inst.instruction |= WRITE_BACK;
10200
10201 inst.instruction |= mask;
10202 inst.instruction |= base << 16;
10203}
10204
c19d1205
ZW
10205static void
10206do_t_ldmstm (void)
10207{
10208 /* This really doesn't seem worth it. */
10209 constraint (inst.reloc.type != BFD_RELOC_UNUSED,
10210 _("expression too complex"));
10211 constraint (inst.operands[1].writeback,
10212 _("Thumb load/store multiple does not support {reglist}^"));
90e4755a 10213
c19d1205
ZW
10214 if (unified_syntax)
10215 {
3c707909
PB
10216 bfd_boolean narrow;
10217 unsigned mask;
10218
10219 narrow = FALSE;
c19d1205
ZW
10220 /* See if we can use a 16-bit instruction. */
10221 if (inst.instruction < 0xffff /* not ldmdb/stmdb */
10222 && inst.size_req != 4
3c707909 10223 && !(inst.operands[1].imm & ~0xff))
90e4755a 10224 {
3c707909 10225 mask = 1 << inst.operands[0].reg;
90e4755a 10226
eab4f823 10227 if (inst.operands[0].reg <= 7)
90e4755a 10228 {
3c707909 10229 if (inst.instruction == T_MNEM_stmia
eab4f823
MGD
10230 ? inst.operands[0].writeback
10231 : (inst.operands[0].writeback
10232 == !(inst.operands[1].imm & mask)))
10233 {
10234 if (inst.instruction == T_MNEM_stmia
10235 && (inst.operands[1].imm & mask)
10236 && (inst.operands[1].imm & (mask - 1)))
10237 as_warn (_("value stored for r%d is UNKNOWN"),
10238 inst.operands[0].reg);
3c707909 10239
eab4f823
MGD
10240 inst.instruction = THUMB_OP16 (inst.instruction);
10241 inst.instruction |= inst.operands[0].reg << 8;
10242 inst.instruction |= inst.operands[1].imm;
10243 narrow = TRUE;
10244 }
10245 else if ((inst.operands[1].imm & (inst.operands[1].imm-1)) == 0)
10246 {
10247 /* This means 1 register in reg list one of 3 situations:
10248 1. Instruction is stmia, but without writeback.
10249 2. lmdia without writeback, but with Rn not in
10250 reglist.
10251 3. ldmia with writeback, but with Rn in reglist.
10252 Case 3 is UNPREDICTABLE behaviour, so we handle
10253 case 1 and 2 which can be converted into a 16-bit
10254 str or ldr. The SP cases are handled below. */
10255 unsigned long opcode;
10256 /* First, record an error for Case 3. */
10257 if (inst.operands[1].imm & mask
10258 && inst.operands[0].writeback)
10259 inst.error =
10260 _("having the base register in the register list when "
10261 "using write back is UNPREDICTABLE");
10262
10263 opcode = (inst.instruction == T_MNEM_stmia ? T_MNEM_str
10264 : T_MNEM_ldr);
10265 inst.instruction = THUMB_OP16 (opcode);
10266 inst.instruction |= inst.operands[0].reg << 3;
10267 inst.instruction |= (ffs (inst.operands[1].imm)-1);
10268 narrow = TRUE;
10269 }
90e4755a 10270 }
eab4f823 10271 else if (inst.operands[0] .reg == REG_SP)
90e4755a 10272 {
eab4f823
MGD
10273 if (inst.operands[0].writeback)
10274 {
10275 inst.instruction =
10276 THUMB_OP16 (inst.instruction == T_MNEM_stmia
10277 ? T_MNEM_push : T_MNEM_pop);
10278 inst.instruction |= inst.operands[1].imm;
10279 narrow = TRUE;
10280 }
10281 else if ((inst.operands[1].imm & (inst.operands[1].imm-1)) == 0)
10282 {
10283 inst.instruction =
10284 THUMB_OP16 (inst.instruction == T_MNEM_stmia
10285 ? T_MNEM_str_sp : T_MNEM_ldr_sp);
10286 inst.instruction |= ((ffs (inst.operands[1].imm)-1) << 8);
10287 narrow = TRUE;
10288 }
90e4755a 10289 }
3c707909
PB
10290 }
10291
10292 if (!narrow)
10293 {
c19d1205
ZW
10294 if (inst.instruction < 0xffff)
10295 inst.instruction = THUMB_OP32 (inst.instruction);
3c707909 10296
5f4273c7
NC
10297 encode_thumb2_ldmstm (inst.operands[0].reg, inst.operands[1].imm,
10298 inst.operands[0].writeback);
90e4755a
RE
10299 }
10300 }
c19d1205 10301 else
90e4755a 10302 {
c19d1205
ZW
10303 constraint (inst.operands[0].reg > 7
10304 || (inst.operands[1].imm & ~0xff), BAD_HIREG);
1198ca51
PB
10305 constraint (inst.instruction != T_MNEM_ldmia
10306 && inst.instruction != T_MNEM_stmia,
10307 _("Thumb-2 instruction only valid in unified syntax"));
c19d1205 10308 if (inst.instruction == T_MNEM_stmia)
f03698e6 10309 {
c19d1205
ZW
10310 if (!inst.operands[0].writeback)
10311 as_warn (_("this instruction will write back the base register"));
10312 if ((inst.operands[1].imm & (1 << inst.operands[0].reg))
10313 && (inst.operands[1].imm & ((1 << inst.operands[0].reg) - 1)))
1e5b0379 10314 as_warn (_("value stored for r%d is UNKNOWN"),
c19d1205 10315 inst.operands[0].reg);
f03698e6 10316 }
c19d1205 10317 else
90e4755a 10318 {
c19d1205
ZW
10319 if (!inst.operands[0].writeback
10320 && !(inst.operands[1].imm & (1 << inst.operands[0].reg)))
10321 as_warn (_("this instruction will write back the base register"));
10322 else if (inst.operands[0].writeback
10323 && (inst.operands[1].imm & (1 << inst.operands[0].reg)))
10324 as_warn (_("this instruction will not write back the base register"));
90e4755a
RE
10325 }
10326
c19d1205
ZW
10327 inst.instruction = THUMB_OP16 (inst.instruction);
10328 inst.instruction |= inst.operands[0].reg << 8;
10329 inst.instruction |= inst.operands[1].imm;
10330 }
10331}
e28cd48c 10332
c19d1205
ZW
10333static void
10334do_t_ldrex (void)
10335{
10336 constraint (!inst.operands[1].isreg || !inst.operands[1].preind
10337 || inst.operands[1].postind || inst.operands[1].writeback
10338 || inst.operands[1].immisreg || inst.operands[1].shifted
10339 || inst.operands[1].negative,
01cfc07f 10340 BAD_ADDR_MODE);
e28cd48c 10341
5be8be5d
DG
10342 constraint ((inst.operands[1].reg == REG_PC), BAD_PC);
10343
c19d1205
ZW
10344 inst.instruction |= inst.operands[0].reg << 12;
10345 inst.instruction |= inst.operands[1].reg << 16;
10346 inst.reloc.type = BFD_RELOC_ARM_T32_OFFSET_U8;
10347}
e28cd48c 10348
c19d1205
ZW
10349static void
10350do_t_ldrexd (void)
10351{
10352 if (!inst.operands[1].present)
1cac9012 10353 {
c19d1205
ZW
10354 constraint (inst.operands[0].reg == REG_LR,
10355 _("r14 not allowed as first register "
10356 "when second register is omitted"));
10357 inst.operands[1].reg = inst.operands[0].reg + 1;
b99bd4ef 10358 }
c19d1205
ZW
10359 constraint (inst.operands[0].reg == inst.operands[1].reg,
10360 BAD_OVERLAP);
b99bd4ef 10361
c19d1205
ZW
10362 inst.instruction |= inst.operands[0].reg << 12;
10363 inst.instruction |= inst.operands[1].reg << 8;
10364 inst.instruction |= inst.operands[2].reg << 16;
b99bd4ef
NC
10365}
10366
10367static void
c19d1205 10368do_t_ldst (void)
b99bd4ef 10369{
0110f2b8
PB
10370 unsigned long opcode;
10371 int Rn;
10372
e07e6e58
NC
10373 if (inst.operands[0].isreg
10374 && !inst.operands[0].preind
10375 && inst.operands[0].reg == REG_PC)
10376 set_it_insn_type_last ();
10377
0110f2b8 10378 opcode = inst.instruction;
c19d1205 10379 if (unified_syntax)
b99bd4ef 10380 {
53365c0d
PB
10381 if (!inst.operands[1].isreg)
10382 {
10383 if (opcode <= 0xffff)
10384 inst.instruction = THUMB_OP32 (opcode);
10385 if (move_or_literal_pool (0, /*thumb_p=*/TRUE, /*mode_3=*/FALSE))
10386 return;
10387 }
0110f2b8
PB
10388 if (inst.operands[1].isreg
10389 && !inst.operands[1].writeback
c19d1205
ZW
10390 && !inst.operands[1].shifted && !inst.operands[1].postind
10391 && !inst.operands[1].negative && inst.operands[0].reg <= 7
0110f2b8
PB
10392 && opcode <= 0xffff
10393 && inst.size_req != 4)
c19d1205 10394 {
0110f2b8
PB
10395 /* Insn may have a 16-bit form. */
10396 Rn = inst.operands[1].reg;
10397 if (inst.operands[1].immisreg)
10398 {
10399 inst.instruction = THUMB_OP16 (opcode);
5f4273c7 10400 /* [Rn, Rik] */
0110f2b8
PB
10401 if (Rn <= 7 && inst.operands[1].imm <= 7)
10402 goto op16;
5be8be5d
DG
10403 else if (opcode != T_MNEM_ldr && opcode != T_MNEM_str)
10404 reject_bad_reg (inst.operands[1].imm);
0110f2b8
PB
10405 }
10406 else if ((Rn <= 7 && opcode != T_MNEM_ldrsh
10407 && opcode != T_MNEM_ldrsb)
10408 || ((Rn == REG_PC || Rn == REG_SP) && opcode == T_MNEM_ldr)
10409 || (Rn == REG_SP && opcode == T_MNEM_str))
10410 {
10411 /* [Rn, #const] */
10412 if (Rn > 7)
10413 {
10414 if (Rn == REG_PC)
10415 {
10416 if (inst.reloc.pc_rel)
10417 opcode = T_MNEM_ldr_pc2;
10418 else
10419 opcode = T_MNEM_ldr_pc;
10420 }
10421 else
10422 {
10423 if (opcode == T_MNEM_ldr)
10424 opcode = T_MNEM_ldr_sp;
10425 else
10426 opcode = T_MNEM_str_sp;
10427 }
10428 inst.instruction = inst.operands[0].reg << 8;
10429 }
10430 else
10431 {
10432 inst.instruction = inst.operands[0].reg;
10433 inst.instruction |= inst.operands[1].reg << 3;
10434 }
10435 inst.instruction |= THUMB_OP16 (opcode);
10436 if (inst.size_req == 2)
10437 inst.reloc.type = BFD_RELOC_ARM_THUMB_OFFSET;
10438 else
10439 inst.relax = opcode;
10440 return;
10441 }
c19d1205 10442 }
0110f2b8 10443 /* Definitely a 32-bit variant. */
5be8be5d 10444
8d67f500
NC
10445 /* Warning for Erratum 752419. */
10446 if (opcode == T_MNEM_ldr
10447 && inst.operands[0].reg == REG_SP
10448 && inst.operands[1].writeback == 1
10449 && !inst.operands[1].immisreg)
10450 {
10451 if (no_cpu_selected ()
10452 || (ARM_CPU_HAS_FEATURE (cpu_variant, arm_ext_v7)
10453 && !ARM_CPU_HAS_FEATURE (cpu_variant, arm_ext_v7a)
10454 && !ARM_CPU_HAS_FEATURE (cpu_variant, arm_ext_v7r)))
10455 as_warn (_("This instruction may be unpredictable "
10456 "if executed on M-profile cores "
10457 "with interrupts enabled."));
10458 }
10459
5be8be5d
DG
10460 /* Do some validations regarding addressing modes. */
10461 if (inst.operands[1].immisreg && opcode != T_MNEM_ldr
10462 && opcode != T_MNEM_str)
10463 reject_bad_reg (inst.operands[1].imm);
10464
0110f2b8 10465 inst.instruction = THUMB_OP32 (opcode);
c19d1205
ZW
10466 inst.instruction |= inst.operands[0].reg << 12;
10467 encode_thumb32_addr_mode (1, /*is_t=*/FALSE, /*is_d=*/FALSE);
b99bd4ef
NC
10468 return;
10469 }
10470
c19d1205
ZW
10471 constraint (inst.operands[0].reg > 7, BAD_HIREG);
10472
10473 if (inst.instruction == T_MNEM_ldrsh || inst.instruction == T_MNEM_ldrsb)
b99bd4ef 10474 {
c19d1205
ZW
10475 /* Only [Rn,Rm] is acceptable. */
10476 constraint (inst.operands[1].reg > 7 || inst.operands[1].imm > 7, BAD_HIREG);
10477 constraint (!inst.operands[1].isreg || !inst.operands[1].immisreg
10478 || inst.operands[1].postind || inst.operands[1].shifted
10479 || inst.operands[1].negative,
10480 _("Thumb does not support this addressing mode"));
10481 inst.instruction = THUMB_OP16 (inst.instruction);
10482 goto op16;
b99bd4ef 10483 }
5f4273c7 10484
c19d1205
ZW
10485 inst.instruction = THUMB_OP16 (inst.instruction);
10486 if (!inst.operands[1].isreg)
10487 if (move_or_literal_pool (0, /*thumb_p=*/TRUE, /*mode_3=*/FALSE))
10488 return;
b99bd4ef 10489
c19d1205
ZW
10490 constraint (!inst.operands[1].preind
10491 || inst.operands[1].shifted
10492 || inst.operands[1].writeback,
10493 _("Thumb does not support this addressing mode"));
10494 if (inst.operands[1].reg == REG_PC || inst.operands[1].reg == REG_SP)
90e4755a 10495 {
c19d1205
ZW
10496 constraint (inst.instruction & 0x0600,
10497 _("byte or halfword not valid for base register"));
10498 constraint (inst.operands[1].reg == REG_PC
10499 && !(inst.instruction & THUMB_LOAD_BIT),
10500 _("r15 based store not allowed"));
10501 constraint (inst.operands[1].immisreg,
10502 _("invalid base register for register offset"));
b99bd4ef 10503
c19d1205
ZW
10504 if (inst.operands[1].reg == REG_PC)
10505 inst.instruction = T_OPCODE_LDR_PC;
10506 else if (inst.instruction & THUMB_LOAD_BIT)
10507 inst.instruction = T_OPCODE_LDR_SP;
10508 else
10509 inst.instruction = T_OPCODE_STR_SP;
b99bd4ef 10510
c19d1205
ZW
10511 inst.instruction |= inst.operands[0].reg << 8;
10512 inst.reloc.type = BFD_RELOC_ARM_THUMB_OFFSET;
10513 return;
10514 }
90e4755a 10515
c19d1205
ZW
10516 constraint (inst.operands[1].reg > 7, BAD_HIREG);
10517 if (!inst.operands[1].immisreg)
10518 {
10519 /* Immediate offset. */
10520 inst.instruction |= inst.operands[0].reg;
10521 inst.instruction |= inst.operands[1].reg << 3;
10522 inst.reloc.type = BFD_RELOC_ARM_THUMB_OFFSET;
10523 return;
10524 }
90e4755a 10525
c19d1205
ZW
10526 /* Register offset. */
10527 constraint (inst.operands[1].imm > 7, BAD_HIREG);
10528 constraint (inst.operands[1].negative,
10529 _("Thumb does not support this addressing mode"));
90e4755a 10530
c19d1205
ZW
10531 op16:
10532 switch (inst.instruction)
10533 {
10534 case T_OPCODE_STR_IW: inst.instruction = T_OPCODE_STR_RW; break;
10535 case T_OPCODE_STR_IH: inst.instruction = T_OPCODE_STR_RH; break;
10536 case T_OPCODE_STR_IB: inst.instruction = T_OPCODE_STR_RB; break;
10537 case T_OPCODE_LDR_IW: inst.instruction = T_OPCODE_LDR_RW; break;
10538 case T_OPCODE_LDR_IH: inst.instruction = T_OPCODE_LDR_RH; break;
10539 case T_OPCODE_LDR_IB: inst.instruction = T_OPCODE_LDR_RB; break;
10540 case 0x5600 /* ldrsb */:
10541 case 0x5e00 /* ldrsh */: break;
10542 default: abort ();
10543 }
90e4755a 10544
c19d1205
ZW
10545 inst.instruction |= inst.operands[0].reg;
10546 inst.instruction |= inst.operands[1].reg << 3;
10547 inst.instruction |= inst.operands[1].imm << 6;
10548}
90e4755a 10549
c19d1205
ZW
10550static void
10551do_t_ldstd (void)
10552{
10553 if (!inst.operands[1].present)
b99bd4ef 10554 {
c19d1205
ZW
10555 inst.operands[1].reg = inst.operands[0].reg + 1;
10556 constraint (inst.operands[0].reg == REG_LR,
10557 _("r14 not allowed here"));
b99bd4ef 10558 }
c19d1205
ZW
10559 inst.instruction |= inst.operands[0].reg << 12;
10560 inst.instruction |= inst.operands[1].reg << 8;
10561 encode_thumb32_addr_mode (2, /*is_t=*/FALSE, /*is_d=*/TRUE);
b99bd4ef
NC
10562}
10563
c19d1205
ZW
10564static void
10565do_t_ldstt (void)
10566{
10567 inst.instruction |= inst.operands[0].reg << 12;
10568 encode_thumb32_addr_mode (1, /*is_t=*/TRUE, /*is_d=*/FALSE);
10569}
a737bd4d 10570
b99bd4ef 10571static void
c19d1205 10572do_t_mla (void)
b99bd4ef 10573{
fdfde340 10574 unsigned Rd, Rn, Rm, Ra;
c921be7d 10575
fdfde340
JM
10576 Rd = inst.operands[0].reg;
10577 Rn = inst.operands[1].reg;
10578 Rm = inst.operands[2].reg;
10579 Ra = inst.operands[3].reg;
10580
10581 reject_bad_reg (Rd);
10582 reject_bad_reg (Rn);
10583 reject_bad_reg (Rm);
10584 reject_bad_reg (Ra);
10585
10586 inst.instruction |= Rd << 8;
10587 inst.instruction |= Rn << 16;
10588 inst.instruction |= Rm;
10589 inst.instruction |= Ra << 12;
c19d1205 10590}
b99bd4ef 10591
c19d1205
ZW
10592static void
10593do_t_mlal (void)
10594{
fdfde340
JM
10595 unsigned RdLo, RdHi, Rn, Rm;
10596
10597 RdLo = inst.operands[0].reg;
10598 RdHi = inst.operands[1].reg;
10599 Rn = inst.operands[2].reg;
10600 Rm = inst.operands[3].reg;
10601
10602 reject_bad_reg (RdLo);
10603 reject_bad_reg (RdHi);
10604 reject_bad_reg (Rn);
10605 reject_bad_reg (Rm);
10606
10607 inst.instruction |= RdLo << 12;
10608 inst.instruction |= RdHi << 8;
10609 inst.instruction |= Rn << 16;
10610 inst.instruction |= Rm;
c19d1205 10611}
b99bd4ef 10612
c19d1205
ZW
10613static void
10614do_t_mov_cmp (void)
10615{
fdfde340
JM
10616 unsigned Rn, Rm;
10617
10618 Rn = inst.operands[0].reg;
10619 Rm = inst.operands[1].reg;
10620
e07e6e58
NC
10621 if (Rn == REG_PC)
10622 set_it_insn_type_last ();
10623
c19d1205 10624 if (unified_syntax)
b99bd4ef 10625 {
c19d1205
ZW
10626 int r0off = (inst.instruction == T_MNEM_mov
10627 || inst.instruction == T_MNEM_movs) ? 8 : 16;
0110f2b8 10628 unsigned long opcode;
3d388997
PB
10629 bfd_boolean narrow;
10630 bfd_boolean low_regs;
10631
fdfde340 10632 low_regs = (Rn <= 7 && Rm <= 7);
0110f2b8 10633 opcode = inst.instruction;
e07e6e58 10634 if (in_it_block ())
0110f2b8 10635 narrow = opcode != T_MNEM_movs;
3d388997 10636 else
0110f2b8 10637 narrow = opcode != T_MNEM_movs || low_regs;
3d388997
PB
10638 if (inst.size_req == 4
10639 || inst.operands[1].shifted)
10640 narrow = FALSE;
10641
efd81785
PB
10642 /* MOVS PC, LR is encoded as SUBS PC, LR, #0. */
10643 if (opcode == T_MNEM_movs && inst.operands[1].isreg
10644 && !inst.operands[1].shifted
fdfde340
JM
10645 && Rn == REG_PC
10646 && Rm == REG_LR)
efd81785
PB
10647 {
10648 inst.instruction = T2_SUBS_PC_LR;
10649 return;
10650 }
10651
fdfde340
JM
10652 if (opcode == T_MNEM_cmp)
10653 {
10654 constraint (Rn == REG_PC, BAD_PC);
94206790
MM
10655 if (narrow)
10656 {
10657 /* In the Thumb-2 ISA, use of R13 as Rm is deprecated,
10658 but valid. */
10659 warn_deprecated_sp (Rm);
10660 /* R15 was documented as a valid choice for Rm in ARMv6,
10661 but as UNPREDICTABLE in ARMv7. ARM's proprietary
10662 tools reject R15, so we do too. */
10663 constraint (Rm == REG_PC, BAD_PC);
10664 }
10665 else
10666 reject_bad_reg (Rm);
fdfde340
JM
10667 }
10668 else if (opcode == T_MNEM_mov
10669 || opcode == T_MNEM_movs)
10670 {
10671 if (inst.operands[1].isreg)
10672 {
10673 if (opcode == T_MNEM_movs)
10674 {
10675 reject_bad_reg (Rn);
10676 reject_bad_reg (Rm);
10677 }
76fa04a4
MGD
10678 else if (narrow)
10679 {
10680 /* This is mov.n. */
10681 if ((Rn == REG_SP || Rn == REG_PC)
10682 && (Rm == REG_SP || Rm == REG_PC))
10683 {
10684 as_warn (_("Use of r%u as a source register is "
10685 "deprecated when r%u is the destination "
10686 "register."), Rm, Rn);
10687 }
10688 }
10689 else
10690 {
10691 /* This is mov.w. */
10692 constraint (Rn == REG_PC, BAD_PC);
10693 constraint (Rm == REG_PC, BAD_PC);
10694 constraint (Rn == REG_SP && Rm == REG_SP, BAD_SP);
10695 }
fdfde340
JM
10696 }
10697 else
10698 reject_bad_reg (Rn);
10699 }
10700
c19d1205
ZW
10701 if (!inst.operands[1].isreg)
10702 {
0110f2b8 10703 /* Immediate operand. */
e07e6e58 10704 if (!in_it_block () && opcode == T_MNEM_mov)
0110f2b8
PB
10705 narrow = 0;
10706 if (low_regs && narrow)
10707 {
10708 inst.instruction = THUMB_OP16 (opcode);
fdfde340 10709 inst.instruction |= Rn << 8;
0110f2b8
PB
10710 if (inst.size_req == 2)
10711 inst.reloc.type = BFD_RELOC_ARM_THUMB_IMM;
10712 else
10713 inst.relax = opcode;
10714 }
10715 else
10716 {
10717 inst.instruction = THUMB_OP32 (inst.instruction);
10718 inst.instruction = (inst.instruction & 0xe1ffffff) | 0x10000000;
fdfde340 10719 inst.instruction |= Rn << r0off;
0110f2b8
PB
10720 inst.reloc.type = BFD_RELOC_ARM_T32_IMMEDIATE;
10721 }
c19d1205 10722 }
728ca7c9
PB
10723 else if (inst.operands[1].shifted && inst.operands[1].immisreg
10724 && (inst.instruction == T_MNEM_mov
10725 || inst.instruction == T_MNEM_movs))
10726 {
10727 /* Register shifts are encoded as separate shift instructions. */
10728 bfd_boolean flags = (inst.instruction == T_MNEM_movs);
10729
e07e6e58 10730 if (in_it_block ())
728ca7c9
PB
10731 narrow = !flags;
10732 else
10733 narrow = flags;
10734
10735 if (inst.size_req == 4)
10736 narrow = FALSE;
10737
10738 if (!low_regs || inst.operands[1].imm > 7)
10739 narrow = FALSE;
10740
fdfde340 10741 if (Rn != Rm)
728ca7c9
PB
10742 narrow = FALSE;
10743
10744 switch (inst.operands[1].shift_kind)
10745 {
10746 case SHIFT_LSL:
10747 opcode = narrow ? T_OPCODE_LSL_R : THUMB_OP32 (T_MNEM_lsl);
10748 break;
10749 case SHIFT_ASR:
10750 opcode = narrow ? T_OPCODE_ASR_R : THUMB_OP32 (T_MNEM_asr);
10751 break;
10752 case SHIFT_LSR:
10753 opcode = narrow ? T_OPCODE_LSR_R : THUMB_OP32 (T_MNEM_lsr);
10754 break;
10755 case SHIFT_ROR:
10756 opcode = narrow ? T_OPCODE_ROR_R : THUMB_OP32 (T_MNEM_ror);
10757 break;
10758 default:
5f4273c7 10759 abort ();
728ca7c9
PB
10760 }
10761
10762 inst.instruction = opcode;
10763 if (narrow)
10764 {
fdfde340 10765 inst.instruction |= Rn;
728ca7c9
PB
10766 inst.instruction |= inst.operands[1].imm << 3;
10767 }
10768 else
10769 {
10770 if (flags)
10771 inst.instruction |= CONDS_BIT;
10772
fdfde340
JM
10773 inst.instruction |= Rn << 8;
10774 inst.instruction |= Rm << 16;
728ca7c9
PB
10775 inst.instruction |= inst.operands[1].imm;
10776 }
10777 }
3d388997 10778 else if (!narrow)
c19d1205 10779 {
728ca7c9
PB
10780 /* Some mov with immediate shift have narrow variants.
10781 Register shifts are handled above. */
10782 if (low_regs && inst.operands[1].shifted
10783 && (inst.instruction == T_MNEM_mov
10784 || inst.instruction == T_MNEM_movs))
10785 {
e07e6e58 10786 if (in_it_block ())
728ca7c9
PB
10787 narrow = (inst.instruction == T_MNEM_mov);
10788 else
10789 narrow = (inst.instruction == T_MNEM_movs);
10790 }
10791
10792 if (narrow)
10793 {
10794 switch (inst.operands[1].shift_kind)
10795 {
10796 case SHIFT_LSL: inst.instruction = T_OPCODE_LSL_I; break;
10797 case SHIFT_LSR: inst.instruction = T_OPCODE_LSR_I; break;
10798 case SHIFT_ASR: inst.instruction = T_OPCODE_ASR_I; break;
10799 default: narrow = FALSE; break;
10800 }
10801 }
10802
10803 if (narrow)
10804 {
fdfde340
JM
10805 inst.instruction |= Rn;
10806 inst.instruction |= Rm << 3;
728ca7c9
PB
10807 inst.reloc.type = BFD_RELOC_ARM_THUMB_SHIFT;
10808 }
10809 else
10810 {
10811 inst.instruction = THUMB_OP32 (inst.instruction);
fdfde340 10812 inst.instruction |= Rn << r0off;
728ca7c9
PB
10813 encode_thumb32_shifted_operand (1);
10814 }
c19d1205
ZW
10815 }
10816 else
10817 switch (inst.instruction)
10818 {
10819 case T_MNEM_mov:
10820 inst.instruction = T_OPCODE_MOV_HR;
fdfde340
JM
10821 inst.instruction |= (Rn & 0x8) << 4;
10822 inst.instruction |= (Rn & 0x7);
10823 inst.instruction |= Rm << 3;
c19d1205 10824 break;
b99bd4ef 10825
c19d1205
ZW
10826 case T_MNEM_movs:
10827 /* We know we have low registers at this point.
941a8a52
MGD
10828 Generate LSLS Rd, Rs, #0. */
10829 inst.instruction = T_OPCODE_LSL_I;
fdfde340
JM
10830 inst.instruction |= Rn;
10831 inst.instruction |= Rm << 3;
c19d1205
ZW
10832 break;
10833
10834 case T_MNEM_cmp:
3d388997 10835 if (low_regs)
c19d1205
ZW
10836 {
10837 inst.instruction = T_OPCODE_CMP_LR;
fdfde340
JM
10838 inst.instruction |= Rn;
10839 inst.instruction |= Rm << 3;
c19d1205
ZW
10840 }
10841 else
10842 {
10843 inst.instruction = T_OPCODE_CMP_HR;
fdfde340
JM
10844 inst.instruction |= (Rn & 0x8) << 4;
10845 inst.instruction |= (Rn & 0x7);
10846 inst.instruction |= Rm << 3;
c19d1205
ZW
10847 }
10848 break;
10849 }
b99bd4ef
NC
10850 return;
10851 }
10852
c19d1205 10853 inst.instruction = THUMB_OP16 (inst.instruction);
539d4391
NC
10854
10855 /* PR 10443: Do not silently ignore shifted operands. */
10856 constraint (inst.operands[1].shifted,
10857 _("shifts in CMP/MOV instructions are only supported in unified syntax"));
10858
c19d1205 10859 if (inst.operands[1].isreg)
b99bd4ef 10860 {
fdfde340 10861 if (Rn < 8 && Rm < 8)
b99bd4ef 10862 {
c19d1205
ZW
10863 /* A move of two lowregs is encoded as ADD Rd, Rs, #0
10864 since a MOV instruction produces unpredictable results. */
10865 if (inst.instruction == T_OPCODE_MOV_I8)
10866 inst.instruction = T_OPCODE_ADD_I3;
b99bd4ef 10867 else
c19d1205 10868 inst.instruction = T_OPCODE_CMP_LR;
b99bd4ef 10869
fdfde340
JM
10870 inst.instruction |= Rn;
10871 inst.instruction |= Rm << 3;
b99bd4ef
NC
10872 }
10873 else
10874 {
c19d1205
ZW
10875 if (inst.instruction == T_OPCODE_MOV_I8)
10876 inst.instruction = T_OPCODE_MOV_HR;
10877 else
10878 inst.instruction = T_OPCODE_CMP_HR;
10879 do_t_cpy ();
b99bd4ef
NC
10880 }
10881 }
c19d1205 10882 else
b99bd4ef 10883 {
fdfde340 10884 constraint (Rn > 7,
c19d1205 10885 _("only lo regs allowed with immediate"));
fdfde340 10886 inst.instruction |= Rn << 8;
c19d1205
ZW
10887 inst.reloc.type = BFD_RELOC_ARM_THUMB_IMM;
10888 }
10889}
b99bd4ef 10890
c19d1205
ZW
10891static void
10892do_t_mov16 (void)
10893{
fdfde340 10894 unsigned Rd;
b6895b4f
PB
10895 bfd_vma imm;
10896 bfd_boolean top;
10897
10898 top = (inst.instruction & 0x00800000) != 0;
10899 if (inst.reloc.type == BFD_RELOC_ARM_MOVW)
10900 {
10901 constraint (top, _(":lower16: not allowed this instruction"));
10902 inst.reloc.type = BFD_RELOC_ARM_THUMB_MOVW;
10903 }
10904 else if (inst.reloc.type == BFD_RELOC_ARM_MOVT)
10905 {
10906 constraint (!top, _(":upper16: not allowed this instruction"));
10907 inst.reloc.type = BFD_RELOC_ARM_THUMB_MOVT;
10908 }
10909
fdfde340
JM
10910 Rd = inst.operands[0].reg;
10911 reject_bad_reg (Rd);
10912
10913 inst.instruction |= Rd << 8;
b6895b4f
PB
10914 if (inst.reloc.type == BFD_RELOC_UNUSED)
10915 {
10916 imm = inst.reloc.exp.X_add_number;
10917 inst.instruction |= (imm & 0xf000) << 4;
10918 inst.instruction |= (imm & 0x0800) << 15;
10919 inst.instruction |= (imm & 0x0700) << 4;
10920 inst.instruction |= (imm & 0x00ff);
10921 }
c19d1205 10922}
b99bd4ef 10923
c19d1205
ZW
10924static void
10925do_t_mvn_tst (void)
10926{
fdfde340 10927 unsigned Rn, Rm;
c921be7d 10928
fdfde340
JM
10929 Rn = inst.operands[0].reg;
10930 Rm = inst.operands[1].reg;
10931
10932 if (inst.instruction == T_MNEM_cmp
10933 || inst.instruction == T_MNEM_cmn)
10934 constraint (Rn == REG_PC, BAD_PC);
10935 else
10936 reject_bad_reg (Rn);
10937 reject_bad_reg (Rm);
10938
c19d1205
ZW
10939 if (unified_syntax)
10940 {
10941 int r0off = (inst.instruction == T_MNEM_mvn
10942 || inst.instruction == T_MNEM_mvns) ? 8 : 16;
3d388997
PB
10943 bfd_boolean narrow;
10944
10945 if (inst.size_req == 4
10946 || inst.instruction > 0xffff
10947 || inst.operands[1].shifted
fdfde340 10948 || Rn > 7 || Rm > 7)
3d388997
PB
10949 narrow = FALSE;
10950 else if (inst.instruction == T_MNEM_cmn)
10951 narrow = TRUE;
10952 else if (THUMB_SETS_FLAGS (inst.instruction))
e07e6e58 10953 narrow = !in_it_block ();
3d388997 10954 else
e07e6e58 10955 narrow = in_it_block ();
3d388997 10956
c19d1205 10957 if (!inst.operands[1].isreg)
b99bd4ef 10958 {
c19d1205
ZW
10959 /* For an immediate, we always generate a 32-bit opcode;
10960 section relaxation will shrink it later if possible. */
10961 if (inst.instruction < 0xffff)
10962 inst.instruction = THUMB_OP32 (inst.instruction);
10963 inst.instruction = (inst.instruction & 0xe1ffffff) | 0x10000000;
fdfde340 10964 inst.instruction |= Rn << r0off;
c19d1205 10965 inst.reloc.type = BFD_RELOC_ARM_T32_IMMEDIATE;
b99bd4ef 10966 }
c19d1205 10967 else
b99bd4ef 10968 {
c19d1205 10969 /* See if we can do this with a 16-bit instruction. */
3d388997 10970 if (narrow)
b99bd4ef 10971 {
c19d1205 10972 inst.instruction = THUMB_OP16 (inst.instruction);
fdfde340
JM
10973 inst.instruction |= Rn;
10974 inst.instruction |= Rm << 3;
b99bd4ef 10975 }
c19d1205 10976 else
b99bd4ef 10977 {
c19d1205
ZW
10978 constraint (inst.operands[1].shifted
10979 && inst.operands[1].immisreg,
10980 _("shift must be constant"));
10981 if (inst.instruction < 0xffff)
10982 inst.instruction = THUMB_OP32 (inst.instruction);
fdfde340 10983 inst.instruction |= Rn << r0off;
c19d1205 10984 encode_thumb32_shifted_operand (1);
b99bd4ef 10985 }
b99bd4ef
NC
10986 }
10987 }
10988 else
10989 {
c19d1205
ZW
10990 constraint (inst.instruction > 0xffff
10991 || inst.instruction == T_MNEM_mvns, BAD_THUMB32);
10992 constraint (!inst.operands[1].isreg || inst.operands[1].shifted,
10993 _("unshifted register required"));
fdfde340 10994 constraint (Rn > 7 || Rm > 7,
c19d1205 10995 BAD_HIREG);
b99bd4ef 10996
c19d1205 10997 inst.instruction = THUMB_OP16 (inst.instruction);
fdfde340
JM
10998 inst.instruction |= Rn;
10999 inst.instruction |= Rm << 3;
b99bd4ef 11000 }
b99bd4ef
NC
11001}
11002
b05fe5cf 11003static void
c19d1205 11004do_t_mrs (void)
b05fe5cf 11005{
fdfde340 11006 unsigned Rd;
037e8744
JB
11007
11008 if (do_vfp_nsyn_mrs () == SUCCESS)
11009 return;
11010
90ec0d68
MGD
11011 Rd = inst.operands[0].reg;
11012 reject_bad_reg (Rd);
11013 inst.instruction |= Rd << 8;
11014
11015 if (inst.operands[1].isreg)
62b3e311 11016 {
90ec0d68
MGD
11017 unsigned br = inst.operands[1].reg;
11018 if (((br & 0x200) == 0) && ((br & 0xf000) != 0xf000))
11019 as_bad (_("bad register for mrs"));
11020
11021 inst.instruction |= br & (0xf << 16);
11022 inst.instruction |= (br & 0x300) >> 4;
11023 inst.instruction |= (br & SPSR_BIT) >> 2;
62b3e311
PB
11024 }
11025 else
11026 {
90ec0d68 11027 int flags = inst.operands[1].imm & (PSR_c|PSR_x|PSR_s|PSR_f|SPSR_BIT);
5f4273c7 11028
d2cd1205
JB
11029 if (ARM_CPU_HAS_FEATURE (selected_cpu, arm_ext_m))
11030 constraint (flags != 0, _("selected processor does not support "
11031 "requested special purpose register"));
90ec0d68 11032 else
d2cd1205
JB
11033 /* mrs only accepts APSR/CPSR/SPSR/CPSR_all/SPSR_all (for non-M profile
11034 devices). */
11035 constraint ((flags & ~SPSR_BIT) != (PSR_c|PSR_f),
11036 _("'APSR', 'CPSR' or 'SPSR' expected"));
fdfde340 11037
90ec0d68
MGD
11038 inst.instruction |= (flags & SPSR_BIT) >> 2;
11039 inst.instruction |= inst.operands[1].imm & 0xff;
11040 inst.instruction |= 0xf0000;
11041 }
c19d1205 11042}
b05fe5cf 11043
c19d1205
ZW
11044static void
11045do_t_msr (void)
11046{
62b3e311 11047 int flags;
fdfde340 11048 unsigned Rn;
62b3e311 11049
037e8744
JB
11050 if (do_vfp_nsyn_msr () == SUCCESS)
11051 return;
11052
c19d1205
ZW
11053 constraint (!inst.operands[1].isreg,
11054 _("Thumb encoding does not support an immediate here"));
90ec0d68
MGD
11055
11056 if (inst.operands[0].isreg)
11057 flags = (int)(inst.operands[0].reg);
11058 else
11059 flags = inst.operands[0].imm;
11060
d2cd1205 11061 if (ARM_CPU_HAS_FEATURE (selected_cpu, arm_ext_m))
62b3e311 11062 {
d2cd1205
JB
11063 int bits = inst.operands[0].imm & (PSR_c|PSR_x|PSR_s|PSR_f|SPSR_BIT);
11064
11065 constraint ((ARM_CPU_HAS_FEATURE (selected_cpu, arm_ext_v6_dsp)
11066 && (bits & ~(PSR_s | PSR_f)) != 0)
11067 || (!ARM_CPU_HAS_FEATURE (selected_cpu, arm_ext_v6_dsp)
11068 && bits != PSR_f),
11069 _("selected processor does not support requested special "
11070 "purpose register"));
62b3e311
PB
11071 }
11072 else
d2cd1205
JB
11073 constraint ((flags & 0xff) != 0, _("selected processor does not support "
11074 "requested special purpose register"));
c921be7d 11075
fdfde340
JM
11076 Rn = inst.operands[1].reg;
11077 reject_bad_reg (Rn);
11078
62b3e311 11079 inst.instruction |= (flags & SPSR_BIT) >> 2;
90ec0d68
MGD
11080 inst.instruction |= (flags & 0xf0000) >> 8;
11081 inst.instruction |= (flags & 0x300) >> 4;
62b3e311 11082 inst.instruction |= (flags & 0xff);
fdfde340 11083 inst.instruction |= Rn << 16;
c19d1205 11084}
b05fe5cf 11085
c19d1205
ZW
11086static void
11087do_t_mul (void)
11088{
17828f45 11089 bfd_boolean narrow;
fdfde340 11090 unsigned Rd, Rn, Rm;
17828f45 11091
c19d1205
ZW
11092 if (!inst.operands[2].present)
11093 inst.operands[2].reg = inst.operands[0].reg;
b05fe5cf 11094
fdfde340
JM
11095 Rd = inst.operands[0].reg;
11096 Rn = inst.operands[1].reg;
11097 Rm = inst.operands[2].reg;
11098
17828f45 11099 if (unified_syntax)
b05fe5cf 11100 {
17828f45 11101 if (inst.size_req == 4
fdfde340
JM
11102 || (Rd != Rn
11103 && Rd != Rm)
11104 || Rn > 7
11105 || Rm > 7)
17828f45
JM
11106 narrow = FALSE;
11107 else if (inst.instruction == T_MNEM_muls)
e07e6e58 11108 narrow = !in_it_block ();
17828f45 11109 else
e07e6e58 11110 narrow = in_it_block ();
b05fe5cf 11111 }
c19d1205 11112 else
b05fe5cf 11113 {
17828f45 11114 constraint (inst.instruction == T_MNEM_muls, BAD_THUMB32);
fdfde340 11115 constraint (Rn > 7 || Rm > 7,
c19d1205 11116 BAD_HIREG);
17828f45
JM
11117 narrow = TRUE;
11118 }
b05fe5cf 11119
17828f45
JM
11120 if (narrow)
11121 {
11122 /* 16-bit MULS/Conditional MUL. */
c19d1205 11123 inst.instruction = THUMB_OP16 (inst.instruction);
fdfde340 11124 inst.instruction |= Rd;
b05fe5cf 11125
fdfde340
JM
11126 if (Rd == Rn)
11127 inst.instruction |= Rm << 3;
11128 else if (Rd == Rm)
11129 inst.instruction |= Rn << 3;
c19d1205
ZW
11130 else
11131 constraint (1, _("dest must overlap one source register"));
11132 }
17828f45
JM
11133 else
11134 {
e07e6e58
NC
11135 constraint (inst.instruction != T_MNEM_mul,
11136 _("Thumb-2 MUL must not set flags"));
17828f45
JM
11137 /* 32-bit MUL. */
11138 inst.instruction = THUMB_OP32 (inst.instruction);
fdfde340
JM
11139 inst.instruction |= Rd << 8;
11140 inst.instruction |= Rn << 16;
11141 inst.instruction |= Rm << 0;
11142
11143 reject_bad_reg (Rd);
11144 reject_bad_reg (Rn);
11145 reject_bad_reg (Rm);
17828f45 11146 }
c19d1205 11147}
b05fe5cf 11148
c19d1205
ZW
11149static void
11150do_t_mull (void)
11151{
fdfde340 11152 unsigned RdLo, RdHi, Rn, Rm;
b05fe5cf 11153
fdfde340
JM
11154 RdLo = inst.operands[0].reg;
11155 RdHi = inst.operands[1].reg;
11156 Rn = inst.operands[2].reg;
11157 Rm = inst.operands[3].reg;
11158
11159 reject_bad_reg (RdLo);
11160 reject_bad_reg (RdHi);
11161 reject_bad_reg (Rn);
11162 reject_bad_reg (Rm);
11163
11164 inst.instruction |= RdLo << 12;
11165 inst.instruction |= RdHi << 8;
11166 inst.instruction |= Rn << 16;
11167 inst.instruction |= Rm;
11168
11169 if (RdLo == RdHi)
c19d1205
ZW
11170 as_tsktsk (_("rdhi and rdlo must be different"));
11171}
b05fe5cf 11172
c19d1205
ZW
11173static void
11174do_t_nop (void)
11175{
e07e6e58
NC
11176 set_it_insn_type (NEUTRAL_IT_INSN);
11177
c19d1205
ZW
11178 if (unified_syntax)
11179 {
11180 if (inst.size_req == 4 || inst.operands[0].imm > 15)
b05fe5cf 11181 {
c19d1205
ZW
11182 inst.instruction = THUMB_OP32 (inst.instruction);
11183 inst.instruction |= inst.operands[0].imm;
11184 }
11185 else
11186 {
bc2d1808
NC
11187 /* PR9722: Check for Thumb2 availability before
11188 generating a thumb2 nop instruction. */
afa62d5e 11189 if (ARM_CPU_HAS_FEATURE (selected_cpu, arm_ext_v6t2))
bc2d1808
NC
11190 {
11191 inst.instruction = THUMB_OP16 (inst.instruction);
11192 inst.instruction |= inst.operands[0].imm << 4;
11193 }
11194 else
11195 inst.instruction = 0x46c0;
c19d1205
ZW
11196 }
11197 }
11198 else
11199 {
11200 constraint (inst.operands[0].present,
11201 _("Thumb does not support NOP with hints"));
11202 inst.instruction = 0x46c0;
11203 }
11204}
b05fe5cf 11205
c19d1205
ZW
11206static void
11207do_t_neg (void)
11208{
11209 if (unified_syntax)
11210 {
3d388997
PB
11211 bfd_boolean narrow;
11212
11213 if (THUMB_SETS_FLAGS (inst.instruction))
e07e6e58 11214 narrow = !in_it_block ();
3d388997 11215 else
e07e6e58 11216 narrow = in_it_block ();
3d388997
PB
11217 if (inst.operands[0].reg > 7 || inst.operands[1].reg > 7)
11218 narrow = FALSE;
11219 if (inst.size_req == 4)
11220 narrow = FALSE;
11221
11222 if (!narrow)
c19d1205
ZW
11223 {
11224 inst.instruction = THUMB_OP32 (inst.instruction);
11225 inst.instruction |= inst.operands[0].reg << 8;
11226 inst.instruction |= inst.operands[1].reg << 16;
b05fe5cf
ZW
11227 }
11228 else
11229 {
c19d1205
ZW
11230 inst.instruction = THUMB_OP16 (inst.instruction);
11231 inst.instruction |= inst.operands[0].reg;
11232 inst.instruction |= inst.operands[1].reg << 3;
b05fe5cf
ZW
11233 }
11234 }
11235 else
11236 {
c19d1205
ZW
11237 constraint (inst.operands[0].reg > 7 || inst.operands[1].reg > 7,
11238 BAD_HIREG);
11239 constraint (THUMB_SETS_FLAGS (inst.instruction), BAD_THUMB32);
11240
11241 inst.instruction = THUMB_OP16 (inst.instruction);
11242 inst.instruction |= inst.operands[0].reg;
11243 inst.instruction |= inst.operands[1].reg << 3;
11244 }
11245}
11246
1c444d06
JM
11247static void
11248do_t_orn (void)
11249{
11250 unsigned Rd, Rn;
11251
11252 Rd = inst.operands[0].reg;
11253 Rn = inst.operands[1].present ? inst.operands[1].reg : Rd;
11254
fdfde340
JM
11255 reject_bad_reg (Rd);
11256 /* Rn == REG_SP is unpredictable; Rn == REG_PC is MVN. */
11257 reject_bad_reg (Rn);
11258
1c444d06
JM
11259 inst.instruction |= Rd << 8;
11260 inst.instruction |= Rn << 16;
11261
11262 if (!inst.operands[2].isreg)
11263 {
11264 inst.instruction = (inst.instruction & 0xe1ffffff) | 0x10000000;
11265 inst.reloc.type = BFD_RELOC_ARM_T32_IMMEDIATE;
11266 }
11267 else
11268 {
11269 unsigned Rm;
11270
11271 Rm = inst.operands[2].reg;
fdfde340 11272 reject_bad_reg (Rm);
1c444d06
JM
11273
11274 constraint (inst.operands[2].shifted
11275 && inst.operands[2].immisreg,
11276 _("shift must be constant"));
11277 encode_thumb32_shifted_operand (2);
11278 }
11279}
11280
c19d1205
ZW
11281static void
11282do_t_pkhbt (void)
11283{
fdfde340
JM
11284 unsigned Rd, Rn, Rm;
11285
11286 Rd = inst.operands[0].reg;
11287 Rn = inst.operands[1].reg;
11288 Rm = inst.operands[2].reg;
11289
11290 reject_bad_reg (Rd);
11291 reject_bad_reg (Rn);
11292 reject_bad_reg (Rm);
11293
11294 inst.instruction |= Rd << 8;
11295 inst.instruction |= Rn << 16;
11296 inst.instruction |= Rm;
c19d1205
ZW
11297 if (inst.operands[3].present)
11298 {
11299 unsigned int val = inst.reloc.exp.X_add_number;
11300 constraint (inst.reloc.exp.X_op != O_constant,
11301 _("expression too complex"));
11302 inst.instruction |= (val & 0x1c) << 10;
11303 inst.instruction |= (val & 0x03) << 6;
b05fe5cf 11304 }
c19d1205 11305}
b05fe5cf 11306
c19d1205
ZW
11307static void
11308do_t_pkhtb (void)
11309{
11310 if (!inst.operands[3].present)
1ef52f49
NC
11311 {
11312 unsigned Rtmp;
11313
11314 inst.instruction &= ~0x00000020;
11315
11316 /* PR 10168. Swap the Rm and Rn registers. */
11317 Rtmp = inst.operands[1].reg;
11318 inst.operands[1].reg = inst.operands[2].reg;
11319 inst.operands[2].reg = Rtmp;
11320 }
c19d1205 11321 do_t_pkhbt ();
b05fe5cf
ZW
11322}
11323
c19d1205
ZW
11324static void
11325do_t_pld (void)
11326{
fdfde340
JM
11327 if (inst.operands[0].immisreg)
11328 reject_bad_reg (inst.operands[0].imm);
11329
c19d1205
ZW
11330 encode_thumb32_addr_mode (0, /*is_t=*/FALSE, /*is_d=*/FALSE);
11331}
b05fe5cf 11332
c19d1205
ZW
11333static void
11334do_t_push_pop (void)
b99bd4ef 11335{
e9f89963 11336 unsigned mask;
5f4273c7 11337
c19d1205
ZW
11338 constraint (inst.operands[0].writeback,
11339 _("push/pop do not support {reglist}^"));
11340 constraint (inst.reloc.type != BFD_RELOC_UNUSED,
11341 _("expression too complex"));
b99bd4ef 11342
e9f89963
PB
11343 mask = inst.operands[0].imm;
11344 if ((mask & ~0xff) == 0)
3c707909 11345 inst.instruction = THUMB_OP16 (inst.instruction) | mask;
c19d1205 11346 else if ((inst.instruction == T_MNEM_push
e9f89963 11347 && (mask & ~0xff) == 1 << REG_LR)
c19d1205 11348 || (inst.instruction == T_MNEM_pop
e9f89963 11349 && (mask & ~0xff) == 1 << REG_PC))
b99bd4ef 11350 {
c19d1205
ZW
11351 inst.instruction = THUMB_OP16 (inst.instruction);
11352 inst.instruction |= THUMB_PP_PC_LR;
3c707909 11353 inst.instruction |= mask & 0xff;
c19d1205
ZW
11354 }
11355 else if (unified_syntax)
11356 {
3c707909 11357 inst.instruction = THUMB_OP32 (inst.instruction);
5f4273c7 11358 encode_thumb2_ldmstm (13, mask, TRUE);
c19d1205
ZW
11359 }
11360 else
11361 {
11362 inst.error = _("invalid register list to push/pop instruction");
11363 return;
11364 }
c19d1205 11365}
b99bd4ef 11366
c19d1205
ZW
11367static void
11368do_t_rbit (void)
11369{
fdfde340
JM
11370 unsigned Rd, Rm;
11371
11372 Rd = inst.operands[0].reg;
11373 Rm = inst.operands[1].reg;
11374
11375 reject_bad_reg (Rd);
11376 reject_bad_reg (Rm);
11377
11378 inst.instruction |= Rd << 8;
11379 inst.instruction |= Rm << 16;
11380 inst.instruction |= Rm;
c19d1205 11381}
b99bd4ef 11382
c19d1205
ZW
11383static void
11384do_t_rev (void)
11385{
fdfde340
JM
11386 unsigned Rd, Rm;
11387
11388 Rd = inst.operands[0].reg;
11389 Rm = inst.operands[1].reg;
11390
11391 reject_bad_reg (Rd);
11392 reject_bad_reg (Rm);
11393
11394 if (Rd <= 7 && Rm <= 7
c19d1205
ZW
11395 && inst.size_req != 4)
11396 {
11397 inst.instruction = THUMB_OP16 (inst.instruction);
fdfde340
JM
11398 inst.instruction |= Rd;
11399 inst.instruction |= Rm << 3;
c19d1205
ZW
11400 }
11401 else if (unified_syntax)
11402 {
11403 inst.instruction = THUMB_OP32 (inst.instruction);
fdfde340
JM
11404 inst.instruction |= Rd << 8;
11405 inst.instruction |= Rm << 16;
11406 inst.instruction |= Rm;
c19d1205
ZW
11407 }
11408 else
11409 inst.error = BAD_HIREG;
11410}
b99bd4ef 11411
1c444d06
JM
11412static void
11413do_t_rrx (void)
11414{
11415 unsigned Rd, Rm;
11416
11417 Rd = inst.operands[0].reg;
11418 Rm = inst.operands[1].reg;
11419
fdfde340
JM
11420 reject_bad_reg (Rd);
11421 reject_bad_reg (Rm);
c921be7d 11422
1c444d06
JM
11423 inst.instruction |= Rd << 8;
11424 inst.instruction |= Rm;
11425}
11426
c19d1205
ZW
11427static void
11428do_t_rsb (void)
11429{
fdfde340 11430 unsigned Rd, Rs;
b99bd4ef 11431
c19d1205
ZW
11432 Rd = inst.operands[0].reg;
11433 Rs = (inst.operands[1].present
11434 ? inst.operands[1].reg /* Rd, Rs, foo */
11435 : inst.operands[0].reg); /* Rd, foo -> Rd, Rd, foo */
b99bd4ef 11436
fdfde340
JM
11437 reject_bad_reg (Rd);
11438 reject_bad_reg (Rs);
11439 if (inst.operands[2].isreg)
11440 reject_bad_reg (inst.operands[2].reg);
11441
c19d1205
ZW
11442 inst.instruction |= Rd << 8;
11443 inst.instruction |= Rs << 16;
11444 if (!inst.operands[2].isreg)
11445 {
026d3abb
PB
11446 bfd_boolean narrow;
11447
11448 if ((inst.instruction & 0x00100000) != 0)
e07e6e58 11449 narrow = !in_it_block ();
026d3abb 11450 else
e07e6e58 11451 narrow = in_it_block ();
026d3abb
PB
11452
11453 if (Rd > 7 || Rs > 7)
11454 narrow = FALSE;
11455
11456 if (inst.size_req == 4 || !unified_syntax)
11457 narrow = FALSE;
11458
11459 if (inst.reloc.exp.X_op != O_constant
11460 || inst.reloc.exp.X_add_number != 0)
11461 narrow = FALSE;
11462
11463 /* Turn rsb #0 into 16-bit neg. We should probably do this via
11464 relaxation, but it doesn't seem worth the hassle. */
11465 if (narrow)
11466 {
11467 inst.reloc.type = BFD_RELOC_UNUSED;
11468 inst.instruction = THUMB_OP16 (T_MNEM_negs);
11469 inst.instruction |= Rs << 3;
11470 inst.instruction |= Rd;
11471 }
11472 else
11473 {
11474 inst.instruction = (inst.instruction & 0xe1ffffff) | 0x10000000;
11475 inst.reloc.type = BFD_RELOC_ARM_T32_IMMEDIATE;
11476 }
c19d1205
ZW
11477 }
11478 else
11479 encode_thumb32_shifted_operand (2);
11480}
b99bd4ef 11481
c19d1205
ZW
11482static void
11483do_t_setend (void)
11484{
e07e6e58 11485 set_it_insn_type (OUTSIDE_IT_INSN);
c19d1205
ZW
11486 if (inst.operands[0].imm)
11487 inst.instruction |= 0x8;
11488}
b99bd4ef 11489
c19d1205
ZW
11490static void
11491do_t_shift (void)
11492{
11493 if (!inst.operands[1].present)
11494 inst.operands[1].reg = inst.operands[0].reg;
11495
11496 if (unified_syntax)
11497 {
3d388997
PB
11498 bfd_boolean narrow;
11499 int shift_kind;
11500
11501 switch (inst.instruction)
11502 {
11503 case T_MNEM_asr:
11504 case T_MNEM_asrs: shift_kind = SHIFT_ASR; break;
11505 case T_MNEM_lsl:
11506 case T_MNEM_lsls: shift_kind = SHIFT_LSL; break;
11507 case T_MNEM_lsr:
11508 case T_MNEM_lsrs: shift_kind = SHIFT_LSR; break;
11509 case T_MNEM_ror:
11510 case T_MNEM_rors: shift_kind = SHIFT_ROR; break;
11511 default: abort ();
11512 }
11513
11514 if (THUMB_SETS_FLAGS (inst.instruction))
e07e6e58 11515 narrow = !in_it_block ();
3d388997 11516 else
e07e6e58 11517 narrow = in_it_block ();
3d388997
PB
11518 if (inst.operands[0].reg > 7 || inst.operands[1].reg > 7)
11519 narrow = FALSE;
11520 if (!inst.operands[2].isreg && shift_kind == SHIFT_ROR)
11521 narrow = FALSE;
11522 if (inst.operands[2].isreg
11523 && (inst.operands[1].reg != inst.operands[0].reg
11524 || inst.operands[2].reg > 7))
11525 narrow = FALSE;
11526 if (inst.size_req == 4)
11527 narrow = FALSE;
11528
fdfde340
JM
11529 reject_bad_reg (inst.operands[0].reg);
11530 reject_bad_reg (inst.operands[1].reg);
c921be7d 11531
3d388997 11532 if (!narrow)
c19d1205
ZW
11533 {
11534 if (inst.operands[2].isreg)
b99bd4ef 11535 {
fdfde340 11536 reject_bad_reg (inst.operands[2].reg);
c19d1205
ZW
11537 inst.instruction = THUMB_OP32 (inst.instruction);
11538 inst.instruction |= inst.operands[0].reg << 8;
11539 inst.instruction |= inst.operands[1].reg << 16;
11540 inst.instruction |= inst.operands[2].reg;
94342ec3
NC
11541
11542 /* PR 12854: Error on extraneous shifts. */
11543 constraint (inst.operands[2].shifted,
11544 _("extraneous shift as part of operand to shift insn"));
c19d1205
ZW
11545 }
11546 else
11547 {
11548 inst.operands[1].shifted = 1;
3d388997 11549 inst.operands[1].shift_kind = shift_kind;
c19d1205
ZW
11550 inst.instruction = THUMB_OP32 (THUMB_SETS_FLAGS (inst.instruction)
11551 ? T_MNEM_movs : T_MNEM_mov);
11552 inst.instruction |= inst.operands[0].reg << 8;
11553 encode_thumb32_shifted_operand (1);
11554 /* Prevent the incorrect generation of an ARM_IMMEDIATE fixup. */
11555 inst.reloc.type = BFD_RELOC_UNUSED;
b99bd4ef
NC
11556 }
11557 }
11558 else
11559 {
c19d1205 11560 if (inst.operands[2].isreg)
b99bd4ef 11561 {
3d388997 11562 switch (shift_kind)
b99bd4ef 11563 {
3d388997
PB
11564 case SHIFT_ASR: inst.instruction = T_OPCODE_ASR_R; break;
11565 case SHIFT_LSL: inst.instruction = T_OPCODE_LSL_R; break;
11566 case SHIFT_LSR: inst.instruction = T_OPCODE_LSR_R; break;
11567 case SHIFT_ROR: inst.instruction = T_OPCODE_ROR_R; break;
c19d1205 11568 default: abort ();
b99bd4ef 11569 }
5f4273c7 11570
c19d1205
ZW
11571 inst.instruction |= inst.operands[0].reg;
11572 inst.instruction |= inst.operands[2].reg << 3;
b99bd4ef
NC
11573 }
11574 else
11575 {
3d388997 11576 switch (shift_kind)
b99bd4ef 11577 {
3d388997
PB
11578 case SHIFT_ASR: inst.instruction = T_OPCODE_ASR_I; break;
11579 case SHIFT_LSL: inst.instruction = T_OPCODE_LSL_I; break;
11580 case SHIFT_LSR: inst.instruction = T_OPCODE_LSR_I; break;
c19d1205 11581 default: abort ();
b99bd4ef 11582 }
c19d1205
ZW
11583 inst.reloc.type = BFD_RELOC_ARM_THUMB_SHIFT;
11584 inst.instruction |= inst.operands[0].reg;
11585 inst.instruction |= inst.operands[1].reg << 3;
b99bd4ef
NC
11586 }
11587 }
c19d1205
ZW
11588 }
11589 else
11590 {
11591 constraint (inst.operands[0].reg > 7
11592 || inst.operands[1].reg > 7, BAD_HIREG);
11593 constraint (THUMB_SETS_FLAGS (inst.instruction), BAD_THUMB32);
b99bd4ef 11594
c19d1205
ZW
11595 if (inst.operands[2].isreg) /* Rd, {Rs,} Rn */
11596 {
11597 constraint (inst.operands[2].reg > 7, BAD_HIREG);
11598 constraint (inst.operands[0].reg != inst.operands[1].reg,
11599 _("source1 and dest must be same register"));
b99bd4ef 11600
c19d1205
ZW
11601 switch (inst.instruction)
11602 {
11603 case T_MNEM_asr: inst.instruction = T_OPCODE_ASR_R; break;
11604 case T_MNEM_lsl: inst.instruction = T_OPCODE_LSL_R; break;
11605 case T_MNEM_lsr: inst.instruction = T_OPCODE_LSR_R; break;
11606 case T_MNEM_ror: inst.instruction = T_OPCODE_ROR_R; break;
11607 default: abort ();
11608 }
5f4273c7 11609
c19d1205
ZW
11610 inst.instruction |= inst.operands[0].reg;
11611 inst.instruction |= inst.operands[2].reg << 3;
11612 }
11613 else
b99bd4ef 11614 {
c19d1205
ZW
11615 switch (inst.instruction)
11616 {
11617 case T_MNEM_asr: inst.instruction = T_OPCODE_ASR_I; break;
11618 case T_MNEM_lsl: inst.instruction = T_OPCODE_LSL_I; break;
11619 case T_MNEM_lsr: inst.instruction = T_OPCODE_LSR_I; break;
11620 case T_MNEM_ror: inst.error = _("ror #imm not supported"); return;
11621 default: abort ();
11622 }
11623 inst.reloc.type = BFD_RELOC_ARM_THUMB_SHIFT;
11624 inst.instruction |= inst.operands[0].reg;
11625 inst.instruction |= inst.operands[1].reg << 3;
b99bd4ef
NC
11626 }
11627 }
b99bd4ef
NC
11628}
11629
11630static void
c19d1205 11631do_t_simd (void)
b99bd4ef 11632{
fdfde340
JM
11633 unsigned Rd, Rn, Rm;
11634
11635 Rd = inst.operands[0].reg;
11636 Rn = inst.operands[1].reg;
11637 Rm = inst.operands[2].reg;
11638
11639 reject_bad_reg (Rd);
11640 reject_bad_reg (Rn);
11641 reject_bad_reg (Rm);
11642
11643 inst.instruction |= Rd << 8;
11644 inst.instruction |= Rn << 16;
11645 inst.instruction |= Rm;
c19d1205 11646}
b99bd4ef 11647
03ee1b7f
NC
11648static void
11649do_t_simd2 (void)
11650{
11651 unsigned Rd, Rn, Rm;
11652
11653 Rd = inst.operands[0].reg;
11654 Rm = inst.operands[1].reg;
11655 Rn = inst.operands[2].reg;
11656
11657 reject_bad_reg (Rd);
11658 reject_bad_reg (Rn);
11659 reject_bad_reg (Rm);
11660
11661 inst.instruction |= Rd << 8;
11662 inst.instruction |= Rn << 16;
11663 inst.instruction |= Rm;
11664}
11665
c19d1205 11666static void
3eb17e6b 11667do_t_smc (void)
c19d1205
ZW
11668{
11669 unsigned int value = inst.reloc.exp.X_add_number;
f4c65163
MGD
11670 constraint (!ARM_CPU_HAS_FEATURE (cpu_variant, arm_ext_v7a),
11671 _("SMC is not permitted on this architecture"));
c19d1205
ZW
11672 constraint (inst.reloc.exp.X_op != O_constant,
11673 _("expression too complex"));
11674 inst.reloc.type = BFD_RELOC_UNUSED;
11675 inst.instruction |= (value & 0xf000) >> 12;
11676 inst.instruction |= (value & 0x0ff0);
11677 inst.instruction |= (value & 0x000f) << 16;
11678}
b99bd4ef 11679
90ec0d68
MGD
11680static void
11681do_t_hvc (void)
11682{
11683 unsigned int value = inst.reloc.exp.X_add_number;
11684
11685 inst.reloc.type = BFD_RELOC_UNUSED;
11686 inst.instruction |= (value & 0x0fff);
11687 inst.instruction |= (value & 0xf000) << 4;
11688}
11689
c19d1205 11690static void
3a21c15a 11691do_t_ssat_usat (int bias)
c19d1205 11692{
fdfde340
JM
11693 unsigned Rd, Rn;
11694
11695 Rd = inst.operands[0].reg;
11696 Rn = inst.operands[2].reg;
11697
11698 reject_bad_reg (Rd);
11699 reject_bad_reg (Rn);
11700
11701 inst.instruction |= Rd << 8;
3a21c15a 11702 inst.instruction |= inst.operands[1].imm - bias;
fdfde340 11703 inst.instruction |= Rn << 16;
b99bd4ef 11704
c19d1205 11705 if (inst.operands[3].present)
b99bd4ef 11706 {
3a21c15a
NC
11707 offsetT shift_amount = inst.reloc.exp.X_add_number;
11708
11709 inst.reloc.type = BFD_RELOC_UNUSED;
11710
c19d1205
ZW
11711 constraint (inst.reloc.exp.X_op != O_constant,
11712 _("expression too complex"));
b99bd4ef 11713
3a21c15a 11714 if (shift_amount != 0)
6189168b 11715 {
3a21c15a
NC
11716 constraint (shift_amount > 31,
11717 _("shift expression is too large"));
11718
c19d1205 11719 if (inst.operands[3].shift_kind == SHIFT_ASR)
3a21c15a
NC
11720 inst.instruction |= 0x00200000; /* sh bit. */
11721
11722 inst.instruction |= (shift_amount & 0x1c) << 10;
11723 inst.instruction |= (shift_amount & 0x03) << 6;
6189168b
NC
11724 }
11725 }
b99bd4ef 11726}
c921be7d 11727
3a21c15a
NC
11728static void
11729do_t_ssat (void)
11730{
11731 do_t_ssat_usat (1);
11732}
b99bd4ef 11733
0dd132b6 11734static void
c19d1205 11735do_t_ssat16 (void)
0dd132b6 11736{
fdfde340
JM
11737 unsigned Rd, Rn;
11738
11739 Rd = inst.operands[0].reg;
11740 Rn = inst.operands[2].reg;
11741
11742 reject_bad_reg (Rd);
11743 reject_bad_reg (Rn);
11744
11745 inst.instruction |= Rd << 8;
c19d1205 11746 inst.instruction |= inst.operands[1].imm - 1;
fdfde340 11747 inst.instruction |= Rn << 16;
c19d1205 11748}
0dd132b6 11749
c19d1205
ZW
11750static void
11751do_t_strex (void)
11752{
11753 constraint (!inst.operands[2].isreg || !inst.operands[2].preind
11754 || inst.operands[2].postind || inst.operands[2].writeback
11755 || inst.operands[2].immisreg || inst.operands[2].shifted
11756 || inst.operands[2].negative,
01cfc07f 11757 BAD_ADDR_MODE);
0dd132b6 11758
5be8be5d
DG
11759 constraint (inst.operands[2].reg == REG_PC, BAD_PC);
11760
c19d1205
ZW
11761 inst.instruction |= inst.operands[0].reg << 8;
11762 inst.instruction |= inst.operands[1].reg << 12;
11763 inst.instruction |= inst.operands[2].reg << 16;
11764 inst.reloc.type = BFD_RELOC_ARM_T32_OFFSET_U8;
0dd132b6
NC
11765}
11766
b99bd4ef 11767static void
c19d1205 11768do_t_strexd (void)
b99bd4ef 11769{
c19d1205
ZW
11770 if (!inst.operands[2].present)
11771 inst.operands[2].reg = inst.operands[1].reg + 1;
b99bd4ef 11772
c19d1205
ZW
11773 constraint (inst.operands[0].reg == inst.operands[1].reg
11774 || inst.operands[0].reg == inst.operands[2].reg
f8a8e9d6 11775 || inst.operands[0].reg == inst.operands[3].reg,
c19d1205 11776 BAD_OVERLAP);
b99bd4ef 11777
c19d1205
ZW
11778 inst.instruction |= inst.operands[0].reg;
11779 inst.instruction |= inst.operands[1].reg << 12;
11780 inst.instruction |= inst.operands[2].reg << 8;
11781 inst.instruction |= inst.operands[3].reg << 16;
b99bd4ef
NC
11782}
11783
11784static void
c19d1205 11785do_t_sxtah (void)
b99bd4ef 11786{
fdfde340
JM
11787 unsigned Rd, Rn, Rm;
11788
11789 Rd = inst.operands[0].reg;
11790 Rn = inst.operands[1].reg;
11791 Rm = inst.operands[2].reg;
11792
11793 reject_bad_reg (Rd);
11794 reject_bad_reg (Rn);
11795 reject_bad_reg (Rm);
11796
11797 inst.instruction |= Rd << 8;
11798 inst.instruction |= Rn << 16;
11799 inst.instruction |= Rm;
c19d1205
ZW
11800 inst.instruction |= inst.operands[3].imm << 4;
11801}
b99bd4ef 11802
c19d1205
ZW
11803static void
11804do_t_sxth (void)
11805{
fdfde340
JM
11806 unsigned Rd, Rm;
11807
11808 Rd = inst.operands[0].reg;
11809 Rm = inst.operands[1].reg;
11810
11811 reject_bad_reg (Rd);
11812 reject_bad_reg (Rm);
c921be7d
NC
11813
11814 if (inst.instruction <= 0xffff
11815 && inst.size_req != 4
fdfde340 11816 && Rd <= 7 && Rm <= 7
c19d1205 11817 && (!inst.operands[2].present || inst.operands[2].imm == 0))
b99bd4ef 11818 {
c19d1205 11819 inst.instruction = THUMB_OP16 (inst.instruction);
fdfde340
JM
11820 inst.instruction |= Rd;
11821 inst.instruction |= Rm << 3;
b99bd4ef 11822 }
c19d1205 11823 else if (unified_syntax)
b99bd4ef 11824 {
c19d1205
ZW
11825 if (inst.instruction <= 0xffff)
11826 inst.instruction = THUMB_OP32 (inst.instruction);
fdfde340
JM
11827 inst.instruction |= Rd << 8;
11828 inst.instruction |= Rm;
c19d1205 11829 inst.instruction |= inst.operands[2].imm << 4;
b99bd4ef 11830 }
c19d1205 11831 else
b99bd4ef 11832 {
c19d1205
ZW
11833 constraint (inst.operands[2].present && inst.operands[2].imm != 0,
11834 _("Thumb encoding does not support rotation"));
11835 constraint (1, BAD_HIREG);
b99bd4ef 11836 }
c19d1205 11837}
b99bd4ef 11838
c19d1205
ZW
11839static void
11840do_t_swi (void)
11841{
b2a5fbdc
MGD
11842 /* We have to do the following check manually as ARM_EXT_OS only applies
11843 to ARM_EXT_V6M. */
11844 if (ARM_CPU_HAS_FEATURE (cpu_variant, arm_ext_v6m))
11845 {
ac7f631b
NC
11846 if (!ARM_CPU_HAS_FEATURE (cpu_variant, arm_ext_os)
11847 /* This only applies to the v6m howver, not later architectures. */
11848 && ! ARM_CPU_HAS_FEATURE (cpu_variant, arm_ext_v7))
b2a5fbdc
MGD
11849 as_bad (_("SVC is not permitted on this architecture"));
11850 ARM_MERGE_FEATURE_SETS (thumb_arch_used, thumb_arch_used, arm_ext_os);
11851 }
11852
c19d1205
ZW
11853 inst.reloc.type = BFD_RELOC_ARM_SWI;
11854}
b99bd4ef 11855
92e90b6e
PB
11856static void
11857do_t_tb (void)
11858{
fdfde340 11859 unsigned Rn, Rm;
92e90b6e
PB
11860 int half;
11861
11862 half = (inst.instruction & 0x10) != 0;
e07e6e58 11863 set_it_insn_type_last ();
dfa9f0d5
PB
11864 constraint (inst.operands[0].immisreg,
11865 _("instruction requires register index"));
fdfde340
JM
11866
11867 Rn = inst.operands[0].reg;
11868 Rm = inst.operands[0].imm;
c921be7d 11869
fdfde340
JM
11870 constraint (Rn == REG_SP, BAD_SP);
11871 reject_bad_reg (Rm);
11872
92e90b6e
PB
11873 constraint (!half && inst.operands[0].shifted,
11874 _("instruction does not allow shifted index"));
fdfde340 11875 inst.instruction |= (Rn << 16) | Rm;
92e90b6e
PB
11876}
11877
c19d1205
ZW
11878static void
11879do_t_usat (void)
11880{
3a21c15a 11881 do_t_ssat_usat (0);
b99bd4ef
NC
11882}
11883
11884static void
c19d1205 11885do_t_usat16 (void)
b99bd4ef 11886{
fdfde340
JM
11887 unsigned Rd, Rn;
11888
11889 Rd = inst.operands[0].reg;
11890 Rn = inst.operands[2].reg;
11891
11892 reject_bad_reg (Rd);
11893 reject_bad_reg (Rn);
11894
11895 inst.instruction |= Rd << 8;
c19d1205 11896 inst.instruction |= inst.operands[1].imm;
fdfde340 11897 inst.instruction |= Rn << 16;
b99bd4ef 11898}
c19d1205 11899
5287ad62 11900/* Neon instruction encoder helpers. */
5f4273c7 11901
5287ad62 11902/* Encodings for the different types for various Neon opcodes. */
b99bd4ef 11903
5287ad62
JB
11904/* An "invalid" code for the following tables. */
11905#define N_INV -1u
11906
11907struct neon_tab_entry
b99bd4ef 11908{
5287ad62
JB
11909 unsigned integer;
11910 unsigned float_or_poly;
11911 unsigned scalar_or_imm;
11912};
5f4273c7 11913
5287ad62
JB
11914/* Map overloaded Neon opcodes to their respective encodings. */
11915#define NEON_ENC_TAB \
11916 X(vabd, 0x0000700, 0x1200d00, N_INV), \
11917 X(vmax, 0x0000600, 0x0000f00, N_INV), \
11918 X(vmin, 0x0000610, 0x0200f00, N_INV), \
11919 X(vpadd, 0x0000b10, 0x1000d00, N_INV), \
11920 X(vpmax, 0x0000a00, 0x1000f00, N_INV), \
11921 X(vpmin, 0x0000a10, 0x1200f00, N_INV), \
11922 X(vadd, 0x0000800, 0x0000d00, N_INV), \
11923 X(vsub, 0x1000800, 0x0200d00, N_INV), \
11924 X(vceq, 0x1000810, 0x0000e00, 0x1b10100), \
11925 X(vcge, 0x0000310, 0x1000e00, 0x1b10080), \
11926 X(vcgt, 0x0000300, 0x1200e00, 0x1b10000), \
11927 /* Register variants of the following two instructions are encoded as
e07e6e58 11928 vcge / vcgt with the operands reversed. */ \
92559b5b
PB
11929 X(vclt, 0x0000300, 0x1200e00, 0x1b10200), \
11930 X(vcle, 0x0000310, 0x1000e00, 0x1b10180), \
62f3b8c8
PB
11931 X(vfma, N_INV, 0x0000c10, N_INV), \
11932 X(vfms, N_INV, 0x0200c10, N_INV), \
5287ad62
JB
11933 X(vmla, 0x0000900, 0x0000d10, 0x0800040), \
11934 X(vmls, 0x1000900, 0x0200d10, 0x0800440), \
11935 X(vmul, 0x0000910, 0x1000d10, 0x0800840), \
11936 X(vmull, 0x0800c00, 0x0800e00, 0x0800a40), /* polynomial not float. */ \
11937 X(vmlal, 0x0800800, N_INV, 0x0800240), \
11938 X(vmlsl, 0x0800a00, N_INV, 0x0800640), \
11939 X(vqdmlal, 0x0800900, N_INV, 0x0800340), \
11940 X(vqdmlsl, 0x0800b00, N_INV, 0x0800740), \
11941 X(vqdmull, 0x0800d00, N_INV, 0x0800b40), \
11942 X(vqdmulh, 0x0000b00, N_INV, 0x0800c40), \
11943 X(vqrdmulh, 0x1000b00, N_INV, 0x0800d40), \
11944 X(vshl, 0x0000400, N_INV, 0x0800510), \
11945 X(vqshl, 0x0000410, N_INV, 0x0800710), \
11946 X(vand, 0x0000110, N_INV, 0x0800030), \
11947 X(vbic, 0x0100110, N_INV, 0x0800030), \
11948 X(veor, 0x1000110, N_INV, N_INV), \
11949 X(vorn, 0x0300110, N_INV, 0x0800010), \
11950 X(vorr, 0x0200110, N_INV, 0x0800010), \
11951 X(vmvn, 0x1b00580, N_INV, 0x0800030), \
11952 X(vshll, 0x1b20300, N_INV, 0x0800a10), /* max shift, immediate. */ \
11953 X(vcvt, 0x1b30600, N_INV, 0x0800e10), /* integer, fixed-point. */ \
11954 X(vdup, 0xe800b10, N_INV, 0x1b00c00), /* arm, scalar. */ \
11955 X(vld1, 0x0200000, 0x0a00000, 0x0a00c00), /* interlv, lane, dup. */ \
11956 X(vst1, 0x0000000, 0x0800000, N_INV), \
11957 X(vld2, 0x0200100, 0x0a00100, 0x0a00d00), \
11958 X(vst2, 0x0000100, 0x0800100, N_INV), \
11959 X(vld3, 0x0200200, 0x0a00200, 0x0a00e00), \
11960 X(vst3, 0x0000200, 0x0800200, N_INV), \
11961 X(vld4, 0x0200300, 0x0a00300, 0x0a00f00), \
11962 X(vst4, 0x0000300, 0x0800300, N_INV), \
11963 X(vmovn, 0x1b20200, N_INV, N_INV), \
11964 X(vtrn, 0x1b20080, N_INV, N_INV), \
11965 X(vqmovn, 0x1b20200, N_INV, N_INV), \
037e8744
JB
11966 X(vqmovun, 0x1b20240, N_INV, N_INV), \
11967 X(vnmul, 0xe200a40, 0xe200b40, N_INV), \
e6655fda
PB
11968 X(vnmla, 0xe100a40, 0xe100b40, N_INV), \
11969 X(vnmls, 0xe100a00, 0xe100b00, N_INV), \
62f3b8c8
PB
11970 X(vfnma, 0xe900a40, 0xe900b40, N_INV), \
11971 X(vfnms, 0xe900a00, 0xe900b00, N_INV), \
037e8744
JB
11972 X(vcmp, 0xeb40a40, 0xeb40b40, N_INV), \
11973 X(vcmpz, 0xeb50a40, 0xeb50b40, N_INV), \
11974 X(vcmpe, 0xeb40ac0, 0xeb40bc0, N_INV), \
11975 X(vcmpez, 0xeb50ac0, 0xeb50bc0, N_INV)
5287ad62
JB
11976
11977enum neon_opc
11978{
11979#define X(OPC,I,F,S) N_MNEM_##OPC
11980NEON_ENC_TAB
11981#undef X
11982};
b99bd4ef 11983
5287ad62
JB
11984static const struct neon_tab_entry neon_enc_tab[] =
11985{
11986#define X(OPC,I,F,S) { (I), (F), (S) }
11987NEON_ENC_TAB
11988#undef X
11989};
b99bd4ef 11990
88714cb8
DG
11991/* Do not use these macros; instead, use NEON_ENCODE defined below. */
11992#define NEON_ENC_INTEGER_(X) (neon_enc_tab[(X) & 0x0fffffff].integer)
11993#define NEON_ENC_ARMREG_(X) (neon_enc_tab[(X) & 0x0fffffff].integer)
11994#define NEON_ENC_POLY_(X) (neon_enc_tab[(X) & 0x0fffffff].float_or_poly)
11995#define NEON_ENC_FLOAT_(X) (neon_enc_tab[(X) & 0x0fffffff].float_or_poly)
11996#define NEON_ENC_SCALAR_(X) (neon_enc_tab[(X) & 0x0fffffff].scalar_or_imm)
11997#define NEON_ENC_IMMED_(X) (neon_enc_tab[(X) & 0x0fffffff].scalar_or_imm)
11998#define NEON_ENC_INTERLV_(X) (neon_enc_tab[(X) & 0x0fffffff].integer)
11999#define NEON_ENC_LANE_(X) (neon_enc_tab[(X) & 0x0fffffff].float_or_poly)
12000#define NEON_ENC_DUP_(X) (neon_enc_tab[(X) & 0x0fffffff].scalar_or_imm)
12001#define NEON_ENC_SINGLE_(X) \
037e8744 12002 ((neon_enc_tab[(X) & 0x0fffffff].integer) | ((X) & 0xf0000000))
88714cb8 12003#define NEON_ENC_DOUBLE_(X) \
037e8744 12004 ((neon_enc_tab[(X) & 0x0fffffff].float_or_poly) | ((X) & 0xf0000000))
5287ad62 12005
88714cb8
DG
12006#define NEON_ENCODE(type, inst) \
12007 do \
12008 { \
12009 inst.instruction = NEON_ENC_##type##_ (inst.instruction); \
12010 inst.is_neon = 1; \
12011 } \
12012 while (0)
12013
12014#define check_neon_suffixes \
12015 do \
12016 { \
12017 if (!inst.error && inst.vectype.elems > 0 && !inst.is_neon) \
12018 { \
12019 as_bad (_("invalid neon suffix for non neon instruction")); \
12020 return; \
12021 } \
12022 } \
12023 while (0)
12024
037e8744
JB
12025/* Define shapes for instruction operands. The following mnemonic characters
12026 are used in this table:
5287ad62 12027
037e8744 12028 F - VFP S<n> register
5287ad62
JB
12029 D - Neon D<n> register
12030 Q - Neon Q<n> register
12031 I - Immediate
12032 S - Scalar
12033 R - ARM register
12034 L - D<n> register list
5f4273c7 12035
037e8744
JB
12036 This table is used to generate various data:
12037 - enumerations of the form NS_DDR to be used as arguments to
12038 neon_select_shape.
12039 - a table classifying shapes into single, double, quad, mixed.
5f4273c7 12040 - a table used to drive neon_select_shape. */
b99bd4ef 12041
037e8744
JB
12042#define NEON_SHAPE_DEF \
12043 X(3, (D, D, D), DOUBLE), \
12044 X(3, (Q, Q, Q), QUAD), \
12045 X(3, (D, D, I), DOUBLE), \
12046 X(3, (Q, Q, I), QUAD), \
12047 X(3, (D, D, S), DOUBLE), \
12048 X(3, (Q, Q, S), QUAD), \
12049 X(2, (D, D), DOUBLE), \
12050 X(2, (Q, Q), QUAD), \
12051 X(2, (D, S), DOUBLE), \
12052 X(2, (Q, S), QUAD), \
12053 X(2, (D, R), DOUBLE), \
12054 X(2, (Q, R), QUAD), \
12055 X(2, (D, I), DOUBLE), \
12056 X(2, (Q, I), QUAD), \
12057 X(3, (D, L, D), DOUBLE), \
12058 X(2, (D, Q), MIXED), \
12059 X(2, (Q, D), MIXED), \
12060 X(3, (D, Q, I), MIXED), \
12061 X(3, (Q, D, I), MIXED), \
12062 X(3, (Q, D, D), MIXED), \
12063 X(3, (D, Q, Q), MIXED), \
12064 X(3, (Q, Q, D), MIXED), \
12065 X(3, (Q, D, S), MIXED), \
12066 X(3, (D, Q, S), MIXED), \
12067 X(4, (D, D, D, I), DOUBLE), \
12068 X(4, (Q, Q, Q, I), QUAD), \
12069 X(2, (F, F), SINGLE), \
12070 X(3, (F, F, F), SINGLE), \
12071 X(2, (F, I), SINGLE), \
12072 X(2, (F, D), MIXED), \
12073 X(2, (D, F), MIXED), \
12074 X(3, (F, F, I), MIXED), \
12075 X(4, (R, R, F, F), SINGLE), \
12076 X(4, (F, F, R, R), SINGLE), \
12077 X(3, (D, R, R), DOUBLE), \
12078 X(3, (R, R, D), DOUBLE), \
12079 X(2, (S, R), SINGLE), \
12080 X(2, (R, S), SINGLE), \
12081 X(2, (F, R), SINGLE), \
12082 X(2, (R, F), SINGLE)
12083
12084#define S2(A,B) NS_##A##B
12085#define S3(A,B,C) NS_##A##B##C
12086#define S4(A,B,C,D) NS_##A##B##C##D
12087
12088#define X(N, L, C) S##N L
12089
5287ad62
JB
12090enum neon_shape
12091{
037e8744
JB
12092 NEON_SHAPE_DEF,
12093 NS_NULL
5287ad62 12094};
b99bd4ef 12095
037e8744
JB
12096#undef X
12097#undef S2
12098#undef S3
12099#undef S4
12100
12101enum neon_shape_class
12102{
12103 SC_SINGLE,
12104 SC_DOUBLE,
12105 SC_QUAD,
12106 SC_MIXED
12107};
12108
12109#define X(N, L, C) SC_##C
12110
12111static enum neon_shape_class neon_shape_class[] =
12112{
12113 NEON_SHAPE_DEF
12114};
12115
12116#undef X
12117
12118enum neon_shape_el
12119{
12120 SE_F,
12121 SE_D,
12122 SE_Q,
12123 SE_I,
12124 SE_S,
12125 SE_R,
12126 SE_L
12127};
12128
12129/* Register widths of above. */
12130static unsigned neon_shape_el_size[] =
12131{
12132 32,
12133 64,
12134 128,
12135 0,
12136 32,
12137 32,
12138 0
12139};
12140
12141struct neon_shape_info
12142{
12143 unsigned els;
12144 enum neon_shape_el el[NEON_MAX_TYPE_ELS];
12145};
12146
12147#define S2(A,B) { SE_##A, SE_##B }
12148#define S3(A,B,C) { SE_##A, SE_##B, SE_##C }
12149#define S4(A,B,C,D) { SE_##A, SE_##B, SE_##C, SE_##D }
12150
12151#define X(N, L, C) { N, S##N L }
12152
12153static struct neon_shape_info neon_shape_tab[] =
12154{
12155 NEON_SHAPE_DEF
12156};
12157
12158#undef X
12159#undef S2
12160#undef S3
12161#undef S4
12162
5287ad62
JB
12163/* Bit masks used in type checking given instructions.
12164 'N_EQK' means the type must be the same as (or based on in some way) the key
12165 type, which itself is marked with the 'N_KEY' bit. If the 'N_EQK' bit is
12166 set, various other bits can be set as well in order to modify the meaning of
12167 the type constraint. */
12168
12169enum neon_type_mask
12170{
8e79c3df
CM
12171 N_S8 = 0x0000001,
12172 N_S16 = 0x0000002,
12173 N_S32 = 0x0000004,
12174 N_S64 = 0x0000008,
12175 N_U8 = 0x0000010,
12176 N_U16 = 0x0000020,
12177 N_U32 = 0x0000040,
12178 N_U64 = 0x0000080,
12179 N_I8 = 0x0000100,
12180 N_I16 = 0x0000200,
12181 N_I32 = 0x0000400,
12182 N_I64 = 0x0000800,
12183 N_8 = 0x0001000,
12184 N_16 = 0x0002000,
12185 N_32 = 0x0004000,
12186 N_64 = 0x0008000,
12187 N_P8 = 0x0010000,
12188 N_P16 = 0x0020000,
12189 N_F16 = 0x0040000,
12190 N_F32 = 0x0080000,
12191 N_F64 = 0x0100000,
c921be7d
NC
12192 N_KEY = 0x1000000, /* Key element (main type specifier). */
12193 N_EQK = 0x2000000, /* Given operand has the same type & size as the key. */
8e79c3df 12194 N_VFP = 0x4000000, /* VFP mode: operand size must match register width. */
c921be7d
NC
12195 N_DBL = 0x0000001, /* If N_EQK, this operand is twice the size. */
12196 N_HLF = 0x0000002, /* If N_EQK, this operand is half the size. */
12197 N_SGN = 0x0000004, /* If N_EQK, this operand is forced to be signed. */
12198 N_UNS = 0x0000008, /* If N_EQK, this operand is forced to be unsigned. */
12199 N_INT = 0x0000010, /* If N_EQK, this operand is forced to be integer. */
12200 N_FLT = 0x0000020, /* If N_EQK, this operand is forced to be float. */
12201 N_SIZ = 0x0000040, /* If N_EQK, this operand is forced to be size-only. */
5287ad62 12202 N_UTYP = 0,
037e8744 12203 N_MAX_NONSPECIAL = N_F64
5287ad62
JB
12204};
12205
dcbf9037
JB
12206#define N_ALLMODS (N_DBL | N_HLF | N_SGN | N_UNS | N_INT | N_FLT | N_SIZ)
12207
5287ad62
JB
12208#define N_SU_ALL (N_S8 | N_S16 | N_S32 | N_S64 | N_U8 | N_U16 | N_U32 | N_U64)
12209#define N_SU_32 (N_S8 | N_S16 | N_S32 | N_U8 | N_U16 | N_U32)
12210#define N_SU_16_64 (N_S16 | N_S32 | N_S64 | N_U16 | N_U32 | N_U64)
12211#define N_SUF_32 (N_SU_32 | N_F32)
12212#define N_I_ALL (N_I8 | N_I16 | N_I32 | N_I64)
12213#define N_IF_32 (N_I8 | N_I16 | N_I32 | N_F32)
12214
12215/* Pass this as the first type argument to neon_check_type to ignore types
12216 altogether. */
12217#define N_IGNORE_TYPE (N_KEY | N_EQK)
12218
037e8744
JB
12219/* Select a "shape" for the current instruction (describing register types or
12220 sizes) from a list of alternatives. Return NS_NULL if the current instruction
12221 doesn't fit. For non-polymorphic shapes, checking is usually done as a
12222 function of operand parsing, so this function doesn't need to be called.
12223 Shapes should be listed in order of decreasing length. */
5287ad62
JB
12224
12225static enum neon_shape
037e8744 12226neon_select_shape (enum neon_shape shape, ...)
5287ad62 12227{
037e8744
JB
12228 va_list ap;
12229 enum neon_shape first_shape = shape;
5287ad62
JB
12230
12231 /* Fix missing optional operands. FIXME: we don't know at this point how
12232 many arguments we should have, so this makes the assumption that we have
12233 > 1. This is true of all current Neon opcodes, I think, but may not be
12234 true in the future. */
12235 if (!inst.operands[1].present)
12236 inst.operands[1] = inst.operands[0];
12237
037e8744 12238 va_start (ap, shape);
5f4273c7 12239
21d799b5 12240 for (; shape != NS_NULL; shape = (enum neon_shape) va_arg (ap, int))
037e8744
JB
12241 {
12242 unsigned j;
12243 int matches = 1;
12244
12245 for (j = 0; j < neon_shape_tab[shape].els; j++)
12246 {
12247 if (!inst.operands[j].present)
12248 {
12249 matches = 0;
12250 break;
12251 }
12252
12253 switch (neon_shape_tab[shape].el[j])
12254 {
12255 case SE_F:
12256 if (!(inst.operands[j].isreg
12257 && inst.operands[j].isvec
12258 && inst.operands[j].issingle
12259 && !inst.operands[j].isquad))
12260 matches = 0;
12261 break;
12262
12263 case SE_D:
12264 if (!(inst.operands[j].isreg
12265 && inst.operands[j].isvec
12266 && !inst.operands[j].isquad
12267 && !inst.operands[j].issingle))
12268 matches = 0;
12269 break;
12270
12271 case SE_R:
12272 if (!(inst.operands[j].isreg
12273 && !inst.operands[j].isvec))
12274 matches = 0;
12275 break;
12276
12277 case SE_Q:
12278 if (!(inst.operands[j].isreg
12279 && inst.operands[j].isvec
12280 && inst.operands[j].isquad
12281 && !inst.operands[j].issingle))
12282 matches = 0;
12283 break;
12284
12285 case SE_I:
12286 if (!(!inst.operands[j].isreg
12287 && !inst.operands[j].isscalar))
12288 matches = 0;
12289 break;
12290
12291 case SE_S:
12292 if (!(!inst.operands[j].isreg
12293 && inst.operands[j].isscalar))
12294 matches = 0;
12295 break;
12296
12297 case SE_L:
12298 break;
12299 }
3fde54a2
JZ
12300 if (!matches)
12301 break;
037e8744
JB
12302 }
12303 if (matches)
5287ad62 12304 break;
037e8744 12305 }
5f4273c7 12306
037e8744 12307 va_end (ap);
5287ad62 12308
037e8744
JB
12309 if (shape == NS_NULL && first_shape != NS_NULL)
12310 first_error (_("invalid instruction shape"));
5287ad62 12311
037e8744
JB
12312 return shape;
12313}
5287ad62 12314
037e8744
JB
12315/* True if SHAPE is predominantly a quadword operation (most of the time, this
12316 means the Q bit should be set). */
12317
12318static int
12319neon_quad (enum neon_shape shape)
12320{
12321 return neon_shape_class[shape] == SC_QUAD;
5287ad62 12322}
037e8744 12323
5287ad62
JB
12324static void
12325neon_modify_type_size (unsigned typebits, enum neon_el_type *g_type,
12326 unsigned *g_size)
12327{
12328 /* Allow modification to be made to types which are constrained to be
12329 based on the key element, based on bits set alongside N_EQK. */
12330 if ((typebits & N_EQK) != 0)
12331 {
12332 if ((typebits & N_HLF) != 0)
12333 *g_size /= 2;
12334 else if ((typebits & N_DBL) != 0)
12335 *g_size *= 2;
12336 if ((typebits & N_SGN) != 0)
12337 *g_type = NT_signed;
12338 else if ((typebits & N_UNS) != 0)
12339 *g_type = NT_unsigned;
12340 else if ((typebits & N_INT) != 0)
12341 *g_type = NT_integer;
12342 else if ((typebits & N_FLT) != 0)
12343 *g_type = NT_float;
dcbf9037
JB
12344 else if ((typebits & N_SIZ) != 0)
12345 *g_type = NT_untyped;
5287ad62
JB
12346 }
12347}
5f4273c7 12348
5287ad62
JB
12349/* Return operand OPNO promoted by bits set in THISARG. KEY should be the "key"
12350 operand type, i.e. the single type specified in a Neon instruction when it
12351 is the only one given. */
12352
12353static struct neon_type_el
12354neon_type_promote (struct neon_type_el *key, unsigned thisarg)
12355{
12356 struct neon_type_el dest = *key;
5f4273c7 12357
9c2799c2 12358 gas_assert ((thisarg & N_EQK) != 0);
5f4273c7 12359
5287ad62
JB
12360 neon_modify_type_size (thisarg, &dest.type, &dest.size);
12361
12362 return dest;
12363}
12364
12365/* Convert Neon type and size into compact bitmask representation. */
12366
12367static enum neon_type_mask
12368type_chk_of_el_type (enum neon_el_type type, unsigned size)
12369{
12370 switch (type)
12371 {
12372 case NT_untyped:
12373 switch (size)
12374 {
12375 case 8: return N_8;
12376 case 16: return N_16;
12377 case 32: return N_32;
12378 case 64: return N_64;
12379 default: ;
12380 }
12381 break;
12382
12383 case NT_integer:
12384 switch (size)
12385 {
12386 case 8: return N_I8;
12387 case 16: return N_I16;
12388 case 32: return N_I32;
12389 case 64: return N_I64;
12390 default: ;
12391 }
12392 break;
12393
12394 case NT_float:
037e8744
JB
12395 switch (size)
12396 {
8e79c3df 12397 case 16: return N_F16;
037e8744
JB
12398 case 32: return N_F32;
12399 case 64: return N_F64;
12400 default: ;
12401 }
5287ad62
JB
12402 break;
12403
12404 case NT_poly:
12405 switch (size)
12406 {
12407 case 8: return N_P8;
12408 case 16: return N_P16;
12409 default: ;
12410 }
12411 break;
12412
12413 case NT_signed:
12414 switch (size)
12415 {
12416 case 8: return N_S8;
12417 case 16: return N_S16;
12418 case 32: return N_S32;
12419 case 64: return N_S64;
12420 default: ;
12421 }
12422 break;
12423
12424 case NT_unsigned:
12425 switch (size)
12426 {
12427 case 8: return N_U8;
12428 case 16: return N_U16;
12429 case 32: return N_U32;
12430 case 64: return N_U64;
12431 default: ;
12432 }
12433 break;
12434
12435 default: ;
12436 }
5f4273c7 12437
5287ad62
JB
12438 return N_UTYP;
12439}
12440
12441/* Convert compact Neon bitmask type representation to a type and size. Only
12442 handles the case where a single bit is set in the mask. */
12443
dcbf9037 12444static int
5287ad62
JB
12445el_type_of_type_chk (enum neon_el_type *type, unsigned *size,
12446 enum neon_type_mask mask)
12447{
dcbf9037
JB
12448 if ((mask & N_EQK) != 0)
12449 return FAIL;
12450
5287ad62
JB
12451 if ((mask & (N_S8 | N_U8 | N_I8 | N_8 | N_P8)) != 0)
12452 *size = 8;
dcbf9037 12453 else if ((mask & (N_S16 | N_U16 | N_I16 | N_16 | N_P16)) != 0)
5287ad62 12454 *size = 16;
dcbf9037 12455 else if ((mask & (N_S32 | N_U32 | N_I32 | N_32 | N_F32)) != 0)
5287ad62 12456 *size = 32;
037e8744 12457 else if ((mask & (N_S64 | N_U64 | N_I64 | N_64 | N_F64)) != 0)
5287ad62 12458 *size = 64;
dcbf9037
JB
12459 else
12460 return FAIL;
12461
5287ad62
JB
12462 if ((mask & (N_S8 | N_S16 | N_S32 | N_S64)) != 0)
12463 *type = NT_signed;
dcbf9037 12464 else if ((mask & (N_U8 | N_U16 | N_U32 | N_U64)) != 0)
5287ad62 12465 *type = NT_unsigned;
dcbf9037 12466 else if ((mask & (N_I8 | N_I16 | N_I32 | N_I64)) != 0)
5287ad62 12467 *type = NT_integer;
dcbf9037 12468 else if ((mask & (N_8 | N_16 | N_32 | N_64)) != 0)
5287ad62 12469 *type = NT_untyped;
dcbf9037 12470 else if ((mask & (N_P8 | N_P16)) != 0)
5287ad62 12471 *type = NT_poly;
037e8744 12472 else if ((mask & (N_F32 | N_F64)) != 0)
5287ad62 12473 *type = NT_float;
dcbf9037
JB
12474 else
12475 return FAIL;
5f4273c7 12476
dcbf9037 12477 return SUCCESS;
5287ad62
JB
12478}
12479
12480/* Modify a bitmask of allowed types. This is only needed for type
12481 relaxation. */
12482
12483static unsigned
12484modify_types_allowed (unsigned allowed, unsigned mods)
12485{
12486 unsigned size;
12487 enum neon_el_type type;
12488 unsigned destmask;
12489 int i;
5f4273c7 12490
5287ad62 12491 destmask = 0;
5f4273c7 12492
5287ad62
JB
12493 for (i = 1; i <= N_MAX_NONSPECIAL; i <<= 1)
12494 {
21d799b5
NC
12495 if (el_type_of_type_chk (&type, &size,
12496 (enum neon_type_mask) (allowed & i)) == SUCCESS)
dcbf9037
JB
12497 {
12498 neon_modify_type_size (mods, &type, &size);
12499 destmask |= type_chk_of_el_type (type, size);
12500 }
5287ad62 12501 }
5f4273c7 12502
5287ad62
JB
12503 return destmask;
12504}
12505
12506/* Check type and return type classification.
12507 The manual states (paraphrase): If one datatype is given, it indicates the
12508 type given in:
12509 - the second operand, if there is one
12510 - the operand, if there is no second operand
12511 - the result, if there are no operands.
12512 This isn't quite good enough though, so we use a concept of a "key" datatype
12513 which is set on a per-instruction basis, which is the one which matters when
12514 only one data type is written.
12515 Note: this function has side-effects (e.g. filling in missing operands). All
037e8744 12516 Neon instructions should call it before performing bit encoding. */
5287ad62
JB
12517
12518static struct neon_type_el
12519neon_check_type (unsigned els, enum neon_shape ns, ...)
12520{
12521 va_list ap;
12522 unsigned i, pass, key_el = 0;
12523 unsigned types[NEON_MAX_TYPE_ELS];
12524 enum neon_el_type k_type = NT_invtype;
12525 unsigned k_size = -1u;
12526 struct neon_type_el badtype = {NT_invtype, -1};
12527 unsigned key_allowed = 0;
12528
12529 /* Optional registers in Neon instructions are always (not) in operand 1.
12530 Fill in the missing operand here, if it was omitted. */
12531 if (els > 1 && !inst.operands[1].present)
12532 inst.operands[1] = inst.operands[0];
12533
12534 /* Suck up all the varargs. */
12535 va_start (ap, ns);
12536 for (i = 0; i < els; i++)
12537 {
12538 unsigned thisarg = va_arg (ap, unsigned);
12539 if (thisarg == N_IGNORE_TYPE)
12540 {
12541 va_end (ap);
12542 return badtype;
12543 }
12544 types[i] = thisarg;
12545 if ((thisarg & N_KEY) != 0)
12546 key_el = i;
12547 }
12548 va_end (ap);
12549
dcbf9037
JB
12550 if (inst.vectype.elems > 0)
12551 for (i = 0; i < els; i++)
12552 if (inst.operands[i].vectype.type != NT_invtype)
12553 {
12554 first_error (_("types specified in both the mnemonic and operands"));
12555 return badtype;
12556 }
12557
5287ad62
JB
12558 /* Duplicate inst.vectype elements here as necessary.
12559 FIXME: No idea if this is exactly the same as the ARM assembler,
12560 particularly when an insn takes one register and one non-register
12561 operand. */
12562 if (inst.vectype.elems == 1 && els > 1)
12563 {
12564 unsigned j;
12565 inst.vectype.elems = els;
12566 inst.vectype.el[key_el] = inst.vectype.el[0];
12567 for (j = 0; j < els; j++)
dcbf9037
JB
12568 if (j != key_el)
12569 inst.vectype.el[j] = neon_type_promote (&inst.vectype.el[key_el],
12570 types[j]);
12571 }
12572 else if (inst.vectype.elems == 0 && els > 0)
12573 {
12574 unsigned j;
12575 /* No types were given after the mnemonic, so look for types specified
12576 after each operand. We allow some flexibility here; as long as the
12577 "key" operand has a type, we can infer the others. */
12578 for (j = 0; j < els; j++)
12579 if (inst.operands[j].vectype.type != NT_invtype)
12580 inst.vectype.el[j] = inst.operands[j].vectype;
12581
12582 if (inst.operands[key_el].vectype.type != NT_invtype)
5287ad62 12583 {
dcbf9037
JB
12584 for (j = 0; j < els; j++)
12585 if (inst.operands[j].vectype.type == NT_invtype)
12586 inst.vectype.el[j] = neon_type_promote (&inst.vectype.el[key_el],
12587 types[j]);
12588 }
12589 else
12590 {
12591 first_error (_("operand types can't be inferred"));
12592 return badtype;
5287ad62
JB
12593 }
12594 }
12595 else if (inst.vectype.elems != els)
12596 {
dcbf9037 12597 first_error (_("type specifier has the wrong number of parts"));
5287ad62
JB
12598 return badtype;
12599 }
12600
12601 for (pass = 0; pass < 2; pass++)
12602 {
12603 for (i = 0; i < els; i++)
12604 {
12605 unsigned thisarg = types[i];
12606 unsigned types_allowed = ((thisarg & N_EQK) != 0 && pass != 0)
12607 ? modify_types_allowed (key_allowed, thisarg) : thisarg;
12608 enum neon_el_type g_type = inst.vectype.el[i].type;
12609 unsigned g_size = inst.vectype.el[i].size;
12610
12611 /* Decay more-specific signed & unsigned types to sign-insensitive
12612 integer types if sign-specific variants are unavailable. */
12613 if ((g_type == NT_signed || g_type == NT_unsigned)
12614 && (types_allowed & N_SU_ALL) == 0)
12615 g_type = NT_integer;
12616
12617 /* If only untyped args are allowed, decay any more specific types to
12618 them. Some instructions only care about signs for some element
12619 sizes, so handle that properly. */
12620 if ((g_size == 8 && (types_allowed & N_8) != 0)
12621 || (g_size == 16 && (types_allowed & N_16) != 0)
12622 || (g_size == 32 && (types_allowed & N_32) != 0)
12623 || (g_size == 64 && (types_allowed & N_64) != 0))
12624 g_type = NT_untyped;
12625
12626 if (pass == 0)
12627 {
12628 if ((thisarg & N_KEY) != 0)
12629 {
12630 k_type = g_type;
12631 k_size = g_size;
12632 key_allowed = thisarg & ~N_KEY;
12633 }
12634 }
12635 else
12636 {
037e8744
JB
12637 if ((thisarg & N_VFP) != 0)
12638 {
99b253c5
NC
12639 enum neon_shape_el regshape;
12640 unsigned regwidth, match;
12641
12642 /* PR 11136: Catch the case where we are passed a shape of NS_NULL. */
12643 if (ns == NS_NULL)
12644 {
12645 first_error (_("invalid instruction shape"));
12646 return badtype;
12647 }
12648 regshape = neon_shape_tab[ns].el[i];
12649 regwidth = neon_shape_el_size[regshape];
037e8744
JB
12650
12651 /* In VFP mode, operands must match register widths. If we
12652 have a key operand, use its width, else use the width of
12653 the current operand. */
12654 if (k_size != -1u)
12655 match = k_size;
12656 else
12657 match = g_size;
12658
12659 if (regwidth != match)
12660 {
12661 first_error (_("operand size must match register width"));
12662 return badtype;
12663 }
12664 }
5f4273c7 12665
5287ad62
JB
12666 if ((thisarg & N_EQK) == 0)
12667 {
12668 unsigned given_type = type_chk_of_el_type (g_type, g_size);
12669
12670 if ((given_type & types_allowed) == 0)
12671 {
dcbf9037 12672 first_error (_("bad type in Neon instruction"));
5287ad62
JB
12673 return badtype;
12674 }
12675 }
12676 else
12677 {
12678 enum neon_el_type mod_k_type = k_type;
12679 unsigned mod_k_size = k_size;
12680 neon_modify_type_size (thisarg, &mod_k_type, &mod_k_size);
12681 if (g_type != mod_k_type || g_size != mod_k_size)
12682 {
dcbf9037 12683 first_error (_("inconsistent types in Neon instruction"));
5287ad62
JB
12684 return badtype;
12685 }
12686 }
12687 }
12688 }
12689 }
12690
12691 return inst.vectype.el[key_el];
12692}
12693
037e8744 12694/* Neon-style VFP instruction forwarding. */
5287ad62 12695
037e8744
JB
12696/* Thumb VFP instructions have 0xE in the condition field. */
12697
12698static void
12699do_vfp_cond_or_thumb (void)
5287ad62 12700{
88714cb8
DG
12701 inst.is_neon = 1;
12702
5287ad62 12703 if (thumb_mode)
037e8744 12704 inst.instruction |= 0xe0000000;
5287ad62 12705 else
037e8744 12706 inst.instruction |= inst.cond << 28;
5287ad62
JB
12707}
12708
037e8744
JB
12709/* Look up and encode a simple mnemonic, for use as a helper function for the
12710 Neon-style VFP syntax. This avoids duplication of bits of the insns table,
12711 etc. It is assumed that operand parsing has already been done, and that the
12712 operands are in the form expected by the given opcode (this isn't necessarily
12713 the same as the form in which they were parsed, hence some massaging must
12714 take place before this function is called).
12715 Checks current arch version against that in the looked-up opcode. */
5287ad62 12716
037e8744
JB
12717static void
12718do_vfp_nsyn_opcode (const char *opname)
5287ad62 12719{
037e8744 12720 const struct asm_opcode *opcode;
5f4273c7 12721
21d799b5 12722 opcode = (const struct asm_opcode *) hash_find (arm_ops_hsh, opname);
5287ad62 12723
037e8744
JB
12724 if (!opcode)
12725 abort ();
5287ad62 12726
037e8744
JB
12727 constraint (!ARM_CPU_HAS_FEATURE (cpu_variant,
12728 thumb_mode ? *opcode->tvariant : *opcode->avariant),
12729 _(BAD_FPU));
5287ad62 12730
88714cb8
DG
12731 inst.is_neon = 1;
12732
037e8744
JB
12733 if (thumb_mode)
12734 {
12735 inst.instruction = opcode->tvalue;
12736 opcode->tencode ();
12737 }
12738 else
12739 {
12740 inst.instruction = (inst.cond << 28) | opcode->avalue;
12741 opcode->aencode ();
12742 }
12743}
5287ad62
JB
12744
12745static void
037e8744 12746do_vfp_nsyn_add_sub (enum neon_shape rs)
5287ad62 12747{
037e8744
JB
12748 int is_add = (inst.instruction & 0x0fffffff) == N_MNEM_vadd;
12749
12750 if (rs == NS_FFF)
12751 {
12752 if (is_add)
12753 do_vfp_nsyn_opcode ("fadds");
12754 else
12755 do_vfp_nsyn_opcode ("fsubs");
12756 }
12757 else
12758 {
12759 if (is_add)
12760 do_vfp_nsyn_opcode ("faddd");
12761 else
12762 do_vfp_nsyn_opcode ("fsubd");
12763 }
12764}
12765
12766/* Check operand types to see if this is a VFP instruction, and if so call
12767 PFN (). */
12768
12769static int
12770try_vfp_nsyn (int args, void (*pfn) (enum neon_shape))
12771{
12772 enum neon_shape rs;
12773 struct neon_type_el et;
12774
12775 switch (args)
12776 {
12777 case 2:
12778 rs = neon_select_shape (NS_FF, NS_DD, NS_NULL);
12779 et = neon_check_type (2, rs,
12780 N_EQK | N_VFP, N_F32 | N_F64 | N_KEY | N_VFP);
12781 break;
5f4273c7 12782
037e8744
JB
12783 case 3:
12784 rs = neon_select_shape (NS_FFF, NS_DDD, NS_NULL);
12785 et = neon_check_type (3, rs,
12786 N_EQK | N_VFP, N_EQK | N_VFP, N_F32 | N_F64 | N_KEY | N_VFP);
12787 break;
12788
12789 default:
12790 abort ();
12791 }
12792
12793 if (et.type != NT_invtype)
12794 {
12795 pfn (rs);
12796 return SUCCESS;
12797 }
037e8744 12798
99b253c5 12799 inst.error = NULL;
037e8744
JB
12800 return FAIL;
12801}
12802
12803static void
12804do_vfp_nsyn_mla_mls (enum neon_shape rs)
12805{
12806 int is_mla = (inst.instruction & 0x0fffffff) == N_MNEM_vmla;
5f4273c7 12807
037e8744
JB
12808 if (rs == NS_FFF)
12809 {
12810 if (is_mla)
12811 do_vfp_nsyn_opcode ("fmacs");
12812 else
1ee69515 12813 do_vfp_nsyn_opcode ("fnmacs");
037e8744
JB
12814 }
12815 else
12816 {
12817 if (is_mla)
12818 do_vfp_nsyn_opcode ("fmacd");
12819 else
1ee69515 12820 do_vfp_nsyn_opcode ("fnmacd");
037e8744
JB
12821 }
12822}
12823
62f3b8c8
PB
12824static void
12825do_vfp_nsyn_fma_fms (enum neon_shape rs)
12826{
12827 int is_fma = (inst.instruction & 0x0fffffff) == N_MNEM_vfma;
12828
12829 if (rs == NS_FFF)
12830 {
12831 if (is_fma)
12832 do_vfp_nsyn_opcode ("ffmas");
12833 else
12834 do_vfp_nsyn_opcode ("ffnmas");
12835 }
12836 else
12837 {
12838 if (is_fma)
12839 do_vfp_nsyn_opcode ("ffmad");
12840 else
12841 do_vfp_nsyn_opcode ("ffnmad");
12842 }
12843}
12844
037e8744
JB
12845static void
12846do_vfp_nsyn_mul (enum neon_shape rs)
12847{
12848 if (rs == NS_FFF)
12849 do_vfp_nsyn_opcode ("fmuls");
12850 else
12851 do_vfp_nsyn_opcode ("fmuld");
12852}
12853
12854static void
12855do_vfp_nsyn_abs_neg (enum neon_shape rs)
12856{
12857 int is_neg = (inst.instruction & 0x80) != 0;
12858 neon_check_type (2, rs, N_EQK | N_VFP, N_F32 | N_F64 | N_VFP | N_KEY);
12859
12860 if (rs == NS_FF)
12861 {
12862 if (is_neg)
12863 do_vfp_nsyn_opcode ("fnegs");
12864 else
12865 do_vfp_nsyn_opcode ("fabss");
12866 }
12867 else
12868 {
12869 if (is_neg)
12870 do_vfp_nsyn_opcode ("fnegd");
12871 else
12872 do_vfp_nsyn_opcode ("fabsd");
12873 }
12874}
12875
12876/* Encode single-precision (only!) VFP fldm/fstm instructions. Double precision
12877 insns belong to Neon, and are handled elsewhere. */
12878
12879static void
12880do_vfp_nsyn_ldm_stm (int is_dbmode)
12881{
12882 int is_ldm = (inst.instruction & (1 << 20)) != 0;
12883 if (is_ldm)
12884 {
12885 if (is_dbmode)
12886 do_vfp_nsyn_opcode ("fldmdbs");
12887 else
12888 do_vfp_nsyn_opcode ("fldmias");
12889 }
12890 else
12891 {
12892 if (is_dbmode)
12893 do_vfp_nsyn_opcode ("fstmdbs");
12894 else
12895 do_vfp_nsyn_opcode ("fstmias");
12896 }
12897}
12898
037e8744
JB
12899static void
12900do_vfp_nsyn_sqrt (void)
12901{
12902 enum neon_shape rs = neon_select_shape (NS_FF, NS_DD, NS_NULL);
12903 neon_check_type (2, rs, N_EQK | N_VFP, N_F32 | N_F64 | N_KEY | N_VFP);
5f4273c7 12904
037e8744
JB
12905 if (rs == NS_FF)
12906 do_vfp_nsyn_opcode ("fsqrts");
12907 else
12908 do_vfp_nsyn_opcode ("fsqrtd");
12909}
12910
12911static void
12912do_vfp_nsyn_div (void)
12913{
12914 enum neon_shape rs = neon_select_shape (NS_FFF, NS_DDD, NS_NULL);
12915 neon_check_type (3, rs, N_EQK | N_VFP, N_EQK | N_VFP,
12916 N_F32 | N_F64 | N_KEY | N_VFP);
5f4273c7 12917
037e8744
JB
12918 if (rs == NS_FFF)
12919 do_vfp_nsyn_opcode ("fdivs");
12920 else
12921 do_vfp_nsyn_opcode ("fdivd");
12922}
12923
12924static void
12925do_vfp_nsyn_nmul (void)
12926{
12927 enum neon_shape rs = neon_select_shape (NS_FFF, NS_DDD, NS_NULL);
12928 neon_check_type (3, rs, N_EQK | N_VFP, N_EQK | N_VFP,
12929 N_F32 | N_F64 | N_KEY | N_VFP);
5f4273c7 12930
037e8744
JB
12931 if (rs == NS_FFF)
12932 {
88714cb8 12933 NEON_ENCODE (SINGLE, inst);
037e8744
JB
12934 do_vfp_sp_dyadic ();
12935 }
12936 else
12937 {
88714cb8 12938 NEON_ENCODE (DOUBLE, inst);
037e8744
JB
12939 do_vfp_dp_rd_rn_rm ();
12940 }
12941 do_vfp_cond_or_thumb ();
12942}
12943
12944static void
12945do_vfp_nsyn_cmp (void)
12946{
12947 if (inst.operands[1].isreg)
12948 {
12949 enum neon_shape rs = neon_select_shape (NS_FF, NS_DD, NS_NULL);
12950 neon_check_type (2, rs, N_EQK | N_VFP, N_F32 | N_F64 | N_KEY | N_VFP);
5f4273c7 12951
037e8744
JB
12952 if (rs == NS_FF)
12953 {
88714cb8 12954 NEON_ENCODE (SINGLE, inst);
037e8744
JB
12955 do_vfp_sp_monadic ();
12956 }
12957 else
12958 {
88714cb8 12959 NEON_ENCODE (DOUBLE, inst);
037e8744
JB
12960 do_vfp_dp_rd_rm ();
12961 }
12962 }
12963 else
12964 {
12965 enum neon_shape rs = neon_select_shape (NS_FI, NS_DI, NS_NULL);
12966 neon_check_type (2, rs, N_F32 | N_F64 | N_KEY | N_VFP, N_EQK);
12967
12968 switch (inst.instruction & 0x0fffffff)
12969 {
12970 case N_MNEM_vcmp:
12971 inst.instruction += N_MNEM_vcmpz - N_MNEM_vcmp;
12972 break;
12973 case N_MNEM_vcmpe:
12974 inst.instruction += N_MNEM_vcmpez - N_MNEM_vcmpe;
12975 break;
12976 default:
12977 abort ();
12978 }
5f4273c7 12979
037e8744
JB
12980 if (rs == NS_FI)
12981 {
88714cb8 12982 NEON_ENCODE (SINGLE, inst);
037e8744
JB
12983 do_vfp_sp_compare_z ();
12984 }
12985 else
12986 {
88714cb8 12987 NEON_ENCODE (DOUBLE, inst);
037e8744
JB
12988 do_vfp_dp_rd ();
12989 }
12990 }
12991 do_vfp_cond_or_thumb ();
12992}
12993
12994static void
12995nsyn_insert_sp (void)
12996{
12997 inst.operands[1] = inst.operands[0];
12998 memset (&inst.operands[0], '\0', sizeof (inst.operands[0]));
fdfde340 12999 inst.operands[0].reg = REG_SP;
037e8744
JB
13000 inst.operands[0].isreg = 1;
13001 inst.operands[0].writeback = 1;
13002 inst.operands[0].present = 1;
13003}
13004
13005static void
13006do_vfp_nsyn_push (void)
13007{
13008 nsyn_insert_sp ();
13009 if (inst.operands[1].issingle)
13010 do_vfp_nsyn_opcode ("fstmdbs");
13011 else
13012 do_vfp_nsyn_opcode ("fstmdbd");
13013}
13014
13015static void
13016do_vfp_nsyn_pop (void)
13017{
13018 nsyn_insert_sp ();
13019 if (inst.operands[1].issingle)
22b5b651 13020 do_vfp_nsyn_opcode ("fldmias");
037e8744 13021 else
22b5b651 13022 do_vfp_nsyn_opcode ("fldmiad");
037e8744
JB
13023}
13024
13025/* Fix up Neon data-processing instructions, ORing in the correct bits for
13026 ARM mode or Thumb mode and moving the encoded bit 24 to bit 28. */
13027
88714cb8
DG
13028static void
13029neon_dp_fixup (struct arm_it* insn)
037e8744 13030{
88714cb8
DG
13031 unsigned int i = insn->instruction;
13032 insn->is_neon = 1;
13033
037e8744
JB
13034 if (thumb_mode)
13035 {
13036 /* The U bit is at bit 24 by default. Move to bit 28 in Thumb mode. */
13037 if (i & (1 << 24))
13038 i |= 1 << 28;
5f4273c7 13039
037e8744 13040 i &= ~(1 << 24);
5f4273c7 13041
037e8744
JB
13042 i |= 0xef000000;
13043 }
13044 else
13045 i |= 0xf2000000;
5f4273c7 13046
88714cb8 13047 insn->instruction = i;
037e8744
JB
13048}
13049
13050/* Turn a size (8, 16, 32, 64) into the respective bit number minus 3
13051 (0, 1, 2, 3). */
13052
13053static unsigned
13054neon_logbits (unsigned x)
13055{
13056 return ffs (x) - 4;
13057}
13058
13059#define LOW4(R) ((R) & 0xf)
13060#define HI1(R) (((R) >> 4) & 1)
13061
13062/* Encode insns with bit pattern:
13063
13064 |28/24|23|22 |21 20|19 16|15 12|11 8|7|6|5|4|3 0|
13065 | U |x |D |size | Rn | Rd |x x x x|N|Q|M|x| Rm |
5f4273c7 13066
037e8744
JB
13067 SIZE is passed in bits. -1 means size field isn't changed, in case it has a
13068 different meaning for some instruction. */
13069
13070static void
13071neon_three_same (int isquad, int ubit, int size)
13072{
13073 inst.instruction |= LOW4 (inst.operands[0].reg) << 12;
13074 inst.instruction |= HI1 (inst.operands[0].reg) << 22;
13075 inst.instruction |= LOW4 (inst.operands[1].reg) << 16;
13076 inst.instruction |= HI1 (inst.operands[1].reg) << 7;
13077 inst.instruction |= LOW4 (inst.operands[2].reg);
13078 inst.instruction |= HI1 (inst.operands[2].reg) << 5;
13079 inst.instruction |= (isquad != 0) << 6;
13080 inst.instruction |= (ubit != 0) << 24;
13081 if (size != -1)
13082 inst.instruction |= neon_logbits (size) << 20;
5f4273c7 13083
88714cb8 13084 neon_dp_fixup (&inst);
037e8744
JB
13085}
13086
13087/* Encode instructions of the form:
13088
13089 |28/24|23|22|21 20|19 18|17 16|15 12|11 7|6|5|4|3 0|
13090 | U |x |D |x x |size |x x | Rd |x x x x x|Q|M|x| Rm |
5287ad62
JB
13091
13092 Don't write size if SIZE == -1. */
13093
13094static void
13095neon_two_same (int qbit, int ubit, int size)
13096{
13097 inst.instruction |= LOW4 (inst.operands[0].reg) << 12;
13098 inst.instruction |= HI1 (inst.operands[0].reg) << 22;
13099 inst.instruction |= LOW4 (inst.operands[1].reg);
13100 inst.instruction |= HI1 (inst.operands[1].reg) << 5;
13101 inst.instruction |= (qbit != 0) << 6;
13102 inst.instruction |= (ubit != 0) << 24;
13103
13104 if (size != -1)
13105 inst.instruction |= neon_logbits (size) << 18;
13106
88714cb8 13107 neon_dp_fixup (&inst);
5287ad62
JB
13108}
13109
13110/* Neon instruction encoders, in approximate order of appearance. */
13111
13112static void
13113do_neon_dyadic_i_su (void)
13114{
037e8744 13115 enum neon_shape rs = neon_select_shape (NS_DDD, NS_QQQ, NS_NULL);
5287ad62
JB
13116 struct neon_type_el et = neon_check_type (3, rs,
13117 N_EQK, N_EQK, N_SU_32 | N_KEY);
037e8744 13118 neon_three_same (neon_quad (rs), et.type == NT_unsigned, et.size);
5287ad62
JB
13119}
13120
13121static void
13122do_neon_dyadic_i64_su (void)
13123{
037e8744 13124 enum neon_shape rs = neon_select_shape (NS_DDD, NS_QQQ, NS_NULL);
5287ad62
JB
13125 struct neon_type_el et = neon_check_type (3, rs,
13126 N_EQK, N_EQK, N_SU_ALL | N_KEY);
037e8744 13127 neon_three_same (neon_quad (rs), et.type == NT_unsigned, et.size);
5287ad62
JB
13128}
13129
13130static void
13131neon_imm_shift (int write_ubit, int uval, int isquad, struct neon_type_el et,
13132 unsigned immbits)
13133{
13134 unsigned size = et.size >> 3;
13135 inst.instruction |= LOW4 (inst.operands[0].reg) << 12;
13136 inst.instruction |= HI1 (inst.operands[0].reg) << 22;
13137 inst.instruction |= LOW4 (inst.operands[1].reg);
13138 inst.instruction |= HI1 (inst.operands[1].reg) << 5;
13139 inst.instruction |= (isquad != 0) << 6;
13140 inst.instruction |= immbits << 16;
13141 inst.instruction |= (size >> 3) << 7;
13142 inst.instruction |= (size & 0x7) << 19;
13143 if (write_ubit)
13144 inst.instruction |= (uval != 0) << 24;
13145
88714cb8 13146 neon_dp_fixup (&inst);
5287ad62
JB
13147}
13148
13149static void
13150do_neon_shl_imm (void)
13151{
13152 if (!inst.operands[2].isreg)
13153 {
037e8744 13154 enum neon_shape rs = neon_select_shape (NS_DDI, NS_QQI, NS_NULL);
5287ad62 13155 struct neon_type_el et = neon_check_type (2, rs, N_EQK, N_KEY | N_I_ALL);
88714cb8 13156 NEON_ENCODE (IMMED, inst);
037e8744 13157 neon_imm_shift (FALSE, 0, neon_quad (rs), et, inst.operands[2].imm);
5287ad62
JB
13158 }
13159 else
13160 {
037e8744 13161 enum neon_shape rs = neon_select_shape (NS_DDD, NS_QQQ, NS_NULL);
5287ad62
JB
13162 struct neon_type_el et = neon_check_type (3, rs,
13163 N_EQK, N_SU_ALL | N_KEY, N_EQK | N_SGN);
627907b7
JB
13164 unsigned int tmp;
13165
13166 /* VSHL/VQSHL 3-register variants have syntax such as:
13167 vshl.xx Dd, Dm, Dn
13168 whereas other 3-register operations encoded by neon_three_same have
13169 syntax like:
13170 vadd.xx Dd, Dn, Dm
13171 (i.e. with Dn & Dm reversed). Swap operands[1].reg and operands[2].reg
13172 here. */
13173 tmp = inst.operands[2].reg;
13174 inst.operands[2].reg = inst.operands[1].reg;
13175 inst.operands[1].reg = tmp;
88714cb8 13176 NEON_ENCODE (INTEGER, inst);
037e8744 13177 neon_three_same (neon_quad (rs), et.type == NT_unsigned, et.size);
5287ad62
JB
13178 }
13179}
13180
13181static void
13182do_neon_qshl_imm (void)
13183{
13184 if (!inst.operands[2].isreg)
13185 {
037e8744 13186 enum neon_shape rs = neon_select_shape (NS_DDI, NS_QQI, NS_NULL);
5287ad62 13187 struct neon_type_el et = neon_check_type (2, rs, N_EQK, N_SU_ALL | N_KEY);
627907b7 13188
88714cb8 13189 NEON_ENCODE (IMMED, inst);
037e8744 13190 neon_imm_shift (TRUE, et.type == NT_unsigned, neon_quad (rs), et,
5287ad62
JB
13191 inst.operands[2].imm);
13192 }
13193 else
13194 {
037e8744 13195 enum neon_shape rs = neon_select_shape (NS_DDD, NS_QQQ, NS_NULL);
5287ad62
JB
13196 struct neon_type_el et = neon_check_type (3, rs,
13197 N_EQK, N_SU_ALL | N_KEY, N_EQK | N_SGN);
627907b7
JB
13198 unsigned int tmp;
13199
13200 /* See note in do_neon_shl_imm. */
13201 tmp = inst.operands[2].reg;
13202 inst.operands[2].reg = inst.operands[1].reg;
13203 inst.operands[1].reg = tmp;
88714cb8 13204 NEON_ENCODE (INTEGER, inst);
037e8744 13205 neon_three_same (neon_quad (rs), et.type == NT_unsigned, et.size);
5287ad62
JB
13206 }
13207}
13208
627907b7
JB
13209static void
13210do_neon_rshl (void)
13211{
13212 enum neon_shape rs = neon_select_shape (NS_DDD, NS_QQQ, NS_NULL);
13213 struct neon_type_el et = neon_check_type (3, rs,
13214 N_EQK, N_EQK, N_SU_ALL | N_KEY);
13215 unsigned int tmp;
13216
13217 tmp = inst.operands[2].reg;
13218 inst.operands[2].reg = inst.operands[1].reg;
13219 inst.operands[1].reg = tmp;
13220 neon_three_same (neon_quad (rs), et.type == NT_unsigned, et.size);
13221}
13222
5287ad62
JB
13223static int
13224neon_cmode_for_logic_imm (unsigned immediate, unsigned *immbits, int size)
13225{
036dc3f7
PB
13226 /* Handle .I8 pseudo-instructions. */
13227 if (size == 8)
5287ad62 13228 {
5287ad62
JB
13229 /* Unfortunately, this will make everything apart from zero out-of-range.
13230 FIXME is this the intended semantics? There doesn't seem much point in
13231 accepting .I8 if so. */
13232 immediate |= immediate << 8;
13233 size = 16;
036dc3f7
PB
13234 }
13235
13236 if (size >= 32)
13237 {
13238 if (immediate == (immediate & 0x000000ff))
13239 {
13240 *immbits = immediate;
13241 return 0x1;
13242 }
13243 else if (immediate == (immediate & 0x0000ff00))
13244 {
13245 *immbits = immediate >> 8;
13246 return 0x3;
13247 }
13248 else if (immediate == (immediate & 0x00ff0000))
13249 {
13250 *immbits = immediate >> 16;
13251 return 0x5;
13252 }
13253 else if (immediate == (immediate & 0xff000000))
13254 {
13255 *immbits = immediate >> 24;
13256 return 0x7;
13257 }
13258 if ((immediate & 0xffff) != (immediate >> 16))
13259 goto bad_immediate;
13260 immediate &= 0xffff;
5287ad62
JB
13261 }
13262
13263 if (immediate == (immediate & 0x000000ff))
13264 {
13265 *immbits = immediate;
036dc3f7 13266 return 0x9;
5287ad62
JB
13267 }
13268 else if (immediate == (immediate & 0x0000ff00))
13269 {
13270 *immbits = immediate >> 8;
036dc3f7 13271 return 0xb;
5287ad62
JB
13272 }
13273
13274 bad_immediate:
dcbf9037 13275 first_error (_("immediate value out of range"));
5287ad62
JB
13276 return FAIL;
13277}
13278
13279/* True if IMM has form 0bAAAAAAAABBBBBBBBCCCCCCCCDDDDDDDD for bits
13280 A, B, C, D. */
13281
13282static int
13283neon_bits_same_in_bytes (unsigned imm)
13284{
13285 return ((imm & 0x000000ff) == 0 || (imm & 0x000000ff) == 0x000000ff)
13286 && ((imm & 0x0000ff00) == 0 || (imm & 0x0000ff00) == 0x0000ff00)
13287 && ((imm & 0x00ff0000) == 0 || (imm & 0x00ff0000) == 0x00ff0000)
13288 && ((imm & 0xff000000) == 0 || (imm & 0xff000000) == 0xff000000);
13289}
13290
13291/* For immediate of above form, return 0bABCD. */
13292
13293static unsigned
13294neon_squash_bits (unsigned imm)
13295{
13296 return (imm & 0x01) | ((imm & 0x0100) >> 7) | ((imm & 0x010000) >> 14)
13297 | ((imm & 0x01000000) >> 21);
13298}
13299
136da414 13300/* Compress quarter-float representation to 0b...000 abcdefgh. */
5287ad62
JB
13301
13302static unsigned
13303neon_qfloat_bits (unsigned imm)
13304{
136da414 13305 return ((imm >> 19) & 0x7f) | ((imm >> 24) & 0x80);
5287ad62
JB
13306}
13307
13308/* Returns CMODE. IMMBITS [7:0] is set to bits suitable for inserting into
13309 the instruction. *OP is passed as the initial value of the op field, and
13310 may be set to a different value depending on the constant (i.e.
13311 "MOV I64, 0bAAAAAAAABBBB..." which uses OP = 1 despite being MOV not
5f4273c7 13312 MVN). If the immediate looks like a repeated pattern then also
036dc3f7 13313 try smaller element sizes. */
5287ad62
JB
13314
13315static int
c96612cc
JB
13316neon_cmode_for_move_imm (unsigned immlo, unsigned immhi, int float_p,
13317 unsigned *immbits, int *op, int size,
13318 enum neon_el_type type)
5287ad62 13319{
c96612cc
JB
13320 /* Only permit float immediates (including 0.0/-0.0) if the operand type is
13321 float. */
13322 if (type == NT_float && !float_p)
13323 return FAIL;
13324
136da414
JB
13325 if (type == NT_float && is_quarter_float (immlo) && immhi == 0)
13326 {
13327 if (size != 32 || *op == 1)
13328 return FAIL;
13329 *immbits = neon_qfloat_bits (immlo);
13330 return 0xf;
13331 }
036dc3f7
PB
13332
13333 if (size == 64)
5287ad62 13334 {
036dc3f7
PB
13335 if (neon_bits_same_in_bytes (immhi)
13336 && neon_bits_same_in_bytes (immlo))
13337 {
13338 if (*op == 1)
13339 return FAIL;
13340 *immbits = (neon_squash_bits (immhi) << 4)
13341 | neon_squash_bits (immlo);
13342 *op = 1;
13343 return 0xe;
13344 }
13345
13346 if (immhi != immlo)
13347 return FAIL;
5287ad62 13348 }
036dc3f7
PB
13349
13350 if (size >= 32)
5287ad62 13351 {
036dc3f7
PB
13352 if (immlo == (immlo & 0x000000ff))
13353 {
13354 *immbits = immlo;
13355 return 0x0;
13356 }
13357 else if (immlo == (immlo & 0x0000ff00))
13358 {
13359 *immbits = immlo >> 8;
13360 return 0x2;
13361 }
13362 else if (immlo == (immlo & 0x00ff0000))
13363 {
13364 *immbits = immlo >> 16;
13365 return 0x4;
13366 }
13367 else if (immlo == (immlo & 0xff000000))
13368 {
13369 *immbits = immlo >> 24;
13370 return 0x6;
13371 }
13372 else if (immlo == ((immlo & 0x0000ff00) | 0x000000ff))
13373 {
13374 *immbits = (immlo >> 8) & 0xff;
13375 return 0xc;
13376 }
13377 else if (immlo == ((immlo & 0x00ff0000) | 0x0000ffff))
13378 {
13379 *immbits = (immlo >> 16) & 0xff;
13380 return 0xd;
13381 }
13382
13383 if ((immlo & 0xffff) != (immlo >> 16))
13384 return FAIL;
13385 immlo &= 0xffff;
5287ad62 13386 }
036dc3f7
PB
13387
13388 if (size >= 16)
5287ad62 13389 {
036dc3f7
PB
13390 if (immlo == (immlo & 0x000000ff))
13391 {
13392 *immbits = immlo;
13393 return 0x8;
13394 }
13395 else if (immlo == (immlo & 0x0000ff00))
13396 {
13397 *immbits = immlo >> 8;
13398 return 0xa;
13399 }
13400
13401 if ((immlo & 0xff) != (immlo >> 8))
13402 return FAIL;
13403 immlo &= 0xff;
5287ad62 13404 }
036dc3f7
PB
13405
13406 if (immlo == (immlo & 0x000000ff))
5287ad62 13407 {
036dc3f7
PB
13408 /* Don't allow MVN with 8-bit immediate. */
13409 if (*op == 1)
13410 return FAIL;
13411 *immbits = immlo;
13412 return 0xe;
5287ad62 13413 }
5287ad62
JB
13414
13415 return FAIL;
13416}
13417
13418/* Write immediate bits [7:0] to the following locations:
13419
13420 |28/24|23 19|18 16|15 4|3 0|
13421 | 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|
13422
13423 This function is used by VMOV/VMVN/VORR/VBIC. */
13424
13425static void
13426neon_write_immbits (unsigned immbits)
13427{
13428 inst.instruction |= immbits & 0xf;
13429 inst.instruction |= ((immbits >> 4) & 0x7) << 16;
13430 inst.instruction |= ((immbits >> 7) & 0x1) << 24;
13431}
13432
13433/* Invert low-order SIZE bits of XHI:XLO. */
13434
13435static void
13436neon_invert_size (unsigned *xlo, unsigned *xhi, int size)
13437{
13438 unsigned immlo = xlo ? *xlo : 0;
13439 unsigned immhi = xhi ? *xhi : 0;
13440
13441 switch (size)
13442 {
13443 case 8:
13444 immlo = (~immlo) & 0xff;
13445 break;
13446
13447 case 16:
13448 immlo = (~immlo) & 0xffff;
13449 break;
13450
13451 case 64:
13452 immhi = (~immhi) & 0xffffffff;
13453 /* fall through. */
13454
13455 case 32:
13456 immlo = (~immlo) & 0xffffffff;
13457 break;
13458
13459 default:
13460 abort ();
13461 }
13462
13463 if (xlo)
13464 *xlo = immlo;
13465
13466 if (xhi)
13467 *xhi = immhi;
13468}
13469
13470static void
13471do_neon_logic (void)
13472{
13473 if (inst.operands[2].present && inst.operands[2].isreg)
13474 {
037e8744 13475 enum neon_shape rs = neon_select_shape (NS_DDD, NS_QQQ, NS_NULL);
5287ad62
JB
13476 neon_check_type (3, rs, N_IGNORE_TYPE);
13477 /* U bit and size field were set as part of the bitmask. */
88714cb8 13478 NEON_ENCODE (INTEGER, inst);
037e8744 13479 neon_three_same (neon_quad (rs), 0, -1);
5287ad62
JB
13480 }
13481 else
13482 {
4316f0d2
DG
13483 const int three_ops_form = (inst.operands[2].present
13484 && !inst.operands[2].isreg);
13485 const int immoperand = (three_ops_form ? 2 : 1);
13486 enum neon_shape rs = (three_ops_form
13487 ? neon_select_shape (NS_DDI, NS_QQI, NS_NULL)
13488 : neon_select_shape (NS_DI, NS_QI, NS_NULL));
037e8744
JB
13489 struct neon_type_el et = neon_check_type (2, rs,
13490 N_I8 | N_I16 | N_I32 | N_I64 | N_F32 | N_KEY, N_EQK);
21d799b5 13491 enum neon_opc opcode = (enum neon_opc) inst.instruction & 0x0fffffff;
5287ad62
JB
13492 unsigned immbits;
13493 int cmode;
5f4273c7 13494
5287ad62
JB
13495 if (et.type == NT_invtype)
13496 return;
5f4273c7 13497
4316f0d2
DG
13498 if (three_ops_form)
13499 constraint (inst.operands[0].reg != inst.operands[1].reg,
13500 _("first and second operands shall be the same register"));
13501
88714cb8 13502 NEON_ENCODE (IMMED, inst);
5287ad62 13503
4316f0d2 13504 immbits = inst.operands[immoperand].imm;
036dc3f7
PB
13505 if (et.size == 64)
13506 {
13507 /* .i64 is a pseudo-op, so the immediate must be a repeating
13508 pattern. */
4316f0d2
DG
13509 if (immbits != (inst.operands[immoperand].regisimm ?
13510 inst.operands[immoperand].reg : 0))
036dc3f7
PB
13511 {
13512 /* Set immbits to an invalid constant. */
13513 immbits = 0xdeadbeef;
13514 }
13515 }
13516
5287ad62
JB
13517 switch (opcode)
13518 {
13519 case N_MNEM_vbic:
036dc3f7 13520 cmode = neon_cmode_for_logic_imm (immbits, &immbits, et.size);
5287ad62 13521 break;
5f4273c7 13522
5287ad62 13523 case N_MNEM_vorr:
036dc3f7 13524 cmode = neon_cmode_for_logic_imm (immbits, &immbits, et.size);
5287ad62 13525 break;
5f4273c7 13526
5287ad62
JB
13527 case N_MNEM_vand:
13528 /* Pseudo-instruction for VBIC. */
5287ad62
JB
13529 neon_invert_size (&immbits, 0, et.size);
13530 cmode = neon_cmode_for_logic_imm (immbits, &immbits, et.size);
13531 break;
5f4273c7 13532
5287ad62
JB
13533 case N_MNEM_vorn:
13534 /* Pseudo-instruction for VORR. */
5287ad62
JB
13535 neon_invert_size (&immbits, 0, et.size);
13536 cmode = neon_cmode_for_logic_imm (immbits, &immbits, et.size);
13537 break;
5f4273c7 13538
5287ad62
JB
13539 default:
13540 abort ();
13541 }
13542
13543 if (cmode == FAIL)
13544 return;
13545
037e8744 13546 inst.instruction |= neon_quad (rs) << 6;
5287ad62
JB
13547 inst.instruction |= LOW4 (inst.operands[0].reg) << 12;
13548 inst.instruction |= HI1 (inst.operands[0].reg) << 22;
13549 inst.instruction |= cmode << 8;
13550 neon_write_immbits (immbits);
5f4273c7 13551
88714cb8 13552 neon_dp_fixup (&inst);
5287ad62
JB
13553 }
13554}
13555
13556static void
13557do_neon_bitfield (void)
13558{
037e8744 13559 enum neon_shape rs = neon_select_shape (NS_DDD, NS_QQQ, NS_NULL);
dcbf9037 13560 neon_check_type (3, rs, N_IGNORE_TYPE);
037e8744 13561 neon_three_same (neon_quad (rs), 0, -1);
5287ad62
JB
13562}
13563
13564static void
dcbf9037
JB
13565neon_dyadic_misc (enum neon_el_type ubit_meaning, unsigned types,
13566 unsigned destbits)
5287ad62 13567{
037e8744 13568 enum neon_shape rs = neon_select_shape (NS_DDD, NS_QQQ, NS_NULL);
dcbf9037
JB
13569 struct neon_type_el et = neon_check_type (3, rs, N_EQK | destbits, N_EQK,
13570 types | N_KEY);
5287ad62
JB
13571 if (et.type == NT_float)
13572 {
88714cb8 13573 NEON_ENCODE (FLOAT, inst);
037e8744 13574 neon_three_same (neon_quad (rs), 0, -1);
5287ad62
JB
13575 }
13576 else
13577 {
88714cb8 13578 NEON_ENCODE (INTEGER, inst);
037e8744 13579 neon_three_same (neon_quad (rs), et.type == ubit_meaning, et.size);
5287ad62
JB
13580 }
13581}
13582
13583static void
13584do_neon_dyadic_if_su (void)
13585{
dcbf9037 13586 neon_dyadic_misc (NT_unsigned, N_SUF_32, 0);
5287ad62
JB
13587}
13588
13589static void
13590do_neon_dyadic_if_su_d (void)
13591{
13592 /* This version only allow D registers, but that constraint is enforced during
13593 operand parsing so we don't need to do anything extra here. */
dcbf9037 13594 neon_dyadic_misc (NT_unsigned, N_SUF_32, 0);
5287ad62
JB
13595}
13596
5287ad62
JB
13597static void
13598do_neon_dyadic_if_i_d (void)
13599{
428e3f1f
PB
13600 /* The "untyped" case can't happen. Do this to stop the "U" bit being
13601 affected if we specify unsigned args. */
13602 neon_dyadic_misc (NT_untyped, N_IF_32, 0);
5287ad62
JB
13603}
13604
037e8744
JB
13605enum vfp_or_neon_is_neon_bits
13606{
13607 NEON_CHECK_CC = 1,
13608 NEON_CHECK_ARCH = 2
13609};
13610
13611/* Call this function if an instruction which may have belonged to the VFP or
13612 Neon instruction sets, but turned out to be a Neon instruction (due to the
13613 operand types involved, etc.). We have to check and/or fix-up a couple of
13614 things:
13615
13616 - Make sure the user hasn't attempted to make a Neon instruction
13617 conditional.
13618 - Alter the value in the condition code field if necessary.
13619 - Make sure that the arch supports Neon instructions.
13620
13621 Which of these operations take place depends on bits from enum
13622 vfp_or_neon_is_neon_bits.
13623
13624 WARNING: This function has side effects! If NEON_CHECK_CC is used and the
13625 current instruction's condition is COND_ALWAYS, the condition field is
13626 changed to inst.uncond_value. This is necessary because instructions shared
13627 between VFP and Neon may be conditional for the VFP variants only, and the
13628 unconditional Neon version must have, e.g., 0xF in the condition field. */
13629
13630static int
13631vfp_or_neon_is_neon (unsigned check)
13632{
13633 /* Conditions are always legal in Thumb mode (IT blocks). */
13634 if (!thumb_mode && (check & NEON_CHECK_CC))
13635 {
13636 if (inst.cond != COND_ALWAYS)
13637 {
13638 first_error (_(BAD_COND));
13639 return FAIL;
13640 }
13641 if (inst.uncond_value != -1)
13642 inst.instruction |= inst.uncond_value << 28;
13643 }
5f4273c7 13644
037e8744
JB
13645 if ((check & NEON_CHECK_ARCH)
13646 && !ARM_CPU_HAS_FEATURE (cpu_variant, fpu_neon_ext_v1))
13647 {
13648 first_error (_(BAD_FPU));
13649 return FAIL;
13650 }
5f4273c7 13651
037e8744
JB
13652 return SUCCESS;
13653}
13654
5287ad62
JB
13655static void
13656do_neon_addsub_if_i (void)
13657{
037e8744
JB
13658 if (try_vfp_nsyn (3, do_vfp_nsyn_add_sub) == SUCCESS)
13659 return;
13660
13661 if (vfp_or_neon_is_neon (NEON_CHECK_CC | NEON_CHECK_ARCH) == FAIL)
13662 return;
13663
5287ad62
JB
13664 /* The "untyped" case can't happen. Do this to stop the "U" bit being
13665 affected if we specify unsigned args. */
dcbf9037 13666 neon_dyadic_misc (NT_untyped, N_IF_32 | N_I64, 0);
5287ad62
JB
13667}
13668
13669/* Swaps operands 1 and 2. If operand 1 (optional arg) was omitted, we want the
13670 result to be:
13671 V<op> A,B (A is operand 0, B is operand 2)
13672 to mean:
13673 V<op> A,B,A
13674 not:
13675 V<op> A,B,B
13676 so handle that case specially. */
13677
13678static void
13679neon_exchange_operands (void)
13680{
13681 void *scratch = alloca (sizeof (inst.operands[0]));
13682 if (inst.operands[1].present)
13683 {
13684 /* Swap operands[1] and operands[2]. */
13685 memcpy (scratch, &inst.operands[1], sizeof (inst.operands[0]));
13686 inst.operands[1] = inst.operands[2];
13687 memcpy (&inst.operands[2], scratch, sizeof (inst.operands[0]));
13688 }
13689 else
13690 {
13691 inst.operands[1] = inst.operands[2];
13692 inst.operands[2] = inst.operands[0];
13693 }
13694}
13695
13696static void
13697neon_compare (unsigned regtypes, unsigned immtypes, int invert)
13698{
13699 if (inst.operands[2].isreg)
13700 {
13701 if (invert)
13702 neon_exchange_operands ();
dcbf9037 13703 neon_dyadic_misc (NT_unsigned, regtypes, N_SIZ);
5287ad62
JB
13704 }
13705 else
13706 {
037e8744 13707 enum neon_shape rs = neon_select_shape (NS_DDI, NS_QQI, NS_NULL);
dcbf9037
JB
13708 struct neon_type_el et = neon_check_type (2, rs,
13709 N_EQK | N_SIZ, immtypes | N_KEY);
5287ad62 13710
88714cb8 13711 NEON_ENCODE (IMMED, inst);
5287ad62
JB
13712 inst.instruction |= LOW4 (inst.operands[0].reg) << 12;
13713 inst.instruction |= HI1 (inst.operands[0].reg) << 22;
13714 inst.instruction |= LOW4 (inst.operands[1].reg);
13715 inst.instruction |= HI1 (inst.operands[1].reg) << 5;
037e8744 13716 inst.instruction |= neon_quad (rs) << 6;
5287ad62
JB
13717 inst.instruction |= (et.type == NT_float) << 10;
13718 inst.instruction |= neon_logbits (et.size) << 18;
5f4273c7 13719
88714cb8 13720 neon_dp_fixup (&inst);
5287ad62
JB
13721 }
13722}
13723
13724static void
13725do_neon_cmp (void)
13726{
13727 neon_compare (N_SUF_32, N_S8 | N_S16 | N_S32 | N_F32, FALSE);
13728}
13729
13730static void
13731do_neon_cmp_inv (void)
13732{
13733 neon_compare (N_SUF_32, N_S8 | N_S16 | N_S32 | N_F32, TRUE);
13734}
13735
13736static void
13737do_neon_ceq (void)
13738{
13739 neon_compare (N_IF_32, N_IF_32, FALSE);
13740}
13741
13742/* For multiply instructions, we have the possibility of 16-bit or 32-bit
13743 scalars, which are encoded in 5 bits, M : Rm.
13744 For 16-bit scalars, the register is encoded in Rm[2:0] and the index in
13745 M:Rm[3], and for 32-bit scalars, the register is encoded in Rm[3:0] and the
13746 index in M. */
13747
13748static unsigned
13749neon_scalar_for_mul (unsigned scalar, unsigned elsize)
13750{
dcbf9037
JB
13751 unsigned regno = NEON_SCALAR_REG (scalar);
13752 unsigned elno = NEON_SCALAR_INDEX (scalar);
5287ad62
JB
13753
13754 switch (elsize)
13755 {
13756 case 16:
13757 if (regno > 7 || elno > 3)
13758 goto bad_scalar;
13759 return regno | (elno << 3);
5f4273c7 13760
5287ad62
JB
13761 case 32:
13762 if (regno > 15 || elno > 1)
13763 goto bad_scalar;
13764 return regno | (elno << 4);
13765
13766 default:
13767 bad_scalar:
dcbf9037 13768 first_error (_("scalar out of range for multiply instruction"));
5287ad62
JB
13769 }
13770
13771 return 0;
13772}
13773
13774/* Encode multiply / multiply-accumulate scalar instructions. */
13775
13776static void
13777neon_mul_mac (struct neon_type_el et, int ubit)
13778{
dcbf9037
JB
13779 unsigned scalar;
13780
13781 /* Give a more helpful error message if we have an invalid type. */
13782 if (et.type == NT_invtype)
13783 return;
5f4273c7 13784
dcbf9037 13785 scalar = neon_scalar_for_mul (inst.operands[2].reg, et.size);
5287ad62
JB
13786 inst.instruction |= LOW4 (inst.operands[0].reg) << 12;
13787 inst.instruction |= HI1 (inst.operands[0].reg) << 22;
13788 inst.instruction |= LOW4 (inst.operands[1].reg) << 16;
13789 inst.instruction |= HI1 (inst.operands[1].reg) << 7;
13790 inst.instruction |= LOW4 (scalar);
13791 inst.instruction |= HI1 (scalar) << 5;
13792 inst.instruction |= (et.type == NT_float) << 8;
13793 inst.instruction |= neon_logbits (et.size) << 20;
13794 inst.instruction |= (ubit != 0) << 24;
13795
88714cb8 13796 neon_dp_fixup (&inst);
5287ad62
JB
13797}
13798
13799static void
13800do_neon_mac_maybe_scalar (void)
13801{
037e8744
JB
13802 if (try_vfp_nsyn (3, do_vfp_nsyn_mla_mls) == SUCCESS)
13803 return;
13804
13805 if (vfp_or_neon_is_neon (NEON_CHECK_CC | NEON_CHECK_ARCH) == FAIL)
13806 return;
13807
5287ad62
JB
13808 if (inst.operands[2].isscalar)
13809 {
037e8744 13810 enum neon_shape rs = neon_select_shape (NS_DDS, NS_QQS, NS_NULL);
5287ad62
JB
13811 struct neon_type_el et = neon_check_type (3, rs,
13812 N_EQK, N_EQK, N_I16 | N_I32 | N_F32 | N_KEY);
88714cb8 13813 NEON_ENCODE (SCALAR, inst);
037e8744 13814 neon_mul_mac (et, neon_quad (rs));
5287ad62
JB
13815 }
13816 else
428e3f1f
PB
13817 {
13818 /* The "untyped" case can't happen. Do this to stop the "U" bit being
13819 affected if we specify unsigned args. */
13820 neon_dyadic_misc (NT_untyped, N_IF_32, 0);
13821 }
5287ad62
JB
13822}
13823
62f3b8c8
PB
13824static void
13825do_neon_fmac (void)
13826{
13827 if (try_vfp_nsyn (3, do_vfp_nsyn_fma_fms) == SUCCESS)
13828 return;
13829
13830 if (vfp_or_neon_is_neon (NEON_CHECK_CC | NEON_CHECK_ARCH) == FAIL)
13831 return;
13832
13833 neon_dyadic_misc (NT_untyped, N_IF_32, 0);
13834}
13835
5287ad62
JB
13836static void
13837do_neon_tst (void)
13838{
037e8744 13839 enum neon_shape rs = neon_select_shape (NS_DDD, NS_QQQ, NS_NULL);
5287ad62
JB
13840 struct neon_type_el et = neon_check_type (3, rs,
13841 N_EQK, N_EQK, N_8 | N_16 | N_32 | N_KEY);
037e8744 13842 neon_three_same (neon_quad (rs), 0, et.size);
5287ad62
JB
13843}
13844
13845/* VMUL with 3 registers allows the P8 type. The scalar version supports the
13846 same types as the MAC equivalents. The polynomial type for this instruction
13847 is encoded the same as the integer type. */
13848
13849static void
13850do_neon_mul (void)
13851{
037e8744
JB
13852 if (try_vfp_nsyn (3, do_vfp_nsyn_mul) == SUCCESS)
13853 return;
13854
13855 if (vfp_or_neon_is_neon (NEON_CHECK_CC | NEON_CHECK_ARCH) == FAIL)
13856 return;
13857
5287ad62
JB
13858 if (inst.operands[2].isscalar)
13859 do_neon_mac_maybe_scalar ();
13860 else
dcbf9037 13861 neon_dyadic_misc (NT_poly, N_I8 | N_I16 | N_I32 | N_F32 | N_P8, 0);
5287ad62
JB
13862}
13863
13864static void
13865do_neon_qdmulh (void)
13866{
13867 if (inst.operands[2].isscalar)
13868 {
037e8744 13869 enum neon_shape rs = neon_select_shape (NS_DDS, NS_QQS, NS_NULL);
5287ad62
JB
13870 struct neon_type_el et = neon_check_type (3, rs,
13871 N_EQK, N_EQK, N_S16 | N_S32 | N_KEY);
88714cb8 13872 NEON_ENCODE (SCALAR, inst);
037e8744 13873 neon_mul_mac (et, neon_quad (rs));
5287ad62
JB
13874 }
13875 else
13876 {
037e8744 13877 enum neon_shape rs = neon_select_shape (NS_DDD, NS_QQQ, NS_NULL);
5287ad62
JB
13878 struct neon_type_el et = neon_check_type (3, rs,
13879 N_EQK, N_EQK, N_S16 | N_S32 | N_KEY);
88714cb8 13880 NEON_ENCODE (INTEGER, inst);
5287ad62 13881 /* The U bit (rounding) comes from bit mask. */
037e8744 13882 neon_three_same (neon_quad (rs), 0, et.size);
5287ad62
JB
13883 }
13884}
13885
13886static void
13887do_neon_fcmp_absolute (void)
13888{
037e8744 13889 enum neon_shape rs = neon_select_shape (NS_DDD, NS_QQQ, NS_NULL);
5287ad62
JB
13890 neon_check_type (3, rs, N_EQK, N_EQK, N_F32 | N_KEY);
13891 /* Size field comes from bit mask. */
037e8744 13892 neon_three_same (neon_quad (rs), 1, -1);
5287ad62
JB
13893}
13894
13895static void
13896do_neon_fcmp_absolute_inv (void)
13897{
13898 neon_exchange_operands ();
13899 do_neon_fcmp_absolute ();
13900}
13901
13902static void
13903do_neon_step (void)
13904{
037e8744 13905 enum neon_shape rs = neon_select_shape (NS_DDD, NS_QQQ, NS_NULL);
5287ad62 13906 neon_check_type (3, rs, N_EQK, N_EQK, N_F32 | N_KEY);
037e8744 13907 neon_three_same (neon_quad (rs), 0, -1);
5287ad62
JB
13908}
13909
13910static void
13911do_neon_abs_neg (void)
13912{
037e8744
JB
13913 enum neon_shape rs;
13914 struct neon_type_el et;
5f4273c7 13915
037e8744
JB
13916 if (try_vfp_nsyn (2, do_vfp_nsyn_abs_neg) == SUCCESS)
13917 return;
13918
13919 if (vfp_or_neon_is_neon (NEON_CHECK_CC | NEON_CHECK_ARCH) == FAIL)
13920 return;
13921
13922 rs = neon_select_shape (NS_DD, NS_QQ, NS_NULL);
13923 et = neon_check_type (2, rs, N_EQK, N_S8 | N_S16 | N_S32 | N_F32 | N_KEY);
5f4273c7 13924
5287ad62
JB
13925 inst.instruction |= LOW4 (inst.operands[0].reg) << 12;
13926 inst.instruction |= HI1 (inst.operands[0].reg) << 22;
13927 inst.instruction |= LOW4 (inst.operands[1].reg);
13928 inst.instruction |= HI1 (inst.operands[1].reg) << 5;
037e8744 13929 inst.instruction |= neon_quad (rs) << 6;
5287ad62
JB
13930 inst.instruction |= (et.type == NT_float) << 10;
13931 inst.instruction |= neon_logbits (et.size) << 18;
5f4273c7 13932
88714cb8 13933 neon_dp_fixup (&inst);
5287ad62
JB
13934}
13935
13936static void
13937do_neon_sli (void)
13938{
037e8744 13939 enum neon_shape rs = neon_select_shape (NS_DDI, NS_QQI, NS_NULL);
5287ad62
JB
13940 struct neon_type_el et = neon_check_type (2, rs,
13941 N_EQK, N_8 | N_16 | N_32 | N_64 | N_KEY);
13942 int imm = inst.operands[2].imm;
13943 constraint (imm < 0 || (unsigned)imm >= et.size,
13944 _("immediate out of range for insert"));
037e8744 13945 neon_imm_shift (FALSE, 0, neon_quad (rs), et, imm);
5287ad62
JB
13946}
13947
13948static void
13949do_neon_sri (void)
13950{
037e8744 13951 enum neon_shape rs = neon_select_shape (NS_DDI, NS_QQI, NS_NULL);
5287ad62
JB
13952 struct neon_type_el et = neon_check_type (2, rs,
13953 N_EQK, N_8 | N_16 | N_32 | N_64 | N_KEY);
13954 int imm = inst.operands[2].imm;
13955 constraint (imm < 1 || (unsigned)imm > et.size,
13956 _("immediate out of range for insert"));
037e8744 13957 neon_imm_shift (FALSE, 0, neon_quad (rs), et, et.size - imm);
5287ad62
JB
13958}
13959
13960static void
13961do_neon_qshlu_imm (void)
13962{
037e8744 13963 enum neon_shape rs = neon_select_shape (NS_DDI, NS_QQI, NS_NULL);
5287ad62
JB
13964 struct neon_type_el et = neon_check_type (2, rs,
13965 N_EQK | N_UNS, N_S8 | N_S16 | N_S32 | N_S64 | N_KEY);
13966 int imm = inst.operands[2].imm;
13967 constraint (imm < 0 || (unsigned)imm >= et.size,
13968 _("immediate out of range for shift"));
13969 /* Only encodes the 'U present' variant of the instruction.
13970 In this case, signed types have OP (bit 8) set to 0.
13971 Unsigned types have OP set to 1. */
13972 inst.instruction |= (et.type == NT_unsigned) << 8;
13973 /* The rest of the bits are the same as other immediate shifts. */
037e8744 13974 neon_imm_shift (FALSE, 0, neon_quad (rs), et, imm);
5287ad62
JB
13975}
13976
13977static void
13978do_neon_qmovn (void)
13979{
13980 struct neon_type_el et = neon_check_type (2, NS_DQ,
13981 N_EQK | N_HLF, N_SU_16_64 | N_KEY);
13982 /* Saturating move where operands can be signed or unsigned, and the
13983 destination has the same signedness. */
88714cb8 13984 NEON_ENCODE (INTEGER, inst);
5287ad62
JB
13985 if (et.type == NT_unsigned)
13986 inst.instruction |= 0xc0;
13987 else
13988 inst.instruction |= 0x80;
13989 neon_two_same (0, 1, et.size / 2);
13990}
13991
13992static void
13993do_neon_qmovun (void)
13994{
13995 struct neon_type_el et = neon_check_type (2, NS_DQ,
13996 N_EQK | N_HLF | N_UNS, N_S16 | N_S32 | N_S64 | N_KEY);
13997 /* Saturating move with unsigned results. Operands must be signed. */
88714cb8 13998 NEON_ENCODE (INTEGER, inst);
5287ad62
JB
13999 neon_two_same (0, 1, et.size / 2);
14000}
14001
14002static void
14003do_neon_rshift_sat_narrow (void)
14004{
14005 /* FIXME: Types for narrowing. If operands are signed, results can be signed
14006 or unsigned. If operands are unsigned, results must also be unsigned. */
14007 struct neon_type_el et = neon_check_type (2, NS_DQI,
14008 N_EQK | N_HLF, N_SU_16_64 | N_KEY);
14009 int imm = inst.operands[2].imm;
14010 /* This gets the bounds check, size encoding and immediate bits calculation
14011 right. */
14012 et.size /= 2;
5f4273c7 14013
5287ad62
JB
14014 /* VQ{R}SHRN.I<size> <Dd>, <Qm>, #0 is a synonym for
14015 VQMOVN.I<size> <Dd>, <Qm>. */
14016 if (imm == 0)
14017 {
14018 inst.operands[2].present = 0;
14019 inst.instruction = N_MNEM_vqmovn;
14020 do_neon_qmovn ();
14021 return;
14022 }
5f4273c7 14023
5287ad62
JB
14024 constraint (imm < 1 || (unsigned)imm > et.size,
14025 _("immediate out of range"));
14026 neon_imm_shift (TRUE, et.type == NT_unsigned, 0, et, et.size - imm);
14027}
14028
14029static void
14030do_neon_rshift_sat_narrow_u (void)
14031{
14032 /* FIXME: Types for narrowing. If operands are signed, results can be signed
14033 or unsigned. If operands are unsigned, results must also be unsigned. */
14034 struct neon_type_el et = neon_check_type (2, NS_DQI,
14035 N_EQK | N_HLF | N_UNS, N_S16 | N_S32 | N_S64 | N_KEY);
14036 int imm = inst.operands[2].imm;
14037 /* This gets the bounds check, size encoding and immediate bits calculation
14038 right. */
14039 et.size /= 2;
14040
14041 /* VQSHRUN.I<size> <Dd>, <Qm>, #0 is a synonym for
14042 VQMOVUN.I<size> <Dd>, <Qm>. */
14043 if (imm == 0)
14044 {
14045 inst.operands[2].present = 0;
14046 inst.instruction = N_MNEM_vqmovun;
14047 do_neon_qmovun ();
14048 return;
14049 }
14050
14051 constraint (imm < 1 || (unsigned)imm > et.size,
14052 _("immediate out of range"));
14053 /* FIXME: The manual is kind of unclear about what value U should have in
14054 VQ{R}SHRUN instructions, but U=0, op=0 definitely encodes VRSHR, so it
14055 must be 1. */
14056 neon_imm_shift (TRUE, 1, 0, et, et.size - imm);
14057}
14058
14059static void
14060do_neon_movn (void)
14061{
14062 struct neon_type_el et = neon_check_type (2, NS_DQ,
14063 N_EQK | N_HLF, N_I16 | N_I32 | N_I64 | N_KEY);
88714cb8 14064 NEON_ENCODE (INTEGER, inst);
5287ad62
JB
14065 neon_two_same (0, 1, et.size / 2);
14066}
14067
14068static void
14069do_neon_rshift_narrow (void)
14070{
14071 struct neon_type_el et = neon_check_type (2, NS_DQI,
14072 N_EQK | N_HLF, N_I16 | N_I32 | N_I64 | N_KEY);
14073 int imm = inst.operands[2].imm;
14074 /* This gets the bounds check, size encoding and immediate bits calculation
14075 right. */
14076 et.size /= 2;
5f4273c7 14077
5287ad62
JB
14078 /* If immediate is zero then we are a pseudo-instruction for
14079 VMOVN.I<size> <Dd>, <Qm> */
14080 if (imm == 0)
14081 {
14082 inst.operands[2].present = 0;
14083 inst.instruction = N_MNEM_vmovn;
14084 do_neon_movn ();
14085 return;
14086 }
5f4273c7 14087
5287ad62
JB
14088 constraint (imm < 1 || (unsigned)imm > et.size,
14089 _("immediate out of range for narrowing operation"));
14090 neon_imm_shift (FALSE, 0, 0, et, et.size - imm);
14091}
14092
14093static void
14094do_neon_shll (void)
14095{
14096 /* FIXME: Type checking when lengthening. */
14097 struct neon_type_el et = neon_check_type (2, NS_QDI,
14098 N_EQK | N_DBL, N_I8 | N_I16 | N_I32 | N_KEY);
14099 unsigned imm = inst.operands[2].imm;
14100
14101 if (imm == et.size)
14102 {
14103 /* Maximum shift variant. */
88714cb8 14104 NEON_ENCODE (INTEGER, inst);
5287ad62
JB
14105 inst.instruction |= LOW4 (inst.operands[0].reg) << 12;
14106 inst.instruction |= HI1 (inst.operands[0].reg) << 22;
14107 inst.instruction |= LOW4 (inst.operands[1].reg);
14108 inst.instruction |= HI1 (inst.operands[1].reg) << 5;
14109 inst.instruction |= neon_logbits (et.size) << 18;
5f4273c7 14110
88714cb8 14111 neon_dp_fixup (&inst);
5287ad62
JB
14112 }
14113 else
14114 {
14115 /* A more-specific type check for non-max versions. */
14116 et = neon_check_type (2, NS_QDI,
14117 N_EQK | N_DBL, N_SU_32 | N_KEY);
88714cb8 14118 NEON_ENCODE (IMMED, inst);
5287ad62
JB
14119 neon_imm_shift (TRUE, et.type == NT_unsigned, 0, et, imm);
14120 }
14121}
14122
037e8744 14123/* Check the various types for the VCVT instruction, and return which version
5287ad62
JB
14124 the current instruction is. */
14125
14126static int
14127neon_cvt_flavour (enum neon_shape rs)
14128{
037e8744
JB
14129#define CVT_VAR(C,X,Y) \
14130 et = neon_check_type (2, rs, whole_reg | (X), whole_reg | (Y)); \
14131 if (et.type != NT_invtype) \
14132 { \
14133 inst.error = NULL; \
14134 return (C); \
5287ad62
JB
14135 }
14136 struct neon_type_el et;
037e8744
JB
14137 unsigned whole_reg = (rs == NS_FFI || rs == NS_FD || rs == NS_DF
14138 || rs == NS_FF) ? N_VFP : 0;
14139 /* The instruction versions which take an immediate take one register
14140 argument, which is extended to the width of the full register. Thus the
14141 "source" and "destination" registers must have the same width. Hack that
14142 here by making the size equal to the key (wider, in this case) operand. */
14143 unsigned key = (rs == NS_QQI || rs == NS_DDI || rs == NS_FFI) ? N_KEY : 0;
5f4273c7 14144
5287ad62
JB
14145 CVT_VAR (0, N_S32, N_F32);
14146 CVT_VAR (1, N_U32, N_F32);
14147 CVT_VAR (2, N_F32, N_S32);
14148 CVT_VAR (3, N_F32, N_U32);
8e79c3df
CM
14149 /* Half-precision conversions. */
14150 CVT_VAR (4, N_F32, N_F16);
14151 CVT_VAR (5, N_F16, N_F32);
5f4273c7 14152
037e8744 14153 whole_reg = N_VFP;
5f4273c7 14154
037e8744 14155 /* VFP instructions. */
8e79c3df
CM
14156 CVT_VAR (6, N_F32, N_F64);
14157 CVT_VAR (7, N_F64, N_F32);
14158 CVT_VAR (8, N_S32, N_F64 | key);
14159 CVT_VAR (9, N_U32, N_F64 | key);
14160 CVT_VAR (10, N_F64 | key, N_S32);
14161 CVT_VAR (11, N_F64 | key, N_U32);
037e8744 14162 /* VFP instructions with bitshift. */
8e79c3df
CM
14163 CVT_VAR (12, N_F32 | key, N_S16);
14164 CVT_VAR (13, N_F32 | key, N_U16);
14165 CVT_VAR (14, N_F64 | key, N_S16);
14166 CVT_VAR (15, N_F64 | key, N_U16);
14167 CVT_VAR (16, N_S16, N_F32 | key);
14168 CVT_VAR (17, N_U16, N_F32 | key);
14169 CVT_VAR (18, N_S16, N_F64 | key);
14170 CVT_VAR (19, N_U16, N_F64 | key);
5f4273c7 14171
5287ad62
JB
14172 return -1;
14173#undef CVT_VAR
14174}
14175
037e8744
JB
14176/* Neon-syntax VFP conversions. */
14177
5287ad62 14178static void
037e8744 14179do_vfp_nsyn_cvt (enum neon_shape rs, int flavour)
5287ad62 14180{
037e8744 14181 const char *opname = 0;
5f4273c7 14182
037e8744 14183 if (rs == NS_DDI || rs == NS_QQI || rs == NS_FFI)
5287ad62 14184 {
037e8744
JB
14185 /* Conversions with immediate bitshift. */
14186 const char *enc[] =
14187 {
14188 "ftosls",
14189 "ftouls",
14190 "fsltos",
14191 "fultos",
14192 NULL,
14193 NULL,
8e79c3df
CM
14194 NULL,
14195 NULL,
037e8744
JB
14196 "ftosld",
14197 "ftould",
14198 "fsltod",
14199 "fultod",
14200 "fshtos",
14201 "fuhtos",
14202 "fshtod",
14203 "fuhtod",
14204 "ftoshs",
14205 "ftouhs",
14206 "ftoshd",
14207 "ftouhd"
14208 };
14209
14210 if (flavour >= 0 && flavour < (int) ARRAY_SIZE (enc))
14211 {
14212 opname = enc[flavour];
14213 constraint (inst.operands[0].reg != inst.operands[1].reg,
14214 _("operands 0 and 1 must be the same register"));
14215 inst.operands[1] = inst.operands[2];
14216 memset (&inst.operands[2], '\0', sizeof (inst.operands[2]));
14217 }
5287ad62
JB
14218 }
14219 else
14220 {
037e8744
JB
14221 /* Conversions without bitshift. */
14222 const char *enc[] =
14223 {
14224 "ftosis",
14225 "ftouis",
14226 "fsitos",
14227 "fuitos",
8e79c3df
CM
14228 "NULL",
14229 "NULL",
037e8744
JB
14230 "fcvtsd",
14231 "fcvtds",
14232 "ftosid",
14233 "ftouid",
14234 "fsitod",
14235 "fuitod"
14236 };
14237
14238 if (flavour >= 0 && flavour < (int) ARRAY_SIZE (enc))
14239 opname = enc[flavour];
14240 }
14241
14242 if (opname)
14243 do_vfp_nsyn_opcode (opname);
14244}
14245
14246static void
14247do_vfp_nsyn_cvtz (void)
14248{
14249 enum neon_shape rs = neon_select_shape (NS_FF, NS_FD, NS_NULL);
14250 int flavour = neon_cvt_flavour (rs);
14251 const char *enc[] =
14252 {
14253 "ftosizs",
14254 "ftouizs",
14255 NULL,
14256 NULL,
14257 NULL,
14258 NULL,
8e79c3df
CM
14259 NULL,
14260 NULL,
037e8744
JB
14261 "ftosizd",
14262 "ftouizd"
14263 };
14264
14265 if (flavour >= 0 && flavour < (int) ARRAY_SIZE (enc) && enc[flavour])
14266 do_vfp_nsyn_opcode (enc[flavour]);
14267}
f31fef98 14268
037e8744 14269static void
e3e535bc 14270do_neon_cvt_1 (bfd_boolean round_to_zero ATTRIBUTE_UNUSED)
037e8744
JB
14271{
14272 enum neon_shape rs = neon_select_shape (NS_DDI, NS_QQI, NS_FFI, NS_DD, NS_QQ,
8e79c3df 14273 NS_FD, NS_DF, NS_FF, NS_QD, NS_DQ, NS_NULL);
037e8744
JB
14274 int flavour = neon_cvt_flavour (rs);
14275
e3e535bc
NC
14276 /* PR11109: Handle round-to-zero for VCVT conversions. */
14277 if (round_to_zero
14278 && ARM_CPU_HAS_FEATURE (cpu_variant, fpu_arch_vfp_v2)
14279 && (flavour == 0 || flavour == 1 || flavour == 8 || flavour == 9)
14280 && (rs == NS_FD || rs == NS_FF))
14281 {
14282 do_vfp_nsyn_cvtz ();
14283 return;
14284 }
14285
037e8744 14286 /* VFP rather than Neon conversions. */
8e79c3df 14287 if (flavour >= 6)
037e8744
JB
14288 {
14289 do_vfp_nsyn_cvt (rs, flavour);
14290 return;
14291 }
14292
14293 switch (rs)
14294 {
14295 case NS_DDI:
14296 case NS_QQI:
14297 {
35997600
NC
14298 unsigned immbits;
14299 unsigned enctab[] = { 0x0000100, 0x1000100, 0x0, 0x1000000 };
14300
037e8744
JB
14301 if (vfp_or_neon_is_neon (NEON_CHECK_CC | NEON_CHECK_ARCH) == FAIL)
14302 return;
14303
14304 /* Fixed-point conversion with #0 immediate is encoded as an
14305 integer conversion. */
14306 if (inst.operands[2].present && inst.operands[2].imm == 0)
14307 goto int_encode;
35997600 14308 immbits = 32 - inst.operands[2].imm;
88714cb8 14309 NEON_ENCODE (IMMED, inst);
037e8744
JB
14310 if (flavour != -1)
14311 inst.instruction |= enctab[flavour];
14312 inst.instruction |= LOW4 (inst.operands[0].reg) << 12;
14313 inst.instruction |= HI1 (inst.operands[0].reg) << 22;
14314 inst.instruction |= LOW4 (inst.operands[1].reg);
14315 inst.instruction |= HI1 (inst.operands[1].reg) << 5;
14316 inst.instruction |= neon_quad (rs) << 6;
14317 inst.instruction |= 1 << 21;
14318 inst.instruction |= immbits << 16;
14319
88714cb8 14320 neon_dp_fixup (&inst);
037e8744
JB
14321 }
14322 break;
14323
14324 case NS_DD:
14325 case NS_QQ:
14326 int_encode:
14327 {
14328 unsigned enctab[] = { 0x100, 0x180, 0x0, 0x080 };
14329
88714cb8 14330 NEON_ENCODE (INTEGER, inst);
037e8744
JB
14331
14332 if (vfp_or_neon_is_neon (NEON_CHECK_CC | NEON_CHECK_ARCH) == FAIL)
14333 return;
14334
14335 if (flavour != -1)
14336 inst.instruction |= enctab[flavour];
14337
14338 inst.instruction |= LOW4 (inst.operands[0].reg) << 12;
14339 inst.instruction |= HI1 (inst.operands[0].reg) << 22;
14340 inst.instruction |= LOW4 (inst.operands[1].reg);
14341 inst.instruction |= HI1 (inst.operands[1].reg) << 5;
14342 inst.instruction |= neon_quad (rs) << 6;
14343 inst.instruction |= 2 << 18;
14344
88714cb8 14345 neon_dp_fixup (&inst);
037e8744
JB
14346 }
14347 break;
14348
8e79c3df
CM
14349 /* Half-precision conversions for Advanced SIMD -- neon. */
14350 case NS_QD:
14351 case NS_DQ:
14352
14353 if ((rs == NS_DQ)
14354 && (inst.vectype.el[0].size != 16 || inst.vectype.el[1].size != 32))
14355 {
14356 as_bad (_("operand size must match register width"));
14357 break;
14358 }
14359
14360 if ((rs == NS_QD)
14361 && ((inst.vectype.el[0].size != 32 || inst.vectype.el[1].size != 16)))
14362 {
14363 as_bad (_("operand size must match register width"));
14364 break;
14365 }
14366
14367 if (rs == NS_DQ)
14368 inst.instruction = 0x3b60600;
14369 else
14370 inst.instruction = 0x3b60700;
14371
14372 inst.instruction |= LOW4 (inst.operands[0].reg) << 12;
14373 inst.instruction |= HI1 (inst.operands[0].reg) << 22;
14374 inst.instruction |= LOW4 (inst.operands[1].reg);
14375 inst.instruction |= HI1 (inst.operands[1].reg) << 5;
88714cb8 14376 neon_dp_fixup (&inst);
8e79c3df
CM
14377 break;
14378
037e8744
JB
14379 default:
14380 /* Some VFP conversions go here (s32 <-> f32, u32 <-> f32). */
14381 do_vfp_nsyn_cvt (rs, flavour);
5287ad62 14382 }
5287ad62
JB
14383}
14384
e3e535bc
NC
14385static void
14386do_neon_cvtr (void)
14387{
14388 do_neon_cvt_1 (FALSE);
14389}
14390
14391static void
14392do_neon_cvt (void)
14393{
14394 do_neon_cvt_1 (TRUE);
14395}
14396
8e79c3df
CM
14397static void
14398do_neon_cvtb (void)
14399{
14400 inst.instruction = 0xeb20a40;
14401
14402 /* The sizes are attached to the mnemonic. */
14403 if (inst.vectype.el[0].type != NT_invtype
14404 && inst.vectype.el[0].size == 16)
14405 inst.instruction |= 0x00010000;
14406
14407 /* Programmer's syntax: the sizes are attached to the operands. */
14408 else if (inst.operands[0].vectype.type != NT_invtype
14409 && inst.operands[0].vectype.size == 16)
14410 inst.instruction |= 0x00010000;
14411
14412 encode_arm_vfp_reg (inst.operands[0].reg, VFP_REG_Sd);
14413 encode_arm_vfp_reg (inst.operands[1].reg, VFP_REG_Sm);
14414 do_vfp_cond_or_thumb ();
14415}
14416
14417
14418static void
14419do_neon_cvtt (void)
14420{
14421 do_neon_cvtb ();
14422 inst.instruction |= 0x80;
14423}
14424
5287ad62
JB
14425static void
14426neon_move_immediate (void)
14427{
037e8744
JB
14428 enum neon_shape rs = neon_select_shape (NS_DI, NS_QI, NS_NULL);
14429 struct neon_type_el et = neon_check_type (2, rs,
14430 N_I8 | N_I16 | N_I32 | N_I64 | N_F32 | N_KEY, N_EQK);
5287ad62 14431 unsigned immlo, immhi = 0, immbits;
c96612cc 14432 int op, cmode, float_p;
5287ad62 14433
037e8744
JB
14434 constraint (et.type == NT_invtype,
14435 _("operand size must be specified for immediate VMOV"));
14436
5287ad62
JB
14437 /* We start out as an MVN instruction if OP = 1, MOV otherwise. */
14438 op = (inst.instruction & (1 << 5)) != 0;
14439
14440 immlo = inst.operands[1].imm;
14441 if (inst.operands[1].regisimm)
14442 immhi = inst.operands[1].reg;
14443
14444 constraint (et.size < 32 && (immlo & ~((1 << et.size) - 1)) != 0,
14445 _("immediate has bits set outside the operand size"));
14446
c96612cc
JB
14447 float_p = inst.operands[1].immisfloat;
14448
14449 if ((cmode = neon_cmode_for_move_imm (immlo, immhi, float_p, &immbits, &op,
136da414 14450 et.size, et.type)) == FAIL)
5287ad62
JB
14451 {
14452 /* Invert relevant bits only. */
14453 neon_invert_size (&immlo, &immhi, et.size);
14454 /* Flip from VMOV/VMVN to VMVN/VMOV. Some immediate types are unavailable
14455 with one or the other; those cases are caught by
14456 neon_cmode_for_move_imm. */
14457 op = !op;
c96612cc
JB
14458 if ((cmode = neon_cmode_for_move_imm (immlo, immhi, float_p, &immbits,
14459 &op, et.size, et.type)) == FAIL)
5287ad62 14460 {
dcbf9037 14461 first_error (_("immediate out of range"));
5287ad62
JB
14462 return;
14463 }
14464 }
14465
14466 inst.instruction &= ~(1 << 5);
14467 inst.instruction |= op << 5;
14468
14469 inst.instruction |= LOW4 (inst.operands[0].reg) << 12;
14470 inst.instruction |= HI1 (inst.operands[0].reg) << 22;
037e8744 14471 inst.instruction |= neon_quad (rs) << 6;
5287ad62
JB
14472 inst.instruction |= cmode << 8;
14473
14474 neon_write_immbits (immbits);
14475}
14476
14477static void
14478do_neon_mvn (void)
14479{
14480 if (inst.operands[1].isreg)
14481 {
037e8744 14482 enum neon_shape rs = neon_select_shape (NS_DD, NS_QQ, NS_NULL);
5f4273c7 14483
88714cb8 14484 NEON_ENCODE (INTEGER, inst);
5287ad62
JB
14485 inst.instruction |= LOW4 (inst.operands[0].reg) << 12;
14486 inst.instruction |= HI1 (inst.operands[0].reg) << 22;
14487 inst.instruction |= LOW4 (inst.operands[1].reg);
14488 inst.instruction |= HI1 (inst.operands[1].reg) << 5;
037e8744 14489 inst.instruction |= neon_quad (rs) << 6;
5287ad62
JB
14490 }
14491 else
14492 {
88714cb8 14493 NEON_ENCODE (IMMED, inst);
5287ad62
JB
14494 neon_move_immediate ();
14495 }
14496
88714cb8 14497 neon_dp_fixup (&inst);
5287ad62
JB
14498}
14499
14500/* Encode instructions of form:
14501
14502 |28/24|23|22|21 20|19 16|15 12|11 8|7|6|5|4|3 0|
5f4273c7 14503 | U |x |D |size | Rn | Rd |x x x x|N|x|M|x| Rm | */
5287ad62
JB
14504
14505static void
14506neon_mixed_length (struct neon_type_el et, unsigned size)
14507{
14508 inst.instruction |= LOW4 (inst.operands[0].reg) << 12;
14509 inst.instruction |= HI1 (inst.operands[0].reg) << 22;
14510 inst.instruction |= LOW4 (inst.operands[1].reg) << 16;
14511 inst.instruction |= HI1 (inst.operands[1].reg) << 7;
14512 inst.instruction |= LOW4 (inst.operands[2].reg);
14513 inst.instruction |= HI1 (inst.operands[2].reg) << 5;
14514 inst.instruction |= (et.type == NT_unsigned) << 24;
14515 inst.instruction |= neon_logbits (size) << 20;
5f4273c7 14516
88714cb8 14517 neon_dp_fixup (&inst);
5287ad62
JB
14518}
14519
14520static void
14521do_neon_dyadic_long (void)
14522{
14523 /* FIXME: Type checking for lengthening op. */
14524 struct neon_type_el et = neon_check_type (3, NS_QDD,
14525 N_EQK | N_DBL, N_EQK, N_SU_32 | N_KEY);
14526 neon_mixed_length (et, et.size);
14527}
14528
14529static void
14530do_neon_abal (void)
14531{
14532 struct neon_type_el et = neon_check_type (3, NS_QDD,
14533 N_EQK | N_INT | N_DBL, N_EQK, N_SU_32 | N_KEY);
14534 neon_mixed_length (et, et.size);
14535}
14536
14537static void
14538neon_mac_reg_scalar_long (unsigned regtypes, unsigned scalartypes)
14539{
14540 if (inst.operands[2].isscalar)
14541 {
dcbf9037
JB
14542 struct neon_type_el et = neon_check_type (3, NS_QDS,
14543 N_EQK | N_DBL, N_EQK, regtypes | N_KEY);
88714cb8 14544 NEON_ENCODE (SCALAR, inst);
5287ad62
JB
14545 neon_mul_mac (et, et.type == NT_unsigned);
14546 }
14547 else
14548 {
14549 struct neon_type_el et = neon_check_type (3, NS_QDD,
14550 N_EQK | N_DBL, N_EQK, scalartypes | N_KEY);
88714cb8 14551 NEON_ENCODE (INTEGER, inst);
5287ad62
JB
14552 neon_mixed_length (et, et.size);
14553 }
14554}
14555
14556static void
14557do_neon_mac_maybe_scalar_long (void)
14558{
14559 neon_mac_reg_scalar_long (N_S16 | N_S32 | N_U16 | N_U32, N_SU_32);
14560}
14561
14562static void
14563do_neon_dyadic_wide (void)
14564{
14565 struct neon_type_el et = neon_check_type (3, NS_QQD,
14566 N_EQK | N_DBL, N_EQK | N_DBL, N_SU_32 | N_KEY);
14567 neon_mixed_length (et, et.size);
14568}
14569
14570static void
14571do_neon_dyadic_narrow (void)
14572{
14573 struct neon_type_el et = neon_check_type (3, NS_QDD,
14574 N_EQK | N_DBL, N_EQK, N_I16 | N_I32 | N_I64 | N_KEY);
428e3f1f
PB
14575 /* Operand sign is unimportant, and the U bit is part of the opcode,
14576 so force the operand type to integer. */
14577 et.type = NT_integer;
5287ad62
JB
14578 neon_mixed_length (et, et.size / 2);
14579}
14580
14581static void
14582do_neon_mul_sat_scalar_long (void)
14583{
14584 neon_mac_reg_scalar_long (N_S16 | N_S32, N_S16 | N_S32);
14585}
14586
14587static void
14588do_neon_vmull (void)
14589{
14590 if (inst.operands[2].isscalar)
14591 do_neon_mac_maybe_scalar_long ();
14592 else
14593 {
14594 struct neon_type_el et = neon_check_type (3, NS_QDD,
14595 N_EQK | N_DBL, N_EQK, N_SU_32 | N_P8 | N_KEY);
14596 if (et.type == NT_poly)
88714cb8 14597 NEON_ENCODE (POLY, inst);
5287ad62 14598 else
88714cb8 14599 NEON_ENCODE (INTEGER, inst);
5287ad62
JB
14600 /* For polynomial encoding, size field must be 0b00 and the U bit must be
14601 zero. Should be OK as-is. */
14602 neon_mixed_length (et, et.size);
14603 }
14604}
14605
14606static void
14607do_neon_ext (void)
14608{
037e8744 14609 enum neon_shape rs = neon_select_shape (NS_DDDI, NS_QQQI, NS_NULL);
5287ad62
JB
14610 struct neon_type_el et = neon_check_type (3, rs,
14611 N_EQK, N_EQK, N_8 | N_16 | N_32 | N_64 | N_KEY);
14612 unsigned imm = (inst.operands[3].imm * et.size) / 8;
35997600
NC
14613
14614 constraint (imm >= (unsigned) (neon_quad (rs) ? 16 : 8),
14615 _("shift out of range"));
5287ad62
JB
14616 inst.instruction |= LOW4 (inst.operands[0].reg) << 12;
14617 inst.instruction |= HI1 (inst.operands[0].reg) << 22;
14618 inst.instruction |= LOW4 (inst.operands[1].reg) << 16;
14619 inst.instruction |= HI1 (inst.operands[1].reg) << 7;
14620 inst.instruction |= LOW4 (inst.operands[2].reg);
14621 inst.instruction |= HI1 (inst.operands[2].reg) << 5;
037e8744 14622 inst.instruction |= neon_quad (rs) << 6;
5287ad62 14623 inst.instruction |= imm << 8;
5f4273c7 14624
88714cb8 14625 neon_dp_fixup (&inst);
5287ad62
JB
14626}
14627
14628static void
14629do_neon_rev (void)
14630{
037e8744 14631 enum neon_shape rs = neon_select_shape (NS_DD, NS_QQ, NS_NULL);
5287ad62
JB
14632 struct neon_type_el et = neon_check_type (2, rs,
14633 N_EQK, N_8 | N_16 | N_32 | N_KEY);
14634 unsigned op = (inst.instruction >> 7) & 3;
14635 /* N (width of reversed regions) is encoded as part of the bitmask. We
14636 extract it here to check the elements to be reversed are smaller.
14637 Otherwise we'd get a reserved instruction. */
14638 unsigned elsize = (op == 2) ? 16 : (op == 1) ? 32 : (op == 0) ? 64 : 0;
9c2799c2 14639 gas_assert (elsize != 0);
5287ad62
JB
14640 constraint (et.size >= elsize,
14641 _("elements must be smaller than reversal region"));
037e8744 14642 neon_two_same (neon_quad (rs), 1, et.size);
5287ad62
JB
14643}
14644
14645static void
14646do_neon_dup (void)
14647{
14648 if (inst.operands[1].isscalar)
14649 {
037e8744 14650 enum neon_shape rs = neon_select_shape (NS_DS, NS_QS, NS_NULL);
dcbf9037
JB
14651 struct neon_type_el et = neon_check_type (2, rs,
14652 N_EQK, N_8 | N_16 | N_32 | N_KEY);
5287ad62 14653 unsigned sizebits = et.size >> 3;
dcbf9037 14654 unsigned dm = NEON_SCALAR_REG (inst.operands[1].reg);
5287ad62 14655 int logsize = neon_logbits (et.size);
dcbf9037 14656 unsigned x = NEON_SCALAR_INDEX (inst.operands[1].reg) << logsize;
037e8744
JB
14657
14658 if (vfp_or_neon_is_neon (NEON_CHECK_CC) == FAIL)
14659 return;
14660
88714cb8 14661 NEON_ENCODE (SCALAR, inst);
5287ad62
JB
14662 inst.instruction |= LOW4 (inst.operands[0].reg) << 12;
14663 inst.instruction |= HI1 (inst.operands[0].reg) << 22;
14664 inst.instruction |= LOW4 (dm);
14665 inst.instruction |= HI1 (dm) << 5;
037e8744 14666 inst.instruction |= neon_quad (rs) << 6;
5287ad62
JB
14667 inst.instruction |= x << 17;
14668 inst.instruction |= sizebits << 16;
5f4273c7 14669
88714cb8 14670 neon_dp_fixup (&inst);
5287ad62
JB
14671 }
14672 else
14673 {
037e8744
JB
14674 enum neon_shape rs = neon_select_shape (NS_DR, NS_QR, NS_NULL);
14675 struct neon_type_el et = neon_check_type (2, rs,
14676 N_8 | N_16 | N_32 | N_KEY, N_EQK);
5287ad62 14677 /* Duplicate ARM register to lanes of vector. */
88714cb8 14678 NEON_ENCODE (ARMREG, inst);
5287ad62
JB
14679 switch (et.size)
14680 {
14681 case 8: inst.instruction |= 0x400000; break;
14682 case 16: inst.instruction |= 0x000020; break;
14683 case 32: inst.instruction |= 0x000000; break;
14684 default: break;
14685 }
14686 inst.instruction |= LOW4 (inst.operands[1].reg) << 12;
14687 inst.instruction |= LOW4 (inst.operands[0].reg) << 16;
14688 inst.instruction |= HI1 (inst.operands[0].reg) << 7;
037e8744 14689 inst.instruction |= neon_quad (rs) << 21;
5287ad62
JB
14690 /* The encoding for this instruction is identical for the ARM and Thumb
14691 variants, except for the condition field. */
037e8744 14692 do_vfp_cond_or_thumb ();
5287ad62
JB
14693 }
14694}
14695
14696/* VMOV has particularly many variations. It can be one of:
14697 0. VMOV<c><q> <Qd>, <Qm>
14698 1. VMOV<c><q> <Dd>, <Dm>
14699 (Register operations, which are VORR with Rm = Rn.)
14700 2. VMOV<c><q>.<dt> <Qd>, #<imm>
14701 3. VMOV<c><q>.<dt> <Dd>, #<imm>
14702 (Immediate loads.)
14703 4. VMOV<c><q>.<size> <Dn[x]>, <Rd>
14704 (ARM register to scalar.)
14705 5. VMOV<c><q> <Dm>, <Rd>, <Rn>
14706 (Two ARM registers to vector.)
14707 6. VMOV<c><q>.<dt> <Rd>, <Dn[x]>
14708 (Scalar to ARM register.)
14709 7. VMOV<c><q> <Rd>, <Rn>, <Dm>
14710 (Vector to two ARM registers.)
037e8744
JB
14711 8. VMOV.F32 <Sd>, <Sm>
14712 9. VMOV.F64 <Dd>, <Dm>
14713 (VFP register moves.)
14714 10. VMOV.F32 <Sd>, #imm
14715 11. VMOV.F64 <Dd>, #imm
14716 (VFP float immediate load.)
14717 12. VMOV <Rd>, <Sm>
14718 (VFP single to ARM reg.)
14719 13. VMOV <Sd>, <Rm>
14720 (ARM reg to VFP single.)
14721 14. VMOV <Rd>, <Re>, <Sn>, <Sm>
14722 (Two ARM regs to two VFP singles.)
14723 15. VMOV <Sd>, <Se>, <Rn>, <Rm>
14724 (Two VFP singles to two ARM regs.)
5f4273c7 14725
037e8744
JB
14726 These cases can be disambiguated using neon_select_shape, except cases 1/9
14727 and 3/11 which depend on the operand type too.
5f4273c7 14728
5287ad62 14729 All the encoded bits are hardcoded by this function.
5f4273c7 14730
b7fc2769
JB
14731 Cases 4, 6 may be used with VFPv1 and above (only 32-bit transfers!).
14732 Cases 5, 7 may be used with VFPv2 and above.
5f4273c7 14733
5287ad62 14734 FIXME: Some of the checking may be a bit sloppy (in a couple of cases you
5f4273c7 14735 can specify a type where it doesn't make sense to, and is ignored). */
5287ad62
JB
14736
14737static void
14738do_neon_mov (void)
14739{
037e8744
JB
14740 enum neon_shape rs = neon_select_shape (NS_RRFF, NS_FFRR, NS_DRR, NS_RRD,
14741 NS_QQ, NS_DD, NS_QI, NS_DI, NS_SR, NS_RS, NS_FF, NS_FI, NS_RF, NS_FR,
14742 NS_NULL);
14743 struct neon_type_el et;
14744 const char *ldconst = 0;
5287ad62 14745
037e8744 14746 switch (rs)
5287ad62 14747 {
037e8744
JB
14748 case NS_DD: /* case 1/9. */
14749 et = neon_check_type (2, rs, N_EQK, N_F64 | N_KEY);
14750 /* It is not an error here if no type is given. */
14751 inst.error = NULL;
14752 if (et.type == NT_float && et.size == 64)
5287ad62 14753 {
037e8744
JB
14754 do_vfp_nsyn_opcode ("fcpyd");
14755 break;
5287ad62 14756 }
037e8744 14757 /* fall through. */
5287ad62 14758
037e8744
JB
14759 case NS_QQ: /* case 0/1. */
14760 {
14761 if (vfp_or_neon_is_neon (NEON_CHECK_CC | NEON_CHECK_ARCH) == FAIL)
14762 return;
14763 /* The architecture manual I have doesn't explicitly state which
14764 value the U bit should have for register->register moves, but
14765 the equivalent VORR instruction has U = 0, so do that. */
14766 inst.instruction = 0x0200110;
14767 inst.instruction |= LOW4 (inst.operands[0].reg) << 12;
14768 inst.instruction |= HI1 (inst.operands[0].reg) << 22;
14769 inst.instruction |= LOW4 (inst.operands[1].reg);
14770 inst.instruction |= HI1 (inst.operands[1].reg) << 5;
14771 inst.instruction |= LOW4 (inst.operands[1].reg) << 16;
14772 inst.instruction |= HI1 (inst.operands[1].reg) << 7;
14773 inst.instruction |= neon_quad (rs) << 6;
14774
88714cb8 14775 neon_dp_fixup (&inst);
037e8744
JB
14776 }
14777 break;
5f4273c7 14778
037e8744
JB
14779 case NS_DI: /* case 3/11. */
14780 et = neon_check_type (2, rs, N_EQK, N_F64 | N_KEY);
14781 inst.error = NULL;
14782 if (et.type == NT_float && et.size == 64)
5287ad62 14783 {
037e8744
JB
14784 /* case 11 (fconstd). */
14785 ldconst = "fconstd";
14786 goto encode_fconstd;
5287ad62 14787 }
037e8744
JB
14788 /* fall through. */
14789
14790 case NS_QI: /* case 2/3. */
14791 if (vfp_or_neon_is_neon (NEON_CHECK_CC | NEON_CHECK_ARCH) == FAIL)
14792 return;
14793 inst.instruction = 0x0800010;
14794 neon_move_immediate ();
88714cb8 14795 neon_dp_fixup (&inst);
5287ad62 14796 break;
5f4273c7 14797
037e8744
JB
14798 case NS_SR: /* case 4. */
14799 {
14800 unsigned bcdebits = 0;
91d6fa6a 14801 int logsize;
037e8744
JB
14802 unsigned dn = NEON_SCALAR_REG (inst.operands[0].reg);
14803 unsigned x = NEON_SCALAR_INDEX (inst.operands[0].reg);
14804
91d6fa6a
NC
14805 et = neon_check_type (2, NS_NULL, N_8 | N_16 | N_32 | N_KEY, N_EQK);
14806 logsize = neon_logbits (et.size);
14807
037e8744
JB
14808 constraint (!ARM_CPU_HAS_FEATURE (cpu_variant, fpu_vfp_ext_v1),
14809 _(BAD_FPU));
14810 constraint (!ARM_CPU_HAS_FEATURE (cpu_variant, fpu_neon_ext_v1)
14811 && et.size != 32, _(BAD_FPU));
14812 constraint (et.type == NT_invtype, _("bad type for scalar"));
14813 constraint (x >= 64 / et.size, _("scalar index out of range"));
14814
14815 switch (et.size)
14816 {
14817 case 8: bcdebits = 0x8; break;
14818 case 16: bcdebits = 0x1; break;
14819 case 32: bcdebits = 0x0; break;
14820 default: ;
14821 }
14822
14823 bcdebits |= x << logsize;
14824
14825 inst.instruction = 0xe000b10;
14826 do_vfp_cond_or_thumb ();
14827 inst.instruction |= LOW4 (dn) << 16;
14828 inst.instruction |= HI1 (dn) << 7;
14829 inst.instruction |= inst.operands[1].reg << 12;
14830 inst.instruction |= (bcdebits & 3) << 5;
14831 inst.instruction |= (bcdebits >> 2) << 21;
14832 }
14833 break;
5f4273c7 14834
037e8744 14835 case NS_DRR: /* case 5 (fmdrr). */
b7fc2769 14836 constraint (!ARM_CPU_HAS_FEATURE (cpu_variant, fpu_vfp_ext_v2),
037e8744 14837 _(BAD_FPU));
b7fc2769 14838
037e8744
JB
14839 inst.instruction = 0xc400b10;
14840 do_vfp_cond_or_thumb ();
14841 inst.instruction |= LOW4 (inst.operands[0].reg);
14842 inst.instruction |= HI1 (inst.operands[0].reg) << 5;
14843 inst.instruction |= inst.operands[1].reg << 12;
14844 inst.instruction |= inst.operands[2].reg << 16;
14845 break;
5f4273c7 14846
037e8744
JB
14847 case NS_RS: /* case 6. */
14848 {
91d6fa6a 14849 unsigned logsize;
037e8744
JB
14850 unsigned dn = NEON_SCALAR_REG (inst.operands[1].reg);
14851 unsigned x = NEON_SCALAR_INDEX (inst.operands[1].reg);
14852 unsigned abcdebits = 0;
14853
91d6fa6a
NC
14854 et = neon_check_type (2, NS_NULL,
14855 N_EQK, N_S8 | N_S16 | N_U8 | N_U16 | N_32 | N_KEY);
14856 logsize = neon_logbits (et.size);
14857
037e8744
JB
14858 constraint (!ARM_CPU_HAS_FEATURE (cpu_variant, fpu_vfp_ext_v1),
14859 _(BAD_FPU));
14860 constraint (!ARM_CPU_HAS_FEATURE (cpu_variant, fpu_neon_ext_v1)
14861 && et.size != 32, _(BAD_FPU));
14862 constraint (et.type == NT_invtype, _("bad type for scalar"));
14863 constraint (x >= 64 / et.size, _("scalar index out of range"));
14864
14865 switch (et.size)
14866 {
14867 case 8: abcdebits = (et.type == NT_signed) ? 0x08 : 0x18; break;
14868 case 16: abcdebits = (et.type == NT_signed) ? 0x01 : 0x11; break;
14869 case 32: abcdebits = 0x00; break;
14870 default: ;
14871 }
14872
14873 abcdebits |= x << logsize;
14874 inst.instruction = 0xe100b10;
14875 do_vfp_cond_or_thumb ();
14876 inst.instruction |= LOW4 (dn) << 16;
14877 inst.instruction |= HI1 (dn) << 7;
14878 inst.instruction |= inst.operands[0].reg << 12;
14879 inst.instruction |= (abcdebits & 3) << 5;
14880 inst.instruction |= (abcdebits >> 2) << 21;
14881 }
14882 break;
5f4273c7 14883
037e8744
JB
14884 case NS_RRD: /* case 7 (fmrrd). */
14885 constraint (!ARM_CPU_HAS_FEATURE (cpu_variant, fpu_vfp_ext_v2),
14886 _(BAD_FPU));
14887
14888 inst.instruction = 0xc500b10;
14889 do_vfp_cond_or_thumb ();
14890 inst.instruction |= inst.operands[0].reg << 12;
14891 inst.instruction |= inst.operands[1].reg << 16;
14892 inst.instruction |= LOW4 (inst.operands[2].reg);
14893 inst.instruction |= HI1 (inst.operands[2].reg) << 5;
14894 break;
5f4273c7 14895
037e8744
JB
14896 case NS_FF: /* case 8 (fcpys). */
14897 do_vfp_nsyn_opcode ("fcpys");
14898 break;
5f4273c7 14899
037e8744
JB
14900 case NS_FI: /* case 10 (fconsts). */
14901 ldconst = "fconsts";
14902 encode_fconstd:
14903 if (is_quarter_float (inst.operands[1].imm))
5287ad62 14904 {
037e8744
JB
14905 inst.operands[1].imm = neon_qfloat_bits (inst.operands[1].imm);
14906 do_vfp_nsyn_opcode (ldconst);
5287ad62
JB
14907 }
14908 else
037e8744
JB
14909 first_error (_("immediate out of range"));
14910 break;
5f4273c7 14911
037e8744
JB
14912 case NS_RF: /* case 12 (fmrs). */
14913 do_vfp_nsyn_opcode ("fmrs");
14914 break;
5f4273c7 14915
037e8744
JB
14916 case NS_FR: /* case 13 (fmsr). */
14917 do_vfp_nsyn_opcode ("fmsr");
14918 break;
5f4273c7 14919
037e8744
JB
14920 /* The encoders for the fmrrs and fmsrr instructions expect three operands
14921 (one of which is a list), but we have parsed four. Do some fiddling to
14922 make the operands what do_vfp_reg2_from_sp2 and do_vfp_sp2_from_reg2
14923 expect. */
14924 case NS_RRFF: /* case 14 (fmrrs). */
14925 constraint (inst.operands[3].reg != inst.operands[2].reg + 1,
14926 _("VFP registers must be adjacent"));
14927 inst.operands[2].imm = 2;
14928 memset (&inst.operands[3], '\0', sizeof (inst.operands[3]));
14929 do_vfp_nsyn_opcode ("fmrrs");
14930 break;
5f4273c7 14931
037e8744
JB
14932 case NS_FFRR: /* case 15 (fmsrr). */
14933 constraint (inst.operands[1].reg != inst.operands[0].reg + 1,
14934 _("VFP registers must be adjacent"));
14935 inst.operands[1] = inst.operands[2];
14936 inst.operands[2] = inst.operands[3];
14937 inst.operands[0].imm = 2;
14938 memset (&inst.operands[3], '\0', sizeof (inst.operands[3]));
14939 do_vfp_nsyn_opcode ("fmsrr");
5287ad62 14940 break;
5f4273c7 14941
5287ad62
JB
14942 default:
14943 abort ();
14944 }
14945}
14946
14947static void
14948do_neon_rshift_round_imm (void)
14949{
037e8744 14950 enum neon_shape rs = neon_select_shape (NS_DDI, NS_QQI, NS_NULL);
5287ad62
JB
14951 struct neon_type_el et = neon_check_type (2, rs, N_EQK, N_SU_ALL | N_KEY);
14952 int imm = inst.operands[2].imm;
14953
14954 /* imm == 0 case is encoded as VMOV for V{R}SHR. */
14955 if (imm == 0)
14956 {
14957 inst.operands[2].present = 0;
14958 do_neon_mov ();
14959 return;
14960 }
14961
14962 constraint (imm < 1 || (unsigned)imm > et.size,
14963 _("immediate out of range for shift"));
037e8744 14964 neon_imm_shift (TRUE, et.type == NT_unsigned, neon_quad (rs), et,
5287ad62
JB
14965 et.size - imm);
14966}
14967
14968static void
14969do_neon_movl (void)
14970{
14971 struct neon_type_el et = neon_check_type (2, NS_QD,
14972 N_EQK | N_DBL, N_SU_32 | N_KEY);
14973 unsigned sizebits = et.size >> 3;
14974 inst.instruction |= sizebits << 19;
14975 neon_two_same (0, et.type == NT_unsigned, -1);
14976}
14977
14978static void
14979do_neon_trn (void)
14980{
037e8744 14981 enum neon_shape rs = neon_select_shape (NS_DD, NS_QQ, NS_NULL);
5287ad62
JB
14982 struct neon_type_el et = neon_check_type (2, rs,
14983 N_EQK, N_8 | N_16 | N_32 | N_KEY);
88714cb8 14984 NEON_ENCODE (INTEGER, inst);
037e8744 14985 neon_two_same (neon_quad (rs), 1, et.size);
5287ad62
JB
14986}
14987
14988static void
14989do_neon_zip_uzp (void)
14990{
037e8744 14991 enum neon_shape rs = neon_select_shape (NS_DD, NS_QQ, NS_NULL);
5287ad62
JB
14992 struct neon_type_el et = neon_check_type (2, rs,
14993 N_EQK, N_8 | N_16 | N_32 | N_KEY);
14994 if (rs == NS_DD && et.size == 32)
14995 {
14996 /* Special case: encode as VTRN.32 <Dd>, <Dm>. */
14997 inst.instruction = N_MNEM_vtrn;
14998 do_neon_trn ();
14999 return;
15000 }
037e8744 15001 neon_two_same (neon_quad (rs), 1, et.size);
5287ad62
JB
15002}
15003
15004static void
15005do_neon_sat_abs_neg (void)
15006{
037e8744 15007 enum neon_shape rs = neon_select_shape (NS_DD, NS_QQ, NS_NULL);
5287ad62
JB
15008 struct neon_type_el et = neon_check_type (2, rs,
15009 N_EQK, N_S8 | N_S16 | N_S32 | N_KEY);
037e8744 15010 neon_two_same (neon_quad (rs), 1, et.size);
5287ad62
JB
15011}
15012
15013static void
15014do_neon_pair_long (void)
15015{
037e8744 15016 enum neon_shape rs = neon_select_shape (NS_DD, NS_QQ, NS_NULL);
5287ad62
JB
15017 struct neon_type_el et = neon_check_type (2, rs, N_EQK, N_SU_32 | N_KEY);
15018 /* Unsigned is encoded in OP field (bit 7) for these instruction. */
15019 inst.instruction |= (et.type == NT_unsigned) << 7;
037e8744 15020 neon_two_same (neon_quad (rs), 1, et.size);
5287ad62
JB
15021}
15022
15023static void
15024do_neon_recip_est (void)
15025{
037e8744 15026 enum neon_shape rs = neon_select_shape (NS_DD, NS_QQ, NS_NULL);
5287ad62
JB
15027 struct neon_type_el et = neon_check_type (2, rs,
15028 N_EQK | N_FLT, N_F32 | N_U32 | N_KEY);
15029 inst.instruction |= (et.type == NT_float) << 8;
037e8744 15030 neon_two_same (neon_quad (rs), 1, et.size);
5287ad62
JB
15031}
15032
15033static void
15034do_neon_cls (void)
15035{
037e8744 15036 enum neon_shape rs = neon_select_shape (NS_DD, NS_QQ, NS_NULL);
5287ad62
JB
15037 struct neon_type_el et = neon_check_type (2, rs,
15038 N_EQK, N_S8 | N_S16 | N_S32 | N_KEY);
037e8744 15039 neon_two_same (neon_quad (rs), 1, et.size);
5287ad62
JB
15040}
15041
15042static void
15043do_neon_clz (void)
15044{
037e8744 15045 enum neon_shape rs = neon_select_shape (NS_DD, NS_QQ, NS_NULL);
5287ad62
JB
15046 struct neon_type_el et = neon_check_type (2, rs,
15047 N_EQK, N_I8 | N_I16 | N_I32 | N_KEY);
037e8744 15048 neon_two_same (neon_quad (rs), 1, et.size);
5287ad62
JB
15049}
15050
15051static void
15052do_neon_cnt (void)
15053{
037e8744 15054 enum neon_shape rs = neon_select_shape (NS_DD, NS_QQ, NS_NULL);
5287ad62
JB
15055 struct neon_type_el et = neon_check_type (2, rs,
15056 N_EQK | N_INT, N_8 | N_KEY);
037e8744 15057 neon_two_same (neon_quad (rs), 1, et.size);
5287ad62
JB
15058}
15059
15060static void
15061do_neon_swp (void)
15062{
037e8744
JB
15063 enum neon_shape rs = neon_select_shape (NS_DD, NS_QQ, NS_NULL);
15064 neon_two_same (neon_quad (rs), 1, -1);
5287ad62
JB
15065}
15066
15067static void
15068do_neon_tbl_tbx (void)
15069{
15070 unsigned listlenbits;
dcbf9037 15071 neon_check_type (3, NS_DLD, N_EQK, N_EQK, N_8 | N_KEY);
5f4273c7 15072
5287ad62
JB
15073 if (inst.operands[1].imm < 1 || inst.operands[1].imm > 4)
15074 {
dcbf9037 15075 first_error (_("bad list length for table lookup"));
5287ad62
JB
15076 return;
15077 }
5f4273c7 15078
5287ad62
JB
15079 listlenbits = inst.operands[1].imm - 1;
15080 inst.instruction |= LOW4 (inst.operands[0].reg) << 12;
15081 inst.instruction |= HI1 (inst.operands[0].reg) << 22;
15082 inst.instruction |= LOW4 (inst.operands[1].reg) << 16;
15083 inst.instruction |= HI1 (inst.operands[1].reg) << 7;
15084 inst.instruction |= LOW4 (inst.operands[2].reg);
15085 inst.instruction |= HI1 (inst.operands[2].reg) << 5;
15086 inst.instruction |= listlenbits << 8;
5f4273c7 15087
88714cb8 15088 neon_dp_fixup (&inst);
5287ad62
JB
15089}
15090
15091static void
15092do_neon_ldm_stm (void)
15093{
15094 /* P, U and L bits are part of bitmask. */
15095 int is_dbmode = (inst.instruction & (1 << 24)) != 0;
15096 unsigned offsetbits = inst.operands[1].imm * 2;
15097
037e8744
JB
15098 if (inst.operands[1].issingle)
15099 {
15100 do_vfp_nsyn_ldm_stm (is_dbmode);
15101 return;
15102 }
15103
5287ad62
JB
15104 constraint (is_dbmode && !inst.operands[0].writeback,
15105 _("writeback (!) must be used for VLDMDB and VSTMDB"));
15106
15107 constraint (inst.operands[1].imm < 1 || inst.operands[1].imm > 16,
15108 _("register list must contain at least 1 and at most 16 "
15109 "registers"));
15110
15111 inst.instruction |= inst.operands[0].reg << 16;
15112 inst.instruction |= inst.operands[0].writeback << 21;
15113 inst.instruction |= LOW4 (inst.operands[1].reg) << 12;
15114 inst.instruction |= HI1 (inst.operands[1].reg) << 22;
15115
15116 inst.instruction |= offsetbits;
5f4273c7 15117
037e8744 15118 do_vfp_cond_or_thumb ();
5287ad62
JB
15119}
15120
15121static void
15122do_neon_ldr_str (void)
15123{
5287ad62 15124 int is_ldr = (inst.instruction & (1 << 20)) != 0;
5f4273c7 15125
6844b2c2
MGD
15126 /* Use of PC in vstr in ARM mode is deprecated in ARMv7.
15127 And is UNPREDICTABLE in thumb mode. */
15128 if (!is_ldr
15129 && inst.operands[1].reg == REG_PC
15130 && ARM_CPU_HAS_FEATURE (selected_cpu, arm_ext_v7))
15131 {
15132 if (!thumb_mode && warn_on_deprecated)
15133 as_warn (_("Use of PC here is deprecated"));
15134 else
15135 inst.error = _("Use of PC here is UNPREDICTABLE");
15136 }
15137
037e8744
JB
15138 if (inst.operands[0].issingle)
15139 {
cd2f129f
JB
15140 if (is_ldr)
15141 do_vfp_nsyn_opcode ("flds");
15142 else
15143 do_vfp_nsyn_opcode ("fsts");
5287ad62
JB
15144 }
15145 else
5287ad62 15146 {
cd2f129f
JB
15147 if (is_ldr)
15148 do_vfp_nsyn_opcode ("fldd");
5287ad62 15149 else
cd2f129f 15150 do_vfp_nsyn_opcode ("fstd");
5287ad62 15151 }
5287ad62
JB
15152}
15153
15154/* "interleave" version also handles non-interleaving register VLD1/VST1
15155 instructions. */
15156
15157static void
15158do_neon_ld_st_interleave (void)
15159{
037e8744 15160 struct neon_type_el et = neon_check_type (1, NS_NULL,
5287ad62
JB
15161 N_8 | N_16 | N_32 | N_64);
15162 unsigned alignbits = 0;
15163 unsigned idx;
15164 /* The bits in this table go:
15165 0: register stride of one (0) or two (1)
15166 1,2: register list length, minus one (1, 2, 3, 4).
15167 3,4: <n> in instruction type, minus one (VLD<n> / VST<n>).
15168 We use -1 for invalid entries. */
15169 const int typetable[] =
15170 {
15171 0x7, -1, 0xa, -1, 0x6, -1, 0x2, -1, /* VLD1 / VST1. */
15172 -1, -1, 0x8, 0x9, -1, -1, 0x3, -1, /* VLD2 / VST2. */
15173 -1, -1, -1, -1, 0x4, 0x5, -1, -1, /* VLD3 / VST3. */
15174 -1, -1, -1, -1, -1, -1, 0x0, 0x1 /* VLD4 / VST4. */
15175 };
15176 int typebits;
15177
dcbf9037
JB
15178 if (et.type == NT_invtype)
15179 return;
15180
5287ad62
JB
15181 if (inst.operands[1].immisalign)
15182 switch (inst.operands[1].imm >> 8)
15183 {
15184 case 64: alignbits = 1; break;
15185 case 128:
e23c0ad8
JZ
15186 if (NEON_REGLIST_LENGTH (inst.operands[0].imm) != 2
15187 && NEON_REGLIST_LENGTH (inst.operands[0].imm) != 4)
5287ad62
JB
15188 goto bad_alignment;
15189 alignbits = 2;
15190 break;
15191 case 256:
e23c0ad8 15192 if (NEON_REGLIST_LENGTH (inst.operands[0].imm) != 4)
5287ad62
JB
15193 goto bad_alignment;
15194 alignbits = 3;
15195 break;
15196 default:
15197 bad_alignment:
dcbf9037 15198 first_error (_("bad alignment"));
5287ad62
JB
15199 return;
15200 }
15201
15202 inst.instruction |= alignbits << 4;
15203 inst.instruction |= neon_logbits (et.size) << 6;
15204
15205 /* Bits [4:6] of the immediate in a list specifier encode register stride
15206 (minus 1) in bit 4, and list length in bits [5:6]. We put the <n> of
15207 VLD<n>/VST<n> in bits [9:8] of the initial bitmask. Suck it out here, look
15208 up the right value for "type" in a table based on this value and the given
15209 list style, then stick it back. */
15210 idx = ((inst.operands[0].imm >> 4) & 7)
15211 | (((inst.instruction >> 8) & 3) << 3);
15212
15213 typebits = typetable[idx];
5f4273c7 15214
5287ad62
JB
15215 constraint (typebits == -1, _("bad list type for instruction"));
15216
15217 inst.instruction &= ~0xf00;
15218 inst.instruction |= typebits << 8;
15219}
15220
15221/* Check alignment is valid for do_neon_ld_st_lane and do_neon_ld_dup.
15222 *DO_ALIGN is set to 1 if the relevant alignment bit should be set, 0
15223 otherwise. The variable arguments are a list of pairs of legal (size, align)
15224 values, terminated with -1. */
15225
15226static int
15227neon_alignment_bit (int size, int align, int *do_align, ...)
15228{
15229 va_list ap;
15230 int result = FAIL, thissize, thisalign;
5f4273c7 15231
5287ad62
JB
15232 if (!inst.operands[1].immisalign)
15233 {
15234 *do_align = 0;
15235 return SUCCESS;
15236 }
5f4273c7 15237
5287ad62
JB
15238 va_start (ap, do_align);
15239
15240 do
15241 {
15242 thissize = va_arg (ap, int);
15243 if (thissize == -1)
15244 break;
15245 thisalign = va_arg (ap, int);
15246
15247 if (size == thissize && align == thisalign)
15248 result = SUCCESS;
15249 }
15250 while (result != SUCCESS);
15251
15252 va_end (ap);
15253
15254 if (result == SUCCESS)
15255 *do_align = 1;
15256 else
dcbf9037 15257 first_error (_("unsupported alignment for instruction"));
5f4273c7 15258
5287ad62
JB
15259 return result;
15260}
15261
15262static void
15263do_neon_ld_st_lane (void)
15264{
037e8744 15265 struct neon_type_el et = neon_check_type (1, NS_NULL, N_8 | N_16 | N_32);
5287ad62
JB
15266 int align_good, do_align = 0;
15267 int logsize = neon_logbits (et.size);
15268 int align = inst.operands[1].imm >> 8;
15269 int n = (inst.instruction >> 8) & 3;
15270 int max_el = 64 / et.size;
5f4273c7 15271
dcbf9037
JB
15272 if (et.type == NT_invtype)
15273 return;
5f4273c7 15274
5287ad62
JB
15275 constraint (NEON_REGLIST_LENGTH (inst.operands[0].imm) != n + 1,
15276 _("bad list length"));
15277 constraint (NEON_LANE (inst.operands[0].imm) >= max_el,
15278 _("scalar index out of range"));
15279 constraint (n != 0 && NEON_REG_STRIDE (inst.operands[0].imm) == 2
15280 && et.size == 8,
15281 _("stride of 2 unavailable when element size is 8"));
5f4273c7 15282
5287ad62
JB
15283 switch (n)
15284 {
15285 case 0: /* VLD1 / VST1. */
15286 align_good = neon_alignment_bit (et.size, align, &do_align, 16, 16,
15287 32, 32, -1);
15288 if (align_good == FAIL)
15289 return;
15290 if (do_align)
15291 {
15292 unsigned alignbits = 0;
15293 switch (et.size)
15294 {
15295 case 16: alignbits = 0x1; break;
15296 case 32: alignbits = 0x3; break;
15297 default: ;
15298 }
15299 inst.instruction |= alignbits << 4;
15300 }
15301 break;
15302
15303 case 1: /* VLD2 / VST2. */
15304 align_good = neon_alignment_bit (et.size, align, &do_align, 8, 16, 16, 32,
15305 32, 64, -1);
15306 if (align_good == FAIL)
15307 return;
15308 if (do_align)
15309 inst.instruction |= 1 << 4;
15310 break;
15311
15312 case 2: /* VLD3 / VST3. */
15313 constraint (inst.operands[1].immisalign,
15314 _("can't use alignment with this instruction"));
15315 break;
15316
15317 case 3: /* VLD4 / VST4. */
15318 align_good = neon_alignment_bit (et.size, align, &do_align, 8, 32,
15319 16, 64, 32, 64, 32, 128, -1);
15320 if (align_good == FAIL)
15321 return;
15322 if (do_align)
15323 {
15324 unsigned alignbits = 0;
15325 switch (et.size)
15326 {
15327 case 8: alignbits = 0x1; break;
15328 case 16: alignbits = 0x1; break;
15329 case 32: alignbits = (align == 64) ? 0x1 : 0x2; break;
15330 default: ;
15331 }
15332 inst.instruction |= alignbits << 4;
15333 }
15334 break;
15335
15336 default: ;
15337 }
15338
15339 /* Reg stride of 2 is encoded in bit 5 when size==16, bit 6 when size==32. */
15340 if (n != 0 && NEON_REG_STRIDE (inst.operands[0].imm) == 2)
15341 inst.instruction |= 1 << (4 + logsize);
5f4273c7 15342
5287ad62
JB
15343 inst.instruction |= NEON_LANE (inst.operands[0].imm) << (logsize + 5);
15344 inst.instruction |= logsize << 10;
15345}
15346
15347/* Encode single n-element structure to all lanes VLD<n> instructions. */
15348
15349static void
15350do_neon_ld_dup (void)
15351{
037e8744 15352 struct neon_type_el et = neon_check_type (1, NS_NULL, N_8 | N_16 | N_32);
5287ad62
JB
15353 int align_good, do_align = 0;
15354
dcbf9037
JB
15355 if (et.type == NT_invtype)
15356 return;
15357
5287ad62
JB
15358 switch ((inst.instruction >> 8) & 3)
15359 {
15360 case 0: /* VLD1. */
9c2799c2 15361 gas_assert (NEON_REG_STRIDE (inst.operands[0].imm) != 2);
5287ad62
JB
15362 align_good = neon_alignment_bit (et.size, inst.operands[1].imm >> 8,
15363 &do_align, 16, 16, 32, 32, -1);
15364 if (align_good == FAIL)
15365 return;
15366 switch (NEON_REGLIST_LENGTH (inst.operands[0].imm))
15367 {
15368 case 1: break;
15369 case 2: inst.instruction |= 1 << 5; break;
dcbf9037 15370 default: first_error (_("bad list length")); return;
5287ad62
JB
15371 }
15372 inst.instruction |= neon_logbits (et.size) << 6;
15373 break;
15374
15375 case 1: /* VLD2. */
15376 align_good = neon_alignment_bit (et.size, inst.operands[1].imm >> 8,
15377 &do_align, 8, 16, 16, 32, 32, 64, -1);
15378 if (align_good == FAIL)
15379 return;
15380 constraint (NEON_REGLIST_LENGTH (inst.operands[0].imm) != 2,
15381 _("bad list length"));
15382 if (NEON_REG_STRIDE (inst.operands[0].imm) == 2)
15383 inst.instruction |= 1 << 5;
15384 inst.instruction |= neon_logbits (et.size) << 6;
15385 break;
15386
15387 case 2: /* VLD3. */
15388 constraint (inst.operands[1].immisalign,
15389 _("can't use alignment with this instruction"));
15390 constraint (NEON_REGLIST_LENGTH (inst.operands[0].imm) != 3,
15391 _("bad list length"));
15392 if (NEON_REG_STRIDE (inst.operands[0].imm) == 2)
15393 inst.instruction |= 1 << 5;
15394 inst.instruction |= neon_logbits (et.size) << 6;
15395 break;
15396
15397 case 3: /* VLD4. */
15398 {
15399 int align = inst.operands[1].imm >> 8;
15400 align_good = neon_alignment_bit (et.size, align, &do_align, 8, 32,
15401 16, 64, 32, 64, 32, 128, -1);
15402 if (align_good == FAIL)
15403 return;
15404 constraint (NEON_REGLIST_LENGTH (inst.operands[0].imm) != 4,
15405 _("bad list length"));
15406 if (NEON_REG_STRIDE (inst.operands[0].imm) == 2)
15407 inst.instruction |= 1 << 5;
15408 if (et.size == 32 && align == 128)
15409 inst.instruction |= 0x3 << 6;
15410 else
15411 inst.instruction |= neon_logbits (et.size) << 6;
15412 }
15413 break;
15414
15415 default: ;
15416 }
15417
15418 inst.instruction |= do_align << 4;
15419}
15420
15421/* Disambiguate VLD<n> and VST<n> instructions, and fill in common bits (those
15422 apart from bits [11:4]. */
15423
15424static void
15425do_neon_ldx_stx (void)
15426{
b1a769ed
DG
15427 if (inst.operands[1].isreg)
15428 constraint (inst.operands[1].reg == REG_PC, BAD_PC);
15429
5287ad62
JB
15430 switch (NEON_LANE (inst.operands[0].imm))
15431 {
15432 case NEON_INTERLEAVE_LANES:
88714cb8 15433 NEON_ENCODE (INTERLV, inst);
5287ad62
JB
15434 do_neon_ld_st_interleave ();
15435 break;
5f4273c7 15436
5287ad62 15437 case NEON_ALL_LANES:
88714cb8 15438 NEON_ENCODE (DUP, inst);
5287ad62
JB
15439 do_neon_ld_dup ();
15440 break;
5f4273c7 15441
5287ad62 15442 default:
88714cb8 15443 NEON_ENCODE (LANE, inst);
5287ad62
JB
15444 do_neon_ld_st_lane ();
15445 }
15446
15447 /* L bit comes from bit mask. */
15448 inst.instruction |= LOW4 (inst.operands[0].reg) << 12;
15449 inst.instruction |= HI1 (inst.operands[0].reg) << 22;
15450 inst.instruction |= inst.operands[1].reg << 16;
5f4273c7 15451
5287ad62
JB
15452 if (inst.operands[1].postind)
15453 {
15454 int postreg = inst.operands[1].imm & 0xf;
15455 constraint (!inst.operands[1].immisreg,
15456 _("post-index must be a register"));
15457 constraint (postreg == 0xd || postreg == 0xf,
15458 _("bad register for post-index"));
15459 inst.instruction |= postreg;
15460 }
15461 else if (inst.operands[1].writeback)
15462 {
15463 inst.instruction |= 0xd;
15464 }
15465 else
5f4273c7
NC
15466 inst.instruction |= 0xf;
15467
5287ad62
JB
15468 if (thumb_mode)
15469 inst.instruction |= 0xf9000000;
15470 else
15471 inst.instruction |= 0xf4000000;
15472}
5287ad62
JB
15473\f
15474/* Overall per-instruction processing. */
15475
15476/* We need to be able to fix up arbitrary expressions in some statements.
15477 This is so that we can handle symbols that are an arbitrary distance from
15478 the pc. The most common cases are of the form ((+/-sym -/+ . - 8) & mask),
15479 which returns part of an address in a form which will be valid for
15480 a data instruction. We do this by pushing the expression into a symbol
15481 in the expr_section, and creating a fix for that. */
15482
15483static void
15484fix_new_arm (fragS * frag,
15485 int where,
15486 short int size,
15487 expressionS * exp,
15488 int pc_rel,
15489 int reloc)
15490{
15491 fixS * new_fix;
15492
15493 switch (exp->X_op)
15494 {
15495 case O_constant:
6e7ce2cd
PB
15496 if (pc_rel)
15497 {
15498 /* Create an absolute valued symbol, so we have something to
15499 refer to in the object file. Unfortunately for us, gas's
15500 generic expression parsing will already have folded out
15501 any use of .set foo/.type foo %function that may have
15502 been used to set type information of the target location,
15503 that's being specified symbolically. We have to presume
15504 the user knows what they are doing. */
15505 char name[16 + 8];
15506 symbolS *symbol;
15507
15508 sprintf (name, "*ABS*0x%lx", (unsigned long)exp->X_add_number);
15509
15510 symbol = symbol_find_or_make (name);
15511 S_SET_SEGMENT (symbol, absolute_section);
15512 symbol_set_frag (symbol, &zero_address_frag);
15513 S_SET_VALUE (symbol, exp->X_add_number);
15514 exp->X_op = O_symbol;
15515 exp->X_add_symbol = symbol;
15516 exp->X_add_number = 0;
15517 }
15518 /* FALLTHROUGH */
5287ad62
JB
15519 case O_symbol:
15520 case O_add:
15521 case O_subtract:
21d799b5
NC
15522 new_fix = fix_new_exp (frag, where, size, exp, pc_rel,
15523 (enum bfd_reloc_code_real) reloc);
5287ad62
JB
15524 break;
15525
15526 default:
21d799b5
NC
15527 new_fix = (fixS *) fix_new (frag, where, size, make_expr_symbol (exp), 0,
15528 pc_rel, (enum bfd_reloc_code_real) reloc);
5287ad62
JB
15529 break;
15530 }
15531
15532 /* Mark whether the fix is to a THUMB instruction, or an ARM
15533 instruction. */
15534 new_fix->tc_fix_data = thumb_mode;
15535}
15536
15537/* Create a frg for an instruction requiring relaxation. */
15538static void
15539output_relax_insn (void)
15540{
15541 char * to;
15542 symbolS *sym;
0110f2b8
PB
15543 int offset;
15544
6e1cb1a6
PB
15545 /* The size of the instruction is unknown, so tie the debug info to the
15546 start of the instruction. */
15547 dwarf2_emit_insn (0);
6e1cb1a6 15548
0110f2b8
PB
15549 switch (inst.reloc.exp.X_op)
15550 {
15551 case O_symbol:
15552 sym = inst.reloc.exp.X_add_symbol;
15553 offset = inst.reloc.exp.X_add_number;
15554 break;
15555 case O_constant:
15556 sym = NULL;
15557 offset = inst.reloc.exp.X_add_number;
15558 break;
15559 default:
15560 sym = make_expr_symbol (&inst.reloc.exp);
15561 offset = 0;
15562 break;
15563 }
15564 to = frag_var (rs_machine_dependent, INSN_SIZE, THUMB_SIZE,
15565 inst.relax, sym, offset, NULL/*offset, opcode*/);
15566 md_number_to_chars (to, inst.instruction, THUMB_SIZE);
0110f2b8
PB
15567}
15568
15569/* Write a 32-bit thumb instruction to buf. */
15570static void
15571put_thumb32_insn (char * buf, unsigned long insn)
15572{
15573 md_number_to_chars (buf, insn >> 16, THUMB_SIZE);
15574 md_number_to_chars (buf + THUMB_SIZE, insn, THUMB_SIZE);
15575}
15576
b99bd4ef 15577static void
c19d1205 15578output_inst (const char * str)
b99bd4ef 15579{
c19d1205 15580 char * to = NULL;
b99bd4ef 15581
c19d1205 15582 if (inst.error)
b99bd4ef 15583 {
c19d1205 15584 as_bad ("%s -- `%s'", inst.error, str);
b99bd4ef
NC
15585 return;
15586 }
5f4273c7
NC
15587 if (inst.relax)
15588 {
15589 output_relax_insn ();
0110f2b8 15590 return;
5f4273c7 15591 }
c19d1205
ZW
15592 if (inst.size == 0)
15593 return;
b99bd4ef 15594
c19d1205 15595 to = frag_more (inst.size);
8dc2430f
NC
15596 /* PR 9814: Record the thumb mode into the current frag so that we know
15597 what type of NOP padding to use, if necessary. We override any previous
15598 setting so that if the mode has changed then the NOPS that we use will
15599 match the encoding of the last instruction in the frag. */
cd000bff 15600 frag_now->tc_frag_data.thumb_mode = thumb_mode | MODE_RECORDED;
c19d1205
ZW
15601
15602 if (thumb_mode && (inst.size > THUMB_SIZE))
b99bd4ef 15603 {
9c2799c2 15604 gas_assert (inst.size == (2 * THUMB_SIZE));
0110f2b8 15605 put_thumb32_insn (to, inst.instruction);
b99bd4ef 15606 }
c19d1205 15607 else if (inst.size > INSN_SIZE)
b99bd4ef 15608 {
9c2799c2 15609 gas_assert (inst.size == (2 * INSN_SIZE));
c19d1205
ZW
15610 md_number_to_chars (to, inst.instruction, INSN_SIZE);
15611 md_number_to_chars (to + INSN_SIZE, inst.instruction, INSN_SIZE);
b99bd4ef 15612 }
c19d1205
ZW
15613 else
15614 md_number_to_chars (to, inst.instruction, inst.size);
b99bd4ef 15615
c19d1205
ZW
15616 if (inst.reloc.type != BFD_RELOC_UNUSED)
15617 fix_new_arm (frag_now, to - frag_now->fr_literal,
15618 inst.size, & inst.reloc.exp, inst.reloc.pc_rel,
15619 inst.reloc.type);
b99bd4ef 15620
c19d1205 15621 dwarf2_emit_insn (inst.size);
c19d1205 15622}
b99bd4ef 15623
e07e6e58
NC
15624static char *
15625output_it_inst (int cond, int mask, char * to)
15626{
15627 unsigned long instruction = 0xbf00;
15628
15629 mask &= 0xf;
15630 instruction |= mask;
15631 instruction |= cond << 4;
15632
15633 if (to == NULL)
15634 {
15635 to = frag_more (2);
15636#ifdef OBJ_ELF
15637 dwarf2_emit_insn (2);
15638#endif
15639 }
15640
15641 md_number_to_chars (to, instruction, 2);
15642
15643 return to;
15644}
15645
c19d1205
ZW
15646/* Tag values used in struct asm_opcode's tag field. */
15647enum opcode_tag
15648{
15649 OT_unconditional, /* Instruction cannot be conditionalized.
15650 The ARM condition field is still 0xE. */
15651 OT_unconditionalF, /* Instruction cannot be conditionalized
15652 and carries 0xF in its ARM condition field. */
15653 OT_csuffix, /* Instruction takes a conditional suffix. */
037e8744
JB
15654 OT_csuffixF, /* Some forms of the instruction take a conditional
15655 suffix, others place 0xF where the condition field
15656 would be. */
c19d1205
ZW
15657 OT_cinfix3, /* Instruction takes a conditional infix,
15658 beginning at character index 3. (In
15659 unified mode, it becomes a suffix.) */
088fa78e
KH
15660 OT_cinfix3_deprecated, /* The same as OT_cinfix3. This is used for
15661 tsts, cmps, cmns, and teqs. */
e3cb604e
PB
15662 OT_cinfix3_legacy, /* Legacy instruction takes a conditional infix at
15663 character index 3, even in unified mode. Used for
15664 legacy instructions where suffix and infix forms
15665 may be ambiguous. */
c19d1205 15666 OT_csuf_or_in3, /* Instruction takes either a conditional
e3cb604e 15667 suffix or an infix at character index 3. */
c19d1205
ZW
15668 OT_odd_infix_unc, /* This is the unconditional variant of an
15669 instruction that takes a conditional infix
15670 at an unusual position. In unified mode,
15671 this variant will accept a suffix. */
15672 OT_odd_infix_0 /* Values greater than or equal to OT_odd_infix_0
15673 are the conditional variants of instructions that
15674 take conditional infixes in unusual positions.
15675 The infix appears at character index
15676 (tag - OT_odd_infix_0). These are not accepted
15677 in unified mode. */
15678};
b99bd4ef 15679
c19d1205
ZW
15680/* Subroutine of md_assemble, responsible for looking up the primary
15681 opcode from the mnemonic the user wrote. STR points to the
15682 beginning of the mnemonic.
15683
15684 This is not simply a hash table lookup, because of conditional
15685 variants. Most instructions have conditional variants, which are
15686 expressed with a _conditional affix_ to the mnemonic. If we were
15687 to encode each conditional variant as a literal string in the opcode
15688 table, it would have approximately 20,000 entries.
15689
15690 Most mnemonics take this affix as a suffix, and in unified syntax,
15691 'most' is upgraded to 'all'. However, in the divided syntax, some
15692 instructions take the affix as an infix, notably the s-variants of
15693 the arithmetic instructions. Of those instructions, all but six
15694 have the infix appear after the third character of the mnemonic.
15695
15696 Accordingly, the algorithm for looking up primary opcodes given
15697 an identifier is:
15698
15699 1. Look up the identifier in the opcode table.
15700 If we find a match, go to step U.
15701
15702 2. Look up the last two characters of the identifier in the
15703 conditions table. If we find a match, look up the first N-2
15704 characters of the identifier in the opcode table. If we
15705 find a match, go to step CE.
15706
15707 3. Look up the fourth and fifth characters of the identifier in
15708 the conditions table. If we find a match, extract those
15709 characters from the identifier, and look up the remaining
15710 characters in the opcode table. If we find a match, go
15711 to step CM.
15712
15713 4. Fail.
15714
15715 U. Examine the tag field of the opcode structure, in case this is
15716 one of the six instructions with its conditional infix in an
15717 unusual place. If it is, the tag tells us where to find the
15718 infix; look it up in the conditions table and set inst.cond
15719 accordingly. Otherwise, this is an unconditional instruction.
15720 Again set inst.cond accordingly. Return the opcode structure.
15721
15722 CE. Examine the tag field to make sure this is an instruction that
15723 should receive a conditional suffix. If it is not, fail.
15724 Otherwise, set inst.cond from the suffix we already looked up,
15725 and return the opcode structure.
15726
15727 CM. Examine the tag field to make sure this is an instruction that
15728 should receive a conditional infix after the third character.
15729 If it is not, fail. Otherwise, undo the edits to the current
15730 line of input and proceed as for case CE. */
15731
15732static const struct asm_opcode *
15733opcode_lookup (char **str)
15734{
15735 char *end, *base;
15736 char *affix;
15737 const struct asm_opcode *opcode;
15738 const struct asm_cond *cond;
e3cb604e 15739 char save[2];
c19d1205
ZW
15740
15741 /* Scan up to the end of the mnemonic, which must end in white space,
721a8186 15742 '.' (in unified mode, or for Neon/VFP instructions), or end of string. */
c19d1205 15743 for (base = end = *str; *end != '\0'; end++)
721a8186 15744 if (*end == ' ' || *end == '.')
c19d1205 15745 break;
b99bd4ef 15746
c19d1205 15747 if (end == base)
c921be7d 15748 return NULL;
b99bd4ef 15749
5287ad62 15750 /* Handle a possible width suffix and/or Neon type suffix. */
c19d1205 15751 if (end[0] == '.')
b99bd4ef 15752 {
5287ad62 15753 int offset = 2;
5f4273c7 15754
267d2029
JB
15755 /* The .w and .n suffixes are only valid if the unified syntax is in
15756 use. */
15757 if (unified_syntax && end[1] == 'w')
c19d1205 15758 inst.size_req = 4;
267d2029 15759 else if (unified_syntax && end[1] == 'n')
c19d1205
ZW
15760 inst.size_req = 2;
15761 else
5287ad62
JB
15762 offset = 0;
15763
15764 inst.vectype.elems = 0;
15765
15766 *str = end + offset;
b99bd4ef 15767
5f4273c7 15768 if (end[offset] == '.')
5287ad62 15769 {
267d2029
JB
15770 /* See if we have a Neon type suffix (possible in either unified or
15771 non-unified ARM syntax mode). */
dcbf9037 15772 if (parse_neon_type (&inst.vectype, str) == FAIL)
c921be7d 15773 return NULL;
5287ad62
JB
15774 }
15775 else if (end[offset] != '\0' && end[offset] != ' ')
c921be7d 15776 return NULL;
b99bd4ef 15777 }
c19d1205
ZW
15778 else
15779 *str = end;
b99bd4ef 15780
c19d1205 15781 /* Look for unaffixed or special-case affixed mnemonic. */
21d799b5
NC
15782 opcode = (const struct asm_opcode *) hash_find_n (arm_ops_hsh, base,
15783 end - base);
c19d1205 15784 if (opcode)
b99bd4ef 15785 {
c19d1205
ZW
15786 /* step U */
15787 if (opcode->tag < OT_odd_infix_0)
b99bd4ef 15788 {
c19d1205
ZW
15789 inst.cond = COND_ALWAYS;
15790 return opcode;
b99bd4ef 15791 }
b99bd4ef 15792
278df34e 15793 if (warn_on_deprecated && unified_syntax)
c19d1205
ZW
15794 as_warn (_("conditional infixes are deprecated in unified syntax"));
15795 affix = base + (opcode->tag - OT_odd_infix_0);
21d799b5 15796 cond = (const struct asm_cond *) hash_find_n (arm_cond_hsh, affix, 2);
9c2799c2 15797 gas_assert (cond);
b99bd4ef 15798
c19d1205
ZW
15799 inst.cond = cond->value;
15800 return opcode;
15801 }
b99bd4ef 15802
c19d1205
ZW
15803 /* Cannot have a conditional suffix on a mnemonic of less than two
15804 characters. */
15805 if (end - base < 3)
c921be7d 15806 return NULL;
b99bd4ef 15807
c19d1205
ZW
15808 /* Look for suffixed mnemonic. */
15809 affix = end - 2;
21d799b5
NC
15810 cond = (const struct asm_cond *) hash_find_n (arm_cond_hsh, affix, 2);
15811 opcode = (const struct asm_opcode *) hash_find_n (arm_ops_hsh, base,
15812 affix - base);
c19d1205
ZW
15813 if (opcode && cond)
15814 {
15815 /* step CE */
15816 switch (opcode->tag)
15817 {
e3cb604e
PB
15818 case OT_cinfix3_legacy:
15819 /* Ignore conditional suffixes matched on infix only mnemonics. */
15820 break;
15821
c19d1205 15822 case OT_cinfix3:
088fa78e 15823 case OT_cinfix3_deprecated:
c19d1205
ZW
15824 case OT_odd_infix_unc:
15825 if (!unified_syntax)
e3cb604e 15826 return 0;
c19d1205
ZW
15827 /* else fall through */
15828
15829 case OT_csuffix:
037e8744 15830 case OT_csuffixF:
c19d1205
ZW
15831 case OT_csuf_or_in3:
15832 inst.cond = cond->value;
15833 return opcode;
15834
15835 case OT_unconditional:
15836 case OT_unconditionalF:
dfa9f0d5 15837 if (thumb_mode)
c921be7d 15838 inst.cond = cond->value;
dfa9f0d5
PB
15839 else
15840 {
c921be7d 15841 /* Delayed diagnostic. */
dfa9f0d5
PB
15842 inst.error = BAD_COND;
15843 inst.cond = COND_ALWAYS;
15844 }
c19d1205 15845 return opcode;
b99bd4ef 15846
c19d1205 15847 default:
c921be7d 15848 return NULL;
c19d1205
ZW
15849 }
15850 }
b99bd4ef 15851
c19d1205
ZW
15852 /* Cannot have a usual-position infix on a mnemonic of less than
15853 six characters (five would be a suffix). */
15854 if (end - base < 6)
c921be7d 15855 return NULL;
b99bd4ef 15856
c19d1205
ZW
15857 /* Look for infixed mnemonic in the usual position. */
15858 affix = base + 3;
21d799b5 15859 cond = (const struct asm_cond *) hash_find_n (arm_cond_hsh, affix, 2);
e3cb604e 15860 if (!cond)
c921be7d 15861 return NULL;
e3cb604e
PB
15862
15863 memcpy (save, affix, 2);
15864 memmove (affix, affix + 2, (end - affix) - 2);
21d799b5
NC
15865 opcode = (const struct asm_opcode *) hash_find_n (arm_ops_hsh, base,
15866 (end - base) - 2);
e3cb604e
PB
15867 memmove (affix + 2, affix, (end - affix) - 2);
15868 memcpy (affix, save, 2);
15869
088fa78e
KH
15870 if (opcode
15871 && (opcode->tag == OT_cinfix3
15872 || opcode->tag == OT_cinfix3_deprecated
15873 || opcode->tag == OT_csuf_or_in3
15874 || opcode->tag == OT_cinfix3_legacy))
b99bd4ef 15875 {
c921be7d 15876 /* Step CM. */
278df34e 15877 if (warn_on_deprecated && unified_syntax
088fa78e
KH
15878 && (opcode->tag == OT_cinfix3
15879 || opcode->tag == OT_cinfix3_deprecated))
c19d1205
ZW
15880 as_warn (_("conditional infixes are deprecated in unified syntax"));
15881
15882 inst.cond = cond->value;
15883 return opcode;
b99bd4ef
NC
15884 }
15885
c921be7d 15886 return NULL;
b99bd4ef
NC
15887}
15888
e07e6e58
NC
15889/* This function generates an initial IT instruction, leaving its block
15890 virtually open for the new instructions. Eventually,
15891 the mask will be updated by now_it_add_mask () each time
15892 a new instruction needs to be included in the IT block.
15893 Finally, the block is closed with close_automatic_it_block ().
15894 The block closure can be requested either from md_assemble (),
15895 a tencode (), or due to a label hook. */
15896
15897static void
15898new_automatic_it_block (int cond)
15899{
15900 now_it.state = AUTOMATIC_IT_BLOCK;
15901 now_it.mask = 0x18;
15902 now_it.cc = cond;
15903 now_it.block_length = 1;
cd000bff 15904 mapping_state (MAP_THUMB);
e07e6e58
NC
15905 now_it.insn = output_it_inst (cond, now_it.mask, NULL);
15906}
15907
15908/* Close an automatic IT block.
15909 See comments in new_automatic_it_block (). */
15910
15911static void
15912close_automatic_it_block (void)
15913{
15914 now_it.mask = 0x10;
15915 now_it.block_length = 0;
15916}
15917
15918/* Update the mask of the current automatically-generated IT
15919 instruction. See comments in new_automatic_it_block (). */
15920
15921static void
15922now_it_add_mask (int cond)
15923{
15924#define CLEAR_BIT(value, nbit) ((value) & ~(1 << (nbit)))
15925#define SET_BIT_VALUE(value, bitvalue, nbit) (CLEAR_BIT (value, nbit) \
15926 | ((bitvalue) << (nbit)))
e07e6e58 15927 const int resulting_bit = (cond & 1);
c921be7d 15928
e07e6e58
NC
15929 now_it.mask &= 0xf;
15930 now_it.mask = SET_BIT_VALUE (now_it.mask,
15931 resulting_bit,
15932 (5 - now_it.block_length));
15933 now_it.mask = SET_BIT_VALUE (now_it.mask,
15934 1,
15935 ((5 - now_it.block_length) - 1) );
15936 output_it_inst (now_it.cc, now_it.mask, now_it.insn);
15937
15938#undef CLEAR_BIT
15939#undef SET_BIT_VALUE
e07e6e58
NC
15940}
15941
15942/* The IT blocks handling machinery is accessed through the these functions:
15943 it_fsm_pre_encode () from md_assemble ()
15944 set_it_insn_type () optional, from the tencode functions
15945 set_it_insn_type_last () ditto
15946 in_it_block () ditto
15947 it_fsm_post_encode () from md_assemble ()
15948 force_automatic_it_block_close () from label habdling functions
15949
15950 Rationale:
15951 1) md_assemble () calls it_fsm_pre_encode () before calling tencode (),
15952 initializing the IT insn type with a generic initial value depending
15953 on the inst.condition.
15954 2) During the tencode function, two things may happen:
15955 a) The tencode function overrides the IT insn type by
15956 calling either set_it_insn_type (type) or set_it_insn_type_last ().
15957 b) The tencode function queries the IT block state by
15958 calling in_it_block () (i.e. to determine narrow/not narrow mode).
15959
15960 Both set_it_insn_type and in_it_block run the internal FSM state
15961 handling function (handle_it_state), because: a) setting the IT insn
15962 type may incur in an invalid state (exiting the function),
15963 and b) querying the state requires the FSM to be updated.
15964 Specifically we want to avoid creating an IT block for conditional
15965 branches, so it_fsm_pre_encode is actually a guess and we can't
15966 determine whether an IT block is required until the tencode () routine
15967 has decided what type of instruction this actually it.
15968 Because of this, if set_it_insn_type and in_it_block have to be used,
15969 set_it_insn_type has to be called first.
15970
15971 set_it_insn_type_last () is a wrapper of set_it_insn_type (type), that
15972 determines the insn IT type depending on the inst.cond code.
15973 When a tencode () routine encodes an instruction that can be
15974 either outside an IT block, or, in the case of being inside, has to be
15975 the last one, set_it_insn_type_last () will determine the proper
15976 IT instruction type based on the inst.cond code. Otherwise,
15977 set_it_insn_type can be called for overriding that logic or
15978 for covering other cases.
15979
15980 Calling handle_it_state () may not transition the IT block state to
15981 OUTSIDE_IT_BLOCK immediatelly, since the (current) state could be
15982 still queried. Instead, if the FSM determines that the state should
15983 be transitioned to OUTSIDE_IT_BLOCK, a flag is marked to be closed
15984 after the tencode () function: that's what it_fsm_post_encode () does.
15985
15986 Since in_it_block () calls the state handling function to get an
15987 updated state, an error may occur (due to invalid insns combination).
15988 In that case, inst.error is set.
15989 Therefore, inst.error has to be checked after the execution of
15990 the tencode () routine.
15991
15992 3) Back in md_assemble(), it_fsm_post_encode () is called to commit
15993 any pending state change (if any) that didn't take place in
15994 handle_it_state () as explained above. */
15995
15996static void
15997it_fsm_pre_encode (void)
15998{
15999 if (inst.cond != COND_ALWAYS)
16000 inst.it_insn_type = INSIDE_IT_INSN;
16001 else
16002 inst.it_insn_type = OUTSIDE_IT_INSN;
16003
16004 now_it.state_handled = 0;
16005}
16006
16007/* IT state FSM handling function. */
16008
16009static int
16010handle_it_state (void)
16011{
16012 now_it.state_handled = 1;
16013
16014 switch (now_it.state)
16015 {
16016 case OUTSIDE_IT_BLOCK:
16017 switch (inst.it_insn_type)
16018 {
16019 case OUTSIDE_IT_INSN:
16020 break;
16021
16022 case INSIDE_IT_INSN:
16023 case INSIDE_IT_LAST_INSN:
16024 if (thumb_mode == 0)
16025 {
c921be7d 16026 if (unified_syntax
e07e6e58
NC
16027 && !(implicit_it_mode & IMPLICIT_IT_MODE_ARM))
16028 as_tsktsk (_("Warning: conditional outside an IT block"\
16029 " for Thumb."));
16030 }
16031 else
16032 {
16033 if ((implicit_it_mode & IMPLICIT_IT_MODE_THUMB)
16034 && ARM_CPU_HAS_FEATURE (cpu_variant, arm_arch_t2))
16035 {
16036 /* Automatically generate the IT instruction. */
16037 new_automatic_it_block (inst.cond);
16038 if (inst.it_insn_type == INSIDE_IT_LAST_INSN)
16039 close_automatic_it_block ();
16040 }
16041 else
16042 {
16043 inst.error = BAD_OUT_IT;
16044 return FAIL;
16045 }
16046 }
16047 break;
16048
16049 case IF_INSIDE_IT_LAST_INSN:
16050 case NEUTRAL_IT_INSN:
16051 break;
16052
16053 case IT_INSN:
16054 now_it.state = MANUAL_IT_BLOCK;
16055 now_it.block_length = 0;
16056 break;
16057 }
16058 break;
16059
16060 case AUTOMATIC_IT_BLOCK:
16061 /* Three things may happen now:
16062 a) We should increment current it block size;
16063 b) We should close current it block (closing insn or 4 insns);
16064 c) We should close current it block and start a new one (due
16065 to incompatible conditions or
16066 4 insns-length block reached). */
16067
16068 switch (inst.it_insn_type)
16069 {
16070 case OUTSIDE_IT_INSN:
16071 /* The closure of the block shall happen immediatelly,
16072 so any in_it_block () call reports the block as closed. */
16073 force_automatic_it_block_close ();
16074 break;
16075
16076 case INSIDE_IT_INSN:
16077 case INSIDE_IT_LAST_INSN:
16078 case IF_INSIDE_IT_LAST_INSN:
16079 now_it.block_length++;
16080
16081 if (now_it.block_length > 4
16082 || !now_it_compatible (inst.cond))
16083 {
16084 force_automatic_it_block_close ();
16085 if (inst.it_insn_type != IF_INSIDE_IT_LAST_INSN)
16086 new_automatic_it_block (inst.cond);
16087 }
16088 else
16089 {
16090 now_it_add_mask (inst.cond);
16091 }
16092
16093 if (now_it.state == AUTOMATIC_IT_BLOCK
16094 && (inst.it_insn_type == INSIDE_IT_LAST_INSN
16095 || inst.it_insn_type == IF_INSIDE_IT_LAST_INSN))
16096 close_automatic_it_block ();
16097 break;
16098
16099 case NEUTRAL_IT_INSN:
16100 now_it.block_length++;
16101
16102 if (now_it.block_length > 4)
16103 force_automatic_it_block_close ();
16104 else
16105 now_it_add_mask (now_it.cc & 1);
16106 break;
16107
16108 case IT_INSN:
16109 close_automatic_it_block ();
16110 now_it.state = MANUAL_IT_BLOCK;
16111 break;
16112 }
16113 break;
16114
16115 case MANUAL_IT_BLOCK:
16116 {
16117 /* Check conditional suffixes. */
16118 const int cond = now_it.cc ^ ((now_it.mask >> 4) & 1) ^ 1;
16119 int is_last;
16120 now_it.mask <<= 1;
16121 now_it.mask &= 0x1f;
16122 is_last = (now_it.mask == 0x10);
16123
16124 switch (inst.it_insn_type)
16125 {
16126 case OUTSIDE_IT_INSN:
16127 inst.error = BAD_NOT_IT;
16128 return FAIL;
16129
16130 case INSIDE_IT_INSN:
16131 if (cond != inst.cond)
16132 {
16133 inst.error = BAD_IT_COND;
16134 return FAIL;
16135 }
16136 break;
16137
16138 case INSIDE_IT_LAST_INSN:
16139 case IF_INSIDE_IT_LAST_INSN:
16140 if (cond != inst.cond)
16141 {
16142 inst.error = BAD_IT_COND;
16143 return FAIL;
16144 }
16145 if (!is_last)
16146 {
16147 inst.error = BAD_BRANCH;
16148 return FAIL;
16149 }
16150 break;
16151
16152 case NEUTRAL_IT_INSN:
16153 /* The BKPT instruction is unconditional even in an IT block. */
16154 break;
16155
16156 case IT_INSN:
16157 inst.error = BAD_IT_IT;
16158 return FAIL;
16159 }
16160 }
16161 break;
16162 }
16163
16164 return SUCCESS;
16165}
16166
16167static void
16168it_fsm_post_encode (void)
16169{
16170 int is_last;
16171
16172 if (!now_it.state_handled)
16173 handle_it_state ();
16174
16175 is_last = (now_it.mask == 0x10);
16176 if (is_last)
16177 {
16178 now_it.state = OUTSIDE_IT_BLOCK;
16179 now_it.mask = 0;
16180 }
16181}
16182
16183static void
16184force_automatic_it_block_close (void)
16185{
16186 if (now_it.state == AUTOMATIC_IT_BLOCK)
16187 {
16188 close_automatic_it_block ();
16189 now_it.state = OUTSIDE_IT_BLOCK;
16190 now_it.mask = 0;
16191 }
16192}
16193
16194static int
16195in_it_block (void)
16196{
16197 if (!now_it.state_handled)
16198 handle_it_state ();
16199
16200 return now_it.state != OUTSIDE_IT_BLOCK;
16201}
16202
c19d1205
ZW
16203void
16204md_assemble (char *str)
b99bd4ef 16205{
c19d1205
ZW
16206 char *p = str;
16207 const struct asm_opcode * opcode;
b99bd4ef 16208
c19d1205
ZW
16209 /* Align the previous label if needed. */
16210 if (last_label_seen != NULL)
b99bd4ef 16211 {
c19d1205
ZW
16212 symbol_set_frag (last_label_seen, frag_now);
16213 S_SET_VALUE (last_label_seen, (valueT) frag_now_fix ());
16214 S_SET_SEGMENT (last_label_seen, now_seg);
b99bd4ef
NC
16215 }
16216
c19d1205
ZW
16217 memset (&inst, '\0', sizeof (inst));
16218 inst.reloc.type = BFD_RELOC_UNUSED;
b99bd4ef 16219
c19d1205
ZW
16220 opcode = opcode_lookup (&p);
16221 if (!opcode)
b99bd4ef 16222 {
c19d1205 16223 /* It wasn't an instruction, but it might be a register alias of
dcbf9037 16224 the form alias .req reg, or a Neon .dn/.qn directive. */
c921be7d
NC
16225 if (! create_register_alias (str, p)
16226 && ! create_neon_reg_alias (str, p))
c19d1205 16227 as_bad (_("bad instruction `%s'"), str);
b99bd4ef 16228
b99bd4ef
NC
16229 return;
16230 }
16231
278df34e 16232 if (warn_on_deprecated && opcode->tag == OT_cinfix3_deprecated)
088fa78e
KH
16233 as_warn (_("s suffix on comparison instruction is deprecated"));
16234
037e8744
JB
16235 /* The value which unconditional instructions should have in place of the
16236 condition field. */
16237 inst.uncond_value = (opcode->tag == OT_csuffixF) ? 0xf : -1;
16238
c19d1205 16239 if (thumb_mode)
b99bd4ef 16240 {
e74cfd16 16241 arm_feature_set variant;
8f06b2d8
PB
16242
16243 variant = cpu_variant;
16244 /* Only allow coprocessor instructions on Thumb-2 capable devices. */
e74cfd16
PB
16245 if (!ARM_CPU_HAS_FEATURE (variant, arm_arch_t2))
16246 ARM_CLEAR_FEATURE (variant, variant, fpu_any_hard);
c19d1205 16247 /* Check that this instruction is supported for this CPU. */
62b3e311
PB
16248 if (!opcode->tvariant
16249 || (thumb_mode == 1
16250 && !ARM_CPU_HAS_FEATURE (variant, *opcode->tvariant)))
b99bd4ef 16251 {
bf3eeda7 16252 as_bad (_("selected processor does not support Thumb mode `%s'"), str);
b99bd4ef
NC
16253 return;
16254 }
c19d1205
ZW
16255 if (inst.cond != COND_ALWAYS && !unified_syntax
16256 && opcode->tencode != do_t_branch)
b99bd4ef 16257 {
c19d1205 16258 as_bad (_("Thumb does not support conditional execution"));
b99bd4ef
NC
16259 return;
16260 }
16261
752d5da4 16262 if (!ARM_CPU_HAS_FEATURE (variant, arm_ext_v6t2))
076d447c 16263 {
7e806470 16264 if (opcode->tencode != do_t_blx && opcode->tencode != do_t_branch23
752d5da4
NC
16265 && !(ARM_CPU_HAS_FEATURE(*opcode->tvariant, arm_ext_msr)
16266 || ARM_CPU_HAS_FEATURE(*opcode->tvariant, arm_ext_barrier)))
16267 {
16268 /* Two things are addressed here.
16269 1) Implicit require narrow instructions on Thumb-1.
16270 This avoids relaxation accidentally introducing Thumb-2
16271 instructions.
16272 2) Reject wide instructions in non Thumb-2 cores. */
16273 if (inst.size_req == 0)
16274 inst.size_req = 2;
16275 else if (inst.size_req == 4)
16276 {
bf3eeda7 16277 as_bad (_("selected processor does not support Thumb-2 mode `%s'"), str);
752d5da4
NC
16278 return;
16279 }
16280 }
076d447c
PB
16281 }
16282
c19d1205
ZW
16283 inst.instruction = opcode->tvalue;
16284
5be8be5d 16285 if (!parse_operands (p, opcode->operands, /*thumb=*/TRUE))
e07e6e58
NC
16286 {
16287 /* Prepare the it_insn_type for those encodings that don't set
16288 it. */
16289 it_fsm_pre_encode ();
c19d1205 16290
e07e6e58
NC
16291 opcode->tencode ();
16292
16293 it_fsm_post_encode ();
16294 }
e27ec89e 16295
0110f2b8 16296 if (!(inst.error || inst.relax))
b99bd4ef 16297 {
9c2799c2 16298 gas_assert (inst.instruction < 0xe800 || inst.instruction > 0xffff);
c19d1205
ZW
16299 inst.size = (inst.instruction > 0xffff ? 4 : 2);
16300 if (inst.size_req && inst.size_req != inst.size)
b99bd4ef 16301 {
c19d1205 16302 as_bad (_("cannot honor width suffix -- `%s'"), str);
b99bd4ef
NC
16303 return;
16304 }
16305 }
076d447c
PB
16306
16307 /* Something has gone badly wrong if we try to relax a fixed size
16308 instruction. */
9c2799c2 16309 gas_assert (inst.size_req == 0 || !inst.relax);
076d447c 16310
e74cfd16
PB
16311 ARM_MERGE_FEATURE_SETS (thumb_arch_used, thumb_arch_used,
16312 *opcode->tvariant);
ee065d83 16313 /* Many Thumb-2 instructions also have Thumb-1 variants, so explicitly
708587a4 16314 set those bits when Thumb-2 32-bit instructions are seen. ie.
7e806470 16315 anything other than bl/blx and v6-M instructions.
ee065d83 16316 This is overly pessimistic for relaxable instructions. */
7e806470
PB
16317 if (((inst.size == 4 && (inst.instruction & 0xf800e800) != 0xf000e800)
16318 || inst.relax)
e07e6e58
NC
16319 && !(ARM_CPU_HAS_FEATURE (*opcode->tvariant, arm_ext_msr)
16320 || ARM_CPU_HAS_FEATURE (*opcode->tvariant, arm_ext_barrier)))
e74cfd16
PB
16321 ARM_MERGE_FEATURE_SETS (thumb_arch_used, thumb_arch_used,
16322 arm_ext_v6t2);
cd000bff 16323
88714cb8
DG
16324 check_neon_suffixes;
16325
cd000bff 16326 if (!inst.error)
c877a2f2
NC
16327 {
16328 mapping_state (MAP_THUMB);
16329 }
c19d1205 16330 }
3e9e4fcf 16331 else if (ARM_CPU_HAS_FEATURE (cpu_variant, arm_ext_v1))
c19d1205 16332 {
845b51d6
PB
16333 bfd_boolean is_bx;
16334
16335 /* bx is allowed on v5 cores, and sometimes on v4 cores. */
16336 is_bx = (opcode->aencode == do_bx);
16337
c19d1205 16338 /* Check that this instruction is supported for this CPU. */
845b51d6
PB
16339 if (!(is_bx && fix_v4bx)
16340 && !(opcode->avariant &&
16341 ARM_CPU_HAS_FEATURE (cpu_variant, *opcode->avariant)))
b99bd4ef 16342 {
bf3eeda7 16343 as_bad (_("selected processor does not support ARM mode `%s'"), str);
c19d1205 16344 return;
b99bd4ef 16345 }
c19d1205 16346 if (inst.size_req)
b99bd4ef 16347 {
c19d1205
ZW
16348 as_bad (_("width suffixes are invalid in ARM mode -- `%s'"), str);
16349 return;
b99bd4ef
NC
16350 }
16351
c19d1205
ZW
16352 inst.instruction = opcode->avalue;
16353 if (opcode->tag == OT_unconditionalF)
16354 inst.instruction |= 0xF << 28;
16355 else
16356 inst.instruction |= inst.cond << 28;
16357 inst.size = INSN_SIZE;
5be8be5d 16358 if (!parse_operands (p, opcode->operands, /*thumb=*/FALSE))
e07e6e58
NC
16359 {
16360 it_fsm_pre_encode ();
16361 opcode->aencode ();
16362 it_fsm_post_encode ();
16363 }
ee065d83
PB
16364 /* Arm mode bx is marked as both v4T and v5 because it's still required
16365 on a hypothetical non-thumb v5 core. */
845b51d6 16366 if (is_bx)
e74cfd16 16367 ARM_MERGE_FEATURE_SETS (arm_arch_used, arm_arch_used, arm_ext_v4t);
ee065d83 16368 else
e74cfd16
PB
16369 ARM_MERGE_FEATURE_SETS (arm_arch_used, arm_arch_used,
16370 *opcode->avariant);
88714cb8
DG
16371
16372 check_neon_suffixes;
16373
cd000bff 16374 if (!inst.error)
c877a2f2
NC
16375 {
16376 mapping_state (MAP_ARM);
16377 }
b99bd4ef 16378 }
3e9e4fcf
JB
16379 else
16380 {
16381 as_bad (_("attempt to use an ARM instruction on a Thumb-only processor "
16382 "-- `%s'"), str);
16383 return;
16384 }
c19d1205
ZW
16385 output_inst (str);
16386}
b99bd4ef 16387
e07e6e58
NC
16388static void
16389check_it_blocks_finished (void)
16390{
16391#ifdef OBJ_ELF
16392 asection *sect;
16393
16394 for (sect = stdoutput->sections; sect != NULL; sect = sect->next)
16395 if (seg_info (sect)->tc_segment_info_data.current_it.state
16396 == MANUAL_IT_BLOCK)
16397 {
16398 as_warn (_("section '%s' finished with an open IT block."),
16399 sect->name);
16400 }
16401#else
16402 if (now_it.state == MANUAL_IT_BLOCK)
16403 as_warn (_("file finished with an open IT block."));
16404#endif
16405}
16406
c19d1205
ZW
16407/* Various frobbings of labels and their addresses. */
16408
16409void
16410arm_start_line_hook (void)
16411{
16412 last_label_seen = NULL;
b99bd4ef
NC
16413}
16414
c19d1205
ZW
16415void
16416arm_frob_label (symbolS * sym)
b99bd4ef 16417{
c19d1205 16418 last_label_seen = sym;
b99bd4ef 16419
c19d1205 16420 ARM_SET_THUMB (sym, thumb_mode);
b99bd4ef 16421
c19d1205
ZW
16422#if defined OBJ_COFF || defined OBJ_ELF
16423 ARM_SET_INTERWORK (sym, support_interwork);
16424#endif
b99bd4ef 16425
e07e6e58
NC
16426 force_automatic_it_block_close ();
16427
5f4273c7 16428 /* Note - do not allow local symbols (.Lxxx) to be labelled
c19d1205
ZW
16429 as Thumb functions. This is because these labels, whilst
16430 they exist inside Thumb code, are not the entry points for
16431 possible ARM->Thumb calls. Also, these labels can be used
16432 as part of a computed goto or switch statement. eg gcc
16433 can generate code that looks like this:
b99bd4ef 16434
c19d1205
ZW
16435 ldr r2, [pc, .Laaa]
16436 lsl r3, r3, #2
16437 ldr r2, [r3, r2]
16438 mov pc, r2
b99bd4ef 16439
c19d1205
ZW
16440 .Lbbb: .word .Lxxx
16441 .Lccc: .word .Lyyy
16442 ..etc...
16443 .Laaa: .word Lbbb
b99bd4ef 16444
c19d1205
ZW
16445 The first instruction loads the address of the jump table.
16446 The second instruction converts a table index into a byte offset.
16447 The third instruction gets the jump address out of the table.
16448 The fourth instruction performs the jump.
b99bd4ef 16449
c19d1205
ZW
16450 If the address stored at .Laaa is that of a symbol which has the
16451 Thumb_Func bit set, then the linker will arrange for this address
16452 to have the bottom bit set, which in turn would mean that the
16453 address computation performed by the third instruction would end
16454 up with the bottom bit set. Since the ARM is capable of unaligned
16455 word loads, the instruction would then load the incorrect address
16456 out of the jump table, and chaos would ensue. */
16457 if (label_is_thumb_function_name
16458 && (S_GET_NAME (sym)[0] != '.' || S_GET_NAME (sym)[1] != 'L')
16459 && (bfd_get_section_flags (stdoutput, now_seg) & SEC_CODE) != 0)
b99bd4ef 16460 {
c19d1205
ZW
16461 /* When the address of a Thumb function is taken the bottom
16462 bit of that address should be set. This will allow
16463 interworking between Arm and Thumb functions to work
16464 correctly. */
b99bd4ef 16465
c19d1205 16466 THUMB_SET_FUNC (sym, 1);
b99bd4ef 16467
c19d1205 16468 label_is_thumb_function_name = FALSE;
b99bd4ef 16469 }
07a53e5c 16470
07a53e5c 16471 dwarf2_emit_label (sym);
b99bd4ef
NC
16472}
16473
c921be7d 16474bfd_boolean
c19d1205 16475arm_data_in_code (void)
b99bd4ef 16476{
c19d1205 16477 if (thumb_mode && ! strncmp (input_line_pointer + 1, "data:", 5))
b99bd4ef 16478 {
c19d1205
ZW
16479 *input_line_pointer = '/';
16480 input_line_pointer += 5;
16481 *input_line_pointer = 0;
c921be7d 16482 return TRUE;
b99bd4ef
NC
16483 }
16484
c921be7d 16485 return FALSE;
b99bd4ef
NC
16486}
16487
c19d1205
ZW
16488char *
16489arm_canonicalize_symbol_name (char * name)
b99bd4ef 16490{
c19d1205 16491 int len;
b99bd4ef 16492
c19d1205
ZW
16493 if (thumb_mode && (len = strlen (name)) > 5
16494 && streq (name + len - 5, "/data"))
16495 *(name + len - 5) = 0;
b99bd4ef 16496
c19d1205 16497 return name;
b99bd4ef 16498}
c19d1205
ZW
16499\f
16500/* Table of all register names defined by default. The user can
16501 define additional names with .req. Note that all register names
16502 should appear in both upper and lowercase variants. Some registers
16503 also have mixed-case names. */
b99bd4ef 16504
dcbf9037 16505#define REGDEF(s,n,t) { #s, n, REG_TYPE_##t, TRUE, 0 }
c19d1205 16506#define REGNUM(p,n,t) REGDEF(p##n, n, t)
5287ad62 16507#define REGNUM2(p,n,t) REGDEF(p##n, 2 * n, t)
c19d1205
ZW
16508#define REGSET(p,t) \
16509 REGNUM(p, 0,t), REGNUM(p, 1,t), REGNUM(p, 2,t), REGNUM(p, 3,t), \
16510 REGNUM(p, 4,t), REGNUM(p, 5,t), REGNUM(p, 6,t), REGNUM(p, 7,t), \
16511 REGNUM(p, 8,t), REGNUM(p, 9,t), REGNUM(p,10,t), REGNUM(p,11,t), \
16512 REGNUM(p,12,t), REGNUM(p,13,t), REGNUM(p,14,t), REGNUM(p,15,t)
5287ad62
JB
16513#define REGSETH(p,t) \
16514 REGNUM(p,16,t), REGNUM(p,17,t), REGNUM(p,18,t), REGNUM(p,19,t), \
16515 REGNUM(p,20,t), REGNUM(p,21,t), REGNUM(p,22,t), REGNUM(p,23,t), \
16516 REGNUM(p,24,t), REGNUM(p,25,t), REGNUM(p,26,t), REGNUM(p,27,t), \
16517 REGNUM(p,28,t), REGNUM(p,29,t), REGNUM(p,30,t), REGNUM(p,31,t)
16518#define REGSET2(p,t) \
16519 REGNUM2(p, 0,t), REGNUM2(p, 1,t), REGNUM2(p, 2,t), REGNUM2(p, 3,t), \
16520 REGNUM2(p, 4,t), REGNUM2(p, 5,t), REGNUM2(p, 6,t), REGNUM2(p, 7,t), \
16521 REGNUM2(p, 8,t), REGNUM2(p, 9,t), REGNUM2(p,10,t), REGNUM2(p,11,t), \
16522 REGNUM2(p,12,t), REGNUM2(p,13,t), REGNUM2(p,14,t), REGNUM2(p,15,t)
90ec0d68
MGD
16523#define SPLRBANK(base,bank,t) \
16524 REGDEF(lr_##bank, 768|((base+0)<<16), t), \
16525 REGDEF(sp_##bank, 768|((base+1)<<16), t), \
16526 REGDEF(spsr_##bank, 768|(base<<16)|SPSR_BIT, t), \
16527 REGDEF(LR_##bank, 768|((base+0)<<16), t), \
16528 REGDEF(SP_##bank, 768|((base+1)<<16), t), \
16529 REGDEF(SPSR_##bank, 768|(base<<16)|SPSR_BIT, t)
7ed4c4c5 16530
c19d1205 16531static const struct reg_entry reg_names[] =
7ed4c4c5 16532{
c19d1205
ZW
16533 /* ARM integer registers. */
16534 REGSET(r, RN), REGSET(R, RN),
7ed4c4c5 16535
c19d1205
ZW
16536 /* ATPCS synonyms. */
16537 REGDEF(a1,0,RN), REGDEF(a2,1,RN), REGDEF(a3, 2,RN), REGDEF(a4, 3,RN),
16538 REGDEF(v1,4,RN), REGDEF(v2,5,RN), REGDEF(v3, 6,RN), REGDEF(v4, 7,RN),
16539 REGDEF(v5,8,RN), REGDEF(v6,9,RN), REGDEF(v7,10,RN), REGDEF(v8,11,RN),
7ed4c4c5 16540
c19d1205
ZW
16541 REGDEF(A1,0,RN), REGDEF(A2,1,RN), REGDEF(A3, 2,RN), REGDEF(A4, 3,RN),
16542 REGDEF(V1,4,RN), REGDEF(V2,5,RN), REGDEF(V3, 6,RN), REGDEF(V4, 7,RN),
16543 REGDEF(V5,8,RN), REGDEF(V6,9,RN), REGDEF(V7,10,RN), REGDEF(V8,11,RN),
7ed4c4c5 16544
c19d1205
ZW
16545 /* Well-known aliases. */
16546 REGDEF(wr, 7,RN), REGDEF(sb, 9,RN), REGDEF(sl,10,RN), REGDEF(fp,11,RN),
16547 REGDEF(ip,12,RN), REGDEF(sp,13,RN), REGDEF(lr,14,RN), REGDEF(pc,15,RN),
16548
16549 REGDEF(WR, 7,RN), REGDEF(SB, 9,RN), REGDEF(SL,10,RN), REGDEF(FP,11,RN),
16550 REGDEF(IP,12,RN), REGDEF(SP,13,RN), REGDEF(LR,14,RN), REGDEF(PC,15,RN),
16551
16552 /* Coprocessor numbers. */
16553 REGSET(p, CP), REGSET(P, CP),
16554
16555 /* Coprocessor register numbers. The "cr" variants are for backward
16556 compatibility. */
16557 REGSET(c, CN), REGSET(C, CN),
16558 REGSET(cr, CN), REGSET(CR, CN),
16559
90ec0d68
MGD
16560 /* ARM banked registers. */
16561 REGDEF(R8_usr,512|(0<<16),RNB), REGDEF(r8_usr,512|(0<<16),RNB),
16562 REGDEF(R9_usr,512|(1<<16),RNB), REGDEF(r9_usr,512|(1<<16),RNB),
16563 REGDEF(R10_usr,512|(2<<16),RNB), REGDEF(r10_usr,512|(2<<16),RNB),
16564 REGDEF(R11_usr,512|(3<<16),RNB), REGDEF(r11_usr,512|(3<<16),RNB),
16565 REGDEF(R12_usr,512|(4<<16),RNB), REGDEF(r12_usr,512|(4<<16),RNB),
16566 REGDEF(SP_usr,512|(5<<16),RNB), REGDEF(sp_usr,512|(5<<16),RNB),
16567 REGDEF(LR_usr,512|(6<<16),RNB), REGDEF(lr_usr,512|(6<<16),RNB),
16568
16569 REGDEF(R8_fiq,512|(8<<16),RNB), REGDEF(r8_fiq,512|(8<<16),RNB),
16570 REGDEF(R9_fiq,512|(9<<16),RNB), REGDEF(r9_fiq,512|(9<<16),RNB),
16571 REGDEF(R10_fiq,512|(10<<16),RNB), REGDEF(r10_fiq,512|(10<<16),RNB),
16572 REGDEF(R11_fiq,512|(11<<16),RNB), REGDEF(r11_fiq,512|(11<<16),RNB),
16573 REGDEF(R12_fiq,512|(12<<16),RNB), REGDEF(r12_fiq,512|(12<<16),RNB),
16574 REGDEF(SP_fiq,512|(13<<16),RNB), REGDEF(SP_fiq,512|(13<<16),RNB),
16575 REGDEF(LR_fiq,512|(14<<16),RNB), REGDEF(lr_fiq,512|(14<<16),RNB),
16576 REGDEF(SPSR_fiq,512|(14<<16)|SPSR_BIT,RNB), REGDEF(spsr_fiq,512|(14<<16)|SPSR_BIT,RNB),
16577
16578 SPLRBANK(0,IRQ,RNB), SPLRBANK(0,irq,RNB),
16579 SPLRBANK(2,SVC,RNB), SPLRBANK(2,svc,RNB),
16580 SPLRBANK(4,ABT,RNB), SPLRBANK(4,abt,RNB),
16581 SPLRBANK(6,UND,RNB), SPLRBANK(6,und,RNB),
16582 SPLRBANK(12,MON,RNB), SPLRBANK(12,mon,RNB),
16583 REGDEF(elr_hyp,768|(14<<16),RNB), REGDEF(ELR_hyp,768|(14<<16),RNB),
16584 REGDEF(sp_hyp,768|(15<<16),RNB), REGDEF(SP_hyp,768|(15<<16),RNB),
16585 REGDEF(spsr_hyp,768|(14<<16)|SPSR_BIT,RNB),
16586 REGDEF(SPSR_hyp,768|(14<<16)|SPSR_BIT,RNB),
16587
c19d1205
ZW
16588 /* FPA registers. */
16589 REGNUM(f,0,FN), REGNUM(f,1,FN), REGNUM(f,2,FN), REGNUM(f,3,FN),
16590 REGNUM(f,4,FN), REGNUM(f,5,FN), REGNUM(f,6,FN), REGNUM(f,7, FN),
16591
16592 REGNUM(F,0,FN), REGNUM(F,1,FN), REGNUM(F,2,FN), REGNUM(F,3,FN),
16593 REGNUM(F,4,FN), REGNUM(F,5,FN), REGNUM(F,6,FN), REGNUM(F,7, FN),
16594
16595 /* VFP SP registers. */
5287ad62
JB
16596 REGSET(s,VFS), REGSET(S,VFS),
16597 REGSETH(s,VFS), REGSETH(S,VFS),
c19d1205
ZW
16598
16599 /* VFP DP Registers. */
5287ad62
JB
16600 REGSET(d,VFD), REGSET(D,VFD),
16601 /* Extra Neon DP registers. */
16602 REGSETH(d,VFD), REGSETH(D,VFD),
16603
16604 /* Neon QP registers. */
16605 REGSET2(q,NQ), REGSET2(Q,NQ),
c19d1205
ZW
16606
16607 /* VFP control registers. */
16608 REGDEF(fpsid,0,VFC), REGDEF(fpscr,1,VFC), REGDEF(fpexc,8,VFC),
16609 REGDEF(FPSID,0,VFC), REGDEF(FPSCR,1,VFC), REGDEF(FPEXC,8,VFC),
cd2cf30b
PB
16610 REGDEF(fpinst,9,VFC), REGDEF(fpinst2,10,VFC),
16611 REGDEF(FPINST,9,VFC), REGDEF(FPINST2,10,VFC),
16612 REGDEF(mvfr0,7,VFC), REGDEF(mvfr1,6,VFC),
16613 REGDEF(MVFR0,7,VFC), REGDEF(MVFR1,6,VFC),
c19d1205
ZW
16614
16615 /* Maverick DSP coprocessor registers. */
16616 REGSET(mvf,MVF), REGSET(mvd,MVD), REGSET(mvfx,MVFX), REGSET(mvdx,MVDX),
16617 REGSET(MVF,MVF), REGSET(MVD,MVD), REGSET(MVFX,MVFX), REGSET(MVDX,MVDX),
16618
16619 REGNUM(mvax,0,MVAX), REGNUM(mvax,1,MVAX),
16620 REGNUM(mvax,2,MVAX), REGNUM(mvax,3,MVAX),
16621 REGDEF(dspsc,0,DSPSC),
16622
16623 REGNUM(MVAX,0,MVAX), REGNUM(MVAX,1,MVAX),
16624 REGNUM(MVAX,2,MVAX), REGNUM(MVAX,3,MVAX),
16625 REGDEF(DSPSC,0,DSPSC),
16626
16627 /* iWMMXt data registers - p0, c0-15. */
16628 REGSET(wr,MMXWR), REGSET(wR,MMXWR), REGSET(WR, MMXWR),
16629
16630 /* iWMMXt control registers - p1, c0-3. */
16631 REGDEF(wcid, 0,MMXWC), REGDEF(wCID, 0,MMXWC), REGDEF(WCID, 0,MMXWC),
16632 REGDEF(wcon, 1,MMXWC), REGDEF(wCon, 1,MMXWC), REGDEF(WCON, 1,MMXWC),
16633 REGDEF(wcssf, 2,MMXWC), REGDEF(wCSSF, 2,MMXWC), REGDEF(WCSSF, 2,MMXWC),
16634 REGDEF(wcasf, 3,MMXWC), REGDEF(wCASF, 3,MMXWC), REGDEF(WCASF, 3,MMXWC),
16635
16636 /* iWMMXt scalar (constant/offset) registers - p1, c8-11. */
16637 REGDEF(wcgr0, 8,MMXWCG), REGDEF(wCGR0, 8,MMXWCG), REGDEF(WCGR0, 8,MMXWCG),
16638 REGDEF(wcgr1, 9,MMXWCG), REGDEF(wCGR1, 9,MMXWCG), REGDEF(WCGR1, 9,MMXWCG),
16639 REGDEF(wcgr2,10,MMXWCG), REGDEF(wCGR2,10,MMXWCG), REGDEF(WCGR2,10,MMXWCG),
16640 REGDEF(wcgr3,11,MMXWCG), REGDEF(wCGR3,11,MMXWCG), REGDEF(WCGR3,11,MMXWCG),
16641
16642 /* XScale accumulator registers. */
16643 REGNUM(acc,0,XSCALE), REGNUM(ACC,0,XSCALE),
16644};
16645#undef REGDEF
16646#undef REGNUM
16647#undef REGSET
7ed4c4c5 16648
c19d1205
ZW
16649/* Table of all PSR suffixes. Bare "CPSR" and "SPSR" are handled
16650 within psr_required_here. */
16651static const struct asm_psr psrs[] =
16652{
16653 /* Backward compatibility notation. Note that "all" is no longer
16654 truly all possible PSR bits. */
16655 {"all", PSR_c | PSR_f},
16656 {"flg", PSR_f},
16657 {"ctl", PSR_c},
16658
16659 /* Individual flags. */
16660 {"f", PSR_f},
16661 {"c", PSR_c},
16662 {"x", PSR_x},
16663 {"s", PSR_s},
59b42a0d 16664
c19d1205
ZW
16665 /* Combinations of flags. */
16666 {"fs", PSR_f | PSR_s},
16667 {"fx", PSR_f | PSR_x},
16668 {"fc", PSR_f | PSR_c},
16669 {"sf", PSR_s | PSR_f},
16670 {"sx", PSR_s | PSR_x},
16671 {"sc", PSR_s | PSR_c},
16672 {"xf", PSR_x | PSR_f},
16673 {"xs", PSR_x | PSR_s},
16674 {"xc", PSR_x | PSR_c},
16675 {"cf", PSR_c | PSR_f},
16676 {"cs", PSR_c | PSR_s},
16677 {"cx", PSR_c | PSR_x},
16678 {"fsx", PSR_f | PSR_s | PSR_x},
16679 {"fsc", PSR_f | PSR_s | PSR_c},
16680 {"fxs", PSR_f | PSR_x | PSR_s},
16681 {"fxc", PSR_f | PSR_x | PSR_c},
16682 {"fcs", PSR_f | PSR_c | PSR_s},
16683 {"fcx", PSR_f | PSR_c | PSR_x},
16684 {"sfx", PSR_s | PSR_f | PSR_x},
16685 {"sfc", PSR_s | PSR_f | PSR_c},
16686 {"sxf", PSR_s | PSR_x | PSR_f},
16687 {"sxc", PSR_s | PSR_x | PSR_c},
16688 {"scf", PSR_s | PSR_c | PSR_f},
16689 {"scx", PSR_s | PSR_c | PSR_x},
16690 {"xfs", PSR_x | PSR_f | PSR_s},
16691 {"xfc", PSR_x | PSR_f | PSR_c},
16692 {"xsf", PSR_x | PSR_s | PSR_f},
16693 {"xsc", PSR_x | PSR_s | PSR_c},
16694 {"xcf", PSR_x | PSR_c | PSR_f},
16695 {"xcs", PSR_x | PSR_c | PSR_s},
16696 {"cfs", PSR_c | PSR_f | PSR_s},
16697 {"cfx", PSR_c | PSR_f | PSR_x},
16698 {"csf", PSR_c | PSR_s | PSR_f},
16699 {"csx", PSR_c | PSR_s | PSR_x},
16700 {"cxf", PSR_c | PSR_x | PSR_f},
16701 {"cxs", PSR_c | PSR_x | PSR_s},
16702 {"fsxc", PSR_f | PSR_s | PSR_x | PSR_c},
16703 {"fscx", PSR_f | PSR_s | PSR_c | PSR_x},
16704 {"fxsc", PSR_f | PSR_x | PSR_s | PSR_c},
16705 {"fxcs", PSR_f | PSR_x | PSR_c | PSR_s},
16706 {"fcsx", PSR_f | PSR_c | PSR_s | PSR_x},
16707 {"fcxs", PSR_f | PSR_c | PSR_x | PSR_s},
16708 {"sfxc", PSR_s | PSR_f | PSR_x | PSR_c},
16709 {"sfcx", PSR_s | PSR_f | PSR_c | PSR_x},
16710 {"sxfc", PSR_s | PSR_x | PSR_f | PSR_c},
16711 {"sxcf", PSR_s | PSR_x | PSR_c | PSR_f},
16712 {"scfx", PSR_s | PSR_c | PSR_f | PSR_x},
16713 {"scxf", PSR_s | PSR_c | PSR_x | PSR_f},
16714 {"xfsc", PSR_x | PSR_f | PSR_s | PSR_c},
16715 {"xfcs", PSR_x | PSR_f | PSR_c | PSR_s},
16716 {"xsfc", PSR_x | PSR_s | PSR_f | PSR_c},
16717 {"xscf", PSR_x | PSR_s | PSR_c | PSR_f},
16718 {"xcfs", PSR_x | PSR_c | PSR_f | PSR_s},
16719 {"xcsf", PSR_x | PSR_c | PSR_s | PSR_f},
16720 {"cfsx", PSR_c | PSR_f | PSR_s | PSR_x},
16721 {"cfxs", PSR_c | PSR_f | PSR_x | PSR_s},
16722 {"csfx", PSR_c | PSR_s | PSR_f | PSR_x},
16723 {"csxf", PSR_c | PSR_s | PSR_x | PSR_f},
16724 {"cxfs", PSR_c | PSR_x | PSR_f | PSR_s},
16725 {"cxsf", PSR_c | PSR_x | PSR_s | PSR_f},
16726};
16727
62b3e311
PB
16728/* Table of V7M psr names. */
16729static const struct asm_psr v7m_psrs[] =
16730{
2b744c99
PB
16731 {"apsr", 0 }, {"APSR", 0 },
16732 {"iapsr", 1 }, {"IAPSR", 1 },
16733 {"eapsr", 2 }, {"EAPSR", 2 },
16734 {"psr", 3 }, {"PSR", 3 },
16735 {"xpsr", 3 }, {"XPSR", 3 }, {"xPSR", 3 },
16736 {"ipsr", 5 }, {"IPSR", 5 },
16737 {"epsr", 6 }, {"EPSR", 6 },
16738 {"iepsr", 7 }, {"IEPSR", 7 },
16739 {"msp", 8 }, {"MSP", 8 },
16740 {"psp", 9 }, {"PSP", 9 },
16741 {"primask", 16}, {"PRIMASK", 16},
16742 {"basepri", 17}, {"BASEPRI", 17},
00bbc0bd
NC
16743 {"basepri_max", 18}, {"BASEPRI_MAX", 18},
16744 {"basepri_max", 18}, {"BASEPRI_MASK", 18}, /* Typo, preserved for backwards compatibility. */
2b744c99
PB
16745 {"faultmask", 19}, {"FAULTMASK", 19},
16746 {"control", 20}, {"CONTROL", 20}
62b3e311
PB
16747};
16748
c19d1205
ZW
16749/* Table of all shift-in-operand names. */
16750static const struct asm_shift_name shift_names [] =
b99bd4ef 16751{
c19d1205
ZW
16752 { "asl", SHIFT_LSL }, { "ASL", SHIFT_LSL },
16753 { "lsl", SHIFT_LSL }, { "LSL", SHIFT_LSL },
16754 { "lsr", SHIFT_LSR }, { "LSR", SHIFT_LSR },
16755 { "asr", SHIFT_ASR }, { "ASR", SHIFT_ASR },
16756 { "ror", SHIFT_ROR }, { "ROR", SHIFT_ROR },
16757 { "rrx", SHIFT_RRX }, { "RRX", SHIFT_RRX }
16758};
b99bd4ef 16759
c19d1205
ZW
16760/* Table of all explicit relocation names. */
16761#ifdef OBJ_ELF
16762static struct reloc_entry reloc_names[] =
16763{
16764 { "got", BFD_RELOC_ARM_GOT32 }, { "GOT", BFD_RELOC_ARM_GOT32 },
16765 { "gotoff", BFD_RELOC_ARM_GOTOFF }, { "GOTOFF", BFD_RELOC_ARM_GOTOFF },
16766 { "plt", BFD_RELOC_ARM_PLT32 }, { "PLT", BFD_RELOC_ARM_PLT32 },
16767 { "target1", BFD_RELOC_ARM_TARGET1 }, { "TARGET1", BFD_RELOC_ARM_TARGET1 },
16768 { "target2", BFD_RELOC_ARM_TARGET2 }, { "TARGET2", BFD_RELOC_ARM_TARGET2 },
16769 { "sbrel", BFD_RELOC_ARM_SBREL32 }, { "SBREL", BFD_RELOC_ARM_SBREL32 },
16770 { "tlsgd", BFD_RELOC_ARM_TLS_GD32}, { "TLSGD", BFD_RELOC_ARM_TLS_GD32},
16771 { "tlsldm", BFD_RELOC_ARM_TLS_LDM32}, { "TLSLDM", BFD_RELOC_ARM_TLS_LDM32},
16772 { "tlsldo", BFD_RELOC_ARM_TLS_LDO32}, { "TLSLDO", BFD_RELOC_ARM_TLS_LDO32},
16773 { "gottpoff",BFD_RELOC_ARM_TLS_IE32}, { "GOTTPOFF",BFD_RELOC_ARM_TLS_IE32},
b43420e6 16774 { "tpoff", BFD_RELOC_ARM_TLS_LE32}, { "TPOFF", BFD_RELOC_ARM_TLS_LE32},
0855e32b
NS
16775 { "got_prel", BFD_RELOC_ARM_GOT_PREL}, { "GOT_PREL", BFD_RELOC_ARM_GOT_PREL},
16776 { "tlsdesc", BFD_RELOC_ARM_TLS_GOTDESC},
16777 { "TLSDESC", BFD_RELOC_ARM_TLS_GOTDESC},
16778 { "tlscall", BFD_RELOC_ARM_TLS_CALL},
16779 { "TLSCALL", BFD_RELOC_ARM_TLS_CALL},
16780 { "tlsdescseq", BFD_RELOC_ARM_TLS_DESCSEQ},
16781 { "TLSDESCSEQ", BFD_RELOC_ARM_TLS_DESCSEQ}
c19d1205
ZW
16782};
16783#endif
b99bd4ef 16784
c19d1205
ZW
16785/* Table of all conditional affixes. 0xF is not defined as a condition code. */
16786static const struct asm_cond conds[] =
16787{
16788 {"eq", 0x0},
16789 {"ne", 0x1},
16790 {"cs", 0x2}, {"hs", 0x2},
16791 {"cc", 0x3}, {"ul", 0x3}, {"lo", 0x3},
16792 {"mi", 0x4},
16793 {"pl", 0x5},
16794 {"vs", 0x6},
16795 {"vc", 0x7},
16796 {"hi", 0x8},
16797 {"ls", 0x9},
16798 {"ge", 0xa},
16799 {"lt", 0xb},
16800 {"gt", 0xc},
16801 {"le", 0xd},
16802 {"al", 0xe}
16803};
bfae80f2 16804
62b3e311
PB
16805static struct asm_barrier_opt barrier_opt_names[] =
16806{
52e7f43d
RE
16807 { "sy", 0xf }, { "SY", 0xf },
16808 { "un", 0x7 }, { "UN", 0x7 },
16809 { "st", 0xe }, { "ST", 0xe },
16810 { "unst", 0x6 }, { "UNST", 0x6 },
16811 { "ish", 0xb }, { "ISH", 0xb },
16812 { "sh", 0xb }, { "SH", 0xb },
16813 { "ishst", 0xa }, { "ISHST", 0xa },
16814 { "shst", 0xa }, { "SHST", 0xa },
16815 { "nsh", 0x7 }, { "NSH", 0x7 },
16816 { "nshst", 0x6 }, { "NSHST", 0x6 },
16817 { "osh", 0x3 }, { "OSH", 0x3 },
16818 { "oshst", 0x2 }, { "OSHST", 0x2 }
62b3e311
PB
16819};
16820
c19d1205
ZW
16821/* Table of ARM-format instructions. */
16822
16823/* Macros for gluing together operand strings. N.B. In all cases
16824 other than OPS0, the trailing OP_stop comes from default
16825 zero-initialization of the unspecified elements of the array. */
16826#define OPS0() { OP_stop, }
16827#define OPS1(a) { OP_##a, }
16828#define OPS2(a,b) { OP_##a,OP_##b, }
16829#define OPS3(a,b,c) { OP_##a,OP_##b,OP_##c, }
16830#define OPS4(a,b,c,d) { OP_##a,OP_##b,OP_##c,OP_##d, }
16831#define OPS5(a,b,c,d,e) { OP_##a,OP_##b,OP_##c,OP_##d,OP_##e, }
16832#define OPS6(a,b,c,d,e,f) { OP_##a,OP_##b,OP_##c,OP_##d,OP_##e,OP_##f, }
16833
5be8be5d
DG
16834/* These macros are similar to the OPSn, but do not prepend the OP_ prefix.
16835 This is useful when mixing operands for ARM and THUMB, i.e. using the
16836 MIX_ARM_THUMB_OPERANDS macro.
16837 In order to use these macros, prefix the number of operands with _
16838 e.g. _3. */
16839#define OPS_1(a) { a, }
16840#define OPS_2(a,b) { a,b, }
16841#define OPS_3(a,b,c) { a,b,c, }
16842#define OPS_4(a,b,c,d) { a,b,c,d, }
16843#define OPS_5(a,b,c,d,e) { a,b,c,d,e, }
16844#define OPS_6(a,b,c,d,e,f) { a,b,c,d,e,f, }
16845
c19d1205
ZW
16846/* These macros abstract out the exact format of the mnemonic table and
16847 save some repeated characters. */
16848
16849/* The normal sort of mnemonic; has a Thumb variant; takes a conditional suffix. */
16850#define TxCE(mnem, op, top, nops, ops, ae, te) \
21d799b5 16851 { mnem, OPS##nops ops, OT_csuffix, 0x##op, top, ARM_VARIANT, \
1887dd22 16852 THUMB_VARIANT, do_##ae, do_##te }
c19d1205
ZW
16853
16854/* Two variants of the above - TCE for a numeric Thumb opcode, tCE for
16855 a T_MNEM_xyz enumerator. */
16856#define TCE(mnem, aop, top, nops, ops, ae, te) \
e07e6e58 16857 TxCE (mnem, aop, 0x##top, nops, ops, ae, te)
c19d1205 16858#define tCE(mnem, aop, top, nops, ops, ae, te) \
21d799b5 16859 TxCE (mnem, aop, T_MNEM##top, nops, ops, ae, te)
c19d1205
ZW
16860
16861/* Second most common sort of mnemonic: has a Thumb variant, takes a conditional
16862 infix after the third character. */
16863#define TxC3(mnem, op, top, nops, ops, ae, te) \
21d799b5 16864 { mnem, OPS##nops ops, OT_cinfix3, 0x##op, top, ARM_VARIANT, \
1887dd22 16865 THUMB_VARIANT, do_##ae, do_##te }
088fa78e 16866#define TxC3w(mnem, op, top, nops, ops, ae, te) \
21d799b5 16867 { mnem, OPS##nops ops, OT_cinfix3_deprecated, 0x##op, top, ARM_VARIANT, \
088fa78e 16868 THUMB_VARIANT, do_##ae, do_##te }
c19d1205 16869#define TC3(mnem, aop, top, nops, ops, ae, te) \
e07e6e58 16870 TxC3 (mnem, aop, 0x##top, nops, ops, ae, te)
088fa78e 16871#define TC3w(mnem, aop, top, nops, ops, ae, te) \
e07e6e58 16872 TxC3w (mnem, aop, 0x##top, nops, ops, ae, te)
c19d1205 16873#define tC3(mnem, aop, top, nops, ops, ae, te) \
21d799b5 16874 TxC3 (mnem, aop, T_MNEM##top, nops, ops, ae, te)
088fa78e 16875#define tC3w(mnem, aop, top, nops, ops, ae, te) \
21d799b5 16876 TxC3w (mnem, aop, T_MNEM##top, nops, ops, ae, te)
c19d1205
ZW
16877
16878/* Mnemonic with a conditional infix in an unusual place. Each and every variant has to
16879 appear in the condition table. */
16880#define TxCM_(m1, m2, m3, op, top, nops, ops, ae, te) \
21d799b5 16881 { m1 #m2 m3, OPS##nops ops, sizeof (#m2) == 1 ? OT_odd_infix_unc : OT_odd_infix_0 + sizeof (m1) - 1, \
1887dd22 16882 0x##op, top, ARM_VARIANT, THUMB_VARIANT, do_##ae, do_##te }
c19d1205
ZW
16883
16884#define TxCM(m1, m2, op, top, nops, ops, ae, te) \
e07e6e58
NC
16885 TxCM_ (m1, , m2, op, top, nops, ops, ae, te), \
16886 TxCM_ (m1, eq, m2, op, top, nops, ops, ae, te), \
16887 TxCM_ (m1, ne, m2, op, top, nops, ops, ae, te), \
16888 TxCM_ (m1, cs, m2, op, top, nops, ops, ae, te), \
16889 TxCM_ (m1, hs, m2, op, top, nops, ops, ae, te), \
16890 TxCM_ (m1, cc, m2, op, top, nops, ops, ae, te), \
16891 TxCM_ (m1, ul, m2, op, top, nops, ops, ae, te), \
16892 TxCM_ (m1, lo, m2, op, top, nops, ops, ae, te), \
16893 TxCM_ (m1, mi, m2, op, top, nops, ops, ae, te), \
16894 TxCM_ (m1, pl, m2, op, top, nops, ops, ae, te), \
16895 TxCM_ (m1, vs, m2, op, top, nops, ops, ae, te), \
16896 TxCM_ (m1, vc, m2, op, top, nops, ops, ae, te), \
16897 TxCM_ (m1, hi, m2, op, top, nops, ops, ae, te), \
16898 TxCM_ (m1, ls, m2, op, top, nops, ops, ae, te), \
16899 TxCM_ (m1, ge, m2, op, top, nops, ops, ae, te), \
16900 TxCM_ (m1, lt, m2, op, top, nops, ops, ae, te), \
16901 TxCM_ (m1, gt, m2, op, top, nops, ops, ae, te), \
16902 TxCM_ (m1, le, m2, op, top, nops, ops, ae, te), \
16903 TxCM_ (m1, al, m2, op, top, nops, ops, ae, te)
c19d1205
ZW
16904
16905#define TCM(m1,m2, aop, top, nops, ops, ae, te) \
e07e6e58
NC
16906 TxCM (m1,m2, aop, 0x##top, nops, ops, ae, te)
16907#define tCM(m1,m2, aop, top, nops, ops, ae, te) \
21d799b5 16908 TxCM (m1,m2, aop, T_MNEM##top, nops, ops, ae, te)
c19d1205
ZW
16909
16910/* Mnemonic that cannot be conditionalized. The ARM condition-code
dfa9f0d5
PB
16911 field is still 0xE. Many of the Thumb variants can be executed
16912 conditionally, so this is checked separately. */
c19d1205 16913#define TUE(mnem, op, top, nops, ops, ae, te) \
21d799b5 16914 { mnem, OPS##nops ops, OT_unconditional, 0x##op, 0x##top, ARM_VARIANT, \
1887dd22 16915 THUMB_VARIANT, do_##ae, do_##te }
c19d1205
ZW
16916
16917/* Mnemonic that cannot be conditionalized, and bears 0xF in its ARM
16918 condition code field. */
16919#define TUF(mnem, op, top, nops, ops, ae, te) \
21d799b5 16920 { mnem, OPS##nops ops, OT_unconditionalF, 0x##op, 0x##top, ARM_VARIANT, \
1887dd22 16921 THUMB_VARIANT, do_##ae, do_##te }
c19d1205
ZW
16922
16923/* ARM-only variants of all the above. */
6a86118a 16924#define CE(mnem, op, nops, ops, ae) \
21d799b5 16925 { mnem, OPS##nops ops, OT_csuffix, 0x##op, 0x0, ARM_VARIANT, 0, do_##ae, NULL }
6a86118a
NC
16926
16927#define C3(mnem, op, nops, ops, ae) \
16928 { #mnem, OPS##nops ops, OT_cinfix3, 0x##op, 0x0, ARM_VARIANT, 0, do_##ae, NULL }
16929
e3cb604e
PB
16930/* Legacy mnemonics that always have conditional infix after the third
16931 character. */
16932#define CL(mnem, op, nops, ops, ae) \
21d799b5 16933 { mnem, OPS##nops ops, OT_cinfix3_legacy, \
e3cb604e
PB
16934 0x##op, 0x0, ARM_VARIANT, 0, do_##ae, NULL }
16935
8f06b2d8
PB
16936/* Coprocessor instructions. Isomorphic between Arm and Thumb-2. */
16937#define cCE(mnem, op, nops, ops, ae) \
21d799b5 16938 { mnem, OPS##nops ops, OT_csuffix, 0x##op, 0xe##op, ARM_VARIANT, ARM_VARIANT, do_##ae, do_##ae }
8f06b2d8 16939
e3cb604e
PB
16940/* Legacy coprocessor instructions where conditional infix and conditional
16941 suffix are ambiguous. For consistency this includes all FPA instructions,
16942 not just the potentially ambiguous ones. */
16943#define cCL(mnem, op, nops, ops, ae) \
21d799b5 16944 { mnem, OPS##nops ops, OT_cinfix3_legacy, \
e3cb604e
PB
16945 0x##op, 0xe##op, ARM_VARIANT, ARM_VARIANT, do_##ae, do_##ae }
16946
16947/* Coprocessor, takes either a suffix or a position-3 infix
16948 (for an FPA corner case). */
16949#define C3E(mnem, op, nops, ops, ae) \
21d799b5 16950 { mnem, OPS##nops ops, OT_csuf_or_in3, \
e3cb604e 16951 0x##op, 0xe##op, ARM_VARIANT, ARM_VARIANT, do_##ae, do_##ae }
8f06b2d8 16952
6a86118a 16953#define xCM_(m1, m2, m3, op, nops, ops, ae) \
21d799b5
NC
16954 { m1 #m2 m3, OPS##nops ops, \
16955 sizeof (#m2) == 1 ? OT_odd_infix_unc : OT_odd_infix_0 + sizeof (m1) - 1, \
6a86118a
NC
16956 0x##op, 0x0, ARM_VARIANT, 0, do_##ae, NULL }
16957
16958#define CM(m1, m2, op, nops, ops, ae) \
e07e6e58
NC
16959 xCM_ (m1, , m2, op, nops, ops, ae), \
16960 xCM_ (m1, eq, m2, op, nops, ops, ae), \
16961 xCM_ (m1, ne, m2, op, nops, ops, ae), \
16962 xCM_ (m1, cs, m2, op, nops, ops, ae), \
16963 xCM_ (m1, hs, m2, op, nops, ops, ae), \
16964 xCM_ (m1, cc, m2, op, nops, ops, ae), \
16965 xCM_ (m1, ul, m2, op, nops, ops, ae), \
16966 xCM_ (m1, lo, m2, op, nops, ops, ae), \
16967 xCM_ (m1, mi, m2, op, nops, ops, ae), \
16968 xCM_ (m1, pl, m2, op, nops, ops, ae), \
16969 xCM_ (m1, vs, m2, op, nops, ops, ae), \
16970 xCM_ (m1, vc, m2, op, nops, ops, ae), \
16971 xCM_ (m1, hi, m2, op, nops, ops, ae), \
16972 xCM_ (m1, ls, m2, op, nops, ops, ae), \
16973 xCM_ (m1, ge, m2, op, nops, ops, ae), \
16974 xCM_ (m1, lt, m2, op, nops, ops, ae), \
16975 xCM_ (m1, gt, m2, op, nops, ops, ae), \
16976 xCM_ (m1, le, m2, op, nops, ops, ae), \
16977 xCM_ (m1, al, m2, op, nops, ops, ae)
6a86118a
NC
16978
16979#define UE(mnem, op, nops, ops, ae) \
16980 { #mnem, OPS##nops ops, OT_unconditional, 0x##op, 0, ARM_VARIANT, 0, do_##ae, NULL }
16981
16982#define UF(mnem, op, nops, ops, ae) \
16983 { #mnem, OPS##nops ops, OT_unconditionalF, 0x##op, 0, ARM_VARIANT, 0, do_##ae, NULL }
16984
5287ad62
JB
16985/* Neon data-processing. ARM versions are unconditional with cond=0xf.
16986 The Thumb and ARM variants are mostly the same (bits 0-23 and 24/28), so we
16987 use the same encoding function for each. */
16988#define NUF(mnem, op, nops, ops, enc) \
16989 { #mnem, OPS##nops ops, OT_unconditionalF, 0x##op, 0x##op, \
16990 ARM_VARIANT, THUMB_VARIANT, do_##enc, do_##enc }
16991
16992/* Neon data processing, version which indirects through neon_enc_tab for
16993 the various overloaded versions of opcodes. */
16994#define nUF(mnem, op, nops, ops, enc) \
21d799b5 16995 { #mnem, OPS##nops ops, OT_unconditionalF, N_MNEM##op, N_MNEM##op, \
5287ad62
JB
16996 ARM_VARIANT, THUMB_VARIANT, do_##enc, do_##enc }
16997
16998/* Neon insn with conditional suffix for the ARM version, non-overloaded
16999 version. */
037e8744
JB
17000#define NCE_tag(mnem, op, nops, ops, enc, tag) \
17001 { #mnem, OPS##nops ops, tag, 0x##op, 0x##op, ARM_VARIANT, \
5287ad62
JB
17002 THUMB_VARIANT, do_##enc, do_##enc }
17003
037e8744 17004#define NCE(mnem, op, nops, ops, enc) \
e07e6e58 17005 NCE_tag (mnem, op, nops, ops, enc, OT_csuffix)
037e8744
JB
17006
17007#define NCEF(mnem, op, nops, ops, enc) \
e07e6e58 17008 NCE_tag (mnem, op, nops, ops, enc, OT_csuffixF)
037e8744 17009
5287ad62 17010/* Neon insn with conditional suffix for the ARM version, overloaded types. */
037e8744 17011#define nCE_tag(mnem, op, nops, ops, enc, tag) \
21d799b5 17012 { #mnem, OPS##nops ops, tag, N_MNEM##op, N_MNEM##op, \
5287ad62
JB
17013 ARM_VARIANT, THUMB_VARIANT, do_##enc, do_##enc }
17014
037e8744 17015#define nCE(mnem, op, nops, ops, enc) \
e07e6e58 17016 nCE_tag (mnem, op, nops, ops, enc, OT_csuffix)
037e8744
JB
17017
17018#define nCEF(mnem, op, nops, ops, enc) \
e07e6e58 17019 nCE_tag (mnem, op, nops, ops, enc, OT_csuffixF)
037e8744 17020
c19d1205
ZW
17021#define do_0 0
17022
c19d1205 17023static const struct asm_opcode insns[] =
bfae80f2 17024{
e74cfd16
PB
17025#define ARM_VARIANT &arm_ext_v1 /* Core ARM Instructions. */
17026#define THUMB_VARIANT &arm_ext_v4t
21d799b5
NC
17027 tCE("and", 0000000, _and, 3, (RR, oRR, SH), arit, t_arit3c),
17028 tC3("ands", 0100000, _ands, 3, (RR, oRR, SH), arit, t_arit3c),
17029 tCE("eor", 0200000, _eor, 3, (RR, oRR, SH), arit, t_arit3c),
17030 tC3("eors", 0300000, _eors, 3, (RR, oRR, SH), arit, t_arit3c),
17031 tCE("sub", 0400000, _sub, 3, (RR, oRR, SH), arit, t_add_sub),
17032 tC3("subs", 0500000, _subs, 3, (RR, oRR, SH), arit, t_add_sub),
17033 tCE("add", 0800000, _add, 3, (RR, oRR, SHG), arit, t_add_sub),
17034 tC3("adds", 0900000, _adds, 3, (RR, oRR, SHG), arit, t_add_sub),
17035 tCE("adc", 0a00000, _adc, 3, (RR, oRR, SH), arit, t_arit3c),
17036 tC3("adcs", 0b00000, _adcs, 3, (RR, oRR, SH), arit, t_arit3c),
17037 tCE("sbc", 0c00000, _sbc, 3, (RR, oRR, SH), arit, t_arit3),
17038 tC3("sbcs", 0d00000, _sbcs, 3, (RR, oRR, SH), arit, t_arit3),
17039 tCE("orr", 1800000, _orr, 3, (RR, oRR, SH), arit, t_arit3c),
17040 tC3("orrs", 1900000, _orrs, 3, (RR, oRR, SH), arit, t_arit3c),
17041 tCE("bic", 1c00000, _bic, 3, (RR, oRR, SH), arit, t_arit3),
17042 tC3("bics", 1d00000, _bics, 3, (RR, oRR, SH), arit, t_arit3),
c19d1205
ZW
17043
17044 /* The p-variants of tst/cmp/cmn/teq (below) are the pre-V6 mechanism
17045 for setting PSR flag bits. They are obsolete in V6 and do not
17046 have Thumb equivalents. */
21d799b5
NC
17047 tCE("tst", 1100000, _tst, 2, (RR, SH), cmp, t_mvn_tst),
17048 tC3w("tsts", 1100000, _tst, 2, (RR, SH), cmp, t_mvn_tst),
17049 CL("tstp", 110f000, 2, (RR, SH), cmp),
17050 tCE("cmp", 1500000, _cmp, 2, (RR, SH), cmp, t_mov_cmp),
17051 tC3w("cmps", 1500000, _cmp, 2, (RR, SH), cmp, t_mov_cmp),
17052 CL("cmpp", 150f000, 2, (RR, SH), cmp),
17053 tCE("cmn", 1700000, _cmn, 2, (RR, SH), cmp, t_mvn_tst),
17054 tC3w("cmns", 1700000, _cmn, 2, (RR, SH), cmp, t_mvn_tst),
17055 CL("cmnp", 170f000, 2, (RR, SH), cmp),
17056
17057 tCE("mov", 1a00000, _mov, 2, (RR, SH), mov, t_mov_cmp),
17058 tC3("movs", 1b00000, _movs, 2, (RR, SH), mov, t_mov_cmp),
17059 tCE("mvn", 1e00000, _mvn, 2, (RR, SH), mov, t_mvn_tst),
17060 tC3("mvns", 1f00000, _mvns, 2, (RR, SH), mov, t_mvn_tst),
17061
17062 tCE("ldr", 4100000, _ldr, 2, (RR, ADDRGLDR),ldst, t_ldst),
5be8be5d
DG
17063 tC3("ldrb", 4500000, _ldrb, 2, (RRnpc_npcsp, ADDRGLDR),ldst, t_ldst),
17064 tCE("str", 4000000, _str, _2, (MIX_ARM_THUMB_OPERANDS (OP_RR,
17065 OP_RRnpc),
17066 OP_ADDRGLDR),ldst, t_ldst),
17067 tC3("strb", 4400000, _strb, 2, (RRnpc_npcsp, ADDRGLDR),ldst, t_ldst),
21d799b5
NC
17068
17069 tCE("stm", 8800000, _stmia, 2, (RRw, REGLST), ldmstm, t_ldmstm),
17070 tC3("stmia", 8800000, _stmia, 2, (RRw, REGLST), ldmstm, t_ldmstm),
17071 tC3("stmea", 8800000, _stmia, 2, (RRw, REGLST), ldmstm, t_ldmstm),
17072 tCE("ldm", 8900000, _ldmia, 2, (RRw, REGLST), ldmstm, t_ldmstm),
17073 tC3("ldmia", 8900000, _ldmia, 2, (RRw, REGLST), ldmstm, t_ldmstm),
17074 tC3("ldmfd", 8900000, _ldmia, 2, (RRw, REGLST), ldmstm, t_ldmstm),
17075
17076 TCE("swi", f000000, df00, 1, (EXPi), swi, t_swi),
17077 TCE("svc", f000000, df00, 1, (EXPi), swi, t_swi),
17078 tCE("b", a000000, _b, 1, (EXPr), branch, t_branch),
17079 TCE("bl", b000000, f000f800, 1, (EXPr), bl, t_branch23),
bfae80f2 17080
c19d1205 17081 /* Pseudo ops. */
21d799b5 17082 tCE("adr", 28f0000, _adr, 2, (RR, EXP), adr, t_adr),
2fc8bdac 17083 C3(adrl, 28f0000, 2, (RR, EXP), adrl),
21d799b5 17084 tCE("nop", 1a00000, _nop, 1, (oI255c), nop, t_nop),
c19d1205
ZW
17085
17086 /* Thumb-compatibility pseudo ops. */
21d799b5
NC
17087 tCE("lsl", 1a00000, _lsl, 3, (RR, oRR, SH), shift, t_shift),
17088 tC3("lsls", 1b00000, _lsls, 3, (RR, oRR, SH), shift, t_shift),
17089 tCE("lsr", 1a00020, _lsr, 3, (RR, oRR, SH), shift, t_shift),
17090 tC3("lsrs", 1b00020, _lsrs, 3, (RR, oRR, SH), shift, t_shift),
17091 tCE("asr", 1a00040, _asr, 3, (RR, oRR, SH), shift, t_shift),
17092 tC3("asrs", 1b00040, _asrs, 3, (RR, oRR, SH), shift, t_shift),
17093 tCE("ror", 1a00060, _ror, 3, (RR, oRR, SH), shift, t_shift),
17094 tC3("rors", 1b00060, _rors, 3, (RR, oRR, SH), shift, t_shift),
17095 tCE("neg", 2600000, _neg, 2, (RR, RR), rd_rn, t_neg),
17096 tC3("negs", 2700000, _negs, 2, (RR, RR), rd_rn, t_neg),
17097 tCE("push", 92d0000, _push, 1, (REGLST), push_pop, t_push_pop),
17098 tCE("pop", 8bd0000, _pop, 1, (REGLST), push_pop, t_push_pop),
c19d1205 17099
16a4cf17 17100 /* These may simplify to neg. */
21d799b5
NC
17101 TCE("rsb", 0600000, ebc00000, 3, (RR, oRR, SH), arit, t_rsb),
17102 TC3("rsbs", 0700000, ebd00000, 3, (RR, oRR, SH), arit, t_rsb),
16a4cf17 17103
c921be7d
NC
17104#undef THUMB_VARIANT
17105#define THUMB_VARIANT & arm_ext_v6
17106
21d799b5 17107 TCE("cpy", 1a00000, 4600, 2, (RR, RR), rd_rm, t_cpy),
c19d1205
ZW
17108
17109 /* V1 instructions with no Thumb analogue prior to V6T2. */
c921be7d
NC
17110#undef THUMB_VARIANT
17111#define THUMB_VARIANT & arm_ext_v6t2
17112
21d799b5
NC
17113 TCE("teq", 1300000, ea900f00, 2, (RR, SH), cmp, t_mvn_tst),
17114 TC3w("teqs", 1300000, ea900f00, 2, (RR, SH), cmp, t_mvn_tst),
17115 CL("teqp", 130f000, 2, (RR, SH), cmp),
c19d1205 17116
5be8be5d
DG
17117 TC3("ldrt", 4300000, f8500e00, 2, (RRnpc_npcsp, ADDR),ldstt, t_ldstt),
17118 TC3("ldrbt", 4700000, f8100e00, 2, (RRnpc_npcsp, ADDR),ldstt, t_ldstt),
17119 TC3("strt", 4200000, f8400e00, 2, (RR_npcsp, ADDR), ldstt, t_ldstt),
17120 TC3("strbt", 4600000, f8000e00, 2, (RRnpc_npcsp, ADDR),ldstt, t_ldstt),
c19d1205 17121
21d799b5
NC
17122 TC3("stmdb", 9000000, e9000000, 2, (RRw, REGLST), ldmstm, t_ldmstm),
17123 TC3("stmfd", 9000000, e9000000, 2, (RRw, REGLST), ldmstm, t_ldmstm),
c19d1205 17124
21d799b5
NC
17125 TC3("ldmdb", 9100000, e9100000, 2, (RRw, REGLST), ldmstm, t_ldmstm),
17126 TC3("ldmea", 9100000, e9100000, 2, (RRw, REGLST), ldmstm, t_ldmstm),
c19d1205
ZW
17127
17128 /* V1 instructions with no Thumb analogue at all. */
21d799b5 17129 CE("rsc", 0e00000, 3, (RR, oRR, SH), arit),
c19d1205
ZW
17130 C3(rscs, 0f00000, 3, (RR, oRR, SH), arit),
17131
17132 C3(stmib, 9800000, 2, (RRw, REGLST), ldmstm),
17133 C3(stmfa, 9800000, 2, (RRw, REGLST), ldmstm),
17134 C3(stmda, 8000000, 2, (RRw, REGLST), ldmstm),
17135 C3(stmed, 8000000, 2, (RRw, REGLST), ldmstm),
17136 C3(ldmib, 9900000, 2, (RRw, REGLST), ldmstm),
17137 C3(ldmed, 9900000, 2, (RRw, REGLST), ldmstm),
17138 C3(ldmda, 8100000, 2, (RRw, REGLST), ldmstm),
17139 C3(ldmfa, 8100000, 2, (RRw, REGLST), ldmstm),
17140
c921be7d
NC
17141#undef ARM_VARIANT
17142#define ARM_VARIANT & arm_ext_v2 /* ARM 2 - multiplies. */
17143#undef THUMB_VARIANT
17144#define THUMB_VARIANT & arm_ext_v4t
17145
21d799b5
NC
17146 tCE("mul", 0000090, _mul, 3, (RRnpc, RRnpc, oRR), mul, t_mul),
17147 tC3("muls", 0100090, _muls, 3, (RRnpc, RRnpc, oRR), mul, t_mul),
c19d1205 17148
c921be7d
NC
17149#undef THUMB_VARIANT
17150#define THUMB_VARIANT & arm_ext_v6t2
17151
21d799b5 17152 TCE("mla", 0200090, fb000000, 4, (RRnpc, RRnpc, RRnpc, RRnpc), mlas, t_mla),
c19d1205
ZW
17153 C3(mlas, 0300090, 4, (RRnpc, RRnpc, RRnpc, RRnpc), mlas),
17154
17155 /* Generic coprocessor instructions. */
21d799b5
NC
17156 TCE("cdp", e000000, ee000000, 6, (RCP, I15b, RCN, RCN, RCN, oI7b), cdp, cdp),
17157 TCE("ldc", c100000, ec100000, 3, (RCP, RCN, ADDRGLDC), lstc, lstc),
17158 TC3("ldcl", c500000, ec500000, 3, (RCP, RCN, ADDRGLDC), lstc, lstc),
17159 TCE("stc", c000000, ec000000, 3, (RCP, RCN, ADDRGLDC), lstc, lstc),
17160 TC3("stcl", c400000, ec400000, 3, (RCP, RCN, ADDRGLDC), lstc, lstc),
17161 TCE("mcr", e000010, ee000010, 6, (RCP, I7b, RR, RCN, RCN, oI7b), co_reg, co_reg),
db472d6f 17162 TCE("mrc", e100010, ee100010, 6, (RCP, I7b, APSR_RR, RCN, RCN, oI7b), co_reg, co_reg),
c19d1205 17163
c921be7d
NC
17164#undef ARM_VARIANT
17165#define ARM_VARIANT & arm_ext_v2s /* ARM 3 - swp instructions. */
17166
21d799b5 17167 CE("swp", 1000090, 3, (RRnpc, RRnpc, RRnpcb), rd_rm_rn),
c19d1205
ZW
17168 C3(swpb, 1400090, 3, (RRnpc, RRnpc, RRnpcb), rd_rm_rn),
17169
c921be7d
NC
17170#undef ARM_VARIANT
17171#define ARM_VARIANT & arm_ext_v3 /* ARM 6 Status register instructions. */
17172#undef THUMB_VARIANT
17173#define THUMB_VARIANT & arm_ext_msr
17174
d2cd1205
JB
17175 TCE("mrs", 1000000, f3e08000, 2, (RRnpc, rPSR), mrs, t_mrs),
17176 TCE("msr", 120f000, f3808000, 2, (wPSR, RR_EXi), msr, t_msr),
c19d1205 17177
c921be7d
NC
17178#undef ARM_VARIANT
17179#define ARM_VARIANT & arm_ext_v3m /* ARM 7M long multiplies. */
17180#undef THUMB_VARIANT
17181#define THUMB_VARIANT & arm_ext_v6t2
17182
21d799b5
NC
17183 TCE("smull", 0c00090, fb800000, 4, (RRnpc, RRnpc, RRnpc, RRnpc), mull, t_mull),
17184 CM("smull","s", 0d00090, 4, (RRnpc, RRnpc, RRnpc, RRnpc), mull),
17185 TCE("umull", 0800090, fba00000, 4, (RRnpc, RRnpc, RRnpc, RRnpc), mull, t_mull),
17186 CM("umull","s", 0900090, 4, (RRnpc, RRnpc, RRnpc, RRnpc), mull),
17187 TCE("smlal", 0e00090, fbc00000, 4, (RRnpc, RRnpc, RRnpc, RRnpc), mull, t_mull),
17188 CM("smlal","s", 0f00090, 4, (RRnpc, RRnpc, RRnpc, RRnpc), mull),
17189 TCE("umlal", 0a00090, fbe00000, 4, (RRnpc, RRnpc, RRnpc, RRnpc), mull, t_mull),
17190 CM("umlal","s", 0b00090, 4, (RRnpc, RRnpc, RRnpc, RRnpc), mull),
c19d1205 17191
c921be7d
NC
17192#undef ARM_VARIANT
17193#define ARM_VARIANT & arm_ext_v4 /* ARM Architecture 4. */
17194#undef THUMB_VARIANT
17195#define THUMB_VARIANT & arm_ext_v4t
17196
5be8be5d
DG
17197 tC3("ldrh", 01000b0, _ldrh, 2, (RRnpc_npcsp, ADDRGLDRS), ldstv4, t_ldst),
17198 tC3("strh", 00000b0, _strh, 2, (RRnpc_npcsp, ADDRGLDRS), ldstv4, t_ldst),
17199 tC3("ldrsh", 01000f0, _ldrsh, 2, (RRnpc_npcsp, ADDRGLDRS), ldstv4, t_ldst),
17200 tC3("ldrsb", 01000d0, _ldrsb, 2, (RRnpc_npcsp, ADDRGLDRS), ldstv4, t_ldst),
17201 tCM("ld","sh", 01000f0, _ldrsh, 2, (RRnpc_npcsp, ADDRGLDRS), ldstv4, t_ldst),
17202 tCM("ld","sb", 01000d0, _ldrsb, 2, (RRnpc_npcsp, ADDRGLDRS), ldstv4, t_ldst),
c19d1205 17203
c921be7d
NC
17204#undef ARM_VARIANT
17205#define ARM_VARIANT & arm_ext_v4t_5
17206
c19d1205
ZW
17207 /* ARM Architecture 4T. */
17208 /* Note: bx (and blx) are required on V5, even if the processor does
17209 not support Thumb. */
21d799b5 17210 TCE("bx", 12fff10, 4700, 1, (RR), bx, t_bx),
c19d1205 17211
c921be7d
NC
17212#undef ARM_VARIANT
17213#define ARM_VARIANT & arm_ext_v5 /* ARM Architecture 5T. */
17214#undef THUMB_VARIANT
17215#define THUMB_VARIANT & arm_ext_v5t
17216
c19d1205
ZW
17217 /* Note: blx has 2 variants; the .value coded here is for
17218 BLX(2). Only this variant has conditional execution. */
21d799b5
NC
17219 TCE("blx", 12fff30, 4780, 1, (RR_EXr), blx, t_blx),
17220 TUE("bkpt", 1200070, be00, 1, (oIffffb), bkpt, t_bkpt),
c19d1205 17221
c921be7d
NC
17222#undef THUMB_VARIANT
17223#define THUMB_VARIANT & arm_ext_v6t2
17224
21d799b5
NC
17225 TCE("clz", 16f0f10, fab0f080, 2, (RRnpc, RRnpc), rd_rm, t_clz),
17226 TUF("ldc2", c100000, fc100000, 3, (RCP, RCN, ADDRGLDC), lstc, lstc),
17227 TUF("ldc2l", c500000, fc500000, 3, (RCP, RCN, ADDRGLDC), lstc, lstc),
17228 TUF("stc2", c000000, fc000000, 3, (RCP, RCN, ADDRGLDC), lstc, lstc),
17229 TUF("stc2l", c400000, fc400000, 3, (RCP, RCN, ADDRGLDC), lstc, lstc),
17230 TUF("cdp2", e000000, fe000000, 6, (RCP, I15b, RCN, RCN, RCN, oI7b), cdp, cdp),
17231 TUF("mcr2", e000010, fe000010, 6, (RCP, I7b, RR, RCN, RCN, oI7b), co_reg, co_reg),
17232 TUF("mrc2", e100010, fe100010, 6, (RCP, I7b, RR, RCN, RCN, oI7b), co_reg, co_reg),
c19d1205 17233
c921be7d
NC
17234#undef ARM_VARIANT
17235#define ARM_VARIANT & arm_ext_v5exp /* ARM Architecture 5TExP. */
9e3c6df6
PB
17236#undef THUMB_VARIANT
17237#define THUMB_VARIANT &arm_ext_v5exp
c921be7d 17238
21d799b5
NC
17239 TCE("smlabb", 1000080, fb100000, 4, (RRnpc, RRnpc, RRnpc, RRnpc), smla, t_mla),
17240 TCE("smlatb", 10000a0, fb100020, 4, (RRnpc, RRnpc, RRnpc, RRnpc), smla, t_mla),
17241 TCE("smlabt", 10000c0, fb100010, 4, (RRnpc, RRnpc, RRnpc, RRnpc), smla, t_mla),
17242 TCE("smlatt", 10000e0, fb100030, 4, (RRnpc, RRnpc, RRnpc, RRnpc), smla, t_mla),
c19d1205 17243
21d799b5
NC
17244 TCE("smlawb", 1200080, fb300000, 4, (RRnpc, RRnpc, RRnpc, RRnpc), smla, t_mla),
17245 TCE("smlawt", 12000c0, fb300010, 4, (RRnpc, RRnpc, RRnpc, RRnpc), smla, t_mla),
c19d1205 17246
21d799b5
NC
17247 TCE("smlalbb", 1400080, fbc00080, 4, (RRnpc, RRnpc, RRnpc, RRnpc), smlal, t_mlal),
17248 TCE("smlaltb", 14000a0, fbc000a0, 4, (RRnpc, RRnpc, RRnpc, RRnpc), smlal, t_mlal),
17249 TCE("smlalbt", 14000c0, fbc00090, 4, (RRnpc, RRnpc, RRnpc, RRnpc), smlal, t_mlal),
17250 TCE("smlaltt", 14000e0, fbc000b0, 4, (RRnpc, RRnpc, RRnpc, RRnpc), smlal, t_mlal),
c19d1205 17251
21d799b5
NC
17252 TCE("smulbb", 1600080, fb10f000, 3, (RRnpc, RRnpc, RRnpc), smul, t_simd),
17253 TCE("smultb", 16000a0, fb10f020, 3, (RRnpc, RRnpc, RRnpc), smul, t_simd),
17254 TCE("smulbt", 16000c0, fb10f010, 3, (RRnpc, RRnpc, RRnpc), smul, t_simd),
17255 TCE("smultt", 16000e0, fb10f030, 3, (RRnpc, RRnpc, RRnpc), smul, t_simd),
c19d1205 17256
21d799b5
NC
17257 TCE("smulwb", 12000a0, fb30f000, 3, (RRnpc, RRnpc, RRnpc), smul, t_simd),
17258 TCE("smulwt", 12000e0, fb30f010, 3, (RRnpc, RRnpc, RRnpc), smul, t_simd),
c19d1205 17259
03ee1b7f
NC
17260 TCE("qadd", 1000050, fa80f080, 3, (RRnpc, RRnpc, RRnpc), rd_rm_rn, t_simd2),
17261 TCE("qdadd", 1400050, fa80f090, 3, (RRnpc, RRnpc, RRnpc), rd_rm_rn, t_simd2),
17262 TCE("qsub", 1200050, fa80f0a0, 3, (RRnpc, RRnpc, RRnpc), rd_rm_rn, t_simd2),
17263 TCE("qdsub", 1600050, fa80f0b0, 3, (RRnpc, RRnpc, RRnpc), rd_rm_rn, t_simd2),
c19d1205 17264
c921be7d
NC
17265#undef ARM_VARIANT
17266#define ARM_VARIANT & arm_ext_v5e /* ARM Architecture 5TE. */
9e3c6df6
PB
17267#undef THUMB_VARIANT
17268#define THUMB_VARIANT &arm_ext_v6t2
c921be7d 17269
21d799b5 17270 TUF("pld", 450f000, f810f000, 1, (ADDR), pld, t_pld),
5be8be5d
DG
17271 TC3("ldrd", 00000d0, e8500000, 3, (RRnpc_npcsp, oRRnpc_npcsp, ADDRGLDRS),
17272 ldrd, t_ldstd),
17273 TC3("strd", 00000f0, e8400000, 3, (RRnpc_npcsp, oRRnpc_npcsp,
17274 ADDRGLDRS), ldrd, t_ldstd),
c19d1205 17275
21d799b5
NC
17276 TCE("mcrr", c400000, ec400000, 5, (RCP, I15b, RRnpc, RRnpc, RCN), co_reg2c, co_reg2c),
17277 TCE("mrrc", c500000, ec500000, 5, (RCP, I15b, RRnpc, RRnpc, RCN), co_reg2c, co_reg2c),
c19d1205 17278
c921be7d
NC
17279#undef ARM_VARIANT
17280#define ARM_VARIANT & arm_ext_v5j /* ARM Architecture 5TEJ. */
17281
21d799b5 17282 TCE("bxj", 12fff20, f3c08f00, 1, (RR), bxj, t_bxj),
c19d1205 17283
c921be7d
NC
17284#undef ARM_VARIANT
17285#define ARM_VARIANT & arm_ext_v6 /* ARM V6. */
17286#undef THUMB_VARIANT
17287#define THUMB_VARIANT & arm_ext_v6
17288
21d799b5
NC
17289 TUF("cpsie", 1080000, b660, 2, (CPSF, oI31b), cpsi, t_cpsi),
17290 TUF("cpsid", 10c0000, b670, 2, (CPSF, oI31b), cpsi, t_cpsi),
17291 tCE("rev", 6bf0f30, _rev, 2, (RRnpc, RRnpc), rd_rm, t_rev),
17292 tCE("rev16", 6bf0fb0, _rev16, 2, (RRnpc, RRnpc), rd_rm, t_rev),
17293 tCE("revsh", 6ff0fb0, _revsh, 2, (RRnpc, RRnpc), rd_rm, t_rev),
17294 tCE("sxth", 6bf0070, _sxth, 3, (RRnpc, RRnpc, oROR), sxth, t_sxth),
17295 tCE("uxth", 6ff0070, _uxth, 3, (RRnpc, RRnpc, oROR), sxth, t_sxth),
17296 tCE("sxtb", 6af0070, _sxtb, 3, (RRnpc, RRnpc, oROR), sxth, t_sxth),
17297 tCE("uxtb", 6ef0070, _uxtb, 3, (RRnpc, RRnpc, oROR), sxth, t_sxth),
17298 TUF("setend", 1010000, b650, 1, (ENDI), setend, t_setend),
c19d1205 17299
c921be7d
NC
17300#undef THUMB_VARIANT
17301#define THUMB_VARIANT & arm_ext_v6t2
17302
5be8be5d
DG
17303 TCE("ldrex", 1900f9f, e8500f00, 2, (RRnpc_npcsp, ADDR), ldrex, t_ldrex),
17304 TCE("strex", 1800f90, e8400000, 3, (RRnpc_npcsp, RRnpc_npcsp, ADDR),
17305 strex, t_strex),
21d799b5
NC
17306 TUF("mcrr2", c400000, fc400000, 5, (RCP, I15b, RRnpc, RRnpc, RCN), co_reg2c, co_reg2c),
17307 TUF("mrrc2", c500000, fc500000, 5, (RCP, I15b, RRnpc, RRnpc, RCN), co_reg2c, co_reg2c),
62b3e311 17308
21d799b5
NC
17309 TCE("ssat", 6a00010, f3000000, 4, (RRnpc, I32, RRnpc, oSHllar),ssat, t_ssat),
17310 TCE("usat", 6e00010, f3800000, 4, (RRnpc, I31, RRnpc, oSHllar),usat, t_usat),
62b3e311 17311
9e3c6df6 17312/* ARM V6 not included in V7M. */
c921be7d
NC
17313#undef THUMB_VARIANT
17314#define THUMB_VARIANT & arm_ext_v6_notm
9e3c6df6
PB
17315 TUF("rfeia", 8900a00, e990c000, 1, (RRw), rfe, rfe),
17316 UF(rfeib, 9900a00, 1, (RRw), rfe),
17317 UF(rfeda, 8100a00, 1, (RRw), rfe),
17318 TUF("rfedb", 9100a00, e810c000, 1, (RRw), rfe, rfe),
17319 TUF("rfefd", 8900a00, e990c000, 1, (RRw), rfe, rfe),
17320 UF(rfefa, 9900a00, 1, (RRw), rfe),
17321 UF(rfeea, 8100a00, 1, (RRw), rfe),
17322 TUF("rfeed", 9100a00, e810c000, 1, (RRw), rfe, rfe),
17323 TUF("srsia", 8c00500, e980c000, 2, (oRRw, I31w), srs, srs),
17324 UF(srsib, 9c00500, 2, (oRRw, I31w), srs),
17325 UF(srsda, 8400500, 2, (oRRw, I31w), srs),
17326 TUF("srsdb", 9400500, e800c000, 2, (oRRw, I31w), srs, srs),
c921be7d 17327
9e3c6df6
PB
17328/* ARM V6 not included in V7M (eg. integer SIMD). */
17329#undef THUMB_VARIANT
17330#define THUMB_VARIANT & arm_ext_v6_dsp
21d799b5
NC
17331 TUF("cps", 1020000, f3af8100, 1, (I31b), imm0, t_cps),
17332 TCE("pkhbt", 6800010, eac00000, 4, (RRnpc, RRnpc, RRnpc, oSHll), pkhbt, t_pkhbt),
17333 TCE("pkhtb", 6800050, eac00020, 4, (RRnpc, RRnpc, RRnpc, oSHar), pkhtb, t_pkhtb),
17334 TCE("qadd16", 6200f10, fa90f010, 3, (RRnpc, RRnpc, RRnpc), rd_rn_rm, t_simd),
17335 TCE("qadd8", 6200f90, fa80f010, 3, (RRnpc, RRnpc, RRnpc), rd_rn_rm, t_simd),
17336 TCE("qasx", 6200f30, faa0f010, 3, (RRnpc, RRnpc, RRnpc), rd_rn_rm, t_simd),
4f80ef3e 17337 /* Old name for QASX. */
21d799b5
NC
17338 TCE("qaddsubx", 6200f30, faa0f010, 3, (RRnpc, RRnpc, RRnpc), rd_rn_rm, t_simd),
17339 TCE("qsax", 6200f50, fae0f010, 3, (RRnpc, RRnpc, RRnpc), rd_rn_rm, t_simd),
4f80ef3e 17340 /* Old name for QSAX. */
21d799b5
NC
17341 TCE("qsubaddx", 6200f50, fae0f010, 3, (RRnpc, RRnpc, RRnpc), rd_rn_rm, t_simd),
17342 TCE("qsub16", 6200f70, fad0f010, 3, (RRnpc, RRnpc, RRnpc), rd_rn_rm, t_simd),
17343 TCE("qsub8", 6200ff0, fac0f010, 3, (RRnpc, RRnpc, RRnpc), rd_rn_rm, t_simd),
17344 TCE("sadd16", 6100f10, fa90f000, 3, (RRnpc, RRnpc, RRnpc), rd_rn_rm, t_simd),
17345 TCE("sadd8", 6100f90, fa80f000, 3, (RRnpc, RRnpc, RRnpc), rd_rn_rm, t_simd),
17346 TCE("sasx", 6100f30, faa0f000, 3, (RRnpc, RRnpc, RRnpc), rd_rn_rm, t_simd),
4f80ef3e 17347 /* Old name for SASX. */
21d799b5
NC
17348 TCE("saddsubx", 6100f30, faa0f000, 3, (RRnpc, RRnpc, RRnpc), rd_rn_rm, t_simd),
17349 TCE("shadd16", 6300f10, fa90f020, 3, (RRnpc, RRnpc, RRnpc), rd_rn_rm, t_simd),
17350 TCE("shadd8", 6300f90, fa80f020, 3, (RRnpc, RRnpc, RRnpc), rd_rn_rm, t_simd),
17351 TCE("shasx", 6300f30, faa0f020, 3, (RRnpc, RRnpc, RRnpc), rd_rn_rm, t_simd),
4f80ef3e 17352 /* Old name for SHASX. */
21d799b5
NC
17353 TCE("shaddsubx", 6300f30, faa0f020, 3, (RRnpc, RRnpc, RRnpc), rd_rn_rm, t_simd),
17354 TCE("shsax", 6300f50, fae0f020, 3, (RRnpc, RRnpc, RRnpc), rd_rn_rm, t_simd),
4f80ef3e 17355 /* Old name for SHSAX. */
21d799b5
NC
17356 TCE("shsubaddx", 6300f50, fae0f020, 3, (RRnpc, RRnpc, RRnpc), rd_rn_rm, t_simd),
17357 TCE("shsub16", 6300f70, fad0f020, 3, (RRnpc, RRnpc, RRnpc), rd_rn_rm, t_simd),
17358 TCE("shsub8", 6300ff0, fac0f020, 3, (RRnpc, RRnpc, RRnpc), rd_rn_rm, t_simd),
17359 TCE("ssax", 6100f50, fae0f000, 3, (RRnpc, RRnpc, RRnpc), rd_rn_rm, t_simd),
4f80ef3e 17360 /* Old name for SSAX. */
21d799b5
NC
17361 TCE("ssubaddx", 6100f50, fae0f000, 3, (RRnpc, RRnpc, RRnpc), rd_rn_rm, t_simd),
17362 TCE("ssub16", 6100f70, fad0f000, 3, (RRnpc, RRnpc, RRnpc), rd_rn_rm, t_simd),
17363 TCE("ssub8", 6100ff0, fac0f000, 3, (RRnpc, RRnpc, RRnpc), rd_rn_rm, t_simd),
17364 TCE("uadd16", 6500f10, fa90f040, 3, (RRnpc, RRnpc, RRnpc), rd_rn_rm, t_simd),
17365 TCE("uadd8", 6500f90, fa80f040, 3, (RRnpc, RRnpc, RRnpc), rd_rn_rm, t_simd),
17366 TCE("uasx", 6500f30, faa0f040, 3, (RRnpc, RRnpc, RRnpc), rd_rn_rm, t_simd),
4f80ef3e 17367 /* Old name for UASX. */
21d799b5
NC
17368 TCE("uaddsubx", 6500f30, faa0f040, 3, (RRnpc, RRnpc, RRnpc), rd_rn_rm, t_simd),
17369 TCE("uhadd16", 6700f10, fa90f060, 3, (RRnpc, RRnpc, RRnpc), rd_rn_rm, t_simd),
17370 TCE("uhadd8", 6700f90, fa80f060, 3, (RRnpc, RRnpc, RRnpc), rd_rn_rm, t_simd),
17371 TCE("uhasx", 6700f30, faa0f060, 3, (RRnpc, RRnpc, RRnpc), rd_rn_rm, t_simd),
4f80ef3e 17372 /* Old name for UHASX. */
21d799b5
NC
17373 TCE("uhaddsubx", 6700f30, faa0f060, 3, (RRnpc, RRnpc, RRnpc), rd_rn_rm, t_simd),
17374 TCE("uhsax", 6700f50, fae0f060, 3, (RRnpc, RRnpc, RRnpc), rd_rn_rm, t_simd),
4f80ef3e 17375 /* Old name for UHSAX. */
21d799b5
NC
17376 TCE("uhsubaddx", 6700f50, fae0f060, 3, (RRnpc, RRnpc, RRnpc), rd_rn_rm, t_simd),
17377 TCE("uhsub16", 6700f70, fad0f060, 3, (RRnpc, RRnpc, RRnpc), rd_rn_rm, t_simd),
17378 TCE("uhsub8", 6700ff0, fac0f060, 3, (RRnpc, RRnpc, RRnpc), rd_rn_rm, t_simd),
17379 TCE("uqadd16", 6600f10, fa90f050, 3, (RRnpc, RRnpc, RRnpc), rd_rn_rm, t_simd),
17380 TCE("uqadd8", 6600f90, fa80f050, 3, (RRnpc, RRnpc, RRnpc), rd_rn_rm, t_simd),
17381 TCE("uqasx", 6600f30, faa0f050, 3, (RRnpc, RRnpc, RRnpc), rd_rn_rm, t_simd),
4f80ef3e 17382 /* Old name for UQASX. */
21d799b5
NC
17383 TCE("uqaddsubx", 6600f30, faa0f050, 3, (RRnpc, RRnpc, RRnpc), rd_rn_rm, t_simd),
17384 TCE("uqsax", 6600f50, fae0f050, 3, (RRnpc, RRnpc, RRnpc), rd_rn_rm, t_simd),
4f80ef3e 17385 /* Old name for UQSAX. */
21d799b5
NC
17386 TCE("uqsubaddx", 6600f50, fae0f050, 3, (RRnpc, RRnpc, RRnpc), rd_rn_rm, t_simd),
17387 TCE("uqsub16", 6600f70, fad0f050, 3, (RRnpc, RRnpc, RRnpc), rd_rn_rm, t_simd),
17388 TCE("uqsub8", 6600ff0, fac0f050, 3, (RRnpc, RRnpc, RRnpc), rd_rn_rm, t_simd),
17389 TCE("usub16", 6500f70, fad0f040, 3, (RRnpc, RRnpc, RRnpc), rd_rn_rm, t_simd),
17390 TCE("usax", 6500f50, fae0f040, 3, (RRnpc, RRnpc, RRnpc), rd_rn_rm, t_simd),
4f80ef3e 17391 /* Old name for USAX. */
21d799b5
NC
17392 TCE("usubaddx", 6500f50, fae0f040, 3, (RRnpc, RRnpc, RRnpc), rd_rn_rm, t_simd),
17393 TCE("usub8", 6500ff0, fac0f040, 3, (RRnpc, RRnpc, RRnpc), rd_rn_rm, t_simd),
21d799b5
NC
17394 TCE("sxtah", 6b00070, fa00f080, 4, (RRnpc, RRnpc, RRnpc, oROR), sxtah, t_sxtah),
17395 TCE("sxtab16", 6800070, fa20f080, 4, (RRnpc, RRnpc, RRnpc, oROR), sxtah, t_sxtah),
17396 TCE("sxtab", 6a00070, fa40f080, 4, (RRnpc, RRnpc, RRnpc, oROR), sxtah, t_sxtah),
17397 TCE("sxtb16", 68f0070, fa2ff080, 3, (RRnpc, RRnpc, oROR), sxth, t_sxth),
17398 TCE("uxtah", 6f00070, fa10f080, 4, (RRnpc, RRnpc, RRnpc, oROR), sxtah, t_sxtah),
17399 TCE("uxtab16", 6c00070, fa30f080, 4, (RRnpc, RRnpc, RRnpc, oROR), sxtah, t_sxtah),
17400 TCE("uxtab", 6e00070, fa50f080, 4, (RRnpc, RRnpc, RRnpc, oROR), sxtah, t_sxtah),
17401 TCE("uxtb16", 6cf0070, fa3ff080, 3, (RRnpc, RRnpc, oROR), sxth, t_sxth),
17402 TCE("sel", 6800fb0, faa0f080, 3, (RRnpc, RRnpc, RRnpc), rd_rn_rm, t_simd),
17403 TCE("smlad", 7000010, fb200000, 4, (RRnpc, RRnpc, RRnpc, RRnpc),smla, t_mla),
17404 TCE("smladx", 7000030, fb200010, 4, (RRnpc, RRnpc, RRnpc, RRnpc),smla, t_mla),
17405 TCE("smlald", 7400010, fbc000c0, 4, (RRnpc, RRnpc, RRnpc, RRnpc),smlal,t_mlal),
17406 TCE("smlaldx", 7400030, fbc000d0, 4, (RRnpc, RRnpc, RRnpc, RRnpc),smlal,t_mlal),
17407 TCE("smlsd", 7000050, fb400000, 4, (RRnpc, RRnpc, RRnpc, RRnpc),smla, t_mla),
17408 TCE("smlsdx", 7000070, fb400010, 4, (RRnpc, RRnpc, RRnpc, RRnpc),smla, t_mla),
17409 TCE("smlsld", 7400050, fbd000c0, 4, (RRnpc, RRnpc, RRnpc, RRnpc),smlal,t_mlal),
17410 TCE("smlsldx", 7400070, fbd000d0, 4, (RRnpc, RRnpc, RRnpc, RRnpc),smlal,t_mlal),
17411 TCE("smmla", 7500010, fb500000, 4, (RRnpc, RRnpc, RRnpc, RRnpc),smla, t_mla),
17412 TCE("smmlar", 7500030, fb500010, 4, (RRnpc, RRnpc, RRnpc, RRnpc),smla, t_mla),
17413 TCE("smmls", 75000d0, fb600000, 4, (RRnpc, RRnpc, RRnpc, RRnpc),smla, t_mla),
17414 TCE("smmlsr", 75000f0, fb600010, 4, (RRnpc, RRnpc, RRnpc, RRnpc),smla, t_mla),
17415 TCE("smmul", 750f010, fb50f000, 3, (RRnpc, RRnpc, RRnpc), smul, t_simd),
17416 TCE("smmulr", 750f030, fb50f010, 3, (RRnpc, RRnpc, RRnpc), smul, t_simd),
17417 TCE("smuad", 700f010, fb20f000, 3, (RRnpc, RRnpc, RRnpc), smul, t_simd),
17418 TCE("smuadx", 700f030, fb20f010, 3, (RRnpc, RRnpc, RRnpc), smul, t_simd),
17419 TCE("smusd", 700f050, fb40f000, 3, (RRnpc, RRnpc, RRnpc), smul, t_simd),
17420 TCE("smusdx", 700f070, fb40f010, 3, (RRnpc, RRnpc, RRnpc), smul, t_simd),
21d799b5
NC
17421 TCE("ssat16", 6a00f30, f3200000, 3, (RRnpc, I16, RRnpc), ssat16, t_ssat16),
17422 TCE("umaal", 0400090, fbe00060, 4, (RRnpc, RRnpc, RRnpc, RRnpc),smlal, t_mlal),
17423 TCE("usad8", 780f010, fb70f000, 3, (RRnpc, RRnpc, RRnpc), smul, t_simd),
17424 TCE("usada8", 7800010, fb700000, 4, (RRnpc, RRnpc, RRnpc, RRnpc),smla, t_mla),
17425 TCE("usat16", 6e00f30, f3a00000, 3, (RRnpc, I15, RRnpc), usat16, t_usat16),
c19d1205 17426
c921be7d
NC
17427#undef ARM_VARIANT
17428#define ARM_VARIANT & arm_ext_v6k
17429#undef THUMB_VARIANT
17430#define THUMB_VARIANT & arm_ext_v6k
17431
21d799b5
NC
17432 tCE("yield", 320f001, _yield, 0, (), noargs, t_hint),
17433 tCE("wfe", 320f002, _wfe, 0, (), noargs, t_hint),
17434 tCE("wfi", 320f003, _wfi, 0, (), noargs, t_hint),
17435 tCE("sev", 320f004, _sev, 0, (), noargs, t_hint),
c19d1205 17436
c921be7d
NC
17437#undef THUMB_VARIANT
17438#define THUMB_VARIANT & arm_ext_v6_notm
5be8be5d
DG
17439 TCE("ldrexd", 1b00f9f, e8d0007f, 3, (RRnpc_npcsp, oRRnpc_npcsp, RRnpcb),
17440 ldrexd, t_ldrexd),
17441 TCE("strexd", 1a00f90, e8c00070, 4, (RRnpc_npcsp, RRnpc_npcsp, oRRnpc_npcsp,
17442 RRnpcb), strexd, t_strexd),
ebdca51a 17443
c921be7d
NC
17444#undef THUMB_VARIANT
17445#define THUMB_VARIANT & arm_ext_v6t2
5be8be5d
DG
17446 TCE("ldrexb", 1d00f9f, e8d00f4f, 2, (RRnpc_npcsp,RRnpcb),
17447 rd_rn, rd_rn),
17448 TCE("ldrexh", 1f00f9f, e8d00f5f, 2, (RRnpc_npcsp, RRnpcb),
17449 rd_rn, rd_rn),
17450 TCE("strexb", 1c00f90, e8c00f40, 3, (RRnpc_npcsp, RRnpc_npcsp, ADDR),
17451 strex, rm_rd_rn),
17452 TCE("strexh", 1e00f90, e8c00f50, 3, (RRnpc_npcsp, RRnpc_npcsp, ADDR),
17453 strex, rm_rd_rn),
21d799b5 17454 TUF("clrex", 57ff01f, f3bf8f2f, 0, (), noargs, noargs),
c19d1205 17455
c921be7d 17456#undef ARM_VARIANT
f4c65163
MGD
17457#define ARM_VARIANT & arm_ext_sec
17458#undef THUMB_VARIANT
17459#define THUMB_VARIANT & arm_ext_sec
c921be7d 17460
21d799b5 17461 TCE("smc", 1600070, f7f08000, 1, (EXPi), smc, t_smc),
c19d1205 17462
90ec0d68
MGD
17463#undef ARM_VARIANT
17464#define ARM_VARIANT & arm_ext_virt
17465#undef THUMB_VARIANT
17466#define THUMB_VARIANT & arm_ext_virt
17467
17468 TCE("hvc", 1400070, f7e08000, 1, (EXPi), hvc, t_hvc),
17469 TCE("eret", 160006e, f3de8f00, 0, (), noargs, noargs),
17470
c921be7d
NC
17471#undef ARM_VARIANT
17472#define ARM_VARIANT & arm_ext_v6t2
f4c65163
MGD
17473#undef THUMB_VARIANT
17474#define THUMB_VARIANT & arm_ext_v6t2
c921be7d 17475
21d799b5
NC
17476 TCE("bfc", 7c0001f, f36f0000, 3, (RRnpc, I31, I32), bfc, t_bfc),
17477 TCE("bfi", 7c00010, f3600000, 4, (RRnpc, RRnpc_I0, I31, I32), bfi, t_bfi),
17478 TCE("sbfx", 7a00050, f3400000, 4, (RR, RR, I31, I32), bfx, t_bfx),
17479 TCE("ubfx", 7e00050, f3c00000, 4, (RR, RR, I31, I32), bfx, t_bfx),
c19d1205 17480
21d799b5
NC
17481 TCE("mls", 0600090, fb000010, 4, (RRnpc, RRnpc, RRnpc, RRnpc), mlas, t_mla),
17482 TCE("movw", 3000000, f2400000, 2, (RRnpc, HALF), mov16, t_mov16),
17483 TCE("movt", 3400000, f2c00000, 2, (RRnpc, HALF), mov16, t_mov16),
17484 TCE("rbit", 6ff0f30, fa90f0a0, 2, (RR, RR), rd_rm, t_rbit),
c19d1205 17485
5be8be5d
DG
17486 TC3("ldrht", 03000b0, f8300e00, 2, (RRnpc_npcsp, ADDR), ldsttv4, t_ldstt),
17487 TC3("ldrsht", 03000f0, f9300e00, 2, (RRnpc_npcsp, ADDR), ldsttv4, t_ldstt),
17488 TC3("ldrsbt", 03000d0, f9100e00, 2, (RRnpc_npcsp, ADDR), ldsttv4, t_ldstt),
17489 TC3("strht", 02000b0, f8200e00, 2, (RRnpc_npcsp, ADDR), ldsttv4, t_ldstt),
c19d1205 17490
bf3eeda7
NS
17491 /* Thumb-only instructions. */
17492#undef ARM_VARIANT
17493#define ARM_VARIANT NULL
17494 TUE("cbnz", 0, b900, 2, (RR, EXP), 0, t_cbz),
17495 TUE("cbz", 0, b100, 2, (RR, EXP), 0, t_cbz),
c921be7d
NC
17496
17497 /* ARM does not really have an IT instruction, so always allow it.
17498 The opcode is copied from Thumb in order to allow warnings in
17499 -mimplicit-it=[never | arm] modes. */
17500#undef ARM_VARIANT
17501#define ARM_VARIANT & arm_ext_v1
17502
21d799b5
NC
17503 TUE("it", bf08, bf08, 1, (COND), it, t_it),
17504 TUE("itt", bf0c, bf0c, 1, (COND), it, t_it),
17505 TUE("ite", bf04, bf04, 1, (COND), it, t_it),
17506 TUE("ittt", bf0e, bf0e, 1, (COND), it, t_it),
17507 TUE("itet", bf06, bf06, 1, (COND), it, t_it),
17508 TUE("itte", bf0a, bf0a, 1, (COND), it, t_it),
17509 TUE("itee", bf02, bf02, 1, (COND), it, t_it),
17510 TUE("itttt", bf0f, bf0f, 1, (COND), it, t_it),
17511 TUE("itett", bf07, bf07, 1, (COND), it, t_it),
17512 TUE("ittet", bf0b, bf0b, 1, (COND), it, t_it),
17513 TUE("iteet", bf03, bf03, 1, (COND), it, t_it),
17514 TUE("ittte", bf0d, bf0d, 1, (COND), it, t_it),
17515 TUE("itete", bf05, bf05, 1, (COND), it, t_it),
17516 TUE("ittee", bf09, bf09, 1, (COND), it, t_it),
17517 TUE("iteee", bf01, bf01, 1, (COND), it, t_it),
1c444d06 17518 /* ARM/Thumb-2 instructions with no Thumb-1 equivalent. */
21d799b5
NC
17519 TC3("rrx", 01a00060, ea4f0030, 2, (RR, RR), rd_rm, t_rrx),
17520 TC3("rrxs", 01b00060, ea5f0030, 2, (RR, RR), rd_rm, t_rrx),
c19d1205 17521
92e90b6e 17522 /* Thumb2 only instructions. */
c921be7d
NC
17523#undef ARM_VARIANT
17524#define ARM_VARIANT NULL
92e90b6e 17525
21d799b5
NC
17526 TCE("addw", 0, f2000000, 3, (RR, RR, EXPi), 0, t_add_sub_w),
17527 TCE("subw", 0, f2a00000, 3, (RR, RR, EXPi), 0, t_add_sub_w),
17528 TCE("orn", 0, ea600000, 3, (RR, oRR, SH), 0, t_orn),
17529 TCE("orns", 0, ea700000, 3, (RR, oRR, SH), 0, t_orn),
17530 TCE("tbb", 0, e8d0f000, 1, (TB), 0, t_tb),
17531 TCE("tbh", 0, e8d0f010, 1, (TB), 0, t_tb),
92e90b6e 17532
eea54501
MGD
17533 /* Hardware division instructions. */
17534#undef ARM_VARIANT
17535#define ARM_VARIANT & arm_ext_adiv
c921be7d
NC
17536#undef THUMB_VARIANT
17537#define THUMB_VARIANT & arm_ext_div
17538
eea54501
MGD
17539 TCE("sdiv", 710f010, fb90f0f0, 3, (RR, oRR, RR), div, t_div),
17540 TCE("udiv", 730f010, fbb0f0f0, 3, (RR, oRR, RR), div, t_div),
62b3e311 17541
7e806470 17542 /* ARM V6M/V7 instructions. */
c921be7d
NC
17543#undef ARM_VARIANT
17544#define ARM_VARIANT & arm_ext_barrier
17545#undef THUMB_VARIANT
17546#define THUMB_VARIANT & arm_ext_barrier
17547
52e7f43d
RE
17548 TUF("dmb", 57ff050, f3bf8f50, 1, (oBARRIER_I15), barrier, t_barrier),
17549 TUF("dsb", 57ff040, f3bf8f40, 1, (oBARRIER_I15), barrier, t_barrier),
17550 TUF("isb", 57ff060, f3bf8f60, 1, (oBARRIER_I15), barrier, t_barrier),
7e806470 17551
62b3e311 17552 /* ARM V7 instructions. */
c921be7d
NC
17553#undef ARM_VARIANT
17554#define ARM_VARIANT & arm_ext_v7
17555#undef THUMB_VARIANT
17556#define THUMB_VARIANT & arm_ext_v7
17557
21d799b5
NC
17558 TUF("pli", 450f000, f910f000, 1, (ADDR), pli, t_pld),
17559 TCE("dbg", 320f0f0, f3af80f0, 1, (I15), dbg, t_dbg),
62b3e311 17560
60e5ef9f
MGD
17561#undef ARM_VARIANT
17562#define ARM_VARIANT & arm_ext_mp
17563#undef THUMB_VARIANT
17564#define THUMB_VARIANT & arm_ext_mp
17565
17566 TUF("pldw", 410f000, f830f000, 1, (ADDR), pld, t_pld),
17567
c921be7d
NC
17568#undef ARM_VARIANT
17569#define ARM_VARIANT & fpu_fpa_ext_v1 /* Core FPA instruction set (V1). */
17570
21d799b5
NC
17571 cCE("wfs", e200110, 1, (RR), rd),
17572 cCE("rfs", e300110, 1, (RR), rd),
17573 cCE("wfc", e400110, 1, (RR), rd),
17574 cCE("rfc", e500110, 1, (RR), rd),
17575
17576 cCL("ldfs", c100100, 2, (RF, ADDRGLDC), rd_cpaddr),
17577 cCL("ldfd", c108100, 2, (RF, ADDRGLDC), rd_cpaddr),
17578 cCL("ldfe", c500100, 2, (RF, ADDRGLDC), rd_cpaddr),
17579 cCL("ldfp", c508100, 2, (RF, ADDRGLDC), rd_cpaddr),
17580
17581 cCL("stfs", c000100, 2, (RF, ADDRGLDC), rd_cpaddr),
17582 cCL("stfd", c008100, 2, (RF, ADDRGLDC), rd_cpaddr),
17583 cCL("stfe", c400100, 2, (RF, ADDRGLDC), rd_cpaddr),
17584 cCL("stfp", c408100, 2, (RF, ADDRGLDC), rd_cpaddr),
17585
17586 cCL("mvfs", e008100, 2, (RF, RF_IF), rd_rm),
17587 cCL("mvfsp", e008120, 2, (RF, RF_IF), rd_rm),
17588 cCL("mvfsm", e008140, 2, (RF, RF_IF), rd_rm),
17589 cCL("mvfsz", e008160, 2, (RF, RF_IF), rd_rm),
17590 cCL("mvfd", e008180, 2, (RF, RF_IF), rd_rm),
17591 cCL("mvfdp", e0081a0, 2, (RF, RF_IF), rd_rm),
17592 cCL("mvfdm", e0081c0, 2, (RF, RF_IF), rd_rm),
17593 cCL("mvfdz", e0081e0, 2, (RF, RF_IF), rd_rm),
17594 cCL("mvfe", e088100, 2, (RF, RF_IF), rd_rm),
17595 cCL("mvfep", e088120, 2, (RF, RF_IF), rd_rm),
17596 cCL("mvfem", e088140, 2, (RF, RF_IF), rd_rm),
17597 cCL("mvfez", e088160, 2, (RF, RF_IF), rd_rm),
17598
17599 cCL("mnfs", e108100, 2, (RF, RF_IF), rd_rm),
17600 cCL("mnfsp", e108120, 2, (RF, RF_IF), rd_rm),
17601 cCL("mnfsm", e108140, 2, (RF, RF_IF), rd_rm),
17602 cCL("mnfsz", e108160, 2, (RF, RF_IF), rd_rm),
17603 cCL("mnfd", e108180, 2, (RF, RF_IF), rd_rm),
17604 cCL("mnfdp", e1081a0, 2, (RF, RF_IF), rd_rm),
17605 cCL("mnfdm", e1081c0, 2, (RF, RF_IF), rd_rm),
17606 cCL("mnfdz", e1081e0, 2, (RF, RF_IF), rd_rm),
17607 cCL("mnfe", e188100, 2, (RF, RF_IF), rd_rm),
17608 cCL("mnfep", e188120, 2, (RF, RF_IF), rd_rm),
17609 cCL("mnfem", e188140, 2, (RF, RF_IF), rd_rm),
17610 cCL("mnfez", e188160, 2, (RF, RF_IF), rd_rm),
17611
17612 cCL("abss", e208100, 2, (RF, RF_IF), rd_rm),
17613 cCL("abssp", e208120, 2, (RF, RF_IF), rd_rm),
17614 cCL("abssm", e208140, 2, (RF, RF_IF), rd_rm),
17615 cCL("abssz", e208160, 2, (RF, RF_IF), rd_rm),
17616 cCL("absd", e208180, 2, (RF, RF_IF), rd_rm),
17617 cCL("absdp", e2081a0, 2, (RF, RF_IF), rd_rm),
17618 cCL("absdm", e2081c0, 2, (RF, RF_IF), rd_rm),
17619 cCL("absdz", e2081e0, 2, (RF, RF_IF), rd_rm),
17620 cCL("abse", e288100, 2, (RF, RF_IF), rd_rm),
17621 cCL("absep", e288120, 2, (RF, RF_IF), rd_rm),
17622 cCL("absem", e288140, 2, (RF, RF_IF), rd_rm),
17623 cCL("absez", e288160, 2, (RF, RF_IF), rd_rm),
17624
17625 cCL("rnds", e308100, 2, (RF, RF_IF), rd_rm),
17626 cCL("rndsp", e308120, 2, (RF, RF_IF), rd_rm),
17627 cCL("rndsm", e308140, 2, (RF, RF_IF), rd_rm),
17628 cCL("rndsz", e308160, 2, (RF, RF_IF), rd_rm),
17629 cCL("rndd", e308180, 2, (RF, RF_IF), rd_rm),
17630 cCL("rnddp", e3081a0, 2, (RF, RF_IF), rd_rm),
17631 cCL("rnddm", e3081c0, 2, (RF, RF_IF), rd_rm),
17632 cCL("rnddz", e3081e0, 2, (RF, RF_IF), rd_rm),
17633 cCL("rnde", e388100, 2, (RF, RF_IF), rd_rm),
17634 cCL("rndep", e388120, 2, (RF, RF_IF), rd_rm),
17635 cCL("rndem", e388140, 2, (RF, RF_IF), rd_rm),
17636 cCL("rndez", e388160, 2, (RF, RF_IF), rd_rm),
17637
17638 cCL("sqts", e408100, 2, (RF, RF_IF), rd_rm),
17639 cCL("sqtsp", e408120, 2, (RF, RF_IF), rd_rm),
17640 cCL("sqtsm", e408140, 2, (RF, RF_IF), rd_rm),
17641 cCL("sqtsz", e408160, 2, (RF, RF_IF), rd_rm),
17642 cCL("sqtd", e408180, 2, (RF, RF_IF), rd_rm),
17643 cCL("sqtdp", e4081a0, 2, (RF, RF_IF), rd_rm),
17644 cCL("sqtdm", e4081c0, 2, (RF, RF_IF), rd_rm),
17645 cCL("sqtdz", e4081e0, 2, (RF, RF_IF), rd_rm),
17646 cCL("sqte", e488100, 2, (RF, RF_IF), rd_rm),
17647 cCL("sqtep", e488120, 2, (RF, RF_IF), rd_rm),
17648 cCL("sqtem", e488140, 2, (RF, RF_IF), rd_rm),
17649 cCL("sqtez", e488160, 2, (RF, RF_IF), rd_rm),
17650
17651 cCL("logs", e508100, 2, (RF, RF_IF), rd_rm),
17652 cCL("logsp", e508120, 2, (RF, RF_IF), rd_rm),
17653 cCL("logsm", e508140, 2, (RF, RF_IF), rd_rm),
17654 cCL("logsz", e508160, 2, (RF, RF_IF), rd_rm),
17655 cCL("logd", e508180, 2, (RF, RF_IF), rd_rm),
17656 cCL("logdp", e5081a0, 2, (RF, RF_IF), rd_rm),
17657 cCL("logdm", e5081c0, 2, (RF, RF_IF), rd_rm),
17658 cCL("logdz", e5081e0, 2, (RF, RF_IF), rd_rm),
17659 cCL("loge", e588100, 2, (RF, RF_IF), rd_rm),
17660 cCL("logep", e588120, 2, (RF, RF_IF), rd_rm),
17661 cCL("logem", e588140, 2, (RF, RF_IF), rd_rm),
17662 cCL("logez", e588160, 2, (RF, RF_IF), rd_rm),
17663
17664 cCL("lgns", e608100, 2, (RF, RF_IF), rd_rm),
17665 cCL("lgnsp", e608120, 2, (RF, RF_IF), rd_rm),
17666 cCL("lgnsm", e608140, 2, (RF, RF_IF), rd_rm),
17667 cCL("lgnsz", e608160, 2, (RF, RF_IF), rd_rm),
17668 cCL("lgnd", e608180, 2, (RF, RF_IF), rd_rm),
17669 cCL("lgndp", e6081a0, 2, (RF, RF_IF), rd_rm),
17670 cCL("lgndm", e6081c0, 2, (RF, RF_IF), rd_rm),
17671 cCL("lgndz", e6081e0, 2, (RF, RF_IF), rd_rm),
17672 cCL("lgne", e688100, 2, (RF, RF_IF), rd_rm),
17673 cCL("lgnep", e688120, 2, (RF, RF_IF), rd_rm),
17674 cCL("lgnem", e688140, 2, (RF, RF_IF), rd_rm),
17675 cCL("lgnez", e688160, 2, (RF, RF_IF), rd_rm),
17676
17677 cCL("exps", e708100, 2, (RF, RF_IF), rd_rm),
17678 cCL("expsp", e708120, 2, (RF, RF_IF), rd_rm),
17679 cCL("expsm", e708140, 2, (RF, RF_IF), rd_rm),
17680 cCL("expsz", e708160, 2, (RF, RF_IF), rd_rm),
17681 cCL("expd", e708180, 2, (RF, RF_IF), rd_rm),
17682 cCL("expdp", e7081a0, 2, (RF, RF_IF), rd_rm),
17683 cCL("expdm", e7081c0, 2, (RF, RF_IF), rd_rm),
17684 cCL("expdz", e7081e0, 2, (RF, RF_IF), rd_rm),
17685 cCL("expe", e788100, 2, (RF, RF_IF), rd_rm),
17686 cCL("expep", e788120, 2, (RF, RF_IF), rd_rm),
17687 cCL("expem", e788140, 2, (RF, RF_IF), rd_rm),
17688 cCL("expdz", e788160, 2, (RF, RF_IF), rd_rm),
17689
17690 cCL("sins", e808100, 2, (RF, RF_IF), rd_rm),
17691 cCL("sinsp", e808120, 2, (RF, RF_IF), rd_rm),
17692 cCL("sinsm", e808140, 2, (RF, RF_IF), rd_rm),
17693 cCL("sinsz", e808160, 2, (RF, RF_IF), rd_rm),
17694 cCL("sind", e808180, 2, (RF, RF_IF), rd_rm),
17695 cCL("sindp", e8081a0, 2, (RF, RF_IF), rd_rm),
17696 cCL("sindm", e8081c0, 2, (RF, RF_IF), rd_rm),
17697 cCL("sindz", e8081e0, 2, (RF, RF_IF), rd_rm),
17698 cCL("sine", e888100, 2, (RF, RF_IF), rd_rm),
17699 cCL("sinep", e888120, 2, (RF, RF_IF), rd_rm),
17700 cCL("sinem", e888140, 2, (RF, RF_IF), rd_rm),
17701 cCL("sinez", e888160, 2, (RF, RF_IF), rd_rm),
17702
17703 cCL("coss", e908100, 2, (RF, RF_IF), rd_rm),
17704 cCL("cossp", e908120, 2, (RF, RF_IF), rd_rm),
17705 cCL("cossm", e908140, 2, (RF, RF_IF), rd_rm),
17706 cCL("cossz", e908160, 2, (RF, RF_IF), rd_rm),
17707 cCL("cosd", e908180, 2, (RF, RF_IF), rd_rm),
17708 cCL("cosdp", e9081a0, 2, (RF, RF_IF), rd_rm),
17709 cCL("cosdm", e9081c0, 2, (RF, RF_IF), rd_rm),
17710 cCL("cosdz", e9081e0, 2, (RF, RF_IF), rd_rm),
17711 cCL("cose", e988100, 2, (RF, RF_IF), rd_rm),
17712 cCL("cosep", e988120, 2, (RF, RF_IF), rd_rm),
17713 cCL("cosem", e988140, 2, (RF, RF_IF), rd_rm),
17714 cCL("cosez", e988160, 2, (RF, RF_IF), rd_rm),
17715
17716 cCL("tans", ea08100, 2, (RF, RF_IF), rd_rm),
17717 cCL("tansp", ea08120, 2, (RF, RF_IF), rd_rm),
17718 cCL("tansm", ea08140, 2, (RF, RF_IF), rd_rm),
17719 cCL("tansz", ea08160, 2, (RF, RF_IF), rd_rm),
17720 cCL("tand", ea08180, 2, (RF, RF_IF), rd_rm),
17721 cCL("tandp", ea081a0, 2, (RF, RF_IF), rd_rm),
17722 cCL("tandm", ea081c0, 2, (RF, RF_IF), rd_rm),
17723 cCL("tandz", ea081e0, 2, (RF, RF_IF), rd_rm),
17724 cCL("tane", ea88100, 2, (RF, RF_IF), rd_rm),
17725 cCL("tanep", ea88120, 2, (RF, RF_IF), rd_rm),
17726 cCL("tanem", ea88140, 2, (RF, RF_IF), rd_rm),
17727 cCL("tanez", ea88160, 2, (RF, RF_IF), rd_rm),
17728
17729 cCL("asns", eb08100, 2, (RF, RF_IF), rd_rm),
17730 cCL("asnsp", eb08120, 2, (RF, RF_IF), rd_rm),
17731 cCL("asnsm", eb08140, 2, (RF, RF_IF), rd_rm),
17732 cCL("asnsz", eb08160, 2, (RF, RF_IF), rd_rm),
17733 cCL("asnd", eb08180, 2, (RF, RF_IF), rd_rm),
17734 cCL("asndp", eb081a0, 2, (RF, RF_IF), rd_rm),
17735 cCL("asndm", eb081c0, 2, (RF, RF_IF), rd_rm),
17736 cCL("asndz", eb081e0, 2, (RF, RF_IF), rd_rm),
17737 cCL("asne", eb88100, 2, (RF, RF_IF), rd_rm),
17738 cCL("asnep", eb88120, 2, (RF, RF_IF), rd_rm),
17739 cCL("asnem", eb88140, 2, (RF, RF_IF), rd_rm),
17740 cCL("asnez", eb88160, 2, (RF, RF_IF), rd_rm),
17741
17742 cCL("acss", ec08100, 2, (RF, RF_IF), rd_rm),
17743 cCL("acssp", ec08120, 2, (RF, RF_IF), rd_rm),
17744 cCL("acssm", ec08140, 2, (RF, RF_IF), rd_rm),
17745 cCL("acssz", ec08160, 2, (RF, RF_IF), rd_rm),
17746 cCL("acsd", ec08180, 2, (RF, RF_IF), rd_rm),
17747 cCL("acsdp", ec081a0, 2, (RF, RF_IF), rd_rm),
17748 cCL("acsdm", ec081c0, 2, (RF, RF_IF), rd_rm),
17749 cCL("acsdz", ec081e0, 2, (RF, RF_IF), rd_rm),
17750 cCL("acse", ec88100, 2, (RF, RF_IF), rd_rm),
17751 cCL("acsep", ec88120, 2, (RF, RF_IF), rd_rm),
17752 cCL("acsem", ec88140, 2, (RF, RF_IF), rd_rm),
17753 cCL("acsez", ec88160, 2, (RF, RF_IF), rd_rm),
17754
17755 cCL("atns", ed08100, 2, (RF, RF_IF), rd_rm),
17756 cCL("atnsp", ed08120, 2, (RF, RF_IF), rd_rm),
17757 cCL("atnsm", ed08140, 2, (RF, RF_IF), rd_rm),
17758 cCL("atnsz", ed08160, 2, (RF, RF_IF), rd_rm),
17759 cCL("atnd", ed08180, 2, (RF, RF_IF), rd_rm),
17760 cCL("atndp", ed081a0, 2, (RF, RF_IF), rd_rm),
17761 cCL("atndm", ed081c0, 2, (RF, RF_IF), rd_rm),
17762 cCL("atndz", ed081e0, 2, (RF, RF_IF), rd_rm),
17763 cCL("atne", ed88100, 2, (RF, RF_IF), rd_rm),
17764 cCL("atnep", ed88120, 2, (RF, RF_IF), rd_rm),
17765 cCL("atnem", ed88140, 2, (RF, RF_IF), rd_rm),
17766 cCL("atnez", ed88160, 2, (RF, RF_IF), rd_rm),
17767
17768 cCL("urds", ee08100, 2, (RF, RF_IF), rd_rm),
17769 cCL("urdsp", ee08120, 2, (RF, RF_IF), rd_rm),
17770 cCL("urdsm", ee08140, 2, (RF, RF_IF), rd_rm),
17771 cCL("urdsz", ee08160, 2, (RF, RF_IF), rd_rm),
17772 cCL("urdd", ee08180, 2, (RF, RF_IF), rd_rm),
17773 cCL("urddp", ee081a0, 2, (RF, RF_IF), rd_rm),
17774 cCL("urddm", ee081c0, 2, (RF, RF_IF), rd_rm),
17775 cCL("urddz", ee081e0, 2, (RF, RF_IF), rd_rm),
17776 cCL("urde", ee88100, 2, (RF, RF_IF), rd_rm),
17777 cCL("urdep", ee88120, 2, (RF, RF_IF), rd_rm),
17778 cCL("urdem", ee88140, 2, (RF, RF_IF), rd_rm),
17779 cCL("urdez", ee88160, 2, (RF, RF_IF), rd_rm),
17780
17781 cCL("nrms", ef08100, 2, (RF, RF_IF), rd_rm),
17782 cCL("nrmsp", ef08120, 2, (RF, RF_IF), rd_rm),
17783 cCL("nrmsm", ef08140, 2, (RF, RF_IF), rd_rm),
17784 cCL("nrmsz", ef08160, 2, (RF, RF_IF), rd_rm),
17785 cCL("nrmd", ef08180, 2, (RF, RF_IF), rd_rm),
17786 cCL("nrmdp", ef081a0, 2, (RF, RF_IF), rd_rm),
17787 cCL("nrmdm", ef081c0, 2, (RF, RF_IF), rd_rm),
17788 cCL("nrmdz", ef081e0, 2, (RF, RF_IF), rd_rm),
17789 cCL("nrme", ef88100, 2, (RF, RF_IF), rd_rm),
17790 cCL("nrmep", ef88120, 2, (RF, RF_IF), rd_rm),
17791 cCL("nrmem", ef88140, 2, (RF, RF_IF), rd_rm),
17792 cCL("nrmez", ef88160, 2, (RF, RF_IF), rd_rm),
17793
17794 cCL("adfs", e000100, 3, (RF, RF, RF_IF), rd_rn_rm),
17795 cCL("adfsp", e000120, 3, (RF, RF, RF_IF), rd_rn_rm),
17796 cCL("adfsm", e000140, 3, (RF, RF, RF_IF), rd_rn_rm),
17797 cCL("adfsz", e000160, 3, (RF, RF, RF_IF), rd_rn_rm),
17798 cCL("adfd", e000180, 3, (RF, RF, RF_IF), rd_rn_rm),
17799 cCL("adfdp", e0001a0, 3, (RF, RF, RF_IF), rd_rn_rm),
17800 cCL("adfdm", e0001c0, 3, (RF, RF, RF_IF), rd_rn_rm),
17801 cCL("adfdz", e0001e0, 3, (RF, RF, RF_IF), rd_rn_rm),
17802 cCL("adfe", e080100, 3, (RF, RF, RF_IF), rd_rn_rm),
17803 cCL("adfep", e080120, 3, (RF, RF, RF_IF), rd_rn_rm),
17804 cCL("adfem", e080140, 3, (RF, RF, RF_IF), rd_rn_rm),
17805 cCL("adfez", e080160, 3, (RF, RF, RF_IF), rd_rn_rm),
17806
17807 cCL("sufs", e200100, 3, (RF, RF, RF_IF), rd_rn_rm),
17808 cCL("sufsp", e200120, 3, (RF, RF, RF_IF), rd_rn_rm),
17809 cCL("sufsm", e200140, 3, (RF, RF, RF_IF), rd_rn_rm),
17810 cCL("sufsz", e200160, 3, (RF, RF, RF_IF), rd_rn_rm),
17811 cCL("sufd", e200180, 3, (RF, RF, RF_IF), rd_rn_rm),
17812 cCL("sufdp", e2001a0, 3, (RF, RF, RF_IF), rd_rn_rm),
17813 cCL("sufdm", e2001c0, 3, (RF, RF, RF_IF), rd_rn_rm),
17814 cCL("sufdz", e2001e0, 3, (RF, RF, RF_IF), rd_rn_rm),
17815 cCL("sufe", e280100, 3, (RF, RF, RF_IF), rd_rn_rm),
17816 cCL("sufep", e280120, 3, (RF, RF, RF_IF), rd_rn_rm),
17817 cCL("sufem", e280140, 3, (RF, RF, RF_IF), rd_rn_rm),
17818 cCL("sufez", e280160, 3, (RF, RF, RF_IF), rd_rn_rm),
17819
17820 cCL("rsfs", e300100, 3, (RF, RF, RF_IF), rd_rn_rm),
17821 cCL("rsfsp", e300120, 3, (RF, RF, RF_IF), rd_rn_rm),
17822 cCL("rsfsm", e300140, 3, (RF, RF, RF_IF), rd_rn_rm),
17823 cCL("rsfsz", e300160, 3, (RF, RF, RF_IF), rd_rn_rm),
17824 cCL("rsfd", e300180, 3, (RF, RF, RF_IF), rd_rn_rm),
17825 cCL("rsfdp", e3001a0, 3, (RF, RF, RF_IF), rd_rn_rm),
17826 cCL("rsfdm", e3001c0, 3, (RF, RF, RF_IF), rd_rn_rm),
17827 cCL("rsfdz", e3001e0, 3, (RF, RF, RF_IF), rd_rn_rm),
17828 cCL("rsfe", e380100, 3, (RF, RF, RF_IF), rd_rn_rm),
17829 cCL("rsfep", e380120, 3, (RF, RF, RF_IF), rd_rn_rm),
17830 cCL("rsfem", e380140, 3, (RF, RF, RF_IF), rd_rn_rm),
17831 cCL("rsfez", e380160, 3, (RF, RF, RF_IF), rd_rn_rm),
17832
17833 cCL("mufs", e100100, 3, (RF, RF, RF_IF), rd_rn_rm),
17834 cCL("mufsp", e100120, 3, (RF, RF, RF_IF), rd_rn_rm),
17835 cCL("mufsm", e100140, 3, (RF, RF, RF_IF), rd_rn_rm),
17836 cCL("mufsz", e100160, 3, (RF, RF, RF_IF), rd_rn_rm),
17837 cCL("mufd", e100180, 3, (RF, RF, RF_IF), rd_rn_rm),
17838 cCL("mufdp", e1001a0, 3, (RF, RF, RF_IF), rd_rn_rm),
17839 cCL("mufdm", e1001c0, 3, (RF, RF, RF_IF), rd_rn_rm),
17840 cCL("mufdz", e1001e0, 3, (RF, RF, RF_IF), rd_rn_rm),
17841 cCL("mufe", e180100, 3, (RF, RF, RF_IF), rd_rn_rm),
17842 cCL("mufep", e180120, 3, (RF, RF, RF_IF), rd_rn_rm),
17843 cCL("mufem", e180140, 3, (RF, RF, RF_IF), rd_rn_rm),
17844 cCL("mufez", e180160, 3, (RF, RF, RF_IF), rd_rn_rm),
17845
17846 cCL("dvfs", e400100, 3, (RF, RF, RF_IF), rd_rn_rm),
17847 cCL("dvfsp", e400120, 3, (RF, RF, RF_IF), rd_rn_rm),
17848 cCL("dvfsm", e400140, 3, (RF, RF, RF_IF), rd_rn_rm),
17849 cCL("dvfsz", e400160, 3, (RF, RF, RF_IF), rd_rn_rm),
17850 cCL("dvfd", e400180, 3, (RF, RF, RF_IF), rd_rn_rm),
17851 cCL("dvfdp", e4001a0, 3, (RF, RF, RF_IF), rd_rn_rm),
17852 cCL("dvfdm", e4001c0, 3, (RF, RF, RF_IF), rd_rn_rm),
17853 cCL("dvfdz", e4001e0, 3, (RF, RF, RF_IF), rd_rn_rm),
17854 cCL("dvfe", e480100, 3, (RF, RF, RF_IF), rd_rn_rm),
17855 cCL("dvfep", e480120, 3, (RF, RF, RF_IF), rd_rn_rm),
17856 cCL("dvfem", e480140, 3, (RF, RF, RF_IF), rd_rn_rm),
17857 cCL("dvfez", e480160, 3, (RF, RF, RF_IF), rd_rn_rm),
17858
17859 cCL("rdfs", e500100, 3, (RF, RF, RF_IF), rd_rn_rm),
17860 cCL("rdfsp", e500120, 3, (RF, RF, RF_IF), rd_rn_rm),
17861 cCL("rdfsm", e500140, 3, (RF, RF, RF_IF), rd_rn_rm),
17862 cCL("rdfsz", e500160, 3, (RF, RF, RF_IF), rd_rn_rm),
17863 cCL("rdfd", e500180, 3, (RF, RF, RF_IF), rd_rn_rm),
17864 cCL("rdfdp", e5001a0, 3, (RF, RF, RF_IF), rd_rn_rm),
17865 cCL("rdfdm", e5001c0, 3, (RF, RF, RF_IF), rd_rn_rm),
17866 cCL("rdfdz", e5001e0, 3, (RF, RF, RF_IF), rd_rn_rm),
17867 cCL("rdfe", e580100, 3, (RF, RF, RF_IF), rd_rn_rm),
17868 cCL("rdfep", e580120, 3, (RF, RF, RF_IF), rd_rn_rm),
17869 cCL("rdfem", e580140, 3, (RF, RF, RF_IF), rd_rn_rm),
17870 cCL("rdfez", e580160, 3, (RF, RF, RF_IF), rd_rn_rm),
17871
17872 cCL("pows", e600100, 3, (RF, RF, RF_IF), rd_rn_rm),
17873 cCL("powsp", e600120, 3, (RF, RF, RF_IF), rd_rn_rm),
17874 cCL("powsm", e600140, 3, (RF, RF, RF_IF), rd_rn_rm),
17875 cCL("powsz", e600160, 3, (RF, RF, RF_IF), rd_rn_rm),
17876 cCL("powd", e600180, 3, (RF, RF, RF_IF), rd_rn_rm),
17877 cCL("powdp", e6001a0, 3, (RF, RF, RF_IF), rd_rn_rm),
17878 cCL("powdm", e6001c0, 3, (RF, RF, RF_IF), rd_rn_rm),
17879 cCL("powdz", e6001e0, 3, (RF, RF, RF_IF), rd_rn_rm),
17880 cCL("powe", e680100, 3, (RF, RF, RF_IF), rd_rn_rm),
17881 cCL("powep", e680120, 3, (RF, RF, RF_IF), rd_rn_rm),
17882 cCL("powem", e680140, 3, (RF, RF, RF_IF), rd_rn_rm),
17883 cCL("powez", e680160, 3, (RF, RF, RF_IF), rd_rn_rm),
17884
17885 cCL("rpws", e700100, 3, (RF, RF, RF_IF), rd_rn_rm),
17886 cCL("rpwsp", e700120, 3, (RF, RF, RF_IF), rd_rn_rm),
17887 cCL("rpwsm", e700140, 3, (RF, RF, RF_IF), rd_rn_rm),
17888 cCL("rpwsz", e700160, 3, (RF, RF, RF_IF), rd_rn_rm),
17889 cCL("rpwd", e700180, 3, (RF, RF, RF_IF), rd_rn_rm),
17890 cCL("rpwdp", e7001a0, 3, (RF, RF, RF_IF), rd_rn_rm),
17891 cCL("rpwdm", e7001c0, 3, (RF, RF, RF_IF), rd_rn_rm),
17892 cCL("rpwdz", e7001e0, 3, (RF, RF, RF_IF), rd_rn_rm),
17893 cCL("rpwe", e780100, 3, (RF, RF, RF_IF), rd_rn_rm),
17894 cCL("rpwep", e780120, 3, (RF, RF, RF_IF), rd_rn_rm),
17895 cCL("rpwem", e780140, 3, (RF, RF, RF_IF), rd_rn_rm),
17896 cCL("rpwez", e780160, 3, (RF, RF, RF_IF), rd_rn_rm),
17897
17898 cCL("rmfs", e800100, 3, (RF, RF, RF_IF), rd_rn_rm),
17899 cCL("rmfsp", e800120, 3, (RF, RF, RF_IF), rd_rn_rm),
17900 cCL("rmfsm", e800140, 3, (RF, RF, RF_IF), rd_rn_rm),
17901 cCL("rmfsz", e800160, 3, (RF, RF, RF_IF), rd_rn_rm),
17902 cCL("rmfd", e800180, 3, (RF, RF, RF_IF), rd_rn_rm),
17903 cCL("rmfdp", e8001a0, 3, (RF, RF, RF_IF), rd_rn_rm),
17904 cCL("rmfdm", e8001c0, 3, (RF, RF, RF_IF), rd_rn_rm),
17905 cCL("rmfdz", e8001e0, 3, (RF, RF, RF_IF), rd_rn_rm),
17906 cCL("rmfe", e880100, 3, (RF, RF, RF_IF), rd_rn_rm),
17907 cCL("rmfep", e880120, 3, (RF, RF, RF_IF), rd_rn_rm),
17908 cCL("rmfem", e880140, 3, (RF, RF, RF_IF), rd_rn_rm),
17909 cCL("rmfez", e880160, 3, (RF, RF, RF_IF), rd_rn_rm),
17910
17911 cCL("fmls", e900100, 3, (RF, RF, RF_IF), rd_rn_rm),
17912 cCL("fmlsp", e900120, 3, (RF, RF, RF_IF), rd_rn_rm),
17913 cCL("fmlsm", e900140, 3, (RF, RF, RF_IF), rd_rn_rm),
17914 cCL("fmlsz", e900160, 3, (RF, RF, RF_IF), rd_rn_rm),
17915 cCL("fmld", e900180, 3, (RF, RF, RF_IF), rd_rn_rm),
17916 cCL("fmldp", e9001a0, 3, (RF, RF, RF_IF), rd_rn_rm),
17917 cCL("fmldm", e9001c0, 3, (RF, RF, RF_IF), rd_rn_rm),
17918 cCL("fmldz", e9001e0, 3, (RF, RF, RF_IF), rd_rn_rm),
17919 cCL("fmle", e980100, 3, (RF, RF, RF_IF), rd_rn_rm),
17920 cCL("fmlep", e980120, 3, (RF, RF, RF_IF), rd_rn_rm),
17921 cCL("fmlem", e980140, 3, (RF, RF, RF_IF), rd_rn_rm),
17922 cCL("fmlez", e980160, 3, (RF, RF, RF_IF), rd_rn_rm),
17923
17924 cCL("fdvs", ea00100, 3, (RF, RF, RF_IF), rd_rn_rm),
17925 cCL("fdvsp", ea00120, 3, (RF, RF, RF_IF), rd_rn_rm),
17926 cCL("fdvsm", ea00140, 3, (RF, RF, RF_IF), rd_rn_rm),
17927 cCL("fdvsz", ea00160, 3, (RF, RF, RF_IF), rd_rn_rm),
17928 cCL("fdvd", ea00180, 3, (RF, RF, RF_IF), rd_rn_rm),
17929 cCL("fdvdp", ea001a0, 3, (RF, RF, RF_IF), rd_rn_rm),
17930 cCL("fdvdm", ea001c0, 3, (RF, RF, RF_IF), rd_rn_rm),
17931 cCL("fdvdz", ea001e0, 3, (RF, RF, RF_IF), rd_rn_rm),
17932 cCL("fdve", ea80100, 3, (RF, RF, RF_IF), rd_rn_rm),
17933 cCL("fdvep", ea80120, 3, (RF, RF, RF_IF), rd_rn_rm),
17934 cCL("fdvem", ea80140, 3, (RF, RF, RF_IF), rd_rn_rm),
17935 cCL("fdvez", ea80160, 3, (RF, RF, RF_IF), rd_rn_rm),
17936
17937 cCL("frds", eb00100, 3, (RF, RF, RF_IF), rd_rn_rm),
17938 cCL("frdsp", eb00120, 3, (RF, RF, RF_IF), rd_rn_rm),
17939 cCL("frdsm", eb00140, 3, (RF, RF, RF_IF), rd_rn_rm),
17940 cCL("frdsz", eb00160, 3, (RF, RF, RF_IF), rd_rn_rm),
17941 cCL("frdd", eb00180, 3, (RF, RF, RF_IF), rd_rn_rm),
17942 cCL("frddp", eb001a0, 3, (RF, RF, RF_IF), rd_rn_rm),
17943 cCL("frddm", eb001c0, 3, (RF, RF, RF_IF), rd_rn_rm),
17944 cCL("frddz", eb001e0, 3, (RF, RF, RF_IF), rd_rn_rm),
17945 cCL("frde", eb80100, 3, (RF, RF, RF_IF), rd_rn_rm),
17946 cCL("frdep", eb80120, 3, (RF, RF, RF_IF), rd_rn_rm),
17947 cCL("frdem", eb80140, 3, (RF, RF, RF_IF), rd_rn_rm),
17948 cCL("frdez", eb80160, 3, (RF, RF, RF_IF), rd_rn_rm),
17949
17950 cCL("pols", ec00100, 3, (RF, RF, RF_IF), rd_rn_rm),
17951 cCL("polsp", ec00120, 3, (RF, RF, RF_IF), rd_rn_rm),
17952 cCL("polsm", ec00140, 3, (RF, RF, RF_IF), rd_rn_rm),
17953 cCL("polsz", ec00160, 3, (RF, RF, RF_IF), rd_rn_rm),
17954 cCL("pold", ec00180, 3, (RF, RF, RF_IF), rd_rn_rm),
17955 cCL("poldp", ec001a0, 3, (RF, RF, RF_IF), rd_rn_rm),
17956 cCL("poldm", ec001c0, 3, (RF, RF, RF_IF), rd_rn_rm),
17957 cCL("poldz", ec001e0, 3, (RF, RF, RF_IF), rd_rn_rm),
17958 cCL("pole", ec80100, 3, (RF, RF, RF_IF), rd_rn_rm),
17959 cCL("polep", ec80120, 3, (RF, RF, RF_IF), rd_rn_rm),
17960 cCL("polem", ec80140, 3, (RF, RF, RF_IF), rd_rn_rm),
17961 cCL("polez", ec80160, 3, (RF, RF, RF_IF), rd_rn_rm),
17962
17963 cCE("cmf", e90f110, 2, (RF, RF_IF), fpa_cmp),
17964 C3E("cmfe", ed0f110, 2, (RF, RF_IF), fpa_cmp),
17965 cCE("cnf", eb0f110, 2, (RF, RF_IF), fpa_cmp),
17966 C3E("cnfe", ef0f110, 2, (RF, RF_IF), fpa_cmp),
17967
17968 cCL("flts", e000110, 2, (RF, RR), rn_rd),
17969 cCL("fltsp", e000130, 2, (RF, RR), rn_rd),
17970 cCL("fltsm", e000150, 2, (RF, RR), rn_rd),
17971 cCL("fltsz", e000170, 2, (RF, RR), rn_rd),
17972 cCL("fltd", e000190, 2, (RF, RR), rn_rd),
17973 cCL("fltdp", e0001b0, 2, (RF, RR), rn_rd),
17974 cCL("fltdm", e0001d0, 2, (RF, RR), rn_rd),
17975 cCL("fltdz", e0001f0, 2, (RF, RR), rn_rd),
17976 cCL("flte", e080110, 2, (RF, RR), rn_rd),
17977 cCL("fltep", e080130, 2, (RF, RR), rn_rd),
17978 cCL("fltem", e080150, 2, (RF, RR), rn_rd),
17979 cCL("fltez", e080170, 2, (RF, RR), rn_rd),
b99bd4ef 17980
c19d1205
ZW
17981 /* The implementation of the FIX instruction is broken on some
17982 assemblers, in that it accepts a precision specifier as well as a
17983 rounding specifier, despite the fact that this is meaningless.
17984 To be more compatible, we accept it as well, though of course it
17985 does not set any bits. */
21d799b5
NC
17986 cCE("fix", e100110, 2, (RR, RF), rd_rm),
17987 cCL("fixp", e100130, 2, (RR, RF), rd_rm),
17988 cCL("fixm", e100150, 2, (RR, RF), rd_rm),
17989 cCL("fixz", e100170, 2, (RR, RF), rd_rm),
17990 cCL("fixsp", e100130, 2, (RR, RF), rd_rm),
17991 cCL("fixsm", e100150, 2, (RR, RF), rd_rm),
17992 cCL("fixsz", e100170, 2, (RR, RF), rd_rm),
17993 cCL("fixdp", e100130, 2, (RR, RF), rd_rm),
17994 cCL("fixdm", e100150, 2, (RR, RF), rd_rm),
17995 cCL("fixdz", e100170, 2, (RR, RF), rd_rm),
17996 cCL("fixep", e100130, 2, (RR, RF), rd_rm),
17997 cCL("fixem", e100150, 2, (RR, RF), rd_rm),
17998 cCL("fixez", e100170, 2, (RR, RF), rd_rm),
bfae80f2 17999
c19d1205 18000 /* Instructions that were new with the real FPA, call them V2. */
c921be7d
NC
18001#undef ARM_VARIANT
18002#define ARM_VARIANT & fpu_fpa_ext_v2
18003
21d799b5
NC
18004 cCE("lfm", c100200, 3, (RF, I4b, ADDR), fpa_ldmstm),
18005 cCL("lfmfd", c900200, 3, (RF, I4b, ADDR), fpa_ldmstm),
18006 cCL("lfmea", d100200, 3, (RF, I4b, ADDR), fpa_ldmstm),
18007 cCE("sfm", c000200, 3, (RF, I4b, ADDR), fpa_ldmstm),
18008 cCL("sfmfd", d000200, 3, (RF, I4b, ADDR), fpa_ldmstm),
18009 cCL("sfmea", c800200, 3, (RF, I4b, ADDR), fpa_ldmstm),
c19d1205 18010
c921be7d
NC
18011#undef ARM_VARIANT
18012#define ARM_VARIANT & fpu_vfp_ext_v1xd /* VFP V1xD (single precision). */
18013
c19d1205 18014 /* Moves and type conversions. */
21d799b5
NC
18015 cCE("fcpys", eb00a40, 2, (RVS, RVS), vfp_sp_monadic),
18016 cCE("fmrs", e100a10, 2, (RR, RVS), vfp_reg_from_sp),
18017 cCE("fmsr", e000a10, 2, (RVS, RR), vfp_sp_from_reg),
18018 cCE("fmstat", ef1fa10, 0, (), noargs),
f7c21dc7
NC
18019 cCE("vmrs", ef10a10, 2, (APSR_RR, RVC), vmrs),
18020 cCE("vmsr", ee10a10, 2, (RVC, RR), vmsr),
21d799b5
NC
18021 cCE("fsitos", eb80ac0, 2, (RVS, RVS), vfp_sp_monadic),
18022 cCE("fuitos", eb80a40, 2, (RVS, RVS), vfp_sp_monadic),
18023 cCE("ftosis", ebd0a40, 2, (RVS, RVS), vfp_sp_monadic),
18024 cCE("ftosizs", ebd0ac0, 2, (RVS, RVS), vfp_sp_monadic),
18025 cCE("ftouis", ebc0a40, 2, (RVS, RVS), vfp_sp_monadic),
18026 cCE("ftouizs", ebc0ac0, 2, (RVS, RVS), vfp_sp_monadic),
18027 cCE("fmrx", ef00a10, 2, (RR, RVC), rd_rn),
18028 cCE("fmxr", ee00a10, 2, (RVC, RR), rn_rd),
c19d1205
ZW
18029
18030 /* Memory operations. */
21d799b5
NC
18031 cCE("flds", d100a00, 2, (RVS, ADDRGLDC), vfp_sp_ldst),
18032 cCE("fsts", d000a00, 2, (RVS, ADDRGLDC), vfp_sp_ldst),
55881a11
MGD
18033 cCE("fldmias", c900a00, 2, (RRnpctw, VRSLST), vfp_sp_ldstmia),
18034 cCE("fldmfds", c900a00, 2, (RRnpctw, VRSLST), vfp_sp_ldstmia),
18035 cCE("fldmdbs", d300a00, 2, (RRnpctw, VRSLST), vfp_sp_ldstmdb),
18036 cCE("fldmeas", d300a00, 2, (RRnpctw, VRSLST), vfp_sp_ldstmdb),
18037 cCE("fldmiax", c900b00, 2, (RRnpctw, VRDLST), vfp_xp_ldstmia),
18038 cCE("fldmfdx", c900b00, 2, (RRnpctw, VRDLST), vfp_xp_ldstmia),
18039 cCE("fldmdbx", d300b00, 2, (RRnpctw, VRDLST), vfp_xp_ldstmdb),
18040 cCE("fldmeax", d300b00, 2, (RRnpctw, VRDLST), vfp_xp_ldstmdb),
18041 cCE("fstmias", c800a00, 2, (RRnpctw, VRSLST), vfp_sp_ldstmia),
18042 cCE("fstmeas", c800a00, 2, (RRnpctw, VRSLST), vfp_sp_ldstmia),
18043 cCE("fstmdbs", d200a00, 2, (RRnpctw, VRSLST), vfp_sp_ldstmdb),
18044 cCE("fstmfds", d200a00, 2, (RRnpctw, VRSLST), vfp_sp_ldstmdb),
18045 cCE("fstmiax", c800b00, 2, (RRnpctw, VRDLST), vfp_xp_ldstmia),
18046 cCE("fstmeax", c800b00, 2, (RRnpctw, VRDLST), vfp_xp_ldstmia),
18047 cCE("fstmdbx", d200b00, 2, (RRnpctw, VRDLST), vfp_xp_ldstmdb),
18048 cCE("fstmfdx", d200b00, 2, (RRnpctw, VRDLST), vfp_xp_ldstmdb),
bfae80f2 18049
c19d1205 18050 /* Monadic operations. */
21d799b5
NC
18051 cCE("fabss", eb00ac0, 2, (RVS, RVS), vfp_sp_monadic),
18052 cCE("fnegs", eb10a40, 2, (RVS, RVS), vfp_sp_monadic),
18053 cCE("fsqrts", eb10ac0, 2, (RVS, RVS), vfp_sp_monadic),
c19d1205
ZW
18054
18055 /* Dyadic operations. */
21d799b5
NC
18056 cCE("fadds", e300a00, 3, (RVS, RVS, RVS), vfp_sp_dyadic),
18057 cCE("fsubs", e300a40, 3, (RVS, RVS, RVS), vfp_sp_dyadic),
18058 cCE("fmuls", e200a00, 3, (RVS, RVS, RVS), vfp_sp_dyadic),
18059 cCE("fdivs", e800a00, 3, (RVS, RVS, RVS), vfp_sp_dyadic),
18060 cCE("fmacs", e000a00, 3, (RVS, RVS, RVS), vfp_sp_dyadic),
18061 cCE("fmscs", e100a00, 3, (RVS, RVS, RVS), vfp_sp_dyadic),
18062 cCE("fnmuls", e200a40, 3, (RVS, RVS, RVS), vfp_sp_dyadic),
18063 cCE("fnmacs", e000a40, 3, (RVS, RVS, RVS), vfp_sp_dyadic),
18064 cCE("fnmscs", e100a40, 3, (RVS, RVS, RVS), vfp_sp_dyadic),
b99bd4ef 18065
c19d1205 18066 /* Comparisons. */
21d799b5
NC
18067 cCE("fcmps", eb40a40, 2, (RVS, RVS), vfp_sp_monadic),
18068 cCE("fcmpzs", eb50a40, 1, (RVS), vfp_sp_compare_z),
18069 cCE("fcmpes", eb40ac0, 2, (RVS, RVS), vfp_sp_monadic),
18070 cCE("fcmpezs", eb50ac0, 1, (RVS), vfp_sp_compare_z),
b99bd4ef 18071
62f3b8c8
PB
18072 /* Double precision load/store are still present on single precision
18073 implementations. */
18074 cCE("fldd", d100b00, 2, (RVD, ADDRGLDC), vfp_dp_ldst),
18075 cCE("fstd", d000b00, 2, (RVD, ADDRGLDC), vfp_dp_ldst),
55881a11
MGD
18076 cCE("fldmiad", c900b00, 2, (RRnpctw, VRDLST), vfp_dp_ldstmia),
18077 cCE("fldmfdd", c900b00, 2, (RRnpctw, VRDLST), vfp_dp_ldstmia),
18078 cCE("fldmdbd", d300b00, 2, (RRnpctw, VRDLST), vfp_dp_ldstmdb),
18079 cCE("fldmead", d300b00, 2, (RRnpctw, VRDLST), vfp_dp_ldstmdb),
18080 cCE("fstmiad", c800b00, 2, (RRnpctw, VRDLST), vfp_dp_ldstmia),
18081 cCE("fstmead", c800b00, 2, (RRnpctw, VRDLST), vfp_dp_ldstmia),
18082 cCE("fstmdbd", d200b00, 2, (RRnpctw, VRDLST), vfp_dp_ldstmdb),
18083 cCE("fstmfdd", d200b00, 2, (RRnpctw, VRDLST), vfp_dp_ldstmdb),
62f3b8c8 18084
c921be7d
NC
18085#undef ARM_VARIANT
18086#define ARM_VARIANT & fpu_vfp_ext_v1 /* VFP V1 (Double precision). */
18087
c19d1205 18088 /* Moves and type conversions. */
21d799b5
NC
18089 cCE("fcpyd", eb00b40, 2, (RVD, RVD), vfp_dp_rd_rm),
18090 cCE("fcvtds", eb70ac0, 2, (RVD, RVS), vfp_dp_sp_cvt),
18091 cCE("fcvtsd", eb70bc0, 2, (RVS, RVD), vfp_sp_dp_cvt),
18092 cCE("fmdhr", e200b10, 2, (RVD, RR), vfp_dp_rn_rd),
18093 cCE("fmdlr", e000b10, 2, (RVD, RR), vfp_dp_rn_rd),
18094 cCE("fmrdh", e300b10, 2, (RR, RVD), vfp_dp_rd_rn),
18095 cCE("fmrdl", e100b10, 2, (RR, RVD), vfp_dp_rd_rn),
18096 cCE("fsitod", eb80bc0, 2, (RVD, RVS), vfp_dp_sp_cvt),
18097 cCE("fuitod", eb80b40, 2, (RVD, RVS), vfp_dp_sp_cvt),
18098 cCE("ftosid", ebd0b40, 2, (RVS, RVD), vfp_sp_dp_cvt),
18099 cCE("ftosizd", ebd0bc0, 2, (RVS, RVD), vfp_sp_dp_cvt),
18100 cCE("ftouid", ebc0b40, 2, (RVS, RVD), vfp_sp_dp_cvt),
18101 cCE("ftouizd", ebc0bc0, 2, (RVS, RVD), vfp_sp_dp_cvt),
c19d1205 18102
c19d1205 18103 /* Monadic operations. */
21d799b5
NC
18104 cCE("fabsd", eb00bc0, 2, (RVD, RVD), vfp_dp_rd_rm),
18105 cCE("fnegd", eb10b40, 2, (RVD, RVD), vfp_dp_rd_rm),
18106 cCE("fsqrtd", eb10bc0, 2, (RVD, RVD), vfp_dp_rd_rm),
c19d1205
ZW
18107
18108 /* Dyadic operations. */
21d799b5
NC
18109 cCE("faddd", e300b00, 3, (RVD, RVD, RVD), vfp_dp_rd_rn_rm),
18110 cCE("fsubd", e300b40, 3, (RVD, RVD, RVD), vfp_dp_rd_rn_rm),
18111 cCE("fmuld", e200b00, 3, (RVD, RVD, RVD), vfp_dp_rd_rn_rm),
18112 cCE("fdivd", e800b00, 3, (RVD, RVD, RVD), vfp_dp_rd_rn_rm),
18113 cCE("fmacd", e000b00, 3, (RVD, RVD, RVD), vfp_dp_rd_rn_rm),
18114 cCE("fmscd", e100b00, 3, (RVD, RVD, RVD), vfp_dp_rd_rn_rm),
18115 cCE("fnmuld", e200b40, 3, (RVD, RVD, RVD), vfp_dp_rd_rn_rm),
18116 cCE("fnmacd", e000b40, 3, (RVD, RVD, RVD), vfp_dp_rd_rn_rm),
18117 cCE("fnmscd", e100b40, 3, (RVD, RVD, RVD), vfp_dp_rd_rn_rm),
b99bd4ef 18118
c19d1205 18119 /* Comparisons. */
21d799b5
NC
18120 cCE("fcmpd", eb40b40, 2, (RVD, RVD), vfp_dp_rd_rm),
18121 cCE("fcmpzd", eb50b40, 1, (RVD), vfp_dp_rd),
18122 cCE("fcmped", eb40bc0, 2, (RVD, RVD), vfp_dp_rd_rm),
18123 cCE("fcmpezd", eb50bc0, 1, (RVD), vfp_dp_rd),
c19d1205 18124
c921be7d
NC
18125#undef ARM_VARIANT
18126#define ARM_VARIANT & fpu_vfp_ext_v2
18127
21d799b5
NC
18128 cCE("fmsrr", c400a10, 3, (VRSLST, RR, RR), vfp_sp2_from_reg2),
18129 cCE("fmrrs", c500a10, 3, (RR, RR, VRSLST), vfp_reg2_from_sp2),
18130 cCE("fmdrr", c400b10, 3, (RVD, RR, RR), vfp_dp_rm_rd_rn),
18131 cCE("fmrrd", c500b10, 3, (RR, RR, RVD), vfp_dp_rd_rn_rm),
5287ad62 18132
037e8744
JB
18133/* Instructions which may belong to either the Neon or VFP instruction sets.
18134 Individual encoder functions perform additional architecture checks. */
c921be7d
NC
18135#undef ARM_VARIANT
18136#define ARM_VARIANT & fpu_vfp_ext_v1xd
18137#undef THUMB_VARIANT
18138#define THUMB_VARIANT & fpu_vfp_ext_v1xd
18139
037e8744
JB
18140 /* These mnemonics are unique to VFP. */
18141 NCE(vsqrt, 0, 2, (RVSD, RVSD), vfp_nsyn_sqrt),
18142 NCE(vdiv, 0, 3, (RVSD, RVSD, RVSD), vfp_nsyn_div),
21d799b5
NC
18143 nCE(vnmul, _vnmul, 3, (RVSD, RVSD, RVSD), vfp_nsyn_nmul),
18144 nCE(vnmla, _vnmla, 3, (RVSD, RVSD, RVSD), vfp_nsyn_nmul),
18145 nCE(vnmls, _vnmls, 3, (RVSD, RVSD, RVSD), vfp_nsyn_nmul),
18146 nCE(vcmp, _vcmp, 2, (RVSD, RVSD_I0), vfp_nsyn_cmp),
18147 nCE(vcmpe, _vcmpe, 2, (RVSD, RVSD_I0), vfp_nsyn_cmp),
037e8744
JB
18148 NCE(vpush, 0, 1, (VRSDLST), vfp_nsyn_push),
18149 NCE(vpop, 0, 1, (VRSDLST), vfp_nsyn_pop),
18150 NCE(vcvtz, 0, 2, (RVSD, RVSD), vfp_nsyn_cvtz),
18151
18152 /* Mnemonics shared by Neon and VFP. */
21d799b5
NC
18153 nCEF(vmul, _vmul, 3, (RNSDQ, oRNSDQ, RNSDQ_RNSC), neon_mul),
18154 nCEF(vmla, _vmla, 3, (RNSDQ, oRNSDQ, RNSDQ_RNSC), neon_mac_maybe_scalar),
18155 nCEF(vmls, _vmls, 3, (RNSDQ, oRNSDQ, RNSDQ_RNSC), neon_mac_maybe_scalar),
037e8744 18156
21d799b5
NC
18157 nCEF(vadd, _vadd, 3, (RNSDQ, oRNSDQ, RNSDQ), neon_addsub_if_i),
18158 nCEF(vsub, _vsub, 3, (RNSDQ, oRNSDQ, RNSDQ), neon_addsub_if_i),
037e8744
JB
18159
18160 NCEF(vabs, 1b10300, 2, (RNSDQ, RNSDQ), neon_abs_neg),
18161 NCEF(vneg, 1b10380, 2, (RNSDQ, RNSDQ), neon_abs_neg),
18162
55881a11
MGD
18163 NCE(vldm, c900b00, 2, (RRnpctw, VRSDLST), neon_ldm_stm),
18164 NCE(vldmia, c900b00, 2, (RRnpctw, VRSDLST), neon_ldm_stm),
18165 NCE(vldmdb, d100b00, 2, (RRnpctw, VRSDLST), neon_ldm_stm),
18166 NCE(vstm, c800b00, 2, (RRnpctw, VRSDLST), neon_ldm_stm),
18167 NCE(vstmia, c800b00, 2, (RRnpctw, VRSDLST), neon_ldm_stm),
18168 NCE(vstmdb, d000b00, 2, (RRnpctw, VRSDLST), neon_ldm_stm),
4962c51a
MS
18169 NCE(vldr, d100b00, 2, (RVSD, ADDRGLDC), neon_ldr_str),
18170 NCE(vstr, d000b00, 2, (RVSD, ADDRGLDC), neon_ldr_str),
037e8744 18171
e3e535bc
NC
18172 nCEF(vcvt, _vcvt, 3, (RNSDQ, RNSDQ, oI32b), neon_cvt),
18173 nCEF(vcvtr, _vcvt, 2, (RNSDQ, RNSDQ), neon_cvtr),
21d799b5
NC
18174 nCEF(vcvtb, _vcvt, 2, (RVS, RVS), neon_cvtb),
18175 nCEF(vcvtt, _vcvt, 2, (RVS, RVS), neon_cvtt),
f31fef98 18176
037e8744
JB
18177
18178 /* NOTE: All VMOV encoding is special-cased! */
18179 NCE(vmov, 0, 1, (VMOV), neon_mov),
18180 NCE(vmovq, 0, 1, (VMOV), neon_mov),
18181
c921be7d
NC
18182#undef THUMB_VARIANT
18183#define THUMB_VARIANT & fpu_neon_ext_v1
18184#undef ARM_VARIANT
18185#define ARM_VARIANT & fpu_neon_ext_v1
18186
5287ad62
JB
18187 /* Data processing with three registers of the same length. */
18188 /* integer ops, valid types S8 S16 S32 U8 U16 U32. */
18189 NUF(vaba, 0000710, 3, (RNDQ, RNDQ, RNDQ), neon_dyadic_i_su),
18190 NUF(vabaq, 0000710, 3, (RNQ, RNQ, RNQ), neon_dyadic_i_su),
18191 NUF(vhadd, 0000000, 3, (RNDQ, oRNDQ, RNDQ), neon_dyadic_i_su),
18192 NUF(vhaddq, 0000000, 3, (RNQ, oRNQ, RNQ), neon_dyadic_i_su),
18193 NUF(vrhadd, 0000100, 3, (RNDQ, oRNDQ, RNDQ), neon_dyadic_i_su),
18194 NUF(vrhaddq, 0000100, 3, (RNQ, oRNQ, RNQ), neon_dyadic_i_su),
18195 NUF(vhsub, 0000200, 3, (RNDQ, oRNDQ, RNDQ), neon_dyadic_i_su),
18196 NUF(vhsubq, 0000200, 3, (RNQ, oRNQ, RNQ), neon_dyadic_i_su),
18197 /* integer ops, valid types S8 S16 S32 S64 U8 U16 U32 U64. */
18198 NUF(vqadd, 0000010, 3, (RNDQ, oRNDQ, RNDQ), neon_dyadic_i64_su),
18199 NUF(vqaddq, 0000010, 3, (RNQ, oRNQ, RNQ), neon_dyadic_i64_su),
18200 NUF(vqsub, 0000210, 3, (RNDQ, oRNDQ, RNDQ), neon_dyadic_i64_su),
18201 NUF(vqsubq, 0000210, 3, (RNQ, oRNQ, RNQ), neon_dyadic_i64_su),
627907b7
JB
18202 NUF(vrshl, 0000500, 3, (RNDQ, oRNDQ, RNDQ), neon_rshl),
18203 NUF(vrshlq, 0000500, 3, (RNQ, oRNQ, RNQ), neon_rshl),
18204 NUF(vqrshl, 0000510, 3, (RNDQ, oRNDQ, RNDQ), neon_rshl),
18205 NUF(vqrshlq, 0000510, 3, (RNQ, oRNQ, RNQ), neon_rshl),
5287ad62
JB
18206 /* If not immediate, fall back to neon_dyadic_i64_su.
18207 shl_imm should accept I8 I16 I32 I64,
18208 qshl_imm should accept S8 S16 S32 S64 U8 U16 U32 U64. */
21d799b5
NC
18209 nUF(vshl, _vshl, 3, (RNDQ, oRNDQ, RNDQ_I63b), neon_shl_imm),
18210 nUF(vshlq, _vshl, 3, (RNQ, oRNQ, RNDQ_I63b), neon_shl_imm),
18211 nUF(vqshl, _vqshl, 3, (RNDQ, oRNDQ, RNDQ_I63b), neon_qshl_imm),
18212 nUF(vqshlq, _vqshl, 3, (RNQ, oRNQ, RNDQ_I63b), neon_qshl_imm),
5287ad62 18213 /* Logic ops, types optional & ignored. */
4316f0d2
DG
18214 nUF(vand, _vand, 3, (RNDQ, oRNDQ, RNDQ_Ibig), neon_logic),
18215 nUF(vandq, _vand, 3, (RNQ, oRNQ, RNDQ_Ibig), neon_logic),
18216 nUF(vbic, _vbic, 3, (RNDQ, oRNDQ, RNDQ_Ibig), neon_logic),
18217 nUF(vbicq, _vbic, 3, (RNQ, oRNQ, RNDQ_Ibig), neon_logic),
18218 nUF(vorr, _vorr, 3, (RNDQ, oRNDQ, RNDQ_Ibig), neon_logic),
18219 nUF(vorrq, _vorr, 3, (RNQ, oRNQ, RNDQ_Ibig), neon_logic),
18220 nUF(vorn, _vorn, 3, (RNDQ, oRNDQ, RNDQ_Ibig), neon_logic),
18221 nUF(vornq, _vorn, 3, (RNQ, oRNQ, RNDQ_Ibig), neon_logic),
18222 nUF(veor, _veor, 3, (RNDQ, oRNDQ, RNDQ), neon_logic),
18223 nUF(veorq, _veor, 3, (RNQ, oRNQ, RNQ), neon_logic),
5287ad62
JB
18224 /* Bitfield ops, untyped. */
18225 NUF(vbsl, 1100110, 3, (RNDQ, RNDQ, RNDQ), neon_bitfield),
18226 NUF(vbslq, 1100110, 3, (RNQ, RNQ, RNQ), neon_bitfield),
18227 NUF(vbit, 1200110, 3, (RNDQ, RNDQ, RNDQ), neon_bitfield),
18228 NUF(vbitq, 1200110, 3, (RNQ, RNQ, RNQ), neon_bitfield),
18229 NUF(vbif, 1300110, 3, (RNDQ, RNDQ, RNDQ), neon_bitfield),
18230 NUF(vbifq, 1300110, 3, (RNQ, RNQ, RNQ), neon_bitfield),
18231 /* Int and float variants, types S8 S16 S32 U8 U16 U32 F32. */
21d799b5
NC
18232 nUF(vabd, _vabd, 3, (RNDQ, oRNDQ, RNDQ), neon_dyadic_if_su),
18233 nUF(vabdq, _vabd, 3, (RNQ, oRNQ, RNQ), neon_dyadic_if_su),
18234 nUF(vmax, _vmax, 3, (RNDQ, oRNDQ, RNDQ), neon_dyadic_if_su),
18235 nUF(vmaxq, _vmax, 3, (RNQ, oRNQ, RNQ), neon_dyadic_if_su),
18236 nUF(vmin, _vmin, 3, (RNDQ, oRNDQ, RNDQ), neon_dyadic_if_su),
18237 nUF(vminq, _vmin, 3, (RNQ, oRNQ, RNQ), neon_dyadic_if_su),
5287ad62
JB
18238 /* Comparisons. Types S8 S16 S32 U8 U16 U32 F32. Non-immediate versions fall
18239 back to neon_dyadic_if_su. */
21d799b5
NC
18240 nUF(vcge, _vcge, 3, (RNDQ, oRNDQ, RNDQ_I0), neon_cmp),
18241 nUF(vcgeq, _vcge, 3, (RNQ, oRNQ, RNDQ_I0), neon_cmp),
18242 nUF(vcgt, _vcgt, 3, (RNDQ, oRNDQ, RNDQ_I0), neon_cmp),
18243 nUF(vcgtq, _vcgt, 3, (RNQ, oRNQ, RNDQ_I0), neon_cmp),
18244 nUF(vclt, _vclt, 3, (RNDQ, oRNDQ, RNDQ_I0), neon_cmp_inv),
18245 nUF(vcltq, _vclt, 3, (RNQ, oRNQ, RNDQ_I0), neon_cmp_inv),
18246 nUF(vcle, _vcle, 3, (RNDQ, oRNDQ, RNDQ_I0), neon_cmp_inv),
18247 nUF(vcleq, _vcle, 3, (RNQ, oRNQ, RNDQ_I0), neon_cmp_inv),
428e3f1f 18248 /* Comparison. Type I8 I16 I32 F32. */
21d799b5
NC
18249 nUF(vceq, _vceq, 3, (RNDQ, oRNDQ, RNDQ_I0), neon_ceq),
18250 nUF(vceqq, _vceq, 3, (RNQ, oRNQ, RNDQ_I0), neon_ceq),
5287ad62 18251 /* As above, D registers only. */
21d799b5
NC
18252 nUF(vpmax, _vpmax, 3, (RND, oRND, RND), neon_dyadic_if_su_d),
18253 nUF(vpmin, _vpmin, 3, (RND, oRND, RND), neon_dyadic_if_su_d),
5287ad62 18254 /* Int and float variants, signedness unimportant. */
21d799b5
NC
18255 nUF(vmlaq, _vmla, 3, (RNQ, oRNQ, RNDQ_RNSC), neon_mac_maybe_scalar),
18256 nUF(vmlsq, _vmls, 3, (RNQ, oRNQ, RNDQ_RNSC), neon_mac_maybe_scalar),
18257 nUF(vpadd, _vpadd, 3, (RND, oRND, RND), neon_dyadic_if_i_d),
5287ad62 18258 /* Add/sub take types I8 I16 I32 I64 F32. */
21d799b5
NC
18259 nUF(vaddq, _vadd, 3, (RNQ, oRNQ, RNQ), neon_addsub_if_i),
18260 nUF(vsubq, _vsub, 3, (RNQ, oRNQ, RNQ), neon_addsub_if_i),
5287ad62
JB
18261 /* vtst takes sizes 8, 16, 32. */
18262 NUF(vtst, 0000810, 3, (RNDQ, oRNDQ, RNDQ), neon_tst),
18263 NUF(vtstq, 0000810, 3, (RNQ, oRNQ, RNQ), neon_tst),
18264 /* VMUL takes I8 I16 I32 F32 P8. */
21d799b5 18265 nUF(vmulq, _vmul, 3, (RNQ, oRNQ, RNDQ_RNSC), neon_mul),
5287ad62 18266 /* VQD{R}MULH takes S16 S32. */
21d799b5
NC
18267 nUF(vqdmulh, _vqdmulh, 3, (RNDQ, oRNDQ, RNDQ_RNSC), neon_qdmulh),
18268 nUF(vqdmulhq, _vqdmulh, 3, (RNQ, oRNQ, RNDQ_RNSC), neon_qdmulh),
18269 nUF(vqrdmulh, _vqrdmulh, 3, (RNDQ, oRNDQ, RNDQ_RNSC), neon_qdmulh),
18270 nUF(vqrdmulhq, _vqrdmulh, 3, (RNQ, oRNQ, RNDQ_RNSC), neon_qdmulh),
5287ad62
JB
18271 NUF(vacge, 0000e10, 3, (RNDQ, oRNDQ, RNDQ), neon_fcmp_absolute),
18272 NUF(vacgeq, 0000e10, 3, (RNQ, oRNQ, RNQ), neon_fcmp_absolute),
18273 NUF(vacgt, 0200e10, 3, (RNDQ, oRNDQ, RNDQ), neon_fcmp_absolute),
18274 NUF(vacgtq, 0200e10, 3, (RNQ, oRNQ, RNQ), neon_fcmp_absolute),
92559b5b
PB
18275 NUF(vaclt, 0200e10, 3, (RNDQ, oRNDQ, RNDQ), neon_fcmp_absolute_inv),
18276 NUF(vacltq, 0200e10, 3, (RNQ, oRNQ, RNQ), neon_fcmp_absolute_inv),
18277 NUF(vacle, 0000e10, 3, (RNDQ, oRNDQ, RNDQ), neon_fcmp_absolute_inv),
18278 NUF(vacleq, 0000e10, 3, (RNQ, oRNQ, RNQ), neon_fcmp_absolute_inv),
5287ad62
JB
18279 NUF(vrecps, 0000f10, 3, (RNDQ, oRNDQ, RNDQ), neon_step),
18280 NUF(vrecpsq, 0000f10, 3, (RNQ, oRNQ, RNQ), neon_step),
18281 NUF(vrsqrts, 0200f10, 3, (RNDQ, oRNDQ, RNDQ), neon_step),
18282 NUF(vrsqrtsq, 0200f10, 3, (RNQ, oRNQ, RNQ), neon_step),
18283
18284 /* Two address, int/float. Types S8 S16 S32 F32. */
5287ad62 18285 NUF(vabsq, 1b10300, 2, (RNQ, RNQ), neon_abs_neg),
5287ad62
JB
18286 NUF(vnegq, 1b10380, 2, (RNQ, RNQ), neon_abs_neg),
18287
18288 /* Data processing with two registers and a shift amount. */
18289 /* Right shifts, and variants with rounding.
18290 Types accepted S8 S16 S32 S64 U8 U16 U32 U64. */
18291 NUF(vshr, 0800010, 3, (RNDQ, oRNDQ, I64z), neon_rshift_round_imm),
18292 NUF(vshrq, 0800010, 3, (RNQ, oRNQ, I64z), neon_rshift_round_imm),
18293 NUF(vrshr, 0800210, 3, (RNDQ, oRNDQ, I64z), neon_rshift_round_imm),
18294 NUF(vrshrq, 0800210, 3, (RNQ, oRNQ, I64z), neon_rshift_round_imm),
18295 NUF(vsra, 0800110, 3, (RNDQ, oRNDQ, I64), neon_rshift_round_imm),
18296 NUF(vsraq, 0800110, 3, (RNQ, oRNQ, I64), neon_rshift_round_imm),
18297 NUF(vrsra, 0800310, 3, (RNDQ, oRNDQ, I64), neon_rshift_round_imm),
18298 NUF(vrsraq, 0800310, 3, (RNQ, oRNQ, I64), neon_rshift_round_imm),
18299 /* Shift and insert. Sizes accepted 8 16 32 64. */
18300 NUF(vsli, 1800510, 3, (RNDQ, oRNDQ, I63), neon_sli),
18301 NUF(vsliq, 1800510, 3, (RNQ, oRNQ, I63), neon_sli),
18302 NUF(vsri, 1800410, 3, (RNDQ, oRNDQ, I64), neon_sri),
18303 NUF(vsriq, 1800410, 3, (RNQ, oRNQ, I64), neon_sri),
18304 /* QSHL{U} immediate accepts S8 S16 S32 S64 U8 U16 U32 U64. */
18305 NUF(vqshlu, 1800610, 3, (RNDQ, oRNDQ, I63), neon_qshlu_imm),
18306 NUF(vqshluq, 1800610, 3, (RNQ, oRNQ, I63), neon_qshlu_imm),
18307 /* Right shift immediate, saturating & narrowing, with rounding variants.
18308 Types accepted S16 S32 S64 U16 U32 U64. */
18309 NUF(vqshrn, 0800910, 3, (RND, RNQ, I32z), neon_rshift_sat_narrow),
18310 NUF(vqrshrn, 0800950, 3, (RND, RNQ, I32z), neon_rshift_sat_narrow),
18311 /* As above, unsigned. Types accepted S16 S32 S64. */
18312 NUF(vqshrun, 0800810, 3, (RND, RNQ, I32z), neon_rshift_sat_narrow_u),
18313 NUF(vqrshrun, 0800850, 3, (RND, RNQ, I32z), neon_rshift_sat_narrow_u),
18314 /* Right shift narrowing. Types accepted I16 I32 I64. */
18315 NUF(vshrn, 0800810, 3, (RND, RNQ, I32z), neon_rshift_narrow),
18316 NUF(vrshrn, 0800850, 3, (RND, RNQ, I32z), neon_rshift_narrow),
18317 /* Special case. Types S8 S16 S32 U8 U16 U32. Handles max shift variant. */
21d799b5 18318 nUF(vshll, _vshll, 3, (RNQ, RND, I32), neon_shll),
5287ad62 18319 /* CVT with optional immediate for fixed-point variant. */
21d799b5 18320 nUF(vcvtq, _vcvt, 3, (RNQ, RNQ, oI32b), neon_cvt),
b7fc2769 18321
4316f0d2
DG
18322 nUF(vmvn, _vmvn, 2, (RNDQ, RNDQ_Ibig), neon_mvn),
18323 nUF(vmvnq, _vmvn, 2, (RNQ, RNDQ_Ibig), neon_mvn),
5287ad62
JB
18324
18325 /* Data processing, three registers of different lengths. */
18326 /* Dyadic, long insns. Types S8 S16 S32 U8 U16 U32. */
18327 NUF(vabal, 0800500, 3, (RNQ, RND, RND), neon_abal),
18328 NUF(vabdl, 0800700, 3, (RNQ, RND, RND), neon_dyadic_long),
18329 NUF(vaddl, 0800000, 3, (RNQ, RND, RND), neon_dyadic_long),
18330 NUF(vsubl, 0800200, 3, (RNQ, RND, RND), neon_dyadic_long),
18331 /* If not scalar, fall back to neon_dyadic_long.
18332 Vector types as above, scalar types S16 S32 U16 U32. */
21d799b5
NC
18333 nUF(vmlal, _vmlal, 3, (RNQ, RND, RND_RNSC), neon_mac_maybe_scalar_long),
18334 nUF(vmlsl, _vmlsl, 3, (RNQ, RND, RND_RNSC), neon_mac_maybe_scalar_long),
5287ad62
JB
18335 /* Dyadic, widening insns. Types S8 S16 S32 U8 U16 U32. */
18336 NUF(vaddw, 0800100, 3, (RNQ, oRNQ, RND), neon_dyadic_wide),
18337 NUF(vsubw, 0800300, 3, (RNQ, oRNQ, RND), neon_dyadic_wide),
18338 /* Dyadic, narrowing insns. Types I16 I32 I64. */
18339 NUF(vaddhn, 0800400, 3, (RND, RNQ, RNQ), neon_dyadic_narrow),
18340 NUF(vraddhn, 1800400, 3, (RND, RNQ, RNQ), neon_dyadic_narrow),
18341 NUF(vsubhn, 0800600, 3, (RND, RNQ, RNQ), neon_dyadic_narrow),
18342 NUF(vrsubhn, 1800600, 3, (RND, RNQ, RNQ), neon_dyadic_narrow),
18343 /* Saturating doubling multiplies. Types S16 S32. */
21d799b5
NC
18344 nUF(vqdmlal, _vqdmlal, 3, (RNQ, RND, RND_RNSC), neon_mul_sat_scalar_long),
18345 nUF(vqdmlsl, _vqdmlsl, 3, (RNQ, RND, RND_RNSC), neon_mul_sat_scalar_long),
18346 nUF(vqdmull, _vqdmull, 3, (RNQ, RND, RND_RNSC), neon_mul_sat_scalar_long),
5287ad62
JB
18347 /* VMULL. Vector types S8 S16 S32 U8 U16 U32 P8, scalar types
18348 S16 S32 U16 U32. */
21d799b5 18349 nUF(vmull, _vmull, 3, (RNQ, RND, RND_RNSC), neon_vmull),
5287ad62
JB
18350
18351 /* Extract. Size 8. */
3b8d421e
PB
18352 NUF(vext, 0b00000, 4, (RNDQ, oRNDQ, RNDQ, I15), neon_ext),
18353 NUF(vextq, 0b00000, 4, (RNQ, oRNQ, RNQ, I15), neon_ext),
5287ad62
JB
18354
18355 /* Two registers, miscellaneous. */
18356 /* Reverse. Sizes 8 16 32 (must be < size in opcode). */
18357 NUF(vrev64, 1b00000, 2, (RNDQ, RNDQ), neon_rev),
18358 NUF(vrev64q, 1b00000, 2, (RNQ, RNQ), neon_rev),
18359 NUF(vrev32, 1b00080, 2, (RNDQ, RNDQ), neon_rev),
18360 NUF(vrev32q, 1b00080, 2, (RNQ, RNQ), neon_rev),
18361 NUF(vrev16, 1b00100, 2, (RNDQ, RNDQ), neon_rev),
18362 NUF(vrev16q, 1b00100, 2, (RNQ, RNQ), neon_rev),
18363 /* Vector replicate. Sizes 8 16 32. */
21d799b5
NC
18364 nCE(vdup, _vdup, 2, (RNDQ, RR_RNSC), neon_dup),
18365 nCE(vdupq, _vdup, 2, (RNQ, RR_RNSC), neon_dup),
5287ad62
JB
18366 /* VMOVL. Types S8 S16 S32 U8 U16 U32. */
18367 NUF(vmovl, 0800a10, 2, (RNQ, RND), neon_movl),
18368 /* VMOVN. Types I16 I32 I64. */
21d799b5 18369 nUF(vmovn, _vmovn, 2, (RND, RNQ), neon_movn),
5287ad62 18370 /* VQMOVN. Types S16 S32 S64 U16 U32 U64. */
21d799b5 18371 nUF(vqmovn, _vqmovn, 2, (RND, RNQ), neon_qmovn),
5287ad62 18372 /* VQMOVUN. Types S16 S32 S64. */
21d799b5 18373 nUF(vqmovun, _vqmovun, 2, (RND, RNQ), neon_qmovun),
5287ad62
JB
18374 /* VZIP / VUZP. Sizes 8 16 32. */
18375 NUF(vzip, 1b20180, 2, (RNDQ, RNDQ), neon_zip_uzp),
18376 NUF(vzipq, 1b20180, 2, (RNQ, RNQ), neon_zip_uzp),
18377 NUF(vuzp, 1b20100, 2, (RNDQ, RNDQ), neon_zip_uzp),
18378 NUF(vuzpq, 1b20100, 2, (RNQ, RNQ), neon_zip_uzp),
18379 /* VQABS / VQNEG. Types S8 S16 S32. */
18380 NUF(vqabs, 1b00700, 2, (RNDQ, RNDQ), neon_sat_abs_neg),
18381 NUF(vqabsq, 1b00700, 2, (RNQ, RNQ), neon_sat_abs_neg),
18382 NUF(vqneg, 1b00780, 2, (RNDQ, RNDQ), neon_sat_abs_neg),
18383 NUF(vqnegq, 1b00780, 2, (RNQ, RNQ), neon_sat_abs_neg),
18384 /* Pairwise, lengthening. Types S8 S16 S32 U8 U16 U32. */
18385 NUF(vpadal, 1b00600, 2, (RNDQ, RNDQ), neon_pair_long),
18386 NUF(vpadalq, 1b00600, 2, (RNQ, RNQ), neon_pair_long),
18387 NUF(vpaddl, 1b00200, 2, (RNDQ, RNDQ), neon_pair_long),
18388 NUF(vpaddlq, 1b00200, 2, (RNQ, RNQ), neon_pair_long),
18389 /* Reciprocal estimates. Types U32 F32. */
18390 NUF(vrecpe, 1b30400, 2, (RNDQ, RNDQ), neon_recip_est),
18391 NUF(vrecpeq, 1b30400, 2, (RNQ, RNQ), neon_recip_est),
18392 NUF(vrsqrte, 1b30480, 2, (RNDQ, RNDQ), neon_recip_est),
18393 NUF(vrsqrteq, 1b30480, 2, (RNQ, RNQ), neon_recip_est),
18394 /* VCLS. Types S8 S16 S32. */
18395 NUF(vcls, 1b00400, 2, (RNDQ, RNDQ), neon_cls),
18396 NUF(vclsq, 1b00400, 2, (RNQ, RNQ), neon_cls),
18397 /* VCLZ. Types I8 I16 I32. */
18398 NUF(vclz, 1b00480, 2, (RNDQ, RNDQ), neon_clz),
18399 NUF(vclzq, 1b00480, 2, (RNQ, RNQ), neon_clz),
18400 /* VCNT. Size 8. */
18401 NUF(vcnt, 1b00500, 2, (RNDQ, RNDQ), neon_cnt),
18402 NUF(vcntq, 1b00500, 2, (RNQ, RNQ), neon_cnt),
18403 /* Two address, untyped. */
18404 NUF(vswp, 1b20000, 2, (RNDQ, RNDQ), neon_swp),
18405 NUF(vswpq, 1b20000, 2, (RNQ, RNQ), neon_swp),
18406 /* VTRN. Sizes 8 16 32. */
21d799b5
NC
18407 nUF(vtrn, _vtrn, 2, (RNDQ, RNDQ), neon_trn),
18408 nUF(vtrnq, _vtrn, 2, (RNQ, RNQ), neon_trn),
5287ad62
JB
18409
18410 /* Table lookup. Size 8. */
18411 NUF(vtbl, 1b00800, 3, (RND, NRDLST, RND), neon_tbl_tbx),
18412 NUF(vtbx, 1b00840, 3, (RND, NRDLST, RND), neon_tbl_tbx),
18413
c921be7d
NC
18414#undef THUMB_VARIANT
18415#define THUMB_VARIANT & fpu_vfp_v3_or_neon_ext
18416#undef ARM_VARIANT
18417#define ARM_VARIANT & fpu_vfp_v3_or_neon_ext
18418
5287ad62 18419 /* Neon element/structure load/store. */
21d799b5
NC
18420 nUF(vld1, _vld1, 2, (NSTRLST, ADDR), neon_ldx_stx),
18421 nUF(vst1, _vst1, 2, (NSTRLST, ADDR), neon_ldx_stx),
18422 nUF(vld2, _vld2, 2, (NSTRLST, ADDR), neon_ldx_stx),
18423 nUF(vst2, _vst2, 2, (NSTRLST, ADDR), neon_ldx_stx),
18424 nUF(vld3, _vld3, 2, (NSTRLST, ADDR), neon_ldx_stx),
18425 nUF(vst3, _vst3, 2, (NSTRLST, ADDR), neon_ldx_stx),
18426 nUF(vld4, _vld4, 2, (NSTRLST, ADDR), neon_ldx_stx),
18427 nUF(vst4, _vst4, 2, (NSTRLST, ADDR), neon_ldx_stx),
5287ad62 18428
c921be7d 18429#undef THUMB_VARIANT
62f3b8c8
PB
18430#define THUMB_VARIANT &fpu_vfp_ext_v3xd
18431#undef ARM_VARIANT
18432#define ARM_VARIANT &fpu_vfp_ext_v3xd
18433 cCE("fconsts", eb00a00, 2, (RVS, I255), vfp_sp_const),
18434 cCE("fshtos", eba0a40, 2, (RVS, I16z), vfp_sp_conv_16),
18435 cCE("fsltos", eba0ac0, 2, (RVS, I32), vfp_sp_conv_32),
18436 cCE("fuhtos", ebb0a40, 2, (RVS, I16z), vfp_sp_conv_16),
18437 cCE("fultos", ebb0ac0, 2, (RVS, I32), vfp_sp_conv_32),
18438 cCE("ftoshs", ebe0a40, 2, (RVS, I16z), vfp_sp_conv_16),
18439 cCE("ftosls", ebe0ac0, 2, (RVS, I32), vfp_sp_conv_32),
18440 cCE("ftouhs", ebf0a40, 2, (RVS, I16z), vfp_sp_conv_16),
18441 cCE("ftouls", ebf0ac0, 2, (RVS, I32), vfp_sp_conv_32),
18442
18443#undef THUMB_VARIANT
c921be7d
NC
18444#define THUMB_VARIANT & fpu_vfp_ext_v3
18445#undef ARM_VARIANT
18446#define ARM_VARIANT & fpu_vfp_ext_v3
18447
21d799b5 18448 cCE("fconstd", eb00b00, 2, (RVD, I255), vfp_dp_const),
21d799b5 18449 cCE("fshtod", eba0b40, 2, (RVD, I16z), vfp_dp_conv_16),
21d799b5 18450 cCE("fsltod", eba0bc0, 2, (RVD, I32), vfp_dp_conv_32),
21d799b5 18451 cCE("fuhtod", ebb0b40, 2, (RVD, I16z), vfp_dp_conv_16),
21d799b5 18452 cCE("fultod", ebb0bc0, 2, (RVD, I32), vfp_dp_conv_32),
21d799b5 18453 cCE("ftoshd", ebe0b40, 2, (RVD, I16z), vfp_dp_conv_16),
21d799b5 18454 cCE("ftosld", ebe0bc0, 2, (RVD, I32), vfp_dp_conv_32),
21d799b5 18455 cCE("ftouhd", ebf0b40, 2, (RVD, I16z), vfp_dp_conv_16),
21d799b5 18456 cCE("ftould", ebf0bc0, 2, (RVD, I32), vfp_dp_conv_32),
c19d1205 18457
62f3b8c8
PB
18458#undef ARM_VARIANT
18459#define ARM_VARIANT &fpu_vfp_ext_fma
18460#undef THUMB_VARIANT
18461#define THUMB_VARIANT &fpu_vfp_ext_fma
18462 /* Mnemonics shared by Neon and VFP. These are included in the
18463 VFP FMA variant; NEON and VFP FMA always includes the NEON
18464 FMA instructions. */
18465 nCEF(vfma, _vfma, 3, (RNSDQ, oRNSDQ, RNSDQ), neon_fmac),
18466 nCEF(vfms, _vfms, 3, (RNSDQ, oRNSDQ, RNSDQ), neon_fmac),
18467 /* ffmas/ffmad/ffmss/ffmsd are dummy mnemonics to satisfy gas;
18468 the v form should always be used. */
18469 cCE("ffmas", ea00a00, 3, (RVS, RVS, RVS), vfp_sp_dyadic),
18470 cCE("ffnmas", ea00a40, 3, (RVS, RVS, RVS), vfp_sp_dyadic),
18471 cCE("ffmad", ea00b00, 3, (RVD, RVD, RVD), vfp_dp_rd_rn_rm),
18472 cCE("ffnmad", ea00b40, 3, (RVD, RVD, RVD), vfp_dp_rd_rn_rm),
18473 nCE(vfnma, _vfnma, 3, (RVSD, RVSD, RVSD), vfp_nsyn_nmul),
18474 nCE(vfnms, _vfnms, 3, (RVSD, RVSD, RVSD), vfp_nsyn_nmul),
18475
5287ad62 18476#undef THUMB_VARIANT
c921be7d
NC
18477#undef ARM_VARIANT
18478#define ARM_VARIANT & arm_cext_xscale /* Intel XScale extensions. */
18479
21d799b5
NC
18480 cCE("mia", e200010, 3, (RXA, RRnpc, RRnpc), xsc_mia),
18481 cCE("miaph", e280010, 3, (RXA, RRnpc, RRnpc), xsc_mia),
18482 cCE("miabb", e2c0010, 3, (RXA, RRnpc, RRnpc), xsc_mia),
18483 cCE("miabt", e2d0010, 3, (RXA, RRnpc, RRnpc), xsc_mia),
18484 cCE("miatb", e2e0010, 3, (RXA, RRnpc, RRnpc), xsc_mia),
18485 cCE("miatt", e2f0010, 3, (RXA, RRnpc, RRnpc), xsc_mia),
18486 cCE("mar", c400000, 3, (RXA, RRnpc, RRnpc), xsc_mar),
18487 cCE("mra", c500000, 3, (RRnpc, RRnpc, RXA), xsc_mra),
c19d1205 18488
c921be7d
NC
18489#undef ARM_VARIANT
18490#define ARM_VARIANT & arm_cext_iwmmxt /* Intel Wireless MMX technology. */
18491
21d799b5
NC
18492 cCE("tandcb", e13f130, 1, (RR), iwmmxt_tandorc),
18493 cCE("tandch", e53f130, 1, (RR), iwmmxt_tandorc),
18494 cCE("tandcw", e93f130, 1, (RR), iwmmxt_tandorc),
18495 cCE("tbcstb", e400010, 2, (RIWR, RR), rn_rd),
18496 cCE("tbcsth", e400050, 2, (RIWR, RR), rn_rd),
18497 cCE("tbcstw", e400090, 2, (RIWR, RR), rn_rd),
18498 cCE("textrcb", e130170, 2, (RR, I7), iwmmxt_textrc),
18499 cCE("textrch", e530170, 2, (RR, I7), iwmmxt_textrc),
18500 cCE("textrcw", e930170, 2, (RR, I7), iwmmxt_textrc),
18501 cCE("textrmub", e100070, 3, (RR, RIWR, I7), iwmmxt_textrm),
18502 cCE("textrmuh", e500070, 3, (RR, RIWR, I7), iwmmxt_textrm),
18503 cCE("textrmuw", e900070, 3, (RR, RIWR, I7), iwmmxt_textrm),
18504 cCE("textrmsb", e100078, 3, (RR, RIWR, I7), iwmmxt_textrm),
18505 cCE("textrmsh", e500078, 3, (RR, RIWR, I7), iwmmxt_textrm),
18506 cCE("textrmsw", e900078, 3, (RR, RIWR, I7), iwmmxt_textrm),
18507 cCE("tinsrb", e600010, 3, (RIWR, RR, I7), iwmmxt_tinsr),
18508 cCE("tinsrh", e600050, 3, (RIWR, RR, I7), iwmmxt_tinsr),
18509 cCE("tinsrw", e600090, 3, (RIWR, RR, I7), iwmmxt_tinsr),
18510 cCE("tmcr", e000110, 2, (RIWC_RIWG, RR), rn_rd),
18511 cCE("tmcrr", c400000, 3, (RIWR, RR, RR), rm_rd_rn),
18512 cCE("tmia", e200010, 3, (RIWR, RR, RR), iwmmxt_tmia),
18513 cCE("tmiaph", e280010, 3, (RIWR, RR, RR), iwmmxt_tmia),
18514 cCE("tmiabb", e2c0010, 3, (RIWR, RR, RR), iwmmxt_tmia),
18515 cCE("tmiabt", e2d0010, 3, (RIWR, RR, RR), iwmmxt_tmia),
18516 cCE("tmiatb", e2e0010, 3, (RIWR, RR, RR), iwmmxt_tmia),
18517 cCE("tmiatt", e2f0010, 3, (RIWR, RR, RR), iwmmxt_tmia),
18518 cCE("tmovmskb", e100030, 2, (RR, RIWR), rd_rn),
18519 cCE("tmovmskh", e500030, 2, (RR, RIWR), rd_rn),
18520 cCE("tmovmskw", e900030, 2, (RR, RIWR), rd_rn),
18521 cCE("tmrc", e100110, 2, (RR, RIWC_RIWG), rd_rn),
18522 cCE("tmrrc", c500000, 3, (RR, RR, RIWR), rd_rn_rm),
18523 cCE("torcb", e13f150, 1, (RR), iwmmxt_tandorc),
18524 cCE("torch", e53f150, 1, (RR), iwmmxt_tandorc),
18525 cCE("torcw", e93f150, 1, (RR), iwmmxt_tandorc),
18526 cCE("waccb", e0001c0, 2, (RIWR, RIWR), rd_rn),
18527 cCE("wacch", e4001c0, 2, (RIWR, RIWR), rd_rn),
18528 cCE("waccw", e8001c0, 2, (RIWR, RIWR), rd_rn),
18529 cCE("waddbss", e300180, 3, (RIWR, RIWR, RIWR), rd_rn_rm),
18530 cCE("waddb", e000180, 3, (RIWR, RIWR, RIWR), rd_rn_rm),
18531 cCE("waddbus", e100180, 3, (RIWR, RIWR, RIWR), rd_rn_rm),
18532 cCE("waddhss", e700180, 3, (RIWR, RIWR, RIWR), rd_rn_rm),
18533 cCE("waddh", e400180, 3, (RIWR, RIWR, RIWR), rd_rn_rm),
18534 cCE("waddhus", e500180, 3, (RIWR, RIWR, RIWR), rd_rn_rm),
18535 cCE("waddwss", eb00180, 3, (RIWR, RIWR, RIWR), rd_rn_rm),
18536 cCE("waddw", e800180, 3, (RIWR, RIWR, RIWR), rd_rn_rm),
18537 cCE("waddwus", e900180, 3, (RIWR, RIWR, RIWR), rd_rn_rm),
18538 cCE("waligni", e000020, 4, (RIWR, RIWR, RIWR, I7), iwmmxt_waligni),
18539 cCE("walignr0", e800020, 3, (RIWR, RIWR, RIWR), rd_rn_rm),
18540 cCE("walignr1", e900020, 3, (RIWR, RIWR, RIWR), rd_rn_rm),
18541 cCE("walignr2", ea00020, 3, (RIWR, RIWR, RIWR), rd_rn_rm),
18542 cCE("walignr3", eb00020, 3, (RIWR, RIWR, RIWR), rd_rn_rm),
18543 cCE("wand", e200000, 3, (RIWR, RIWR, RIWR), rd_rn_rm),
18544 cCE("wandn", e300000, 3, (RIWR, RIWR, RIWR), rd_rn_rm),
18545 cCE("wavg2b", e800000, 3, (RIWR, RIWR, RIWR), rd_rn_rm),
18546 cCE("wavg2br", e900000, 3, (RIWR, RIWR, RIWR), rd_rn_rm),
18547 cCE("wavg2h", ec00000, 3, (RIWR, RIWR, RIWR), rd_rn_rm),
18548 cCE("wavg2hr", ed00000, 3, (RIWR, RIWR, RIWR), rd_rn_rm),
18549 cCE("wcmpeqb", e000060, 3, (RIWR, RIWR, RIWR), rd_rn_rm),
18550 cCE("wcmpeqh", e400060, 3, (RIWR, RIWR, RIWR), rd_rn_rm),
18551 cCE("wcmpeqw", e800060, 3, (RIWR, RIWR, RIWR), rd_rn_rm),
18552 cCE("wcmpgtub", e100060, 3, (RIWR, RIWR, RIWR), rd_rn_rm),
18553 cCE("wcmpgtuh", e500060, 3, (RIWR, RIWR, RIWR), rd_rn_rm),
18554 cCE("wcmpgtuw", e900060, 3, (RIWR, RIWR, RIWR), rd_rn_rm),
18555 cCE("wcmpgtsb", e300060, 3, (RIWR, RIWR, RIWR), rd_rn_rm),
18556 cCE("wcmpgtsh", e700060, 3, (RIWR, RIWR, RIWR), rd_rn_rm),
18557 cCE("wcmpgtsw", eb00060, 3, (RIWR, RIWR, RIWR), rd_rn_rm),
18558 cCE("wldrb", c100000, 2, (RIWR, ADDR), iwmmxt_wldstbh),
18559 cCE("wldrh", c500000, 2, (RIWR, ADDR), iwmmxt_wldstbh),
18560 cCE("wldrw", c100100, 2, (RIWR_RIWC, ADDR), iwmmxt_wldstw),
18561 cCE("wldrd", c500100, 2, (RIWR, ADDR), iwmmxt_wldstd),
18562 cCE("wmacs", e600100, 3, (RIWR, RIWR, RIWR), rd_rn_rm),
18563 cCE("wmacsz", e700100, 3, (RIWR, RIWR, RIWR), rd_rn_rm),
18564 cCE("wmacu", e400100, 3, (RIWR, RIWR, RIWR), rd_rn_rm),
18565 cCE("wmacuz", e500100, 3, (RIWR, RIWR, RIWR), rd_rn_rm),
18566 cCE("wmadds", ea00100, 3, (RIWR, RIWR, RIWR), rd_rn_rm),
18567 cCE("wmaddu", e800100, 3, (RIWR, RIWR, RIWR), rd_rn_rm),
18568 cCE("wmaxsb", e200160, 3, (RIWR, RIWR, RIWR), rd_rn_rm),
18569 cCE("wmaxsh", e600160, 3, (RIWR, RIWR, RIWR), rd_rn_rm),
18570 cCE("wmaxsw", ea00160, 3, (RIWR, RIWR, RIWR), rd_rn_rm),
18571 cCE("wmaxub", e000160, 3, (RIWR, RIWR, RIWR), rd_rn_rm),
18572 cCE("wmaxuh", e400160, 3, (RIWR, RIWR, RIWR), rd_rn_rm),
18573 cCE("wmaxuw", e800160, 3, (RIWR, RIWR, RIWR), rd_rn_rm),
18574 cCE("wminsb", e300160, 3, (RIWR, RIWR, RIWR), rd_rn_rm),
18575 cCE("wminsh", e700160, 3, (RIWR, RIWR, RIWR), rd_rn_rm),
18576 cCE("wminsw", eb00160, 3, (RIWR, RIWR, RIWR), rd_rn_rm),
18577 cCE("wminub", e100160, 3, (RIWR, RIWR, RIWR), rd_rn_rm),
18578 cCE("wminuh", e500160, 3, (RIWR, RIWR, RIWR), rd_rn_rm),
18579 cCE("wminuw", e900160, 3, (RIWR, RIWR, RIWR), rd_rn_rm),
18580 cCE("wmov", e000000, 2, (RIWR, RIWR), iwmmxt_wmov),
18581 cCE("wmulsm", e300100, 3, (RIWR, RIWR, RIWR), rd_rn_rm),
18582 cCE("wmulsl", e200100, 3, (RIWR, RIWR, RIWR), rd_rn_rm),
18583 cCE("wmulum", e100100, 3, (RIWR, RIWR, RIWR), rd_rn_rm),
18584 cCE("wmulul", e000100, 3, (RIWR, RIWR, RIWR), rd_rn_rm),
18585 cCE("wor", e000000, 3, (RIWR, RIWR, RIWR), rd_rn_rm),
18586 cCE("wpackhss", e700080, 3, (RIWR, RIWR, RIWR), rd_rn_rm),
18587 cCE("wpackhus", e500080, 3, (RIWR, RIWR, RIWR), rd_rn_rm),
18588 cCE("wpackwss", eb00080, 3, (RIWR, RIWR, RIWR), rd_rn_rm),
18589 cCE("wpackwus", e900080, 3, (RIWR, RIWR, RIWR), rd_rn_rm),
18590 cCE("wpackdss", ef00080, 3, (RIWR, RIWR, RIWR), rd_rn_rm),
18591 cCE("wpackdus", ed00080, 3, (RIWR, RIWR, RIWR), rd_rn_rm),
18592 cCE("wrorh", e700040, 3, (RIWR, RIWR, RIWR_I32z),iwmmxt_wrwrwr_or_imm5),
18593 cCE("wrorhg", e700148, 3, (RIWR, RIWR, RIWG), rd_rn_rm),
18594 cCE("wrorw", eb00040, 3, (RIWR, RIWR, RIWR_I32z),iwmmxt_wrwrwr_or_imm5),
18595 cCE("wrorwg", eb00148, 3, (RIWR, RIWR, RIWG), rd_rn_rm),
18596 cCE("wrord", ef00040, 3, (RIWR, RIWR, RIWR_I32z),iwmmxt_wrwrwr_or_imm5),
18597 cCE("wrordg", ef00148, 3, (RIWR, RIWR, RIWG), rd_rn_rm),
18598 cCE("wsadb", e000120, 3, (RIWR, RIWR, RIWR), rd_rn_rm),
18599 cCE("wsadbz", e100120, 3, (RIWR, RIWR, RIWR), rd_rn_rm),
18600 cCE("wsadh", e400120, 3, (RIWR, RIWR, RIWR), rd_rn_rm),
18601 cCE("wsadhz", e500120, 3, (RIWR, RIWR, RIWR), rd_rn_rm),
18602 cCE("wshufh", e0001e0, 3, (RIWR, RIWR, I255), iwmmxt_wshufh),
18603 cCE("wsllh", e500040, 3, (RIWR, RIWR, RIWR_I32z),iwmmxt_wrwrwr_or_imm5),
18604 cCE("wsllhg", e500148, 3, (RIWR, RIWR, RIWG), rd_rn_rm),
18605 cCE("wsllw", e900040, 3, (RIWR, RIWR, RIWR_I32z),iwmmxt_wrwrwr_or_imm5),
18606 cCE("wsllwg", e900148, 3, (RIWR, RIWR, RIWG), rd_rn_rm),
18607 cCE("wslld", ed00040, 3, (RIWR, RIWR, RIWR_I32z),iwmmxt_wrwrwr_or_imm5),
18608 cCE("wslldg", ed00148, 3, (RIWR, RIWR, RIWG), rd_rn_rm),
18609 cCE("wsrah", e400040, 3, (RIWR, RIWR, RIWR_I32z),iwmmxt_wrwrwr_or_imm5),
18610 cCE("wsrahg", e400148, 3, (RIWR, RIWR, RIWG), rd_rn_rm),
18611 cCE("wsraw", e800040, 3, (RIWR, RIWR, RIWR_I32z),iwmmxt_wrwrwr_or_imm5),
18612 cCE("wsrawg", e800148, 3, (RIWR, RIWR, RIWG), rd_rn_rm),
18613 cCE("wsrad", ec00040, 3, (RIWR, RIWR, RIWR_I32z),iwmmxt_wrwrwr_or_imm5),
18614 cCE("wsradg", ec00148, 3, (RIWR, RIWR, RIWG), rd_rn_rm),
18615 cCE("wsrlh", e600040, 3, (RIWR, RIWR, RIWR_I32z),iwmmxt_wrwrwr_or_imm5),
18616 cCE("wsrlhg", e600148, 3, (RIWR, RIWR, RIWG), rd_rn_rm),
18617 cCE("wsrlw", ea00040, 3, (RIWR, RIWR, RIWR_I32z),iwmmxt_wrwrwr_or_imm5),
18618 cCE("wsrlwg", ea00148, 3, (RIWR, RIWR, RIWG), rd_rn_rm),
18619 cCE("wsrld", ee00040, 3, (RIWR, RIWR, RIWR_I32z),iwmmxt_wrwrwr_or_imm5),
18620 cCE("wsrldg", ee00148, 3, (RIWR, RIWR, RIWG), rd_rn_rm),
18621 cCE("wstrb", c000000, 2, (RIWR, ADDR), iwmmxt_wldstbh),
18622 cCE("wstrh", c400000, 2, (RIWR, ADDR), iwmmxt_wldstbh),
18623 cCE("wstrw", c000100, 2, (RIWR_RIWC, ADDR), iwmmxt_wldstw),
18624 cCE("wstrd", c400100, 2, (RIWR, ADDR), iwmmxt_wldstd),
18625 cCE("wsubbss", e3001a0, 3, (RIWR, RIWR, RIWR), rd_rn_rm),
18626 cCE("wsubb", e0001a0, 3, (RIWR, RIWR, RIWR), rd_rn_rm),
18627 cCE("wsubbus", e1001a0, 3, (RIWR, RIWR, RIWR), rd_rn_rm),
18628 cCE("wsubhss", e7001a0, 3, (RIWR, RIWR, RIWR), rd_rn_rm),
18629 cCE("wsubh", e4001a0, 3, (RIWR, RIWR, RIWR), rd_rn_rm),
18630 cCE("wsubhus", e5001a0, 3, (RIWR, RIWR, RIWR), rd_rn_rm),
18631 cCE("wsubwss", eb001a0, 3, (RIWR, RIWR, RIWR), rd_rn_rm),
18632 cCE("wsubw", e8001a0, 3, (RIWR, RIWR, RIWR), rd_rn_rm),
18633 cCE("wsubwus", e9001a0, 3, (RIWR, RIWR, RIWR), rd_rn_rm),
18634 cCE("wunpckehub",e0000c0, 2, (RIWR, RIWR), rd_rn),
18635 cCE("wunpckehuh",e4000c0, 2, (RIWR, RIWR), rd_rn),
18636 cCE("wunpckehuw",e8000c0, 2, (RIWR, RIWR), rd_rn),
18637 cCE("wunpckehsb",e2000c0, 2, (RIWR, RIWR), rd_rn),
18638 cCE("wunpckehsh",e6000c0, 2, (RIWR, RIWR), rd_rn),
18639 cCE("wunpckehsw",ea000c0, 2, (RIWR, RIWR), rd_rn),
18640 cCE("wunpckihb", e1000c0, 3, (RIWR, RIWR, RIWR), rd_rn_rm),
18641 cCE("wunpckihh", e5000c0, 3, (RIWR, RIWR, RIWR), rd_rn_rm),
18642 cCE("wunpckihw", e9000c0, 3, (RIWR, RIWR, RIWR), rd_rn_rm),
18643 cCE("wunpckelub",e0000e0, 2, (RIWR, RIWR), rd_rn),
18644 cCE("wunpckeluh",e4000e0, 2, (RIWR, RIWR), rd_rn),
18645 cCE("wunpckeluw",e8000e0, 2, (RIWR, RIWR), rd_rn),
18646 cCE("wunpckelsb",e2000e0, 2, (RIWR, RIWR), rd_rn),
18647 cCE("wunpckelsh",e6000e0, 2, (RIWR, RIWR), rd_rn),
18648 cCE("wunpckelsw",ea000e0, 2, (RIWR, RIWR), rd_rn),
18649 cCE("wunpckilb", e1000e0, 3, (RIWR, RIWR, RIWR), rd_rn_rm),
18650 cCE("wunpckilh", e5000e0, 3, (RIWR, RIWR, RIWR), rd_rn_rm),
18651 cCE("wunpckilw", e9000e0, 3, (RIWR, RIWR, RIWR), rd_rn_rm),
18652 cCE("wxor", e100000, 3, (RIWR, RIWR, RIWR), rd_rn_rm),
18653 cCE("wzero", e300000, 1, (RIWR), iwmmxt_wzero),
c19d1205 18654
c921be7d
NC
18655#undef ARM_VARIANT
18656#define ARM_VARIANT & arm_cext_iwmmxt2 /* Intel Wireless MMX technology, version 2. */
18657
21d799b5
NC
18658 cCE("torvscb", e12f190, 1, (RR), iwmmxt_tandorc),
18659 cCE("torvsch", e52f190, 1, (RR), iwmmxt_tandorc),
18660 cCE("torvscw", e92f190, 1, (RR), iwmmxt_tandorc),
18661 cCE("wabsb", e2001c0, 2, (RIWR, RIWR), rd_rn),
18662 cCE("wabsh", e6001c0, 2, (RIWR, RIWR), rd_rn),
18663 cCE("wabsw", ea001c0, 2, (RIWR, RIWR), rd_rn),
18664 cCE("wabsdiffb", e1001c0, 3, (RIWR, RIWR, RIWR), rd_rn_rm),
18665 cCE("wabsdiffh", e5001c0, 3, (RIWR, RIWR, RIWR), rd_rn_rm),
18666 cCE("wabsdiffw", e9001c0, 3, (RIWR, RIWR, RIWR), rd_rn_rm),
18667 cCE("waddbhusl", e2001a0, 3, (RIWR, RIWR, RIWR), rd_rn_rm),
18668 cCE("waddbhusm", e6001a0, 3, (RIWR, RIWR, RIWR), rd_rn_rm),
18669 cCE("waddhc", e600180, 3, (RIWR, RIWR, RIWR), rd_rn_rm),
18670 cCE("waddwc", ea00180, 3, (RIWR, RIWR, RIWR), rd_rn_rm),
18671 cCE("waddsubhx", ea001a0, 3, (RIWR, RIWR, RIWR), rd_rn_rm),
18672 cCE("wavg4", e400000, 3, (RIWR, RIWR, RIWR), rd_rn_rm),
18673 cCE("wavg4r", e500000, 3, (RIWR, RIWR, RIWR), rd_rn_rm),
18674 cCE("wmaddsn", ee00100, 3, (RIWR, RIWR, RIWR), rd_rn_rm),
18675 cCE("wmaddsx", eb00100, 3, (RIWR, RIWR, RIWR), rd_rn_rm),
18676 cCE("wmaddun", ec00100, 3, (RIWR, RIWR, RIWR), rd_rn_rm),
18677 cCE("wmaddux", e900100, 3, (RIWR, RIWR, RIWR), rd_rn_rm),
18678 cCE("wmerge", e000080, 4, (RIWR, RIWR, RIWR, I7), iwmmxt_wmerge),
18679 cCE("wmiabb", e0000a0, 3, (RIWR, RIWR, RIWR), rd_rn_rm),
18680 cCE("wmiabt", e1000a0, 3, (RIWR, RIWR, RIWR), rd_rn_rm),
18681 cCE("wmiatb", e2000a0, 3, (RIWR, RIWR, RIWR), rd_rn_rm),
18682 cCE("wmiatt", e3000a0, 3, (RIWR, RIWR, RIWR), rd_rn_rm),
18683 cCE("wmiabbn", e4000a0, 3, (RIWR, RIWR, RIWR), rd_rn_rm),
18684 cCE("wmiabtn", e5000a0, 3, (RIWR, RIWR, RIWR), rd_rn_rm),
18685 cCE("wmiatbn", e6000a0, 3, (RIWR, RIWR, RIWR), rd_rn_rm),
18686 cCE("wmiattn", e7000a0, 3, (RIWR, RIWR, RIWR), rd_rn_rm),
18687 cCE("wmiawbb", e800120, 3, (RIWR, RIWR, RIWR), rd_rn_rm),
18688 cCE("wmiawbt", e900120, 3, (RIWR, RIWR, RIWR), rd_rn_rm),
18689 cCE("wmiawtb", ea00120, 3, (RIWR, RIWR, RIWR), rd_rn_rm),
18690 cCE("wmiawtt", eb00120, 3, (RIWR, RIWR, RIWR), rd_rn_rm),
18691 cCE("wmiawbbn", ec00120, 3, (RIWR, RIWR, RIWR), rd_rn_rm),
18692 cCE("wmiawbtn", ed00120, 3, (RIWR, RIWR, RIWR), rd_rn_rm),
18693 cCE("wmiawtbn", ee00120, 3, (RIWR, RIWR, RIWR), rd_rn_rm),
18694 cCE("wmiawttn", ef00120, 3, (RIWR, RIWR, RIWR), rd_rn_rm),
18695 cCE("wmulsmr", ef00100, 3, (RIWR, RIWR, RIWR), rd_rn_rm),
18696 cCE("wmulumr", ed00100, 3, (RIWR, RIWR, RIWR), rd_rn_rm),
18697 cCE("wmulwumr", ec000c0, 3, (RIWR, RIWR, RIWR), rd_rn_rm),
18698 cCE("wmulwsmr", ee000c0, 3, (RIWR, RIWR, RIWR), rd_rn_rm),
18699 cCE("wmulwum", ed000c0, 3, (RIWR, RIWR, RIWR), rd_rn_rm),
18700 cCE("wmulwsm", ef000c0, 3, (RIWR, RIWR, RIWR), rd_rn_rm),
18701 cCE("wmulwl", eb000c0, 3, (RIWR, RIWR, RIWR), rd_rn_rm),
18702 cCE("wqmiabb", e8000a0, 3, (RIWR, RIWR, RIWR), rd_rn_rm),
18703 cCE("wqmiabt", e9000a0, 3, (RIWR, RIWR, RIWR), rd_rn_rm),
18704 cCE("wqmiatb", ea000a0, 3, (RIWR, RIWR, RIWR), rd_rn_rm),
18705 cCE("wqmiatt", eb000a0, 3, (RIWR, RIWR, RIWR), rd_rn_rm),
18706 cCE("wqmiabbn", ec000a0, 3, (RIWR, RIWR, RIWR), rd_rn_rm),
18707 cCE("wqmiabtn", ed000a0, 3, (RIWR, RIWR, RIWR), rd_rn_rm),
18708 cCE("wqmiatbn", ee000a0, 3, (RIWR, RIWR, RIWR), rd_rn_rm),
18709 cCE("wqmiattn", ef000a0, 3, (RIWR, RIWR, RIWR), rd_rn_rm),
18710 cCE("wqmulm", e100080, 3, (RIWR, RIWR, RIWR), rd_rn_rm),
18711 cCE("wqmulmr", e300080, 3, (RIWR, RIWR, RIWR), rd_rn_rm),
18712 cCE("wqmulwm", ec000e0, 3, (RIWR, RIWR, RIWR), rd_rn_rm),
18713 cCE("wqmulwmr", ee000e0, 3, (RIWR, RIWR, RIWR), rd_rn_rm),
18714 cCE("wsubaddhx", ed001c0, 3, (RIWR, RIWR, RIWR), rd_rn_rm),
2d447fca 18715
c921be7d
NC
18716#undef ARM_VARIANT
18717#define ARM_VARIANT & arm_cext_maverick /* Cirrus Maverick instructions. */
18718
21d799b5
NC
18719 cCE("cfldrs", c100400, 2, (RMF, ADDRGLDC), rd_cpaddr),
18720 cCE("cfldrd", c500400, 2, (RMD, ADDRGLDC), rd_cpaddr),
18721 cCE("cfldr32", c100500, 2, (RMFX, ADDRGLDC), rd_cpaddr),
18722 cCE("cfldr64", c500500, 2, (RMDX, ADDRGLDC), rd_cpaddr),
18723 cCE("cfstrs", c000400, 2, (RMF, ADDRGLDC), rd_cpaddr),
18724 cCE("cfstrd", c400400, 2, (RMD, ADDRGLDC), rd_cpaddr),
18725 cCE("cfstr32", c000500, 2, (RMFX, ADDRGLDC), rd_cpaddr),
18726 cCE("cfstr64", c400500, 2, (RMDX, ADDRGLDC), rd_cpaddr),
18727 cCE("cfmvsr", e000450, 2, (RMF, RR), rn_rd),
18728 cCE("cfmvrs", e100450, 2, (RR, RMF), rd_rn),
18729 cCE("cfmvdlr", e000410, 2, (RMD, RR), rn_rd),
18730 cCE("cfmvrdl", e100410, 2, (RR, RMD), rd_rn),
18731 cCE("cfmvdhr", e000430, 2, (RMD, RR), rn_rd),
18732 cCE("cfmvrdh", e100430, 2, (RR, RMD), rd_rn),
18733 cCE("cfmv64lr", e000510, 2, (RMDX, RR), rn_rd),
18734 cCE("cfmvr64l", e100510, 2, (RR, RMDX), rd_rn),
18735 cCE("cfmv64hr", e000530, 2, (RMDX, RR), rn_rd),
18736 cCE("cfmvr64h", e100530, 2, (RR, RMDX), rd_rn),
18737 cCE("cfmval32", e200440, 2, (RMAX, RMFX), rd_rn),
18738 cCE("cfmv32al", e100440, 2, (RMFX, RMAX), rd_rn),
18739 cCE("cfmvam32", e200460, 2, (RMAX, RMFX), rd_rn),
18740 cCE("cfmv32am", e100460, 2, (RMFX, RMAX), rd_rn),
18741 cCE("cfmvah32", e200480, 2, (RMAX, RMFX), rd_rn),
18742 cCE("cfmv32ah", e100480, 2, (RMFX, RMAX), rd_rn),
18743 cCE("cfmva32", e2004a0, 2, (RMAX, RMFX), rd_rn),
18744 cCE("cfmv32a", e1004a0, 2, (RMFX, RMAX), rd_rn),
18745 cCE("cfmva64", e2004c0, 2, (RMAX, RMDX), rd_rn),
18746 cCE("cfmv64a", e1004c0, 2, (RMDX, RMAX), rd_rn),
18747 cCE("cfmvsc32", e2004e0, 2, (RMDS, RMDX), mav_dspsc),
18748 cCE("cfmv32sc", e1004e0, 2, (RMDX, RMDS), rd),
18749 cCE("cfcpys", e000400, 2, (RMF, RMF), rd_rn),
18750 cCE("cfcpyd", e000420, 2, (RMD, RMD), rd_rn),
18751 cCE("cfcvtsd", e000460, 2, (RMD, RMF), rd_rn),
18752 cCE("cfcvtds", e000440, 2, (RMF, RMD), rd_rn),
18753 cCE("cfcvt32s", e000480, 2, (RMF, RMFX), rd_rn),
18754 cCE("cfcvt32d", e0004a0, 2, (RMD, RMFX), rd_rn),
18755 cCE("cfcvt64s", e0004c0, 2, (RMF, RMDX), rd_rn),
18756 cCE("cfcvt64d", e0004e0, 2, (RMD, RMDX), rd_rn),
18757 cCE("cfcvts32", e100580, 2, (RMFX, RMF), rd_rn),
18758 cCE("cfcvtd32", e1005a0, 2, (RMFX, RMD), rd_rn),
18759 cCE("cftruncs32",e1005c0, 2, (RMFX, RMF), rd_rn),
18760 cCE("cftruncd32",e1005e0, 2, (RMFX, RMD), rd_rn),
18761 cCE("cfrshl32", e000550, 3, (RMFX, RMFX, RR), mav_triple),
18762 cCE("cfrshl64", e000570, 3, (RMDX, RMDX, RR), mav_triple),
18763 cCE("cfsh32", e000500, 3, (RMFX, RMFX, I63s), mav_shift),
18764 cCE("cfsh64", e200500, 3, (RMDX, RMDX, I63s), mav_shift),
18765 cCE("cfcmps", e100490, 3, (RR, RMF, RMF), rd_rn_rm),
18766 cCE("cfcmpd", e1004b0, 3, (RR, RMD, RMD), rd_rn_rm),
18767 cCE("cfcmp32", e100590, 3, (RR, RMFX, RMFX), rd_rn_rm),
18768 cCE("cfcmp64", e1005b0, 3, (RR, RMDX, RMDX), rd_rn_rm),
18769 cCE("cfabss", e300400, 2, (RMF, RMF), rd_rn),
18770 cCE("cfabsd", e300420, 2, (RMD, RMD), rd_rn),
18771 cCE("cfnegs", e300440, 2, (RMF, RMF), rd_rn),
18772 cCE("cfnegd", e300460, 2, (RMD, RMD), rd_rn),
18773 cCE("cfadds", e300480, 3, (RMF, RMF, RMF), rd_rn_rm),
18774 cCE("cfaddd", e3004a0, 3, (RMD, RMD, RMD), rd_rn_rm),
18775 cCE("cfsubs", e3004c0, 3, (RMF, RMF, RMF), rd_rn_rm),
18776 cCE("cfsubd", e3004e0, 3, (RMD, RMD, RMD), rd_rn_rm),
18777 cCE("cfmuls", e100400, 3, (RMF, RMF, RMF), rd_rn_rm),
18778 cCE("cfmuld", e100420, 3, (RMD, RMD, RMD), rd_rn_rm),
18779 cCE("cfabs32", e300500, 2, (RMFX, RMFX), rd_rn),
18780 cCE("cfabs64", e300520, 2, (RMDX, RMDX), rd_rn),
18781 cCE("cfneg32", e300540, 2, (RMFX, RMFX), rd_rn),
18782 cCE("cfneg64", e300560, 2, (RMDX, RMDX), rd_rn),
18783 cCE("cfadd32", e300580, 3, (RMFX, RMFX, RMFX), rd_rn_rm),
18784 cCE("cfadd64", e3005a0, 3, (RMDX, RMDX, RMDX), rd_rn_rm),
18785 cCE("cfsub32", e3005c0, 3, (RMFX, RMFX, RMFX), rd_rn_rm),
18786 cCE("cfsub64", e3005e0, 3, (RMDX, RMDX, RMDX), rd_rn_rm),
18787 cCE("cfmul32", e100500, 3, (RMFX, RMFX, RMFX), rd_rn_rm),
18788 cCE("cfmul64", e100520, 3, (RMDX, RMDX, RMDX), rd_rn_rm),
18789 cCE("cfmac32", e100540, 3, (RMFX, RMFX, RMFX), rd_rn_rm),
18790 cCE("cfmsc32", e100560, 3, (RMFX, RMFX, RMFX), rd_rn_rm),
18791 cCE("cfmadd32", e000600, 4, (RMAX, RMFX, RMFX, RMFX), mav_quad),
18792 cCE("cfmsub32", e100600, 4, (RMAX, RMFX, RMFX, RMFX), mav_quad),
18793 cCE("cfmadda32", e200600, 4, (RMAX, RMAX, RMFX, RMFX), mav_quad),
18794 cCE("cfmsuba32", e300600, 4, (RMAX, RMAX, RMFX, RMFX), mav_quad),
c19d1205
ZW
18795};
18796#undef ARM_VARIANT
18797#undef THUMB_VARIANT
18798#undef TCE
18799#undef TCM
18800#undef TUE
18801#undef TUF
18802#undef TCC
8f06b2d8 18803#undef cCE
e3cb604e
PB
18804#undef cCL
18805#undef C3E
c19d1205
ZW
18806#undef CE
18807#undef CM
18808#undef UE
18809#undef UF
18810#undef UT
5287ad62
JB
18811#undef NUF
18812#undef nUF
18813#undef NCE
18814#undef nCE
c19d1205
ZW
18815#undef OPS0
18816#undef OPS1
18817#undef OPS2
18818#undef OPS3
18819#undef OPS4
18820#undef OPS5
18821#undef OPS6
18822#undef do_0
18823\f
18824/* MD interface: bits in the object file. */
bfae80f2 18825
c19d1205
ZW
18826/* Turn an integer of n bytes (in val) into a stream of bytes appropriate
18827 for use in the a.out file, and stores them in the array pointed to by buf.
18828 This knows about the endian-ness of the target machine and does
18829 THE RIGHT THING, whatever it is. Possible values for n are 1 (byte)
18830 2 (short) and 4 (long) Floating numbers are put out as a series of
18831 LITTLENUMS (shorts, here at least). */
b99bd4ef 18832
c19d1205
ZW
18833void
18834md_number_to_chars (char * buf, valueT val, int n)
18835{
18836 if (target_big_endian)
18837 number_to_chars_bigendian (buf, val, n);
18838 else
18839 number_to_chars_littleendian (buf, val, n);
bfae80f2
RE
18840}
18841
c19d1205
ZW
18842static valueT
18843md_chars_to_number (char * buf, int n)
bfae80f2 18844{
c19d1205
ZW
18845 valueT result = 0;
18846 unsigned char * where = (unsigned char *) buf;
bfae80f2 18847
c19d1205 18848 if (target_big_endian)
b99bd4ef 18849 {
c19d1205
ZW
18850 while (n--)
18851 {
18852 result <<= 8;
18853 result |= (*where++ & 255);
18854 }
b99bd4ef 18855 }
c19d1205 18856 else
b99bd4ef 18857 {
c19d1205
ZW
18858 while (n--)
18859 {
18860 result <<= 8;
18861 result |= (where[n] & 255);
18862 }
bfae80f2 18863 }
b99bd4ef 18864
c19d1205 18865 return result;
bfae80f2 18866}
b99bd4ef 18867
c19d1205 18868/* MD interface: Sections. */
b99bd4ef 18869
0110f2b8
PB
18870/* Estimate the size of a frag before relaxing. Assume everything fits in
18871 2 bytes. */
18872
c19d1205 18873int
0110f2b8 18874md_estimate_size_before_relax (fragS * fragp,
c19d1205
ZW
18875 segT segtype ATTRIBUTE_UNUSED)
18876{
0110f2b8
PB
18877 fragp->fr_var = 2;
18878 return 2;
18879}
18880
18881/* Convert a machine dependent frag. */
18882
18883void
18884md_convert_frag (bfd *abfd, segT asec ATTRIBUTE_UNUSED, fragS *fragp)
18885{
18886 unsigned long insn;
18887 unsigned long old_op;
18888 char *buf;
18889 expressionS exp;
18890 fixS *fixp;
18891 int reloc_type;
18892 int pc_rel;
18893 int opcode;
18894
18895 buf = fragp->fr_literal + fragp->fr_fix;
18896
18897 old_op = bfd_get_16(abfd, buf);
5f4273c7
NC
18898 if (fragp->fr_symbol)
18899 {
0110f2b8
PB
18900 exp.X_op = O_symbol;
18901 exp.X_add_symbol = fragp->fr_symbol;
5f4273c7
NC
18902 }
18903 else
18904 {
0110f2b8 18905 exp.X_op = O_constant;
5f4273c7 18906 }
0110f2b8
PB
18907 exp.X_add_number = fragp->fr_offset;
18908 opcode = fragp->fr_subtype;
18909 switch (opcode)
18910 {
18911 case T_MNEM_ldr_pc:
18912 case T_MNEM_ldr_pc2:
18913 case T_MNEM_ldr_sp:
18914 case T_MNEM_str_sp:
18915 case T_MNEM_ldr:
18916 case T_MNEM_ldrb:
18917 case T_MNEM_ldrh:
18918 case T_MNEM_str:
18919 case T_MNEM_strb:
18920 case T_MNEM_strh:
18921 if (fragp->fr_var == 4)
18922 {
5f4273c7 18923 insn = THUMB_OP32 (opcode);
0110f2b8
PB
18924 if ((old_op >> 12) == 4 || (old_op >> 12) == 9)
18925 {
18926 insn |= (old_op & 0x700) << 4;
18927 }
18928 else
18929 {
18930 insn |= (old_op & 7) << 12;
18931 insn |= (old_op & 0x38) << 13;
18932 }
18933 insn |= 0x00000c00;
18934 put_thumb32_insn (buf, insn);
18935 reloc_type = BFD_RELOC_ARM_T32_OFFSET_IMM;
18936 }
18937 else
18938 {
18939 reloc_type = BFD_RELOC_ARM_THUMB_OFFSET;
18940 }
18941 pc_rel = (opcode == T_MNEM_ldr_pc2);
18942 break;
18943 case T_MNEM_adr:
18944 if (fragp->fr_var == 4)
18945 {
18946 insn = THUMB_OP32 (opcode);
18947 insn |= (old_op & 0xf0) << 4;
18948 put_thumb32_insn (buf, insn);
18949 reloc_type = BFD_RELOC_ARM_T32_ADD_PC12;
18950 }
18951 else
18952 {
18953 reloc_type = BFD_RELOC_ARM_THUMB_ADD;
18954 exp.X_add_number -= 4;
18955 }
18956 pc_rel = 1;
18957 break;
18958 case T_MNEM_mov:
18959 case T_MNEM_movs:
18960 case T_MNEM_cmp:
18961 case T_MNEM_cmn:
18962 if (fragp->fr_var == 4)
18963 {
18964 int r0off = (opcode == T_MNEM_mov
18965 || opcode == T_MNEM_movs) ? 0 : 8;
18966 insn = THUMB_OP32 (opcode);
18967 insn = (insn & 0xe1ffffff) | 0x10000000;
18968 insn |= (old_op & 0x700) << r0off;
18969 put_thumb32_insn (buf, insn);
18970 reloc_type = BFD_RELOC_ARM_T32_IMMEDIATE;
18971 }
18972 else
18973 {
18974 reloc_type = BFD_RELOC_ARM_THUMB_IMM;
18975 }
18976 pc_rel = 0;
18977 break;
18978 case T_MNEM_b:
18979 if (fragp->fr_var == 4)
18980 {
18981 insn = THUMB_OP32(opcode);
18982 put_thumb32_insn (buf, insn);
18983 reloc_type = BFD_RELOC_THUMB_PCREL_BRANCH25;
18984 }
18985 else
18986 reloc_type = BFD_RELOC_THUMB_PCREL_BRANCH12;
18987 pc_rel = 1;
18988 break;
18989 case T_MNEM_bcond:
18990 if (fragp->fr_var == 4)
18991 {
18992 insn = THUMB_OP32(opcode);
18993 insn |= (old_op & 0xf00) << 14;
18994 put_thumb32_insn (buf, insn);
18995 reloc_type = BFD_RELOC_THUMB_PCREL_BRANCH20;
18996 }
18997 else
18998 reloc_type = BFD_RELOC_THUMB_PCREL_BRANCH9;
18999 pc_rel = 1;
19000 break;
19001 case T_MNEM_add_sp:
19002 case T_MNEM_add_pc:
19003 case T_MNEM_inc_sp:
19004 case T_MNEM_dec_sp:
19005 if (fragp->fr_var == 4)
19006 {
19007 /* ??? Choose between add and addw. */
19008 insn = THUMB_OP32 (opcode);
19009 insn |= (old_op & 0xf0) << 4;
19010 put_thumb32_insn (buf, insn);
16805f35
PB
19011 if (opcode == T_MNEM_add_pc)
19012 reloc_type = BFD_RELOC_ARM_T32_IMM12;
19013 else
19014 reloc_type = BFD_RELOC_ARM_T32_ADD_IMM;
0110f2b8
PB
19015 }
19016 else
19017 reloc_type = BFD_RELOC_ARM_THUMB_ADD;
19018 pc_rel = 0;
19019 break;
19020
19021 case T_MNEM_addi:
19022 case T_MNEM_addis:
19023 case T_MNEM_subi:
19024 case T_MNEM_subis:
19025 if (fragp->fr_var == 4)
19026 {
19027 insn = THUMB_OP32 (opcode);
19028 insn |= (old_op & 0xf0) << 4;
19029 insn |= (old_op & 0xf) << 16;
19030 put_thumb32_insn (buf, insn);
16805f35
PB
19031 if (insn & (1 << 20))
19032 reloc_type = BFD_RELOC_ARM_T32_ADD_IMM;
19033 else
19034 reloc_type = BFD_RELOC_ARM_T32_IMMEDIATE;
0110f2b8
PB
19035 }
19036 else
19037 reloc_type = BFD_RELOC_ARM_THUMB_ADD;
19038 pc_rel = 0;
19039 break;
19040 default:
5f4273c7 19041 abort ();
0110f2b8
PB
19042 }
19043 fixp = fix_new_exp (fragp, fragp->fr_fix, fragp->fr_var, &exp, pc_rel,
21d799b5 19044 (enum bfd_reloc_code_real) reloc_type);
0110f2b8
PB
19045 fixp->fx_file = fragp->fr_file;
19046 fixp->fx_line = fragp->fr_line;
19047 fragp->fr_fix += fragp->fr_var;
19048}
19049
19050/* Return the size of a relaxable immediate operand instruction.
19051 SHIFT and SIZE specify the form of the allowable immediate. */
19052static int
19053relax_immediate (fragS *fragp, int size, int shift)
19054{
19055 offsetT offset;
19056 offsetT mask;
19057 offsetT low;
19058
19059 /* ??? Should be able to do better than this. */
19060 if (fragp->fr_symbol)
19061 return 4;
19062
19063 low = (1 << shift) - 1;
19064 mask = (1 << (shift + size)) - (1 << shift);
19065 offset = fragp->fr_offset;
19066 /* Force misaligned offsets to 32-bit variant. */
19067 if (offset & low)
5e77afaa 19068 return 4;
0110f2b8
PB
19069 if (offset & ~mask)
19070 return 4;
19071 return 2;
19072}
19073
5e77afaa
PB
19074/* Get the address of a symbol during relaxation. */
19075static addressT
5f4273c7 19076relaxed_symbol_addr (fragS *fragp, long stretch)
5e77afaa
PB
19077{
19078 fragS *sym_frag;
19079 addressT addr;
19080 symbolS *sym;
19081
19082 sym = fragp->fr_symbol;
19083 sym_frag = symbol_get_frag (sym);
19084 know (S_GET_SEGMENT (sym) != absolute_section
19085 || sym_frag == &zero_address_frag);
19086 addr = S_GET_VALUE (sym) + fragp->fr_offset;
19087
19088 /* If frag has yet to be reached on this pass, assume it will
19089 move by STRETCH just as we did. If this is not so, it will
19090 be because some frag between grows, and that will force
19091 another pass. */
19092
19093 if (stretch != 0
19094 && sym_frag->relax_marker != fragp->relax_marker)
4396b686
PB
19095 {
19096 fragS *f;
19097
19098 /* Adjust stretch for any alignment frag. Note that if have
19099 been expanding the earlier code, the symbol may be
19100 defined in what appears to be an earlier frag. FIXME:
19101 This doesn't handle the fr_subtype field, which specifies
19102 a maximum number of bytes to skip when doing an
19103 alignment. */
19104 for (f = fragp; f != NULL && f != sym_frag; f = f->fr_next)
19105 {
19106 if (f->fr_type == rs_align || f->fr_type == rs_align_code)
19107 {
19108 if (stretch < 0)
19109 stretch = - ((- stretch)
19110 & ~ ((1 << (int) f->fr_offset) - 1));
19111 else
19112 stretch &= ~ ((1 << (int) f->fr_offset) - 1);
19113 if (stretch == 0)
19114 break;
19115 }
19116 }
19117 if (f != NULL)
19118 addr += stretch;
19119 }
5e77afaa
PB
19120
19121 return addr;
19122}
19123
0110f2b8
PB
19124/* Return the size of a relaxable adr pseudo-instruction or PC-relative
19125 load. */
19126static int
5e77afaa 19127relax_adr (fragS *fragp, asection *sec, long stretch)
0110f2b8
PB
19128{
19129 addressT addr;
19130 offsetT val;
19131
19132 /* Assume worst case for symbols not known to be in the same section. */
974da60d
NC
19133 if (fragp->fr_symbol == NULL
19134 || !S_IS_DEFINED (fragp->fr_symbol)
77db8e2e
NC
19135 || sec != S_GET_SEGMENT (fragp->fr_symbol)
19136 || S_IS_WEAK (fragp->fr_symbol))
0110f2b8
PB
19137 return 4;
19138
5f4273c7 19139 val = relaxed_symbol_addr (fragp, stretch);
0110f2b8
PB
19140 addr = fragp->fr_address + fragp->fr_fix;
19141 addr = (addr + 4) & ~3;
5e77afaa 19142 /* Force misaligned targets to 32-bit variant. */
0110f2b8 19143 if (val & 3)
5e77afaa 19144 return 4;
0110f2b8
PB
19145 val -= addr;
19146 if (val < 0 || val > 1020)
19147 return 4;
19148 return 2;
19149}
19150
19151/* Return the size of a relaxable add/sub immediate instruction. */
19152static int
19153relax_addsub (fragS *fragp, asection *sec)
19154{
19155 char *buf;
19156 int op;
19157
19158 buf = fragp->fr_literal + fragp->fr_fix;
19159 op = bfd_get_16(sec->owner, buf);
19160 if ((op & 0xf) == ((op >> 4) & 0xf))
19161 return relax_immediate (fragp, 8, 0);
19162 else
19163 return relax_immediate (fragp, 3, 0);
19164}
19165
19166
19167/* Return the size of a relaxable branch instruction. BITS is the
19168 size of the offset field in the narrow instruction. */
19169
19170static int
5e77afaa 19171relax_branch (fragS *fragp, asection *sec, int bits, long stretch)
0110f2b8
PB
19172{
19173 addressT addr;
19174 offsetT val;
19175 offsetT limit;
19176
19177 /* Assume worst case for symbols not known to be in the same section. */
5f4273c7 19178 if (!S_IS_DEFINED (fragp->fr_symbol)
77db8e2e
NC
19179 || sec != S_GET_SEGMENT (fragp->fr_symbol)
19180 || S_IS_WEAK (fragp->fr_symbol))
0110f2b8
PB
19181 return 4;
19182
267bf995
RR
19183#ifdef OBJ_ELF
19184 if (S_IS_DEFINED (fragp->fr_symbol)
19185 && ARM_IS_FUNC (fragp->fr_symbol))
19186 return 4;
0d9b4b55
NC
19187
19188 /* PR 12532. Global symbols with default visibility might
19189 be preempted, so do not relax relocations to them. */
19190 if ((ELF_ST_VISIBILITY (S_GET_OTHER (fragp->fr_symbol)) == STV_DEFAULT)
19191 && (! S_IS_LOCAL (fragp->fr_symbol)))
19192 return 4;
267bf995
RR
19193#endif
19194
5f4273c7 19195 val = relaxed_symbol_addr (fragp, stretch);
0110f2b8
PB
19196 addr = fragp->fr_address + fragp->fr_fix + 4;
19197 val -= addr;
19198
19199 /* Offset is a signed value *2 */
19200 limit = 1 << bits;
19201 if (val >= limit || val < -limit)
19202 return 4;
19203 return 2;
19204}
19205
19206
19207/* Relax a machine dependent frag. This returns the amount by which
19208 the current size of the frag should change. */
19209
19210int
5e77afaa 19211arm_relax_frag (asection *sec, fragS *fragp, long stretch)
0110f2b8
PB
19212{
19213 int oldsize;
19214 int newsize;
19215
19216 oldsize = fragp->fr_var;
19217 switch (fragp->fr_subtype)
19218 {
19219 case T_MNEM_ldr_pc2:
5f4273c7 19220 newsize = relax_adr (fragp, sec, stretch);
0110f2b8
PB
19221 break;
19222 case T_MNEM_ldr_pc:
19223 case T_MNEM_ldr_sp:
19224 case T_MNEM_str_sp:
5f4273c7 19225 newsize = relax_immediate (fragp, 8, 2);
0110f2b8
PB
19226 break;
19227 case T_MNEM_ldr:
19228 case T_MNEM_str:
5f4273c7 19229 newsize = relax_immediate (fragp, 5, 2);
0110f2b8
PB
19230 break;
19231 case T_MNEM_ldrh:
19232 case T_MNEM_strh:
5f4273c7 19233 newsize = relax_immediate (fragp, 5, 1);
0110f2b8
PB
19234 break;
19235 case T_MNEM_ldrb:
19236 case T_MNEM_strb:
5f4273c7 19237 newsize = relax_immediate (fragp, 5, 0);
0110f2b8
PB
19238 break;
19239 case T_MNEM_adr:
5f4273c7 19240 newsize = relax_adr (fragp, sec, stretch);
0110f2b8
PB
19241 break;
19242 case T_MNEM_mov:
19243 case T_MNEM_movs:
19244 case T_MNEM_cmp:
19245 case T_MNEM_cmn:
5f4273c7 19246 newsize = relax_immediate (fragp, 8, 0);
0110f2b8
PB
19247 break;
19248 case T_MNEM_b:
5f4273c7 19249 newsize = relax_branch (fragp, sec, 11, stretch);
0110f2b8
PB
19250 break;
19251 case T_MNEM_bcond:
5f4273c7 19252 newsize = relax_branch (fragp, sec, 8, stretch);
0110f2b8
PB
19253 break;
19254 case T_MNEM_add_sp:
19255 case T_MNEM_add_pc:
19256 newsize = relax_immediate (fragp, 8, 2);
19257 break;
19258 case T_MNEM_inc_sp:
19259 case T_MNEM_dec_sp:
19260 newsize = relax_immediate (fragp, 7, 2);
19261 break;
19262 case T_MNEM_addi:
19263 case T_MNEM_addis:
19264 case T_MNEM_subi:
19265 case T_MNEM_subis:
19266 newsize = relax_addsub (fragp, sec);
19267 break;
19268 default:
5f4273c7 19269 abort ();
0110f2b8 19270 }
5e77afaa
PB
19271
19272 fragp->fr_var = newsize;
19273 /* Freeze wide instructions that are at or before the same location as
19274 in the previous pass. This avoids infinite loops.
5f4273c7
NC
19275 Don't freeze them unconditionally because targets may be artificially
19276 misaligned by the expansion of preceding frags. */
5e77afaa 19277 if (stretch <= 0 && newsize > 2)
0110f2b8 19278 {
0110f2b8 19279 md_convert_frag (sec->owner, sec, fragp);
5f4273c7 19280 frag_wane (fragp);
0110f2b8 19281 }
5e77afaa 19282
0110f2b8 19283 return newsize - oldsize;
c19d1205 19284}
b99bd4ef 19285
c19d1205 19286/* Round up a section size to the appropriate boundary. */
b99bd4ef 19287
c19d1205
ZW
19288valueT
19289md_section_align (segT segment ATTRIBUTE_UNUSED,
19290 valueT size)
19291{
f0927246
NC
19292#if (defined (OBJ_AOUT) || defined (OBJ_MAYBE_AOUT))
19293 if (OUTPUT_FLAVOR == bfd_target_aout_flavour)
19294 {
19295 /* For a.out, force the section size to be aligned. If we don't do
19296 this, BFD will align it for us, but it will not write out the
19297 final bytes of the section. This may be a bug in BFD, but it is
19298 easier to fix it here since that is how the other a.out targets
19299 work. */
19300 int align;
19301
19302 align = bfd_get_section_alignment (stdoutput, segment);
19303 size = ((size + (1 << align) - 1) & ((valueT) -1 << align));
19304 }
c19d1205 19305#endif
f0927246
NC
19306
19307 return size;
bfae80f2 19308}
b99bd4ef 19309
c19d1205
ZW
19310/* This is called from HANDLE_ALIGN in write.c. Fill in the contents
19311 of an rs_align_code fragment. */
19312
19313void
19314arm_handle_align (fragS * fragP)
bfae80f2 19315{
e7495e45
NS
19316 static char const arm_noop[2][2][4] =
19317 {
19318 { /* ARMv1 */
19319 {0x00, 0x00, 0xa0, 0xe1}, /* LE */
19320 {0xe1, 0xa0, 0x00, 0x00}, /* BE */
19321 },
19322 { /* ARMv6k */
19323 {0x00, 0xf0, 0x20, 0xe3}, /* LE */
19324 {0xe3, 0x20, 0xf0, 0x00}, /* BE */
19325 },
19326 };
19327 static char const thumb_noop[2][2][2] =
19328 {
19329 { /* Thumb-1 */
19330 {0xc0, 0x46}, /* LE */
19331 {0x46, 0xc0}, /* BE */
19332 },
19333 { /* Thumb-2 */
19334 {0x00, 0xbf}, /* LE */
19335 {0xbf, 0x00} /* BE */
19336 }
19337 };
19338 static char const wide_thumb_noop[2][4] =
19339 { /* Wide Thumb-2 */
19340 {0xaf, 0xf3, 0x00, 0x80}, /* LE */
19341 {0xf3, 0xaf, 0x80, 0x00}, /* BE */
19342 };
c921be7d 19343
e7495e45 19344 unsigned bytes, fix, noop_size;
c19d1205
ZW
19345 char * p;
19346 const char * noop;
e7495e45 19347 const char *narrow_noop = NULL;
cd000bff
DJ
19348#ifdef OBJ_ELF
19349 enum mstate state;
19350#endif
bfae80f2 19351
c19d1205 19352 if (fragP->fr_type != rs_align_code)
bfae80f2
RE
19353 return;
19354
c19d1205
ZW
19355 bytes = fragP->fr_next->fr_address - fragP->fr_address - fragP->fr_fix;
19356 p = fragP->fr_literal + fragP->fr_fix;
19357 fix = 0;
bfae80f2 19358
c19d1205
ZW
19359 if (bytes > MAX_MEM_FOR_RS_ALIGN_CODE)
19360 bytes &= MAX_MEM_FOR_RS_ALIGN_CODE;
bfae80f2 19361
cd000bff 19362 gas_assert ((fragP->tc_frag_data.thumb_mode & MODE_RECORDED) != 0);
8dc2430f 19363
cd000bff 19364 if (fragP->tc_frag_data.thumb_mode & (~ MODE_RECORDED))
a737bd4d 19365 {
e7495e45
NS
19366 if (ARM_CPU_HAS_FEATURE (selected_cpu, arm_ext_v6t2))
19367 {
19368 narrow_noop = thumb_noop[1][target_big_endian];
19369 noop = wide_thumb_noop[target_big_endian];
19370 }
c19d1205 19371 else
e7495e45
NS
19372 noop = thumb_noop[0][target_big_endian];
19373 noop_size = 2;
cd000bff
DJ
19374#ifdef OBJ_ELF
19375 state = MAP_THUMB;
19376#endif
7ed4c4c5
NC
19377 }
19378 else
19379 {
e7495e45
NS
19380 noop = arm_noop[ARM_CPU_HAS_FEATURE (selected_cpu, arm_ext_v6k) != 0]
19381 [target_big_endian];
19382 noop_size = 4;
cd000bff
DJ
19383#ifdef OBJ_ELF
19384 state = MAP_ARM;
19385#endif
7ed4c4c5 19386 }
c921be7d 19387
e7495e45 19388 fragP->fr_var = noop_size;
c921be7d 19389
c19d1205 19390 if (bytes & (noop_size - 1))
7ed4c4c5 19391 {
c19d1205 19392 fix = bytes & (noop_size - 1);
cd000bff
DJ
19393#ifdef OBJ_ELF
19394 insert_data_mapping_symbol (state, fragP->fr_fix, fragP, fix);
19395#endif
c19d1205
ZW
19396 memset (p, 0, fix);
19397 p += fix;
19398 bytes -= fix;
a737bd4d 19399 }
a737bd4d 19400
e7495e45
NS
19401 if (narrow_noop)
19402 {
19403 if (bytes & noop_size)
19404 {
19405 /* Insert a narrow noop. */
19406 memcpy (p, narrow_noop, noop_size);
19407 p += noop_size;
19408 bytes -= noop_size;
19409 fix += noop_size;
19410 }
19411
19412 /* Use wide noops for the remainder */
19413 noop_size = 4;
19414 }
19415
c19d1205 19416 while (bytes >= noop_size)
a737bd4d 19417 {
c19d1205
ZW
19418 memcpy (p, noop, noop_size);
19419 p += noop_size;
19420 bytes -= noop_size;
19421 fix += noop_size;
a737bd4d
NC
19422 }
19423
c19d1205 19424 fragP->fr_fix += fix;
a737bd4d
NC
19425}
19426
c19d1205
ZW
19427/* Called from md_do_align. Used to create an alignment
19428 frag in a code section. */
19429
19430void
19431arm_frag_align_code (int n, int max)
bfae80f2 19432{
c19d1205 19433 char * p;
7ed4c4c5 19434
c19d1205 19435 /* We assume that there will never be a requirement
6ec8e702 19436 to support alignments greater than MAX_MEM_FOR_RS_ALIGN_CODE bytes. */
c19d1205 19437 if (max > MAX_MEM_FOR_RS_ALIGN_CODE)
6ec8e702
NC
19438 {
19439 char err_msg[128];
19440
19441 sprintf (err_msg,
19442 _("alignments greater than %d bytes not supported in .text sections."),
19443 MAX_MEM_FOR_RS_ALIGN_CODE + 1);
20203fb9 19444 as_fatal ("%s", err_msg);
6ec8e702 19445 }
bfae80f2 19446
c19d1205
ZW
19447 p = frag_var (rs_align_code,
19448 MAX_MEM_FOR_RS_ALIGN_CODE,
19449 1,
19450 (relax_substateT) max,
19451 (symbolS *) NULL,
19452 (offsetT) n,
19453 (char *) NULL);
19454 *p = 0;
19455}
bfae80f2 19456
8dc2430f
NC
19457/* Perform target specific initialisation of a frag.
19458 Note - despite the name this initialisation is not done when the frag
19459 is created, but only when its type is assigned. A frag can be created
19460 and used a long time before its type is set, so beware of assuming that
19461 this initialisationis performed first. */
bfae80f2 19462
cd000bff
DJ
19463#ifndef OBJ_ELF
19464void
19465arm_init_frag (fragS * fragP, int max_chars ATTRIBUTE_UNUSED)
19466{
19467 /* Record whether this frag is in an ARM or a THUMB area. */
2e98972e 19468 fragP->tc_frag_data.thumb_mode = thumb_mode | MODE_RECORDED;
cd000bff
DJ
19469}
19470
19471#else /* OBJ_ELF is defined. */
c19d1205 19472void
cd000bff 19473arm_init_frag (fragS * fragP, int max_chars)
c19d1205 19474{
8dc2430f
NC
19475 /* If the current ARM vs THUMB mode has not already
19476 been recorded into this frag then do so now. */
cd000bff
DJ
19477 if ((fragP->tc_frag_data.thumb_mode & MODE_RECORDED) == 0)
19478 {
19479 fragP->tc_frag_data.thumb_mode = thumb_mode | MODE_RECORDED;
19480
19481 /* Record a mapping symbol for alignment frags. We will delete this
19482 later if the alignment ends up empty. */
19483 switch (fragP->fr_type)
19484 {
19485 case rs_align:
19486 case rs_align_test:
19487 case rs_fill:
19488 mapping_state_2 (MAP_DATA, max_chars);
19489 break;
19490 case rs_align_code:
19491 mapping_state_2 (thumb_mode ? MAP_THUMB : MAP_ARM, max_chars);
19492 break;
19493 default:
19494 break;
19495 }
19496 }
bfae80f2
RE
19497}
19498
c19d1205
ZW
19499/* When we change sections we need to issue a new mapping symbol. */
19500
19501void
19502arm_elf_change_section (void)
bfae80f2 19503{
c19d1205
ZW
19504 /* Link an unlinked unwind index table section to the .text section. */
19505 if (elf_section_type (now_seg) == SHT_ARM_EXIDX
19506 && elf_linked_to_section (now_seg) == NULL)
19507 elf_linked_to_section (now_seg) = text_section;
bfae80f2
RE
19508}
19509
c19d1205
ZW
19510int
19511arm_elf_section_type (const char * str, size_t len)
e45d0630 19512{
c19d1205
ZW
19513 if (len == 5 && strncmp (str, "exidx", 5) == 0)
19514 return SHT_ARM_EXIDX;
e45d0630 19515
c19d1205
ZW
19516 return -1;
19517}
19518\f
19519/* Code to deal with unwinding tables. */
e45d0630 19520
c19d1205 19521static void add_unwind_adjustsp (offsetT);
e45d0630 19522
5f4273c7 19523/* Generate any deferred unwind frame offset. */
e45d0630 19524
bfae80f2 19525static void
c19d1205 19526flush_pending_unwind (void)
bfae80f2 19527{
c19d1205 19528 offsetT offset;
bfae80f2 19529
c19d1205
ZW
19530 offset = unwind.pending_offset;
19531 unwind.pending_offset = 0;
19532 if (offset != 0)
19533 add_unwind_adjustsp (offset);
bfae80f2
RE
19534}
19535
c19d1205
ZW
19536/* Add an opcode to this list for this function. Two-byte opcodes should
19537 be passed as op[0] << 8 | op[1]. The list of opcodes is built in reverse
19538 order. */
19539
bfae80f2 19540static void
c19d1205 19541add_unwind_opcode (valueT op, int length)
bfae80f2 19542{
c19d1205
ZW
19543 /* Add any deferred stack adjustment. */
19544 if (unwind.pending_offset)
19545 flush_pending_unwind ();
bfae80f2 19546
c19d1205 19547 unwind.sp_restored = 0;
bfae80f2 19548
c19d1205 19549 if (unwind.opcode_count + length > unwind.opcode_alloc)
bfae80f2 19550 {
c19d1205
ZW
19551 unwind.opcode_alloc += ARM_OPCODE_CHUNK_SIZE;
19552 if (unwind.opcodes)
21d799b5
NC
19553 unwind.opcodes = (unsigned char *) xrealloc (unwind.opcodes,
19554 unwind.opcode_alloc);
c19d1205 19555 else
21d799b5 19556 unwind.opcodes = (unsigned char *) xmalloc (unwind.opcode_alloc);
bfae80f2 19557 }
c19d1205 19558 while (length > 0)
bfae80f2 19559 {
c19d1205
ZW
19560 length--;
19561 unwind.opcodes[unwind.opcode_count] = op & 0xff;
19562 op >>= 8;
19563 unwind.opcode_count++;
bfae80f2 19564 }
bfae80f2
RE
19565}
19566
c19d1205
ZW
19567/* Add unwind opcodes to adjust the stack pointer. */
19568
bfae80f2 19569static void
c19d1205 19570add_unwind_adjustsp (offsetT offset)
bfae80f2 19571{
c19d1205 19572 valueT op;
bfae80f2 19573
c19d1205 19574 if (offset > 0x200)
bfae80f2 19575 {
c19d1205
ZW
19576 /* We need at most 5 bytes to hold a 32-bit value in a uleb128. */
19577 char bytes[5];
19578 int n;
19579 valueT o;
bfae80f2 19580
c19d1205
ZW
19581 /* Long form: 0xb2, uleb128. */
19582 /* This might not fit in a word so add the individual bytes,
19583 remembering the list is built in reverse order. */
19584 o = (valueT) ((offset - 0x204) >> 2);
19585 if (o == 0)
19586 add_unwind_opcode (0, 1);
bfae80f2 19587
c19d1205
ZW
19588 /* Calculate the uleb128 encoding of the offset. */
19589 n = 0;
19590 while (o)
19591 {
19592 bytes[n] = o & 0x7f;
19593 o >>= 7;
19594 if (o)
19595 bytes[n] |= 0x80;
19596 n++;
19597 }
19598 /* Add the insn. */
19599 for (; n; n--)
19600 add_unwind_opcode (bytes[n - 1], 1);
19601 add_unwind_opcode (0xb2, 1);
19602 }
19603 else if (offset > 0x100)
bfae80f2 19604 {
c19d1205
ZW
19605 /* Two short opcodes. */
19606 add_unwind_opcode (0x3f, 1);
19607 op = (offset - 0x104) >> 2;
19608 add_unwind_opcode (op, 1);
bfae80f2 19609 }
c19d1205
ZW
19610 else if (offset > 0)
19611 {
19612 /* Short opcode. */
19613 op = (offset - 4) >> 2;
19614 add_unwind_opcode (op, 1);
19615 }
19616 else if (offset < 0)
bfae80f2 19617 {
c19d1205
ZW
19618 offset = -offset;
19619 while (offset > 0x100)
bfae80f2 19620 {
c19d1205
ZW
19621 add_unwind_opcode (0x7f, 1);
19622 offset -= 0x100;
bfae80f2 19623 }
c19d1205
ZW
19624 op = ((offset - 4) >> 2) | 0x40;
19625 add_unwind_opcode (op, 1);
bfae80f2 19626 }
bfae80f2
RE
19627}
19628
c19d1205
ZW
19629/* Finish the list of unwind opcodes for this function. */
19630static void
19631finish_unwind_opcodes (void)
bfae80f2 19632{
c19d1205 19633 valueT op;
bfae80f2 19634
c19d1205 19635 if (unwind.fp_used)
bfae80f2 19636 {
708587a4 19637 /* Adjust sp as necessary. */
c19d1205
ZW
19638 unwind.pending_offset += unwind.fp_offset - unwind.frame_size;
19639 flush_pending_unwind ();
bfae80f2 19640
c19d1205
ZW
19641 /* After restoring sp from the frame pointer. */
19642 op = 0x90 | unwind.fp_reg;
19643 add_unwind_opcode (op, 1);
19644 }
19645 else
19646 flush_pending_unwind ();
bfae80f2
RE
19647}
19648
bfae80f2 19649
c19d1205
ZW
19650/* Start an exception table entry. If idx is nonzero this is an index table
19651 entry. */
bfae80f2
RE
19652
19653static void
c19d1205 19654start_unwind_section (const segT text_seg, int idx)
bfae80f2 19655{
c19d1205
ZW
19656 const char * text_name;
19657 const char * prefix;
19658 const char * prefix_once;
19659 const char * group_name;
19660 size_t prefix_len;
19661 size_t text_len;
19662 char * sec_name;
19663 size_t sec_name_len;
19664 int type;
19665 int flags;
19666 int linkonce;
bfae80f2 19667
c19d1205 19668 if (idx)
bfae80f2 19669 {
c19d1205
ZW
19670 prefix = ELF_STRING_ARM_unwind;
19671 prefix_once = ELF_STRING_ARM_unwind_once;
19672 type = SHT_ARM_EXIDX;
bfae80f2 19673 }
c19d1205 19674 else
bfae80f2 19675 {
c19d1205
ZW
19676 prefix = ELF_STRING_ARM_unwind_info;
19677 prefix_once = ELF_STRING_ARM_unwind_info_once;
19678 type = SHT_PROGBITS;
bfae80f2
RE
19679 }
19680
c19d1205
ZW
19681 text_name = segment_name (text_seg);
19682 if (streq (text_name, ".text"))
19683 text_name = "";
19684
19685 if (strncmp (text_name, ".gnu.linkonce.t.",
19686 strlen (".gnu.linkonce.t.")) == 0)
bfae80f2 19687 {
c19d1205
ZW
19688 prefix = prefix_once;
19689 text_name += strlen (".gnu.linkonce.t.");
bfae80f2
RE
19690 }
19691
c19d1205
ZW
19692 prefix_len = strlen (prefix);
19693 text_len = strlen (text_name);
19694 sec_name_len = prefix_len + text_len;
21d799b5 19695 sec_name = (char *) xmalloc (sec_name_len + 1);
c19d1205
ZW
19696 memcpy (sec_name, prefix, prefix_len);
19697 memcpy (sec_name + prefix_len, text_name, text_len);
19698 sec_name[prefix_len + text_len] = '\0';
bfae80f2 19699
c19d1205
ZW
19700 flags = SHF_ALLOC;
19701 linkonce = 0;
19702 group_name = 0;
bfae80f2 19703
c19d1205
ZW
19704 /* Handle COMDAT group. */
19705 if (prefix != prefix_once && (text_seg->flags & SEC_LINK_ONCE) != 0)
bfae80f2 19706 {
c19d1205
ZW
19707 group_name = elf_group_name (text_seg);
19708 if (group_name == NULL)
19709 {
bd3ba5d1 19710 as_bad (_("Group section `%s' has no group signature"),
c19d1205
ZW
19711 segment_name (text_seg));
19712 ignore_rest_of_line ();
19713 return;
19714 }
19715 flags |= SHF_GROUP;
19716 linkonce = 1;
bfae80f2
RE
19717 }
19718
c19d1205 19719 obj_elf_change_section (sec_name, type, flags, 0, group_name, linkonce, 0);
bfae80f2 19720
5f4273c7 19721 /* Set the section link for index tables. */
c19d1205
ZW
19722 if (idx)
19723 elf_linked_to_section (now_seg) = text_seg;
bfae80f2
RE
19724}
19725
bfae80f2 19726
c19d1205
ZW
19727/* Start an unwind table entry. HAVE_DATA is nonzero if we have additional
19728 personality routine data. Returns zero, or the index table value for
19729 and inline entry. */
19730
19731static valueT
19732create_unwind_entry (int have_data)
bfae80f2 19733{
c19d1205
ZW
19734 int size;
19735 addressT where;
19736 char *ptr;
19737 /* The current word of data. */
19738 valueT data;
19739 /* The number of bytes left in this word. */
19740 int n;
bfae80f2 19741
c19d1205 19742 finish_unwind_opcodes ();
bfae80f2 19743
c19d1205
ZW
19744 /* Remember the current text section. */
19745 unwind.saved_seg = now_seg;
19746 unwind.saved_subseg = now_subseg;
bfae80f2 19747
c19d1205 19748 start_unwind_section (now_seg, 0);
bfae80f2 19749
c19d1205 19750 if (unwind.personality_routine == NULL)
bfae80f2 19751 {
c19d1205
ZW
19752 if (unwind.personality_index == -2)
19753 {
19754 if (have_data)
5f4273c7 19755 as_bad (_("handlerdata in cantunwind frame"));
c19d1205
ZW
19756 return 1; /* EXIDX_CANTUNWIND. */
19757 }
bfae80f2 19758
c19d1205
ZW
19759 /* Use a default personality routine if none is specified. */
19760 if (unwind.personality_index == -1)
19761 {
19762 if (unwind.opcode_count > 3)
19763 unwind.personality_index = 1;
19764 else
19765 unwind.personality_index = 0;
19766 }
bfae80f2 19767
c19d1205
ZW
19768 /* Space for the personality routine entry. */
19769 if (unwind.personality_index == 0)
19770 {
19771 if (unwind.opcode_count > 3)
19772 as_bad (_("too many unwind opcodes for personality routine 0"));
bfae80f2 19773
c19d1205
ZW
19774 if (!have_data)
19775 {
19776 /* All the data is inline in the index table. */
19777 data = 0x80;
19778 n = 3;
19779 while (unwind.opcode_count > 0)
19780 {
19781 unwind.opcode_count--;
19782 data = (data << 8) | unwind.opcodes[unwind.opcode_count];
19783 n--;
19784 }
bfae80f2 19785
c19d1205
ZW
19786 /* Pad with "finish" opcodes. */
19787 while (n--)
19788 data = (data << 8) | 0xb0;
bfae80f2 19789
c19d1205
ZW
19790 return data;
19791 }
19792 size = 0;
19793 }
19794 else
19795 /* We get two opcodes "free" in the first word. */
19796 size = unwind.opcode_count - 2;
19797 }
19798 else
19799 /* An extra byte is required for the opcode count. */
19800 size = unwind.opcode_count + 1;
bfae80f2 19801
c19d1205
ZW
19802 size = (size + 3) >> 2;
19803 if (size > 0xff)
19804 as_bad (_("too many unwind opcodes"));
bfae80f2 19805
c19d1205
ZW
19806 frag_align (2, 0, 0);
19807 record_alignment (now_seg, 2);
19808 unwind.table_entry = expr_build_dot ();
19809
19810 /* Allocate the table entry. */
19811 ptr = frag_more ((size << 2) + 4);
19812 where = frag_now_fix () - ((size << 2) + 4);
bfae80f2 19813
c19d1205 19814 switch (unwind.personality_index)
bfae80f2 19815 {
c19d1205
ZW
19816 case -1:
19817 /* ??? Should this be a PLT generating relocation? */
19818 /* Custom personality routine. */
19819 fix_new (frag_now, where, 4, unwind.personality_routine, 0, 1,
19820 BFD_RELOC_ARM_PREL31);
bfae80f2 19821
c19d1205
ZW
19822 where += 4;
19823 ptr += 4;
bfae80f2 19824
c19d1205
ZW
19825 /* Set the first byte to the number of additional words. */
19826 data = size - 1;
19827 n = 3;
19828 break;
bfae80f2 19829
c19d1205
ZW
19830 /* ABI defined personality routines. */
19831 case 0:
19832 /* Three opcodes bytes are packed into the first word. */
19833 data = 0x80;
19834 n = 3;
19835 break;
bfae80f2 19836
c19d1205
ZW
19837 case 1:
19838 case 2:
19839 /* The size and first two opcode bytes go in the first word. */
19840 data = ((0x80 + unwind.personality_index) << 8) | size;
19841 n = 2;
19842 break;
bfae80f2 19843
c19d1205
ZW
19844 default:
19845 /* Should never happen. */
19846 abort ();
19847 }
bfae80f2 19848
c19d1205
ZW
19849 /* Pack the opcodes into words (MSB first), reversing the list at the same
19850 time. */
19851 while (unwind.opcode_count > 0)
19852 {
19853 if (n == 0)
19854 {
19855 md_number_to_chars (ptr, data, 4);
19856 ptr += 4;
19857 n = 4;
19858 data = 0;
19859 }
19860 unwind.opcode_count--;
19861 n--;
19862 data = (data << 8) | unwind.opcodes[unwind.opcode_count];
19863 }
19864
19865 /* Finish off the last word. */
19866 if (n < 4)
19867 {
19868 /* Pad with "finish" opcodes. */
19869 while (n--)
19870 data = (data << 8) | 0xb0;
19871
19872 md_number_to_chars (ptr, data, 4);
19873 }
19874
19875 if (!have_data)
19876 {
19877 /* Add an empty descriptor if there is no user-specified data. */
19878 ptr = frag_more (4);
19879 md_number_to_chars (ptr, 0, 4);
19880 }
19881
19882 return 0;
bfae80f2
RE
19883}
19884
f0927246
NC
19885
19886/* Initialize the DWARF-2 unwind information for this procedure. */
19887
19888void
19889tc_arm_frame_initial_instructions (void)
19890{
19891 cfi_add_CFA_def_cfa (REG_SP, 0);
19892}
19893#endif /* OBJ_ELF */
19894
c19d1205
ZW
19895/* Convert REGNAME to a DWARF-2 register number. */
19896
19897int
1df69f4f 19898tc_arm_regname_to_dw2regnum (char *regname)
bfae80f2 19899{
1df69f4f 19900 int reg = arm_reg_parse (&regname, REG_TYPE_RN);
c19d1205
ZW
19901
19902 if (reg == FAIL)
19903 return -1;
19904
19905 return reg;
bfae80f2
RE
19906}
19907
f0927246 19908#ifdef TE_PE
c19d1205 19909void
f0927246 19910tc_pe_dwarf2_emit_offset (symbolS *symbol, unsigned int size)
bfae80f2 19911{
91d6fa6a 19912 expressionS exp;
bfae80f2 19913
91d6fa6a
NC
19914 exp.X_op = O_secrel;
19915 exp.X_add_symbol = symbol;
19916 exp.X_add_number = 0;
19917 emit_expr (&exp, size);
f0927246
NC
19918}
19919#endif
bfae80f2 19920
c19d1205 19921/* MD interface: Symbol and relocation handling. */
bfae80f2 19922
2fc8bdac
ZW
19923/* Return the address within the segment that a PC-relative fixup is
19924 relative to. For ARM, PC-relative fixups applied to instructions
19925 are generally relative to the location of the fixup plus 8 bytes.
19926 Thumb branches are offset by 4, and Thumb loads relative to PC
19927 require special handling. */
bfae80f2 19928
c19d1205 19929long
2fc8bdac 19930md_pcrel_from_section (fixS * fixP, segT seg)
bfae80f2 19931{
2fc8bdac
ZW
19932 offsetT base = fixP->fx_where + fixP->fx_frag->fr_address;
19933
19934 /* If this is pc-relative and we are going to emit a relocation
19935 then we just want to put out any pipeline compensation that the linker
53baae48
NC
19936 will need. Otherwise we want to use the calculated base.
19937 For WinCE we skip the bias for externals as well, since this
19938 is how the MS ARM-CE assembler behaves and we want to be compatible. */
5f4273c7 19939 if (fixP->fx_pcrel
2fc8bdac 19940 && ((fixP->fx_addsy && S_GET_SEGMENT (fixP->fx_addsy) != seg)
53baae48
NC
19941 || (arm_force_relocation (fixP)
19942#ifdef TE_WINCE
19943 && !S_IS_EXTERNAL (fixP->fx_addsy)
19944#endif
19945 )))
2fc8bdac 19946 base = 0;
bfae80f2 19947
267bf995 19948
c19d1205 19949 switch (fixP->fx_r_type)
bfae80f2 19950 {
2fc8bdac
ZW
19951 /* PC relative addressing on the Thumb is slightly odd as the
19952 bottom two bits of the PC are forced to zero for the
19953 calculation. This happens *after* application of the
19954 pipeline offset. However, Thumb adrl already adjusts for
19955 this, so we need not do it again. */
c19d1205 19956 case BFD_RELOC_ARM_THUMB_ADD:
2fc8bdac 19957 return base & ~3;
c19d1205
ZW
19958
19959 case BFD_RELOC_ARM_THUMB_OFFSET:
19960 case BFD_RELOC_ARM_T32_OFFSET_IMM:
e9f89963 19961 case BFD_RELOC_ARM_T32_ADD_PC12:
8f06b2d8 19962 case BFD_RELOC_ARM_T32_CP_OFF_IMM:
2fc8bdac 19963 return (base + 4) & ~3;
c19d1205 19964
2fc8bdac
ZW
19965 /* Thumb branches are simply offset by +4. */
19966 case BFD_RELOC_THUMB_PCREL_BRANCH7:
19967 case BFD_RELOC_THUMB_PCREL_BRANCH9:
19968 case BFD_RELOC_THUMB_PCREL_BRANCH12:
19969 case BFD_RELOC_THUMB_PCREL_BRANCH20:
2fc8bdac 19970 case BFD_RELOC_THUMB_PCREL_BRANCH25:
2fc8bdac 19971 return base + 4;
bfae80f2 19972
267bf995 19973 case BFD_RELOC_THUMB_PCREL_BRANCH23:
486499d0
CL
19974 if (fixP->fx_addsy
19975 && (S_GET_SEGMENT (fixP->fx_addsy) == seg)
34e77a92 19976 && !S_FORCE_RELOC (fixP->fx_addsy, TRUE)
267bf995
RR
19977 && ARM_IS_FUNC (fixP->fx_addsy)
19978 && ARM_CPU_HAS_FEATURE (selected_cpu, arm_ext_v5t))
19979 base = fixP->fx_where + fixP->fx_frag->fr_address;
19980 return base + 4;
19981
00adf2d4
JB
19982 /* BLX is like branches above, but forces the low two bits of PC to
19983 zero. */
486499d0
CL
19984 case BFD_RELOC_THUMB_PCREL_BLX:
19985 if (fixP->fx_addsy
19986 && (S_GET_SEGMENT (fixP->fx_addsy) == seg)
34e77a92 19987 && !S_FORCE_RELOC (fixP->fx_addsy, TRUE)
267bf995
RR
19988 && THUMB_IS_FUNC (fixP->fx_addsy)
19989 && ARM_CPU_HAS_FEATURE (selected_cpu, arm_ext_v5t))
19990 base = fixP->fx_where + fixP->fx_frag->fr_address;
00adf2d4
JB
19991 return (base + 4) & ~3;
19992
2fc8bdac
ZW
19993 /* ARM mode branches are offset by +8. However, the Windows CE
19994 loader expects the relocation not to take this into account. */
267bf995 19995 case BFD_RELOC_ARM_PCREL_BLX:
486499d0
CL
19996 if (fixP->fx_addsy
19997 && (S_GET_SEGMENT (fixP->fx_addsy) == seg)
34e77a92 19998 && !S_FORCE_RELOC (fixP->fx_addsy, TRUE)
267bf995
RR
19999 && ARM_IS_FUNC (fixP->fx_addsy)
20000 && ARM_CPU_HAS_FEATURE (selected_cpu, arm_ext_v5t))
20001 base = fixP->fx_where + fixP->fx_frag->fr_address;
486499d0 20002 return base + 8;
267bf995 20003
486499d0
CL
20004 case BFD_RELOC_ARM_PCREL_CALL:
20005 if (fixP->fx_addsy
20006 && (S_GET_SEGMENT (fixP->fx_addsy) == seg)
34e77a92 20007 && !S_FORCE_RELOC (fixP->fx_addsy, TRUE)
267bf995
RR
20008 && THUMB_IS_FUNC (fixP->fx_addsy)
20009 && ARM_CPU_HAS_FEATURE (selected_cpu, arm_ext_v5t))
20010 base = fixP->fx_where + fixP->fx_frag->fr_address;
486499d0 20011 return base + 8;
267bf995 20012
2fc8bdac 20013 case BFD_RELOC_ARM_PCREL_BRANCH:
39b41c9c 20014 case BFD_RELOC_ARM_PCREL_JUMP:
2fc8bdac 20015 case BFD_RELOC_ARM_PLT32:
c19d1205 20016#ifdef TE_WINCE
5f4273c7 20017 /* When handling fixups immediately, because we have already
53baae48
NC
20018 discovered the value of a symbol, or the address of the frag involved
20019 we must account for the offset by +8, as the OS loader will never see the reloc.
20020 see fixup_segment() in write.c
20021 The S_IS_EXTERNAL test handles the case of global symbols.
20022 Those need the calculated base, not just the pipe compensation the linker will need. */
20023 if (fixP->fx_pcrel
20024 && fixP->fx_addsy != NULL
20025 && (S_GET_SEGMENT (fixP->fx_addsy) == seg)
20026 && (S_IS_EXTERNAL (fixP->fx_addsy) || !arm_force_relocation (fixP)))
20027 return base + 8;
2fc8bdac 20028 return base;
c19d1205 20029#else
2fc8bdac 20030 return base + 8;
c19d1205 20031#endif
2fc8bdac 20032
267bf995 20033
2fc8bdac
ZW
20034 /* ARM mode loads relative to PC are also offset by +8. Unlike
20035 branches, the Windows CE loader *does* expect the relocation
20036 to take this into account. */
20037 case BFD_RELOC_ARM_OFFSET_IMM:
20038 case BFD_RELOC_ARM_OFFSET_IMM8:
20039 case BFD_RELOC_ARM_HWLITERAL:
20040 case BFD_RELOC_ARM_LITERAL:
20041 case BFD_RELOC_ARM_CP_OFF_IMM:
20042 return base + 8;
20043
20044
20045 /* Other PC-relative relocations are un-offset. */
20046 default:
20047 return base;
20048 }
bfae80f2
RE
20049}
20050
c19d1205
ZW
20051/* Under ELF we need to default _GLOBAL_OFFSET_TABLE.
20052 Otherwise we have no need to default values of symbols. */
20053
20054symbolS *
20055md_undefined_symbol (char * name ATTRIBUTE_UNUSED)
bfae80f2 20056{
c19d1205
ZW
20057#ifdef OBJ_ELF
20058 if (name[0] == '_' && name[1] == 'G'
20059 && streq (name, GLOBAL_OFFSET_TABLE_NAME))
20060 {
20061 if (!GOT_symbol)
20062 {
20063 if (symbol_find (name))
bd3ba5d1 20064 as_bad (_("GOT already in the symbol table"));
bfae80f2 20065
c19d1205
ZW
20066 GOT_symbol = symbol_new (name, undefined_section,
20067 (valueT) 0, & zero_address_frag);
20068 }
bfae80f2 20069
c19d1205 20070 return GOT_symbol;
bfae80f2 20071 }
c19d1205 20072#endif
bfae80f2 20073
c921be7d 20074 return NULL;
bfae80f2
RE
20075}
20076
55cf6793 20077/* Subroutine of md_apply_fix. Check to see if an immediate can be
c19d1205
ZW
20078 computed as two separate immediate values, added together. We
20079 already know that this value cannot be computed by just one ARM
20080 instruction. */
20081
20082static unsigned int
20083validate_immediate_twopart (unsigned int val,
20084 unsigned int * highpart)
bfae80f2 20085{
c19d1205
ZW
20086 unsigned int a;
20087 unsigned int i;
bfae80f2 20088
c19d1205
ZW
20089 for (i = 0; i < 32; i += 2)
20090 if (((a = rotate_left (val, i)) & 0xff) != 0)
20091 {
20092 if (a & 0xff00)
20093 {
20094 if (a & ~ 0xffff)
20095 continue;
20096 * highpart = (a >> 8) | ((i + 24) << 7);
20097 }
20098 else if (a & 0xff0000)
20099 {
20100 if (a & 0xff000000)
20101 continue;
20102 * highpart = (a >> 16) | ((i + 16) << 7);
20103 }
20104 else
20105 {
9c2799c2 20106 gas_assert (a & 0xff000000);
c19d1205
ZW
20107 * highpart = (a >> 24) | ((i + 8) << 7);
20108 }
bfae80f2 20109
c19d1205
ZW
20110 return (a & 0xff) | (i << 7);
20111 }
bfae80f2 20112
c19d1205 20113 return FAIL;
bfae80f2
RE
20114}
20115
c19d1205
ZW
20116static int
20117validate_offset_imm (unsigned int val, int hwse)
20118{
20119 if ((hwse && val > 255) || val > 4095)
20120 return FAIL;
20121 return val;
20122}
bfae80f2 20123
55cf6793 20124/* Subroutine of md_apply_fix. Do those data_ops which can take a
c19d1205
ZW
20125 negative immediate constant by altering the instruction. A bit of
20126 a hack really.
20127 MOV <-> MVN
20128 AND <-> BIC
20129 ADC <-> SBC
20130 by inverting the second operand, and
20131 ADD <-> SUB
20132 CMP <-> CMN
20133 by negating the second operand. */
bfae80f2 20134
c19d1205
ZW
20135static int
20136negate_data_op (unsigned long * instruction,
20137 unsigned long value)
bfae80f2 20138{
c19d1205
ZW
20139 int op, new_inst;
20140 unsigned long negated, inverted;
bfae80f2 20141
c19d1205
ZW
20142 negated = encode_arm_immediate (-value);
20143 inverted = encode_arm_immediate (~value);
bfae80f2 20144
c19d1205
ZW
20145 op = (*instruction >> DATA_OP_SHIFT) & 0xf;
20146 switch (op)
bfae80f2 20147 {
c19d1205
ZW
20148 /* First negates. */
20149 case OPCODE_SUB: /* ADD <-> SUB */
20150 new_inst = OPCODE_ADD;
20151 value = negated;
20152 break;
bfae80f2 20153
c19d1205
ZW
20154 case OPCODE_ADD:
20155 new_inst = OPCODE_SUB;
20156 value = negated;
20157 break;
bfae80f2 20158
c19d1205
ZW
20159 case OPCODE_CMP: /* CMP <-> CMN */
20160 new_inst = OPCODE_CMN;
20161 value = negated;
20162 break;
bfae80f2 20163
c19d1205
ZW
20164 case OPCODE_CMN:
20165 new_inst = OPCODE_CMP;
20166 value = negated;
20167 break;
bfae80f2 20168
c19d1205
ZW
20169 /* Now Inverted ops. */
20170 case OPCODE_MOV: /* MOV <-> MVN */
20171 new_inst = OPCODE_MVN;
20172 value = inverted;
20173 break;
bfae80f2 20174
c19d1205
ZW
20175 case OPCODE_MVN:
20176 new_inst = OPCODE_MOV;
20177 value = inverted;
20178 break;
bfae80f2 20179
c19d1205
ZW
20180 case OPCODE_AND: /* AND <-> BIC */
20181 new_inst = OPCODE_BIC;
20182 value = inverted;
20183 break;
bfae80f2 20184
c19d1205
ZW
20185 case OPCODE_BIC:
20186 new_inst = OPCODE_AND;
20187 value = inverted;
20188 break;
bfae80f2 20189
c19d1205
ZW
20190 case OPCODE_ADC: /* ADC <-> SBC */
20191 new_inst = OPCODE_SBC;
20192 value = inverted;
20193 break;
bfae80f2 20194
c19d1205
ZW
20195 case OPCODE_SBC:
20196 new_inst = OPCODE_ADC;
20197 value = inverted;
20198 break;
bfae80f2 20199
c19d1205
ZW
20200 /* We cannot do anything. */
20201 default:
20202 return FAIL;
b99bd4ef
NC
20203 }
20204
c19d1205
ZW
20205 if (value == (unsigned) FAIL)
20206 return FAIL;
20207
20208 *instruction &= OPCODE_MASK;
20209 *instruction |= new_inst << DATA_OP_SHIFT;
20210 return value;
b99bd4ef
NC
20211}
20212
ef8d22e6
PB
20213/* Like negate_data_op, but for Thumb-2. */
20214
20215static unsigned int
16dd5e42 20216thumb32_negate_data_op (offsetT *instruction, unsigned int value)
ef8d22e6
PB
20217{
20218 int op, new_inst;
20219 int rd;
16dd5e42 20220 unsigned int negated, inverted;
ef8d22e6
PB
20221
20222 negated = encode_thumb32_immediate (-value);
20223 inverted = encode_thumb32_immediate (~value);
20224
20225 rd = (*instruction >> 8) & 0xf;
20226 op = (*instruction >> T2_DATA_OP_SHIFT) & 0xf;
20227 switch (op)
20228 {
20229 /* ADD <-> SUB. Includes CMP <-> CMN. */
20230 case T2_OPCODE_SUB:
20231 new_inst = T2_OPCODE_ADD;
20232 value = negated;
20233 break;
20234
20235 case T2_OPCODE_ADD:
20236 new_inst = T2_OPCODE_SUB;
20237 value = negated;
20238 break;
20239
20240 /* ORR <-> ORN. Includes MOV <-> MVN. */
20241 case T2_OPCODE_ORR:
20242 new_inst = T2_OPCODE_ORN;
20243 value = inverted;
20244 break;
20245
20246 case T2_OPCODE_ORN:
20247 new_inst = T2_OPCODE_ORR;
20248 value = inverted;
20249 break;
20250
20251 /* AND <-> BIC. TST has no inverted equivalent. */
20252 case T2_OPCODE_AND:
20253 new_inst = T2_OPCODE_BIC;
20254 if (rd == 15)
20255 value = FAIL;
20256 else
20257 value = inverted;
20258 break;
20259
20260 case T2_OPCODE_BIC:
20261 new_inst = T2_OPCODE_AND;
20262 value = inverted;
20263 break;
20264
20265 /* ADC <-> SBC */
20266 case T2_OPCODE_ADC:
20267 new_inst = T2_OPCODE_SBC;
20268 value = inverted;
20269 break;
20270
20271 case T2_OPCODE_SBC:
20272 new_inst = T2_OPCODE_ADC;
20273 value = inverted;
20274 break;
20275
20276 /* We cannot do anything. */
20277 default:
20278 return FAIL;
20279 }
20280
16dd5e42 20281 if (value == (unsigned int)FAIL)
ef8d22e6
PB
20282 return FAIL;
20283
20284 *instruction &= T2_OPCODE_MASK;
20285 *instruction |= new_inst << T2_DATA_OP_SHIFT;
20286 return value;
20287}
20288
8f06b2d8
PB
20289/* Read a 32-bit thumb instruction from buf. */
20290static unsigned long
20291get_thumb32_insn (char * buf)
20292{
20293 unsigned long insn;
20294 insn = md_chars_to_number (buf, THUMB_SIZE) << 16;
20295 insn |= md_chars_to_number (buf + THUMB_SIZE, THUMB_SIZE);
20296
20297 return insn;
20298}
20299
a8bc6c78
PB
20300
20301/* We usually want to set the low bit on the address of thumb function
20302 symbols. In particular .word foo - . should have the low bit set.
20303 Generic code tries to fold the difference of two symbols to
20304 a constant. Prevent this and force a relocation when the first symbols
20305 is a thumb function. */
c921be7d
NC
20306
20307bfd_boolean
a8bc6c78
PB
20308arm_optimize_expr (expressionS *l, operatorT op, expressionS *r)
20309{
20310 if (op == O_subtract
20311 && l->X_op == O_symbol
20312 && r->X_op == O_symbol
20313 && THUMB_IS_FUNC (l->X_add_symbol))
20314 {
20315 l->X_op = O_subtract;
20316 l->X_op_symbol = r->X_add_symbol;
20317 l->X_add_number -= r->X_add_number;
c921be7d 20318 return TRUE;
a8bc6c78 20319 }
c921be7d 20320
a8bc6c78 20321 /* Process as normal. */
c921be7d 20322 return FALSE;
a8bc6c78
PB
20323}
20324
4a42ebbc
RR
20325/* Encode Thumb2 unconditional branches and calls. The encoding
20326 for the 2 are identical for the immediate values. */
20327
20328static void
20329encode_thumb2_b_bl_offset (char * buf, offsetT value)
20330{
20331#define T2I1I2MASK ((1 << 13) | (1 << 11))
20332 offsetT newval;
20333 offsetT newval2;
20334 addressT S, I1, I2, lo, hi;
20335
20336 S = (value >> 24) & 0x01;
20337 I1 = (value >> 23) & 0x01;
20338 I2 = (value >> 22) & 0x01;
20339 hi = (value >> 12) & 0x3ff;
20340 lo = (value >> 1) & 0x7ff;
20341 newval = md_chars_to_number (buf, THUMB_SIZE);
20342 newval2 = md_chars_to_number (buf + THUMB_SIZE, THUMB_SIZE);
20343 newval |= (S << 10) | hi;
20344 newval2 &= ~T2I1I2MASK;
20345 newval2 |= (((I1 ^ S) << 13) | ((I2 ^ S) << 11) | lo) ^ T2I1I2MASK;
20346 md_number_to_chars (buf, newval, THUMB_SIZE);
20347 md_number_to_chars (buf + THUMB_SIZE, newval2, THUMB_SIZE);
20348}
20349
c19d1205 20350void
55cf6793 20351md_apply_fix (fixS * fixP,
c19d1205
ZW
20352 valueT * valP,
20353 segT seg)
20354{
20355 offsetT value = * valP;
20356 offsetT newval;
20357 unsigned int newimm;
20358 unsigned long temp;
20359 int sign;
20360 char * buf = fixP->fx_where + fixP->fx_frag->fr_literal;
b99bd4ef 20361
9c2799c2 20362 gas_assert (fixP->fx_r_type <= BFD_RELOC_UNUSED);
b99bd4ef 20363
c19d1205 20364 /* Note whether this will delete the relocation. */
4962c51a 20365
c19d1205
ZW
20366 if (fixP->fx_addsy == 0 && !fixP->fx_pcrel)
20367 fixP->fx_done = 1;
b99bd4ef 20368
adbaf948 20369 /* On a 64-bit host, silently truncate 'value' to 32 bits for
5f4273c7 20370 consistency with the behaviour on 32-bit hosts. Remember value
adbaf948
ZW
20371 for emit_reloc. */
20372 value &= 0xffffffff;
20373 value ^= 0x80000000;
5f4273c7 20374 value -= 0x80000000;
adbaf948
ZW
20375
20376 *valP = value;
c19d1205 20377 fixP->fx_addnumber = value;
b99bd4ef 20378
adbaf948
ZW
20379 /* Same treatment for fixP->fx_offset. */
20380 fixP->fx_offset &= 0xffffffff;
20381 fixP->fx_offset ^= 0x80000000;
20382 fixP->fx_offset -= 0x80000000;
20383
c19d1205 20384 switch (fixP->fx_r_type)
b99bd4ef 20385 {
c19d1205
ZW
20386 case BFD_RELOC_NONE:
20387 /* This will need to go in the object file. */
20388 fixP->fx_done = 0;
20389 break;
b99bd4ef 20390
c19d1205
ZW
20391 case BFD_RELOC_ARM_IMMEDIATE:
20392 /* We claim that this fixup has been processed here,
20393 even if in fact we generate an error because we do
20394 not have a reloc for it, so tc_gen_reloc will reject it. */
20395 fixP->fx_done = 1;
b99bd4ef 20396
77db8e2e 20397 if (fixP->fx_addsy)
b99bd4ef 20398 {
77db8e2e 20399 const char *msg = 0;
b99bd4ef 20400
77db8e2e
NC
20401 if (! S_IS_DEFINED (fixP->fx_addsy))
20402 msg = _("undefined symbol %s used as an immediate value");
20403 else if (S_GET_SEGMENT (fixP->fx_addsy) != seg)
20404 msg = _("symbol %s is in a different section");
20405 else if (S_IS_WEAK (fixP->fx_addsy))
20406 msg = _("symbol %s is weak and may be overridden later");
20407
20408 if (msg)
20409 {
20410 as_bad_where (fixP->fx_file, fixP->fx_line,
20411 msg, S_GET_NAME (fixP->fx_addsy));
20412 break;
20413 }
42e5fcbf
AS
20414 }
20415
c19d1205
ZW
20416 newimm = encode_arm_immediate (value);
20417 temp = md_chars_to_number (buf, INSN_SIZE);
20418
20419 /* If the instruction will fail, see if we can fix things up by
20420 changing the opcode. */
20421 if (newimm == (unsigned int) FAIL
20422 && (newimm = negate_data_op (&temp, value)) == (unsigned int) FAIL)
b99bd4ef 20423 {
c19d1205
ZW
20424 as_bad_where (fixP->fx_file, fixP->fx_line,
20425 _("invalid constant (%lx) after fixup"),
20426 (unsigned long) value);
20427 break;
b99bd4ef 20428 }
b99bd4ef 20429
c19d1205
ZW
20430 newimm |= (temp & 0xfffff000);
20431 md_number_to_chars (buf, (valueT) newimm, INSN_SIZE);
20432 break;
b99bd4ef 20433
c19d1205
ZW
20434 case BFD_RELOC_ARM_ADRL_IMMEDIATE:
20435 {
20436 unsigned int highpart = 0;
20437 unsigned int newinsn = 0xe1a00000; /* nop. */
b99bd4ef 20438
77db8e2e 20439 if (fixP->fx_addsy)
42e5fcbf 20440 {
77db8e2e 20441 const char *msg = 0;
42e5fcbf 20442
77db8e2e
NC
20443 if (! S_IS_DEFINED (fixP->fx_addsy))
20444 msg = _("undefined symbol %s used as an immediate value");
20445 else if (S_GET_SEGMENT (fixP->fx_addsy) != seg)
20446 msg = _("symbol %s is in a different section");
20447 else if (S_IS_WEAK (fixP->fx_addsy))
20448 msg = _("symbol %s is weak and may be overridden later");
42e5fcbf 20449
77db8e2e
NC
20450 if (msg)
20451 {
20452 as_bad_where (fixP->fx_file, fixP->fx_line,
20453 msg, S_GET_NAME (fixP->fx_addsy));
20454 break;
20455 }
20456 }
20457
c19d1205
ZW
20458 newimm = encode_arm_immediate (value);
20459 temp = md_chars_to_number (buf, INSN_SIZE);
b99bd4ef 20460
c19d1205
ZW
20461 /* If the instruction will fail, see if we can fix things up by
20462 changing the opcode. */
20463 if (newimm == (unsigned int) FAIL
20464 && (newimm = negate_data_op (& temp, value)) == (unsigned int) FAIL)
20465 {
20466 /* No ? OK - try using two ADD instructions to generate
20467 the value. */
20468 newimm = validate_immediate_twopart (value, & highpart);
b99bd4ef 20469
c19d1205
ZW
20470 /* Yes - then make sure that the second instruction is
20471 also an add. */
20472 if (newimm != (unsigned int) FAIL)
20473 newinsn = temp;
20474 /* Still No ? Try using a negated value. */
20475 else if ((newimm = validate_immediate_twopart (- value, & highpart)) != (unsigned int) FAIL)
20476 temp = newinsn = (temp & OPCODE_MASK) | OPCODE_SUB << DATA_OP_SHIFT;
20477 /* Otherwise - give up. */
20478 else
20479 {
20480 as_bad_where (fixP->fx_file, fixP->fx_line,
20481 _("unable to compute ADRL instructions for PC offset of 0x%lx"),
20482 (long) value);
20483 break;
20484 }
b99bd4ef 20485
c19d1205
ZW
20486 /* Replace the first operand in the 2nd instruction (which
20487 is the PC) with the destination register. We have
20488 already added in the PC in the first instruction and we
20489 do not want to do it again. */
20490 newinsn &= ~ 0xf0000;
20491 newinsn |= ((newinsn & 0x0f000) << 4);
20492 }
b99bd4ef 20493
c19d1205
ZW
20494 newimm |= (temp & 0xfffff000);
20495 md_number_to_chars (buf, (valueT) newimm, INSN_SIZE);
b99bd4ef 20496
c19d1205
ZW
20497 highpart |= (newinsn & 0xfffff000);
20498 md_number_to_chars (buf + INSN_SIZE, (valueT) highpart, INSN_SIZE);
20499 }
20500 break;
b99bd4ef 20501
c19d1205 20502 case BFD_RELOC_ARM_OFFSET_IMM:
00a97672
RS
20503 if (!fixP->fx_done && seg->use_rela_p)
20504 value = 0;
20505
c19d1205 20506 case BFD_RELOC_ARM_LITERAL:
26d97720 20507 sign = value > 0;
b99bd4ef 20508
c19d1205
ZW
20509 if (value < 0)
20510 value = - value;
b99bd4ef 20511
c19d1205 20512 if (validate_offset_imm (value, 0) == FAIL)
f03698e6 20513 {
c19d1205
ZW
20514 if (fixP->fx_r_type == BFD_RELOC_ARM_LITERAL)
20515 as_bad_where (fixP->fx_file, fixP->fx_line,
20516 _("invalid literal constant: pool needs to be closer"));
20517 else
20518 as_bad_where (fixP->fx_file, fixP->fx_line,
20519 _("bad immediate value for offset (%ld)"),
20520 (long) value);
20521 break;
f03698e6
RE
20522 }
20523
c19d1205 20524 newval = md_chars_to_number (buf, INSN_SIZE);
26d97720
NS
20525 if (value == 0)
20526 newval &= 0xfffff000;
20527 else
20528 {
20529 newval &= 0xff7ff000;
20530 newval |= value | (sign ? INDEX_UP : 0);
20531 }
c19d1205
ZW
20532 md_number_to_chars (buf, newval, INSN_SIZE);
20533 break;
b99bd4ef 20534
c19d1205
ZW
20535 case BFD_RELOC_ARM_OFFSET_IMM8:
20536 case BFD_RELOC_ARM_HWLITERAL:
26d97720 20537 sign = value > 0;
b99bd4ef 20538
c19d1205
ZW
20539 if (value < 0)
20540 value = - value;
b99bd4ef 20541
c19d1205 20542 if (validate_offset_imm (value, 1) == FAIL)
b99bd4ef 20543 {
c19d1205
ZW
20544 if (fixP->fx_r_type == BFD_RELOC_ARM_HWLITERAL)
20545 as_bad_where (fixP->fx_file, fixP->fx_line,
20546 _("invalid literal constant: pool needs to be closer"));
20547 else
f9d4405b 20548 as_bad (_("bad immediate value for 8-bit offset (%ld)"),
c19d1205
ZW
20549 (long) value);
20550 break;
b99bd4ef
NC
20551 }
20552
c19d1205 20553 newval = md_chars_to_number (buf, INSN_SIZE);
26d97720
NS
20554 if (value == 0)
20555 newval &= 0xfffff0f0;
20556 else
20557 {
20558 newval &= 0xff7ff0f0;
20559 newval |= ((value >> 4) << 8) | (value & 0xf) | (sign ? INDEX_UP : 0);
20560 }
c19d1205
ZW
20561 md_number_to_chars (buf, newval, INSN_SIZE);
20562 break;
b99bd4ef 20563
c19d1205
ZW
20564 case BFD_RELOC_ARM_T32_OFFSET_U8:
20565 if (value < 0 || value > 1020 || value % 4 != 0)
20566 as_bad_where (fixP->fx_file, fixP->fx_line,
20567 _("bad immediate value for offset (%ld)"), (long) value);
20568 value /= 4;
b99bd4ef 20569
c19d1205 20570 newval = md_chars_to_number (buf+2, THUMB_SIZE);
c19d1205
ZW
20571 newval |= value;
20572 md_number_to_chars (buf+2, newval, THUMB_SIZE);
20573 break;
b99bd4ef 20574
c19d1205
ZW
20575 case BFD_RELOC_ARM_T32_OFFSET_IMM:
20576 /* This is a complicated relocation used for all varieties of Thumb32
20577 load/store instruction with immediate offset:
20578
20579 1110 100P u1WL NNNN XXXX YYYY iiii iiii - +/-(U) pre/post(P) 8-bit,
20580 *4, optional writeback(W)
20581 (doubleword load/store)
20582
20583 1111 100S uTTL 1111 XXXX iiii iiii iiii - +/-(U) 12-bit PC-rel
20584 1111 100S 0TTL NNNN XXXX 1Pu1 iiii iiii - +/-(U) pre/post(P) 8-bit
20585 1111 100S 0TTL NNNN XXXX 1110 iiii iiii - positive 8-bit (T instruction)
20586 1111 100S 1TTL NNNN XXXX iiii iiii iiii - positive 12-bit
20587 1111 100S 0TTL NNNN XXXX 1100 iiii iiii - negative 8-bit
20588
20589 Uppercase letters indicate bits that are already encoded at
20590 this point. Lowercase letters are our problem. For the
20591 second block of instructions, the secondary opcode nybble
20592 (bits 8..11) is present, and bit 23 is zero, even if this is
20593 a PC-relative operation. */
20594 newval = md_chars_to_number (buf, THUMB_SIZE);
20595 newval <<= 16;
20596 newval |= md_chars_to_number (buf+THUMB_SIZE, THUMB_SIZE);
b99bd4ef 20597
c19d1205 20598 if ((newval & 0xf0000000) == 0xe0000000)
b99bd4ef 20599 {
c19d1205
ZW
20600 /* Doubleword load/store: 8-bit offset, scaled by 4. */
20601 if (value >= 0)
20602 newval |= (1 << 23);
20603 else
20604 value = -value;
20605 if (value % 4 != 0)
20606 {
20607 as_bad_where (fixP->fx_file, fixP->fx_line,
20608 _("offset not a multiple of 4"));
20609 break;
20610 }
20611 value /= 4;
216d22bc 20612 if (value > 0xff)
c19d1205
ZW
20613 {
20614 as_bad_where (fixP->fx_file, fixP->fx_line,
20615 _("offset out of range"));
20616 break;
20617 }
20618 newval &= ~0xff;
b99bd4ef 20619 }
c19d1205 20620 else if ((newval & 0x000f0000) == 0x000f0000)
b99bd4ef 20621 {
c19d1205
ZW
20622 /* PC-relative, 12-bit offset. */
20623 if (value >= 0)
20624 newval |= (1 << 23);
20625 else
20626 value = -value;
216d22bc 20627 if (value > 0xfff)
c19d1205
ZW
20628 {
20629 as_bad_where (fixP->fx_file, fixP->fx_line,
20630 _("offset out of range"));
20631 break;
20632 }
20633 newval &= ~0xfff;
b99bd4ef 20634 }
c19d1205 20635 else if ((newval & 0x00000100) == 0x00000100)
b99bd4ef 20636 {
c19d1205
ZW
20637 /* Writeback: 8-bit, +/- offset. */
20638 if (value >= 0)
20639 newval |= (1 << 9);
20640 else
20641 value = -value;
216d22bc 20642 if (value > 0xff)
c19d1205
ZW
20643 {
20644 as_bad_where (fixP->fx_file, fixP->fx_line,
20645 _("offset out of range"));
20646 break;
20647 }
20648 newval &= ~0xff;
b99bd4ef 20649 }
c19d1205 20650 else if ((newval & 0x00000f00) == 0x00000e00)
b99bd4ef 20651 {
c19d1205 20652 /* T-instruction: positive 8-bit offset. */
216d22bc 20653 if (value < 0 || value > 0xff)
b99bd4ef 20654 {
c19d1205
ZW
20655 as_bad_where (fixP->fx_file, fixP->fx_line,
20656 _("offset out of range"));
20657 break;
b99bd4ef 20658 }
c19d1205
ZW
20659 newval &= ~0xff;
20660 newval |= value;
b99bd4ef
NC
20661 }
20662 else
b99bd4ef 20663 {
c19d1205
ZW
20664 /* Positive 12-bit or negative 8-bit offset. */
20665 int limit;
20666 if (value >= 0)
b99bd4ef 20667 {
c19d1205
ZW
20668 newval |= (1 << 23);
20669 limit = 0xfff;
20670 }
20671 else
20672 {
20673 value = -value;
20674 limit = 0xff;
20675 }
20676 if (value > limit)
20677 {
20678 as_bad_where (fixP->fx_file, fixP->fx_line,
20679 _("offset out of range"));
20680 break;
b99bd4ef 20681 }
c19d1205 20682 newval &= ~limit;
b99bd4ef 20683 }
b99bd4ef 20684
c19d1205
ZW
20685 newval |= value;
20686 md_number_to_chars (buf, (newval >> 16) & 0xffff, THUMB_SIZE);
20687 md_number_to_chars (buf + THUMB_SIZE, newval & 0xffff, THUMB_SIZE);
20688 break;
404ff6b5 20689
c19d1205
ZW
20690 case BFD_RELOC_ARM_SHIFT_IMM:
20691 newval = md_chars_to_number (buf, INSN_SIZE);
20692 if (((unsigned long) value) > 32
20693 || (value == 32
20694 && (((newval & 0x60) == 0) || (newval & 0x60) == 0x60)))
20695 {
20696 as_bad_where (fixP->fx_file, fixP->fx_line,
20697 _("shift expression is too large"));
20698 break;
20699 }
404ff6b5 20700
c19d1205
ZW
20701 if (value == 0)
20702 /* Shifts of zero must be done as lsl. */
20703 newval &= ~0x60;
20704 else if (value == 32)
20705 value = 0;
20706 newval &= 0xfffff07f;
20707 newval |= (value & 0x1f) << 7;
20708 md_number_to_chars (buf, newval, INSN_SIZE);
20709 break;
404ff6b5 20710
c19d1205 20711 case BFD_RELOC_ARM_T32_IMMEDIATE:
16805f35 20712 case BFD_RELOC_ARM_T32_ADD_IMM:
92e90b6e 20713 case BFD_RELOC_ARM_T32_IMM12:
e9f89963 20714 case BFD_RELOC_ARM_T32_ADD_PC12:
c19d1205
ZW
20715 /* We claim that this fixup has been processed here,
20716 even if in fact we generate an error because we do
20717 not have a reloc for it, so tc_gen_reloc will reject it. */
20718 fixP->fx_done = 1;
404ff6b5 20719
c19d1205
ZW
20720 if (fixP->fx_addsy
20721 && ! S_IS_DEFINED (fixP->fx_addsy))
20722 {
20723 as_bad_where (fixP->fx_file, fixP->fx_line,
20724 _("undefined symbol %s used as an immediate value"),
20725 S_GET_NAME (fixP->fx_addsy));
20726 break;
20727 }
404ff6b5 20728
c19d1205
ZW
20729 newval = md_chars_to_number (buf, THUMB_SIZE);
20730 newval <<= 16;
20731 newval |= md_chars_to_number (buf+2, THUMB_SIZE);
404ff6b5 20732
16805f35
PB
20733 newimm = FAIL;
20734 if (fixP->fx_r_type == BFD_RELOC_ARM_T32_IMMEDIATE
20735 || fixP->fx_r_type == BFD_RELOC_ARM_T32_ADD_IMM)
ef8d22e6
PB
20736 {
20737 newimm = encode_thumb32_immediate (value);
20738 if (newimm == (unsigned int) FAIL)
20739 newimm = thumb32_negate_data_op (&newval, value);
20740 }
16805f35
PB
20741 if (fixP->fx_r_type != BFD_RELOC_ARM_T32_IMMEDIATE
20742 && newimm == (unsigned int) FAIL)
92e90b6e 20743 {
16805f35
PB
20744 /* Turn add/sum into addw/subw. */
20745 if (fixP->fx_r_type == BFD_RELOC_ARM_T32_ADD_IMM)
20746 newval = (newval & 0xfeffffff) | 0x02000000;
40f246e3
NC
20747 /* No flat 12-bit imm encoding for addsw/subsw. */
20748 if ((newval & 0x00100000) == 0)
e9f89963 20749 {
40f246e3
NC
20750 /* 12 bit immediate for addw/subw. */
20751 if (value < 0)
20752 {
20753 value = -value;
20754 newval ^= 0x00a00000;
20755 }
20756 if (value > 0xfff)
20757 newimm = (unsigned int) FAIL;
20758 else
20759 newimm = value;
e9f89963 20760 }
92e90b6e 20761 }
cc8a6dd0 20762
c19d1205 20763 if (newimm == (unsigned int)FAIL)
3631a3c8 20764 {
c19d1205
ZW
20765 as_bad_where (fixP->fx_file, fixP->fx_line,
20766 _("invalid constant (%lx) after fixup"),
20767 (unsigned long) value);
20768 break;
3631a3c8
NC
20769 }
20770
c19d1205
ZW
20771 newval |= (newimm & 0x800) << 15;
20772 newval |= (newimm & 0x700) << 4;
20773 newval |= (newimm & 0x0ff);
cc8a6dd0 20774
c19d1205
ZW
20775 md_number_to_chars (buf, (valueT) ((newval >> 16) & 0xffff), THUMB_SIZE);
20776 md_number_to_chars (buf+2, (valueT) (newval & 0xffff), THUMB_SIZE);
20777 break;
a737bd4d 20778
3eb17e6b 20779 case BFD_RELOC_ARM_SMC:
c19d1205
ZW
20780 if (((unsigned long) value) > 0xffff)
20781 as_bad_where (fixP->fx_file, fixP->fx_line,
3eb17e6b 20782 _("invalid smc expression"));
2fc8bdac 20783 newval = md_chars_to_number (buf, INSN_SIZE);
c19d1205
ZW
20784 newval |= (value & 0xf) | ((value & 0xfff0) << 4);
20785 md_number_to_chars (buf, newval, INSN_SIZE);
20786 break;
a737bd4d 20787
90ec0d68
MGD
20788 case BFD_RELOC_ARM_HVC:
20789 if (((unsigned long) value) > 0xffff)
20790 as_bad_where (fixP->fx_file, fixP->fx_line,
20791 _("invalid hvc expression"));
20792 newval = md_chars_to_number (buf, INSN_SIZE);
20793 newval |= (value & 0xf) | ((value & 0xfff0) << 4);
20794 md_number_to_chars (buf, newval, INSN_SIZE);
20795 break;
20796
c19d1205 20797 case BFD_RELOC_ARM_SWI:
adbaf948 20798 if (fixP->tc_fix_data != 0)
c19d1205
ZW
20799 {
20800 if (((unsigned long) value) > 0xff)
20801 as_bad_where (fixP->fx_file, fixP->fx_line,
20802 _("invalid swi expression"));
2fc8bdac 20803 newval = md_chars_to_number (buf, THUMB_SIZE);
c19d1205
ZW
20804 newval |= value;
20805 md_number_to_chars (buf, newval, THUMB_SIZE);
20806 }
20807 else
20808 {
20809 if (((unsigned long) value) > 0x00ffffff)
20810 as_bad_where (fixP->fx_file, fixP->fx_line,
20811 _("invalid swi expression"));
2fc8bdac 20812 newval = md_chars_to_number (buf, INSN_SIZE);
c19d1205
ZW
20813 newval |= value;
20814 md_number_to_chars (buf, newval, INSN_SIZE);
20815 }
20816 break;
a737bd4d 20817
c19d1205
ZW
20818 case BFD_RELOC_ARM_MULTI:
20819 if (((unsigned long) value) > 0xffff)
20820 as_bad_where (fixP->fx_file, fixP->fx_line,
20821 _("invalid expression in load/store multiple"));
20822 newval = value | md_chars_to_number (buf, INSN_SIZE);
20823 md_number_to_chars (buf, newval, INSN_SIZE);
20824 break;
a737bd4d 20825
c19d1205 20826#ifdef OBJ_ELF
39b41c9c 20827 case BFD_RELOC_ARM_PCREL_CALL:
267bf995
RR
20828
20829 if (ARM_CPU_HAS_FEATURE (selected_cpu, arm_ext_v5t)
20830 && fixP->fx_addsy
34e77a92 20831 && !S_FORCE_RELOC (fixP->fx_addsy, TRUE)
267bf995
RR
20832 && (S_GET_SEGMENT (fixP->fx_addsy) == seg)
20833 && THUMB_IS_FUNC (fixP->fx_addsy))
20834 /* Flip the bl to blx. This is a simple flip
20835 bit here because we generate PCREL_CALL for
20836 unconditional bls. */
20837 {
20838 newval = md_chars_to_number (buf, INSN_SIZE);
20839 newval = newval | 0x10000000;
20840 md_number_to_chars (buf, newval, INSN_SIZE);
20841 temp = 1;
20842 fixP->fx_done = 1;
20843 }
39b41c9c
PB
20844 else
20845 temp = 3;
20846 goto arm_branch_common;
20847
20848 case BFD_RELOC_ARM_PCREL_JUMP:
267bf995
RR
20849 if (ARM_CPU_HAS_FEATURE (selected_cpu, arm_ext_v5t)
20850 && fixP->fx_addsy
34e77a92 20851 && !S_FORCE_RELOC (fixP->fx_addsy, TRUE)
267bf995
RR
20852 && (S_GET_SEGMENT (fixP->fx_addsy) == seg)
20853 && THUMB_IS_FUNC (fixP->fx_addsy))
20854 {
20855 /* This would map to a bl<cond>, b<cond>,
20856 b<always> to a Thumb function. We
20857 need to force a relocation for this particular
20858 case. */
20859 newval = md_chars_to_number (buf, INSN_SIZE);
20860 fixP->fx_done = 0;
20861 }
20862
2fc8bdac 20863 case BFD_RELOC_ARM_PLT32:
c19d1205 20864#endif
39b41c9c
PB
20865 case BFD_RELOC_ARM_PCREL_BRANCH:
20866 temp = 3;
20867 goto arm_branch_common;
a737bd4d 20868
39b41c9c 20869 case BFD_RELOC_ARM_PCREL_BLX:
267bf995 20870
39b41c9c 20871 temp = 1;
267bf995
RR
20872 if (ARM_CPU_HAS_FEATURE (selected_cpu, arm_ext_v5t)
20873 && fixP->fx_addsy
34e77a92 20874 && !S_FORCE_RELOC (fixP->fx_addsy, TRUE)
267bf995
RR
20875 && (S_GET_SEGMENT (fixP->fx_addsy) == seg)
20876 && ARM_IS_FUNC (fixP->fx_addsy))
20877 {
20878 /* Flip the blx to a bl and warn. */
20879 const char *name = S_GET_NAME (fixP->fx_addsy);
20880 newval = 0xeb000000;
20881 as_warn_where (fixP->fx_file, fixP->fx_line,
20882 _("blx to '%s' an ARM ISA state function changed to bl"),
20883 name);
20884 md_number_to_chars (buf, newval, INSN_SIZE);
20885 temp = 3;
20886 fixP->fx_done = 1;
20887 }
20888
20889#ifdef OBJ_ELF
20890 if (EF_ARM_EABI_VERSION (meabi_flags) >= EF_ARM_EABI_VER4)
20891 fixP->fx_r_type = BFD_RELOC_ARM_PCREL_CALL;
20892#endif
20893
39b41c9c 20894 arm_branch_common:
c19d1205 20895 /* We are going to store value (shifted right by two) in the
39b41c9c
PB
20896 instruction, in a 24 bit, signed field. Bits 26 through 32 either
20897 all clear or all set and bit 0 must be clear. For B/BL bit 1 must
20898 also be be clear. */
20899 if (value & temp)
c19d1205 20900 as_bad_where (fixP->fx_file, fixP->fx_line,
2fc8bdac
ZW
20901 _("misaligned branch destination"));
20902 if ((value & (offsetT)0xfe000000) != (offsetT)0
20903 && (value & (offsetT)0xfe000000) != (offsetT)0xfe000000)
20904 as_bad_where (fixP->fx_file, fixP->fx_line,
20905 _("branch out of range"));
a737bd4d 20906
2fc8bdac 20907 if (fixP->fx_done || !seg->use_rela_p)
c19d1205 20908 {
2fc8bdac
ZW
20909 newval = md_chars_to_number (buf, INSN_SIZE);
20910 newval |= (value >> 2) & 0x00ffffff;
7ae2971b
PB
20911 /* Set the H bit on BLX instructions. */
20912 if (temp == 1)
20913 {
20914 if (value & 2)
20915 newval |= 0x01000000;
20916 else
20917 newval &= ~0x01000000;
20918 }
2fc8bdac 20919 md_number_to_chars (buf, newval, INSN_SIZE);
c19d1205 20920 }
c19d1205 20921 break;
a737bd4d 20922
25fe350b
MS
20923 case BFD_RELOC_THUMB_PCREL_BRANCH7: /* CBZ */
20924 /* CBZ can only branch forward. */
a737bd4d 20925
738755b0
MS
20926 /* Attempts to use CBZ to branch to the next instruction
20927 (which, strictly speaking, are prohibited) will be turned into
20928 no-ops.
20929
20930 FIXME: It may be better to remove the instruction completely and
20931 perform relaxation. */
20932 if (value == -2)
2fc8bdac
ZW
20933 {
20934 newval = md_chars_to_number (buf, THUMB_SIZE);
738755b0 20935 newval = 0xbf00; /* NOP encoding T1 */
2fc8bdac
ZW
20936 md_number_to_chars (buf, newval, THUMB_SIZE);
20937 }
738755b0
MS
20938 else
20939 {
20940 if (value & ~0x7e)
20941 as_bad_where (fixP->fx_file, fixP->fx_line,
20942 _("branch out of range"));
20943
20944 if (fixP->fx_done || !seg->use_rela_p)
20945 {
20946 newval = md_chars_to_number (buf, THUMB_SIZE);
20947 newval |= ((value & 0x3e) << 2) | ((value & 0x40) << 3);
20948 md_number_to_chars (buf, newval, THUMB_SIZE);
20949 }
20950 }
c19d1205 20951 break;
a737bd4d 20952
c19d1205 20953 case BFD_RELOC_THUMB_PCREL_BRANCH9: /* Conditional branch. */
2fc8bdac
ZW
20954 if ((value & ~0xff) && ((value & ~0xff) != ~0xff))
20955 as_bad_where (fixP->fx_file, fixP->fx_line,
20956 _("branch out of range"));
a737bd4d 20957
2fc8bdac
ZW
20958 if (fixP->fx_done || !seg->use_rela_p)
20959 {
20960 newval = md_chars_to_number (buf, THUMB_SIZE);
20961 newval |= (value & 0x1ff) >> 1;
20962 md_number_to_chars (buf, newval, THUMB_SIZE);
20963 }
c19d1205 20964 break;
a737bd4d 20965
c19d1205 20966 case BFD_RELOC_THUMB_PCREL_BRANCH12: /* Unconditional branch. */
2fc8bdac
ZW
20967 if ((value & ~0x7ff) && ((value & ~0x7ff) != ~0x7ff))
20968 as_bad_where (fixP->fx_file, fixP->fx_line,
20969 _("branch out of range"));
a737bd4d 20970
2fc8bdac
ZW
20971 if (fixP->fx_done || !seg->use_rela_p)
20972 {
20973 newval = md_chars_to_number (buf, THUMB_SIZE);
20974 newval |= (value & 0xfff) >> 1;
20975 md_number_to_chars (buf, newval, THUMB_SIZE);
20976 }
c19d1205 20977 break;
a737bd4d 20978
c19d1205 20979 case BFD_RELOC_THUMB_PCREL_BRANCH20:
267bf995
RR
20980 if (fixP->fx_addsy
20981 && (S_GET_SEGMENT (fixP->fx_addsy) == seg)
34e77a92 20982 && !S_FORCE_RELOC (fixP->fx_addsy, TRUE)
267bf995
RR
20983 && ARM_IS_FUNC (fixP->fx_addsy)
20984 && ARM_CPU_HAS_FEATURE (selected_cpu, arm_ext_v5t))
20985 {
20986 /* Force a relocation for a branch 20 bits wide. */
20987 fixP->fx_done = 0;
20988 }
2fc8bdac
ZW
20989 if ((value & ~0x1fffff) && ((value & ~0x1fffff) != ~0x1fffff))
20990 as_bad_where (fixP->fx_file, fixP->fx_line,
20991 _("conditional branch out of range"));
404ff6b5 20992
2fc8bdac
ZW
20993 if (fixP->fx_done || !seg->use_rela_p)
20994 {
20995 offsetT newval2;
20996 addressT S, J1, J2, lo, hi;
404ff6b5 20997
2fc8bdac
ZW
20998 S = (value & 0x00100000) >> 20;
20999 J2 = (value & 0x00080000) >> 19;
21000 J1 = (value & 0x00040000) >> 18;
21001 hi = (value & 0x0003f000) >> 12;
21002 lo = (value & 0x00000ffe) >> 1;
6c43fab6 21003
2fc8bdac
ZW
21004 newval = md_chars_to_number (buf, THUMB_SIZE);
21005 newval2 = md_chars_to_number (buf + THUMB_SIZE, THUMB_SIZE);
21006 newval |= (S << 10) | hi;
21007 newval2 |= (J1 << 13) | (J2 << 11) | lo;
21008 md_number_to_chars (buf, newval, THUMB_SIZE);
21009 md_number_to_chars (buf + THUMB_SIZE, newval2, THUMB_SIZE);
21010 }
c19d1205 21011 break;
6c43fab6 21012
c19d1205 21013 case BFD_RELOC_THUMB_PCREL_BLX:
267bf995
RR
21014
21015 /* If there is a blx from a thumb state function to
21016 another thumb function flip this to a bl and warn
21017 about it. */
21018
21019 if (fixP->fx_addsy
34e77a92 21020 && !S_FORCE_RELOC (fixP->fx_addsy, TRUE)
267bf995
RR
21021 && (S_GET_SEGMENT (fixP->fx_addsy) == seg)
21022 && THUMB_IS_FUNC (fixP->fx_addsy))
21023 {
21024 const char *name = S_GET_NAME (fixP->fx_addsy);
21025 as_warn_where (fixP->fx_file, fixP->fx_line,
21026 _("blx to Thumb func '%s' from Thumb ISA state changed to bl"),
21027 name);
21028 newval = md_chars_to_number (buf + THUMB_SIZE, THUMB_SIZE);
21029 newval = newval | 0x1000;
21030 md_number_to_chars (buf+THUMB_SIZE, newval, THUMB_SIZE);
21031 fixP->fx_r_type = BFD_RELOC_THUMB_PCREL_BRANCH23;
21032 fixP->fx_done = 1;
21033 }
21034
21035
21036 goto thumb_bl_common;
21037
c19d1205 21038 case BFD_RELOC_THUMB_PCREL_BRANCH23:
267bf995
RR
21039
21040 /* A bl from Thumb state ISA to an internal ARM state function
21041 is converted to a blx. */
21042 if (fixP->fx_addsy
21043 && (S_GET_SEGMENT (fixP->fx_addsy) == seg)
34e77a92 21044 && !S_FORCE_RELOC (fixP->fx_addsy, TRUE)
267bf995
RR
21045 && ARM_IS_FUNC (fixP->fx_addsy)
21046 && ARM_CPU_HAS_FEATURE (selected_cpu, arm_ext_v5t))
21047 {
21048 newval = md_chars_to_number (buf + THUMB_SIZE, THUMB_SIZE);
21049 newval = newval & ~0x1000;
21050 md_number_to_chars (buf+THUMB_SIZE, newval, THUMB_SIZE);
21051 fixP->fx_r_type = BFD_RELOC_THUMB_PCREL_BLX;
21052 fixP->fx_done = 1;
21053 }
21054
21055 thumb_bl_common:
21056
21057#ifdef OBJ_ELF
21058 if (EF_ARM_EABI_VERSION (meabi_flags) >= EF_ARM_EABI_VER4 &&
21059 fixP->fx_r_type == BFD_RELOC_THUMB_PCREL_BLX)
21060 fixP->fx_r_type = BFD_RELOC_THUMB_PCREL_BRANCH23;
21061#endif
21062
2fc8bdac
ZW
21063 if (fixP->fx_r_type == BFD_RELOC_THUMB_PCREL_BLX)
21064 /* For a BLX instruction, make sure that the relocation is rounded up
21065 to a word boundary. This follows the semantics of the instruction
21066 which specifies that bit 1 of the target address will come from bit
21067 1 of the base address. */
21068 value = (value + 1) & ~ 1;
404ff6b5 21069
2fc8bdac 21070
4a42ebbc
RR
21071 if ((value & ~0x3fffff) && ((value & ~0x3fffff) != ~0x3fffff))
21072 {
21073 if (!(ARM_CPU_HAS_FEATURE (cpu_variant, arm_arch_t2)))
21074 {
21075 as_bad_where (fixP->fx_file, fixP->fx_line,
21076 _("branch out of range"));
21077 }
21078 else if ((value & ~0x1ffffff)
21079 && ((value & ~0x1ffffff) != ~0x1ffffff))
21080 {
21081 as_bad_where (fixP->fx_file, fixP->fx_line,
21082 _("Thumb2 branch out of range"));
21083 }
c19d1205 21084 }
4a42ebbc
RR
21085
21086 if (fixP->fx_done || !seg->use_rela_p)
21087 encode_thumb2_b_bl_offset (buf, value);
21088
c19d1205 21089 break;
404ff6b5 21090
c19d1205 21091 case BFD_RELOC_THUMB_PCREL_BRANCH25:
2fc8bdac
ZW
21092 if ((value & ~0x1ffffff) && ((value & ~0x1ffffff) != ~0x1ffffff))
21093 as_bad_where (fixP->fx_file, fixP->fx_line,
21094 _("branch out of range"));
6c43fab6 21095
2fc8bdac 21096 if (fixP->fx_done || !seg->use_rela_p)
4a42ebbc 21097 encode_thumb2_b_bl_offset (buf, value);
6c43fab6 21098
2fc8bdac 21099 break;
a737bd4d 21100
2fc8bdac
ZW
21101 case BFD_RELOC_8:
21102 if (fixP->fx_done || !seg->use_rela_p)
21103 md_number_to_chars (buf, value, 1);
c19d1205 21104 break;
a737bd4d 21105
c19d1205 21106 case BFD_RELOC_16:
2fc8bdac 21107 if (fixP->fx_done || !seg->use_rela_p)
c19d1205 21108 md_number_to_chars (buf, value, 2);
c19d1205 21109 break;
a737bd4d 21110
c19d1205 21111#ifdef OBJ_ELF
0855e32b
NS
21112 case BFD_RELOC_ARM_TLS_CALL:
21113 case BFD_RELOC_ARM_THM_TLS_CALL:
21114 case BFD_RELOC_ARM_TLS_DESCSEQ:
21115 case BFD_RELOC_ARM_THM_TLS_DESCSEQ:
21116 S_SET_THREAD_LOCAL (fixP->fx_addsy);
21117 break;
21118
21119 case BFD_RELOC_ARM_TLS_GOTDESC:
c19d1205
ZW
21120 case BFD_RELOC_ARM_TLS_GD32:
21121 case BFD_RELOC_ARM_TLS_LE32:
21122 case BFD_RELOC_ARM_TLS_IE32:
21123 case BFD_RELOC_ARM_TLS_LDM32:
21124 case BFD_RELOC_ARM_TLS_LDO32:
21125 S_SET_THREAD_LOCAL (fixP->fx_addsy);
21126 /* fall through */
6c43fab6 21127
c19d1205
ZW
21128 case BFD_RELOC_ARM_GOT32:
21129 case BFD_RELOC_ARM_GOTOFF:
2fc8bdac
ZW
21130 if (fixP->fx_done || !seg->use_rela_p)
21131 md_number_to_chars (buf, 0, 4);
c19d1205 21132 break;
b43420e6
NC
21133
21134 case BFD_RELOC_ARM_GOT_PREL:
21135 if (fixP->fx_done || !seg->use_rela_p)
21136 md_number_to_chars (buf, value, 4);
21137 break;
21138
9a6f4e97
NS
21139 case BFD_RELOC_ARM_TARGET2:
21140 /* TARGET2 is not partial-inplace, so we need to write the
21141 addend here for REL targets, because it won't be written out
21142 during reloc processing later. */
21143 if (fixP->fx_done || !seg->use_rela_p)
21144 md_number_to_chars (buf, fixP->fx_offset, 4);
21145 break;
c19d1205 21146#endif
6c43fab6 21147
c19d1205
ZW
21148 case BFD_RELOC_RVA:
21149 case BFD_RELOC_32:
21150 case BFD_RELOC_ARM_TARGET1:
21151 case BFD_RELOC_ARM_ROSEGREL32:
21152 case BFD_RELOC_ARM_SBREL32:
21153 case BFD_RELOC_32_PCREL:
f0927246
NC
21154#ifdef TE_PE
21155 case BFD_RELOC_32_SECREL:
21156#endif
2fc8bdac 21157 if (fixP->fx_done || !seg->use_rela_p)
53baae48
NC
21158#ifdef TE_WINCE
21159 /* For WinCE we only do this for pcrel fixups. */
21160 if (fixP->fx_done || fixP->fx_pcrel)
21161#endif
21162 md_number_to_chars (buf, value, 4);
c19d1205 21163 break;
6c43fab6 21164
c19d1205
ZW
21165#ifdef OBJ_ELF
21166 case BFD_RELOC_ARM_PREL31:
2fc8bdac 21167 if (fixP->fx_done || !seg->use_rela_p)
c19d1205
ZW
21168 {
21169 newval = md_chars_to_number (buf, 4) & 0x80000000;
21170 if ((value ^ (value >> 1)) & 0x40000000)
21171 {
21172 as_bad_where (fixP->fx_file, fixP->fx_line,
21173 _("rel31 relocation overflow"));
21174 }
21175 newval |= value & 0x7fffffff;
21176 md_number_to_chars (buf, newval, 4);
21177 }
21178 break;
c19d1205 21179#endif
a737bd4d 21180
c19d1205 21181 case BFD_RELOC_ARM_CP_OFF_IMM:
8f06b2d8 21182 case BFD_RELOC_ARM_T32_CP_OFF_IMM:
c19d1205
ZW
21183 if (value < -1023 || value > 1023 || (value & 3))
21184 as_bad_where (fixP->fx_file, fixP->fx_line,
21185 _("co-processor offset out of range"));
21186 cp_off_common:
26d97720 21187 sign = value > 0;
c19d1205
ZW
21188 if (value < 0)
21189 value = -value;
8f06b2d8
PB
21190 if (fixP->fx_r_type == BFD_RELOC_ARM_CP_OFF_IMM
21191 || fixP->fx_r_type == BFD_RELOC_ARM_CP_OFF_IMM_S2)
21192 newval = md_chars_to_number (buf, INSN_SIZE);
21193 else
21194 newval = get_thumb32_insn (buf);
26d97720
NS
21195 if (value == 0)
21196 newval &= 0xffffff00;
21197 else
21198 {
21199 newval &= 0xff7fff00;
21200 newval |= (value >> 2) | (sign ? INDEX_UP : 0);
21201 }
8f06b2d8
PB
21202 if (fixP->fx_r_type == BFD_RELOC_ARM_CP_OFF_IMM
21203 || fixP->fx_r_type == BFD_RELOC_ARM_CP_OFF_IMM_S2)
21204 md_number_to_chars (buf, newval, INSN_SIZE);
21205 else
21206 put_thumb32_insn (buf, newval);
c19d1205 21207 break;
a737bd4d 21208
c19d1205 21209 case BFD_RELOC_ARM_CP_OFF_IMM_S2:
8f06b2d8 21210 case BFD_RELOC_ARM_T32_CP_OFF_IMM_S2:
c19d1205
ZW
21211 if (value < -255 || value > 255)
21212 as_bad_where (fixP->fx_file, fixP->fx_line,
21213 _("co-processor offset out of range"));
df7849c5 21214 value *= 4;
c19d1205 21215 goto cp_off_common;
6c43fab6 21216
c19d1205
ZW
21217 case BFD_RELOC_ARM_THUMB_OFFSET:
21218 newval = md_chars_to_number (buf, THUMB_SIZE);
21219 /* Exactly what ranges, and where the offset is inserted depends
21220 on the type of instruction, we can establish this from the
21221 top 4 bits. */
21222 switch (newval >> 12)
21223 {
21224 case 4: /* PC load. */
21225 /* Thumb PC loads are somewhat odd, bit 1 of the PC is
21226 forced to zero for these loads; md_pcrel_from has already
21227 compensated for this. */
21228 if (value & 3)
21229 as_bad_where (fixP->fx_file, fixP->fx_line,
21230 _("invalid offset, target not word aligned (0x%08lX)"),
0359e808
NC
21231 (((unsigned long) fixP->fx_frag->fr_address
21232 + (unsigned long) fixP->fx_where) & ~3)
21233 + (unsigned long) value);
a737bd4d 21234
c19d1205
ZW
21235 if (value & ~0x3fc)
21236 as_bad_where (fixP->fx_file, fixP->fx_line,
21237 _("invalid offset, value too big (0x%08lX)"),
21238 (long) value);
a737bd4d 21239
c19d1205
ZW
21240 newval |= value >> 2;
21241 break;
a737bd4d 21242
c19d1205
ZW
21243 case 9: /* SP load/store. */
21244 if (value & ~0x3fc)
21245 as_bad_where (fixP->fx_file, fixP->fx_line,
21246 _("invalid offset, value too big (0x%08lX)"),
21247 (long) value);
21248 newval |= value >> 2;
21249 break;
6c43fab6 21250
c19d1205
ZW
21251 case 6: /* Word load/store. */
21252 if (value & ~0x7c)
21253 as_bad_where (fixP->fx_file, fixP->fx_line,
21254 _("invalid offset, value too big (0x%08lX)"),
21255 (long) value);
21256 newval |= value << 4; /* 6 - 2. */
21257 break;
a737bd4d 21258
c19d1205
ZW
21259 case 7: /* Byte load/store. */
21260 if (value & ~0x1f)
21261 as_bad_where (fixP->fx_file, fixP->fx_line,
21262 _("invalid offset, value too big (0x%08lX)"),
21263 (long) value);
21264 newval |= value << 6;
21265 break;
a737bd4d 21266
c19d1205
ZW
21267 case 8: /* Halfword load/store. */
21268 if (value & ~0x3e)
21269 as_bad_where (fixP->fx_file, fixP->fx_line,
21270 _("invalid offset, value too big (0x%08lX)"),
21271 (long) value);
21272 newval |= value << 5; /* 6 - 1. */
21273 break;
a737bd4d 21274
c19d1205
ZW
21275 default:
21276 as_bad_where (fixP->fx_file, fixP->fx_line,
21277 "Unable to process relocation for thumb opcode: %lx",
21278 (unsigned long) newval);
21279 break;
21280 }
21281 md_number_to_chars (buf, newval, THUMB_SIZE);
21282 break;
a737bd4d 21283
c19d1205
ZW
21284 case BFD_RELOC_ARM_THUMB_ADD:
21285 /* This is a complicated relocation, since we use it for all of
21286 the following immediate relocations:
a737bd4d 21287
c19d1205
ZW
21288 3bit ADD/SUB
21289 8bit ADD/SUB
21290 9bit ADD/SUB SP word-aligned
21291 10bit ADD PC/SP word-aligned
a737bd4d 21292
c19d1205
ZW
21293 The type of instruction being processed is encoded in the
21294 instruction field:
a737bd4d 21295
c19d1205
ZW
21296 0x8000 SUB
21297 0x00F0 Rd
21298 0x000F Rs
21299 */
21300 newval = md_chars_to_number (buf, THUMB_SIZE);
21301 {
21302 int rd = (newval >> 4) & 0xf;
21303 int rs = newval & 0xf;
21304 int subtract = !!(newval & 0x8000);
a737bd4d 21305
c19d1205
ZW
21306 /* Check for HI regs, only very restricted cases allowed:
21307 Adjusting SP, and using PC or SP to get an address. */
21308 if ((rd > 7 && (rd != REG_SP || rs != REG_SP))
21309 || (rs > 7 && rs != REG_SP && rs != REG_PC))
21310 as_bad_where (fixP->fx_file, fixP->fx_line,
21311 _("invalid Hi register with immediate"));
a737bd4d 21312
c19d1205
ZW
21313 /* If value is negative, choose the opposite instruction. */
21314 if (value < 0)
21315 {
21316 value = -value;
21317 subtract = !subtract;
21318 if (value < 0)
21319 as_bad_where (fixP->fx_file, fixP->fx_line,
21320 _("immediate value out of range"));
21321 }
a737bd4d 21322
c19d1205
ZW
21323 if (rd == REG_SP)
21324 {
21325 if (value & ~0x1fc)
21326 as_bad_where (fixP->fx_file, fixP->fx_line,
21327 _("invalid immediate for stack address calculation"));
21328 newval = subtract ? T_OPCODE_SUB_ST : T_OPCODE_ADD_ST;
21329 newval |= value >> 2;
21330 }
21331 else if (rs == REG_PC || rs == REG_SP)
21332 {
21333 if (subtract || value & ~0x3fc)
21334 as_bad_where (fixP->fx_file, fixP->fx_line,
21335 _("invalid immediate for address calculation (value = 0x%08lX)"),
21336 (unsigned long) value);
21337 newval = (rs == REG_PC ? T_OPCODE_ADD_PC : T_OPCODE_ADD_SP);
21338 newval |= rd << 8;
21339 newval |= value >> 2;
21340 }
21341 else if (rs == rd)
21342 {
21343 if (value & ~0xff)
21344 as_bad_where (fixP->fx_file, fixP->fx_line,
21345 _("immediate value out of range"));
21346 newval = subtract ? T_OPCODE_SUB_I8 : T_OPCODE_ADD_I8;
21347 newval |= (rd << 8) | value;
21348 }
21349 else
21350 {
21351 if (value & ~0x7)
21352 as_bad_where (fixP->fx_file, fixP->fx_line,
21353 _("immediate value out of range"));
21354 newval = subtract ? T_OPCODE_SUB_I3 : T_OPCODE_ADD_I3;
21355 newval |= rd | (rs << 3) | (value << 6);
21356 }
21357 }
21358 md_number_to_chars (buf, newval, THUMB_SIZE);
21359 break;
a737bd4d 21360
c19d1205
ZW
21361 case BFD_RELOC_ARM_THUMB_IMM:
21362 newval = md_chars_to_number (buf, THUMB_SIZE);
21363 if (value < 0 || value > 255)
21364 as_bad_where (fixP->fx_file, fixP->fx_line,
4e6e072b 21365 _("invalid immediate: %ld is out of range"),
c19d1205
ZW
21366 (long) value);
21367 newval |= value;
21368 md_number_to_chars (buf, newval, THUMB_SIZE);
21369 break;
a737bd4d 21370
c19d1205
ZW
21371 case BFD_RELOC_ARM_THUMB_SHIFT:
21372 /* 5bit shift value (0..32). LSL cannot take 32. */
21373 newval = md_chars_to_number (buf, THUMB_SIZE) & 0xf83f;
21374 temp = newval & 0xf800;
21375 if (value < 0 || value > 32 || (value == 32 && temp == T_OPCODE_LSL_I))
21376 as_bad_where (fixP->fx_file, fixP->fx_line,
21377 _("invalid shift value: %ld"), (long) value);
21378 /* Shifts of zero must be encoded as LSL. */
21379 if (value == 0)
21380 newval = (newval & 0x003f) | T_OPCODE_LSL_I;
21381 /* Shifts of 32 are encoded as zero. */
21382 else if (value == 32)
21383 value = 0;
21384 newval |= value << 6;
21385 md_number_to_chars (buf, newval, THUMB_SIZE);
21386 break;
a737bd4d 21387
c19d1205
ZW
21388 case BFD_RELOC_VTABLE_INHERIT:
21389 case BFD_RELOC_VTABLE_ENTRY:
21390 fixP->fx_done = 0;
21391 return;
6c43fab6 21392
b6895b4f
PB
21393 case BFD_RELOC_ARM_MOVW:
21394 case BFD_RELOC_ARM_MOVT:
21395 case BFD_RELOC_ARM_THUMB_MOVW:
21396 case BFD_RELOC_ARM_THUMB_MOVT:
21397 if (fixP->fx_done || !seg->use_rela_p)
21398 {
21399 /* REL format relocations are limited to a 16-bit addend. */
21400 if (!fixP->fx_done)
21401 {
39623e12 21402 if (value < -0x8000 || value > 0x7fff)
b6895b4f 21403 as_bad_where (fixP->fx_file, fixP->fx_line,
ff5075ca 21404 _("offset out of range"));
b6895b4f
PB
21405 }
21406 else if (fixP->fx_r_type == BFD_RELOC_ARM_MOVT
21407 || fixP->fx_r_type == BFD_RELOC_ARM_THUMB_MOVT)
21408 {
21409 value >>= 16;
21410 }
21411
21412 if (fixP->fx_r_type == BFD_RELOC_ARM_THUMB_MOVW
21413 || fixP->fx_r_type == BFD_RELOC_ARM_THUMB_MOVT)
21414 {
21415 newval = get_thumb32_insn (buf);
21416 newval &= 0xfbf08f00;
21417 newval |= (value & 0xf000) << 4;
21418 newval |= (value & 0x0800) << 15;
21419 newval |= (value & 0x0700) << 4;
21420 newval |= (value & 0x00ff);
21421 put_thumb32_insn (buf, newval);
21422 }
21423 else
21424 {
21425 newval = md_chars_to_number (buf, 4);
21426 newval &= 0xfff0f000;
21427 newval |= value & 0x0fff;
21428 newval |= (value & 0xf000) << 4;
21429 md_number_to_chars (buf, newval, 4);
21430 }
21431 }
21432 return;
21433
4962c51a
MS
21434 case BFD_RELOC_ARM_ALU_PC_G0_NC:
21435 case BFD_RELOC_ARM_ALU_PC_G0:
21436 case BFD_RELOC_ARM_ALU_PC_G1_NC:
21437 case BFD_RELOC_ARM_ALU_PC_G1:
21438 case BFD_RELOC_ARM_ALU_PC_G2:
21439 case BFD_RELOC_ARM_ALU_SB_G0_NC:
21440 case BFD_RELOC_ARM_ALU_SB_G0:
21441 case BFD_RELOC_ARM_ALU_SB_G1_NC:
21442 case BFD_RELOC_ARM_ALU_SB_G1:
21443 case BFD_RELOC_ARM_ALU_SB_G2:
9c2799c2 21444 gas_assert (!fixP->fx_done);
4962c51a
MS
21445 if (!seg->use_rela_p)
21446 {
21447 bfd_vma insn;
21448 bfd_vma encoded_addend;
21449 bfd_vma addend_abs = abs (value);
21450
21451 /* Check that the absolute value of the addend can be
21452 expressed as an 8-bit constant plus a rotation. */
21453 encoded_addend = encode_arm_immediate (addend_abs);
21454 if (encoded_addend == (unsigned int) FAIL)
21455 as_bad_where (fixP->fx_file, fixP->fx_line,
21456 _("the offset 0x%08lX is not representable"),
495bde8e 21457 (unsigned long) addend_abs);
4962c51a
MS
21458
21459 /* Extract the instruction. */
21460 insn = md_chars_to_number (buf, INSN_SIZE);
21461
21462 /* If the addend is positive, use an ADD instruction.
21463 Otherwise use a SUB. Take care not to destroy the S bit. */
21464 insn &= 0xff1fffff;
21465 if (value < 0)
21466 insn |= 1 << 22;
21467 else
21468 insn |= 1 << 23;
21469
21470 /* Place the encoded addend into the first 12 bits of the
21471 instruction. */
21472 insn &= 0xfffff000;
21473 insn |= encoded_addend;
5f4273c7
NC
21474
21475 /* Update the instruction. */
4962c51a
MS
21476 md_number_to_chars (buf, insn, INSN_SIZE);
21477 }
21478 break;
21479
21480 case BFD_RELOC_ARM_LDR_PC_G0:
21481 case BFD_RELOC_ARM_LDR_PC_G1:
21482 case BFD_RELOC_ARM_LDR_PC_G2:
21483 case BFD_RELOC_ARM_LDR_SB_G0:
21484 case BFD_RELOC_ARM_LDR_SB_G1:
21485 case BFD_RELOC_ARM_LDR_SB_G2:
9c2799c2 21486 gas_assert (!fixP->fx_done);
4962c51a
MS
21487 if (!seg->use_rela_p)
21488 {
21489 bfd_vma insn;
21490 bfd_vma addend_abs = abs (value);
21491
21492 /* Check that the absolute value of the addend can be
21493 encoded in 12 bits. */
21494 if (addend_abs >= 0x1000)
21495 as_bad_where (fixP->fx_file, fixP->fx_line,
21496 _("bad offset 0x%08lX (only 12 bits available for the magnitude)"),
495bde8e 21497 (unsigned long) addend_abs);
4962c51a
MS
21498
21499 /* Extract the instruction. */
21500 insn = md_chars_to_number (buf, INSN_SIZE);
21501
21502 /* If the addend is negative, clear bit 23 of the instruction.
21503 Otherwise set it. */
21504 if (value < 0)
21505 insn &= ~(1 << 23);
21506 else
21507 insn |= 1 << 23;
21508
21509 /* Place the absolute value of the addend into the first 12 bits
21510 of the instruction. */
21511 insn &= 0xfffff000;
21512 insn |= addend_abs;
5f4273c7
NC
21513
21514 /* Update the instruction. */
4962c51a
MS
21515 md_number_to_chars (buf, insn, INSN_SIZE);
21516 }
21517 break;
21518
21519 case BFD_RELOC_ARM_LDRS_PC_G0:
21520 case BFD_RELOC_ARM_LDRS_PC_G1:
21521 case BFD_RELOC_ARM_LDRS_PC_G2:
21522 case BFD_RELOC_ARM_LDRS_SB_G0:
21523 case BFD_RELOC_ARM_LDRS_SB_G1:
21524 case BFD_RELOC_ARM_LDRS_SB_G2:
9c2799c2 21525 gas_assert (!fixP->fx_done);
4962c51a
MS
21526 if (!seg->use_rela_p)
21527 {
21528 bfd_vma insn;
21529 bfd_vma addend_abs = abs (value);
21530
21531 /* Check that the absolute value of the addend can be
21532 encoded in 8 bits. */
21533 if (addend_abs >= 0x100)
21534 as_bad_where (fixP->fx_file, fixP->fx_line,
21535 _("bad offset 0x%08lX (only 8 bits available for the magnitude)"),
495bde8e 21536 (unsigned long) addend_abs);
4962c51a
MS
21537
21538 /* Extract the instruction. */
21539 insn = md_chars_to_number (buf, INSN_SIZE);
21540
21541 /* If the addend is negative, clear bit 23 of the instruction.
21542 Otherwise set it. */
21543 if (value < 0)
21544 insn &= ~(1 << 23);
21545 else
21546 insn |= 1 << 23;
21547
21548 /* Place the first four bits of the absolute value of the addend
21549 into the first 4 bits of the instruction, and the remaining
21550 four into bits 8 .. 11. */
21551 insn &= 0xfffff0f0;
21552 insn |= (addend_abs & 0xf) | ((addend_abs & 0xf0) << 4);
5f4273c7
NC
21553
21554 /* Update the instruction. */
4962c51a
MS
21555 md_number_to_chars (buf, insn, INSN_SIZE);
21556 }
21557 break;
21558
21559 case BFD_RELOC_ARM_LDC_PC_G0:
21560 case BFD_RELOC_ARM_LDC_PC_G1:
21561 case BFD_RELOC_ARM_LDC_PC_G2:
21562 case BFD_RELOC_ARM_LDC_SB_G0:
21563 case BFD_RELOC_ARM_LDC_SB_G1:
21564 case BFD_RELOC_ARM_LDC_SB_G2:
9c2799c2 21565 gas_assert (!fixP->fx_done);
4962c51a
MS
21566 if (!seg->use_rela_p)
21567 {
21568 bfd_vma insn;
21569 bfd_vma addend_abs = abs (value);
21570
21571 /* Check that the absolute value of the addend is a multiple of
21572 four and, when divided by four, fits in 8 bits. */
21573 if (addend_abs & 0x3)
21574 as_bad_where (fixP->fx_file, fixP->fx_line,
21575 _("bad offset 0x%08lX (must be word-aligned)"),
495bde8e 21576 (unsigned long) addend_abs);
4962c51a
MS
21577
21578 if ((addend_abs >> 2) > 0xff)
21579 as_bad_where (fixP->fx_file, fixP->fx_line,
21580 _("bad offset 0x%08lX (must be an 8-bit number of words)"),
495bde8e 21581 (unsigned long) addend_abs);
4962c51a
MS
21582
21583 /* Extract the instruction. */
21584 insn = md_chars_to_number (buf, INSN_SIZE);
21585
21586 /* If the addend is negative, clear bit 23 of the instruction.
21587 Otherwise set it. */
21588 if (value < 0)
21589 insn &= ~(1 << 23);
21590 else
21591 insn |= 1 << 23;
21592
21593 /* Place the addend (divided by four) into the first eight
21594 bits of the instruction. */
21595 insn &= 0xfffffff0;
21596 insn |= addend_abs >> 2;
5f4273c7
NC
21597
21598 /* Update the instruction. */
4962c51a
MS
21599 md_number_to_chars (buf, insn, INSN_SIZE);
21600 }
21601 break;
21602
845b51d6
PB
21603 case BFD_RELOC_ARM_V4BX:
21604 /* This will need to go in the object file. */
21605 fixP->fx_done = 0;
21606 break;
21607
c19d1205
ZW
21608 case BFD_RELOC_UNUSED:
21609 default:
21610 as_bad_where (fixP->fx_file, fixP->fx_line,
21611 _("bad relocation fixup type (%d)"), fixP->fx_r_type);
21612 }
6c43fab6
RE
21613}
21614
c19d1205
ZW
21615/* Translate internal representation of relocation info to BFD target
21616 format. */
a737bd4d 21617
c19d1205 21618arelent *
00a97672 21619tc_gen_reloc (asection *section, fixS *fixp)
a737bd4d 21620{
c19d1205
ZW
21621 arelent * reloc;
21622 bfd_reloc_code_real_type code;
a737bd4d 21623
21d799b5 21624 reloc = (arelent *) xmalloc (sizeof (arelent));
a737bd4d 21625
21d799b5 21626 reloc->sym_ptr_ptr = (asymbol **) xmalloc (sizeof (asymbol *));
c19d1205
ZW
21627 *reloc->sym_ptr_ptr = symbol_get_bfdsym (fixp->fx_addsy);
21628 reloc->address = fixp->fx_frag->fr_address + fixp->fx_where;
a737bd4d 21629
2fc8bdac 21630 if (fixp->fx_pcrel)
00a97672
RS
21631 {
21632 if (section->use_rela_p)
21633 fixp->fx_offset -= md_pcrel_from_section (fixp, section);
21634 else
21635 fixp->fx_offset = reloc->address;
21636 }
c19d1205 21637 reloc->addend = fixp->fx_offset;
a737bd4d 21638
c19d1205 21639 switch (fixp->fx_r_type)
a737bd4d 21640 {
c19d1205
ZW
21641 case BFD_RELOC_8:
21642 if (fixp->fx_pcrel)
21643 {
21644 code = BFD_RELOC_8_PCREL;
21645 break;
21646 }
a737bd4d 21647
c19d1205
ZW
21648 case BFD_RELOC_16:
21649 if (fixp->fx_pcrel)
21650 {
21651 code = BFD_RELOC_16_PCREL;
21652 break;
21653 }
6c43fab6 21654
c19d1205
ZW
21655 case BFD_RELOC_32:
21656 if (fixp->fx_pcrel)
21657 {
21658 code = BFD_RELOC_32_PCREL;
21659 break;
21660 }
a737bd4d 21661
b6895b4f
PB
21662 case BFD_RELOC_ARM_MOVW:
21663 if (fixp->fx_pcrel)
21664 {
21665 code = BFD_RELOC_ARM_MOVW_PCREL;
21666 break;
21667 }
21668
21669 case BFD_RELOC_ARM_MOVT:
21670 if (fixp->fx_pcrel)
21671 {
21672 code = BFD_RELOC_ARM_MOVT_PCREL;
21673 break;
21674 }
21675
21676 case BFD_RELOC_ARM_THUMB_MOVW:
21677 if (fixp->fx_pcrel)
21678 {
21679 code = BFD_RELOC_ARM_THUMB_MOVW_PCREL;
21680 break;
21681 }
21682
21683 case BFD_RELOC_ARM_THUMB_MOVT:
21684 if (fixp->fx_pcrel)
21685 {
21686 code = BFD_RELOC_ARM_THUMB_MOVT_PCREL;
21687 break;
21688 }
21689
c19d1205
ZW
21690 case BFD_RELOC_NONE:
21691 case BFD_RELOC_ARM_PCREL_BRANCH:
21692 case BFD_RELOC_ARM_PCREL_BLX:
21693 case BFD_RELOC_RVA:
21694 case BFD_RELOC_THUMB_PCREL_BRANCH7:
21695 case BFD_RELOC_THUMB_PCREL_BRANCH9:
21696 case BFD_RELOC_THUMB_PCREL_BRANCH12:
21697 case BFD_RELOC_THUMB_PCREL_BRANCH20:
21698 case BFD_RELOC_THUMB_PCREL_BRANCH23:
21699 case BFD_RELOC_THUMB_PCREL_BRANCH25:
c19d1205
ZW
21700 case BFD_RELOC_VTABLE_ENTRY:
21701 case BFD_RELOC_VTABLE_INHERIT:
f0927246
NC
21702#ifdef TE_PE
21703 case BFD_RELOC_32_SECREL:
21704#endif
c19d1205
ZW
21705 code = fixp->fx_r_type;
21706 break;
a737bd4d 21707
00adf2d4
JB
21708 case BFD_RELOC_THUMB_PCREL_BLX:
21709#ifdef OBJ_ELF
21710 if (EF_ARM_EABI_VERSION (meabi_flags) >= EF_ARM_EABI_VER4)
21711 code = BFD_RELOC_THUMB_PCREL_BRANCH23;
21712 else
21713#endif
21714 code = BFD_RELOC_THUMB_PCREL_BLX;
21715 break;
21716
c19d1205
ZW
21717 case BFD_RELOC_ARM_LITERAL:
21718 case BFD_RELOC_ARM_HWLITERAL:
21719 /* If this is called then the a literal has
21720 been referenced across a section boundary. */
21721 as_bad_where (fixp->fx_file, fixp->fx_line,
21722 _("literal referenced across section boundary"));
21723 return NULL;
a737bd4d 21724
c19d1205 21725#ifdef OBJ_ELF
0855e32b
NS
21726 case BFD_RELOC_ARM_TLS_CALL:
21727 case BFD_RELOC_ARM_THM_TLS_CALL:
21728 case BFD_RELOC_ARM_TLS_DESCSEQ:
21729 case BFD_RELOC_ARM_THM_TLS_DESCSEQ:
c19d1205
ZW
21730 case BFD_RELOC_ARM_GOT32:
21731 case BFD_RELOC_ARM_GOTOFF:
b43420e6 21732 case BFD_RELOC_ARM_GOT_PREL:
c19d1205
ZW
21733 case BFD_RELOC_ARM_PLT32:
21734 case BFD_RELOC_ARM_TARGET1:
21735 case BFD_RELOC_ARM_ROSEGREL32:
21736 case BFD_RELOC_ARM_SBREL32:
21737 case BFD_RELOC_ARM_PREL31:
21738 case BFD_RELOC_ARM_TARGET2:
21739 case BFD_RELOC_ARM_TLS_LE32:
21740 case BFD_RELOC_ARM_TLS_LDO32:
39b41c9c
PB
21741 case BFD_RELOC_ARM_PCREL_CALL:
21742 case BFD_RELOC_ARM_PCREL_JUMP:
4962c51a
MS
21743 case BFD_RELOC_ARM_ALU_PC_G0_NC:
21744 case BFD_RELOC_ARM_ALU_PC_G0:
21745 case BFD_RELOC_ARM_ALU_PC_G1_NC:
21746 case BFD_RELOC_ARM_ALU_PC_G1:
21747 case BFD_RELOC_ARM_ALU_PC_G2:
21748 case BFD_RELOC_ARM_LDR_PC_G0:
21749 case BFD_RELOC_ARM_LDR_PC_G1:
21750 case BFD_RELOC_ARM_LDR_PC_G2:
21751 case BFD_RELOC_ARM_LDRS_PC_G0:
21752 case BFD_RELOC_ARM_LDRS_PC_G1:
21753 case BFD_RELOC_ARM_LDRS_PC_G2:
21754 case BFD_RELOC_ARM_LDC_PC_G0:
21755 case BFD_RELOC_ARM_LDC_PC_G1:
21756 case BFD_RELOC_ARM_LDC_PC_G2:
21757 case BFD_RELOC_ARM_ALU_SB_G0_NC:
21758 case BFD_RELOC_ARM_ALU_SB_G0:
21759 case BFD_RELOC_ARM_ALU_SB_G1_NC:
21760 case BFD_RELOC_ARM_ALU_SB_G1:
21761 case BFD_RELOC_ARM_ALU_SB_G2:
21762 case BFD_RELOC_ARM_LDR_SB_G0:
21763 case BFD_RELOC_ARM_LDR_SB_G1:
21764 case BFD_RELOC_ARM_LDR_SB_G2:
21765 case BFD_RELOC_ARM_LDRS_SB_G0:
21766 case BFD_RELOC_ARM_LDRS_SB_G1:
21767 case BFD_RELOC_ARM_LDRS_SB_G2:
21768 case BFD_RELOC_ARM_LDC_SB_G0:
21769 case BFD_RELOC_ARM_LDC_SB_G1:
21770 case BFD_RELOC_ARM_LDC_SB_G2:
845b51d6 21771 case BFD_RELOC_ARM_V4BX:
c19d1205
ZW
21772 code = fixp->fx_r_type;
21773 break;
a737bd4d 21774
0855e32b 21775 case BFD_RELOC_ARM_TLS_GOTDESC:
c19d1205
ZW
21776 case BFD_RELOC_ARM_TLS_GD32:
21777 case BFD_RELOC_ARM_TLS_IE32:
21778 case BFD_RELOC_ARM_TLS_LDM32:
21779 /* BFD will include the symbol's address in the addend.
21780 But we don't want that, so subtract it out again here. */
21781 if (!S_IS_COMMON (fixp->fx_addsy))
21782 reloc->addend -= (*reloc->sym_ptr_ptr)->value;
21783 code = fixp->fx_r_type;
21784 break;
21785#endif
a737bd4d 21786
c19d1205
ZW
21787 case BFD_RELOC_ARM_IMMEDIATE:
21788 as_bad_where (fixp->fx_file, fixp->fx_line,
21789 _("internal relocation (type: IMMEDIATE) not fixed up"));
21790 return NULL;
a737bd4d 21791
c19d1205
ZW
21792 case BFD_RELOC_ARM_ADRL_IMMEDIATE:
21793 as_bad_where (fixp->fx_file, fixp->fx_line,
21794 _("ADRL used for a symbol not defined in the same file"));
21795 return NULL;
a737bd4d 21796
c19d1205 21797 case BFD_RELOC_ARM_OFFSET_IMM:
00a97672
RS
21798 if (section->use_rela_p)
21799 {
21800 code = fixp->fx_r_type;
21801 break;
21802 }
21803
c19d1205
ZW
21804 if (fixp->fx_addsy != NULL
21805 && !S_IS_DEFINED (fixp->fx_addsy)
21806 && S_IS_LOCAL (fixp->fx_addsy))
a737bd4d 21807 {
c19d1205
ZW
21808 as_bad_where (fixp->fx_file, fixp->fx_line,
21809 _("undefined local label `%s'"),
21810 S_GET_NAME (fixp->fx_addsy));
21811 return NULL;
a737bd4d
NC
21812 }
21813
c19d1205
ZW
21814 as_bad_where (fixp->fx_file, fixp->fx_line,
21815 _("internal_relocation (type: OFFSET_IMM) not fixed up"));
21816 return NULL;
a737bd4d 21817
c19d1205
ZW
21818 default:
21819 {
21820 char * type;
6c43fab6 21821
c19d1205
ZW
21822 switch (fixp->fx_r_type)
21823 {
21824 case BFD_RELOC_NONE: type = "NONE"; break;
21825 case BFD_RELOC_ARM_OFFSET_IMM8: type = "OFFSET_IMM8"; break;
21826 case BFD_RELOC_ARM_SHIFT_IMM: type = "SHIFT_IMM"; break;
3eb17e6b 21827 case BFD_RELOC_ARM_SMC: type = "SMC"; break;
c19d1205
ZW
21828 case BFD_RELOC_ARM_SWI: type = "SWI"; break;
21829 case BFD_RELOC_ARM_MULTI: type = "MULTI"; break;
21830 case BFD_RELOC_ARM_CP_OFF_IMM: type = "CP_OFF_IMM"; break;
db187cb9 21831 case BFD_RELOC_ARM_T32_OFFSET_IMM: type = "T32_OFFSET_IMM"; break;
8f06b2d8 21832 case BFD_RELOC_ARM_T32_CP_OFF_IMM: type = "T32_CP_OFF_IMM"; break;
c19d1205
ZW
21833 case BFD_RELOC_ARM_THUMB_ADD: type = "THUMB_ADD"; break;
21834 case BFD_RELOC_ARM_THUMB_SHIFT: type = "THUMB_SHIFT"; break;
21835 case BFD_RELOC_ARM_THUMB_IMM: type = "THUMB_IMM"; break;
21836 case BFD_RELOC_ARM_THUMB_OFFSET: type = "THUMB_OFFSET"; break;
21837 default: type = _("<unknown>"); break;
21838 }
21839 as_bad_where (fixp->fx_file, fixp->fx_line,
21840 _("cannot represent %s relocation in this object file format"),
21841 type);
21842 return NULL;
21843 }
a737bd4d 21844 }
6c43fab6 21845
c19d1205
ZW
21846#ifdef OBJ_ELF
21847 if ((code == BFD_RELOC_32_PCREL || code == BFD_RELOC_32)
21848 && GOT_symbol
21849 && fixp->fx_addsy == GOT_symbol)
21850 {
21851 code = BFD_RELOC_ARM_GOTPC;
21852 reloc->addend = fixp->fx_offset = reloc->address;
21853 }
21854#endif
6c43fab6 21855
c19d1205 21856 reloc->howto = bfd_reloc_type_lookup (stdoutput, code);
6c43fab6 21857
c19d1205
ZW
21858 if (reloc->howto == NULL)
21859 {
21860 as_bad_where (fixp->fx_file, fixp->fx_line,
21861 _("cannot represent %s relocation in this object file format"),
21862 bfd_get_reloc_code_name (code));
21863 return NULL;
21864 }
6c43fab6 21865
c19d1205
ZW
21866 /* HACK: Since arm ELF uses Rel instead of Rela, encode the
21867 vtable entry to be used in the relocation's section offset. */
21868 if (fixp->fx_r_type == BFD_RELOC_VTABLE_ENTRY)
21869 reloc->address = fixp->fx_offset;
6c43fab6 21870
c19d1205 21871 return reloc;
6c43fab6
RE
21872}
21873
c19d1205 21874/* This fix_new is called by cons via TC_CONS_FIX_NEW. */
6c43fab6 21875
c19d1205
ZW
21876void
21877cons_fix_new_arm (fragS * frag,
21878 int where,
21879 int size,
21880 expressionS * exp)
6c43fab6 21881{
c19d1205
ZW
21882 bfd_reloc_code_real_type type;
21883 int pcrel = 0;
6c43fab6 21884
c19d1205
ZW
21885 /* Pick a reloc.
21886 FIXME: @@ Should look at CPU word size. */
21887 switch (size)
21888 {
21889 case 1:
21890 type = BFD_RELOC_8;
21891 break;
21892 case 2:
21893 type = BFD_RELOC_16;
21894 break;
21895 case 4:
21896 default:
21897 type = BFD_RELOC_32;
21898 break;
21899 case 8:
21900 type = BFD_RELOC_64;
21901 break;
21902 }
6c43fab6 21903
f0927246
NC
21904#ifdef TE_PE
21905 if (exp->X_op == O_secrel)
21906 {
21907 exp->X_op = O_symbol;
21908 type = BFD_RELOC_32_SECREL;
21909 }
21910#endif
21911
c19d1205
ZW
21912 fix_new_exp (frag, where, (int) size, exp, pcrel, type);
21913}
6c43fab6 21914
4343666d 21915#if defined (OBJ_COFF)
c19d1205
ZW
21916void
21917arm_validate_fix (fixS * fixP)
6c43fab6 21918{
c19d1205
ZW
21919 /* If the destination of the branch is a defined symbol which does not have
21920 the THUMB_FUNC attribute, then we must be calling a function which has
21921 the (interfacearm) attribute. We look for the Thumb entry point to that
21922 function and change the branch to refer to that function instead. */
21923 if (fixP->fx_r_type == BFD_RELOC_THUMB_PCREL_BRANCH23
21924 && fixP->fx_addsy != NULL
21925 && S_IS_DEFINED (fixP->fx_addsy)
21926 && ! THUMB_IS_FUNC (fixP->fx_addsy))
6c43fab6 21927 {
c19d1205 21928 fixP->fx_addsy = find_real_start (fixP->fx_addsy);
6c43fab6 21929 }
c19d1205
ZW
21930}
21931#endif
6c43fab6 21932
267bf995 21933
c19d1205
ZW
21934int
21935arm_force_relocation (struct fix * fixp)
21936{
21937#if defined (OBJ_COFF) && defined (TE_PE)
21938 if (fixp->fx_r_type == BFD_RELOC_RVA)
21939 return 1;
21940#endif
6c43fab6 21941
267bf995
RR
21942 /* In case we have a call or a branch to a function in ARM ISA mode from
21943 a thumb function or vice-versa force the relocation. These relocations
21944 are cleared off for some cores that might have blx and simple transformations
21945 are possible. */
21946
21947#ifdef OBJ_ELF
21948 switch (fixp->fx_r_type)
21949 {
21950 case BFD_RELOC_ARM_PCREL_JUMP:
21951 case BFD_RELOC_ARM_PCREL_CALL:
21952 case BFD_RELOC_THUMB_PCREL_BLX:
21953 if (THUMB_IS_FUNC (fixp->fx_addsy))
21954 return 1;
21955 break;
21956
21957 case BFD_RELOC_ARM_PCREL_BLX:
21958 case BFD_RELOC_THUMB_PCREL_BRANCH25:
21959 case BFD_RELOC_THUMB_PCREL_BRANCH20:
21960 case BFD_RELOC_THUMB_PCREL_BRANCH23:
21961 if (ARM_IS_FUNC (fixp->fx_addsy))
21962 return 1;
21963 break;
21964
21965 default:
21966 break;
21967 }
21968#endif
21969
b5884301
PB
21970 /* Resolve these relocations even if the symbol is extern or weak.
21971 Technically this is probably wrong due to symbol preemption.
21972 In practice these relocations do not have enough range to be useful
21973 at dynamic link time, and some code (e.g. in the Linux kernel)
21974 expects these references to be resolved. */
c19d1205
ZW
21975 if (fixp->fx_r_type == BFD_RELOC_ARM_IMMEDIATE
21976 || fixp->fx_r_type == BFD_RELOC_ARM_OFFSET_IMM
b5884301 21977 || fixp->fx_r_type == BFD_RELOC_ARM_OFFSET_IMM8
0110f2b8 21978 || fixp->fx_r_type == BFD_RELOC_ARM_ADRL_IMMEDIATE
b5884301
PB
21979 || fixp->fx_r_type == BFD_RELOC_ARM_CP_OFF_IMM
21980 || fixp->fx_r_type == BFD_RELOC_ARM_CP_OFF_IMM_S2
21981 || fixp->fx_r_type == BFD_RELOC_ARM_THUMB_OFFSET
16805f35 21982 || fixp->fx_r_type == BFD_RELOC_ARM_T32_ADD_IMM
0110f2b8
PB
21983 || fixp->fx_r_type == BFD_RELOC_ARM_T32_IMMEDIATE
21984 || fixp->fx_r_type == BFD_RELOC_ARM_T32_IMM12
b5884301
PB
21985 || fixp->fx_r_type == BFD_RELOC_ARM_T32_OFFSET_IMM
21986 || fixp->fx_r_type == BFD_RELOC_ARM_T32_ADD_PC12
21987 || fixp->fx_r_type == BFD_RELOC_ARM_T32_CP_OFF_IMM
21988 || fixp->fx_r_type == BFD_RELOC_ARM_T32_CP_OFF_IMM_S2)
c19d1205 21989 return 0;
a737bd4d 21990
4962c51a
MS
21991 /* Always leave these relocations for the linker. */
21992 if ((fixp->fx_r_type >= BFD_RELOC_ARM_ALU_PC_G0_NC
21993 && fixp->fx_r_type <= BFD_RELOC_ARM_LDC_SB_G2)
21994 || fixp->fx_r_type == BFD_RELOC_ARM_LDR_PC_G0)
21995 return 1;
21996
f0291e4c
PB
21997 /* Always generate relocations against function symbols. */
21998 if (fixp->fx_r_type == BFD_RELOC_32
21999 && fixp->fx_addsy
22000 && (symbol_get_bfdsym (fixp->fx_addsy)->flags & BSF_FUNCTION))
22001 return 1;
22002
c19d1205 22003 return generic_force_reloc (fixp);
404ff6b5
AH
22004}
22005
0ffdc86c 22006#if defined (OBJ_ELF) || defined (OBJ_COFF)
e28387c3
PB
22007/* Relocations against function names must be left unadjusted,
22008 so that the linker can use this information to generate interworking
22009 stubs. The MIPS version of this function
c19d1205
ZW
22010 also prevents relocations that are mips-16 specific, but I do not
22011 know why it does this.
404ff6b5 22012
c19d1205
ZW
22013 FIXME:
22014 There is one other problem that ought to be addressed here, but
22015 which currently is not: Taking the address of a label (rather
22016 than a function) and then later jumping to that address. Such
22017 addresses also ought to have their bottom bit set (assuming that
22018 they reside in Thumb code), but at the moment they will not. */
404ff6b5 22019
c19d1205
ZW
22020bfd_boolean
22021arm_fix_adjustable (fixS * fixP)
404ff6b5 22022{
c19d1205
ZW
22023 if (fixP->fx_addsy == NULL)
22024 return 1;
404ff6b5 22025
e28387c3
PB
22026 /* Preserve relocations against symbols with function type. */
22027 if (symbol_get_bfdsym (fixP->fx_addsy)->flags & BSF_FUNCTION)
c921be7d 22028 return FALSE;
e28387c3 22029
c19d1205
ZW
22030 if (THUMB_IS_FUNC (fixP->fx_addsy)
22031 && fixP->fx_subsy == NULL)
c921be7d 22032 return FALSE;
a737bd4d 22033
c19d1205
ZW
22034 /* We need the symbol name for the VTABLE entries. */
22035 if ( fixP->fx_r_type == BFD_RELOC_VTABLE_INHERIT
22036 || fixP->fx_r_type == BFD_RELOC_VTABLE_ENTRY)
c921be7d 22037 return FALSE;
404ff6b5 22038
c19d1205
ZW
22039 /* Don't allow symbols to be discarded on GOT related relocs. */
22040 if (fixP->fx_r_type == BFD_RELOC_ARM_PLT32
22041 || fixP->fx_r_type == BFD_RELOC_ARM_GOT32
22042 || fixP->fx_r_type == BFD_RELOC_ARM_GOTOFF
22043 || fixP->fx_r_type == BFD_RELOC_ARM_TLS_GD32
22044 || fixP->fx_r_type == BFD_RELOC_ARM_TLS_LE32
22045 || fixP->fx_r_type == BFD_RELOC_ARM_TLS_IE32
22046 || fixP->fx_r_type == BFD_RELOC_ARM_TLS_LDM32
22047 || fixP->fx_r_type == BFD_RELOC_ARM_TLS_LDO32
0855e32b
NS
22048 || fixP->fx_r_type == BFD_RELOC_ARM_TLS_GOTDESC
22049 || fixP->fx_r_type == BFD_RELOC_ARM_TLS_CALL
22050 || fixP->fx_r_type == BFD_RELOC_ARM_THM_TLS_CALL
22051 || fixP->fx_r_type == BFD_RELOC_ARM_TLS_DESCSEQ
22052 || fixP->fx_r_type == BFD_RELOC_ARM_THM_TLS_DESCSEQ
c19d1205 22053 || fixP->fx_r_type == BFD_RELOC_ARM_TARGET2)
c921be7d 22054 return FALSE;
a737bd4d 22055
4962c51a
MS
22056 /* Similarly for group relocations. */
22057 if ((fixP->fx_r_type >= BFD_RELOC_ARM_ALU_PC_G0_NC
22058 && fixP->fx_r_type <= BFD_RELOC_ARM_LDC_SB_G2)
22059 || fixP->fx_r_type == BFD_RELOC_ARM_LDR_PC_G0)
c921be7d 22060 return FALSE;
4962c51a 22061
79947c54
CD
22062 /* MOVW/MOVT REL relocations have limited offsets, so keep the symbols. */
22063 if (fixP->fx_r_type == BFD_RELOC_ARM_MOVW
22064 || fixP->fx_r_type == BFD_RELOC_ARM_MOVT
22065 || fixP->fx_r_type == BFD_RELOC_ARM_MOVW_PCREL
22066 || fixP->fx_r_type == BFD_RELOC_ARM_MOVT_PCREL
22067 || fixP->fx_r_type == BFD_RELOC_ARM_THUMB_MOVW
22068 || fixP->fx_r_type == BFD_RELOC_ARM_THUMB_MOVT
22069 || fixP->fx_r_type == BFD_RELOC_ARM_THUMB_MOVW_PCREL
22070 || fixP->fx_r_type == BFD_RELOC_ARM_THUMB_MOVT_PCREL)
c921be7d 22071 return FALSE;
79947c54 22072
c921be7d 22073 return TRUE;
a737bd4d 22074}
0ffdc86c
NC
22075#endif /* defined (OBJ_ELF) || defined (OBJ_COFF) */
22076
22077#ifdef OBJ_ELF
404ff6b5 22078
c19d1205
ZW
22079const char *
22080elf32_arm_target_format (void)
404ff6b5 22081{
c19d1205
ZW
22082#ifdef TE_SYMBIAN
22083 return (target_big_endian
22084 ? "elf32-bigarm-symbian"
22085 : "elf32-littlearm-symbian");
22086#elif defined (TE_VXWORKS)
22087 return (target_big_endian
22088 ? "elf32-bigarm-vxworks"
22089 : "elf32-littlearm-vxworks");
22090#else
22091 if (target_big_endian)
22092 return "elf32-bigarm";
22093 else
22094 return "elf32-littlearm";
22095#endif
404ff6b5
AH
22096}
22097
c19d1205
ZW
22098void
22099armelf_frob_symbol (symbolS * symp,
22100 int * puntp)
404ff6b5 22101{
c19d1205
ZW
22102 elf_frob_symbol (symp, puntp);
22103}
22104#endif
404ff6b5 22105
c19d1205 22106/* MD interface: Finalization. */
a737bd4d 22107
c19d1205
ZW
22108void
22109arm_cleanup (void)
22110{
22111 literal_pool * pool;
a737bd4d 22112
e07e6e58
NC
22113 /* Ensure that all the IT blocks are properly closed. */
22114 check_it_blocks_finished ();
22115
c19d1205
ZW
22116 for (pool = list_of_pools; pool; pool = pool->next)
22117 {
5f4273c7 22118 /* Put it at the end of the relevant section. */
c19d1205
ZW
22119 subseg_set (pool->section, pool->sub_section);
22120#ifdef OBJ_ELF
22121 arm_elf_change_section ();
22122#endif
22123 s_ltorg (0);
22124 }
404ff6b5
AH
22125}
22126
cd000bff
DJ
22127#ifdef OBJ_ELF
22128/* Remove any excess mapping symbols generated for alignment frags in
22129 SEC. We may have created a mapping symbol before a zero byte
22130 alignment; remove it if there's a mapping symbol after the
22131 alignment. */
22132static void
22133check_mapping_symbols (bfd *abfd ATTRIBUTE_UNUSED, asection *sec,
22134 void *dummy ATTRIBUTE_UNUSED)
22135{
22136 segment_info_type *seginfo = seg_info (sec);
22137 fragS *fragp;
22138
22139 if (seginfo == NULL || seginfo->frchainP == NULL)
22140 return;
22141
22142 for (fragp = seginfo->frchainP->frch_root;
22143 fragp != NULL;
22144 fragp = fragp->fr_next)
22145 {
22146 symbolS *sym = fragp->tc_frag_data.last_map;
22147 fragS *next = fragp->fr_next;
22148
22149 /* Variable-sized frags have been converted to fixed size by
22150 this point. But if this was variable-sized to start with,
22151 there will be a fixed-size frag after it. So don't handle
22152 next == NULL. */
22153 if (sym == NULL || next == NULL)
22154 continue;
22155
22156 if (S_GET_VALUE (sym) < next->fr_address)
22157 /* Not at the end of this frag. */
22158 continue;
22159 know (S_GET_VALUE (sym) == next->fr_address);
22160
22161 do
22162 {
22163 if (next->tc_frag_data.first_map != NULL)
22164 {
22165 /* Next frag starts with a mapping symbol. Discard this
22166 one. */
22167 symbol_remove (sym, &symbol_rootP, &symbol_lastP);
22168 break;
22169 }
22170
22171 if (next->fr_next == NULL)
22172 {
22173 /* This mapping symbol is at the end of the section. Discard
22174 it. */
22175 know (next->fr_fix == 0 && next->fr_var == 0);
22176 symbol_remove (sym, &symbol_rootP, &symbol_lastP);
22177 break;
22178 }
22179
22180 /* As long as we have empty frags without any mapping symbols,
22181 keep looking. */
22182 /* If the next frag is non-empty and does not start with a
22183 mapping symbol, then this mapping symbol is required. */
22184 if (next->fr_address != next->fr_next->fr_address)
22185 break;
22186
22187 next = next->fr_next;
22188 }
22189 while (next != NULL);
22190 }
22191}
22192#endif
22193
c19d1205
ZW
22194/* Adjust the symbol table. This marks Thumb symbols as distinct from
22195 ARM ones. */
404ff6b5 22196
c19d1205
ZW
22197void
22198arm_adjust_symtab (void)
404ff6b5 22199{
c19d1205
ZW
22200#ifdef OBJ_COFF
22201 symbolS * sym;
404ff6b5 22202
c19d1205
ZW
22203 for (sym = symbol_rootP; sym != NULL; sym = symbol_next (sym))
22204 {
22205 if (ARM_IS_THUMB (sym))
22206 {
22207 if (THUMB_IS_FUNC (sym))
22208 {
22209 /* Mark the symbol as a Thumb function. */
22210 if ( S_GET_STORAGE_CLASS (sym) == C_STAT
22211 || S_GET_STORAGE_CLASS (sym) == C_LABEL) /* This can happen! */
22212 S_SET_STORAGE_CLASS (sym, C_THUMBSTATFUNC);
404ff6b5 22213
c19d1205
ZW
22214 else if (S_GET_STORAGE_CLASS (sym) == C_EXT)
22215 S_SET_STORAGE_CLASS (sym, C_THUMBEXTFUNC);
22216 else
22217 as_bad (_("%s: unexpected function type: %d"),
22218 S_GET_NAME (sym), S_GET_STORAGE_CLASS (sym));
22219 }
22220 else switch (S_GET_STORAGE_CLASS (sym))
22221 {
22222 case C_EXT:
22223 S_SET_STORAGE_CLASS (sym, C_THUMBEXT);
22224 break;
22225 case C_STAT:
22226 S_SET_STORAGE_CLASS (sym, C_THUMBSTAT);
22227 break;
22228 case C_LABEL:
22229 S_SET_STORAGE_CLASS (sym, C_THUMBLABEL);
22230 break;
22231 default:
22232 /* Do nothing. */
22233 break;
22234 }
22235 }
a737bd4d 22236
c19d1205
ZW
22237 if (ARM_IS_INTERWORK (sym))
22238 coffsymbol (symbol_get_bfdsym (sym))->native->u.syment.n_flags = 0xFF;
404ff6b5 22239 }
c19d1205
ZW
22240#endif
22241#ifdef OBJ_ELF
22242 symbolS * sym;
22243 char bind;
404ff6b5 22244
c19d1205 22245 for (sym = symbol_rootP; sym != NULL; sym = symbol_next (sym))
404ff6b5 22246 {
c19d1205
ZW
22247 if (ARM_IS_THUMB (sym))
22248 {
22249 elf_symbol_type * elf_sym;
404ff6b5 22250
c19d1205
ZW
22251 elf_sym = elf_symbol (symbol_get_bfdsym (sym));
22252 bind = ELF_ST_BIND (elf_sym->internal_elf_sym.st_info);
404ff6b5 22253
b0796911
PB
22254 if (! bfd_is_arm_special_symbol_name (elf_sym->symbol.name,
22255 BFD_ARM_SPECIAL_SYM_TYPE_ANY))
c19d1205
ZW
22256 {
22257 /* If it's a .thumb_func, declare it as so,
22258 otherwise tag label as .code 16. */
22259 if (THUMB_IS_FUNC (sym))
35fc36a8
RS
22260 elf_sym->internal_elf_sym.st_target_internal
22261 = ST_BRANCH_TO_THUMB;
3ba67470 22262 else if (EF_ARM_EABI_VERSION (meabi_flags) < EF_ARM_EABI_VER4)
c19d1205
ZW
22263 elf_sym->internal_elf_sym.st_info =
22264 ELF_ST_INFO (bind, STT_ARM_16BIT);
22265 }
22266 }
22267 }
cd000bff
DJ
22268
22269 /* Remove any overlapping mapping symbols generated by alignment frags. */
22270 bfd_map_over_sections (stdoutput, check_mapping_symbols, (char *) 0);
709001e9
MM
22271 /* Now do generic ELF adjustments. */
22272 elf_adjust_symtab ();
c19d1205 22273#endif
404ff6b5
AH
22274}
22275
c19d1205 22276/* MD interface: Initialization. */
404ff6b5 22277
a737bd4d 22278static void
c19d1205 22279set_constant_flonums (void)
a737bd4d 22280{
c19d1205 22281 int i;
404ff6b5 22282
c19d1205
ZW
22283 for (i = 0; i < NUM_FLOAT_VALS; i++)
22284 if (atof_ieee ((char *) fp_const[i], 'x', fp_values[i]) == NULL)
22285 abort ();
a737bd4d 22286}
404ff6b5 22287
3e9e4fcf
JB
22288/* Auto-select Thumb mode if it's the only available instruction set for the
22289 given architecture. */
22290
22291static void
22292autoselect_thumb_from_cpu_variant (void)
22293{
22294 if (!ARM_CPU_HAS_FEATURE (cpu_variant, arm_ext_v1))
22295 opcode_select (16);
22296}
22297
c19d1205
ZW
22298void
22299md_begin (void)
a737bd4d 22300{
c19d1205
ZW
22301 unsigned mach;
22302 unsigned int i;
404ff6b5 22303
c19d1205
ZW
22304 if ( (arm_ops_hsh = hash_new ()) == NULL
22305 || (arm_cond_hsh = hash_new ()) == NULL
22306 || (arm_shift_hsh = hash_new ()) == NULL
22307 || (arm_psr_hsh = hash_new ()) == NULL
62b3e311 22308 || (arm_v7m_psr_hsh = hash_new ()) == NULL
c19d1205 22309 || (arm_reg_hsh = hash_new ()) == NULL
62b3e311
PB
22310 || (arm_reloc_hsh = hash_new ()) == NULL
22311 || (arm_barrier_opt_hsh = hash_new ()) == NULL)
c19d1205
ZW
22312 as_fatal (_("virtual memory exhausted"));
22313
22314 for (i = 0; i < sizeof (insns) / sizeof (struct asm_opcode); i++)
d3ce72d0 22315 hash_insert (arm_ops_hsh, insns[i].template_name, (void *) (insns + i));
c19d1205 22316 for (i = 0; i < sizeof (conds) / sizeof (struct asm_cond); i++)
d3ce72d0 22317 hash_insert (arm_cond_hsh, conds[i].template_name, (void *) (conds + i));
c19d1205 22318 for (i = 0; i < sizeof (shift_names) / sizeof (struct asm_shift_name); i++)
5a49b8ac 22319 hash_insert (arm_shift_hsh, shift_names[i].name, (void *) (shift_names + i));
c19d1205 22320 for (i = 0; i < sizeof (psrs) / sizeof (struct asm_psr); i++)
d3ce72d0 22321 hash_insert (arm_psr_hsh, psrs[i].template_name, (void *) (psrs + i));
62b3e311 22322 for (i = 0; i < sizeof (v7m_psrs) / sizeof (struct asm_psr); i++)
d3ce72d0
NC
22323 hash_insert (arm_v7m_psr_hsh, v7m_psrs[i].template_name,
22324 (void *) (v7m_psrs + i));
c19d1205 22325 for (i = 0; i < sizeof (reg_names) / sizeof (struct reg_entry); i++)
5a49b8ac 22326 hash_insert (arm_reg_hsh, reg_names[i].name, (void *) (reg_names + i));
62b3e311
PB
22327 for (i = 0;
22328 i < sizeof (barrier_opt_names) / sizeof (struct asm_barrier_opt);
22329 i++)
d3ce72d0 22330 hash_insert (arm_barrier_opt_hsh, barrier_opt_names[i].template_name,
5a49b8ac 22331 (void *) (barrier_opt_names + i));
c19d1205
ZW
22332#ifdef OBJ_ELF
22333 for (i = 0; i < sizeof (reloc_names) / sizeof (struct reloc_entry); i++)
5a49b8ac 22334 hash_insert (arm_reloc_hsh, reloc_names[i].name, (void *) (reloc_names + i));
c19d1205
ZW
22335#endif
22336
22337 set_constant_flonums ();
404ff6b5 22338
c19d1205
ZW
22339 /* Set the cpu variant based on the command-line options. We prefer
22340 -mcpu= over -march= if both are set (as for GCC); and we prefer
22341 -mfpu= over any other way of setting the floating point unit.
22342 Use of legacy options with new options are faulted. */
e74cfd16 22343 if (legacy_cpu)
404ff6b5 22344 {
e74cfd16 22345 if (mcpu_cpu_opt || march_cpu_opt)
c19d1205
ZW
22346 as_bad (_("use of old and new-style options to set CPU type"));
22347
22348 mcpu_cpu_opt = legacy_cpu;
404ff6b5 22349 }
e74cfd16 22350 else if (!mcpu_cpu_opt)
c19d1205 22351 mcpu_cpu_opt = march_cpu_opt;
404ff6b5 22352
e74cfd16 22353 if (legacy_fpu)
c19d1205 22354 {
e74cfd16 22355 if (mfpu_opt)
c19d1205 22356 as_bad (_("use of old and new-style options to set FPU type"));
03b1477f
RE
22357
22358 mfpu_opt = legacy_fpu;
22359 }
e74cfd16 22360 else if (!mfpu_opt)
03b1477f 22361 {
45eb4c1b
NS
22362#if !(defined (EABI_DEFAULT) || defined (TE_LINUX) \
22363 || defined (TE_NetBSD) || defined (TE_VXWORKS))
39c2da32
RE
22364 /* Some environments specify a default FPU. If they don't, infer it
22365 from the processor. */
e74cfd16 22366 if (mcpu_fpu_opt)
03b1477f
RE
22367 mfpu_opt = mcpu_fpu_opt;
22368 else
22369 mfpu_opt = march_fpu_opt;
39c2da32 22370#else
e74cfd16 22371 mfpu_opt = &fpu_default;
39c2da32 22372#endif
03b1477f
RE
22373 }
22374
e74cfd16 22375 if (!mfpu_opt)
03b1477f 22376 {
493cb6ef 22377 if (mcpu_cpu_opt != NULL)
e74cfd16 22378 mfpu_opt = &fpu_default;
493cb6ef 22379 else if (mcpu_fpu_opt != NULL && ARM_CPU_HAS_FEATURE (*mcpu_fpu_opt, arm_ext_v5))
e74cfd16 22380 mfpu_opt = &fpu_arch_vfp_v2;
03b1477f 22381 else
e74cfd16 22382 mfpu_opt = &fpu_arch_fpa;
03b1477f
RE
22383 }
22384
ee065d83 22385#ifdef CPU_DEFAULT
e74cfd16 22386 if (!mcpu_cpu_opt)
ee065d83 22387 {
e74cfd16
PB
22388 mcpu_cpu_opt = &cpu_default;
22389 selected_cpu = cpu_default;
ee065d83 22390 }
e74cfd16
PB
22391#else
22392 if (mcpu_cpu_opt)
22393 selected_cpu = *mcpu_cpu_opt;
ee065d83 22394 else
e74cfd16 22395 mcpu_cpu_opt = &arm_arch_any;
ee065d83 22396#endif
03b1477f 22397
e74cfd16 22398 ARM_MERGE_FEATURE_SETS (cpu_variant, *mcpu_cpu_opt, *mfpu_opt);
03b1477f 22399
3e9e4fcf
JB
22400 autoselect_thumb_from_cpu_variant ();
22401
e74cfd16 22402 arm_arch_used = thumb_arch_used = arm_arch_none;
ee065d83 22403
f17c130b 22404#if defined OBJ_COFF || defined OBJ_ELF
b99bd4ef 22405 {
7cc69913
NC
22406 unsigned int flags = 0;
22407
22408#if defined OBJ_ELF
22409 flags = meabi_flags;
d507cf36
PB
22410
22411 switch (meabi_flags)
33a392fb 22412 {
d507cf36 22413 case EF_ARM_EABI_UNKNOWN:
7cc69913 22414#endif
d507cf36
PB
22415 /* Set the flags in the private structure. */
22416 if (uses_apcs_26) flags |= F_APCS26;
22417 if (support_interwork) flags |= F_INTERWORK;
22418 if (uses_apcs_float) flags |= F_APCS_FLOAT;
c19d1205 22419 if (pic_code) flags |= F_PIC;
e74cfd16 22420 if (!ARM_CPU_HAS_FEATURE (cpu_variant, fpu_any_hard))
7cc69913
NC
22421 flags |= F_SOFT_FLOAT;
22422
d507cf36
PB
22423 switch (mfloat_abi_opt)
22424 {
22425 case ARM_FLOAT_ABI_SOFT:
22426 case ARM_FLOAT_ABI_SOFTFP:
22427 flags |= F_SOFT_FLOAT;
22428 break;
33a392fb 22429
d507cf36
PB
22430 case ARM_FLOAT_ABI_HARD:
22431 if (flags & F_SOFT_FLOAT)
22432 as_bad (_("hard-float conflicts with specified fpu"));
22433 break;
22434 }
03b1477f 22435
e74cfd16
PB
22436 /* Using pure-endian doubles (even if soft-float). */
22437 if (ARM_CPU_HAS_FEATURE (cpu_variant, fpu_endian_pure))
7cc69913 22438 flags |= F_VFP_FLOAT;
f17c130b 22439
fde78edd 22440#if defined OBJ_ELF
e74cfd16 22441 if (ARM_CPU_HAS_FEATURE (cpu_variant, fpu_arch_maverick))
d507cf36 22442 flags |= EF_ARM_MAVERICK_FLOAT;
d507cf36
PB
22443 break;
22444
8cb51566 22445 case EF_ARM_EABI_VER4:
3a4a14e9 22446 case EF_ARM_EABI_VER5:
c19d1205 22447 /* No additional flags to set. */
d507cf36
PB
22448 break;
22449
22450 default:
22451 abort ();
22452 }
7cc69913 22453#endif
b99bd4ef
NC
22454 bfd_set_private_flags (stdoutput, flags);
22455
22456 /* We have run out flags in the COFF header to encode the
22457 status of ATPCS support, so instead we create a dummy,
c19d1205 22458 empty, debug section called .arm.atpcs. */
b99bd4ef
NC
22459 if (atpcs)
22460 {
22461 asection * sec;
22462
22463 sec = bfd_make_section (stdoutput, ".arm.atpcs");
22464
22465 if (sec != NULL)
22466 {
22467 bfd_set_section_flags
22468 (stdoutput, sec, SEC_READONLY | SEC_DEBUGGING /* | SEC_HAS_CONTENTS */);
22469 bfd_set_section_size (stdoutput, sec, 0);
22470 bfd_set_section_contents (stdoutput, sec, NULL, 0, 0);
22471 }
22472 }
7cc69913 22473 }
f17c130b 22474#endif
b99bd4ef
NC
22475
22476 /* Record the CPU type as well. */
2d447fca
JM
22477 if (ARM_CPU_HAS_FEATURE (cpu_variant, arm_cext_iwmmxt2))
22478 mach = bfd_mach_arm_iWMMXt2;
22479 else if (ARM_CPU_HAS_FEATURE (cpu_variant, arm_cext_iwmmxt))
e16bb312 22480 mach = bfd_mach_arm_iWMMXt;
e74cfd16 22481 else if (ARM_CPU_HAS_FEATURE (cpu_variant, arm_cext_xscale))
b99bd4ef 22482 mach = bfd_mach_arm_XScale;
e74cfd16 22483 else if (ARM_CPU_HAS_FEATURE (cpu_variant, arm_cext_maverick))
fde78edd 22484 mach = bfd_mach_arm_ep9312;
e74cfd16 22485 else if (ARM_CPU_HAS_FEATURE (cpu_variant, arm_ext_v5e))
b99bd4ef 22486 mach = bfd_mach_arm_5TE;
e74cfd16 22487 else if (ARM_CPU_HAS_FEATURE (cpu_variant, arm_ext_v5))
b99bd4ef 22488 {
e74cfd16 22489 if (ARM_CPU_HAS_FEATURE (cpu_variant, arm_ext_v4t))
b99bd4ef
NC
22490 mach = bfd_mach_arm_5T;
22491 else
22492 mach = bfd_mach_arm_5;
22493 }
e74cfd16 22494 else if (ARM_CPU_HAS_FEATURE (cpu_variant, arm_ext_v4))
b99bd4ef 22495 {
e74cfd16 22496 if (ARM_CPU_HAS_FEATURE (cpu_variant, arm_ext_v4t))
b99bd4ef
NC
22497 mach = bfd_mach_arm_4T;
22498 else
22499 mach = bfd_mach_arm_4;
22500 }
e74cfd16 22501 else if (ARM_CPU_HAS_FEATURE (cpu_variant, arm_ext_v3m))
b99bd4ef 22502 mach = bfd_mach_arm_3M;
e74cfd16
PB
22503 else if (ARM_CPU_HAS_FEATURE (cpu_variant, arm_ext_v3))
22504 mach = bfd_mach_arm_3;
22505 else if (ARM_CPU_HAS_FEATURE (cpu_variant, arm_ext_v2s))
22506 mach = bfd_mach_arm_2a;
22507 else if (ARM_CPU_HAS_FEATURE (cpu_variant, arm_ext_v2))
22508 mach = bfd_mach_arm_2;
22509 else
22510 mach = bfd_mach_arm_unknown;
b99bd4ef
NC
22511
22512 bfd_set_arch_mach (stdoutput, TARGET_ARCH, mach);
22513}
22514
c19d1205 22515/* Command line processing. */
b99bd4ef 22516
c19d1205
ZW
22517/* md_parse_option
22518 Invocation line includes a switch not recognized by the base assembler.
22519 See if it's a processor-specific option.
b99bd4ef 22520
c19d1205
ZW
22521 This routine is somewhat complicated by the need for backwards
22522 compatibility (since older releases of gcc can't be changed).
22523 The new options try to make the interface as compatible as
22524 possible with GCC.
b99bd4ef 22525
c19d1205 22526 New options (supported) are:
b99bd4ef 22527
c19d1205
ZW
22528 -mcpu=<cpu name> Assemble for selected processor
22529 -march=<architecture name> Assemble for selected architecture
22530 -mfpu=<fpu architecture> Assemble for selected FPU.
22531 -EB/-mbig-endian Big-endian
22532 -EL/-mlittle-endian Little-endian
22533 -k Generate PIC code
22534 -mthumb Start in Thumb mode
22535 -mthumb-interwork Code supports ARM/Thumb interworking
b99bd4ef 22536
278df34e 22537 -m[no-]warn-deprecated Warn about deprecated features
267bf995 22538
c19d1205 22539 For now we will also provide support for:
b99bd4ef 22540
c19d1205
ZW
22541 -mapcs-32 32-bit Program counter
22542 -mapcs-26 26-bit Program counter
22543 -macps-float Floats passed in FP registers
22544 -mapcs-reentrant Reentrant code
22545 -matpcs
22546 (sometime these will probably be replaced with -mapcs=<list of options>
22547 and -matpcs=<list of options>)
b99bd4ef 22548
c19d1205
ZW
22549 The remaining options are only supported for back-wards compatibility.
22550 Cpu variants, the arm part is optional:
22551 -m[arm]1 Currently not supported.
22552 -m[arm]2, -m[arm]250 Arm 2 and Arm 250 processor
22553 -m[arm]3 Arm 3 processor
22554 -m[arm]6[xx], Arm 6 processors
22555 -m[arm]7[xx][t][[d]m] Arm 7 processors
22556 -m[arm]8[10] Arm 8 processors
22557 -m[arm]9[20][tdmi] Arm 9 processors
22558 -mstrongarm[110[0]] StrongARM processors
22559 -mxscale XScale processors
22560 -m[arm]v[2345[t[e]]] Arm architectures
22561 -mall All (except the ARM1)
22562 FP variants:
22563 -mfpa10, -mfpa11 FPA10 and 11 co-processor instructions
22564 -mfpe-old (No float load/store multiples)
22565 -mvfpxd VFP Single precision
22566 -mvfp All VFP
22567 -mno-fpu Disable all floating point instructions
b99bd4ef 22568
c19d1205
ZW
22569 The following CPU names are recognized:
22570 arm1, arm2, arm250, arm3, arm6, arm600, arm610, arm620,
22571 arm7, arm7m, arm7d, arm7dm, arm7di, arm7dmi, arm70, arm700,
22572 arm700i, arm710 arm710t, arm720, arm720t, arm740t, arm710c,
22573 arm7100, arm7500, arm7500fe, arm7tdmi, arm8, arm810, arm9,
22574 arm920, arm920t, arm940t, arm946, arm966, arm9tdmi, arm9e,
22575 arm10t arm10e, arm1020t, arm1020e, arm10200e,
22576 strongarm, strongarm110, strongarm1100, strongarm1110, xscale.
b99bd4ef 22577
c19d1205 22578 */
b99bd4ef 22579
c19d1205 22580const char * md_shortopts = "m:k";
b99bd4ef 22581
c19d1205
ZW
22582#ifdef ARM_BI_ENDIAN
22583#define OPTION_EB (OPTION_MD_BASE + 0)
22584#define OPTION_EL (OPTION_MD_BASE + 1)
b99bd4ef 22585#else
c19d1205
ZW
22586#if TARGET_BYTES_BIG_ENDIAN
22587#define OPTION_EB (OPTION_MD_BASE + 0)
b99bd4ef 22588#else
c19d1205
ZW
22589#define OPTION_EL (OPTION_MD_BASE + 1)
22590#endif
b99bd4ef 22591#endif
845b51d6 22592#define OPTION_FIX_V4BX (OPTION_MD_BASE + 2)
b99bd4ef 22593
c19d1205 22594struct option md_longopts[] =
b99bd4ef 22595{
c19d1205
ZW
22596#ifdef OPTION_EB
22597 {"EB", no_argument, NULL, OPTION_EB},
22598#endif
22599#ifdef OPTION_EL
22600 {"EL", no_argument, NULL, OPTION_EL},
b99bd4ef 22601#endif
845b51d6 22602 {"fix-v4bx", no_argument, NULL, OPTION_FIX_V4BX},
c19d1205
ZW
22603 {NULL, no_argument, NULL, 0}
22604};
b99bd4ef 22605
c19d1205 22606size_t md_longopts_size = sizeof (md_longopts);
b99bd4ef 22607
c19d1205 22608struct arm_option_table
b99bd4ef 22609{
c19d1205
ZW
22610 char *option; /* Option name to match. */
22611 char *help; /* Help information. */
22612 int *var; /* Variable to change. */
22613 int value; /* What to change it to. */
22614 char *deprecated; /* If non-null, print this message. */
22615};
b99bd4ef 22616
c19d1205
ZW
22617struct arm_option_table arm_opts[] =
22618{
22619 {"k", N_("generate PIC code"), &pic_code, 1, NULL},
22620 {"mthumb", N_("assemble Thumb code"), &thumb_mode, 1, NULL},
22621 {"mthumb-interwork", N_("support ARM/Thumb interworking"),
22622 &support_interwork, 1, NULL},
22623 {"mapcs-32", N_("code uses 32-bit program counter"), &uses_apcs_26, 0, NULL},
22624 {"mapcs-26", N_("code uses 26-bit program counter"), &uses_apcs_26, 1, NULL},
22625 {"mapcs-float", N_("floating point args are in fp regs"), &uses_apcs_float,
22626 1, NULL},
22627 {"mapcs-reentrant", N_("re-entrant code"), &pic_code, 1, NULL},
22628 {"matpcs", N_("code is ATPCS conformant"), &atpcs, 1, NULL},
22629 {"mbig-endian", N_("assemble for big-endian"), &target_big_endian, 1, NULL},
22630 {"mlittle-endian", N_("assemble for little-endian"), &target_big_endian, 0,
22631 NULL},
b99bd4ef 22632
c19d1205
ZW
22633 /* These are recognized by the assembler, but have no affect on code. */
22634 {"mapcs-frame", N_("use frame pointer"), NULL, 0, NULL},
22635 {"mapcs-stack-check", N_("use stack size checking"), NULL, 0, NULL},
278df34e
NS
22636
22637 {"mwarn-deprecated", NULL, &warn_on_deprecated, 1, NULL},
22638 {"mno-warn-deprecated", N_("do not warn on use of deprecated feature"),
22639 &warn_on_deprecated, 0, NULL},
e74cfd16
PB
22640 {NULL, NULL, NULL, 0, NULL}
22641};
22642
22643struct arm_legacy_option_table
22644{
22645 char *option; /* Option name to match. */
22646 const arm_feature_set **var; /* Variable to change. */
22647 const arm_feature_set value; /* What to change it to. */
22648 char *deprecated; /* If non-null, print this message. */
22649};
b99bd4ef 22650
e74cfd16
PB
22651const struct arm_legacy_option_table arm_legacy_opts[] =
22652{
c19d1205
ZW
22653 /* DON'T add any new processors to this list -- we want the whole list
22654 to go away... Add them to the processors table instead. */
e74cfd16
PB
22655 {"marm1", &legacy_cpu, ARM_ARCH_V1, N_("use -mcpu=arm1")},
22656 {"m1", &legacy_cpu, ARM_ARCH_V1, N_("use -mcpu=arm1")},
22657 {"marm2", &legacy_cpu, ARM_ARCH_V2, N_("use -mcpu=arm2")},
22658 {"m2", &legacy_cpu, ARM_ARCH_V2, N_("use -mcpu=arm2")},
22659 {"marm250", &legacy_cpu, ARM_ARCH_V2S, N_("use -mcpu=arm250")},
22660 {"m250", &legacy_cpu, ARM_ARCH_V2S, N_("use -mcpu=arm250")},
22661 {"marm3", &legacy_cpu, ARM_ARCH_V2S, N_("use -mcpu=arm3")},
22662 {"m3", &legacy_cpu, ARM_ARCH_V2S, N_("use -mcpu=arm3")},
22663 {"marm6", &legacy_cpu, ARM_ARCH_V3, N_("use -mcpu=arm6")},
22664 {"m6", &legacy_cpu, ARM_ARCH_V3, N_("use -mcpu=arm6")},
22665 {"marm600", &legacy_cpu, ARM_ARCH_V3, N_("use -mcpu=arm600")},
22666 {"m600", &legacy_cpu, ARM_ARCH_V3, N_("use -mcpu=arm600")},
22667 {"marm610", &legacy_cpu, ARM_ARCH_V3, N_("use -mcpu=arm610")},
22668 {"m610", &legacy_cpu, ARM_ARCH_V3, N_("use -mcpu=arm610")},
22669 {"marm620", &legacy_cpu, ARM_ARCH_V3, N_("use -mcpu=arm620")},
22670 {"m620", &legacy_cpu, ARM_ARCH_V3, N_("use -mcpu=arm620")},
22671 {"marm7", &legacy_cpu, ARM_ARCH_V3, N_("use -mcpu=arm7")},
22672 {"m7", &legacy_cpu, ARM_ARCH_V3, N_("use -mcpu=arm7")},
22673 {"marm70", &legacy_cpu, ARM_ARCH_V3, N_("use -mcpu=arm70")},
22674 {"m70", &legacy_cpu, ARM_ARCH_V3, N_("use -mcpu=arm70")},
22675 {"marm700", &legacy_cpu, ARM_ARCH_V3, N_("use -mcpu=arm700")},
22676 {"m700", &legacy_cpu, ARM_ARCH_V3, N_("use -mcpu=arm700")},
22677 {"marm700i", &legacy_cpu, ARM_ARCH_V3, N_("use -mcpu=arm700i")},
22678 {"m700i", &legacy_cpu, ARM_ARCH_V3, N_("use -mcpu=arm700i")},
22679 {"marm710", &legacy_cpu, ARM_ARCH_V3, N_("use -mcpu=arm710")},
22680 {"m710", &legacy_cpu, ARM_ARCH_V3, N_("use -mcpu=arm710")},
22681 {"marm710c", &legacy_cpu, ARM_ARCH_V3, N_("use -mcpu=arm710c")},
22682 {"m710c", &legacy_cpu, ARM_ARCH_V3, N_("use -mcpu=arm710c")},
22683 {"marm720", &legacy_cpu, ARM_ARCH_V3, N_("use -mcpu=arm720")},
22684 {"m720", &legacy_cpu, ARM_ARCH_V3, N_("use -mcpu=arm720")},
22685 {"marm7d", &legacy_cpu, ARM_ARCH_V3, N_("use -mcpu=arm7d")},
22686 {"m7d", &legacy_cpu, ARM_ARCH_V3, N_("use -mcpu=arm7d")},
22687 {"marm7di", &legacy_cpu, ARM_ARCH_V3, N_("use -mcpu=arm7di")},
22688 {"m7di", &legacy_cpu, ARM_ARCH_V3, N_("use -mcpu=arm7di")},
22689 {"marm7m", &legacy_cpu, ARM_ARCH_V3M, N_("use -mcpu=arm7m")},
22690 {"m7m", &legacy_cpu, ARM_ARCH_V3M, N_("use -mcpu=arm7m")},
22691 {"marm7dm", &legacy_cpu, ARM_ARCH_V3M, N_("use -mcpu=arm7dm")},
22692 {"m7dm", &legacy_cpu, ARM_ARCH_V3M, N_("use -mcpu=arm7dm")},
22693 {"marm7dmi", &legacy_cpu, ARM_ARCH_V3M, N_("use -mcpu=arm7dmi")},
22694 {"m7dmi", &legacy_cpu, ARM_ARCH_V3M, N_("use -mcpu=arm7dmi")},
22695 {"marm7100", &legacy_cpu, ARM_ARCH_V3, N_("use -mcpu=arm7100")},
22696 {"m7100", &legacy_cpu, ARM_ARCH_V3, N_("use -mcpu=arm7100")},
22697 {"marm7500", &legacy_cpu, ARM_ARCH_V3, N_("use -mcpu=arm7500")},
22698 {"m7500", &legacy_cpu, ARM_ARCH_V3, N_("use -mcpu=arm7500")},
22699 {"marm7500fe", &legacy_cpu, ARM_ARCH_V3, N_("use -mcpu=arm7500fe")},
22700 {"m7500fe", &legacy_cpu, ARM_ARCH_V3, N_("use -mcpu=arm7500fe")},
22701 {"marm7t", &legacy_cpu, ARM_ARCH_V4T, N_("use -mcpu=arm7tdmi")},
22702 {"m7t", &legacy_cpu, ARM_ARCH_V4T, N_("use -mcpu=arm7tdmi")},
22703 {"marm7tdmi", &legacy_cpu, ARM_ARCH_V4T, N_("use -mcpu=arm7tdmi")},
22704 {"m7tdmi", &legacy_cpu, ARM_ARCH_V4T, N_("use -mcpu=arm7tdmi")},
22705 {"marm710t", &legacy_cpu, ARM_ARCH_V4T, N_("use -mcpu=arm710t")},
22706 {"m710t", &legacy_cpu, ARM_ARCH_V4T, N_("use -mcpu=arm710t")},
22707 {"marm720t", &legacy_cpu, ARM_ARCH_V4T, N_("use -mcpu=arm720t")},
22708 {"m720t", &legacy_cpu, ARM_ARCH_V4T, N_("use -mcpu=arm720t")},
22709 {"marm740t", &legacy_cpu, ARM_ARCH_V4T, N_("use -mcpu=arm740t")},
22710 {"m740t", &legacy_cpu, ARM_ARCH_V4T, N_("use -mcpu=arm740t")},
22711 {"marm8", &legacy_cpu, ARM_ARCH_V4, N_("use -mcpu=arm8")},
22712 {"m8", &legacy_cpu, ARM_ARCH_V4, N_("use -mcpu=arm8")},
22713 {"marm810", &legacy_cpu, ARM_ARCH_V4, N_("use -mcpu=arm810")},
22714 {"m810", &legacy_cpu, ARM_ARCH_V4, N_("use -mcpu=arm810")},
22715 {"marm9", &legacy_cpu, ARM_ARCH_V4T, N_("use -mcpu=arm9")},
22716 {"m9", &legacy_cpu, ARM_ARCH_V4T, N_("use -mcpu=arm9")},
22717 {"marm9tdmi", &legacy_cpu, ARM_ARCH_V4T, N_("use -mcpu=arm9tdmi")},
22718 {"m9tdmi", &legacy_cpu, ARM_ARCH_V4T, N_("use -mcpu=arm9tdmi")},
22719 {"marm920", &legacy_cpu, ARM_ARCH_V4T, N_("use -mcpu=arm920")},
22720 {"m920", &legacy_cpu, ARM_ARCH_V4T, N_("use -mcpu=arm920")},
22721 {"marm940", &legacy_cpu, ARM_ARCH_V4T, N_("use -mcpu=arm940")},
22722 {"m940", &legacy_cpu, ARM_ARCH_V4T, N_("use -mcpu=arm940")},
22723 {"mstrongarm", &legacy_cpu, ARM_ARCH_V4, N_("use -mcpu=strongarm")},
22724 {"mstrongarm110", &legacy_cpu, ARM_ARCH_V4,
c19d1205 22725 N_("use -mcpu=strongarm110")},
e74cfd16 22726 {"mstrongarm1100", &legacy_cpu, ARM_ARCH_V4,
c19d1205 22727 N_("use -mcpu=strongarm1100")},
e74cfd16 22728 {"mstrongarm1110", &legacy_cpu, ARM_ARCH_V4,
c19d1205 22729 N_("use -mcpu=strongarm1110")},
e74cfd16
PB
22730 {"mxscale", &legacy_cpu, ARM_ARCH_XSCALE, N_("use -mcpu=xscale")},
22731 {"miwmmxt", &legacy_cpu, ARM_ARCH_IWMMXT, N_("use -mcpu=iwmmxt")},
22732 {"mall", &legacy_cpu, ARM_ANY, N_("use -mcpu=all")},
7ed4c4c5 22733
c19d1205 22734 /* Architecture variants -- don't add any more to this list either. */
e74cfd16
PB
22735 {"mv2", &legacy_cpu, ARM_ARCH_V2, N_("use -march=armv2")},
22736 {"marmv2", &legacy_cpu, ARM_ARCH_V2, N_("use -march=armv2")},
22737 {"mv2a", &legacy_cpu, ARM_ARCH_V2S, N_("use -march=armv2a")},
22738 {"marmv2a", &legacy_cpu, ARM_ARCH_V2S, N_("use -march=armv2a")},
22739 {"mv3", &legacy_cpu, ARM_ARCH_V3, N_("use -march=armv3")},
22740 {"marmv3", &legacy_cpu, ARM_ARCH_V3, N_("use -march=armv3")},
22741 {"mv3m", &legacy_cpu, ARM_ARCH_V3M, N_("use -march=armv3m")},
22742 {"marmv3m", &legacy_cpu, ARM_ARCH_V3M, N_("use -march=armv3m")},
22743 {"mv4", &legacy_cpu, ARM_ARCH_V4, N_("use -march=armv4")},
22744 {"marmv4", &legacy_cpu, ARM_ARCH_V4, N_("use -march=armv4")},
22745 {"mv4t", &legacy_cpu, ARM_ARCH_V4T, N_("use -march=armv4t")},
22746 {"marmv4t", &legacy_cpu, ARM_ARCH_V4T, N_("use -march=armv4t")},
22747 {"mv5", &legacy_cpu, ARM_ARCH_V5, N_("use -march=armv5")},
22748 {"marmv5", &legacy_cpu, ARM_ARCH_V5, N_("use -march=armv5")},
22749 {"mv5t", &legacy_cpu, ARM_ARCH_V5T, N_("use -march=armv5t")},
22750 {"marmv5t", &legacy_cpu, ARM_ARCH_V5T, N_("use -march=armv5t")},
22751 {"mv5e", &legacy_cpu, ARM_ARCH_V5TE, N_("use -march=armv5te")},
22752 {"marmv5e", &legacy_cpu, ARM_ARCH_V5TE, N_("use -march=armv5te")},
7ed4c4c5 22753
c19d1205 22754 /* Floating point variants -- don't add any more to this list either. */
e74cfd16
PB
22755 {"mfpe-old", &legacy_fpu, FPU_ARCH_FPE, N_("use -mfpu=fpe")},
22756 {"mfpa10", &legacy_fpu, FPU_ARCH_FPA, N_("use -mfpu=fpa10")},
22757 {"mfpa11", &legacy_fpu, FPU_ARCH_FPA, N_("use -mfpu=fpa11")},
22758 {"mno-fpu", &legacy_fpu, ARM_ARCH_NONE,
c19d1205 22759 N_("use either -mfpu=softfpa or -mfpu=softvfp")},
7ed4c4c5 22760
e74cfd16 22761 {NULL, NULL, ARM_ARCH_NONE, NULL}
c19d1205 22762};
7ed4c4c5 22763
c19d1205 22764struct arm_cpu_option_table
7ed4c4c5 22765{
c19d1205 22766 char *name;
e74cfd16 22767 const arm_feature_set value;
c19d1205
ZW
22768 /* For some CPUs we assume an FPU unless the user explicitly sets
22769 -mfpu=... */
e74cfd16 22770 const arm_feature_set default_fpu;
ee065d83
PB
22771 /* The canonical name of the CPU, or NULL to use NAME converted to upper
22772 case. */
22773 const char *canonical_name;
c19d1205 22774};
7ed4c4c5 22775
c19d1205
ZW
22776/* This list should, at a minimum, contain all the cpu names
22777 recognized by GCC. */
e74cfd16 22778static const struct arm_cpu_option_table arm_cpus[] =
c19d1205 22779{
ee065d83
PB
22780 {"all", ARM_ANY, FPU_ARCH_FPA, NULL},
22781 {"arm1", ARM_ARCH_V1, FPU_ARCH_FPA, NULL},
22782 {"arm2", ARM_ARCH_V2, FPU_ARCH_FPA, NULL},
22783 {"arm250", ARM_ARCH_V2S, FPU_ARCH_FPA, NULL},
22784 {"arm3", ARM_ARCH_V2S, FPU_ARCH_FPA, NULL},
22785 {"arm6", ARM_ARCH_V3, FPU_ARCH_FPA, NULL},
22786 {"arm60", ARM_ARCH_V3, FPU_ARCH_FPA, NULL},
22787 {"arm600", ARM_ARCH_V3, FPU_ARCH_FPA, NULL},
22788 {"arm610", ARM_ARCH_V3, FPU_ARCH_FPA, NULL},
22789 {"arm620", ARM_ARCH_V3, FPU_ARCH_FPA, NULL},
22790 {"arm7", ARM_ARCH_V3, FPU_ARCH_FPA, NULL},
22791 {"arm7m", ARM_ARCH_V3M, FPU_ARCH_FPA, NULL},
22792 {"arm7d", ARM_ARCH_V3, FPU_ARCH_FPA, NULL},
22793 {"arm7dm", ARM_ARCH_V3M, FPU_ARCH_FPA, NULL},
22794 {"arm7di", ARM_ARCH_V3, FPU_ARCH_FPA, NULL},
22795 {"arm7dmi", ARM_ARCH_V3M, FPU_ARCH_FPA, NULL},
22796 {"arm70", ARM_ARCH_V3, FPU_ARCH_FPA, NULL},
22797 {"arm700", ARM_ARCH_V3, FPU_ARCH_FPA, NULL},
22798 {"arm700i", ARM_ARCH_V3, FPU_ARCH_FPA, NULL},
22799 {"arm710", ARM_ARCH_V3, FPU_ARCH_FPA, NULL},
22800 {"arm710t", ARM_ARCH_V4T, FPU_ARCH_FPA, NULL},
22801 {"arm720", ARM_ARCH_V3, FPU_ARCH_FPA, NULL},
22802 {"arm720t", ARM_ARCH_V4T, FPU_ARCH_FPA, NULL},
22803 {"arm740t", ARM_ARCH_V4T, FPU_ARCH_FPA, NULL},
22804 {"arm710c", ARM_ARCH_V3, FPU_ARCH_FPA, NULL},
22805 {"arm7100", ARM_ARCH_V3, FPU_ARCH_FPA, NULL},
22806 {"arm7500", ARM_ARCH_V3, FPU_ARCH_FPA, NULL},
22807 {"arm7500fe", ARM_ARCH_V3, FPU_ARCH_FPA, NULL},
22808 {"arm7t", ARM_ARCH_V4T, FPU_ARCH_FPA, NULL},
22809 {"arm7tdmi", ARM_ARCH_V4T, FPU_ARCH_FPA, NULL},
22810 {"arm7tdmi-s", ARM_ARCH_V4T, FPU_ARCH_FPA, NULL},
22811 {"arm8", ARM_ARCH_V4, FPU_ARCH_FPA, NULL},
22812 {"arm810", ARM_ARCH_V4, FPU_ARCH_FPA, NULL},
22813 {"strongarm", ARM_ARCH_V4, FPU_ARCH_FPA, NULL},
22814 {"strongarm1", ARM_ARCH_V4, FPU_ARCH_FPA, NULL},
22815 {"strongarm110", ARM_ARCH_V4, FPU_ARCH_FPA, NULL},
22816 {"strongarm1100", ARM_ARCH_V4, FPU_ARCH_FPA, NULL},
22817 {"strongarm1110", ARM_ARCH_V4, FPU_ARCH_FPA, NULL},
22818 {"arm9", ARM_ARCH_V4T, FPU_ARCH_FPA, NULL},
22819 {"arm920", ARM_ARCH_V4T, FPU_ARCH_FPA, "ARM920T"},
22820 {"arm920t", ARM_ARCH_V4T, FPU_ARCH_FPA, NULL},
22821 {"arm922t", ARM_ARCH_V4T, FPU_ARCH_FPA, NULL},
22822 {"arm940t", ARM_ARCH_V4T, FPU_ARCH_FPA, NULL},
22823 {"arm9tdmi", ARM_ARCH_V4T, FPU_ARCH_FPA, NULL},
7fac0536
NC
22824 {"fa526", ARM_ARCH_V4, FPU_ARCH_FPA, NULL},
22825 {"fa626", ARM_ARCH_V4, FPU_ARCH_FPA, NULL},
c19d1205
ZW
22826 /* For V5 or later processors we default to using VFP; but the user
22827 should really set the FPU type explicitly. */
ee065d83
PB
22828 {"arm9e-r0", ARM_ARCH_V5TExP, FPU_ARCH_VFP_V2, NULL},
22829 {"arm9e", ARM_ARCH_V5TE, FPU_ARCH_VFP_V2, NULL},
22830 {"arm926ej", ARM_ARCH_V5TEJ, FPU_ARCH_VFP_V2, "ARM926EJ-S"},
22831 {"arm926ejs", ARM_ARCH_V5TEJ, FPU_ARCH_VFP_V2, "ARM926EJ-S"},
22832 {"arm926ej-s", ARM_ARCH_V5TEJ, FPU_ARCH_VFP_V2, NULL},
22833 {"arm946e-r0", ARM_ARCH_V5TExP, FPU_ARCH_VFP_V2, NULL},
22834 {"arm946e", ARM_ARCH_V5TE, FPU_ARCH_VFP_V2, "ARM946E-S"},
22835 {"arm946e-s", ARM_ARCH_V5TE, FPU_ARCH_VFP_V2, NULL},
22836 {"arm966e-r0", ARM_ARCH_V5TExP, FPU_ARCH_VFP_V2, NULL},
22837 {"arm966e", ARM_ARCH_V5TE, FPU_ARCH_VFP_V2, "ARM966E-S"},
22838 {"arm966e-s", ARM_ARCH_V5TE, FPU_ARCH_VFP_V2, NULL},
22839 {"arm968e-s", ARM_ARCH_V5TE, FPU_ARCH_VFP_V2, NULL},
22840 {"arm10t", ARM_ARCH_V5T, FPU_ARCH_VFP_V1, NULL},
22841 {"arm10tdmi", ARM_ARCH_V5T, FPU_ARCH_VFP_V1, NULL},
22842 {"arm10e", ARM_ARCH_V5TE, FPU_ARCH_VFP_V2, NULL},
22843 {"arm1020", ARM_ARCH_V5TE, FPU_ARCH_VFP_V2, "ARM1020E"},
22844 {"arm1020t", ARM_ARCH_V5T, FPU_ARCH_VFP_V1, NULL},
22845 {"arm1020e", ARM_ARCH_V5TE, FPU_ARCH_VFP_V2, NULL},
22846 {"arm1022e", ARM_ARCH_V5TE, FPU_ARCH_VFP_V2, NULL},
22847 {"arm1026ejs", ARM_ARCH_V5TEJ, FPU_ARCH_VFP_V2, "ARM1026EJ-S"},
22848 {"arm1026ej-s", ARM_ARCH_V5TEJ, FPU_ARCH_VFP_V2, NULL},
4a58c4bd
NC
22849 {"fa606te", ARM_ARCH_V5TE, FPU_ARCH_VFP_V2, NULL},
22850 {"fa616te", ARM_ARCH_V5TE, FPU_ARCH_VFP_V2, NULL},
22851 {"fa626te", ARM_ARCH_V5TE, FPU_ARCH_VFP_V2, NULL},
22852 {"fmp626", ARM_ARCH_V5TE, FPU_ARCH_VFP_V2, NULL},
7fac0536 22853 {"fa726te", ARM_ARCH_V5TE, FPU_ARCH_VFP_V2, NULL},
ee065d83
PB
22854 {"arm1136js", ARM_ARCH_V6, FPU_NONE, "ARM1136J-S"},
22855 {"arm1136j-s", ARM_ARCH_V6, FPU_NONE, NULL},
22856 {"arm1136jfs", ARM_ARCH_V6, FPU_ARCH_VFP_V2, "ARM1136JF-S"},
22857 {"arm1136jf-s", ARM_ARCH_V6, FPU_ARCH_VFP_V2, NULL},
4ff9b924
MGD
22858 {"mpcore", ARM_ARCH_V6K, FPU_ARCH_VFP_V2, "MPCore"},
22859 {"mpcorenovfp", ARM_ARCH_V6K, FPU_NONE, "MPCore"},
ee065d83
PB
22860 {"arm1156t2-s", ARM_ARCH_V6T2, FPU_NONE, NULL},
22861 {"arm1156t2f-s", ARM_ARCH_V6T2, FPU_ARCH_VFP_V2, NULL},
22862 {"arm1176jz-s", ARM_ARCH_V6ZK, FPU_NONE, NULL},
22863 {"arm1176jzf-s", ARM_ARCH_V6ZK, FPU_ARCH_VFP_V2, NULL},
f4c65163
MGD
22864 {"cortex-a5", ARM_ARCH_V7A_MP_SEC,
22865 FPU_NONE, "Cortex-A5"},
22866 {"cortex-a8", ARM_ARCH_V7A_SEC,
22867 ARM_FEATURE (0, FPU_VFP_V3
5287ad62 22868 | FPU_NEON_EXT_V1),
4ff9b924 22869 "Cortex-A8"},
f4c65163
MGD
22870 {"cortex-a9", ARM_ARCH_V7A_MP_SEC,
22871 ARM_FEATURE (0, FPU_VFP_V3
15290f0a 22872 | FPU_NEON_EXT_V1),
4ff9b924 22873 "Cortex-A9"},
90ec0d68 22874 {"cortex-a15", ARM_ARCH_V7A_IDIV_MP_SEC_VIRT,
eea54501 22875 FPU_ARCH_NEON_VFP_V4,
dbb1f804 22876 "Cortex-A15"},
4ff9b924
MGD
22877 {"cortex-r4", ARM_ARCH_V7R, FPU_NONE, "Cortex-R4"},
22878 {"cortex-r4f", ARM_ARCH_V7R, FPU_ARCH_VFP_V3D16,
22879 "Cortex-R4F"},
3b2f0793
PB
22880 {"cortex-r5", ARM_ARCH_V7R_IDIV,
22881 FPU_NONE, "Cortex-R5"},
4ff9b924
MGD
22882 {"cortex-m4", ARM_ARCH_V7EM, FPU_NONE, "Cortex-M4"},
22883 {"cortex-m3", ARM_ARCH_V7M, FPU_NONE, "Cortex-M3"},
b2a5fbdc
MGD
22884 {"cortex-m1", ARM_ARCH_V6SM, FPU_NONE, "Cortex-M1"},
22885 {"cortex-m0", ARM_ARCH_V6SM, FPU_NONE, "Cortex-M0"},
c19d1205 22886 /* ??? XSCALE is really an architecture. */
ee065d83 22887 {"xscale", ARM_ARCH_XSCALE, FPU_ARCH_VFP_V2, NULL},
c19d1205 22888 /* ??? iwmmxt is not a processor. */
ee065d83 22889 {"iwmmxt", ARM_ARCH_IWMMXT, FPU_ARCH_VFP_V2, NULL},
2d447fca 22890 {"iwmmxt2", ARM_ARCH_IWMMXT2,FPU_ARCH_VFP_V2, NULL},
ee065d83 22891 {"i80200", ARM_ARCH_XSCALE, FPU_ARCH_VFP_V2, NULL},
c19d1205 22892 /* Maverick */
e07e6e58 22893 {"ep9312", ARM_FEATURE (ARM_AEXT_V4T, ARM_CEXT_MAVERICK), FPU_ARCH_MAVERICK, "ARM920T"},
e74cfd16 22894 {NULL, ARM_ARCH_NONE, ARM_ARCH_NONE, NULL}
c19d1205 22895};
7ed4c4c5 22896
c19d1205 22897struct arm_arch_option_table
7ed4c4c5 22898{
c19d1205 22899 char *name;
e74cfd16
PB
22900 const arm_feature_set value;
22901 const arm_feature_set default_fpu;
c19d1205 22902};
7ed4c4c5 22903
c19d1205
ZW
22904/* This list should, at a minimum, contain all the architecture names
22905 recognized by GCC. */
e74cfd16 22906static const struct arm_arch_option_table arm_archs[] =
c19d1205
ZW
22907{
22908 {"all", ARM_ANY, FPU_ARCH_FPA},
22909 {"armv1", ARM_ARCH_V1, FPU_ARCH_FPA},
22910 {"armv2", ARM_ARCH_V2, FPU_ARCH_FPA},
22911 {"armv2a", ARM_ARCH_V2S, FPU_ARCH_FPA},
22912 {"armv2s", ARM_ARCH_V2S, FPU_ARCH_FPA},
22913 {"armv3", ARM_ARCH_V3, FPU_ARCH_FPA},
22914 {"armv3m", ARM_ARCH_V3M, FPU_ARCH_FPA},
22915 {"armv4", ARM_ARCH_V4, FPU_ARCH_FPA},
22916 {"armv4xm", ARM_ARCH_V4xM, FPU_ARCH_FPA},
22917 {"armv4t", ARM_ARCH_V4T, FPU_ARCH_FPA},
22918 {"armv4txm", ARM_ARCH_V4TxM, FPU_ARCH_FPA},
22919 {"armv5", ARM_ARCH_V5, FPU_ARCH_VFP},
22920 {"armv5t", ARM_ARCH_V5T, FPU_ARCH_VFP},
22921 {"armv5txm", ARM_ARCH_V5TxM, FPU_ARCH_VFP},
22922 {"armv5te", ARM_ARCH_V5TE, FPU_ARCH_VFP},
22923 {"armv5texp", ARM_ARCH_V5TExP, FPU_ARCH_VFP},
22924 {"armv5tej", ARM_ARCH_V5TEJ, FPU_ARCH_VFP},
22925 {"armv6", ARM_ARCH_V6, FPU_ARCH_VFP},
22926 {"armv6j", ARM_ARCH_V6, FPU_ARCH_VFP},
22927 {"armv6k", ARM_ARCH_V6K, FPU_ARCH_VFP},
22928 {"armv6z", ARM_ARCH_V6Z, FPU_ARCH_VFP},
22929 {"armv6zk", ARM_ARCH_V6ZK, FPU_ARCH_VFP},
22930 {"armv6t2", ARM_ARCH_V6T2, FPU_ARCH_VFP},
22931 {"armv6kt2", ARM_ARCH_V6KT2, FPU_ARCH_VFP},
22932 {"armv6zt2", ARM_ARCH_V6ZT2, FPU_ARCH_VFP},
22933 {"armv6zkt2", ARM_ARCH_V6ZKT2, FPU_ARCH_VFP},
7e806470 22934 {"armv6-m", ARM_ARCH_V6M, FPU_ARCH_VFP},
b2a5fbdc 22935 {"armv6s-m", ARM_ARCH_V6SM, FPU_ARCH_VFP},
62b3e311 22936 {"armv7", ARM_ARCH_V7, FPU_ARCH_VFP},
c450d570
PB
22937 /* The official spelling of the ARMv7 profile variants is the dashed form.
22938 Accept the non-dashed form for compatibility with old toolchains. */
62b3e311
PB
22939 {"armv7a", ARM_ARCH_V7A, FPU_ARCH_VFP},
22940 {"armv7r", ARM_ARCH_V7R, FPU_ARCH_VFP},
22941 {"armv7m", ARM_ARCH_V7M, FPU_ARCH_VFP},
c450d570
PB
22942 {"armv7-a", ARM_ARCH_V7A, FPU_ARCH_VFP},
22943 {"armv7-r", ARM_ARCH_V7R, FPU_ARCH_VFP},
22944 {"armv7-m", ARM_ARCH_V7M, FPU_ARCH_VFP},
9e3c6df6 22945 {"armv7e-m", ARM_ARCH_V7EM, FPU_ARCH_VFP},
c19d1205
ZW
22946 {"xscale", ARM_ARCH_XSCALE, FPU_ARCH_VFP},
22947 {"iwmmxt", ARM_ARCH_IWMMXT, FPU_ARCH_VFP},
2d447fca 22948 {"iwmmxt2", ARM_ARCH_IWMMXT2,FPU_ARCH_VFP},
e74cfd16 22949 {NULL, ARM_ARCH_NONE, ARM_ARCH_NONE}
c19d1205 22950};
7ed4c4c5 22951
69133863
MGD
22952/* ISA extensions in the co-processor and main instruction set space. */
22953struct arm_option_extension_value_table
c19d1205
ZW
22954{
22955 char *name;
e74cfd16 22956 const arm_feature_set value;
69133863 22957 const arm_feature_set allowed_archs;
c19d1205 22958};
7ed4c4c5 22959
69133863
MGD
22960/* The following table must be in alphabetical order with a NULL last entry.
22961 */
22962static const struct arm_option_extension_value_table arm_extensions[] =
c19d1205 22963{
eea54501 22964 {"idiv", ARM_FEATURE (ARM_EXT_ADIV | ARM_EXT_DIV, 0),
3b2f0793 22965 ARM_FEATURE (ARM_EXT_V7A | ARM_EXT_V7R, 0)},
69133863
MGD
22966 {"iwmmxt", ARM_FEATURE (0, ARM_CEXT_IWMMXT), ARM_ANY},
22967 {"iwmmxt2", ARM_FEATURE (0, ARM_CEXT_IWMMXT2), ARM_ANY},
22968 {"maverick", ARM_FEATURE (0, ARM_CEXT_MAVERICK), ARM_ANY},
60e5ef9f
MGD
22969 {"mp", ARM_FEATURE (ARM_EXT_MP, 0),
22970 ARM_FEATURE (ARM_EXT_V7A | ARM_EXT_V7R, 0)},
b2a5fbdc
MGD
22971 {"os", ARM_FEATURE (ARM_EXT_OS, 0),
22972 ARM_FEATURE (ARM_EXT_V6M, 0)},
f4c65163
MGD
22973 {"sec", ARM_FEATURE (ARM_EXT_SEC, 0),
22974 ARM_FEATURE (ARM_EXT_V6K | ARM_EXT_V7A, 0)},
90ec0d68
MGD
22975 {"virt", ARM_FEATURE (ARM_EXT_VIRT | ARM_EXT_ADIV | ARM_EXT_DIV, 0),
22976 ARM_FEATURE (ARM_EXT_V7A, 0)},
69133863 22977 {"xscale", ARM_FEATURE (0, ARM_CEXT_XSCALE), ARM_ANY},
60e5ef9f 22978 {NULL, ARM_ARCH_NONE, ARM_ARCH_NONE}
69133863
MGD
22979};
22980
22981/* ISA floating-point and Advanced SIMD extensions. */
22982struct arm_option_fpu_value_table
22983{
22984 char *name;
22985 const arm_feature_set value;
c19d1205 22986};
7ed4c4c5 22987
c19d1205
ZW
22988/* This list should, at a minimum, contain all the fpu names
22989 recognized by GCC. */
69133863 22990static const struct arm_option_fpu_value_table arm_fpus[] =
c19d1205
ZW
22991{
22992 {"softfpa", FPU_NONE},
22993 {"fpe", FPU_ARCH_FPE},
22994 {"fpe2", FPU_ARCH_FPE},
22995 {"fpe3", FPU_ARCH_FPA}, /* Third release supports LFM/SFM. */
22996 {"fpa", FPU_ARCH_FPA},
22997 {"fpa10", FPU_ARCH_FPA},
22998 {"fpa11", FPU_ARCH_FPA},
22999 {"arm7500fe", FPU_ARCH_FPA},
23000 {"softvfp", FPU_ARCH_VFP},
23001 {"softvfp+vfp", FPU_ARCH_VFP_V2},
23002 {"vfp", FPU_ARCH_VFP_V2},
23003 {"vfp9", FPU_ARCH_VFP_V2},
b1cc4aeb 23004 {"vfp3", FPU_ARCH_VFP_V3}, /* For backwards compatbility. */
c19d1205
ZW
23005 {"vfp10", FPU_ARCH_VFP_V2},
23006 {"vfp10-r0", FPU_ARCH_VFP_V1},
23007 {"vfpxd", FPU_ARCH_VFP_V1xD},
b1cc4aeb
PB
23008 {"vfpv2", FPU_ARCH_VFP_V2},
23009 {"vfpv3", FPU_ARCH_VFP_V3},
62f3b8c8 23010 {"vfpv3-fp16", FPU_ARCH_VFP_V3_FP16},
b1cc4aeb 23011 {"vfpv3-d16", FPU_ARCH_VFP_V3D16},
62f3b8c8
PB
23012 {"vfpv3-d16-fp16", FPU_ARCH_VFP_V3D16_FP16},
23013 {"vfpv3xd", FPU_ARCH_VFP_V3xD},
23014 {"vfpv3xd-fp16", FPU_ARCH_VFP_V3xD_FP16},
c19d1205
ZW
23015 {"arm1020t", FPU_ARCH_VFP_V1},
23016 {"arm1020e", FPU_ARCH_VFP_V2},
23017 {"arm1136jfs", FPU_ARCH_VFP_V2},
23018 {"arm1136jf-s", FPU_ARCH_VFP_V2},
23019 {"maverick", FPU_ARCH_MAVERICK},
5287ad62 23020 {"neon", FPU_ARCH_VFP_V3_PLUS_NEON_V1},
8e79c3df 23021 {"neon-fp16", FPU_ARCH_NEON_FP16},
62f3b8c8
PB
23022 {"vfpv4", FPU_ARCH_VFP_V4},
23023 {"vfpv4-d16", FPU_ARCH_VFP_V4D16},
ada65aa3 23024 {"fpv4-sp-d16", FPU_ARCH_VFP_V4_SP_D16},
62f3b8c8 23025 {"neon-vfpv4", FPU_ARCH_NEON_VFP_V4},
e74cfd16
PB
23026 {NULL, ARM_ARCH_NONE}
23027};
23028
23029struct arm_option_value_table
23030{
23031 char *name;
23032 long value;
c19d1205 23033};
7ed4c4c5 23034
e74cfd16 23035static const struct arm_option_value_table arm_float_abis[] =
c19d1205
ZW
23036{
23037 {"hard", ARM_FLOAT_ABI_HARD},
23038 {"softfp", ARM_FLOAT_ABI_SOFTFP},
23039 {"soft", ARM_FLOAT_ABI_SOFT},
e74cfd16 23040 {NULL, 0}
c19d1205 23041};
7ed4c4c5 23042
c19d1205 23043#ifdef OBJ_ELF
3a4a14e9 23044/* We only know how to output GNU and ver 4/5 (AAELF) formats. */
e74cfd16 23045static const struct arm_option_value_table arm_eabis[] =
c19d1205
ZW
23046{
23047 {"gnu", EF_ARM_EABI_UNKNOWN},
23048 {"4", EF_ARM_EABI_VER4},
3a4a14e9 23049 {"5", EF_ARM_EABI_VER5},
e74cfd16 23050 {NULL, 0}
c19d1205
ZW
23051};
23052#endif
7ed4c4c5 23053
c19d1205
ZW
23054struct arm_long_option_table
23055{
23056 char * option; /* Substring to match. */
23057 char * help; /* Help information. */
23058 int (* func) (char * subopt); /* Function to decode sub-option. */
23059 char * deprecated; /* If non-null, print this message. */
23060};
7ed4c4c5 23061
c921be7d 23062static bfd_boolean
e74cfd16 23063arm_parse_extension (char * str, const arm_feature_set **opt_p)
7ed4c4c5 23064{
21d799b5
NC
23065 arm_feature_set *ext_set = (arm_feature_set *)
23066 xmalloc (sizeof (arm_feature_set));
e74cfd16 23067
69133863
MGD
23068 /* We insist on extensions being specified in alphabetical order, and with
23069 extensions being added before being removed. We achieve this by having
23070 the global ARM_EXTENSIONS table in alphabetical order, and using the
23071 ADDING_VALUE variable to indicate whether we are adding an extension (1)
23072 or removing it (0) and only allowing it to change in the order
23073 -1 -> 1 -> 0. */
23074 const struct arm_option_extension_value_table * opt = NULL;
23075 int adding_value = -1;
23076
e74cfd16
PB
23077 /* Copy the feature set, so that we can modify it. */
23078 *ext_set = **opt_p;
23079 *opt_p = ext_set;
23080
c19d1205 23081 while (str != NULL && *str != 0)
7ed4c4c5 23082 {
c19d1205 23083 char * ext;
69133863 23084 size_t optlen;
7ed4c4c5 23085
c19d1205
ZW
23086 if (*str != '+')
23087 {
23088 as_bad (_("invalid architectural extension"));
c921be7d 23089 return FALSE;
c19d1205 23090 }
7ed4c4c5 23091
c19d1205
ZW
23092 str++;
23093 ext = strchr (str, '+');
7ed4c4c5 23094
c19d1205
ZW
23095 if (ext != NULL)
23096 optlen = ext - str;
23097 else
23098 optlen = strlen (str);
7ed4c4c5 23099
69133863
MGD
23100 if (optlen >= 2
23101 && strncmp (str, "no", 2) == 0)
23102 {
23103 if (adding_value != 0)
23104 {
23105 adding_value = 0;
23106 opt = arm_extensions;
23107 }
23108
23109 optlen -= 2;
23110 str += 2;
23111 }
23112 else if (optlen > 0)
23113 {
23114 if (adding_value == -1)
23115 {
23116 adding_value = 1;
23117 opt = arm_extensions;
23118 }
23119 else if (adding_value != 1)
23120 {
23121 as_bad (_("must specify extensions to add before specifying "
23122 "those to remove"));
23123 return FALSE;
23124 }
23125 }
23126
c19d1205
ZW
23127 if (optlen == 0)
23128 {
23129 as_bad (_("missing architectural extension"));
c921be7d 23130 return FALSE;
c19d1205 23131 }
7ed4c4c5 23132
69133863
MGD
23133 gas_assert (adding_value != -1);
23134 gas_assert (opt != NULL);
23135
23136 /* Scan over the options table trying to find an exact match. */
23137 for (; opt->name != NULL; opt++)
23138 if (strncmp (opt->name, str, optlen) == 0
23139 && strlen (opt->name) == optlen)
c19d1205 23140 {
69133863
MGD
23141 /* Check we can apply the extension to this architecture. */
23142 if (!ARM_CPU_HAS_FEATURE (*ext_set, opt->allowed_archs))
23143 {
23144 as_bad (_("extension does not apply to the base architecture"));
23145 return FALSE;
23146 }
23147
23148 /* Add or remove the extension. */
23149 if (adding_value)
23150 ARM_MERGE_FEATURE_SETS (*ext_set, *ext_set, opt->value);
23151 else
23152 ARM_CLEAR_FEATURE (*ext_set, *ext_set, opt->value);
23153
c19d1205
ZW
23154 break;
23155 }
7ed4c4c5 23156
c19d1205
ZW
23157 if (opt->name == NULL)
23158 {
69133863
MGD
23159 /* Did we fail to find an extension because it wasn't specified in
23160 alphabetical order, or because it does not exist? */
23161
23162 for (opt = arm_extensions; opt->name != NULL; opt++)
23163 if (strncmp (opt->name, str, optlen) == 0)
23164 break;
23165
23166 if (opt->name == NULL)
23167 as_bad (_("unknown architectural extension `%s'"), str);
23168 else
23169 as_bad (_("architectural extensions must be specified in "
23170 "alphabetical order"));
23171
c921be7d 23172 return FALSE;
c19d1205 23173 }
69133863
MGD
23174 else
23175 {
23176 /* We should skip the extension we've just matched the next time
23177 round. */
23178 opt++;
23179 }
7ed4c4c5 23180
c19d1205
ZW
23181 str = ext;
23182 };
7ed4c4c5 23183
c921be7d 23184 return TRUE;
c19d1205 23185}
7ed4c4c5 23186
c921be7d 23187static bfd_boolean
c19d1205 23188arm_parse_cpu (char * str)
7ed4c4c5 23189{
e74cfd16 23190 const struct arm_cpu_option_table * opt;
c19d1205
ZW
23191 char * ext = strchr (str, '+');
23192 int optlen;
7ed4c4c5 23193
c19d1205
ZW
23194 if (ext != NULL)
23195 optlen = ext - str;
7ed4c4c5 23196 else
c19d1205 23197 optlen = strlen (str);
7ed4c4c5 23198
c19d1205 23199 if (optlen == 0)
7ed4c4c5 23200 {
c19d1205 23201 as_bad (_("missing cpu name `%s'"), str);
c921be7d 23202 return FALSE;
7ed4c4c5
NC
23203 }
23204
c19d1205
ZW
23205 for (opt = arm_cpus; opt->name != NULL; opt++)
23206 if (strncmp (opt->name, str, optlen) == 0)
23207 {
e74cfd16
PB
23208 mcpu_cpu_opt = &opt->value;
23209 mcpu_fpu_opt = &opt->default_fpu;
ee065d83 23210 if (opt->canonical_name)
5f4273c7 23211 strcpy (selected_cpu_name, opt->canonical_name);
ee065d83
PB
23212 else
23213 {
23214 int i;
c921be7d 23215
ee065d83
PB
23216 for (i = 0; i < optlen; i++)
23217 selected_cpu_name[i] = TOUPPER (opt->name[i]);
23218 selected_cpu_name[i] = 0;
23219 }
7ed4c4c5 23220
c19d1205
ZW
23221 if (ext != NULL)
23222 return arm_parse_extension (ext, &mcpu_cpu_opt);
7ed4c4c5 23223
c921be7d 23224 return TRUE;
c19d1205 23225 }
7ed4c4c5 23226
c19d1205 23227 as_bad (_("unknown cpu `%s'"), str);
c921be7d 23228 return FALSE;
7ed4c4c5
NC
23229}
23230
c921be7d 23231static bfd_boolean
c19d1205 23232arm_parse_arch (char * str)
7ed4c4c5 23233{
e74cfd16 23234 const struct arm_arch_option_table *opt;
c19d1205
ZW
23235 char *ext = strchr (str, '+');
23236 int optlen;
7ed4c4c5 23237
c19d1205
ZW
23238 if (ext != NULL)
23239 optlen = ext - str;
7ed4c4c5 23240 else
c19d1205 23241 optlen = strlen (str);
7ed4c4c5 23242
c19d1205 23243 if (optlen == 0)
7ed4c4c5 23244 {
c19d1205 23245 as_bad (_("missing architecture name `%s'"), str);
c921be7d 23246 return FALSE;
7ed4c4c5
NC
23247 }
23248
c19d1205 23249 for (opt = arm_archs; opt->name != NULL; opt++)
69133863 23250 if (strncmp (opt->name, str, optlen) == 0)
c19d1205 23251 {
e74cfd16
PB
23252 march_cpu_opt = &opt->value;
23253 march_fpu_opt = &opt->default_fpu;
5f4273c7 23254 strcpy (selected_cpu_name, opt->name);
7ed4c4c5 23255
c19d1205
ZW
23256 if (ext != NULL)
23257 return arm_parse_extension (ext, &march_cpu_opt);
7ed4c4c5 23258
c921be7d 23259 return TRUE;
c19d1205
ZW
23260 }
23261
23262 as_bad (_("unknown architecture `%s'\n"), str);
c921be7d 23263 return FALSE;
7ed4c4c5 23264}
eb043451 23265
c921be7d 23266static bfd_boolean
c19d1205
ZW
23267arm_parse_fpu (char * str)
23268{
69133863 23269 const struct arm_option_fpu_value_table * opt;
b99bd4ef 23270
c19d1205
ZW
23271 for (opt = arm_fpus; opt->name != NULL; opt++)
23272 if (streq (opt->name, str))
23273 {
e74cfd16 23274 mfpu_opt = &opt->value;
c921be7d 23275 return TRUE;
c19d1205 23276 }
b99bd4ef 23277
c19d1205 23278 as_bad (_("unknown floating point format `%s'\n"), str);
c921be7d 23279 return FALSE;
c19d1205
ZW
23280}
23281
c921be7d 23282static bfd_boolean
c19d1205 23283arm_parse_float_abi (char * str)
b99bd4ef 23284{
e74cfd16 23285 const struct arm_option_value_table * opt;
b99bd4ef 23286
c19d1205
ZW
23287 for (opt = arm_float_abis; opt->name != NULL; opt++)
23288 if (streq (opt->name, str))
23289 {
23290 mfloat_abi_opt = opt->value;
c921be7d 23291 return TRUE;
c19d1205 23292 }
cc8a6dd0 23293
c19d1205 23294 as_bad (_("unknown floating point abi `%s'\n"), str);
c921be7d 23295 return FALSE;
c19d1205 23296}
b99bd4ef 23297
c19d1205 23298#ifdef OBJ_ELF
c921be7d 23299static bfd_boolean
c19d1205
ZW
23300arm_parse_eabi (char * str)
23301{
e74cfd16 23302 const struct arm_option_value_table *opt;
cc8a6dd0 23303
c19d1205
ZW
23304 for (opt = arm_eabis; opt->name != NULL; opt++)
23305 if (streq (opt->name, str))
23306 {
23307 meabi_flags = opt->value;
c921be7d 23308 return TRUE;
c19d1205
ZW
23309 }
23310 as_bad (_("unknown EABI `%s'\n"), str);
c921be7d 23311 return FALSE;
c19d1205
ZW
23312}
23313#endif
cc8a6dd0 23314
c921be7d 23315static bfd_boolean
e07e6e58
NC
23316arm_parse_it_mode (char * str)
23317{
c921be7d 23318 bfd_boolean ret = TRUE;
e07e6e58
NC
23319
23320 if (streq ("arm", str))
23321 implicit_it_mode = IMPLICIT_IT_MODE_ARM;
23322 else if (streq ("thumb", str))
23323 implicit_it_mode = IMPLICIT_IT_MODE_THUMB;
23324 else if (streq ("always", str))
23325 implicit_it_mode = IMPLICIT_IT_MODE_ALWAYS;
23326 else if (streq ("never", str))
23327 implicit_it_mode = IMPLICIT_IT_MODE_NEVER;
23328 else
23329 {
23330 as_bad (_("unknown implicit IT mode `%s', should be "\
23331 "arm, thumb, always, or never."), str);
c921be7d 23332 ret = FALSE;
e07e6e58
NC
23333 }
23334
23335 return ret;
23336}
23337
c19d1205
ZW
23338struct arm_long_option_table arm_long_opts[] =
23339{
23340 {"mcpu=", N_("<cpu name>\t assemble for CPU <cpu name>"),
23341 arm_parse_cpu, NULL},
23342 {"march=", N_("<arch name>\t assemble for architecture <arch name>"),
23343 arm_parse_arch, NULL},
23344 {"mfpu=", N_("<fpu name>\t assemble for FPU architecture <fpu name>"),
23345 arm_parse_fpu, NULL},
23346 {"mfloat-abi=", N_("<abi>\t assemble for floating point ABI <abi>"),
23347 arm_parse_float_abi, NULL},
23348#ifdef OBJ_ELF
7fac0536 23349 {"meabi=", N_("<ver>\t\t assemble for eabi version <ver>"),
c19d1205
ZW
23350 arm_parse_eabi, NULL},
23351#endif
e07e6e58
NC
23352 {"mimplicit-it=", N_("<mode>\t controls implicit insertion of IT instructions"),
23353 arm_parse_it_mode, NULL},
c19d1205
ZW
23354 {NULL, NULL, 0, NULL}
23355};
cc8a6dd0 23356
c19d1205
ZW
23357int
23358md_parse_option (int c, char * arg)
23359{
23360 struct arm_option_table *opt;
e74cfd16 23361 const struct arm_legacy_option_table *fopt;
c19d1205 23362 struct arm_long_option_table *lopt;
b99bd4ef 23363
c19d1205 23364 switch (c)
b99bd4ef 23365 {
c19d1205
ZW
23366#ifdef OPTION_EB
23367 case OPTION_EB:
23368 target_big_endian = 1;
23369 break;
23370#endif
cc8a6dd0 23371
c19d1205
ZW
23372#ifdef OPTION_EL
23373 case OPTION_EL:
23374 target_big_endian = 0;
23375 break;
23376#endif
b99bd4ef 23377
845b51d6
PB
23378 case OPTION_FIX_V4BX:
23379 fix_v4bx = TRUE;
23380 break;
23381
c19d1205
ZW
23382 case 'a':
23383 /* Listing option. Just ignore these, we don't support additional
23384 ones. */
23385 return 0;
b99bd4ef 23386
c19d1205
ZW
23387 default:
23388 for (opt = arm_opts; opt->option != NULL; opt++)
23389 {
23390 if (c == opt->option[0]
23391 && ((arg == NULL && opt->option[1] == 0)
23392 || streq (arg, opt->option + 1)))
23393 {
c19d1205 23394 /* If the option is deprecated, tell the user. */
278df34e 23395 if (warn_on_deprecated && opt->deprecated != NULL)
c19d1205
ZW
23396 as_tsktsk (_("option `-%c%s' is deprecated: %s"), c,
23397 arg ? arg : "", _(opt->deprecated));
b99bd4ef 23398
c19d1205
ZW
23399 if (opt->var != NULL)
23400 *opt->var = opt->value;
cc8a6dd0 23401
c19d1205
ZW
23402 return 1;
23403 }
23404 }
b99bd4ef 23405
e74cfd16
PB
23406 for (fopt = arm_legacy_opts; fopt->option != NULL; fopt++)
23407 {
23408 if (c == fopt->option[0]
23409 && ((arg == NULL && fopt->option[1] == 0)
23410 || streq (arg, fopt->option + 1)))
23411 {
e74cfd16 23412 /* If the option is deprecated, tell the user. */
278df34e 23413 if (warn_on_deprecated && fopt->deprecated != NULL)
e74cfd16
PB
23414 as_tsktsk (_("option `-%c%s' is deprecated: %s"), c,
23415 arg ? arg : "", _(fopt->deprecated));
e74cfd16
PB
23416
23417 if (fopt->var != NULL)
23418 *fopt->var = &fopt->value;
23419
23420 return 1;
23421 }
23422 }
23423
c19d1205
ZW
23424 for (lopt = arm_long_opts; lopt->option != NULL; lopt++)
23425 {
23426 /* These options are expected to have an argument. */
23427 if (c == lopt->option[0]
23428 && arg != NULL
23429 && strncmp (arg, lopt->option + 1,
23430 strlen (lopt->option + 1)) == 0)
23431 {
c19d1205 23432 /* If the option is deprecated, tell the user. */
278df34e 23433 if (warn_on_deprecated && lopt->deprecated != NULL)
c19d1205
ZW
23434 as_tsktsk (_("option `-%c%s' is deprecated: %s"), c, arg,
23435 _(lopt->deprecated));
b99bd4ef 23436
c19d1205
ZW
23437 /* Call the sup-option parser. */
23438 return lopt->func (arg + strlen (lopt->option) - 1);
23439 }
23440 }
a737bd4d 23441
c19d1205
ZW
23442 return 0;
23443 }
a394c00f 23444
c19d1205
ZW
23445 return 1;
23446}
a394c00f 23447
c19d1205
ZW
23448void
23449md_show_usage (FILE * fp)
a394c00f 23450{
c19d1205
ZW
23451 struct arm_option_table *opt;
23452 struct arm_long_option_table *lopt;
a394c00f 23453
c19d1205 23454 fprintf (fp, _(" ARM-specific assembler options:\n"));
a394c00f 23455
c19d1205
ZW
23456 for (opt = arm_opts; opt->option != NULL; opt++)
23457 if (opt->help != NULL)
23458 fprintf (fp, " -%-23s%s\n", opt->option, _(opt->help));
a394c00f 23459
c19d1205
ZW
23460 for (lopt = arm_long_opts; lopt->option != NULL; lopt++)
23461 if (lopt->help != NULL)
23462 fprintf (fp, " -%s%s\n", lopt->option, _(lopt->help));
a394c00f 23463
c19d1205
ZW
23464#ifdef OPTION_EB
23465 fprintf (fp, _("\
23466 -EB assemble code for a big-endian cpu\n"));
a394c00f
NC
23467#endif
23468
c19d1205
ZW
23469#ifdef OPTION_EL
23470 fprintf (fp, _("\
23471 -EL assemble code for a little-endian cpu\n"));
a737bd4d 23472#endif
845b51d6
PB
23473
23474 fprintf (fp, _("\
23475 --fix-v4bx Allow BX in ARMv4 code\n"));
c19d1205 23476}
ee065d83
PB
23477
23478
23479#ifdef OBJ_ELF
62b3e311
PB
23480typedef struct
23481{
23482 int val;
23483 arm_feature_set flags;
23484} cpu_arch_ver_table;
23485
23486/* Mapping from CPU features to EABI CPU arch values. Table must be sorted
23487 least features first. */
23488static const cpu_arch_ver_table cpu_arch_ver[] =
23489{
23490 {1, ARM_ARCH_V4},
23491 {2, ARM_ARCH_V4T},
23492 {3, ARM_ARCH_V5},
ee3c0378 23493 {3, ARM_ARCH_V5T},
62b3e311
PB
23494 {4, ARM_ARCH_V5TE},
23495 {5, ARM_ARCH_V5TEJ},
23496 {6, ARM_ARCH_V6},
7e806470 23497 {9, ARM_ARCH_V6K},
f4c65163 23498 {7, ARM_ARCH_V6Z},
91e22acd 23499 {11, ARM_ARCH_V6M},
b2a5fbdc 23500 {12, ARM_ARCH_V6SM},
7e806470 23501 {8, ARM_ARCH_V6T2},
62b3e311
PB
23502 {10, ARM_ARCH_V7A},
23503 {10, ARM_ARCH_V7R},
23504 {10, ARM_ARCH_V7M},
23505 {0, ARM_ARCH_NONE}
23506};
23507
ee3c0378
AS
23508/* Set an attribute if it has not already been set by the user. */
23509static void
23510aeabi_set_attribute_int (int tag, int value)
23511{
23512 if (tag < 1
23513 || tag >= NUM_KNOWN_OBJ_ATTRIBUTES
23514 || !attributes_set_explicitly[tag])
23515 bfd_elf_add_proc_attr_int (stdoutput, tag, value);
23516}
23517
23518static void
23519aeabi_set_attribute_string (int tag, const char *value)
23520{
23521 if (tag < 1
23522 || tag >= NUM_KNOWN_OBJ_ATTRIBUTES
23523 || !attributes_set_explicitly[tag])
23524 bfd_elf_add_proc_attr_string (stdoutput, tag, value);
23525}
23526
ee065d83
PB
23527/* Set the public EABI object attributes. */
23528static void
23529aeabi_set_public_attributes (void)
23530{
23531 int arch;
90ec0d68 23532 int virt_sec = 0;
e74cfd16 23533 arm_feature_set flags;
62b3e311
PB
23534 arm_feature_set tmp;
23535 const cpu_arch_ver_table *p;
ee065d83
PB
23536
23537 /* Choose the architecture based on the capabilities of the requested cpu
23538 (if any) and/or the instructions actually used. */
e74cfd16
PB
23539 ARM_MERGE_FEATURE_SETS (flags, arm_arch_used, thumb_arch_used);
23540 ARM_MERGE_FEATURE_SETS (flags, flags, *mfpu_opt);
23541 ARM_MERGE_FEATURE_SETS (flags, flags, selected_cpu);
7a1d4c38
PB
23542 /*Allow the user to override the reported architecture. */
23543 if (object_arch)
23544 {
23545 ARM_CLEAR_FEATURE (flags, flags, arm_arch_any);
23546 ARM_MERGE_FEATURE_SETS (flags, flags, *object_arch);
23547 }
23548
251665fc
MGD
23549 /* We need to make sure that the attributes do not identify us as v6S-M
23550 when the only v6S-M feature in use is the Operating System Extensions. */
23551 if (ARM_CPU_HAS_FEATURE (flags, arm_ext_os))
23552 if (!ARM_CPU_HAS_FEATURE (flags, arm_arch_v6m_only))
23553 ARM_CLEAR_FEATURE (flags, flags, arm_ext_os);
23554
62b3e311
PB
23555 tmp = flags;
23556 arch = 0;
23557 for (p = cpu_arch_ver; p->val; p++)
23558 {
23559 if (ARM_CPU_HAS_FEATURE (tmp, p->flags))
23560 {
23561 arch = p->val;
23562 ARM_CLEAR_FEATURE (tmp, tmp, p->flags);
23563 }
23564 }
ee065d83 23565
9e3c6df6
PB
23566 /* The table lookup above finds the last architecture to contribute
23567 a new feature. Unfortunately, Tag13 is a subset of the union of
23568 v6T2 and v7-M, so it is never seen as contributing a new feature.
23569 We can not search for the last entry which is entirely used,
23570 because if no CPU is specified we build up only those flags
23571 actually used. Perhaps we should separate out the specified
23572 and implicit cases. Avoid taking this path for -march=all by
23573 checking for contradictory v7-A / v7-M features. */
23574 if (arch == 10
23575 && !ARM_CPU_HAS_FEATURE (flags, arm_ext_v7a)
23576 && ARM_CPU_HAS_FEATURE (flags, arm_ext_v7m)
23577 && ARM_CPU_HAS_FEATURE (flags, arm_ext_v6_dsp))
23578 arch = 13;
23579
ee065d83
PB
23580 /* Tag_CPU_name. */
23581 if (selected_cpu_name[0])
23582 {
91d6fa6a 23583 char *q;
ee065d83 23584
91d6fa6a
NC
23585 q = selected_cpu_name;
23586 if (strncmp (q, "armv", 4) == 0)
ee065d83
PB
23587 {
23588 int i;
5f4273c7 23589
91d6fa6a
NC
23590 q += 4;
23591 for (i = 0; q[i]; i++)
23592 q[i] = TOUPPER (q[i]);
ee065d83 23593 }
91d6fa6a 23594 aeabi_set_attribute_string (Tag_CPU_name, q);
ee065d83 23595 }
62f3b8c8 23596
ee065d83 23597 /* Tag_CPU_arch. */
ee3c0378 23598 aeabi_set_attribute_int (Tag_CPU_arch, arch);
62f3b8c8 23599
62b3e311
PB
23600 /* Tag_CPU_arch_profile. */
23601 if (ARM_CPU_HAS_FEATURE (flags, arm_ext_v7a))
ee3c0378 23602 aeabi_set_attribute_int (Tag_CPU_arch_profile, 'A');
62b3e311 23603 else if (ARM_CPU_HAS_FEATURE (flags, arm_ext_v7r))
ee3c0378 23604 aeabi_set_attribute_int (Tag_CPU_arch_profile, 'R');
7e806470 23605 else if (ARM_CPU_HAS_FEATURE (flags, arm_ext_m))
ee3c0378 23606 aeabi_set_attribute_int (Tag_CPU_arch_profile, 'M');
62f3b8c8 23607
ee065d83 23608 /* Tag_ARM_ISA_use. */
ee3c0378
AS
23609 if (ARM_CPU_HAS_FEATURE (flags, arm_ext_v1)
23610 || arch == 0)
23611 aeabi_set_attribute_int (Tag_ARM_ISA_use, 1);
62f3b8c8 23612
ee065d83 23613 /* Tag_THUMB_ISA_use. */
ee3c0378
AS
23614 if (ARM_CPU_HAS_FEATURE (flags, arm_ext_v4t)
23615 || arch == 0)
23616 aeabi_set_attribute_int (Tag_THUMB_ISA_use,
23617 ARM_CPU_HAS_FEATURE (flags, arm_arch_t2) ? 2 : 1);
62f3b8c8 23618
ee065d83 23619 /* Tag_VFP_arch. */
62f3b8c8
PB
23620 if (ARM_CPU_HAS_FEATURE (flags, fpu_vfp_ext_fma))
23621 aeabi_set_attribute_int (Tag_VFP_arch,
23622 ARM_CPU_HAS_FEATURE (flags, fpu_vfp_ext_d32)
23623 ? 5 : 6);
23624 else if (ARM_CPU_HAS_FEATURE (flags, fpu_vfp_ext_d32))
ee3c0378 23625 aeabi_set_attribute_int (Tag_VFP_arch, 3);
ada65aa3 23626 else if (ARM_CPU_HAS_FEATURE (flags, fpu_vfp_ext_v3xd))
ee3c0378
AS
23627 aeabi_set_attribute_int (Tag_VFP_arch, 4);
23628 else if (ARM_CPU_HAS_FEATURE (flags, fpu_vfp_ext_v2))
23629 aeabi_set_attribute_int (Tag_VFP_arch, 2);
23630 else if (ARM_CPU_HAS_FEATURE (flags, fpu_vfp_ext_v1)
23631 || ARM_CPU_HAS_FEATURE (flags, fpu_vfp_ext_v1xd))
23632 aeabi_set_attribute_int (Tag_VFP_arch, 1);
62f3b8c8 23633
4547cb56
NC
23634 /* Tag_ABI_HardFP_use. */
23635 if (ARM_CPU_HAS_FEATURE (flags, fpu_vfp_ext_v1xd)
23636 && !ARM_CPU_HAS_FEATURE (flags, fpu_vfp_ext_v1))
23637 aeabi_set_attribute_int (Tag_ABI_HardFP_use, 1);
23638
ee065d83 23639 /* Tag_WMMX_arch. */
ee3c0378
AS
23640 if (ARM_CPU_HAS_FEATURE (flags, arm_cext_iwmmxt2))
23641 aeabi_set_attribute_int (Tag_WMMX_arch, 2);
23642 else if (ARM_CPU_HAS_FEATURE (flags, arm_cext_iwmmxt))
23643 aeabi_set_attribute_int (Tag_WMMX_arch, 1);
62f3b8c8 23644
ee3c0378 23645 /* Tag_Advanced_SIMD_arch (formerly Tag_NEON_arch). */
8e79c3df 23646 if (ARM_CPU_HAS_FEATURE (flags, fpu_neon_ext_v1))
62f3b8c8
PB
23647 aeabi_set_attribute_int
23648 (Tag_Advanced_SIMD_arch, (ARM_CPU_HAS_FEATURE (flags, fpu_neon_ext_fma)
23649 ? 2 : 1));
23650
ee3c0378 23651 /* Tag_VFP_HP_extension (formerly Tag_NEON_FP16_arch). */
62f3b8c8 23652 if (ARM_CPU_HAS_FEATURE (flags, fpu_vfp_fp16))
ee3c0378 23653 aeabi_set_attribute_int (Tag_VFP_HP_extension, 1);
4547cb56
NC
23654
23655 /* Tag_DIV_use. */
eea54501
MGD
23656 if (ARM_CPU_HAS_FEATURE (flags, arm_ext_adiv))
23657 aeabi_set_attribute_int (Tag_DIV_use, 2);
23658 else if (ARM_CPU_HAS_FEATURE (flags, arm_ext_div))
4547cb56 23659 aeabi_set_attribute_int (Tag_DIV_use, 0);
4547cb56
NC
23660 else
23661 aeabi_set_attribute_int (Tag_DIV_use, 1);
60e5ef9f
MGD
23662
23663 /* Tag_MP_extension_use. */
23664 if (ARM_CPU_HAS_FEATURE (flags, arm_ext_mp))
23665 aeabi_set_attribute_int (Tag_MPextension_use, 1);
f4c65163
MGD
23666
23667 /* Tag Virtualization_use. */
23668 if (ARM_CPU_HAS_FEATURE (flags, arm_ext_sec))
90ec0d68
MGD
23669 virt_sec |= 1;
23670 if (ARM_CPU_HAS_FEATURE (flags, arm_ext_virt))
23671 virt_sec |= 2;
23672 if (virt_sec != 0)
23673 aeabi_set_attribute_int (Tag_Virtualization_use, virt_sec);
ee065d83
PB
23674}
23675
104d59d1 23676/* Add the default contents for the .ARM.attributes section. */
ee065d83
PB
23677void
23678arm_md_end (void)
23679{
ee065d83
PB
23680 if (EF_ARM_EABI_VERSION (meabi_flags) < EF_ARM_EABI_VER4)
23681 return;
23682
23683 aeabi_set_public_attributes ();
ee065d83 23684}
8463be01 23685#endif /* OBJ_ELF */
ee065d83
PB
23686
23687
23688/* Parse a .cpu directive. */
23689
23690static void
23691s_arm_cpu (int ignored ATTRIBUTE_UNUSED)
23692{
e74cfd16 23693 const struct arm_cpu_option_table *opt;
ee065d83
PB
23694 char *name;
23695 char saved_char;
23696
23697 name = input_line_pointer;
5f4273c7 23698 while (*input_line_pointer && !ISSPACE (*input_line_pointer))
ee065d83
PB
23699 input_line_pointer++;
23700 saved_char = *input_line_pointer;
23701 *input_line_pointer = 0;
23702
23703 /* Skip the first "all" entry. */
23704 for (opt = arm_cpus + 1; opt->name != NULL; opt++)
23705 if (streq (opt->name, name))
23706 {
e74cfd16
PB
23707 mcpu_cpu_opt = &opt->value;
23708 selected_cpu = opt->value;
ee065d83 23709 if (opt->canonical_name)
5f4273c7 23710 strcpy (selected_cpu_name, opt->canonical_name);
ee065d83
PB
23711 else
23712 {
23713 int i;
23714 for (i = 0; opt->name[i]; i++)
23715 selected_cpu_name[i] = TOUPPER (opt->name[i]);
23716 selected_cpu_name[i] = 0;
23717 }
e74cfd16 23718 ARM_MERGE_FEATURE_SETS (cpu_variant, *mcpu_cpu_opt, *mfpu_opt);
ee065d83
PB
23719 *input_line_pointer = saved_char;
23720 demand_empty_rest_of_line ();
23721 return;
23722 }
23723 as_bad (_("unknown cpu `%s'"), name);
23724 *input_line_pointer = saved_char;
23725 ignore_rest_of_line ();
23726}
23727
23728
23729/* Parse a .arch directive. */
23730
23731static void
23732s_arm_arch (int ignored ATTRIBUTE_UNUSED)
23733{
e74cfd16 23734 const struct arm_arch_option_table *opt;
ee065d83
PB
23735 char saved_char;
23736 char *name;
23737
23738 name = input_line_pointer;
5f4273c7 23739 while (*input_line_pointer && !ISSPACE (*input_line_pointer))
ee065d83
PB
23740 input_line_pointer++;
23741 saved_char = *input_line_pointer;
23742 *input_line_pointer = 0;
23743
23744 /* Skip the first "all" entry. */
23745 for (opt = arm_archs + 1; opt->name != NULL; opt++)
23746 if (streq (opt->name, name))
23747 {
e74cfd16
PB
23748 mcpu_cpu_opt = &opt->value;
23749 selected_cpu = opt->value;
5f4273c7 23750 strcpy (selected_cpu_name, opt->name);
e74cfd16 23751 ARM_MERGE_FEATURE_SETS (cpu_variant, *mcpu_cpu_opt, *mfpu_opt);
ee065d83
PB
23752 *input_line_pointer = saved_char;
23753 demand_empty_rest_of_line ();
23754 return;
23755 }
23756
23757 as_bad (_("unknown architecture `%s'\n"), name);
23758 *input_line_pointer = saved_char;
23759 ignore_rest_of_line ();
23760}
23761
23762
7a1d4c38
PB
23763/* Parse a .object_arch directive. */
23764
23765static void
23766s_arm_object_arch (int ignored ATTRIBUTE_UNUSED)
23767{
23768 const struct arm_arch_option_table *opt;
23769 char saved_char;
23770 char *name;
23771
23772 name = input_line_pointer;
5f4273c7 23773 while (*input_line_pointer && !ISSPACE (*input_line_pointer))
7a1d4c38
PB
23774 input_line_pointer++;
23775 saved_char = *input_line_pointer;
23776 *input_line_pointer = 0;
23777
23778 /* Skip the first "all" entry. */
23779 for (opt = arm_archs + 1; opt->name != NULL; opt++)
23780 if (streq (opt->name, name))
23781 {
23782 object_arch = &opt->value;
23783 *input_line_pointer = saved_char;
23784 demand_empty_rest_of_line ();
23785 return;
23786 }
23787
23788 as_bad (_("unknown architecture `%s'\n"), name);
23789 *input_line_pointer = saved_char;
23790 ignore_rest_of_line ();
23791}
23792
69133863
MGD
23793/* Parse a .arch_extension directive. */
23794
23795static void
23796s_arm_arch_extension (int ignored ATTRIBUTE_UNUSED)
23797{
23798 const struct arm_option_extension_value_table *opt;
23799 char saved_char;
23800 char *name;
23801 int adding_value = 1;
23802
23803 name = input_line_pointer;
23804 while (*input_line_pointer && !ISSPACE (*input_line_pointer))
23805 input_line_pointer++;
23806 saved_char = *input_line_pointer;
23807 *input_line_pointer = 0;
23808
23809 if (strlen (name) >= 2
23810 && strncmp (name, "no", 2) == 0)
23811 {
23812 adding_value = 0;
23813 name += 2;
23814 }
23815
23816 for (opt = arm_extensions; opt->name != NULL; opt++)
23817 if (streq (opt->name, name))
23818 {
23819 if (!ARM_CPU_HAS_FEATURE (*mcpu_cpu_opt, opt->allowed_archs))
23820 {
23821 as_bad (_("architectural extension `%s' is not allowed for the "
23822 "current base architecture"), name);
23823 break;
23824 }
23825
23826 if (adding_value)
23827 ARM_MERGE_FEATURE_SETS (selected_cpu, selected_cpu, opt->value);
23828 else
23829 ARM_CLEAR_FEATURE (selected_cpu, selected_cpu, opt->value);
23830
23831 mcpu_cpu_opt = &selected_cpu;
23832 ARM_MERGE_FEATURE_SETS (cpu_variant, *mcpu_cpu_opt, *mfpu_opt);
23833 *input_line_pointer = saved_char;
23834 demand_empty_rest_of_line ();
23835 return;
23836 }
23837
23838 if (opt->name == NULL)
23839 as_bad (_("unknown architecture `%s'\n"), name);
23840
23841 *input_line_pointer = saved_char;
23842 ignore_rest_of_line ();
23843}
23844
ee065d83
PB
23845/* Parse a .fpu directive. */
23846
23847static void
23848s_arm_fpu (int ignored ATTRIBUTE_UNUSED)
23849{
69133863 23850 const struct arm_option_fpu_value_table *opt;
ee065d83
PB
23851 char saved_char;
23852 char *name;
23853
23854 name = input_line_pointer;
5f4273c7 23855 while (*input_line_pointer && !ISSPACE (*input_line_pointer))
ee065d83
PB
23856 input_line_pointer++;
23857 saved_char = *input_line_pointer;
23858 *input_line_pointer = 0;
5f4273c7 23859
ee065d83
PB
23860 for (opt = arm_fpus; opt->name != NULL; opt++)
23861 if (streq (opt->name, name))
23862 {
e74cfd16
PB
23863 mfpu_opt = &opt->value;
23864 ARM_MERGE_FEATURE_SETS (cpu_variant, *mcpu_cpu_opt, *mfpu_opt);
ee065d83
PB
23865 *input_line_pointer = saved_char;
23866 demand_empty_rest_of_line ();
23867 return;
23868 }
23869
23870 as_bad (_("unknown floating point format `%s'\n"), name);
23871 *input_line_pointer = saved_char;
23872 ignore_rest_of_line ();
23873}
ee065d83 23874
794ba86a 23875/* Copy symbol information. */
f31fef98 23876
794ba86a
DJ
23877void
23878arm_copy_symbol_attributes (symbolS *dest, symbolS *src)
23879{
23880 ARM_GET_FLAG (dest) = ARM_GET_FLAG (src);
23881}
e04befd0 23882
f31fef98 23883#ifdef OBJ_ELF
e04befd0
AS
23884/* Given a symbolic attribute NAME, return the proper integer value.
23885 Returns -1 if the attribute is not known. */
f31fef98 23886
e04befd0
AS
23887int
23888arm_convert_symbolic_attribute (const char *name)
23889{
f31fef98
NC
23890 static const struct
23891 {
23892 const char * name;
23893 const int tag;
23894 }
23895 attribute_table[] =
23896 {
23897 /* When you modify this table you should
23898 also modify the list in doc/c-arm.texi. */
e04befd0 23899#define T(tag) {#tag, tag}
f31fef98
NC
23900 T (Tag_CPU_raw_name),
23901 T (Tag_CPU_name),
23902 T (Tag_CPU_arch),
23903 T (Tag_CPU_arch_profile),
23904 T (Tag_ARM_ISA_use),
23905 T (Tag_THUMB_ISA_use),
75375b3e 23906 T (Tag_FP_arch),
f31fef98
NC
23907 T (Tag_VFP_arch),
23908 T (Tag_WMMX_arch),
23909 T (Tag_Advanced_SIMD_arch),
23910 T (Tag_PCS_config),
23911 T (Tag_ABI_PCS_R9_use),
23912 T (Tag_ABI_PCS_RW_data),
23913 T (Tag_ABI_PCS_RO_data),
23914 T (Tag_ABI_PCS_GOT_use),
23915 T (Tag_ABI_PCS_wchar_t),
23916 T (Tag_ABI_FP_rounding),
23917 T (Tag_ABI_FP_denormal),
23918 T (Tag_ABI_FP_exceptions),
23919 T (Tag_ABI_FP_user_exceptions),
23920 T (Tag_ABI_FP_number_model),
75375b3e 23921 T (Tag_ABI_align_needed),
f31fef98 23922 T (Tag_ABI_align8_needed),
75375b3e 23923 T (Tag_ABI_align_preserved),
f31fef98
NC
23924 T (Tag_ABI_align8_preserved),
23925 T (Tag_ABI_enum_size),
23926 T (Tag_ABI_HardFP_use),
23927 T (Tag_ABI_VFP_args),
23928 T (Tag_ABI_WMMX_args),
23929 T (Tag_ABI_optimization_goals),
23930 T (Tag_ABI_FP_optimization_goals),
23931 T (Tag_compatibility),
23932 T (Tag_CPU_unaligned_access),
75375b3e 23933 T (Tag_FP_HP_extension),
f31fef98
NC
23934 T (Tag_VFP_HP_extension),
23935 T (Tag_ABI_FP_16bit_format),
cd21e546
MGD
23936 T (Tag_MPextension_use),
23937 T (Tag_DIV_use),
f31fef98
NC
23938 T (Tag_nodefaults),
23939 T (Tag_also_compatible_with),
23940 T (Tag_conformance),
23941 T (Tag_T2EE_use),
23942 T (Tag_Virtualization_use),
cd21e546 23943 /* We deliberately do not include Tag_MPextension_use_legacy. */
e04befd0 23944#undef T
f31fef98 23945 };
e04befd0
AS
23946 unsigned int i;
23947
23948 if (name == NULL)
23949 return -1;
23950
f31fef98 23951 for (i = 0; i < ARRAY_SIZE (attribute_table); i++)
c921be7d 23952 if (streq (name, attribute_table[i].name))
e04befd0
AS
23953 return attribute_table[i].tag;
23954
23955 return -1;
23956}
267bf995
RR
23957
23958
23959/* Apply sym value for relocations only in the case that
23960 they are for local symbols and you have the respective
23961 architectural feature for blx and simple switches. */
23962int
23963arm_apply_sym_value (struct fix * fixP)
23964{
23965 if (fixP->fx_addsy
23966 && ARM_CPU_HAS_FEATURE (selected_cpu, arm_ext_v5t)
34e77a92 23967 && !S_FORCE_RELOC (fixP->fx_addsy, TRUE))
267bf995
RR
23968 {
23969 switch (fixP->fx_r_type)
23970 {
23971 case BFD_RELOC_ARM_PCREL_BLX:
23972 case BFD_RELOC_THUMB_PCREL_BRANCH23:
23973 if (ARM_IS_FUNC (fixP->fx_addsy))
23974 return 1;
23975 break;
23976
23977 case BFD_RELOC_ARM_PCREL_CALL:
23978 case BFD_RELOC_THUMB_PCREL_BLX:
23979 if (THUMB_IS_FUNC (fixP->fx_addsy))
23980 return 1;
23981 break;
23982
23983 default:
23984 break;
23985 }
23986
23987 }
23988 return 0;
23989}
f31fef98 23990#endif /* OBJ_ELF */
This page took 2.375226 seconds and 4 git commands to generate.