1*9a0e4156SSadaf Ebrahimi /* Capstone Disassembly Engine */
2*9a0e4156SSadaf Ebrahimi /* By Nguyen Anh Quynh <[email protected]>, 2013-2015 */
3*9a0e4156SSadaf Ebrahimi
4*9a0e4156SSadaf Ebrahimi #ifdef CAPSTONE_HAS_ARM64
5*9a0e4156SSadaf Ebrahimi
6*9a0e4156SSadaf Ebrahimi #include <stdio.h> // debug
7*9a0e4156SSadaf Ebrahimi #include <string.h>
8*9a0e4156SSadaf Ebrahimi
9*9a0e4156SSadaf Ebrahimi #include "../../utils.h"
10*9a0e4156SSadaf Ebrahimi
11*9a0e4156SSadaf Ebrahimi #include "AArch64Mapping.h"
12*9a0e4156SSadaf Ebrahimi
13*9a0e4156SSadaf Ebrahimi #define GET_INSTRINFO_ENUM
14*9a0e4156SSadaf Ebrahimi #include "AArch64GenInstrInfo.inc"
15*9a0e4156SSadaf Ebrahimi
16*9a0e4156SSadaf Ebrahimi #ifndef CAPSTONE_DIET
17*9a0e4156SSadaf Ebrahimi static const name_map reg_name_maps[] = {
18*9a0e4156SSadaf Ebrahimi { ARM64_REG_INVALID, NULL },
19*9a0e4156SSadaf Ebrahimi
20*9a0e4156SSadaf Ebrahimi { ARM64_REG_X29, "x29"},
21*9a0e4156SSadaf Ebrahimi { ARM64_REG_X30, "x30"},
22*9a0e4156SSadaf Ebrahimi { ARM64_REG_NZCV, "nzcv"},
23*9a0e4156SSadaf Ebrahimi { ARM64_REG_SP, "sp"},
24*9a0e4156SSadaf Ebrahimi { ARM64_REG_WSP, "wsp"},
25*9a0e4156SSadaf Ebrahimi { ARM64_REG_WZR, "wzr"},
26*9a0e4156SSadaf Ebrahimi { ARM64_REG_XZR, "xzr"},
27*9a0e4156SSadaf Ebrahimi { ARM64_REG_B0, "b0"},
28*9a0e4156SSadaf Ebrahimi { ARM64_REG_B1, "b1"},
29*9a0e4156SSadaf Ebrahimi { ARM64_REG_B2, "b2"},
30*9a0e4156SSadaf Ebrahimi { ARM64_REG_B3, "b3"},
31*9a0e4156SSadaf Ebrahimi { ARM64_REG_B4, "b4"},
32*9a0e4156SSadaf Ebrahimi { ARM64_REG_B5, "b5"},
33*9a0e4156SSadaf Ebrahimi { ARM64_REG_B6, "b6"},
34*9a0e4156SSadaf Ebrahimi { ARM64_REG_B7, "b7"},
35*9a0e4156SSadaf Ebrahimi { ARM64_REG_B8, "b8"},
36*9a0e4156SSadaf Ebrahimi { ARM64_REG_B9, "b9"},
37*9a0e4156SSadaf Ebrahimi { ARM64_REG_B10, "b10"},
38*9a0e4156SSadaf Ebrahimi { ARM64_REG_B11, "b11"},
39*9a0e4156SSadaf Ebrahimi { ARM64_REG_B12, "b12"},
40*9a0e4156SSadaf Ebrahimi { ARM64_REG_B13, "b13"},
41*9a0e4156SSadaf Ebrahimi { ARM64_REG_B14, "b14"},
42*9a0e4156SSadaf Ebrahimi { ARM64_REG_B15, "b15"},
43*9a0e4156SSadaf Ebrahimi { ARM64_REG_B16, "b16"},
44*9a0e4156SSadaf Ebrahimi { ARM64_REG_B17, "b17"},
45*9a0e4156SSadaf Ebrahimi { ARM64_REG_B18, "b18"},
46*9a0e4156SSadaf Ebrahimi { ARM64_REG_B19, "b19"},
47*9a0e4156SSadaf Ebrahimi { ARM64_REG_B20, "b20"},
48*9a0e4156SSadaf Ebrahimi { ARM64_REG_B21, "b21"},
49*9a0e4156SSadaf Ebrahimi { ARM64_REG_B22, "b22"},
50*9a0e4156SSadaf Ebrahimi { ARM64_REG_B23, "b23"},
51*9a0e4156SSadaf Ebrahimi { ARM64_REG_B24, "b24"},
52*9a0e4156SSadaf Ebrahimi { ARM64_REG_B25, "b25"},
53*9a0e4156SSadaf Ebrahimi { ARM64_REG_B26, "b26"},
54*9a0e4156SSadaf Ebrahimi { ARM64_REG_B27, "b27"},
55*9a0e4156SSadaf Ebrahimi { ARM64_REG_B28, "b28"},
56*9a0e4156SSadaf Ebrahimi { ARM64_REG_B29, "b29"},
57*9a0e4156SSadaf Ebrahimi { ARM64_REG_B30, "b30"},
58*9a0e4156SSadaf Ebrahimi { ARM64_REG_B31, "b31"},
59*9a0e4156SSadaf Ebrahimi { ARM64_REG_D0, "d0"},
60*9a0e4156SSadaf Ebrahimi { ARM64_REG_D1, "d1"},
61*9a0e4156SSadaf Ebrahimi { ARM64_REG_D2, "d2"},
62*9a0e4156SSadaf Ebrahimi { ARM64_REG_D3, "d3"},
63*9a0e4156SSadaf Ebrahimi { ARM64_REG_D4, "d4"},
64*9a0e4156SSadaf Ebrahimi { ARM64_REG_D5, "d5"},
65*9a0e4156SSadaf Ebrahimi { ARM64_REG_D6, "d6"},
66*9a0e4156SSadaf Ebrahimi { ARM64_REG_D7, "d7"},
67*9a0e4156SSadaf Ebrahimi { ARM64_REG_D8, "d8"},
68*9a0e4156SSadaf Ebrahimi { ARM64_REG_D9, "d9"},
69*9a0e4156SSadaf Ebrahimi { ARM64_REG_D10, "d10"},
70*9a0e4156SSadaf Ebrahimi { ARM64_REG_D11, "d11"},
71*9a0e4156SSadaf Ebrahimi { ARM64_REG_D12, "d12"},
72*9a0e4156SSadaf Ebrahimi { ARM64_REG_D13, "d13"},
73*9a0e4156SSadaf Ebrahimi { ARM64_REG_D14, "d14"},
74*9a0e4156SSadaf Ebrahimi { ARM64_REG_D15, "d15"},
75*9a0e4156SSadaf Ebrahimi { ARM64_REG_D16, "d16"},
76*9a0e4156SSadaf Ebrahimi { ARM64_REG_D17, "d17"},
77*9a0e4156SSadaf Ebrahimi { ARM64_REG_D18, "d18"},
78*9a0e4156SSadaf Ebrahimi { ARM64_REG_D19, "d19"},
79*9a0e4156SSadaf Ebrahimi { ARM64_REG_D20, "d20"},
80*9a0e4156SSadaf Ebrahimi { ARM64_REG_D21, "d21"},
81*9a0e4156SSadaf Ebrahimi { ARM64_REG_D22, "d22"},
82*9a0e4156SSadaf Ebrahimi { ARM64_REG_D23, "d23"},
83*9a0e4156SSadaf Ebrahimi { ARM64_REG_D24, "d24"},
84*9a0e4156SSadaf Ebrahimi { ARM64_REG_D25, "d25"},
85*9a0e4156SSadaf Ebrahimi { ARM64_REG_D26, "d26"},
86*9a0e4156SSadaf Ebrahimi { ARM64_REG_D27, "d27"},
87*9a0e4156SSadaf Ebrahimi { ARM64_REG_D28, "d28"},
88*9a0e4156SSadaf Ebrahimi { ARM64_REG_D29, "d29"},
89*9a0e4156SSadaf Ebrahimi { ARM64_REG_D30, "d30"},
90*9a0e4156SSadaf Ebrahimi { ARM64_REG_D31, "d31"},
91*9a0e4156SSadaf Ebrahimi { ARM64_REG_H0, "h0"},
92*9a0e4156SSadaf Ebrahimi { ARM64_REG_H1, "h1"},
93*9a0e4156SSadaf Ebrahimi { ARM64_REG_H2, "h2"},
94*9a0e4156SSadaf Ebrahimi { ARM64_REG_H3, "h3"},
95*9a0e4156SSadaf Ebrahimi { ARM64_REG_H4, "h4"},
96*9a0e4156SSadaf Ebrahimi { ARM64_REG_H5, "h5"},
97*9a0e4156SSadaf Ebrahimi { ARM64_REG_H6, "h6"},
98*9a0e4156SSadaf Ebrahimi { ARM64_REG_H7, "h7"},
99*9a0e4156SSadaf Ebrahimi { ARM64_REG_H8, "h8"},
100*9a0e4156SSadaf Ebrahimi { ARM64_REG_H9, "h9"},
101*9a0e4156SSadaf Ebrahimi { ARM64_REG_H10, "h10"},
102*9a0e4156SSadaf Ebrahimi { ARM64_REG_H11, "h11"},
103*9a0e4156SSadaf Ebrahimi { ARM64_REG_H12, "h12"},
104*9a0e4156SSadaf Ebrahimi { ARM64_REG_H13, "h13"},
105*9a0e4156SSadaf Ebrahimi { ARM64_REG_H14, "h14"},
106*9a0e4156SSadaf Ebrahimi { ARM64_REG_H15, "h15"},
107*9a0e4156SSadaf Ebrahimi { ARM64_REG_H16, "h16"},
108*9a0e4156SSadaf Ebrahimi { ARM64_REG_H17, "h17"},
109*9a0e4156SSadaf Ebrahimi { ARM64_REG_H18, "h18"},
110*9a0e4156SSadaf Ebrahimi { ARM64_REG_H19, "h19"},
111*9a0e4156SSadaf Ebrahimi { ARM64_REG_H20, "h20"},
112*9a0e4156SSadaf Ebrahimi { ARM64_REG_H21, "h21"},
113*9a0e4156SSadaf Ebrahimi { ARM64_REG_H22, "h22"},
114*9a0e4156SSadaf Ebrahimi { ARM64_REG_H23, "h23"},
115*9a0e4156SSadaf Ebrahimi { ARM64_REG_H24, "h24"},
116*9a0e4156SSadaf Ebrahimi { ARM64_REG_H25, "h25"},
117*9a0e4156SSadaf Ebrahimi { ARM64_REG_H26, "h26"},
118*9a0e4156SSadaf Ebrahimi { ARM64_REG_H27, "h27"},
119*9a0e4156SSadaf Ebrahimi { ARM64_REG_H28, "h28"},
120*9a0e4156SSadaf Ebrahimi { ARM64_REG_H29, "h29"},
121*9a0e4156SSadaf Ebrahimi { ARM64_REG_H30, "h30"},
122*9a0e4156SSadaf Ebrahimi { ARM64_REG_H31, "h31"},
123*9a0e4156SSadaf Ebrahimi { ARM64_REG_Q0, "q0"},
124*9a0e4156SSadaf Ebrahimi { ARM64_REG_Q1, "q1"},
125*9a0e4156SSadaf Ebrahimi { ARM64_REG_Q2, "q2"},
126*9a0e4156SSadaf Ebrahimi { ARM64_REG_Q3, "q3"},
127*9a0e4156SSadaf Ebrahimi { ARM64_REG_Q4, "q4"},
128*9a0e4156SSadaf Ebrahimi { ARM64_REG_Q5, "q5"},
129*9a0e4156SSadaf Ebrahimi { ARM64_REG_Q6, "q6"},
130*9a0e4156SSadaf Ebrahimi { ARM64_REG_Q7, "q7"},
131*9a0e4156SSadaf Ebrahimi { ARM64_REG_Q8, "q8"},
132*9a0e4156SSadaf Ebrahimi { ARM64_REG_Q9, "q9"},
133*9a0e4156SSadaf Ebrahimi { ARM64_REG_Q10, "q10"},
134*9a0e4156SSadaf Ebrahimi { ARM64_REG_Q11, "q11"},
135*9a0e4156SSadaf Ebrahimi { ARM64_REG_Q12, "q12"},
136*9a0e4156SSadaf Ebrahimi { ARM64_REG_Q13, "q13"},
137*9a0e4156SSadaf Ebrahimi { ARM64_REG_Q14, "q14"},
138*9a0e4156SSadaf Ebrahimi { ARM64_REG_Q15, "q15"},
139*9a0e4156SSadaf Ebrahimi { ARM64_REG_Q16, "q16"},
140*9a0e4156SSadaf Ebrahimi { ARM64_REG_Q17, "q17"},
141*9a0e4156SSadaf Ebrahimi { ARM64_REG_Q18, "q18"},
142*9a0e4156SSadaf Ebrahimi { ARM64_REG_Q19, "q19"},
143*9a0e4156SSadaf Ebrahimi { ARM64_REG_Q20, "q20"},
144*9a0e4156SSadaf Ebrahimi { ARM64_REG_Q21, "q21"},
145*9a0e4156SSadaf Ebrahimi { ARM64_REG_Q22, "q22"},
146*9a0e4156SSadaf Ebrahimi { ARM64_REG_Q23, "q23"},
147*9a0e4156SSadaf Ebrahimi { ARM64_REG_Q24, "q24"},
148*9a0e4156SSadaf Ebrahimi { ARM64_REG_Q25, "q25"},
149*9a0e4156SSadaf Ebrahimi { ARM64_REG_Q26, "q26"},
150*9a0e4156SSadaf Ebrahimi { ARM64_REG_Q27, "q27"},
151*9a0e4156SSadaf Ebrahimi { ARM64_REG_Q28, "q28"},
152*9a0e4156SSadaf Ebrahimi { ARM64_REG_Q29, "q29"},
153*9a0e4156SSadaf Ebrahimi { ARM64_REG_Q30, "q30"},
154*9a0e4156SSadaf Ebrahimi { ARM64_REG_Q31, "q31"},
155*9a0e4156SSadaf Ebrahimi { ARM64_REG_S0, "s0"},
156*9a0e4156SSadaf Ebrahimi { ARM64_REG_S1, "s1"},
157*9a0e4156SSadaf Ebrahimi { ARM64_REG_S2, "s2"},
158*9a0e4156SSadaf Ebrahimi { ARM64_REG_S3, "s3"},
159*9a0e4156SSadaf Ebrahimi { ARM64_REG_S4, "s4"},
160*9a0e4156SSadaf Ebrahimi { ARM64_REG_S5, "s5"},
161*9a0e4156SSadaf Ebrahimi { ARM64_REG_S6, "s6"},
162*9a0e4156SSadaf Ebrahimi { ARM64_REG_S7, "s7"},
163*9a0e4156SSadaf Ebrahimi { ARM64_REG_S8, "s8"},
164*9a0e4156SSadaf Ebrahimi { ARM64_REG_S9, "s9"},
165*9a0e4156SSadaf Ebrahimi { ARM64_REG_S10, "s10"},
166*9a0e4156SSadaf Ebrahimi { ARM64_REG_S11, "s11"},
167*9a0e4156SSadaf Ebrahimi { ARM64_REG_S12, "s12"},
168*9a0e4156SSadaf Ebrahimi { ARM64_REG_S13, "s13"},
169*9a0e4156SSadaf Ebrahimi { ARM64_REG_S14, "s14"},
170*9a0e4156SSadaf Ebrahimi { ARM64_REG_S15, "s15"},
171*9a0e4156SSadaf Ebrahimi { ARM64_REG_S16, "s16"},
172*9a0e4156SSadaf Ebrahimi { ARM64_REG_S17, "s17"},
173*9a0e4156SSadaf Ebrahimi { ARM64_REG_S18, "s18"},
174*9a0e4156SSadaf Ebrahimi { ARM64_REG_S19, "s19"},
175*9a0e4156SSadaf Ebrahimi { ARM64_REG_S20, "s20"},
176*9a0e4156SSadaf Ebrahimi { ARM64_REG_S21, "s21"},
177*9a0e4156SSadaf Ebrahimi { ARM64_REG_S22, "s22"},
178*9a0e4156SSadaf Ebrahimi { ARM64_REG_S23, "s23"},
179*9a0e4156SSadaf Ebrahimi { ARM64_REG_S24, "s24"},
180*9a0e4156SSadaf Ebrahimi { ARM64_REG_S25, "s25"},
181*9a0e4156SSadaf Ebrahimi { ARM64_REG_S26, "s26"},
182*9a0e4156SSadaf Ebrahimi { ARM64_REG_S27, "s27"},
183*9a0e4156SSadaf Ebrahimi { ARM64_REG_S28, "s28"},
184*9a0e4156SSadaf Ebrahimi { ARM64_REG_S29, "s29"},
185*9a0e4156SSadaf Ebrahimi { ARM64_REG_S30, "s30"},
186*9a0e4156SSadaf Ebrahimi { ARM64_REG_S31, "s31"},
187*9a0e4156SSadaf Ebrahimi { ARM64_REG_W0, "w0"},
188*9a0e4156SSadaf Ebrahimi { ARM64_REG_W1, "w1"},
189*9a0e4156SSadaf Ebrahimi { ARM64_REG_W2, "w2"},
190*9a0e4156SSadaf Ebrahimi { ARM64_REG_W3, "w3"},
191*9a0e4156SSadaf Ebrahimi { ARM64_REG_W4, "w4"},
192*9a0e4156SSadaf Ebrahimi { ARM64_REG_W5, "w5"},
193*9a0e4156SSadaf Ebrahimi { ARM64_REG_W6, "w6"},
194*9a0e4156SSadaf Ebrahimi { ARM64_REG_W7, "w7"},
195*9a0e4156SSadaf Ebrahimi { ARM64_REG_W8, "w8"},
196*9a0e4156SSadaf Ebrahimi { ARM64_REG_W9, "w9"},
197*9a0e4156SSadaf Ebrahimi { ARM64_REG_W10, "w10"},
198*9a0e4156SSadaf Ebrahimi { ARM64_REG_W11, "w11"},
199*9a0e4156SSadaf Ebrahimi { ARM64_REG_W12, "w12"},
200*9a0e4156SSadaf Ebrahimi { ARM64_REG_W13, "w13"},
201*9a0e4156SSadaf Ebrahimi { ARM64_REG_W14, "w14"},
202*9a0e4156SSadaf Ebrahimi { ARM64_REG_W15, "w15"},
203*9a0e4156SSadaf Ebrahimi { ARM64_REG_W16, "w16"},
204*9a0e4156SSadaf Ebrahimi { ARM64_REG_W17, "w17"},
205*9a0e4156SSadaf Ebrahimi { ARM64_REG_W18, "w18"},
206*9a0e4156SSadaf Ebrahimi { ARM64_REG_W19, "w19"},
207*9a0e4156SSadaf Ebrahimi { ARM64_REG_W20, "w20"},
208*9a0e4156SSadaf Ebrahimi { ARM64_REG_W21, "w21"},
209*9a0e4156SSadaf Ebrahimi { ARM64_REG_W22, "w22"},
210*9a0e4156SSadaf Ebrahimi { ARM64_REG_W23, "w23"},
211*9a0e4156SSadaf Ebrahimi { ARM64_REG_W24, "w24"},
212*9a0e4156SSadaf Ebrahimi { ARM64_REG_W25, "w25"},
213*9a0e4156SSadaf Ebrahimi { ARM64_REG_W26, "w26"},
214*9a0e4156SSadaf Ebrahimi { ARM64_REG_W27, "w27"},
215*9a0e4156SSadaf Ebrahimi { ARM64_REG_W28, "w28"},
216*9a0e4156SSadaf Ebrahimi { ARM64_REG_W29, "w29"},
217*9a0e4156SSadaf Ebrahimi { ARM64_REG_W30, "w30"},
218*9a0e4156SSadaf Ebrahimi { ARM64_REG_X0, "x0"},
219*9a0e4156SSadaf Ebrahimi { ARM64_REG_X1, "x1"},
220*9a0e4156SSadaf Ebrahimi { ARM64_REG_X2, "x2"},
221*9a0e4156SSadaf Ebrahimi { ARM64_REG_X3, "x3"},
222*9a0e4156SSadaf Ebrahimi { ARM64_REG_X4, "x4"},
223*9a0e4156SSadaf Ebrahimi { ARM64_REG_X5, "x5"},
224*9a0e4156SSadaf Ebrahimi { ARM64_REG_X6, "x6"},
225*9a0e4156SSadaf Ebrahimi { ARM64_REG_X7, "x7"},
226*9a0e4156SSadaf Ebrahimi { ARM64_REG_X8, "x8"},
227*9a0e4156SSadaf Ebrahimi { ARM64_REG_X9, "x9"},
228*9a0e4156SSadaf Ebrahimi { ARM64_REG_X10, "x10"},
229*9a0e4156SSadaf Ebrahimi { ARM64_REG_X11, "x11"},
230*9a0e4156SSadaf Ebrahimi { ARM64_REG_X12, "x12"},
231*9a0e4156SSadaf Ebrahimi { ARM64_REG_X13, "x13"},
232*9a0e4156SSadaf Ebrahimi { ARM64_REG_X14, "x14"},
233*9a0e4156SSadaf Ebrahimi { ARM64_REG_X15, "x15"},
234*9a0e4156SSadaf Ebrahimi { ARM64_REG_X16, "x16"},
235*9a0e4156SSadaf Ebrahimi { ARM64_REG_X17, "x17"},
236*9a0e4156SSadaf Ebrahimi { ARM64_REG_X18, "x18"},
237*9a0e4156SSadaf Ebrahimi { ARM64_REG_X19, "x19"},
238*9a0e4156SSadaf Ebrahimi { ARM64_REG_X20, "x20"},
239*9a0e4156SSadaf Ebrahimi { ARM64_REG_X21, "x21"},
240*9a0e4156SSadaf Ebrahimi { ARM64_REG_X22, "x22"},
241*9a0e4156SSadaf Ebrahimi { ARM64_REG_X23, "x23"},
242*9a0e4156SSadaf Ebrahimi { ARM64_REG_X24, "x24"},
243*9a0e4156SSadaf Ebrahimi { ARM64_REG_X25, "x25"},
244*9a0e4156SSadaf Ebrahimi { ARM64_REG_X26, "x26"},
245*9a0e4156SSadaf Ebrahimi { ARM64_REG_X27, "x27"},
246*9a0e4156SSadaf Ebrahimi { ARM64_REG_X28, "x28"},
247*9a0e4156SSadaf Ebrahimi
248*9a0e4156SSadaf Ebrahimi { ARM64_REG_V0, "v0"},
249*9a0e4156SSadaf Ebrahimi { ARM64_REG_V1, "v1"},
250*9a0e4156SSadaf Ebrahimi { ARM64_REG_V2, "v2"},
251*9a0e4156SSadaf Ebrahimi { ARM64_REG_V3, "v3"},
252*9a0e4156SSadaf Ebrahimi { ARM64_REG_V4, "v4"},
253*9a0e4156SSadaf Ebrahimi { ARM64_REG_V5, "v5"},
254*9a0e4156SSadaf Ebrahimi { ARM64_REG_V6, "v6"},
255*9a0e4156SSadaf Ebrahimi { ARM64_REG_V7, "v7"},
256*9a0e4156SSadaf Ebrahimi { ARM64_REG_V8, "v8"},
257*9a0e4156SSadaf Ebrahimi { ARM64_REG_V9, "v9"},
258*9a0e4156SSadaf Ebrahimi { ARM64_REG_V10, "v10"},
259*9a0e4156SSadaf Ebrahimi { ARM64_REG_V11, "v11"},
260*9a0e4156SSadaf Ebrahimi { ARM64_REG_V12, "v12"},
261*9a0e4156SSadaf Ebrahimi { ARM64_REG_V13, "v13"},
262*9a0e4156SSadaf Ebrahimi { ARM64_REG_V14, "v14"},
263*9a0e4156SSadaf Ebrahimi { ARM64_REG_V15, "v15"},
264*9a0e4156SSadaf Ebrahimi { ARM64_REG_V16, "v16"},
265*9a0e4156SSadaf Ebrahimi { ARM64_REG_V17, "v17"},
266*9a0e4156SSadaf Ebrahimi { ARM64_REG_V18, "v18"},
267*9a0e4156SSadaf Ebrahimi { ARM64_REG_V19, "v19"},
268*9a0e4156SSadaf Ebrahimi { ARM64_REG_V20, "v20"},
269*9a0e4156SSadaf Ebrahimi { ARM64_REG_V21, "v21"},
270*9a0e4156SSadaf Ebrahimi { ARM64_REG_V22, "v22"},
271*9a0e4156SSadaf Ebrahimi { ARM64_REG_V23, "v23"},
272*9a0e4156SSadaf Ebrahimi { ARM64_REG_V24, "v24"},
273*9a0e4156SSadaf Ebrahimi { ARM64_REG_V25, "v25"},
274*9a0e4156SSadaf Ebrahimi { ARM64_REG_V26, "v26"},
275*9a0e4156SSadaf Ebrahimi { ARM64_REG_V27, "v27"},
276*9a0e4156SSadaf Ebrahimi { ARM64_REG_V28, "v28"},
277*9a0e4156SSadaf Ebrahimi { ARM64_REG_V29, "v29"},
278*9a0e4156SSadaf Ebrahimi { ARM64_REG_V30, "v30"},
279*9a0e4156SSadaf Ebrahimi { ARM64_REG_V31, "v31"},
280*9a0e4156SSadaf Ebrahimi };
281*9a0e4156SSadaf Ebrahimi #endif
282*9a0e4156SSadaf Ebrahimi
AArch64_reg_name(csh handle,unsigned int reg)283*9a0e4156SSadaf Ebrahimi const char *AArch64_reg_name(csh handle, unsigned int reg)
284*9a0e4156SSadaf Ebrahimi {
285*9a0e4156SSadaf Ebrahimi #ifndef CAPSTONE_DIET
286*9a0e4156SSadaf Ebrahimi if (reg >= ARR_SIZE(reg_name_maps))
287*9a0e4156SSadaf Ebrahimi return NULL;
288*9a0e4156SSadaf Ebrahimi
289*9a0e4156SSadaf Ebrahimi return reg_name_maps[reg].name;
290*9a0e4156SSadaf Ebrahimi #else
291*9a0e4156SSadaf Ebrahimi return NULL;
292*9a0e4156SSadaf Ebrahimi #endif
293*9a0e4156SSadaf Ebrahimi }
294*9a0e4156SSadaf Ebrahimi
295*9a0e4156SSadaf Ebrahimi static const insn_map insns[] = {
296*9a0e4156SSadaf Ebrahimi // dummy item
297*9a0e4156SSadaf Ebrahimi {
298*9a0e4156SSadaf Ebrahimi 0, 0,
299*9a0e4156SSadaf Ebrahimi #ifndef CAPSTONE_DIET
300*9a0e4156SSadaf Ebrahimi { 0 }, { 0 }, { 0 }, 0, 0
301*9a0e4156SSadaf Ebrahimi #endif
302*9a0e4156SSadaf Ebrahimi },
303*9a0e4156SSadaf Ebrahimi
304*9a0e4156SSadaf Ebrahimi #include "AArch64MappingInsn.inc"
305*9a0e4156SSadaf Ebrahimi };
306*9a0e4156SSadaf Ebrahimi
307*9a0e4156SSadaf Ebrahimi // given internal insn id, return public instruction info
AArch64_get_insn_id(cs_struct * h,cs_insn * insn,unsigned int id)308*9a0e4156SSadaf Ebrahimi void AArch64_get_insn_id(cs_struct *h, cs_insn *insn, unsigned int id)
309*9a0e4156SSadaf Ebrahimi {
310*9a0e4156SSadaf Ebrahimi int i = insn_find(insns, ARR_SIZE(insns), id, &h->insn_cache);
311*9a0e4156SSadaf Ebrahimi if (i != 0) {
312*9a0e4156SSadaf Ebrahimi insn->id = insns[i].mapid;
313*9a0e4156SSadaf Ebrahimi
314*9a0e4156SSadaf Ebrahimi if (h->detail) {
315*9a0e4156SSadaf Ebrahimi #ifndef CAPSTONE_DIET
316*9a0e4156SSadaf Ebrahimi cs_struct handle;
317*9a0e4156SSadaf Ebrahimi handle.detail = h->detail;
318*9a0e4156SSadaf Ebrahimi
319*9a0e4156SSadaf Ebrahimi memcpy(insn->detail->regs_read, insns[i].regs_use, sizeof(insns[i].regs_use));
320*9a0e4156SSadaf Ebrahimi insn->detail->regs_read_count = (uint8_t)count_positive(insns[i].regs_use);
321*9a0e4156SSadaf Ebrahimi
322*9a0e4156SSadaf Ebrahimi memcpy(insn->detail->regs_write, insns[i].regs_mod, sizeof(insns[i].regs_mod));
323*9a0e4156SSadaf Ebrahimi insn->detail->regs_write_count = (uint8_t)count_positive(insns[i].regs_mod);
324*9a0e4156SSadaf Ebrahimi
325*9a0e4156SSadaf Ebrahimi memcpy(insn->detail->groups, insns[i].groups, sizeof(insns[i].groups));
326*9a0e4156SSadaf Ebrahimi insn->detail->groups_count = (uint8_t)count_positive8(insns[i].groups);
327*9a0e4156SSadaf Ebrahimi
328*9a0e4156SSadaf Ebrahimi insn->detail->arm64.update_flags = cs_reg_write((csh)&handle, insn, ARM64_REG_NZCV);
329*9a0e4156SSadaf Ebrahimi #endif
330*9a0e4156SSadaf Ebrahimi }
331*9a0e4156SSadaf Ebrahimi }
332*9a0e4156SSadaf Ebrahimi }
333*9a0e4156SSadaf Ebrahimi
334*9a0e4156SSadaf Ebrahimi static const name_map insn_name_maps[] = {
335*9a0e4156SSadaf Ebrahimi { ARM64_INS_INVALID, NULL },
336*9a0e4156SSadaf Ebrahimi
337*9a0e4156SSadaf Ebrahimi { ARM64_INS_ABS, "abs" },
338*9a0e4156SSadaf Ebrahimi { ARM64_INS_ADC, "adc" },
339*9a0e4156SSadaf Ebrahimi { ARM64_INS_ADDHN, "addhn" },
340*9a0e4156SSadaf Ebrahimi { ARM64_INS_ADDHN2, "addhn2" },
341*9a0e4156SSadaf Ebrahimi { ARM64_INS_ADDP, "addp" },
342*9a0e4156SSadaf Ebrahimi { ARM64_INS_ADD, "add" },
343*9a0e4156SSadaf Ebrahimi { ARM64_INS_ADDV, "addv" },
344*9a0e4156SSadaf Ebrahimi { ARM64_INS_ADR, "adr" },
345*9a0e4156SSadaf Ebrahimi { ARM64_INS_ADRP, "adrp" },
346*9a0e4156SSadaf Ebrahimi { ARM64_INS_AESD, "aesd" },
347*9a0e4156SSadaf Ebrahimi { ARM64_INS_AESE, "aese" },
348*9a0e4156SSadaf Ebrahimi { ARM64_INS_AESIMC, "aesimc" },
349*9a0e4156SSadaf Ebrahimi { ARM64_INS_AESMC, "aesmc" },
350*9a0e4156SSadaf Ebrahimi { ARM64_INS_AND, "and" },
351*9a0e4156SSadaf Ebrahimi { ARM64_INS_ASR, "asr" },
352*9a0e4156SSadaf Ebrahimi { ARM64_INS_B, "b" },
353*9a0e4156SSadaf Ebrahimi { ARM64_INS_BFM, "bfm" },
354*9a0e4156SSadaf Ebrahimi { ARM64_INS_BIC, "bic" },
355*9a0e4156SSadaf Ebrahimi { ARM64_INS_BIF, "bif" },
356*9a0e4156SSadaf Ebrahimi { ARM64_INS_BIT, "bit" },
357*9a0e4156SSadaf Ebrahimi { ARM64_INS_BL, "bl" },
358*9a0e4156SSadaf Ebrahimi { ARM64_INS_BLR, "blr" },
359*9a0e4156SSadaf Ebrahimi { ARM64_INS_BR, "br" },
360*9a0e4156SSadaf Ebrahimi { ARM64_INS_BRK, "brk" },
361*9a0e4156SSadaf Ebrahimi { ARM64_INS_BSL, "bsl" },
362*9a0e4156SSadaf Ebrahimi { ARM64_INS_CBNZ, "cbnz" },
363*9a0e4156SSadaf Ebrahimi { ARM64_INS_CBZ, "cbz" },
364*9a0e4156SSadaf Ebrahimi { ARM64_INS_CCMN, "ccmn" },
365*9a0e4156SSadaf Ebrahimi { ARM64_INS_CCMP, "ccmp" },
366*9a0e4156SSadaf Ebrahimi { ARM64_INS_CLREX, "clrex" },
367*9a0e4156SSadaf Ebrahimi { ARM64_INS_CLS, "cls" },
368*9a0e4156SSadaf Ebrahimi { ARM64_INS_CLZ, "clz" },
369*9a0e4156SSadaf Ebrahimi { ARM64_INS_CMEQ, "cmeq" },
370*9a0e4156SSadaf Ebrahimi { ARM64_INS_CMGE, "cmge" },
371*9a0e4156SSadaf Ebrahimi { ARM64_INS_CMGT, "cmgt" },
372*9a0e4156SSadaf Ebrahimi { ARM64_INS_CMHI, "cmhi" },
373*9a0e4156SSadaf Ebrahimi { ARM64_INS_CMHS, "cmhs" },
374*9a0e4156SSadaf Ebrahimi { ARM64_INS_CMLE, "cmle" },
375*9a0e4156SSadaf Ebrahimi { ARM64_INS_CMLT, "cmlt" },
376*9a0e4156SSadaf Ebrahimi { ARM64_INS_CMTST, "cmtst" },
377*9a0e4156SSadaf Ebrahimi { ARM64_INS_CNT, "cnt" },
378*9a0e4156SSadaf Ebrahimi { ARM64_INS_MOV, "mov" },
379*9a0e4156SSadaf Ebrahimi { ARM64_INS_CRC32B, "crc32b" },
380*9a0e4156SSadaf Ebrahimi { ARM64_INS_CRC32CB, "crc32cb" },
381*9a0e4156SSadaf Ebrahimi { ARM64_INS_CRC32CH, "crc32ch" },
382*9a0e4156SSadaf Ebrahimi { ARM64_INS_CRC32CW, "crc32cw" },
383*9a0e4156SSadaf Ebrahimi { ARM64_INS_CRC32CX, "crc32cx" },
384*9a0e4156SSadaf Ebrahimi { ARM64_INS_CRC32H, "crc32h" },
385*9a0e4156SSadaf Ebrahimi { ARM64_INS_CRC32W, "crc32w" },
386*9a0e4156SSadaf Ebrahimi { ARM64_INS_CRC32X, "crc32x" },
387*9a0e4156SSadaf Ebrahimi { ARM64_INS_CSEL, "csel" },
388*9a0e4156SSadaf Ebrahimi { ARM64_INS_CSINC, "csinc" },
389*9a0e4156SSadaf Ebrahimi { ARM64_INS_CSINV, "csinv" },
390*9a0e4156SSadaf Ebrahimi { ARM64_INS_CSNEG, "csneg" },
391*9a0e4156SSadaf Ebrahimi { ARM64_INS_DCPS1, "dcps1" },
392*9a0e4156SSadaf Ebrahimi { ARM64_INS_DCPS2, "dcps2" },
393*9a0e4156SSadaf Ebrahimi { ARM64_INS_DCPS3, "dcps3" },
394*9a0e4156SSadaf Ebrahimi { ARM64_INS_DMB, "dmb" },
395*9a0e4156SSadaf Ebrahimi { ARM64_INS_DRPS, "drps" },
396*9a0e4156SSadaf Ebrahimi { ARM64_INS_DSB, "dsb" },
397*9a0e4156SSadaf Ebrahimi { ARM64_INS_DUP, "dup" },
398*9a0e4156SSadaf Ebrahimi { ARM64_INS_EON, "eon" },
399*9a0e4156SSadaf Ebrahimi { ARM64_INS_EOR, "eor" },
400*9a0e4156SSadaf Ebrahimi { ARM64_INS_ERET, "eret" },
401*9a0e4156SSadaf Ebrahimi { ARM64_INS_EXTR, "extr" },
402*9a0e4156SSadaf Ebrahimi { ARM64_INS_EXT, "ext" },
403*9a0e4156SSadaf Ebrahimi { ARM64_INS_FABD, "fabd" },
404*9a0e4156SSadaf Ebrahimi { ARM64_INS_FABS, "fabs" },
405*9a0e4156SSadaf Ebrahimi { ARM64_INS_FACGE, "facge" },
406*9a0e4156SSadaf Ebrahimi { ARM64_INS_FACGT, "facgt" },
407*9a0e4156SSadaf Ebrahimi { ARM64_INS_FADD, "fadd" },
408*9a0e4156SSadaf Ebrahimi { ARM64_INS_FADDP, "faddp" },
409*9a0e4156SSadaf Ebrahimi { ARM64_INS_FCCMP, "fccmp" },
410*9a0e4156SSadaf Ebrahimi { ARM64_INS_FCCMPE, "fccmpe" },
411*9a0e4156SSadaf Ebrahimi { ARM64_INS_FCMEQ, "fcmeq" },
412*9a0e4156SSadaf Ebrahimi { ARM64_INS_FCMGE, "fcmge" },
413*9a0e4156SSadaf Ebrahimi { ARM64_INS_FCMGT, "fcmgt" },
414*9a0e4156SSadaf Ebrahimi { ARM64_INS_FCMLE, "fcmle" },
415*9a0e4156SSadaf Ebrahimi { ARM64_INS_FCMLT, "fcmlt" },
416*9a0e4156SSadaf Ebrahimi { ARM64_INS_FCMP, "fcmp" },
417*9a0e4156SSadaf Ebrahimi { ARM64_INS_FCMPE, "fcmpe" },
418*9a0e4156SSadaf Ebrahimi { ARM64_INS_FCSEL, "fcsel" },
419*9a0e4156SSadaf Ebrahimi { ARM64_INS_FCVTAS, "fcvtas" },
420*9a0e4156SSadaf Ebrahimi { ARM64_INS_FCVTAU, "fcvtau" },
421*9a0e4156SSadaf Ebrahimi { ARM64_INS_FCVT, "fcvt" },
422*9a0e4156SSadaf Ebrahimi { ARM64_INS_FCVTL, "fcvtl" },
423*9a0e4156SSadaf Ebrahimi { ARM64_INS_FCVTL2, "fcvtl2" },
424*9a0e4156SSadaf Ebrahimi { ARM64_INS_FCVTMS, "fcvtms" },
425*9a0e4156SSadaf Ebrahimi { ARM64_INS_FCVTMU, "fcvtmu" },
426*9a0e4156SSadaf Ebrahimi { ARM64_INS_FCVTNS, "fcvtns" },
427*9a0e4156SSadaf Ebrahimi { ARM64_INS_FCVTNU, "fcvtnu" },
428*9a0e4156SSadaf Ebrahimi { ARM64_INS_FCVTN, "fcvtn" },
429*9a0e4156SSadaf Ebrahimi { ARM64_INS_FCVTN2, "fcvtn2" },
430*9a0e4156SSadaf Ebrahimi { ARM64_INS_FCVTPS, "fcvtps" },
431*9a0e4156SSadaf Ebrahimi { ARM64_INS_FCVTPU, "fcvtpu" },
432*9a0e4156SSadaf Ebrahimi { ARM64_INS_FCVTXN, "fcvtxn" },
433*9a0e4156SSadaf Ebrahimi { ARM64_INS_FCVTXN2, "fcvtxn2" },
434*9a0e4156SSadaf Ebrahimi { ARM64_INS_FCVTZS, "fcvtzs" },
435*9a0e4156SSadaf Ebrahimi { ARM64_INS_FCVTZU, "fcvtzu" },
436*9a0e4156SSadaf Ebrahimi { ARM64_INS_FDIV, "fdiv" },
437*9a0e4156SSadaf Ebrahimi { ARM64_INS_FMADD, "fmadd" },
438*9a0e4156SSadaf Ebrahimi { ARM64_INS_FMAX, "fmax" },
439*9a0e4156SSadaf Ebrahimi { ARM64_INS_FMAXNM, "fmaxnm" },
440*9a0e4156SSadaf Ebrahimi { ARM64_INS_FMAXNMP, "fmaxnmp" },
441*9a0e4156SSadaf Ebrahimi { ARM64_INS_FMAXNMV, "fmaxnmv" },
442*9a0e4156SSadaf Ebrahimi { ARM64_INS_FMAXP, "fmaxp" },
443*9a0e4156SSadaf Ebrahimi { ARM64_INS_FMAXV, "fmaxv" },
444*9a0e4156SSadaf Ebrahimi { ARM64_INS_FMIN, "fmin" },
445*9a0e4156SSadaf Ebrahimi { ARM64_INS_FMINNM, "fminnm" },
446*9a0e4156SSadaf Ebrahimi { ARM64_INS_FMINNMP, "fminnmp" },
447*9a0e4156SSadaf Ebrahimi { ARM64_INS_FMINNMV, "fminnmv" },
448*9a0e4156SSadaf Ebrahimi { ARM64_INS_FMINP, "fminp" },
449*9a0e4156SSadaf Ebrahimi { ARM64_INS_FMINV, "fminv" },
450*9a0e4156SSadaf Ebrahimi { ARM64_INS_FMLA, "fmla" },
451*9a0e4156SSadaf Ebrahimi { ARM64_INS_FMLS, "fmls" },
452*9a0e4156SSadaf Ebrahimi { ARM64_INS_FMOV, "fmov" },
453*9a0e4156SSadaf Ebrahimi { ARM64_INS_FMSUB, "fmsub" },
454*9a0e4156SSadaf Ebrahimi { ARM64_INS_FMUL, "fmul" },
455*9a0e4156SSadaf Ebrahimi { ARM64_INS_FMULX, "fmulx" },
456*9a0e4156SSadaf Ebrahimi { ARM64_INS_FNEG, "fneg" },
457*9a0e4156SSadaf Ebrahimi { ARM64_INS_FNMADD, "fnmadd" },
458*9a0e4156SSadaf Ebrahimi { ARM64_INS_FNMSUB, "fnmsub" },
459*9a0e4156SSadaf Ebrahimi { ARM64_INS_FNMUL, "fnmul" },
460*9a0e4156SSadaf Ebrahimi { ARM64_INS_FRECPE, "frecpe" },
461*9a0e4156SSadaf Ebrahimi { ARM64_INS_FRECPS, "frecps" },
462*9a0e4156SSadaf Ebrahimi { ARM64_INS_FRECPX, "frecpx" },
463*9a0e4156SSadaf Ebrahimi { ARM64_INS_FRINTA, "frinta" },
464*9a0e4156SSadaf Ebrahimi { ARM64_INS_FRINTI, "frinti" },
465*9a0e4156SSadaf Ebrahimi { ARM64_INS_FRINTM, "frintm" },
466*9a0e4156SSadaf Ebrahimi { ARM64_INS_FRINTN, "frintn" },
467*9a0e4156SSadaf Ebrahimi { ARM64_INS_FRINTP, "frintp" },
468*9a0e4156SSadaf Ebrahimi { ARM64_INS_FRINTX, "frintx" },
469*9a0e4156SSadaf Ebrahimi { ARM64_INS_FRINTZ, "frintz" },
470*9a0e4156SSadaf Ebrahimi { ARM64_INS_FRSQRTE, "frsqrte" },
471*9a0e4156SSadaf Ebrahimi { ARM64_INS_FRSQRTS, "frsqrts" },
472*9a0e4156SSadaf Ebrahimi { ARM64_INS_FSQRT, "fsqrt" },
473*9a0e4156SSadaf Ebrahimi { ARM64_INS_FSUB, "fsub" },
474*9a0e4156SSadaf Ebrahimi { ARM64_INS_HINT, "hint" },
475*9a0e4156SSadaf Ebrahimi { ARM64_INS_HLT, "hlt" },
476*9a0e4156SSadaf Ebrahimi { ARM64_INS_HVC, "hvc" },
477*9a0e4156SSadaf Ebrahimi { ARM64_INS_INS, "ins" },
478*9a0e4156SSadaf Ebrahimi { ARM64_INS_ISB, "isb" },
479*9a0e4156SSadaf Ebrahimi { ARM64_INS_LD1, "ld1" },
480*9a0e4156SSadaf Ebrahimi { ARM64_INS_LD1R, "ld1r" },
481*9a0e4156SSadaf Ebrahimi { ARM64_INS_LD2R, "ld2r" },
482*9a0e4156SSadaf Ebrahimi { ARM64_INS_LD2, "ld2" },
483*9a0e4156SSadaf Ebrahimi { ARM64_INS_LD3R, "ld3r" },
484*9a0e4156SSadaf Ebrahimi { ARM64_INS_LD3, "ld3" },
485*9a0e4156SSadaf Ebrahimi { ARM64_INS_LD4, "ld4" },
486*9a0e4156SSadaf Ebrahimi { ARM64_INS_LD4R, "ld4r" },
487*9a0e4156SSadaf Ebrahimi { ARM64_INS_LDARB, "ldarb" },
488*9a0e4156SSadaf Ebrahimi { ARM64_INS_LDARH, "ldarh" },
489*9a0e4156SSadaf Ebrahimi { ARM64_INS_LDAR, "ldar" },
490*9a0e4156SSadaf Ebrahimi { ARM64_INS_LDAXP, "ldaxp" },
491*9a0e4156SSadaf Ebrahimi { ARM64_INS_LDAXRB, "ldaxrb" },
492*9a0e4156SSadaf Ebrahimi { ARM64_INS_LDAXRH, "ldaxrh" },
493*9a0e4156SSadaf Ebrahimi { ARM64_INS_LDAXR, "ldaxr" },
494*9a0e4156SSadaf Ebrahimi { ARM64_INS_LDNP, "ldnp" },
495*9a0e4156SSadaf Ebrahimi { ARM64_INS_LDP, "ldp" },
496*9a0e4156SSadaf Ebrahimi { ARM64_INS_LDPSW, "ldpsw" },
497*9a0e4156SSadaf Ebrahimi { ARM64_INS_LDRB, "ldrb" },
498*9a0e4156SSadaf Ebrahimi { ARM64_INS_LDR, "ldr" },
499*9a0e4156SSadaf Ebrahimi { ARM64_INS_LDRH, "ldrh" },
500*9a0e4156SSadaf Ebrahimi { ARM64_INS_LDRSB, "ldrsb" },
501*9a0e4156SSadaf Ebrahimi { ARM64_INS_LDRSH, "ldrsh" },
502*9a0e4156SSadaf Ebrahimi { ARM64_INS_LDRSW, "ldrsw" },
503*9a0e4156SSadaf Ebrahimi { ARM64_INS_LDTRB, "ldtrb" },
504*9a0e4156SSadaf Ebrahimi { ARM64_INS_LDTRH, "ldtrh" },
505*9a0e4156SSadaf Ebrahimi { ARM64_INS_LDTRSB, "ldtrsb" },
506*9a0e4156SSadaf Ebrahimi { ARM64_INS_LDTRSH, "ldtrsh" },
507*9a0e4156SSadaf Ebrahimi { ARM64_INS_LDTRSW, "ldtrsw" },
508*9a0e4156SSadaf Ebrahimi { ARM64_INS_LDTR, "ldtr" },
509*9a0e4156SSadaf Ebrahimi { ARM64_INS_LDURB, "ldurb" },
510*9a0e4156SSadaf Ebrahimi { ARM64_INS_LDUR, "ldur" },
511*9a0e4156SSadaf Ebrahimi { ARM64_INS_LDURH, "ldurh" },
512*9a0e4156SSadaf Ebrahimi { ARM64_INS_LDURSB, "ldursb" },
513*9a0e4156SSadaf Ebrahimi { ARM64_INS_LDURSH, "ldursh" },
514*9a0e4156SSadaf Ebrahimi { ARM64_INS_LDURSW, "ldursw" },
515*9a0e4156SSadaf Ebrahimi { ARM64_INS_LDXP, "ldxp" },
516*9a0e4156SSadaf Ebrahimi { ARM64_INS_LDXRB, "ldxrb" },
517*9a0e4156SSadaf Ebrahimi { ARM64_INS_LDXRH, "ldxrh" },
518*9a0e4156SSadaf Ebrahimi { ARM64_INS_LDXR, "ldxr" },
519*9a0e4156SSadaf Ebrahimi { ARM64_INS_LSL, "lsl" },
520*9a0e4156SSadaf Ebrahimi { ARM64_INS_LSR, "lsr" },
521*9a0e4156SSadaf Ebrahimi { ARM64_INS_MADD, "madd" },
522*9a0e4156SSadaf Ebrahimi { ARM64_INS_MLA, "mla" },
523*9a0e4156SSadaf Ebrahimi { ARM64_INS_MLS, "mls" },
524*9a0e4156SSadaf Ebrahimi { ARM64_INS_MOVI, "movi" },
525*9a0e4156SSadaf Ebrahimi { ARM64_INS_MOVK, "movk" },
526*9a0e4156SSadaf Ebrahimi { ARM64_INS_MOVN, "movn" },
527*9a0e4156SSadaf Ebrahimi { ARM64_INS_MOVZ, "movz" },
528*9a0e4156SSadaf Ebrahimi { ARM64_INS_MRS, "mrs" },
529*9a0e4156SSadaf Ebrahimi { ARM64_INS_MSR, "msr" },
530*9a0e4156SSadaf Ebrahimi { ARM64_INS_MSUB, "msub" },
531*9a0e4156SSadaf Ebrahimi { ARM64_INS_MUL, "mul" },
532*9a0e4156SSadaf Ebrahimi { ARM64_INS_MVNI, "mvni" },
533*9a0e4156SSadaf Ebrahimi { ARM64_INS_NEG, "neg" },
534*9a0e4156SSadaf Ebrahimi { ARM64_INS_NOT, "not" },
535*9a0e4156SSadaf Ebrahimi { ARM64_INS_ORN, "orn" },
536*9a0e4156SSadaf Ebrahimi { ARM64_INS_ORR, "orr" },
537*9a0e4156SSadaf Ebrahimi { ARM64_INS_PMULL2, "pmull2" },
538*9a0e4156SSadaf Ebrahimi { ARM64_INS_PMULL, "pmull" },
539*9a0e4156SSadaf Ebrahimi { ARM64_INS_PMUL, "pmul" },
540*9a0e4156SSadaf Ebrahimi { ARM64_INS_PRFM, "prfm" },
541*9a0e4156SSadaf Ebrahimi { ARM64_INS_PRFUM, "prfum" },
542*9a0e4156SSadaf Ebrahimi { ARM64_INS_RADDHN, "raddhn" },
543*9a0e4156SSadaf Ebrahimi { ARM64_INS_RADDHN2, "raddhn2" },
544*9a0e4156SSadaf Ebrahimi { ARM64_INS_RBIT, "rbit" },
545*9a0e4156SSadaf Ebrahimi { ARM64_INS_RET, "ret" },
546*9a0e4156SSadaf Ebrahimi { ARM64_INS_REV16, "rev16" },
547*9a0e4156SSadaf Ebrahimi { ARM64_INS_REV32, "rev32" },
548*9a0e4156SSadaf Ebrahimi { ARM64_INS_REV64, "rev64" },
549*9a0e4156SSadaf Ebrahimi { ARM64_INS_REV, "rev" },
550*9a0e4156SSadaf Ebrahimi { ARM64_INS_ROR, "ror" },
551*9a0e4156SSadaf Ebrahimi { ARM64_INS_RSHRN2, "rshrn2" },
552*9a0e4156SSadaf Ebrahimi { ARM64_INS_RSHRN, "rshrn" },
553*9a0e4156SSadaf Ebrahimi { ARM64_INS_RSUBHN, "rsubhn" },
554*9a0e4156SSadaf Ebrahimi { ARM64_INS_RSUBHN2, "rsubhn2" },
555*9a0e4156SSadaf Ebrahimi { ARM64_INS_SABAL2, "sabal2" },
556*9a0e4156SSadaf Ebrahimi { ARM64_INS_SABAL, "sabal" },
557*9a0e4156SSadaf Ebrahimi { ARM64_INS_SABA, "saba" },
558*9a0e4156SSadaf Ebrahimi { ARM64_INS_SABDL2, "sabdl2" },
559*9a0e4156SSadaf Ebrahimi { ARM64_INS_SABDL, "sabdl" },
560*9a0e4156SSadaf Ebrahimi { ARM64_INS_SABD, "sabd" },
561*9a0e4156SSadaf Ebrahimi { ARM64_INS_SADALP, "sadalp" },
562*9a0e4156SSadaf Ebrahimi { ARM64_INS_SADDLP, "saddlp" },
563*9a0e4156SSadaf Ebrahimi { ARM64_INS_SADDLV, "saddlv" },
564*9a0e4156SSadaf Ebrahimi { ARM64_INS_SADDL2, "saddl2" },
565*9a0e4156SSadaf Ebrahimi { ARM64_INS_SADDL, "saddl" },
566*9a0e4156SSadaf Ebrahimi { ARM64_INS_SADDW2, "saddw2" },
567*9a0e4156SSadaf Ebrahimi { ARM64_INS_SADDW, "saddw" },
568*9a0e4156SSadaf Ebrahimi { ARM64_INS_SBC, "sbc" },
569*9a0e4156SSadaf Ebrahimi { ARM64_INS_SBFM, "sbfm" },
570*9a0e4156SSadaf Ebrahimi { ARM64_INS_SCVTF, "scvtf" },
571*9a0e4156SSadaf Ebrahimi { ARM64_INS_SDIV, "sdiv" },
572*9a0e4156SSadaf Ebrahimi { ARM64_INS_SHA1C, "sha1c" },
573*9a0e4156SSadaf Ebrahimi { ARM64_INS_SHA1H, "sha1h" },
574*9a0e4156SSadaf Ebrahimi { ARM64_INS_SHA1M, "sha1m" },
575*9a0e4156SSadaf Ebrahimi { ARM64_INS_SHA1P, "sha1p" },
576*9a0e4156SSadaf Ebrahimi { ARM64_INS_SHA1SU0, "sha1su0" },
577*9a0e4156SSadaf Ebrahimi { ARM64_INS_SHA1SU1, "sha1su1" },
578*9a0e4156SSadaf Ebrahimi { ARM64_INS_SHA256H2, "sha256h2" },
579*9a0e4156SSadaf Ebrahimi { ARM64_INS_SHA256H, "sha256h" },
580*9a0e4156SSadaf Ebrahimi { ARM64_INS_SHA256SU0, "sha256su0" },
581*9a0e4156SSadaf Ebrahimi { ARM64_INS_SHA256SU1, "sha256su1" },
582*9a0e4156SSadaf Ebrahimi { ARM64_INS_SHADD, "shadd" },
583*9a0e4156SSadaf Ebrahimi { ARM64_INS_SHLL2, "shll2" },
584*9a0e4156SSadaf Ebrahimi { ARM64_INS_SHLL, "shll" },
585*9a0e4156SSadaf Ebrahimi { ARM64_INS_SHL, "shl" },
586*9a0e4156SSadaf Ebrahimi { ARM64_INS_SHRN2, "shrn2" },
587*9a0e4156SSadaf Ebrahimi { ARM64_INS_SHRN, "shrn" },
588*9a0e4156SSadaf Ebrahimi { ARM64_INS_SHSUB, "shsub" },
589*9a0e4156SSadaf Ebrahimi { ARM64_INS_SLI, "sli" },
590*9a0e4156SSadaf Ebrahimi { ARM64_INS_SMADDL, "smaddl" },
591*9a0e4156SSadaf Ebrahimi { ARM64_INS_SMAXP, "smaxp" },
592*9a0e4156SSadaf Ebrahimi { ARM64_INS_SMAXV, "smaxv" },
593*9a0e4156SSadaf Ebrahimi { ARM64_INS_SMAX, "smax" },
594*9a0e4156SSadaf Ebrahimi { ARM64_INS_SMC, "smc" },
595*9a0e4156SSadaf Ebrahimi { ARM64_INS_SMINP, "sminp" },
596*9a0e4156SSadaf Ebrahimi { ARM64_INS_SMINV, "sminv" },
597*9a0e4156SSadaf Ebrahimi { ARM64_INS_SMIN, "smin" },
598*9a0e4156SSadaf Ebrahimi { ARM64_INS_SMLAL2, "smlal2" },
599*9a0e4156SSadaf Ebrahimi { ARM64_INS_SMLAL, "smlal" },
600*9a0e4156SSadaf Ebrahimi { ARM64_INS_SMLSL2, "smlsl2" },
601*9a0e4156SSadaf Ebrahimi { ARM64_INS_SMLSL, "smlsl" },
602*9a0e4156SSadaf Ebrahimi { ARM64_INS_SMOV, "smov" },
603*9a0e4156SSadaf Ebrahimi { ARM64_INS_SMSUBL, "smsubl" },
604*9a0e4156SSadaf Ebrahimi { ARM64_INS_SMULH, "smulh" },
605*9a0e4156SSadaf Ebrahimi { ARM64_INS_SMULL2, "smull2" },
606*9a0e4156SSadaf Ebrahimi { ARM64_INS_SMULL, "smull" },
607*9a0e4156SSadaf Ebrahimi { ARM64_INS_SQABS, "sqabs" },
608*9a0e4156SSadaf Ebrahimi { ARM64_INS_SQADD, "sqadd" },
609*9a0e4156SSadaf Ebrahimi { ARM64_INS_SQDMLAL, "sqdmlal" },
610*9a0e4156SSadaf Ebrahimi { ARM64_INS_SQDMLAL2, "sqdmlal2" },
611*9a0e4156SSadaf Ebrahimi { ARM64_INS_SQDMLSL, "sqdmlsl" },
612*9a0e4156SSadaf Ebrahimi { ARM64_INS_SQDMLSL2, "sqdmlsl2" },
613*9a0e4156SSadaf Ebrahimi { ARM64_INS_SQDMULH, "sqdmulh" },
614*9a0e4156SSadaf Ebrahimi { ARM64_INS_SQDMULL, "sqdmull" },
615*9a0e4156SSadaf Ebrahimi { ARM64_INS_SQDMULL2, "sqdmull2" },
616*9a0e4156SSadaf Ebrahimi { ARM64_INS_SQNEG, "sqneg" },
617*9a0e4156SSadaf Ebrahimi { ARM64_INS_SQRDMULH, "sqrdmulh" },
618*9a0e4156SSadaf Ebrahimi { ARM64_INS_SQRSHL, "sqrshl" },
619*9a0e4156SSadaf Ebrahimi { ARM64_INS_SQRSHRN, "sqrshrn" },
620*9a0e4156SSadaf Ebrahimi { ARM64_INS_SQRSHRN2, "sqrshrn2" },
621*9a0e4156SSadaf Ebrahimi { ARM64_INS_SQRSHRUN, "sqrshrun" },
622*9a0e4156SSadaf Ebrahimi { ARM64_INS_SQRSHRUN2, "sqrshrun2" },
623*9a0e4156SSadaf Ebrahimi { ARM64_INS_SQSHLU, "sqshlu" },
624*9a0e4156SSadaf Ebrahimi { ARM64_INS_SQSHL, "sqshl" },
625*9a0e4156SSadaf Ebrahimi { ARM64_INS_SQSHRN, "sqshrn" },
626*9a0e4156SSadaf Ebrahimi { ARM64_INS_SQSHRN2, "sqshrn2" },
627*9a0e4156SSadaf Ebrahimi { ARM64_INS_SQSHRUN, "sqshrun" },
628*9a0e4156SSadaf Ebrahimi { ARM64_INS_SQSHRUN2, "sqshrun2" },
629*9a0e4156SSadaf Ebrahimi { ARM64_INS_SQSUB, "sqsub" },
630*9a0e4156SSadaf Ebrahimi { ARM64_INS_SQXTN2, "sqxtn2" },
631*9a0e4156SSadaf Ebrahimi { ARM64_INS_SQXTN, "sqxtn" },
632*9a0e4156SSadaf Ebrahimi { ARM64_INS_SQXTUN2, "sqxtun2" },
633*9a0e4156SSadaf Ebrahimi { ARM64_INS_SQXTUN, "sqxtun" },
634*9a0e4156SSadaf Ebrahimi { ARM64_INS_SRHADD, "srhadd" },
635*9a0e4156SSadaf Ebrahimi { ARM64_INS_SRI, "sri" },
636*9a0e4156SSadaf Ebrahimi { ARM64_INS_SRSHL, "srshl" },
637*9a0e4156SSadaf Ebrahimi { ARM64_INS_SRSHR, "srshr" },
638*9a0e4156SSadaf Ebrahimi { ARM64_INS_SRSRA, "srsra" },
639*9a0e4156SSadaf Ebrahimi { ARM64_INS_SSHLL2, "sshll2" },
640*9a0e4156SSadaf Ebrahimi { ARM64_INS_SSHLL, "sshll" },
641*9a0e4156SSadaf Ebrahimi { ARM64_INS_SSHL, "sshl" },
642*9a0e4156SSadaf Ebrahimi { ARM64_INS_SSHR, "sshr" },
643*9a0e4156SSadaf Ebrahimi { ARM64_INS_SSRA, "ssra" },
644*9a0e4156SSadaf Ebrahimi { ARM64_INS_SSUBL2, "ssubl2" },
645*9a0e4156SSadaf Ebrahimi { ARM64_INS_SSUBL, "ssubl" },
646*9a0e4156SSadaf Ebrahimi { ARM64_INS_SSUBW2, "ssubw2" },
647*9a0e4156SSadaf Ebrahimi { ARM64_INS_SSUBW, "ssubw" },
648*9a0e4156SSadaf Ebrahimi { ARM64_INS_ST1, "st1" },
649*9a0e4156SSadaf Ebrahimi { ARM64_INS_ST2, "st2" },
650*9a0e4156SSadaf Ebrahimi { ARM64_INS_ST3, "st3" },
651*9a0e4156SSadaf Ebrahimi { ARM64_INS_ST4, "st4" },
652*9a0e4156SSadaf Ebrahimi { ARM64_INS_STLRB, "stlrb" },
653*9a0e4156SSadaf Ebrahimi { ARM64_INS_STLRH, "stlrh" },
654*9a0e4156SSadaf Ebrahimi { ARM64_INS_STLR, "stlr" },
655*9a0e4156SSadaf Ebrahimi { ARM64_INS_STLXP, "stlxp" },
656*9a0e4156SSadaf Ebrahimi { ARM64_INS_STLXRB, "stlxrb" },
657*9a0e4156SSadaf Ebrahimi { ARM64_INS_STLXRH, "stlxrh" },
658*9a0e4156SSadaf Ebrahimi { ARM64_INS_STLXR, "stlxr" },
659*9a0e4156SSadaf Ebrahimi { ARM64_INS_STNP, "stnp" },
660*9a0e4156SSadaf Ebrahimi { ARM64_INS_STP, "stp" },
661*9a0e4156SSadaf Ebrahimi { ARM64_INS_STRB, "strb" },
662*9a0e4156SSadaf Ebrahimi { ARM64_INS_STR, "str" },
663*9a0e4156SSadaf Ebrahimi { ARM64_INS_STRH, "strh" },
664*9a0e4156SSadaf Ebrahimi { ARM64_INS_STTRB, "sttrb" },
665*9a0e4156SSadaf Ebrahimi { ARM64_INS_STTRH, "sttrh" },
666*9a0e4156SSadaf Ebrahimi { ARM64_INS_STTR, "sttr" },
667*9a0e4156SSadaf Ebrahimi { ARM64_INS_STURB, "sturb" },
668*9a0e4156SSadaf Ebrahimi { ARM64_INS_STUR, "stur" },
669*9a0e4156SSadaf Ebrahimi { ARM64_INS_STURH, "sturh" },
670*9a0e4156SSadaf Ebrahimi { ARM64_INS_STXP, "stxp" },
671*9a0e4156SSadaf Ebrahimi { ARM64_INS_STXRB, "stxrb" },
672*9a0e4156SSadaf Ebrahimi { ARM64_INS_STXRH, "stxrh" },
673*9a0e4156SSadaf Ebrahimi { ARM64_INS_STXR, "stxr" },
674*9a0e4156SSadaf Ebrahimi { ARM64_INS_SUBHN, "subhn" },
675*9a0e4156SSadaf Ebrahimi { ARM64_INS_SUBHN2, "subhn2" },
676*9a0e4156SSadaf Ebrahimi { ARM64_INS_SUB, "sub" },
677*9a0e4156SSadaf Ebrahimi { ARM64_INS_SUQADD, "suqadd" },
678*9a0e4156SSadaf Ebrahimi { ARM64_INS_SVC, "svc" },
679*9a0e4156SSadaf Ebrahimi { ARM64_INS_SYSL, "sysl" },
680*9a0e4156SSadaf Ebrahimi { ARM64_INS_SYS, "sys" },
681*9a0e4156SSadaf Ebrahimi { ARM64_INS_TBL, "tbl" },
682*9a0e4156SSadaf Ebrahimi { ARM64_INS_TBNZ, "tbnz" },
683*9a0e4156SSadaf Ebrahimi { ARM64_INS_TBX, "tbx" },
684*9a0e4156SSadaf Ebrahimi { ARM64_INS_TBZ, "tbz" },
685*9a0e4156SSadaf Ebrahimi { ARM64_INS_TRN1, "trn1" },
686*9a0e4156SSadaf Ebrahimi { ARM64_INS_TRN2, "trn2" },
687*9a0e4156SSadaf Ebrahimi { ARM64_INS_UABAL2, "uabal2" },
688*9a0e4156SSadaf Ebrahimi { ARM64_INS_UABAL, "uabal" },
689*9a0e4156SSadaf Ebrahimi { ARM64_INS_UABA, "uaba" },
690*9a0e4156SSadaf Ebrahimi { ARM64_INS_UABDL2, "uabdl2" },
691*9a0e4156SSadaf Ebrahimi { ARM64_INS_UABDL, "uabdl" },
692*9a0e4156SSadaf Ebrahimi { ARM64_INS_UABD, "uabd" },
693*9a0e4156SSadaf Ebrahimi { ARM64_INS_UADALP, "uadalp" },
694*9a0e4156SSadaf Ebrahimi { ARM64_INS_UADDLP, "uaddlp" },
695*9a0e4156SSadaf Ebrahimi { ARM64_INS_UADDLV, "uaddlv" },
696*9a0e4156SSadaf Ebrahimi { ARM64_INS_UADDL2, "uaddl2" },
697*9a0e4156SSadaf Ebrahimi { ARM64_INS_UADDL, "uaddl" },
698*9a0e4156SSadaf Ebrahimi { ARM64_INS_UADDW2, "uaddw2" },
699*9a0e4156SSadaf Ebrahimi { ARM64_INS_UADDW, "uaddw" },
700*9a0e4156SSadaf Ebrahimi { ARM64_INS_UBFM, "ubfm" },
701*9a0e4156SSadaf Ebrahimi { ARM64_INS_UCVTF, "ucvtf" },
702*9a0e4156SSadaf Ebrahimi { ARM64_INS_UDIV, "udiv" },
703*9a0e4156SSadaf Ebrahimi { ARM64_INS_UHADD, "uhadd" },
704*9a0e4156SSadaf Ebrahimi { ARM64_INS_UHSUB, "uhsub" },
705*9a0e4156SSadaf Ebrahimi { ARM64_INS_UMADDL, "umaddl" },
706*9a0e4156SSadaf Ebrahimi { ARM64_INS_UMAXP, "umaxp" },
707*9a0e4156SSadaf Ebrahimi { ARM64_INS_UMAXV, "umaxv" },
708*9a0e4156SSadaf Ebrahimi { ARM64_INS_UMAX, "umax" },
709*9a0e4156SSadaf Ebrahimi { ARM64_INS_UMINP, "uminp" },
710*9a0e4156SSadaf Ebrahimi { ARM64_INS_UMINV, "uminv" },
711*9a0e4156SSadaf Ebrahimi { ARM64_INS_UMIN, "umin" },
712*9a0e4156SSadaf Ebrahimi { ARM64_INS_UMLAL2, "umlal2" },
713*9a0e4156SSadaf Ebrahimi { ARM64_INS_UMLAL, "umlal" },
714*9a0e4156SSadaf Ebrahimi { ARM64_INS_UMLSL2, "umlsl2" },
715*9a0e4156SSadaf Ebrahimi { ARM64_INS_UMLSL, "umlsl" },
716*9a0e4156SSadaf Ebrahimi { ARM64_INS_UMOV, "umov" },
717*9a0e4156SSadaf Ebrahimi { ARM64_INS_UMSUBL, "umsubl" },
718*9a0e4156SSadaf Ebrahimi { ARM64_INS_UMULH, "umulh" },
719*9a0e4156SSadaf Ebrahimi { ARM64_INS_UMULL2, "umull2" },
720*9a0e4156SSadaf Ebrahimi { ARM64_INS_UMULL, "umull" },
721*9a0e4156SSadaf Ebrahimi { ARM64_INS_UQADD, "uqadd" },
722*9a0e4156SSadaf Ebrahimi { ARM64_INS_UQRSHL, "uqrshl" },
723*9a0e4156SSadaf Ebrahimi { ARM64_INS_UQRSHRN, "uqrshrn" },
724*9a0e4156SSadaf Ebrahimi { ARM64_INS_UQRSHRN2, "uqrshrn2" },
725*9a0e4156SSadaf Ebrahimi { ARM64_INS_UQSHL, "uqshl" },
726*9a0e4156SSadaf Ebrahimi { ARM64_INS_UQSHRN, "uqshrn" },
727*9a0e4156SSadaf Ebrahimi { ARM64_INS_UQSHRN2, "uqshrn2" },
728*9a0e4156SSadaf Ebrahimi { ARM64_INS_UQSUB, "uqsub" },
729*9a0e4156SSadaf Ebrahimi { ARM64_INS_UQXTN2, "uqxtn2" },
730*9a0e4156SSadaf Ebrahimi { ARM64_INS_UQXTN, "uqxtn" },
731*9a0e4156SSadaf Ebrahimi { ARM64_INS_URECPE, "urecpe" },
732*9a0e4156SSadaf Ebrahimi { ARM64_INS_URHADD, "urhadd" },
733*9a0e4156SSadaf Ebrahimi { ARM64_INS_URSHL, "urshl" },
734*9a0e4156SSadaf Ebrahimi { ARM64_INS_URSHR, "urshr" },
735*9a0e4156SSadaf Ebrahimi { ARM64_INS_URSQRTE, "ursqrte" },
736*9a0e4156SSadaf Ebrahimi { ARM64_INS_URSRA, "ursra" },
737*9a0e4156SSadaf Ebrahimi { ARM64_INS_USHLL2, "ushll2" },
738*9a0e4156SSadaf Ebrahimi { ARM64_INS_USHLL, "ushll" },
739*9a0e4156SSadaf Ebrahimi { ARM64_INS_USHL, "ushl" },
740*9a0e4156SSadaf Ebrahimi { ARM64_INS_USHR, "ushr" },
741*9a0e4156SSadaf Ebrahimi { ARM64_INS_USQADD, "usqadd" },
742*9a0e4156SSadaf Ebrahimi { ARM64_INS_USRA, "usra" },
743*9a0e4156SSadaf Ebrahimi { ARM64_INS_USUBL2, "usubl2" },
744*9a0e4156SSadaf Ebrahimi { ARM64_INS_USUBL, "usubl" },
745*9a0e4156SSadaf Ebrahimi { ARM64_INS_USUBW2, "usubw2" },
746*9a0e4156SSadaf Ebrahimi { ARM64_INS_USUBW, "usubw" },
747*9a0e4156SSadaf Ebrahimi { ARM64_INS_UZP1, "uzp1" },
748*9a0e4156SSadaf Ebrahimi { ARM64_INS_UZP2, "uzp2" },
749*9a0e4156SSadaf Ebrahimi { ARM64_INS_XTN2, "xtn2" },
750*9a0e4156SSadaf Ebrahimi { ARM64_INS_XTN, "xtn" },
751*9a0e4156SSadaf Ebrahimi { ARM64_INS_ZIP1, "zip1" },
752*9a0e4156SSadaf Ebrahimi { ARM64_INS_ZIP2, "zip2" },
753*9a0e4156SSadaf Ebrahimi };
754*9a0e4156SSadaf Ebrahimi
755*9a0e4156SSadaf Ebrahimi // map *S & alias instructions back to original id
756*9a0e4156SSadaf Ebrahimi static const name_map alias_insn_name_maps[] = {
757*9a0e4156SSadaf Ebrahimi { ARM64_INS_ADC, "adcs" },
758*9a0e4156SSadaf Ebrahimi { ARM64_INS_AND, "ands" },
759*9a0e4156SSadaf Ebrahimi { ARM64_INS_ADD, "adds" },
760*9a0e4156SSadaf Ebrahimi { ARM64_INS_BIC, "bics" },
761*9a0e4156SSadaf Ebrahimi { ARM64_INS_SBC, "sbcs" },
762*9a0e4156SSadaf Ebrahimi { ARM64_INS_SUB, "subs" },
763*9a0e4156SSadaf Ebrahimi
764*9a0e4156SSadaf Ebrahimi // alias insn
765*9a0e4156SSadaf Ebrahimi { ARM64_INS_MNEG, "mneg" },
766*9a0e4156SSadaf Ebrahimi { ARM64_INS_UMNEGL, "umnegl" },
767*9a0e4156SSadaf Ebrahimi { ARM64_INS_SMNEGL, "smnegl" },
768*9a0e4156SSadaf Ebrahimi { ARM64_INS_NOP, "nop" },
769*9a0e4156SSadaf Ebrahimi { ARM64_INS_YIELD, "yield" },
770*9a0e4156SSadaf Ebrahimi { ARM64_INS_WFE, "wfe" },
771*9a0e4156SSadaf Ebrahimi { ARM64_INS_WFI, "wfi" },
772*9a0e4156SSadaf Ebrahimi { ARM64_INS_SEV, "sev" },
773*9a0e4156SSadaf Ebrahimi { ARM64_INS_SEVL, "sevl" },
774*9a0e4156SSadaf Ebrahimi { ARM64_INS_NGC, "ngc" },
775*9a0e4156SSadaf Ebrahimi { ARM64_INS_NGCS, "ngcs" },
776*9a0e4156SSadaf Ebrahimi { ARM64_INS_NEGS, "negs" },
777*9a0e4156SSadaf Ebrahimi
778*9a0e4156SSadaf Ebrahimi { ARM64_INS_SBFIZ, "sbfiz" },
779*9a0e4156SSadaf Ebrahimi { ARM64_INS_UBFIZ, "ubfiz" },
780*9a0e4156SSadaf Ebrahimi { ARM64_INS_SBFX, "sbfx" },
781*9a0e4156SSadaf Ebrahimi { ARM64_INS_UBFX, "ubfx" },
782*9a0e4156SSadaf Ebrahimi { ARM64_INS_BFI, "bfi" },
783*9a0e4156SSadaf Ebrahimi { ARM64_INS_BFXIL, "bfxil" },
784*9a0e4156SSadaf Ebrahimi { ARM64_INS_CMN, "cmn" },
785*9a0e4156SSadaf Ebrahimi { ARM64_INS_MVN, "mvn" },
786*9a0e4156SSadaf Ebrahimi { ARM64_INS_TST, "tst" },
787*9a0e4156SSadaf Ebrahimi { ARM64_INS_CSET, "cset" },
788*9a0e4156SSadaf Ebrahimi { ARM64_INS_CINC, "cinc" },
789*9a0e4156SSadaf Ebrahimi { ARM64_INS_CSETM, "csetm" },
790*9a0e4156SSadaf Ebrahimi { ARM64_INS_CINV, "cinv" },
791*9a0e4156SSadaf Ebrahimi { ARM64_INS_CNEG, "cneg" },
792*9a0e4156SSadaf Ebrahimi { ARM64_INS_SXTB, "sxtb" },
793*9a0e4156SSadaf Ebrahimi { ARM64_INS_SXTH, "sxth" },
794*9a0e4156SSadaf Ebrahimi { ARM64_INS_SXTW, "sxtw" },
795*9a0e4156SSadaf Ebrahimi { ARM64_INS_CMP, "cmp" },
796*9a0e4156SSadaf Ebrahimi { ARM64_INS_UXTB, "uxtb" },
797*9a0e4156SSadaf Ebrahimi { ARM64_INS_UXTH, "uxth" },
798*9a0e4156SSadaf Ebrahimi { ARM64_INS_UXTW, "uxtw" },
799*9a0e4156SSadaf Ebrahimi
800*9a0e4156SSadaf Ebrahimi { ARM64_INS_IC, "ic" },
801*9a0e4156SSadaf Ebrahimi { ARM64_INS_DC, "dc" },
802*9a0e4156SSadaf Ebrahimi { ARM64_INS_AT, "at" },
803*9a0e4156SSadaf Ebrahimi { ARM64_INS_TLBI, "tlbi" },
804*9a0e4156SSadaf Ebrahimi };
805*9a0e4156SSadaf Ebrahimi
AArch64_insn_name(csh handle,unsigned int id)806*9a0e4156SSadaf Ebrahimi const char *AArch64_insn_name(csh handle, unsigned int id)
807*9a0e4156SSadaf Ebrahimi {
808*9a0e4156SSadaf Ebrahimi #ifndef CAPSTONE_DIET
809*9a0e4156SSadaf Ebrahimi unsigned int i;
810*9a0e4156SSadaf Ebrahimi
811*9a0e4156SSadaf Ebrahimi if (id >= ARM64_INS_ENDING)
812*9a0e4156SSadaf Ebrahimi return NULL;
813*9a0e4156SSadaf Ebrahimi
814*9a0e4156SSadaf Ebrahimi if (id < ARR_SIZE(insn_name_maps))
815*9a0e4156SSadaf Ebrahimi return insn_name_maps[id].name;
816*9a0e4156SSadaf Ebrahimi
817*9a0e4156SSadaf Ebrahimi // then find alias insn
818*9a0e4156SSadaf Ebrahimi for (i = 0; i < ARR_SIZE(alias_insn_name_maps); i++) {
819*9a0e4156SSadaf Ebrahimi if (alias_insn_name_maps[i].id == id)
820*9a0e4156SSadaf Ebrahimi return alias_insn_name_maps[i].name;
821*9a0e4156SSadaf Ebrahimi }
822*9a0e4156SSadaf Ebrahimi
823*9a0e4156SSadaf Ebrahimi // not found
824*9a0e4156SSadaf Ebrahimi return NULL;
825*9a0e4156SSadaf Ebrahimi #else
826*9a0e4156SSadaf Ebrahimi return NULL;
827*9a0e4156SSadaf Ebrahimi #endif
828*9a0e4156SSadaf Ebrahimi }
829*9a0e4156SSadaf Ebrahimi
830*9a0e4156SSadaf Ebrahimi #ifndef CAPSTONE_DIET
831*9a0e4156SSadaf Ebrahimi static const name_map group_name_maps[] = {
832*9a0e4156SSadaf Ebrahimi // generic groups
833*9a0e4156SSadaf Ebrahimi { ARM64_GRP_INVALID, NULL },
834*9a0e4156SSadaf Ebrahimi { ARM64_GRP_JUMP, "jump" },
835*9a0e4156SSadaf Ebrahimi { ARM64_GRP_CALL, "call" },
836*9a0e4156SSadaf Ebrahimi { ARM64_GRP_RET, "return" },
837*9a0e4156SSadaf Ebrahimi { ARM64_GRP_PRIVILEGE, "privilege" },
838*9a0e4156SSadaf Ebrahimi { ARM64_GRP_INT, "int" },
839*9a0e4156SSadaf Ebrahimi { ARM64_GRP_BRANCH_RELATIVE, "branch_relative" },
840*9a0e4156SSadaf Ebrahimi
841*9a0e4156SSadaf Ebrahimi // architecture-specific groups
842*9a0e4156SSadaf Ebrahimi { ARM64_GRP_CRYPTO, "crypto" },
843*9a0e4156SSadaf Ebrahimi { ARM64_GRP_FPARMV8, "fparmv8" },
844*9a0e4156SSadaf Ebrahimi { ARM64_GRP_NEON, "neon" },
845*9a0e4156SSadaf Ebrahimi { ARM64_GRP_CRC, "crc" },
846*9a0e4156SSadaf Ebrahimi };
847*9a0e4156SSadaf Ebrahimi #endif
848*9a0e4156SSadaf Ebrahimi
AArch64_group_name(csh handle,unsigned int id)849*9a0e4156SSadaf Ebrahimi const char *AArch64_group_name(csh handle, unsigned int id)
850*9a0e4156SSadaf Ebrahimi {
851*9a0e4156SSadaf Ebrahimi #ifndef CAPSTONE_DIET
852*9a0e4156SSadaf Ebrahimi return id2name(group_name_maps, ARR_SIZE(group_name_maps), id);
853*9a0e4156SSadaf Ebrahimi #else
854*9a0e4156SSadaf Ebrahimi return NULL;
855*9a0e4156SSadaf Ebrahimi #endif
856*9a0e4156SSadaf Ebrahimi }
857*9a0e4156SSadaf Ebrahimi
858*9a0e4156SSadaf Ebrahimi // map instruction name to public instruction ID
AArch64_map_insn(const char * name)859*9a0e4156SSadaf Ebrahimi arm64_reg AArch64_map_insn(const char *name)
860*9a0e4156SSadaf Ebrahimi {
861*9a0e4156SSadaf Ebrahimi // NOTE: skip first NULL name in insn_name_maps
862*9a0e4156SSadaf Ebrahimi int i = name2id(&insn_name_maps[1], ARR_SIZE(insn_name_maps) - 1, name);
863*9a0e4156SSadaf Ebrahimi
864*9a0e4156SSadaf Ebrahimi if (i == -1)
865*9a0e4156SSadaf Ebrahimi // try again with 'special' insn that is not available in insn_name_maps
866*9a0e4156SSadaf Ebrahimi i = name2id(alias_insn_name_maps, ARR_SIZE(alias_insn_name_maps), name);
867*9a0e4156SSadaf Ebrahimi
868*9a0e4156SSadaf Ebrahimi return (i != -1)? i : ARM64_REG_INVALID;
869*9a0e4156SSadaf Ebrahimi }
870*9a0e4156SSadaf Ebrahimi
871*9a0e4156SSadaf Ebrahimi // map internal raw vregister to 'public' register
AArch64_map_vregister(unsigned int r)872*9a0e4156SSadaf Ebrahimi arm64_reg AArch64_map_vregister(unsigned int r)
873*9a0e4156SSadaf Ebrahimi {
874*9a0e4156SSadaf Ebrahimi // for some reasons different Arm64 can map different register number to
875*9a0e4156SSadaf Ebrahimi // the same register. this function handles the issue for exposing Mips
876*9a0e4156SSadaf Ebrahimi // operands by mapping internal registers to 'public' register.
877*9a0e4156SSadaf Ebrahimi static const unsigned int map[] = { 0,
878*9a0e4156SSadaf Ebrahimi 0, 0, 0, 0, 0,
879*9a0e4156SSadaf Ebrahimi 0, 0, 0, 0, 0,
880*9a0e4156SSadaf Ebrahimi 0, 0, 0, 0, 0,
881*9a0e4156SSadaf Ebrahimi 0, 0, 0, 0, 0,
882*9a0e4156SSadaf Ebrahimi 0, 0, 0, 0, 0,
883*9a0e4156SSadaf Ebrahimi 0, 0, 0, 0, 0,
884*9a0e4156SSadaf Ebrahimi 0, 0, 0, 0, 0,
885*9a0e4156SSadaf Ebrahimi 0, 0, 0, 0, ARM64_REG_V0,
886*9a0e4156SSadaf Ebrahimi ARM64_REG_V1, ARM64_REG_V2, ARM64_REG_V3, ARM64_REG_V4, ARM64_REG_V5,
887*9a0e4156SSadaf Ebrahimi ARM64_REG_V6, ARM64_REG_V7, ARM64_REG_V8, ARM64_REG_V9, ARM64_REG_V10,
888*9a0e4156SSadaf Ebrahimi ARM64_REG_V11, ARM64_REG_V12, ARM64_REG_V13, ARM64_REG_V14, ARM64_REG_V15,
889*9a0e4156SSadaf Ebrahimi ARM64_REG_V16, ARM64_REG_V17, ARM64_REG_V18, ARM64_REG_V19, ARM64_REG_V20,
890*9a0e4156SSadaf Ebrahimi ARM64_REG_V21, ARM64_REG_V22, ARM64_REG_V23, ARM64_REG_V24, ARM64_REG_V25,
891*9a0e4156SSadaf Ebrahimi ARM64_REG_V26, ARM64_REG_V27, ARM64_REG_V28, ARM64_REG_V29, ARM64_REG_V30,
892*9a0e4156SSadaf Ebrahimi ARM64_REG_V31, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
893*9a0e4156SSadaf Ebrahimi 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
894*9a0e4156SSadaf Ebrahimi 0, 0, 0, ARM64_REG_V0, ARM64_REG_V1,
895*9a0e4156SSadaf Ebrahimi ARM64_REG_V2, ARM64_REG_V3, ARM64_REG_V4, ARM64_REG_V5, ARM64_REG_V6,
896*9a0e4156SSadaf Ebrahimi ARM64_REG_V7, ARM64_REG_V8, ARM64_REG_V9, ARM64_REG_V10, ARM64_REG_V11,
897*9a0e4156SSadaf Ebrahimi ARM64_REG_V12, ARM64_REG_V13, ARM64_REG_V14, ARM64_REG_V15, ARM64_REG_V16,
898*9a0e4156SSadaf Ebrahimi ARM64_REG_V17, ARM64_REG_V18, ARM64_REG_V19, ARM64_REG_V20, ARM64_REG_V21,
899*9a0e4156SSadaf Ebrahimi ARM64_REG_V22, ARM64_REG_V23, ARM64_REG_V24, ARM64_REG_V25, ARM64_REG_V26,
900*9a0e4156SSadaf Ebrahimi ARM64_REG_V27, ARM64_REG_V28, ARM64_REG_V29, ARM64_REG_V30, ARM64_REG_V31,
901*9a0e4156SSadaf Ebrahimi 0, 0, 0, 0, 0,
902*9a0e4156SSadaf Ebrahimi 0, 0, 0, 0, 0,
903*9a0e4156SSadaf Ebrahimi 0, 0, 0, 0, 0,
904*9a0e4156SSadaf Ebrahimi 0, 0, 0, 0, 0,
905*9a0e4156SSadaf Ebrahimi 0, 0, 0, 0, 0,
906*9a0e4156SSadaf Ebrahimi 0, 0, 0, 0, 0,
907*9a0e4156SSadaf Ebrahimi 0, 0, 0, 0, 0,
908*9a0e4156SSadaf Ebrahimi 0, 0, 0, 0, 0,
909*9a0e4156SSadaf Ebrahimi 0, 0, 0, 0, 0,
910*9a0e4156SSadaf Ebrahimi 0, 0, 0, 0, 0,
911*9a0e4156SSadaf Ebrahimi 0, 0, 0, 0, 0,
912*9a0e4156SSadaf Ebrahimi 0, 0, 0, 0, 0,
913*9a0e4156SSadaf Ebrahimi 0, 0, 0, 0, 0,
914*9a0e4156SSadaf Ebrahimi 0, 0, 0, 0, 0,
915*9a0e4156SSadaf Ebrahimi 0, 0, 0, 0, 0,
916*9a0e4156SSadaf Ebrahimi 0, 0, 0, 0, 0,
917*9a0e4156SSadaf Ebrahimi 0, 0, 0, 0, 0,
918*9a0e4156SSadaf Ebrahimi 0, 0, 0, 0, 0,
919*9a0e4156SSadaf Ebrahimi 0, 0, ARM64_REG_V0, ARM64_REG_V1, ARM64_REG_V2,
920*9a0e4156SSadaf Ebrahimi ARM64_REG_V3, ARM64_REG_V4, ARM64_REG_V5, ARM64_REG_V6, ARM64_REG_V7,
921*9a0e4156SSadaf Ebrahimi ARM64_REG_V8, ARM64_REG_V9, ARM64_REG_V10, ARM64_REG_V11, ARM64_REG_V12,
922*9a0e4156SSadaf Ebrahimi ARM64_REG_V13, ARM64_REG_V14, ARM64_REG_V15, ARM64_REG_V16, ARM64_REG_V17,
923*9a0e4156SSadaf Ebrahimi ARM64_REG_V18, ARM64_REG_V19, ARM64_REG_V20, ARM64_REG_V21, ARM64_REG_V22,
924*9a0e4156SSadaf Ebrahimi ARM64_REG_V23, ARM64_REG_V24, ARM64_REG_V25, ARM64_REG_V26, ARM64_REG_V27,
925*9a0e4156SSadaf Ebrahimi ARM64_REG_V28, ARM64_REG_V29, ARM64_REG_V30, ARM64_REG_V31, ARM64_REG_V0,
926*9a0e4156SSadaf Ebrahimi ARM64_REG_V1, ARM64_REG_V2, ARM64_REG_V3, ARM64_REG_V4, ARM64_REG_V5,
927*9a0e4156SSadaf Ebrahimi ARM64_REG_V6, ARM64_REG_V7, ARM64_REG_V8, ARM64_REG_V9, ARM64_REG_V10,
928*9a0e4156SSadaf Ebrahimi ARM64_REG_V11, ARM64_REG_V12, ARM64_REG_V13, ARM64_REG_V14, ARM64_REG_V15,
929*9a0e4156SSadaf Ebrahimi ARM64_REG_V16, ARM64_REG_V17, ARM64_REG_V18, ARM64_REG_V19, ARM64_REG_V20,
930*9a0e4156SSadaf Ebrahimi ARM64_REG_V21, ARM64_REG_V22, ARM64_REG_V23, ARM64_REG_V24, ARM64_REG_V25,
931*9a0e4156SSadaf Ebrahimi ARM64_REG_V26, ARM64_REG_V27, ARM64_REG_V28, ARM64_REG_V29, ARM64_REG_V30,
932*9a0e4156SSadaf Ebrahimi ARM64_REG_V31, ARM64_REG_V0, ARM64_REG_V1, ARM64_REG_V2, ARM64_REG_V3,
933*9a0e4156SSadaf Ebrahimi ARM64_REG_V4, ARM64_REG_V5, ARM64_REG_V6, ARM64_REG_V7, ARM64_REG_V8,
934*9a0e4156SSadaf Ebrahimi ARM64_REG_V9, ARM64_REG_V10, ARM64_REG_V11, ARM64_REG_V12, ARM64_REG_V13,
935*9a0e4156SSadaf Ebrahimi ARM64_REG_V14, ARM64_REG_V15, ARM64_REG_V16, ARM64_REG_V17, ARM64_REG_V18,
936*9a0e4156SSadaf Ebrahimi ARM64_REG_V19, ARM64_REG_V20, ARM64_REG_V21, ARM64_REG_V22, ARM64_REG_V23,
937*9a0e4156SSadaf Ebrahimi ARM64_REG_V24, ARM64_REG_V25, ARM64_REG_V26, ARM64_REG_V27, ARM64_REG_V28,
938*9a0e4156SSadaf Ebrahimi ARM64_REG_V29, ARM64_REG_V30, ARM64_REG_V31, ARM64_REG_V0, ARM64_REG_V1,
939*9a0e4156SSadaf Ebrahimi ARM64_REG_V2, ARM64_REG_V3, ARM64_REG_V4, ARM64_REG_V5, ARM64_REG_V6,
940*9a0e4156SSadaf Ebrahimi ARM64_REG_V7, ARM64_REG_V8, ARM64_REG_V9, ARM64_REG_V10, ARM64_REG_V11,
941*9a0e4156SSadaf Ebrahimi ARM64_REG_V12, ARM64_REG_V13, ARM64_REG_V14, ARM64_REG_V15, ARM64_REG_V16,
942*9a0e4156SSadaf Ebrahimi ARM64_REG_V17, ARM64_REG_V18, ARM64_REG_V19, ARM64_REG_V20, ARM64_REG_V21,
943*9a0e4156SSadaf Ebrahimi ARM64_REG_V22, ARM64_REG_V23, ARM64_REG_V24, ARM64_REG_V25, ARM64_REG_V26,
944*9a0e4156SSadaf Ebrahimi ARM64_REG_V27, ARM64_REG_V28, ARM64_REG_V29, ARM64_REG_V30, ARM64_REG_V31,
945*9a0e4156SSadaf Ebrahimi ARM64_REG_V0, ARM64_REG_V1, ARM64_REG_V2, ARM64_REG_V3, ARM64_REG_V4,
946*9a0e4156SSadaf Ebrahimi ARM64_REG_V5, ARM64_REG_V6, ARM64_REG_V7, ARM64_REG_V8, ARM64_REG_V9,
947*9a0e4156SSadaf Ebrahimi ARM64_REG_V10, ARM64_REG_V11, ARM64_REG_V12, ARM64_REG_V13, ARM64_REG_V14,
948*9a0e4156SSadaf Ebrahimi ARM64_REG_V15, ARM64_REG_V16, ARM64_REG_V17, ARM64_REG_V18, ARM64_REG_V19,
949*9a0e4156SSadaf Ebrahimi ARM64_REG_V20, ARM64_REG_V21, ARM64_REG_V22, ARM64_REG_V23, ARM64_REG_V24,
950*9a0e4156SSadaf Ebrahimi ARM64_REG_V25, ARM64_REG_V26, ARM64_REG_V27, ARM64_REG_V28, ARM64_REG_V29,
951*9a0e4156SSadaf Ebrahimi ARM64_REG_V30, ARM64_REG_V31, ARM64_REG_V0, ARM64_REG_V1, ARM64_REG_V2,
952*9a0e4156SSadaf Ebrahimi ARM64_REG_V3, ARM64_REG_V4, ARM64_REG_V5, ARM64_REG_V6, ARM64_REG_V7,
953*9a0e4156SSadaf Ebrahimi ARM64_REG_V8, ARM64_REG_V9, ARM64_REG_V10, ARM64_REG_V11, ARM64_REG_V12,
954*9a0e4156SSadaf Ebrahimi ARM64_REG_V13, ARM64_REG_V14, ARM64_REG_V15, ARM64_REG_V16, ARM64_REG_V17,
955*9a0e4156SSadaf Ebrahimi ARM64_REG_V18, ARM64_REG_V19, ARM64_REG_V20, ARM64_REG_V21, ARM64_REG_V22,
956*9a0e4156SSadaf Ebrahimi ARM64_REG_V23, ARM64_REG_V24, ARM64_REG_V25, ARM64_REG_V26, ARM64_REG_V27,
957*9a0e4156SSadaf Ebrahimi ARM64_REG_V28, ARM64_REG_V29, ARM64_REG_V30, ARM64_REG_V31, };
958*9a0e4156SSadaf Ebrahimi
959*9a0e4156SSadaf Ebrahimi if (r < ARR_SIZE(map))
960*9a0e4156SSadaf Ebrahimi return map[r];
961*9a0e4156SSadaf Ebrahimi
962*9a0e4156SSadaf Ebrahimi // cannot find this register
963*9a0e4156SSadaf Ebrahimi return 0;
964*9a0e4156SSadaf Ebrahimi }
965*9a0e4156SSadaf Ebrahimi
arm64_op_addVectorArrSpecifier(MCInst * MI,int sp)966*9a0e4156SSadaf Ebrahimi void arm64_op_addVectorArrSpecifier(MCInst * MI, int sp)
967*9a0e4156SSadaf Ebrahimi {
968*9a0e4156SSadaf Ebrahimi if (MI->csh->detail) {
969*9a0e4156SSadaf Ebrahimi MI->flat_insn->detail->arm64.operands[MI->flat_insn->detail->arm64.op_count - 1].vas = sp;
970*9a0e4156SSadaf Ebrahimi }
971*9a0e4156SSadaf Ebrahimi }
972*9a0e4156SSadaf Ebrahimi
arm64_op_addVectorElementSizeSpecifier(MCInst * MI,int sp)973*9a0e4156SSadaf Ebrahimi void arm64_op_addVectorElementSizeSpecifier(MCInst * MI, int sp)
974*9a0e4156SSadaf Ebrahimi {
975*9a0e4156SSadaf Ebrahimi if (MI->csh->detail) {
976*9a0e4156SSadaf Ebrahimi MI->flat_insn->detail->arm64.operands[MI->flat_insn->detail->arm64.op_count - 1].vess = sp;
977*9a0e4156SSadaf Ebrahimi }
978*9a0e4156SSadaf Ebrahimi }
979*9a0e4156SSadaf Ebrahimi
arm64_op_addFP(MCInst * MI,float fp)980*9a0e4156SSadaf Ebrahimi void arm64_op_addFP(MCInst *MI, float fp)
981*9a0e4156SSadaf Ebrahimi {
982*9a0e4156SSadaf Ebrahimi if (MI->csh->detail) {
983*9a0e4156SSadaf Ebrahimi MI->flat_insn->detail->arm64.operands[MI->flat_insn->detail->arm64.op_count].type = ARM64_OP_FP;
984*9a0e4156SSadaf Ebrahimi MI->flat_insn->detail->arm64.operands[MI->flat_insn->detail->arm64.op_count].fp = fp;
985*9a0e4156SSadaf Ebrahimi MI->flat_insn->detail->arm64.op_count++;
986*9a0e4156SSadaf Ebrahimi }
987*9a0e4156SSadaf Ebrahimi }
988*9a0e4156SSadaf Ebrahimi
arm64_op_addImm(MCInst * MI,int64_t imm)989*9a0e4156SSadaf Ebrahimi void arm64_op_addImm(MCInst *MI, int64_t imm)
990*9a0e4156SSadaf Ebrahimi {
991*9a0e4156SSadaf Ebrahimi if (MI->csh->detail) {
992*9a0e4156SSadaf Ebrahimi MI->flat_insn->detail->arm64.operands[MI->flat_insn->detail->arm64.op_count].type = ARM64_OP_IMM;
993*9a0e4156SSadaf Ebrahimi MI->flat_insn->detail->arm64.operands[MI->flat_insn->detail->arm64.op_count].imm = (int)imm;
994*9a0e4156SSadaf Ebrahimi MI->flat_insn->detail->arm64.op_count++;
995*9a0e4156SSadaf Ebrahimi }
996*9a0e4156SSadaf Ebrahimi }
997*9a0e4156SSadaf Ebrahimi
998*9a0e4156SSadaf Ebrahimi #ifndef CAPSTONE_DIET
999*9a0e4156SSadaf Ebrahimi
1000*9a0e4156SSadaf Ebrahimi // map instruction to its characteristics
1001*9a0e4156SSadaf Ebrahimi typedef struct insn_op {
1002*9a0e4156SSadaf Ebrahimi unsigned int eflags_update; // how this instruction update status flags
1003*9a0e4156SSadaf Ebrahimi uint8_t access[5];
1004*9a0e4156SSadaf Ebrahimi } insn_op;
1005*9a0e4156SSadaf Ebrahimi
1006*9a0e4156SSadaf Ebrahimi static insn_op insn_ops[] = {
1007*9a0e4156SSadaf Ebrahimi {
1008*9a0e4156SSadaf Ebrahimi /* NULL item */
1009*9a0e4156SSadaf Ebrahimi 0, { 0 }
1010*9a0e4156SSadaf Ebrahimi },
1011*9a0e4156SSadaf Ebrahimi
1012*9a0e4156SSadaf Ebrahimi #include "AArch64MappingInsnOp.inc"
1013*9a0e4156SSadaf Ebrahimi };
1014*9a0e4156SSadaf Ebrahimi
1015*9a0e4156SSadaf Ebrahimi // given internal insn id, return operand access info
AArch64_get_op_access(cs_struct * h,unsigned int id)1016*9a0e4156SSadaf Ebrahimi uint8_t *AArch64_get_op_access(cs_struct *h, unsigned int id)
1017*9a0e4156SSadaf Ebrahimi {
1018*9a0e4156SSadaf Ebrahimi int i = insn_find(insns, ARR_SIZE(insns), id, &h->insn_cache);
1019*9a0e4156SSadaf Ebrahimi if (i != 0) {
1020*9a0e4156SSadaf Ebrahimi return insn_ops[i].access;
1021*9a0e4156SSadaf Ebrahimi }
1022*9a0e4156SSadaf Ebrahimi
1023*9a0e4156SSadaf Ebrahimi return NULL;
1024*9a0e4156SSadaf Ebrahimi }
1025*9a0e4156SSadaf Ebrahimi
AArch64_reg_access(const cs_insn * insn,cs_regs regs_read,uint8_t * regs_read_count,cs_regs regs_write,uint8_t * regs_write_count)1026*9a0e4156SSadaf Ebrahimi void AArch64_reg_access(const cs_insn *insn,
1027*9a0e4156SSadaf Ebrahimi cs_regs regs_read, uint8_t *regs_read_count,
1028*9a0e4156SSadaf Ebrahimi cs_regs regs_write, uint8_t *regs_write_count)
1029*9a0e4156SSadaf Ebrahimi {
1030*9a0e4156SSadaf Ebrahimi uint8_t i;
1031*9a0e4156SSadaf Ebrahimi uint8_t read_count, write_count;
1032*9a0e4156SSadaf Ebrahimi cs_arm64 *arm64 = &(insn->detail->arm64);
1033*9a0e4156SSadaf Ebrahimi
1034*9a0e4156SSadaf Ebrahimi read_count = insn->detail->regs_read_count;
1035*9a0e4156SSadaf Ebrahimi write_count = insn->detail->regs_write_count;
1036*9a0e4156SSadaf Ebrahimi
1037*9a0e4156SSadaf Ebrahimi // implicit registers
1038*9a0e4156SSadaf Ebrahimi memcpy(regs_read, insn->detail->regs_read, read_count * sizeof(insn->detail->regs_read[0]));
1039*9a0e4156SSadaf Ebrahimi memcpy(regs_write, insn->detail->regs_write, write_count * sizeof(insn->detail->regs_write[0]));
1040*9a0e4156SSadaf Ebrahimi
1041*9a0e4156SSadaf Ebrahimi // explicit registers
1042*9a0e4156SSadaf Ebrahimi for (i = 0; i < arm64->op_count; i++) {
1043*9a0e4156SSadaf Ebrahimi cs_arm64_op *op = &(arm64->operands[i]);
1044*9a0e4156SSadaf Ebrahimi switch((int)op->type) {
1045*9a0e4156SSadaf Ebrahimi case ARM64_OP_REG:
1046*9a0e4156SSadaf Ebrahimi if ((op->access & CS_AC_READ) && !arr_exist(regs_read, read_count, op->reg)) {
1047*9a0e4156SSadaf Ebrahimi regs_read[read_count] = (uint16_t)op->reg;
1048*9a0e4156SSadaf Ebrahimi read_count++;
1049*9a0e4156SSadaf Ebrahimi }
1050*9a0e4156SSadaf Ebrahimi if ((op->access & CS_AC_WRITE) && !arr_exist(regs_write, write_count, op->reg)) {
1051*9a0e4156SSadaf Ebrahimi regs_write[write_count] = (uint16_t)op->reg;
1052*9a0e4156SSadaf Ebrahimi write_count++;
1053*9a0e4156SSadaf Ebrahimi }
1054*9a0e4156SSadaf Ebrahimi break;
1055*9a0e4156SSadaf Ebrahimi case ARM_OP_MEM:
1056*9a0e4156SSadaf Ebrahimi // registers appeared in memory references always being read
1057*9a0e4156SSadaf Ebrahimi if ((op->mem.base != ARM64_REG_INVALID) && !arr_exist(regs_read, read_count, op->mem.base)) {
1058*9a0e4156SSadaf Ebrahimi regs_read[read_count] = (uint16_t)op->mem.base;
1059*9a0e4156SSadaf Ebrahimi read_count++;
1060*9a0e4156SSadaf Ebrahimi }
1061*9a0e4156SSadaf Ebrahimi if ((op->mem.index != ARM64_REG_INVALID) && !arr_exist(regs_read, read_count, op->mem.index)) {
1062*9a0e4156SSadaf Ebrahimi regs_read[read_count] = (uint16_t)op->mem.index;
1063*9a0e4156SSadaf Ebrahimi read_count++;
1064*9a0e4156SSadaf Ebrahimi }
1065*9a0e4156SSadaf Ebrahimi if ((arm64->writeback) && (op->mem.base != ARM64_REG_INVALID) && !arr_exist(regs_write, write_count, op->mem.base)) {
1066*9a0e4156SSadaf Ebrahimi regs_write[write_count] = (uint16_t)op->mem.base;
1067*9a0e4156SSadaf Ebrahimi write_count++;
1068*9a0e4156SSadaf Ebrahimi }
1069*9a0e4156SSadaf Ebrahimi default:
1070*9a0e4156SSadaf Ebrahimi break;
1071*9a0e4156SSadaf Ebrahimi }
1072*9a0e4156SSadaf Ebrahimi }
1073*9a0e4156SSadaf Ebrahimi
1074*9a0e4156SSadaf Ebrahimi *regs_read_count = read_count;
1075*9a0e4156SSadaf Ebrahimi *regs_write_count = write_count;
1076*9a0e4156SSadaf Ebrahimi }
1077*9a0e4156SSadaf Ebrahimi #endif
1078*9a0e4156SSadaf Ebrahimi
1079*9a0e4156SSadaf Ebrahimi #endif
1080