Subversion Repositories Kolibri OS

Rev

Rev 5191 | Only display areas with differences | Regard whitespace | Details | Blame | Last modification | View Log | RSS feed

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