Subversion Repositories Kolibri OS

Rev

Rev 5191 | Go to most recent revision | Details | Compare with Previous | Last modification | View Log | RSS feed

Rev Author Line No. Line
5191 serge 1
/* AArch64 assembler/disassembler support.
2
 
6324 serge 3
   Copyright (C) 2009-2015 Free Software Foundation, Inc.
5191 serge 4
   Contributed by ARM Ltd.
5
 
6
   This file is part of GNU Binutils.
7
 
8
   This program is free software; you can redistribute it and/or modify
9
   it under the terms of the GNU General Public License as published by
10
   the Free Software Foundation; either version 3 of the license, or
11
   (at your option) any later version.
12
 
13
   This program is distributed in the hope that it will be useful,
14
   but WITHOUT ANY WARRANTY; without even the implied warranty of
15
   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
16
   GNU General Public License for more details.
17
 
18
   You should have received a copy of the GNU General Public License
19
   along with this program; see the file COPYING3. If not,
20
   see .  */
21
 
22
#ifndef OPCODE_AARCH64_H
23
#define OPCODE_AARCH64_H
24
 
25
#include "bfd.h"
26
#include "bfd_stdint.h"
27
#include 
28
#include 
29
 
6324 serge 30
#ifdef __cplusplus
31
extern "C" {
32
#endif
33
 
5191 serge 34
/* The offset for pc-relative addressing is currently defined to be 0.  */
35
#define AARCH64_PCREL_OFFSET		0
36
 
37
typedef uint32_t aarch64_insn;
38
 
39
/* The following bitmasks control CPU features.  */
40
#define AARCH64_FEATURE_V8	0x00000001	/* All processors.  */
6324 serge 41
#define AARCH64_FEATURE_V8_2	0x00000020      /* ARMv8.2 processors.  */
5191 serge 42
#define AARCH64_FEATURE_CRYPTO	0x00010000	/* Crypto instructions.  */
43
#define AARCH64_FEATURE_FP	0x00020000	/* FP instructions.  */
44
#define AARCH64_FEATURE_SIMD	0x00040000	/* SIMD instructions.  */
45
#define AARCH64_FEATURE_CRC	0x00080000	/* CRC instructions.  */
6324 serge 46
#define AARCH64_FEATURE_LSE	0x00100000	/* LSE instructions.  */
47
#define AARCH64_FEATURE_PAN	0x00200000	/* PAN instructions.  */
48
#define AARCH64_FEATURE_LOR	0x00400000	/* LOR instructions.  */
49
#define AARCH64_FEATURE_RDMA	0x00800000	/* v8.1 SIMD instructions.  */
50
#define AARCH64_FEATURE_V8_1	0x01000000	/* v8.1 features.  */
51
#define AARCH64_FEATURE_F16	0x02000000	/* v8.2 FP16 instructions.  */
52
#define AARCH64_FEATURE_RAS	0x04000000	/* RAS Extensions.  */
53
#define AARCH64_FEATURE_PROFILE	0x08000000	/* Statistical Profiling.  */
5191 serge 54
 
55
/* Architectures are the sum of the base and extensions.  */
56
#define AARCH64_ARCH_V8		AARCH64_FEATURE (AARCH64_FEATURE_V8, \
57
						 AARCH64_FEATURE_FP  \
58
						 | AARCH64_FEATURE_SIMD)
6324 serge 59
#define AARCH64_ARCH_V8_1	AARCH64_FEATURE (AARCH64_FEATURE_V8, \
60
						 AARCH64_FEATURE_FP  \
61
						 | AARCH64_FEATURE_SIMD	\
62
						 | AARCH64_FEATURE_CRC	\
63
						 | AARCH64_FEATURE_V8_1 \
64
						 | AARCH64_FEATURE_LSE	\
65
						 | AARCH64_FEATURE_PAN	\
66
						 | AARCH64_FEATURE_LOR	\
67
						 | AARCH64_FEATURE_RDMA)
68
#define AARCH64_ARCH_V8_2	AARCH64_FEATURE (AARCH64_FEATURE_V8,	\
69
						 AARCH64_FEATURE_V8_2	\
70
						 | AARCH64_FEATURE_F16	\
71
						 | AARCH64_FEATURE_RAS	\
72
						 | AARCH64_FEATURE_FP	\
73
						 | AARCH64_FEATURE_SIMD	\
74
						 | AARCH64_FEATURE_CRC	\
75
						 | AARCH64_FEATURE_V8_1 \
76
						 | AARCH64_FEATURE_LSE	\
77
						 | AARCH64_FEATURE_PAN	\
78
						 | AARCH64_FEATURE_LOR	\
79
						 | AARCH64_FEATURE_RDMA)
80
 
5191 serge 81
#define AARCH64_ARCH_NONE	AARCH64_FEATURE (0, 0)
82
#define AARCH64_ANY		AARCH64_FEATURE (-1, 0)	/* Any basic core.  */
83
 
84
/* CPU-specific features.  */
85
typedef unsigned long aarch64_feature_set;
86
 
87
#define AARCH64_CPU_HAS_FEATURE(CPU,FEAT)	\
88
  (((CPU) & (FEAT)) != 0)
89
 
90
#define AARCH64_MERGE_FEATURE_SETS(TARG,F1,F2)	\
91
  do						\
92
    {						\
93
      (TARG) = (F1) | (F2);			\
94
    }						\
95
  while (0)
96
 
97
#define AARCH64_CLEAR_FEATURE(TARG,F1,F2)	\
98
  do						\
99
    { 						\
100
      (TARG) = (F1) &~ (F2);			\
101
    }						\
102
  while (0)
103
 
104
#define AARCH64_FEATURE(core,coproc) ((core) | (coproc))
105
 
106
#define AARCH64_OPCODE_HAS_FEATURE(OPC,FEAT)	\
107
  (((OPC) & (FEAT)) != 0)
108
 
109
enum aarch64_operand_class
110
{
111
  AARCH64_OPND_CLASS_NIL,
112
  AARCH64_OPND_CLASS_INT_REG,
113
  AARCH64_OPND_CLASS_MODIFIED_REG,
114
  AARCH64_OPND_CLASS_FP_REG,
115
  AARCH64_OPND_CLASS_SIMD_REG,
116
  AARCH64_OPND_CLASS_SIMD_ELEMENT,
117
  AARCH64_OPND_CLASS_SISD_REG,
118
  AARCH64_OPND_CLASS_SIMD_REGLIST,
119
  AARCH64_OPND_CLASS_CP_REG,
120
  AARCH64_OPND_CLASS_ADDRESS,
121
  AARCH64_OPND_CLASS_IMMEDIATE,
122
  AARCH64_OPND_CLASS_SYSTEM,
123
  AARCH64_OPND_CLASS_COND,
124
};
125
 
126
/* Operand code that helps both parsing and coding.
127
   Keep AARCH64_OPERANDS synced.  */
128
 
129
enum aarch64_opnd
130
{
131
  AARCH64_OPND_NIL,	/* no operand---MUST BE FIRST!*/
132
 
133
  AARCH64_OPND_Rd,	/* Integer register as destination.  */
134
  AARCH64_OPND_Rn,	/* Integer register as source.  */
135
  AARCH64_OPND_Rm,	/* Integer register as source.  */
136
  AARCH64_OPND_Rt,	/* Integer register used in ld/st instructions.  */
137
  AARCH64_OPND_Rt2,	/* Integer register used in ld/st pair instructions.  */
138
  AARCH64_OPND_Rs,	/* Integer register used in ld/st exclusive.  */
139
  AARCH64_OPND_Ra,	/* Integer register used in ddp_3src instructions.  */
140
  AARCH64_OPND_Rt_SYS,	/* Integer register used in system instructions.  */
141
 
142
  AARCH64_OPND_Rd_SP,	/* Integer Rd or SP.  */
143
  AARCH64_OPND_Rn_SP,	/* Integer Rn or SP.  */
6324 serge 144
  AARCH64_OPND_PAIRREG,	/* Paired register operand.  */
5191 serge 145
  AARCH64_OPND_Rm_EXT,	/* Integer Rm extended.  */
146
  AARCH64_OPND_Rm_SFT,	/* Integer Rm shifted.  */
147
 
148
  AARCH64_OPND_Fd,	/* Floating-point Fd.  */
149
  AARCH64_OPND_Fn,	/* Floating-point Fn.  */
150
  AARCH64_OPND_Fm,	/* Floating-point Fm.  */
151
  AARCH64_OPND_Fa,	/* Floating-point Fa.  */
152
  AARCH64_OPND_Ft,	/* Floating-point Ft.  */
153
  AARCH64_OPND_Ft2,	/* Floating-point Ft2.  */
154
 
155
  AARCH64_OPND_Sd,	/* AdvSIMD Scalar Sd.  */
156
  AARCH64_OPND_Sn,	/* AdvSIMD Scalar Sn.  */
157
  AARCH64_OPND_Sm,	/* AdvSIMD Scalar Sm.  */
158
 
159
  AARCH64_OPND_Vd,	/* AdvSIMD Vector Vd.  */
160
  AARCH64_OPND_Vn,	/* AdvSIMD Vector Vn.  */
161
  AARCH64_OPND_Vm,	/* AdvSIMD Vector Vm.  */
162
  AARCH64_OPND_VdD1,	/* AdvSIMD .D[1]; for FMOV only.  */
163
  AARCH64_OPND_VnD1,	/* AdvSIMD .D[1]; for FMOV only.  */
164
  AARCH64_OPND_Ed,	/* AdvSIMD Vector Element Vd.  */
165
  AARCH64_OPND_En,	/* AdvSIMD Vector Element Vn.  */
166
  AARCH64_OPND_Em,	/* AdvSIMD Vector Element Vm.  */
167
  AARCH64_OPND_LVn,	/* AdvSIMD Vector register list used in e.g. TBL.  */
168
  AARCH64_OPND_LVt,	/* AdvSIMD Vector register list used in ld/st.  */
169
  AARCH64_OPND_LVt_AL,	/* AdvSIMD Vector register list for loading single
170
			   structure to all lanes.  */
171
  AARCH64_OPND_LEt,	/* AdvSIMD Vector Element list.  */
172
 
173
  AARCH64_OPND_Cn,	/* Co-processor register in CRn field.  */
174
  AARCH64_OPND_Cm,	/* Co-processor register in CRm field.  */
175
 
176
  AARCH64_OPND_IDX,	/* AdvSIMD EXT index operand.  */
177
  AARCH64_OPND_IMM_VLSL,/* Immediate for shifting vector registers left.  */
178
  AARCH64_OPND_IMM_VLSR,/* Immediate for shifting vector registers right.  */
179
  AARCH64_OPND_SIMD_IMM,/* AdvSIMD modified immediate without shift.  */
180
  AARCH64_OPND_SIMD_IMM_SFT,	/* AdvSIMD modified immediate with shift.  */
181
  AARCH64_OPND_SIMD_FPIMM,/* AdvSIMD 8-bit fp immediate.  */
182
  AARCH64_OPND_SHLL_IMM,/* Immediate shift for AdvSIMD SHLL instruction
183
			   (no encoding).  */
184
  AARCH64_OPND_IMM0,	/* Immediate for #0.  */
185
  AARCH64_OPND_FPIMM0,	/* Immediate for #0.0.  */
186
  AARCH64_OPND_FPIMM,	/* Floating-point Immediate.  */
187
  AARCH64_OPND_IMMR,	/* Immediate # in e.g. BFM.  */
188
  AARCH64_OPND_IMMS,	/* Immediate # in e.g. BFM.  */
189
  AARCH64_OPND_WIDTH,	/* Immediate # in e.g. BFI.  */
190
  AARCH64_OPND_IMM,	/* Immediate.  */
191
  AARCH64_OPND_UIMM3_OP1,/* Unsigned 3-bit immediate in the op1 field.  */
192
  AARCH64_OPND_UIMM3_OP2,/* Unsigned 3-bit immediate in the op2 field.  */
193
  AARCH64_OPND_UIMM4,	/* Unsigned 4-bit immediate in the CRm field.  */
194
  AARCH64_OPND_UIMM7,	/* Unsigned 7-bit immediate in the CRm:op2 fields.  */
195
  AARCH64_OPND_BIT_NUM,	/* Immediate.  */
196
  AARCH64_OPND_EXCEPTION,/* imm16 operand in exception instructions.  */
197
  AARCH64_OPND_CCMP_IMM,/* Immediate in conditional compare instructions.  */
198
  AARCH64_OPND_NZCV,	/* Flag bit specifier giving an alternative value for
199
			   each condition flag.  */
200
 
201
  AARCH64_OPND_LIMM,	/* Logical Immediate.  */
202
  AARCH64_OPND_AIMM,	/* Arithmetic immediate.  */
203
  AARCH64_OPND_HALF,	/* #{, LSL #} operand in move wide.  */
204
  AARCH64_OPND_FBITS,	/* FP # operand in e.g. SCVTF */
205
  AARCH64_OPND_IMM_MOV,	/* Immediate operand for the MOV alias.  */
206
 
207
  AARCH64_OPND_COND,	/* Standard condition as the last operand.  */
208
  AARCH64_OPND_COND1,	/* Same as the above, but excluding AL and NV.  */
209
 
210
  AARCH64_OPND_ADDR_ADRP,	/* Memory address for ADRP */
211
  AARCH64_OPND_ADDR_PCREL14,	/* 14-bit PC-relative address for e.g. TBZ.  */
212
  AARCH64_OPND_ADDR_PCREL19,	/* 19-bit PC-relative address for e.g. LDR.  */
213
  AARCH64_OPND_ADDR_PCREL21,	/* 21-bit PC-relative address for e.g. ADR.  */
214
  AARCH64_OPND_ADDR_PCREL26,	/* 26-bit PC-relative address for e.g. BL.  */
215
 
216
  AARCH64_OPND_ADDR_SIMPLE,	/* Address of ld/st exclusive.  */
217
  AARCH64_OPND_ADDR_REGOFF,	/* Address of register offset.  */
218
  AARCH64_OPND_ADDR_SIMM7,	/* Address of signed 7-bit immediate.  */
219
  AARCH64_OPND_ADDR_SIMM9,	/* Address of signed 9-bit immediate.  */
220
  AARCH64_OPND_ADDR_SIMM9_2,	/* Same as the above, but the immediate is
221
				   negative or unaligned and there is
222
				   no writeback allowed.  This operand code
223
				   is only used to support the programmer-
224
				   friendly feature of using LDR/STR as the
225
				   the mnemonic name for LDUR/STUR instructions
226
				   wherever there is no ambiguity.  */
227
  AARCH64_OPND_ADDR_UIMM12,	/* Address of unsigned 12-bit immediate.  */
228
  AARCH64_OPND_SIMD_ADDR_SIMPLE,/* Address of ld/st multiple structures.  */
229
  AARCH64_OPND_SIMD_ADDR_POST,	/* Address of ld/st multiple post-indexed.  */
230
 
231
  AARCH64_OPND_SYSREG,		/* System register operand.  */
232
  AARCH64_OPND_PSTATEFIELD,	/* PSTATE field name operand.  */
233
  AARCH64_OPND_SYSREG_AT,	/* System register  operand.  */
234
  AARCH64_OPND_SYSREG_DC,	/* System register  operand.  */
235
  AARCH64_OPND_SYSREG_IC,	/* System register  operand.  */
236
  AARCH64_OPND_SYSREG_TLBI,	/* System register  operand.  */
237
  AARCH64_OPND_BARRIER,		/* Barrier operand.  */
238
  AARCH64_OPND_BARRIER_ISB,	/* Barrier operand for ISB.  */
239
  AARCH64_OPND_PRFOP,		/* Prefetch operation.  */
6324 serge 240
  AARCH64_OPND_BARRIER_PSB,	/* Barrier operand for PSB.  */
5191 serge 241
};
242
 
243
/* Qualifier constrains an operand.  It either specifies a variant of an
244
   operand type or limits values available to an operand type.
245
 
246
   N.B. Order is important; keep aarch64_opnd_qualifiers synced.  */
247
 
248
enum aarch64_opnd_qualifier
249
{
250
  /* Indicating no further qualification on an operand.  */
251
  AARCH64_OPND_QLF_NIL,
252
 
253
  /* Qualifying an operand which is a general purpose (integer) register;
254
     indicating the operand data size or a specific register.  */
255
  AARCH64_OPND_QLF_W,	/* Wn, WZR or WSP.  */
256
  AARCH64_OPND_QLF_X,	/* Xn, XZR or XSP.  */
257
  AARCH64_OPND_QLF_WSP,	/* WSP.  */
258
  AARCH64_OPND_QLF_SP,	/* SP.  */
259
 
260
  /* Qualifying an operand which is a floating-point register, a SIMD
261
     vector element or a SIMD vector element list; indicating operand data
262
     size or the size of each SIMD vector element in the case of a SIMD
263
     vector element list.
264
     These qualifiers are also used to qualify an address operand to
265
     indicate the size of data element a load/store instruction is
266
     accessing.
267
     They are also used for the immediate shift operand in e.g. SSHR.  Such
268
     a use is only for the ease of operand encoding/decoding and qualifier
269
     sequence matching; such a use should not be applied widely; use the value
270
     constraint qualifiers for immediate operands wherever possible.  */
271
  AARCH64_OPND_QLF_S_B,
272
  AARCH64_OPND_QLF_S_H,
273
  AARCH64_OPND_QLF_S_S,
274
  AARCH64_OPND_QLF_S_D,
275
  AARCH64_OPND_QLF_S_Q,
276
 
277
  /* Qualifying an operand which is a SIMD vector register or a SIMD vector
278
     register list; indicating register shape.
279
     They are also used for the immediate shift operand in e.g. SSHR.  Such
280
     a use is only for the ease of operand encoding/decoding and qualifier
281
     sequence matching; such a use should not be applied widely; use the value
282
     constraint qualifiers for immediate operands wherever possible.  */
283
  AARCH64_OPND_QLF_V_8B,
284
  AARCH64_OPND_QLF_V_16B,
6324 serge 285
  AARCH64_OPND_QLF_V_2H,
5191 serge 286
  AARCH64_OPND_QLF_V_4H,
287
  AARCH64_OPND_QLF_V_8H,
288
  AARCH64_OPND_QLF_V_2S,
289
  AARCH64_OPND_QLF_V_4S,
290
  AARCH64_OPND_QLF_V_1D,
291
  AARCH64_OPND_QLF_V_2D,
292
  AARCH64_OPND_QLF_V_1Q,
293
 
294
  /* Constraint on value.  */
295
  AARCH64_OPND_QLF_imm_0_7,
296
  AARCH64_OPND_QLF_imm_0_15,
297
  AARCH64_OPND_QLF_imm_0_31,
298
  AARCH64_OPND_QLF_imm_0_63,
299
  AARCH64_OPND_QLF_imm_1_32,
300
  AARCH64_OPND_QLF_imm_1_64,
301
 
302
  /* Indicate whether an AdvSIMD modified immediate operand is shift-zeros
303
     or shift-ones.  */
304
  AARCH64_OPND_QLF_LSL,
305
  AARCH64_OPND_QLF_MSL,
306
 
307
  /* Special qualifier helping retrieve qualifier information during the
308
     decoding time (currently not in use).  */
309
  AARCH64_OPND_QLF_RETRIEVE,
310
};
311
 
312
/* Instruction class.  */
313
 
314
enum aarch64_insn_class
315
{
316
  addsub_carry,
317
  addsub_ext,
318
  addsub_imm,
319
  addsub_shift,
320
  asimdall,
321
  asimddiff,
322
  asimdelem,
323
  asimdext,
324
  asimdimm,
325
  asimdins,
326
  asimdmisc,
327
  asimdperm,
328
  asimdsame,
329
  asimdshf,
330
  asimdtbl,
331
  asisddiff,
332
  asisdelem,
333
  asisdlse,
334
  asisdlsep,
335
  asisdlso,
336
  asisdlsop,
337
  asisdmisc,
338
  asisdone,
339
  asisdpair,
340
  asisdsame,
341
  asisdshf,
342
  bitfield,
343
  branch_imm,
344
  branch_reg,
345
  compbranch,
346
  condbranch,
347
  condcmp_imm,
348
  condcmp_reg,
349
  condsel,
350
  cryptoaes,
351
  cryptosha2,
352
  cryptosha3,
353
  dp_1src,
354
  dp_2src,
355
  dp_3src,
356
  exception,
357
  extract,
358
  float2fix,
359
  float2int,
360
  floatccmp,
361
  floatcmp,
362
  floatdp1,
363
  floatdp2,
364
  floatdp3,
365
  floatimm,
366
  floatsel,
367
  ldst_immpost,
368
  ldst_immpre,
369
  ldst_imm9,	/* immpost or immpre */
370
  ldst_pos,
371
  ldst_regoff,
372
  ldst_unpriv,
373
  ldst_unscaled,
374
  ldstexcl,
375
  ldstnapair_offs,
376
  ldstpair_off,
377
  ldstpair_indexed,
378
  loadlit,
379
  log_imm,
380
  log_shift,
6324 serge 381
  lse_atomic,
5191 serge 382
  movewide,
383
  pcreladdr,
384
  ic_system,
385
  testbranch,
386
};
387
 
388
/* Opcode enumerators.  */
389
 
390
enum aarch64_op
391
{
392
  OP_NIL,
393
  OP_STRB_POS,
394
  OP_LDRB_POS,
395
  OP_LDRSB_POS,
396
  OP_STRH_POS,
397
  OP_LDRH_POS,
398
  OP_LDRSH_POS,
399
  OP_STR_POS,
400
  OP_LDR_POS,
401
  OP_STRF_POS,
402
  OP_LDRF_POS,
403
  OP_LDRSW_POS,
404
  OP_PRFM_POS,
405
 
406
  OP_STURB,
407
  OP_LDURB,
408
  OP_LDURSB,
409
  OP_STURH,
410
  OP_LDURH,
411
  OP_LDURSH,
412
  OP_STUR,
413
  OP_LDUR,
414
  OP_STURV,
415
  OP_LDURV,
416
  OP_LDURSW,
417
  OP_PRFUM,
418
 
419
  OP_LDR_LIT,
420
  OP_LDRV_LIT,
421
  OP_LDRSW_LIT,
422
  OP_PRFM_LIT,
423
 
424
  OP_ADD,
425
  OP_B,
426
  OP_BL,
427
 
428
  OP_MOVN,
429
  OP_MOVZ,
430
  OP_MOVK,
431
 
432
  OP_MOV_IMM_LOG,	/* MOV alias for moving bitmask immediate.  */
433
  OP_MOV_IMM_WIDE,	/* MOV alias for moving wide immediate.  */
434
  OP_MOV_IMM_WIDEN,	/* MOV alias for moving wide immediate (negated).  */
435
 
436
  OP_MOV_V,		/* MOV alias for moving vector register.  */
437
 
438
  OP_ASR_IMM,
439
  OP_LSR_IMM,
440
  OP_LSL_IMM,
441
 
442
  OP_BIC,
443
 
444
  OP_UBFX,
445
  OP_BFXIL,
446
  OP_SBFX,
447
  OP_SBFIZ,
448
  OP_BFI,
6324 serge 449
  OP_BFC,		/* ARMv8.2.  */
5191 serge 450
  OP_UBFIZ,
451
  OP_UXTB,
452
  OP_UXTH,
453
  OP_UXTW,
454
 
455
  OP_CINC,
456
  OP_CINV,
457
  OP_CNEG,
458
  OP_CSET,
459
  OP_CSETM,
460
 
461
  OP_FCVT,
462
  OP_FCVTN,
463
  OP_FCVTN2,
464
  OP_FCVTL,
465
  OP_FCVTL2,
466
  OP_FCVTXN_S,		/* Scalar version.  */
467
 
468
  OP_ROR_IMM,
469
 
470
  OP_SXTL,
471
  OP_SXTL2,
472
  OP_UXTL,
473
  OP_UXTL2,
474
 
475
  OP_TOTAL_NUM,		/* Pseudo.  */
476
};
477
 
478
/* Maximum number of operands an instruction can have.  */
479
#define AARCH64_MAX_OPND_NUM 6
480
/* Maximum number of qualifier sequences an instruction can have.  */
481
#define AARCH64_MAX_QLF_SEQ_NUM 10
482
/* Operand qualifier typedef; optimized for the size.  */
483
typedef unsigned char aarch64_opnd_qualifier_t;
484
/* Operand qualifier sequence typedef.  */
485
typedef aarch64_opnd_qualifier_t	\
486
	  aarch64_opnd_qualifier_seq_t [AARCH64_MAX_OPND_NUM];
487
 
488
/* FIXME: improve the efficiency.  */
489
static inline bfd_boolean
490
empty_qualifier_sequence_p (const aarch64_opnd_qualifier_t *qualifiers)
491
{
492
  int i;
493
  for (i = 0; i < AARCH64_MAX_OPND_NUM; ++i)
494
    if (qualifiers[i] != AARCH64_OPND_QLF_NIL)
495
      return FALSE;
496
  return TRUE;
497
}
498
 
499
/* This structure holds information for a particular opcode.  */
500
 
501
struct aarch64_opcode
502
{
503
  /* The name of the mnemonic.  */
504
  const char *name;
505
 
506
  /* The opcode itself.  Those bits which will be filled in with
507
     operands are zeroes.  */
508
  aarch64_insn opcode;
509
 
510
  /* The opcode mask.  This is used by the disassembler.  This is a
511
     mask containing ones indicating those bits which must match the
512
     opcode field, and zeroes indicating those bits which need not
513
     match (and are presumably filled in by operands).  */
514
  aarch64_insn mask;
515
 
516
  /* Instruction class.  */
517
  enum aarch64_insn_class iclass;
518
 
519
  /* Enumerator identifier.  */
520
  enum aarch64_op op;
521
 
522
  /* Which architecture variant provides this instruction.  */
523
  const aarch64_feature_set *avariant;
524
 
525
  /* An array of operand codes.  Each code is an index into the
526
     operand table.  They appear in the order which the operands must
527
     appear in assembly code, and are terminated by a zero.  */
528
  enum aarch64_opnd operands[AARCH64_MAX_OPND_NUM];
529
 
530
  /* A list of operand qualifier code sequence.  Each operand qualifier
531
     code qualifies the corresponding operand code.  Each operand
532
     qualifier sequence specifies a valid opcode variant and related
533
     constraint on operands.  */
534
  aarch64_opnd_qualifier_seq_t qualifiers_list[AARCH64_MAX_QLF_SEQ_NUM];
535
 
536
  /* Flags providing information about this instruction */
537
  uint32_t flags;
538
};
539
 
540
typedef struct aarch64_opcode aarch64_opcode;
541
 
542
/* Table describing all the AArch64 opcodes.  */
543
extern aarch64_opcode aarch64_opcode_table[];
544
 
545
/* Opcode flags.  */
546
#define F_ALIAS (1 << 0)
547
#define F_HAS_ALIAS (1 << 1)
548
/* Disassembly preference priority 1-3 (the larger the higher).  If nothing
549
   is specified, it is the priority 0 by default, i.e. the lowest priority.  */
550
#define F_P1 (1 << 2)
551
#define F_P2 (2 << 2)
552
#define F_P3 (3 << 2)
553
/* Flag an instruction that is truly conditional executed, e.g. b.cond.  */
554
#define F_COND (1 << 4)
555
/* Instruction has the field of 'sf'.  */
556
#define F_SF (1 << 5)
557
/* Instruction has the field of 'size:Q'.  */
558
#define F_SIZEQ (1 << 6)
559
/* Floating-point instruction has the field of 'type'.  */
560
#define F_FPTYPE (1 << 7)
561
/* AdvSIMD scalar instruction has the field of 'size'.  */
562
#define F_SSIZE (1 << 8)
563
/* AdvSIMD vector register arrangement specifier encoded in "imm5<3:0>:Q".  */
564
#define F_T (1 << 9)
565
/* Size of GPR operand in AdvSIMD instructions encoded in Q.  */
566
#define F_GPRSIZE_IN_Q (1 << 10)
567
/* Size of Rt load signed instruction encoded in opc[0], i.e. bit 22.  */
568
#define F_LDS_SIZE (1 << 11)
569
/* Optional operand; assume maximum of 1 operand can be optional.  */
570
#define F_OPD0_OPT (1 << 12)
571
#define F_OPD1_OPT (2 << 12)
572
#define F_OPD2_OPT (3 << 12)
573
#define F_OPD3_OPT (4 << 12)
574
#define F_OPD4_OPT (5 << 12)
575
/* Default value for the optional operand when omitted from the assembly.  */
576
#define F_DEFAULT(X) (((X) & 0x1f) << 15)
577
/* Instruction that is an alias of another instruction needs to be
578
   encoded/decoded by converting it to/from the real form, followed by
579
   the encoding/decoding according to the rules of the real opcode.
580
   This compares to the direct coding using the alias's information.
581
   N.B. this flag requires F_ALIAS to be used together.  */
582
#define F_CONV (1 << 20)
583
/* Use together with F_ALIAS to indicate an alias opcode is a programmer
584
   friendly pseudo instruction available only in the assembly code (thus will
585
   not show up in the disassembly).  */
586
#define F_PSEUDO (1 << 21)
587
/* Instruction has miscellaneous encoding/decoding rules.  */
588
#define F_MISC (1 << 22)
589
/* Instruction has the field of 'N'; used in conjunction with F_SF.  */
590
#define F_N (1 << 23)
591
/* Opcode dependent field.  */
592
#define F_OD(X) (((X) & 0x7) << 24)
6324 serge 593
/* Instruction has the field of 'sz'.  */
594
#define F_LSE_SZ (1 << 27)
595
/* Next bit is 28.  */
5191 serge 596
 
597
static inline bfd_boolean
598
alias_opcode_p (const aarch64_opcode *opcode)
599
{
600
  return (opcode->flags & F_ALIAS) ? TRUE : FALSE;
601
}
602
 
603
static inline bfd_boolean
604
opcode_has_alias (const aarch64_opcode *opcode)
605
{
606
  return (opcode->flags & F_HAS_ALIAS) ? TRUE : FALSE;
607
}
608
 
609
/* Priority for disassembling preference.  */
610
static inline int
611
opcode_priority (const aarch64_opcode *opcode)
612
{
613
  return (opcode->flags >> 2) & 0x3;
614
}
615
 
616
static inline bfd_boolean
617
pseudo_opcode_p (const aarch64_opcode *opcode)
618
{
619
  return (opcode->flags & F_PSEUDO) != 0lu ? TRUE : FALSE;
620
}
621
 
622
static inline bfd_boolean
623
optional_operand_p (const aarch64_opcode *opcode, unsigned int idx)
624
{
625
  return (((opcode->flags >> 12) & 0x7) == idx + 1)
626
    ? TRUE : FALSE;
627
}
628
 
629
static inline aarch64_insn
630
get_optional_operand_default_value (const aarch64_opcode *opcode)
631
{
632
  return (opcode->flags >> 15) & 0x1f;
633
}
634
 
635
static inline unsigned int
636
get_opcode_dependent_value (const aarch64_opcode *opcode)
637
{
638
  return (opcode->flags >> 24) & 0x7;
639
}
640
 
641
static inline bfd_boolean
642
opcode_has_special_coder (const aarch64_opcode *opcode)
643
{
6324 serge 644
  return (opcode->flags & (F_SF | F_LSE_SZ | F_SIZEQ | F_FPTYPE | F_SSIZE | F_T
5191 serge 645
	  | F_GPRSIZE_IN_Q | F_LDS_SIZE | F_MISC | F_N | F_COND)) ? TRUE
646
    : FALSE;
647
}
648
 
649
struct aarch64_name_value_pair
650
{
651
  const char *  name;
652
  aarch64_insn	value;
653
};
654
 
655
extern const struct aarch64_name_value_pair aarch64_operand_modifiers [];
656
extern const struct aarch64_name_value_pair aarch64_barrier_options [16];
657
extern const struct aarch64_name_value_pair aarch64_prfops [32];
6324 serge 658
extern const struct aarch64_name_value_pair aarch64_hint_options [];
5191 serge 659
 
660
typedef struct
661
{
662
  const char *  name;
663
  aarch64_insn	value;
664
  uint32_t	flags;
665
} aarch64_sys_reg;
666
 
667
extern const aarch64_sys_reg aarch64_sys_regs [];
668
extern const aarch64_sys_reg aarch64_pstatefields [];
669
extern bfd_boolean aarch64_sys_reg_deprecated_p (const aarch64_sys_reg *);
6324 serge 670
extern bfd_boolean aarch64_sys_reg_supported_p (const aarch64_feature_set,
671
						const aarch64_sys_reg *);
672
extern bfd_boolean aarch64_pstatefield_supported_p (const aarch64_feature_set,
673
						    const aarch64_sys_reg *);
5191 serge 674
 
675
typedef struct
676
{
6324 serge 677
  const char *name;
5191 serge 678
  uint32_t value;
6324 serge 679
  uint32_t flags ;
5191 serge 680
} aarch64_sys_ins_reg;
681
 
6324 serge 682
extern bfd_boolean aarch64_sys_ins_reg_has_xt (const aarch64_sys_ins_reg *);
683
extern bfd_boolean
684
aarch64_sys_ins_reg_supported_p (const aarch64_feature_set,
685
				 const aarch64_sys_ins_reg *);
686
 
5191 serge 687
extern const aarch64_sys_ins_reg aarch64_sys_regs_ic [];
688
extern const aarch64_sys_ins_reg aarch64_sys_regs_dc [];
689
extern const aarch64_sys_ins_reg aarch64_sys_regs_at [];
690
extern const aarch64_sys_ins_reg aarch64_sys_regs_tlbi [];
691
 
692
/* Shift/extending operator kinds.
693
   N.B. order is important; keep aarch64_operand_modifiers synced.  */
694
enum aarch64_modifier_kind
695
{
696
  AARCH64_MOD_NONE,
697
  AARCH64_MOD_MSL,
698
  AARCH64_MOD_ROR,
699
  AARCH64_MOD_ASR,
700
  AARCH64_MOD_LSR,
701
  AARCH64_MOD_LSL,
702
  AARCH64_MOD_UXTB,
703
  AARCH64_MOD_UXTH,
704
  AARCH64_MOD_UXTW,
705
  AARCH64_MOD_UXTX,
706
  AARCH64_MOD_SXTB,
707
  AARCH64_MOD_SXTH,
708
  AARCH64_MOD_SXTW,
709
  AARCH64_MOD_SXTX,
710
};
711
 
712
bfd_boolean
713
aarch64_extend_operator_p (enum aarch64_modifier_kind);
714
 
715
enum aarch64_modifier_kind
716
aarch64_get_operand_modifier (const struct aarch64_name_value_pair *);
717
/* Condition.  */
718
 
719
typedef struct
720
{
721
  /* A list of names with the first one as the disassembly preference;
722
     terminated by NULL if fewer than 3.  */
723
  const char *names[3];
724
  aarch64_insn value;
725
} aarch64_cond;
726
 
727
extern const aarch64_cond aarch64_conds[16];
728
 
729
const aarch64_cond* get_cond_from_value (aarch64_insn value);
730
const aarch64_cond* get_inverted_cond (const aarch64_cond *cond);
731
 
732
/* Structure representing an operand.  */
733
 
734
struct aarch64_opnd_info
735
{
736
  enum aarch64_opnd type;
737
  aarch64_opnd_qualifier_t qualifier;
738
  int idx;
739
 
740
  union
741
    {
742
      struct
743
	{
744
	  unsigned regno;
745
	} reg;
746
      struct
747
	{
748
	  unsigned regno : 5;
749
	  unsigned index : 4;
750
	} reglane;
751
      /* e.g. LVn.  */
752
      struct
753
	{
754
	  unsigned first_regno : 5;
755
	  unsigned num_regs : 3;
756
	  /* 1 if it is a list of reg element.  */
757
	  unsigned has_index : 1;
758
	  /* Lane index; valid only when has_index is 1.  */
759
	  unsigned index : 4;
760
	} reglist;
761
      /* e.g. immediate or pc relative address offset.  */
762
      struct
763
	{
764
	  int64_t value;
765
	  unsigned is_fp : 1;
766
	} imm;
767
      /* e.g. address in STR (register offset).  */
768
      struct
769
	{
770
	  unsigned base_regno;
771
	  struct
772
	    {
773
	      union
774
		{
775
		  int imm;
776
		  unsigned regno;
777
		};
778
	      unsigned is_reg;
779
	    } offset;
780
	  unsigned pcrel : 1;		/* PC-relative.  */
781
	  unsigned writeback : 1;
782
	  unsigned preind : 1;		/* Pre-indexed.  */
783
	  unsigned postind : 1;		/* Post-indexed.  */
784
	} addr;
785
      const aarch64_cond *cond;
786
      /* The encoding of the system register.  */
787
      aarch64_insn sysreg;
788
      /* The encoding of the PSTATE field.  */
789
      aarch64_insn pstatefield;
790
      const aarch64_sys_ins_reg *sysins_op;
791
      const struct aarch64_name_value_pair *barrier;
6324 serge 792
      const struct aarch64_name_value_pair *hint_option;
5191 serge 793
      const struct aarch64_name_value_pair *prfop;
794
    };
795
 
796
  /* Operand shifter; in use when the operand is a register offset address,
797
     add/sub extended reg, etc. e.g. {,  {#}}.  */
798
  struct
799
    {
800
      enum aarch64_modifier_kind kind;
801
      int amount;
802
      unsigned operator_present: 1;	/* Only valid during encoding.  */
803
      /* Value of the 'S' field in ld/st reg offset; used only in decoding.  */
804
      unsigned amount_present: 1;
805
    } shifter;
806
 
807
  unsigned skip:1;	/* Operand is not completed if there is a fixup needed
808
			   to be done on it.  In some (but not all) of these
809
			   cases, we need to tell libopcodes to skip the
810
			   constraint checking and the encoding for this
811
			   operand, so that the libopcodes can pick up the
812
			   right opcode before the operand is fixed-up.  This
813
			   flag should only be used during the
814
			   assembling/encoding.  */
815
  unsigned present:1;	/* Whether this operand is present in the assembly
816
			   line; not used during the disassembly.  */
817
};
818
 
819
typedef struct aarch64_opnd_info aarch64_opnd_info;
820
 
821
/* Structure representing an instruction.
822
 
823
   It is used during both the assembling and disassembling.  The assembler
824
   fills an aarch64_inst after a successful parsing and then passes it to the
825
   encoding routine to do the encoding.  During the disassembling, the
826
   disassembler calls the decoding routine to decode a binary instruction; on a
827
   successful return, such a structure will be filled with information of the
828
   instruction; then the disassembler uses the information to print out the
829
   instruction.  */
830
 
831
struct aarch64_inst
832
{
833
  /* The value of the binary instruction.  */
834
  aarch64_insn value;
835
 
836
  /* Corresponding opcode entry.  */
837
  const aarch64_opcode *opcode;
838
 
839
  /* Condition for a truly conditional-executed instrutions, e.g. b.cond.  */
840
  const aarch64_cond *cond;
841
 
842
  /* Operands information.  */
843
  aarch64_opnd_info operands[AARCH64_MAX_OPND_NUM];
844
};
845
 
846
typedef struct aarch64_inst aarch64_inst;
847
 
848
/* Diagnosis related declaration and interface.  */
849
 
850
/* Operand error kind enumerators.
851
 
852
   AARCH64_OPDE_RECOVERABLE
853
     Less severe error found during the parsing, very possibly because that
854
     GAS has picked up a wrong instruction template for the parsing.
855
 
856
   AARCH64_OPDE_SYNTAX_ERROR
857
     General syntax error; it can be either a user error, or simply because
858
     that GAS is trying a wrong instruction template.
859
 
860
   AARCH64_OPDE_FATAL_SYNTAX_ERROR
861
     Definitely a user syntax error.
862
 
863
   AARCH64_OPDE_INVALID_VARIANT
864
     No syntax error, but the operands are not a valid combination, e.g.
865
     FMOV D0,S0
866
 
867
   AARCH64_OPDE_OUT_OF_RANGE
868
     Error about some immediate value out of a valid range.
869
 
870
   AARCH64_OPDE_UNALIGNED
871
     Error about some immediate value not properly aligned (i.e. not being a
872
     multiple times of a certain value).
873
 
874
   AARCH64_OPDE_REG_LIST
875
     Error about the register list operand having unexpected number of
876
     registers.
877
 
878
   AARCH64_OPDE_OTHER_ERROR
879
     Error of the highest severity and used for any severe issue that does not
880
     fall into any of the above categories.
881
 
882
   The enumerators are only interesting to GAS.  They are declared here (in
883
   libopcodes) because that some errors are detected (and then notified to GAS)
884
   by libopcodes (rather than by GAS solely).
885
 
886
   The first three errors are only deteced by GAS while the
887
   AARCH64_OPDE_INVALID_VARIANT error can only be spotted by libopcodes as
888
   only libopcodes has the information about the valid variants of each
889
   instruction.
890
 
891
   The enumerators have an increasing severity.  This is helpful when there are
892
   multiple instruction templates available for a given mnemonic name (e.g.
893
   FMOV); this mechanism will help choose the most suitable template from which
894
   the generated diagnostics can most closely describe the issues, if any.  */
895
 
896
enum aarch64_operand_error_kind
897
{
898
  AARCH64_OPDE_NIL,
899
  AARCH64_OPDE_RECOVERABLE,
900
  AARCH64_OPDE_SYNTAX_ERROR,
901
  AARCH64_OPDE_FATAL_SYNTAX_ERROR,
902
  AARCH64_OPDE_INVALID_VARIANT,
903
  AARCH64_OPDE_OUT_OF_RANGE,
904
  AARCH64_OPDE_UNALIGNED,
905
  AARCH64_OPDE_REG_LIST,
906
  AARCH64_OPDE_OTHER_ERROR
907
};
908
 
909
/* N.B. GAS assumes that this structure work well with shallow copy.  */
910
struct aarch64_operand_error
911
{
912
  enum aarch64_operand_error_kind kind;
913
  int index;
914
  const char *error;
915
  int data[3];	/* Some data for extra information.  */
916
};
917
 
918
typedef struct aarch64_operand_error aarch64_operand_error;
919
 
920
/* Encoding entrypoint.  */
921
 
922
extern int
923
aarch64_opcode_encode (const aarch64_opcode *, const aarch64_inst *,
924
		       aarch64_insn *, aarch64_opnd_qualifier_t *,
925
		       aarch64_operand_error *);
926
 
927
extern const aarch64_opcode *
928
aarch64_replace_opcode (struct aarch64_inst *,
929
			const aarch64_opcode *);
930
 
931
/* Given the opcode enumerator OP, return the pointer to the corresponding
932
   opcode entry.  */
933
 
934
extern const aarch64_opcode *
935
aarch64_get_opcode (enum aarch64_op);
936
 
937
/* Generate the string representation of an operand.  */
938
extern void
939
aarch64_print_operand (char *, size_t, bfd_vma, const aarch64_opcode *,
940
		       const aarch64_opnd_info *, int, int *, bfd_vma *);
941
 
942
/* Miscellaneous interface.  */
943
 
944
extern int
945
aarch64_operand_index (const enum aarch64_opnd *, enum aarch64_opnd);
946
 
947
extern aarch64_opnd_qualifier_t
948
aarch64_get_expected_qualifier (const aarch64_opnd_qualifier_seq_t *, int,
949
				const aarch64_opnd_qualifier_t, int);
950
 
951
extern int
952
aarch64_num_of_operands (const aarch64_opcode *);
953
 
954
extern int
955
aarch64_stack_pointer_p (const aarch64_opnd_info *);
956
 
6324 serge 957
extern int
958
aarch64_zero_register_p (const aarch64_opnd_info *);
5191 serge 959
 
6324 serge 960
extern int
961
aarch64_decode_insn (aarch64_insn, aarch64_inst *, bfd_boolean);
962
 
5191 serge 963
/* Given an operand qualifier, return the expected data element size
964
   of a qualified operand.  */
965
extern unsigned char
966
aarch64_get_qualifier_esize (aarch64_opnd_qualifier_t);
967
 
968
extern enum aarch64_operand_class
969
aarch64_get_operand_class (enum aarch64_opnd);
970
 
971
extern const char *
972
aarch64_get_operand_name (enum aarch64_opnd);
973
 
974
extern const char *
975
aarch64_get_operand_desc (enum aarch64_opnd);
976
 
977
#ifdef DEBUG_AARCH64
978
extern int debug_dump;
979
 
980
extern void
981
aarch64_verbose (const char *, ...) __attribute__ ((format (printf, 1, 2)));
982
 
983
#define DEBUG_TRACE(M, ...)					\
984
  {								\
985
    if (debug_dump)						\
986
      aarch64_verbose ("%s: " M ".", __func__, ##__VA_ARGS__);	\
987
  }
988
 
989
#define DEBUG_TRACE_IF(C, M, ...)				\
990
  {								\
991
    if (debug_dump && (C))					\
992
      aarch64_verbose ("%s: " M ".", __func__, ##__VA_ARGS__);	\
993
  }
994
#else  /* !DEBUG_AARCH64 */
995
#define DEBUG_TRACE(M, ...) ;
996
#define DEBUG_TRACE_IF(C, M, ...) ;
997
#endif /* DEBUG_AARCH64 */
998
 
6324 serge 999
#ifdef __cplusplus
1000
}
1001
#endif
1002
 
5191 serge 1003
#endif /* OPCODE_AARCH64_H */