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_ARM
5*9a0e4156SSadaf Ebrahimi
6*9a0e4156SSadaf Ebrahimi #include <stdio.h> // debug
7*9a0e4156SSadaf Ebrahimi #include <string.h>
8*9a0e4156SSadaf Ebrahimi
9*9a0e4156SSadaf Ebrahimi #include "../../cs_priv.h"
10*9a0e4156SSadaf Ebrahimi
11*9a0e4156SSadaf Ebrahimi #include "ARMMapping.h"
12*9a0e4156SSadaf Ebrahimi
13*9a0e4156SSadaf Ebrahimi #define GET_INSTRINFO_ENUM
14*9a0e4156SSadaf Ebrahimi #include "ARMGenInstrInfo.inc"
15*9a0e4156SSadaf Ebrahimi
16*9a0e4156SSadaf Ebrahimi #ifndef CAPSTONE_DIET
17*9a0e4156SSadaf Ebrahimi static const name_map reg_name_maps[] = {
18*9a0e4156SSadaf Ebrahimi { ARM_REG_INVALID, NULL },
19*9a0e4156SSadaf Ebrahimi { ARM_REG_APSR, "apsr"},
20*9a0e4156SSadaf Ebrahimi { ARM_REG_APSR_NZCV, "apsr_nzcv"},
21*9a0e4156SSadaf Ebrahimi { ARM_REG_CPSR, "cpsr"},
22*9a0e4156SSadaf Ebrahimi { ARM_REG_FPEXC, "fpexc"},
23*9a0e4156SSadaf Ebrahimi { ARM_REG_FPINST, "fpinst"},
24*9a0e4156SSadaf Ebrahimi { ARM_REG_FPSCR, "fpscr"},
25*9a0e4156SSadaf Ebrahimi { ARM_REG_FPSCR_NZCV, "fpscr_nzcv"},
26*9a0e4156SSadaf Ebrahimi { ARM_REG_FPSID, "fpsid"},
27*9a0e4156SSadaf Ebrahimi { ARM_REG_ITSTATE, "itstate"},
28*9a0e4156SSadaf Ebrahimi { ARM_REG_LR, "lr"},
29*9a0e4156SSadaf Ebrahimi { ARM_REG_PC, "pc"},
30*9a0e4156SSadaf Ebrahimi { ARM_REG_SP, "sp"},
31*9a0e4156SSadaf Ebrahimi { ARM_REG_SPSR, "spsr"},
32*9a0e4156SSadaf Ebrahimi { ARM_REG_D0, "d0"},
33*9a0e4156SSadaf Ebrahimi { ARM_REG_D1, "d1"},
34*9a0e4156SSadaf Ebrahimi { ARM_REG_D2, "d2"},
35*9a0e4156SSadaf Ebrahimi { ARM_REG_D3, "d3"},
36*9a0e4156SSadaf Ebrahimi { ARM_REG_D4, "d4"},
37*9a0e4156SSadaf Ebrahimi { ARM_REG_D5, "d5"},
38*9a0e4156SSadaf Ebrahimi { ARM_REG_D6, "d6"},
39*9a0e4156SSadaf Ebrahimi { ARM_REG_D7, "d7"},
40*9a0e4156SSadaf Ebrahimi { ARM_REG_D8, "d8"},
41*9a0e4156SSadaf Ebrahimi { ARM_REG_D9, "d9"},
42*9a0e4156SSadaf Ebrahimi { ARM_REG_D10, "d10"},
43*9a0e4156SSadaf Ebrahimi { ARM_REG_D11, "d11"},
44*9a0e4156SSadaf Ebrahimi { ARM_REG_D12, "d12"},
45*9a0e4156SSadaf Ebrahimi { ARM_REG_D13, "d13"},
46*9a0e4156SSadaf Ebrahimi { ARM_REG_D14, "d14"},
47*9a0e4156SSadaf Ebrahimi { ARM_REG_D15, "d15"},
48*9a0e4156SSadaf Ebrahimi { ARM_REG_D16, "d16"},
49*9a0e4156SSadaf Ebrahimi { ARM_REG_D17, "d17"},
50*9a0e4156SSadaf Ebrahimi { ARM_REG_D18, "d18"},
51*9a0e4156SSadaf Ebrahimi { ARM_REG_D19, "d19"},
52*9a0e4156SSadaf Ebrahimi { ARM_REG_D20, "d20"},
53*9a0e4156SSadaf Ebrahimi { ARM_REG_D21, "d21"},
54*9a0e4156SSadaf Ebrahimi { ARM_REG_D22, "d22"},
55*9a0e4156SSadaf Ebrahimi { ARM_REG_D23, "d23"},
56*9a0e4156SSadaf Ebrahimi { ARM_REG_D24, "d24"},
57*9a0e4156SSadaf Ebrahimi { ARM_REG_D25, "d25"},
58*9a0e4156SSadaf Ebrahimi { ARM_REG_D26, "d26"},
59*9a0e4156SSadaf Ebrahimi { ARM_REG_D27, "d27"},
60*9a0e4156SSadaf Ebrahimi { ARM_REG_D28, "d28"},
61*9a0e4156SSadaf Ebrahimi { ARM_REG_D29, "d29"},
62*9a0e4156SSadaf Ebrahimi { ARM_REG_D30, "d30"},
63*9a0e4156SSadaf Ebrahimi { ARM_REG_D31, "d31"},
64*9a0e4156SSadaf Ebrahimi { ARM_REG_FPINST2, "fpinst2"},
65*9a0e4156SSadaf Ebrahimi { ARM_REG_MVFR0, "mvfr0"},
66*9a0e4156SSadaf Ebrahimi { ARM_REG_MVFR1, "mvfr1"},
67*9a0e4156SSadaf Ebrahimi { ARM_REG_MVFR2, "mvfr2"},
68*9a0e4156SSadaf Ebrahimi { ARM_REG_Q0, "q0"},
69*9a0e4156SSadaf Ebrahimi { ARM_REG_Q1, "q1"},
70*9a0e4156SSadaf Ebrahimi { ARM_REG_Q2, "q2"},
71*9a0e4156SSadaf Ebrahimi { ARM_REG_Q3, "q3"},
72*9a0e4156SSadaf Ebrahimi { ARM_REG_Q4, "q4"},
73*9a0e4156SSadaf Ebrahimi { ARM_REG_Q5, "q5"},
74*9a0e4156SSadaf Ebrahimi { ARM_REG_Q6, "q6"},
75*9a0e4156SSadaf Ebrahimi { ARM_REG_Q7, "q7"},
76*9a0e4156SSadaf Ebrahimi { ARM_REG_Q8, "q8"},
77*9a0e4156SSadaf Ebrahimi { ARM_REG_Q9, "q9"},
78*9a0e4156SSadaf Ebrahimi { ARM_REG_Q10, "q10"},
79*9a0e4156SSadaf Ebrahimi { ARM_REG_Q11, "q11"},
80*9a0e4156SSadaf Ebrahimi { ARM_REG_Q12, "q12"},
81*9a0e4156SSadaf Ebrahimi { ARM_REG_Q13, "q13"},
82*9a0e4156SSadaf Ebrahimi { ARM_REG_Q14, "q14"},
83*9a0e4156SSadaf Ebrahimi { ARM_REG_Q15, "q15"},
84*9a0e4156SSadaf Ebrahimi { ARM_REG_R0, "r0"},
85*9a0e4156SSadaf Ebrahimi { ARM_REG_R1, "r1"},
86*9a0e4156SSadaf Ebrahimi { ARM_REG_R2, "r2"},
87*9a0e4156SSadaf Ebrahimi { ARM_REG_R3, "r3"},
88*9a0e4156SSadaf Ebrahimi { ARM_REG_R4, "r4"},
89*9a0e4156SSadaf Ebrahimi { ARM_REG_R5, "r5"},
90*9a0e4156SSadaf Ebrahimi { ARM_REG_R6, "r6"},
91*9a0e4156SSadaf Ebrahimi { ARM_REG_R7, "r7"},
92*9a0e4156SSadaf Ebrahimi { ARM_REG_R8, "r8"},
93*9a0e4156SSadaf Ebrahimi { ARM_REG_R9, "sb"},
94*9a0e4156SSadaf Ebrahimi { ARM_REG_R10, "sl"},
95*9a0e4156SSadaf Ebrahimi { ARM_REG_R11, "fp"},
96*9a0e4156SSadaf Ebrahimi { ARM_REG_R12, "ip"},
97*9a0e4156SSadaf Ebrahimi { ARM_REG_S0, "s0"},
98*9a0e4156SSadaf Ebrahimi { ARM_REG_S1, "s1"},
99*9a0e4156SSadaf Ebrahimi { ARM_REG_S2, "s2"},
100*9a0e4156SSadaf Ebrahimi { ARM_REG_S3, "s3"},
101*9a0e4156SSadaf Ebrahimi { ARM_REG_S4, "s4"},
102*9a0e4156SSadaf Ebrahimi { ARM_REG_S5, "s5"},
103*9a0e4156SSadaf Ebrahimi { ARM_REG_S6, "s6"},
104*9a0e4156SSadaf Ebrahimi { ARM_REG_S7, "s7"},
105*9a0e4156SSadaf Ebrahimi { ARM_REG_S8, "s8"},
106*9a0e4156SSadaf Ebrahimi { ARM_REG_S9, "s9"},
107*9a0e4156SSadaf Ebrahimi { ARM_REG_S10, "s10"},
108*9a0e4156SSadaf Ebrahimi { ARM_REG_S11, "s11"},
109*9a0e4156SSadaf Ebrahimi { ARM_REG_S12, "s12"},
110*9a0e4156SSadaf Ebrahimi { ARM_REG_S13, "s13"},
111*9a0e4156SSadaf Ebrahimi { ARM_REG_S14, "s14"},
112*9a0e4156SSadaf Ebrahimi { ARM_REG_S15, "s15"},
113*9a0e4156SSadaf Ebrahimi { ARM_REG_S16, "s16"},
114*9a0e4156SSadaf Ebrahimi { ARM_REG_S17, "s17"},
115*9a0e4156SSadaf Ebrahimi { ARM_REG_S18, "s18"},
116*9a0e4156SSadaf Ebrahimi { ARM_REG_S19, "s19"},
117*9a0e4156SSadaf Ebrahimi { ARM_REG_S20, "s20"},
118*9a0e4156SSadaf Ebrahimi { ARM_REG_S21, "s21"},
119*9a0e4156SSadaf Ebrahimi { ARM_REG_S22, "s22"},
120*9a0e4156SSadaf Ebrahimi { ARM_REG_S23, "s23"},
121*9a0e4156SSadaf Ebrahimi { ARM_REG_S24, "s24"},
122*9a0e4156SSadaf Ebrahimi { ARM_REG_S25, "s25"},
123*9a0e4156SSadaf Ebrahimi { ARM_REG_S26, "s26"},
124*9a0e4156SSadaf Ebrahimi { ARM_REG_S27, "s27"},
125*9a0e4156SSadaf Ebrahimi { ARM_REG_S28, "s28"},
126*9a0e4156SSadaf Ebrahimi { ARM_REG_S29, "s29"},
127*9a0e4156SSadaf Ebrahimi { ARM_REG_S30, "s30"},
128*9a0e4156SSadaf Ebrahimi { ARM_REG_S31, "s31"},
129*9a0e4156SSadaf Ebrahimi };
130*9a0e4156SSadaf Ebrahimi static const name_map reg_name_maps2[] = {
131*9a0e4156SSadaf Ebrahimi { ARM_REG_INVALID, NULL },
132*9a0e4156SSadaf Ebrahimi { ARM_REG_APSR, "apsr"},
133*9a0e4156SSadaf Ebrahimi { ARM_REG_APSR_NZCV, "apsr_nzcv"},
134*9a0e4156SSadaf Ebrahimi { ARM_REG_CPSR, "cpsr"},
135*9a0e4156SSadaf Ebrahimi { ARM_REG_FPEXC, "fpexc"},
136*9a0e4156SSadaf Ebrahimi { ARM_REG_FPINST, "fpinst"},
137*9a0e4156SSadaf Ebrahimi { ARM_REG_FPSCR, "fpscr"},
138*9a0e4156SSadaf Ebrahimi { ARM_REG_FPSCR_NZCV, "fpscr_nzcv"},
139*9a0e4156SSadaf Ebrahimi { ARM_REG_FPSID, "fpsid"},
140*9a0e4156SSadaf Ebrahimi { ARM_REG_ITSTATE, "itstate"},
141*9a0e4156SSadaf Ebrahimi { ARM_REG_LR, "lr"},
142*9a0e4156SSadaf Ebrahimi { ARM_REG_PC, "pc"},
143*9a0e4156SSadaf Ebrahimi { ARM_REG_SP, "sp"},
144*9a0e4156SSadaf Ebrahimi { ARM_REG_SPSR, "spsr"},
145*9a0e4156SSadaf Ebrahimi { ARM_REG_D0, "d0"},
146*9a0e4156SSadaf Ebrahimi { ARM_REG_D1, "d1"},
147*9a0e4156SSadaf Ebrahimi { ARM_REG_D2, "d2"},
148*9a0e4156SSadaf Ebrahimi { ARM_REG_D3, "d3"},
149*9a0e4156SSadaf Ebrahimi { ARM_REG_D4, "d4"},
150*9a0e4156SSadaf Ebrahimi { ARM_REG_D5, "d5"},
151*9a0e4156SSadaf Ebrahimi { ARM_REG_D6, "d6"},
152*9a0e4156SSadaf Ebrahimi { ARM_REG_D7, "d7"},
153*9a0e4156SSadaf Ebrahimi { ARM_REG_D8, "d8"},
154*9a0e4156SSadaf Ebrahimi { ARM_REG_D9, "d9"},
155*9a0e4156SSadaf Ebrahimi { ARM_REG_D10, "d10"},
156*9a0e4156SSadaf Ebrahimi { ARM_REG_D11, "d11"},
157*9a0e4156SSadaf Ebrahimi { ARM_REG_D12, "d12"},
158*9a0e4156SSadaf Ebrahimi { ARM_REG_D13, "d13"},
159*9a0e4156SSadaf Ebrahimi { ARM_REG_D14, "d14"},
160*9a0e4156SSadaf Ebrahimi { ARM_REG_D15, "d15"},
161*9a0e4156SSadaf Ebrahimi { ARM_REG_D16, "d16"},
162*9a0e4156SSadaf Ebrahimi { ARM_REG_D17, "d17"},
163*9a0e4156SSadaf Ebrahimi { ARM_REG_D18, "d18"},
164*9a0e4156SSadaf Ebrahimi { ARM_REG_D19, "d19"},
165*9a0e4156SSadaf Ebrahimi { ARM_REG_D20, "d20"},
166*9a0e4156SSadaf Ebrahimi { ARM_REG_D21, "d21"},
167*9a0e4156SSadaf Ebrahimi { ARM_REG_D22, "d22"},
168*9a0e4156SSadaf Ebrahimi { ARM_REG_D23, "d23"},
169*9a0e4156SSadaf Ebrahimi { ARM_REG_D24, "d24"},
170*9a0e4156SSadaf Ebrahimi { ARM_REG_D25, "d25"},
171*9a0e4156SSadaf Ebrahimi { ARM_REG_D26, "d26"},
172*9a0e4156SSadaf Ebrahimi { ARM_REG_D27, "d27"},
173*9a0e4156SSadaf Ebrahimi { ARM_REG_D28, "d28"},
174*9a0e4156SSadaf Ebrahimi { ARM_REG_D29, "d29"},
175*9a0e4156SSadaf Ebrahimi { ARM_REG_D30, "d30"},
176*9a0e4156SSadaf Ebrahimi { ARM_REG_D31, "d31"},
177*9a0e4156SSadaf Ebrahimi { ARM_REG_FPINST2, "fpinst2"},
178*9a0e4156SSadaf Ebrahimi { ARM_REG_MVFR0, "mvfr0"},
179*9a0e4156SSadaf Ebrahimi { ARM_REG_MVFR1, "mvfr1"},
180*9a0e4156SSadaf Ebrahimi { ARM_REG_MVFR2, "mvfr2"},
181*9a0e4156SSadaf Ebrahimi { ARM_REG_Q0, "q0"},
182*9a0e4156SSadaf Ebrahimi { ARM_REG_Q1, "q1"},
183*9a0e4156SSadaf Ebrahimi { ARM_REG_Q2, "q2"},
184*9a0e4156SSadaf Ebrahimi { ARM_REG_Q3, "q3"},
185*9a0e4156SSadaf Ebrahimi { ARM_REG_Q4, "q4"},
186*9a0e4156SSadaf Ebrahimi { ARM_REG_Q5, "q5"},
187*9a0e4156SSadaf Ebrahimi { ARM_REG_Q6, "q6"},
188*9a0e4156SSadaf Ebrahimi { ARM_REG_Q7, "q7"},
189*9a0e4156SSadaf Ebrahimi { ARM_REG_Q8, "q8"},
190*9a0e4156SSadaf Ebrahimi { ARM_REG_Q9, "q9"},
191*9a0e4156SSadaf Ebrahimi { ARM_REG_Q10, "q10"},
192*9a0e4156SSadaf Ebrahimi { ARM_REG_Q11, "q11"},
193*9a0e4156SSadaf Ebrahimi { ARM_REG_Q12, "q12"},
194*9a0e4156SSadaf Ebrahimi { ARM_REG_Q13, "q13"},
195*9a0e4156SSadaf Ebrahimi { ARM_REG_Q14, "q14"},
196*9a0e4156SSadaf Ebrahimi { ARM_REG_Q15, "q15"},
197*9a0e4156SSadaf Ebrahimi { ARM_REG_R0, "r0"},
198*9a0e4156SSadaf Ebrahimi { ARM_REG_R1, "r1"},
199*9a0e4156SSadaf Ebrahimi { ARM_REG_R2, "r2"},
200*9a0e4156SSadaf Ebrahimi { ARM_REG_R3, "r3"},
201*9a0e4156SSadaf Ebrahimi { ARM_REG_R4, "r4"},
202*9a0e4156SSadaf Ebrahimi { ARM_REG_R5, "r5"},
203*9a0e4156SSadaf Ebrahimi { ARM_REG_R6, "r6"},
204*9a0e4156SSadaf Ebrahimi { ARM_REG_R7, "r7"},
205*9a0e4156SSadaf Ebrahimi { ARM_REG_R8, "r8"},
206*9a0e4156SSadaf Ebrahimi { ARM_REG_R9, "r9"},
207*9a0e4156SSadaf Ebrahimi { ARM_REG_R10, "r10"},
208*9a0e4156SSadaf Ebrahimi { ARM_REG_R11, "r11"},
209*9a0e4156SSadaf Ebrahimi { ARM_REG_R12, "r12"},
210*9a0e4156SSadaf Ebrahimi { ARM_REG_S0, "s0"},
211*9a0e4156SSadaf Ebrahimi { ARM_REG_S1, "s1"},
212*9a0e4156SSadaf Ebrahimi { ARM_REG_S2, "s2"},
213*9a0e4156SSadaf Ebrahimi { ARM_REG_S3, "s3"},
214*9a0e4156SSadaf Ebrahimi { ARM_REG_S4, "s4"},
215*9a0e4156SSadaf Ebrahimi { ARM_REG_S5, "s5"},
216*9a0e4156SSadaf Ebrahimi { ARM_REG_S6, "s6"},
217*9a0e4156SSadaf Ebrahimi { ARM_REG_S7, "s7"},
218*9a0e4156SSadaf Ebrahimi { ARM_REG_S8, "s8"},
219*9a0e4156SSadaf Ebrahimi { ARM_REG_S9, "s9"},
220*9a0e4156SSadaf Ebrahimi { ARM_REG_S10, "s10"},
221*9a0e4156SSadaf Ebrahimi { ARM_REG_S11, "s11"},
222*9a0e4156SSadaf Ebrahimi { ARM_REG_S12, "s12"},
223*9a0e4156SSadaf Ebrahimi { ARM_REG_S13, "s13"},
224*9a0e4156SSadaf Ebrahimi { ARM_REG_S14, "s14"},
225*9a0e4156SSadaf Ebrahimi { ARM_REG_S15, "s15"},
226*9a0e4156SSadaf Ebrahimi { ARM_REG_S16, "s16"},
227*9a0e4156SSadaf Ebrahimi { ARM_REG_S17, "s17"},
228*9a0e4156SSadaf Ebrahimi { ARM_REG_S18, "s18"},
229*9a0e4156SSadaf Ebrahimi { ARM_REG_S19, "s19"},
230*9a0e4156SSadaf Ebrahimi { ARM_REG_S20, "s20"},
231*9a0e4156SSadaf Ebrahimi { ARM_REG_S21, "s21"},
232*9a0e4156SSadaf Ebrahimi { ARM_REG_S22, "s22"},
233*9a0e4156SSadaf Ebrahimi { ARM_REG_S23, "s23"},
234*9a0e4156SSadaf Ebrahimi { ARM_REG_S24, "s24"},
235*9a0e4156SSadaf Ebrahimi { ARM_REG_S25, "s25"},
236*9a0e4156SSadaf Ebrahimi { ARM_REG_S26, "s26"},
237*9a0e4156SSadaf Ebrahimi { ARM_REG_S27, "s27"},
238*9a0e4156SSadaf Ebrahimi { ARM_REG_S28, "s28"},
239*9a0e4156SSadaf Ebrahimi { ARM_REG_S29, "s29"},
240*9a0e4156SSadaf Ebrahimi { ARM_REG_S30, "s30"},
241*9a0e4156SSadaf Ebrahimi { ARM_REG_S31, "s31"},
242*9a0e4156SSadaf Ebrahimi };
243*9a0e4156SSadaf Ebrahimi #endif
244*9a0e4156SSadaf Ebrahimi
ARM_reg_name(csh handle,unsigned int reg)245*9a0e4156SSadaf Ebrahimi const char *ARM_reg_name(csh handle, unsigned int reg)
246*9a0e4156SSadaf Ebrahimi {
247*9a0e4156SSadaf Ebrahimi #ifndef CAPSTONE_DIET
248*9a0e4156SSadaf Ebrahimi if (reg >= ARR_SIZE(reg_name_maps))
249*9a0e4156SSadaf Ebrahimi return NULL;
250*9a0e4156SSadaf Ebrahimi
251*9a0e4156SSadaf Ebrahimi return reg_name_maps[reg].name;
252*9a0e4156SSadaf Ebrahimi #else
253*9a0e4156SSadaf Ebrahimi return NULL;
254*9a0e4156SSadaf Ebrahimi #endif
255*9a0e4156SSadaf Ebrahimi }
256*9a0e4156SSadaf Ebrahimi
ARM_reg_name2(csh handle,unsigned int reg)257*9a0e4156SSadaf Ebrahimi const char *ARM_reg_name2(csh handle, unsigned int reg)
258*9a0e4156SSadaf Ebrahimi {
259*9a0e4156SSadaf Ebrahimi #ifndef CAPSTONE_DIET
260*9a0e4156SSadaf Ebrahimi if (reg >= ARR_SIZE(reg_name_maps2))
261*9a0e4156SSadaf Ebrahimi return NULL;
262*9a0e4156SSadaf Ebrahimi
263*9a0e4156SSadaf Ebrahimi return reg_name_maps2[reg].name;
264*9a0e4156SSadaf Ebrahimi #else
265*9a0e4156SSadaf Ebrahimi return NULL;
266*9a0e4156SSadaf Ebrahimi #endif
267*9a0e4156SSadaf Ebrahimi }
268*9a0e4156SSadaf Ebrahimi
269*9a0e4156SSadaf Ebrahimi static const insn_map insns[] = {
270*9a0e4156SSadaf Ebrahimi // dummy item
271*9a0e4156SSadaf Ebrahimi {
272*9a0e4156SSadaf Ebrahimi 0, 0,
273*9a0e4156SSadaf Ebrahimi #ifndef CAPSTONE_DIET
274*9a0e4156SSadaf Ebrahimi { 0 }, { 0 }, { 0 }, 0, 0
275*9a0e4156SSadaf Ebrahimi #endif
276*9a0e4156SSadaf Ebrahimi },
277*9a0e4156SSadaf Ebrahimi
278*9a0e4156SSadaf Ebrahimi #include "ARMMappingInsn.inc"
279*9a0e4156SSadaf Ebrahimi };
280*9a0e4156SSadaf Ebrahimi
ARM_get_insn_id(cs_struct * h,cs_insn * insn,unsigned int id)281*9a0e4156SSadaf Ebrahimi void ARM_get_insn_id(cs_struct *h, cs_insn *insn, unsigned int id)
282*9a0e4156SSadaf Ebrahimi {
283*9a0e4156SSadaf Ebrahimi int i = insn_find(insns, ARR_SIZE(insns), id, &h->insn_cache);
284*9a0e4156SSadaf Ebrahimi //printf(">> id = %u\n", id);
285*9a0e4156SSadaf Ebrahimi if (i != 0) {
286*9a0e4156SSadaf Ebrahimi insn->id = insns[i].mapid;
287*9a0e4156SSadaf Ebrahimi
288*9a0e4156SSadaf Ebrahimi if (h->detail) {
289*9a0e4156SSadaf Ebrahimi #ifndef CAPSTONE_DIET
290*9a0e4156SSadaf Ebrahimi cs_struct handle;
291*9a0e4156SSadaf Ebrahimi handle.detail = h->detail;
292*9a0e4156SSadaf Ebrahimi
293*9a0e4156SSadaf Ebrahimi memcpy(insn->detail->regs_read, insns[i].regs_use, sizeof(insns[i].regs_use));
294*9a0e4156SSadaf Ebrahimi insn->detail->regs_read_count = (uint8_t)count_positive(insns[i].regs_use);
295*9a0e4156SSadaf Ebrahimi
296*9a0e4156SSadaf Ebrahimi memcpy(insn->detail->regs_write, insns[i].regs_mod, sizeof(insns[i].regs_mod));
297*9a0e4156SSadaf Ebrahimi insn->detail->regs_write_count = (uint8_t)count_positive(insns[i].regs_mod);
298*9a0e4156SSadaf Ebrahimi
299*9a0e4156SSadaf Ebrahimi memcpy(insn->detail->groups, insns[i].groups, sizeof(insns[i].groups));
300*9a0e4156SSadaf Ebrahimi insn->detail->groups_count = (uint8_t)count_positive8(insns[i].groups);
301*9a0e4156SSadaf Ebrahimi
302*9a0e4156SSadaf Ebrahimi insn->detail->arm.update_flags = cs_reg_write((csh)&handle, insn, ARM_REG_CPSR);
303*9a0e4156SSadaf Ebrahimi
304*9a0e4156SSadaf Ebrahimi if (insns[i].branch || insns[i].indirect_branch) {
305*9a0e4156SSadaf Ebrahimi // this insn also belongs to JUMP group. add JUMP group
306*9a0e4156SSadaf Ebrahimi insn->detail->groups[insn->detail->groups_count] = ARM_GRP_JUMP;
307*9a0e4156SSadaf Ebrahimi insn->detail->groups_count++;
308*9a0e4156SSadaf Ebrahimi }
309*9a0e4156SSadaf Ebrahimi #endif
310*9a0e4156SSadaf Ebrahimi }
311*9a0e4156SSadaf Ebrahimi }
312*9a0e4156SSadaf Ebrahimi }
313*9a0e4156SSadaf Ebrahimi
314*9a0e4156SSadaf Ebrahimi #ifndef CAPSTONE_DIET
315*9a0e4156SSadaf Ebrahimi static const name_map insn_name_maps[] = {
316*9a0e4156SSadaf Ebrahimi { ARM_INS_INVALID, NULL },
317*9a0e4156SSadaf Ebrahimi
318*9a0e4156SSadaf Ebrahimi { ARM_INS_ADC, "adc" },
319*9a0e4156SSadaf Ebrahimi { ARM_INS_ADD, "add" },
320*9a0e4156SSadaf Ebrahimi { ARM_INS_ADR, "adr" },
321*9a0e4156SSadaf Ebrahimi { ARM_INS_AESD, "aesd" },
322*9a0e4156SSadaf Ebrahimi { ARM_INS_AESE, "aese" },
323*9a0e4156SSadaf Ebrahimi { ARM_INS_AESIMC, "aesimc" },
324*9a0e4156SSadaf Ebrahimi { ARM_INS_AESMC, "aesmc" },
325*9a0e4156SSadaf Ebrahimi { ARM_INS_AND, "and" },
326*9a0e4156SSadaf Ebrahimi { ARM_INS_BFC, "bfc" },
327*9a0e4156SSadaf Ebrahimi { ARM_INS_BFI, "bfi" },
328*9a0e4156SSadaf Ebrahimi { ARM_INS_BIC, "bic" },
329*9a0e4156SSadaf Ebrahimi { ARM_INS_BKPT, "bkpt" },
330*9a0e4156SSadaf Ebrahimi { ARM_INS_BL, "bl" },
331*9a0e4156SSadaf Ebrahimi { ARM_INS_BLX, "blx" },
332*9a0e4156SSadaf Ebrahimi { ARM_INS_BX, "bx" },
333*9a0e4156SSadaf Ebrahimi { ARM_INS_BXJ, "bxj" },
334*9a0e4156SSadaf Ebrahimi { ARM_INS_B, "b" },
335*9a0e4156SSadaf Ebrahimi { ARM_INS_CDP, "cdp" },
336*9a0e4156SSadaf Ebrahimi { ARM_INS_CDP2, "cdp2" },
337*9a0e4156SSadaf Ebrahimi { ARM_INS_CLREX, "clrex" },
338*9a0e4156SSadaf Ebrahimi { ARM_INS_CLZ, "clz" },
339*9a0e4156SSadaf Ebrahimi { ARM_INS_CMN, "cmn" },
340*9a0e4156SSadaf Ebrahimi { ARM_INS_CMP, "cmp" },
341*9a0e4156SSadaf Ebrahimi { ARM_INS_CPS, "cps" },
342*9a0e4156SSadaf Ebrahimi { ARM_INS_CRC32B, "crc32b" },
343*9a0e4156SSadaf Ebrahimi { ARM_INS_CRC32CB, "crc32cb" },
344*9a0e4156SSadaf Ebrahimi { ARM_INS_CRC32CH, "crc32ch" },
345*9a0e4156SSadaf Ebrahimi { ARM_INS_CRC32CW, "crc32cw" },
346*9a0e4156SSadaf Ebrahimi { ARM_INS_CRC32H, "crc32h" },
347*9a0e4156SSadaf Ebrahimi { ARM_INS_CRC32W, "crc32w" },
348*9a0e4156SSadaf Ebrahimi { ARM_INS_DBG, "dbg" },
349*9a0e4156SSadaf Ebrahimi { ARM_INS_DMB, "dmb" },
350*9a0e4156SSadaf Ebrahimi { ARM_INS_DSB, "dsb" },
351*9a0e4156SSadaf Ebrahimi { ARM_INS_EOR, "eor" },
352*9a0e4156SSadaf Ebrahimi { ARM_INS_ERET, "eret" },
353*9a0e4156SSadaf Ebrahimi { ARM_INS_VMOV, "vmov" },
354*9a0e4156SSadaf Ebrahimi { ARM_INS_FLDMDBX, "fldmdbx" },
355*9a0e4156SSadaf Ebrahimi { ARM_INS_FLDMIAX, "fldmiax" },
356*9a0e4156SSadaf Ebrahimi { ARM_INS_VMRS, "vmrs" },
357*9a0e4156SSadaf Ebrahimi { ARM_INS_FSTMDBX, "fstmdbx" },
358*9a0e4156SSadaf Ebrahimi { ARM_INS_FSTMIAX, "fstmiax" },
359*9a0e4156SSadaf Ebrahimi { ARM_INS_HINT, "hint" },
360*9a0e4156SSadaf Ebrahimi { ARM_INS_HLT, "hlt" },
361*9a0e4156SSadaf Ebrahimi { ARM_INS_HVC, "hvc" },
362*9a0e4156SSadaf Ebrahimi { ARM_INS_ISB, "isb" },
363*9a0e4156SSadaf Ebrahimi { ARM_INS_LDA, "lda" },
364*9a0e4156SSadaf Ebrahimi { ARM_INS_LDAB, "ldab" },
365*9a0e4156SSadaf Ebrahimi { ARM_INS_LDAEX, "ldaex" },
366*9a0e4156SSadaf Ebrahimi { ARM_INS_LDAEXB, "ldaexb" },
367*9a0e4156SSadaf Ebrahimi { ARM_INS_LDAEXD, "ldaexd" },
368*9a0e4156SSadaf Ebrahimi { ARM_INS_LDAEXH, "ldaexh" },
369*9a0e4156SSadaf Ebrahimi { ARM_INS_LDAH, "ldah" },
370*9a0e4156SSadaf Ebrahimi { ARM_INS_LDC2L, "ldc2l" },
371*9a0e4156SSadaf Ebrahimi { ARM_INS_LDC2, "ldc2" },
372*9a0e4156SSadaf Ebrahimi { ARM_INS_LDCL, "ldcl" },
373*9a0e4156SSadaf Ebrahimi { ARM_INS_LDC, "ldc" },
374*9a0e4156SSadaf Ebrahimi { ARM_INS_LDMDA, "ldmda" },
375*9a0e4156SSadaf Ebrahimi { ARM_INS_LDMDB, "ldmdb" },
376*9a0e4156SSadaf Ebrahimi { ARM_INS_LDM, "ldm" },
377*9a0e4156SSadaf Ebrahimi { ARM_INS_LDMIB, "ldmib" },
378*9a0e4156SSadaf Ebrahimi { ARM_INS_LDRBT, "ldrbt" },
379*9a0e4156SSadaf Ebrahimi { ARM_INS_LDRB, "ldrb" },
380*9a0e4156SSadaf Ebrahimi { ARM_INS_LDRD, "ldrd" },
381*9a0e4156SSadaf Ebrahimi { ARM_INS_LDREX, "ldrex" },
382*9a0e4156SSadaf Ebrahimi { ARM_INS_LDREXB, "ldrexb" },
383*9a0e4156SSadaf Ebrahimi { ARM_INS_LDREXD, "ldrexd" },
384*9a0e4156SSadaf Ebrahimi { ARM_INS_LDREXH, "ldrexh" },
385*9a0e4156SSadaf Ebrahimi { ARM_INS_LDRH, "ldrh" },
386*9a0e4156SSadaf Ebrahimi { ARM_INS_LDRHT, "ldrht" },
387*9a0e4156SSadaf Ebrahimi { ARM_INS_LDRSB, "ldrsb" },
388*9a0e4156SSadaf Ebrahimi { ARM_INS_LDRSBT, "ldrsbt" },
389*9a0e4156SSadaf Ebrahimi { ARM_INS_LDRSH, "ldrsh" },
390*9a0e4156SSadaf Ebrahimi { ARM_INS_LDRSHT, "ldrsht" },
391*9a0e4156SSadaf Ebrahimi { ARM_INS_LDRT, "ldrt" },
392*9a0e4156SSadaf Ebrahimi { ARM_INS_LDR, "ldr" },
393*9a0e4156SSadaf Ebrahimi { ARM_INS_MCR, "mcr" },
394*9a0e4156SSadaf Ebrahimi { ARM_INS_MCR2, "mcr2" },
395*9a0e4156SSadaf Ebrahimi { ARM_INS_MCRR, "mcrr" },
396*9a0e4156SSadaf Ebrahimi { ARM_INS_MCRR2, "mcrr2" },
397*9a0e4156SSadaf Ebrahimi { ARM_INS_MLA, "mla" },
398*9a0e4156SSadaf Ebrahimi { ARM_INS_MLS, "mls" },
399*9a0e4156SSadaf Ebrahimi { ARM_INS_MOV, "mov" },
400*9a0e4156SSadaf Ebrahimi { ARM_INS_MOVT, "movt" },
401*9a0e4156SSadaf Ebrahimi { ARM_INS_MOVW, "movw" },
402*9a0e4156SSadaf Ebrahimi { ARM_INS_MRC, "mrc" },
403*9a0e4156SSadaf Ebrahimi { ARM_INS_MRC2, "mrc2" },
404*9a0e4156SSadaf Ebrahimi { ARM_INS_MRRC, "mrrc" },
405*9a0e4156SSadaf Ebrahimi { ARM_INS_MRRC2, "mrrc2" },
406*9a0e4156SSadaf Ebrahimi { ARM_INS_MRS, "mrs" },
407*9a0e4156SSadaf Ebrahimi { ARM_INS_MSR, "msr" },
408*9a0e4156SSadaf Ebrahimi { ARM_INS_MUL, "mul" },
409*9a0e4156SSadaf Ebrahimi { ARM_INS_MVN, "mvn" },
410*9a0e4156SSadaf Ebrahimi { ARM_INS_ORR, "orr" },
411*9a0e4156SSadaf Ebrahimi { ARM_INS_PKHBT, "pkhbt" },
412*9a0e4156SSadaf Ebrahimi { ARM_INS_PKHTB, "pkhtb" },
413*9a0e4156SSadaf Ebrahimi { ARM_INS_PLDW, "pldw" },
414*9a0e4156SSadaf Ebrahimi { ARM_INS_PLD, "pld" },
415*9a0e4156SSadaf Ebrahimi { ARM_INS_PLI, "pli" },
416*9a0e4156SSadaf Ebrahimi { ARM_INS_QADD, "qadd" },
417*9a0e4156SSadaf Ebrahimi { ARM_INS_QADD16, "qadd16" },
418*9a0e4156SSadaf Ebrahimi { ARM_INS_QADD8, "qadd8" },
419*9a0e4156SSadaf Ebrahimi { ARM_INS_QASX, "qasx" },
420*9a0e4156SSadaf Ebrahimi { ARM_INS_QDADD, "qdadd" },
421*9a0e4156SSadaf Ebrahimi { ARM_INS_QDSUB, "qdsub" },
422*9a0e4156SSadaf Ebrahimi { ARM_INS_QSAX, "qsax" },
423*9a0e4156SSadaf Ebrahimi { ARM_INS_QSUB, "qsub" },
424*9a0e4156SSadaf Ebrahimi { ARM_INS_QSUB16, "qsub16" },
425*9a0e4156SSadaf Ebrahimi { ARM_INS_QSUB8, "qsub8" },
426*9a0e4156SSadaf Ebrahimi { ARM_INS_RBIT, "rbit" },
427*9a0e4156SSadaf Ebrahimi { ARM_INS_REV, "rev" },
428*9a0e4156SSadaf Ebrahimi { ARM_INS_REV16, "rev16" },
429*9a0e4156SSadaf Ebrahimi { ARM_INS_REVSH, "revsh" },
430*9a0e4156SSadaf Ebrahimi { ARM_INS_RFEDA, "rfeda" },
431*9a0e4156SSadaf Ebrahimi { ARM_INS_RFEDB, "rfedb" },
432*9a0e4156SSadaf Ebrahimi { ARM_INS_RFEIA, "rfeia" },
433*9a0e4156SSadaf Ebrahimi { ARM_INS_RFEIB, "rfeib" },
434*9a0e4156SSadaf Ebrahimi { ARM_INS_RSB, "rsb" },
435*9a0e4156SSadaf Ebrahimi { ARM_INS_RSC, "rsc" },
436*9a0e4156SSadaf Ebrahimi { ARM_INS_SADD16, "sadd16" },
437*9a0e4156SSadaf Ebrahimi { ARM_INS_SADD8, "sadd8" },
438*9a0e4156SSadaf Ebrahimi { ARM_INS_SASX, "sasx" },
439*9a0e4156SSadaf Ebrahimi { ARM_INS_SBC, "sbc" },
440*9a0e4156SSadaf Ebrahimi { ARM_INS_SBFX, "sbfx" },
441*9a0e4156SSadaf Ebrahimi { ARM_INS_SDIV, "sdiv" },
442*9a0e4156SSadaf Ebrahimi { ARM_INS_SEL, "sel" },
443*9a0e4156SSadaf Ebrahimi { ARM_INS_SETEND, "setend" },
444*9a0e4156SSadaf Ebrahimi { ARM_INS_SHA1C, "sha1c" },
445*9a0e4156SSadaf Ebrahimi { ARM_INS_SHA1H, "sha1h" },
446*9a0e4156SSadaf Ebrahimi { ARM_INS_SHA1M, "sha1m" },
447*9a0e4156SSadaf Ebrahimi { ARM_INS_SHA1P, "sha1p" },
448*9a0e4156SSadaf Ebrahimi { ARM_INS_SHA1SU0, "sha1su0" },
449*9a0e4156SSadaf Ebrahimi { ARM_INS_SHA1SU1, "sha1su1" },
450*9a0e4156SSadaf Ebrahimi { ARM_INS_SHA256H, "sha256h" },
451*9a0e4156SSadaf Ebrahimi { ARM_INS_SHA256H2, "sha256h2" },
452*9a0e4156SSadaf Ebrahimi { ARM_INS_SHA256SU0, "sha256su0" },
453*9a0e4156SSadaf Ebrahimi { ARM_INS_SHA256SU1, "sha256su1" },
454*9a0e4156SSadaf Ebrahimi { ARM_INS_SHADD16, "shadd16" },
455*9a0e4156SSadaf Ebrahimi { ARM_INS_SHADD8, "shadd8" },
456*9a0e4156SSadaf Ebrahimi { ARM_INS_SHASX, "shasx" },
457*9a0e4156SSadaf Ebrahimi { ARM_INS_SHSAX, "shsax" },
458*9a0e4156SSadaf Ebrahimi { ARM_INS_SHSUB16, "shsub16" },
459*9a0e4156SSadaf Ebrahimi { ARM_INS_SHSUB8, "shsub8" },
460*9a0e4156SSadaf Ebrahimi { ARM_INS_SMC, "smc" },
461*9a0e4156SSadaf Ebrahimi { ARM_INS_SMLABB, "smlabb" },
462*9a0e4156SSadaf Ebrahimi { ARM_INS_SMLABT, "smlabt" },
463*9a0e4156SSadaf Ebrahimi { ARM_INS_SMLAD, "smlad" },
464*9a0e4156SSadaf Ebrahimi { ARM_INS_SMLADX, "smladx" },
465*9a0e4156SSadaf Ebrahimi { ARM_INS_SMLAL, "smlal" },
466*9a0e4156SSadaf Ebrahimi { ARM_INS_SMLALBB, "smlalbb" },
467*9a0e4156SSadaf Ebrahimi { ARM_INS_SMLALBT, "smlalbt" },
468*9a0e4156SSadaf Ebrahimi { ARM_INS_SMLALD, "smlald" },
469*9a0e4156SSadaf Ebrahimi { ARM_INS_SMLALDX, "smlaldx" },
470*9a0e4156SSadaf Ebrahimi { ARM_INS_SMLALTB, "smlaltb" },
471*9a0e4156SSadaf Ebrahimi { ARM_INS_SMLALTT, "smlaltt" },
472*9a0e4156SSadaf Ebrahimi { ARM_INS_SMLATB, "smlatb" },
473*9a0e4156SSadaf Ebrahimi { ARM_INS_SMLATT, "smlatt" },
474*9a0e4156SSadaf Ebrahimi { ARM_INS_SMLAWB, "smlawb" },
475*9a0e4156SSadaf Ebrahimi { ARM_INS_SMLAWT, "smlawt" },
476*9a0e4156SSadaf Ebrahimi { ARM_INS_SMLSD, "smlsd" },
477*9a0e4156SSadaf Ebrahimi { ARM_INS_SMLSDX, "smlsdx" },
478*9a0e4156SSadaf Ebrahimi { ARM_INS_SMLSLD, "smlsld" },
479*9a0e4156SSadaf Ebrahimi { ARM_INS_SMLSLDX, "smlsldx" },
480*9a0e4156SSadaf Ebrahimi { ARM_INS_SMMLA, "smmla" },
481*9a0e4156SSadaf Ebrahimi { ARM_INS_SMMLAR, "smmlar" },
482*9a0e4156SSadaf Ebrahimi { ARM_INS_SMMLS, "smmls" },
483*9a0e4156SSadaf Ebrahimi { ARM_INS_SMMLSR, "smmlsr" },
484*9a0e4156SSadaf Ebrahimi { ARM_INS_SMMUL, "smmul" },
485*9a0e4156SSadaf Ebrahimi { ARM_INS_SMMULR, "smmulr" },
486*9a0e4156SSadaf Ebrahimi { ARM_INS_SMUAD, "smuad" },
487*9a0e4156SSadaf Ebrahimi { ARM_INS_SMUADX, "smuadx" },
488*9a0e4156SSadaf Ebrahimi { ARM_INS_SMULBB, "smulbb" },
489*9a0e4156SSadaf Ebrahimi { ARM_INS_SMULBT, "smulbt" },
490*9a0e4156SSadaf Ebrahimi { ARM_INS_SMULL, "smull" },
491*9a0e4156SSadaf Ebrahimi { ARM_INS_SMULTB, "smultb" },
492*9a0e4156SSadaf Ebrahimi { ARM_INS_SMULTT, "smultt" },
493*9a0e4156SSadaf Ebrahimi { ARM_INS_SMULWB, "smulwb" },
494*9a0e4156SSadaf Ebrahimi { ARM_INS_SMULWT, "smulwt" },
495*9a0e4156SSadaf Ebrahimi { ARM_INS_SMUSD, "smusd" },
496*9a0e4156SSadaf Ebrahimi { ARM_INS_SMUSDX, "smusdx" },
497*9a0e4156SSadaf Ebrahimi { ARM_INS_SRSDA, "srsda" },
498*9a0e4156SSadaf Ebrahimi { ARM_INS_SRSDB, "srsdb" },
499*9a0e4156SSadaf Ebrahimi { ARM_INS_SRSIA, "srsia" },
500*9a0e4156SSadaf Ebrahimi { ARM_INS_SRSIB, "srsib" },
501*9a0e4156SSadaf Ebrahimi { ARM_INS_SSAT, "ssat" },
502*9a0e4156SSadaf Ebrahimi { ARM_INS_SSAT16, "ssat16" },
503*9a0e4156SSadaf Ebrahimi { ARM_INS_SSAX, "ssax" },
504*9a0e4156SSadaf Ebrahimi { ARM_INS_SSUB16, "ssub16" },
505*9a0e4156SSadaf Ebrahimi { ARM_INS_SSUB8, "ssub8" },
506*9a0e4156SSadaf Ebrahimi { ARM_INS_STC2L, "stc2l" },
507*9a0e4156SSadaf Ebrahimi { ARM_INS_STC2, "stc2" },
508*9a0e4156SSadaf Ebrahimi { ARM_INS_STCL, "stcl" },
509*9a0e4156SSadaf Ebrahimi { ARM_INS_STC, "stc" },
510*9a0e4156SSadaf Ebrahimi { ARM_INS_STL, "stl" },
511*9a0e4156SSadaf Ebrahimi { ARM_INS_STLB, "stlb" },
512*9a0e4156SSadaf Ebrahimi { ARM_INS_STLEX, "stlex" },
513*9a0e4156SSadaf Ebrahimi { ARM_INS_STLEXB, "stlexb" },
514*9a0e4156SSadaf Ebrahimi { ARM_INS_STLEXD, "stlexd" },
515*9a0e4156SSadaf Ebrahimi { ARM_INS_STLEXH, "stlexh" },
516*9a0e4156SSadaf Ebrahimi { ARM_INS_STLH, "stlh" },
517*9a0e4156SSadaf Ebrahimi { ARM_INS_STMDA, "stmda" },
518*9a0e4156SSadaf Ebrahimi { ARM_INS_STMDB, "stmdb" },
519*9a0e4156SSadaf Ebrahimi { ARM_INS_STM, "stm" },
520*9a0e4156SSadaf Ebrahimi { ARM_INS_STMIB, "stmib" },
521*9a0e4156SSadaf Ebrahimi { ARM_INS_STRBT, "strbt" },
522*9a0e4156SSadaf Ebrahimi { ARM_INS_STRB, "strb" },
523*9a0e4156SSadaf Ebrahimi { ARM_INS_STRD, "strd" },
524*9a0e4156SSadaf Ebrahimi { ARM_INS_STREX, "strex" },
525*9a0e4156SSadaf Ebrahimi { ARM_INS_STREXB, "strexb" },
526*9a0e4156SSadaf Ebrahimi { ARM_INS_STREXD, "strexd" },
527*9a0e4156SSadaf Ebrahimi { ARM_INS_STREXH, "strexh" },
528*9a0e4156SSadaf Ebrahimi { ARM_INS_STRH, "strh" },
529*9a0e4156SSadaf Ebrahimi { ARM_INS_STRHT, "strht" },
530*9a0e4156SSadaf Ebrahimi { ARM_INS_STRT, "strt" },
531*9a0e4156SSadaf Ebrahimi { ARM_INS_STR, "str" },
532*9a0e4156SSadaf Ebrahimi { ARM_INS_SUB, "sub" },
533*9a0e4156SSadaf Ebrahimi { ARM_INS_SVC, "svc" },
534*9a0e4156SSadaf Ebrahimi { ARM_INS_SWP, "swp" },
535*9a0e4156SSadaf Ebrahimi { ARM_INS_SWPB, "swpb" },
536*9a0e4156SSadaf Ebrahimi { ARM_INS_SXTAB, "sxtab" },
537*9a0e4156SSadaf Ebrahimi { ARM_INS_SXTAB16, "sxtab16" },
538*9a0e4156SSadaf Ebrahimi { ARM_INS_SXTAH, "sxtah" },
539*9a0e4156SSadaf Ebrahimi { ARM_INS_SXTB, "sxtb" },
540*9a0e4156SSadaf Ebrahimi { ARM_INS_SXTB16, "sxtb16" },
541*9a0e4156SSadaf Ebrahimi { ARM_INS_SXTH, "sxth" },
542*9a0e4156SSadaf Ebrahimi { ARM_INS_TEQ, "teq" },
543*9a0e4156SSadaf Ebrahimi { ARM_INS_TRAP, "trap" },
544*9a0e4156SSadaf Ebrahimi { ARM_INS_TST, "tst" },
545*9a0e4156SSadaf Ebrahimi { ARM_INS_UADD16, "uadd16" },
546*9a0e4156SSadaf Ebrahimi { ARM_INS_UADD8, "uadd8" },
547*9a0e4156SSadaf Ebrahimi { ARM_INS_UASX, "uasx" },
548*9a0e4156SSadaf Ebrahimi { ARM_INS_UBFX, "ubfx" },
549*9a0e4156SSadaf Ebrahimi { ARM_INS_UDF, "udf" },
550*9a0e4156SSadaf Ebrahimi { ARM_INS_UDIV, "udiv" },
551*9a0e4156SSadaf Ebrahimi { ARM_INS_UHADD16, "uhadd16" },
552*9a0e4156SSadaf Ebrahimi { ARM_INS_UHADD8, "uhadd8" },
553*9a0e4156SSadaf Ebrahimi { ARM_INS_UHASX, "uhasx" },
554*9a0e4156SSadaf Ebrahimi { ARM_INS_UHSAX, "uhsax" },
555*9a0e4156SSadaf Ebrahimi { ARM_INS_UHSUB16, "uhsub16" },
556*9a0e4156SSadaf Ebrahimi { ARM_INS_UHSUB8, "uhsub8" },
557*9a0e4156SSadaf Ebrahimi { ARM_INS_UMAAL, "umaal" },
558*9a0e4156SSadaf Ebrahimi { ARM_INS_UMLAL, "umlal" },
559*9a0e4156SSadaf Ebrahimi { ARM_INS_UMULL, "umull" },
560*9a0e4156SSadaf Ebrahimi { ARM_INS_UQADD16, "uqadd16" },
561*9a0e4156SSadaf Ebrahimi { ARM_INS_UQADD8, "uqadd8" },
562*9a0e4156SSadaf Ebrahimi { ARM_INS_UQASX, "uqasx" },
563*9a0e4156SSadaf Ebrahimi { ARM_INS_UQSAX, "uqsax" },
564*9a0e4156SSadaf Ebrahimi { ARM_INS_UQSUB16, "uqsub16" },
565*9a0e4156SSadaf Ebrahimi { ARM_INS_UQSUB8, "uqsub8" },
566*9a0e4156SSadaf Ebrahimi { ARM_INS_USAD8, "usad8" },
567*9a0e4156SSadaf Ebrahimi { ARM_INS_USADA8, "usada8" },
568*9a0e4156SSadaf Ebrahimi { ARM_INS_USAT, "usat" },
569*9a0e4156SSadaf Ebrahimi { ARM_INS_USAT16, "usat16" },
570*9a0e4156SSadaf Ebrahimi { ARM_INS_USAX, "usax" },
571*9a0e4156SSadaf Ebrahimi { ARM_INS_USUB16, "usub16" },
572*9a0e4156SSadaf Ebrahimi { ARM_INS_USUB8, "usub8" },
573*9a0e4156SSadaf Ebrahimi { ARM_INS_UXTAB, "uxtab" },
574*9a0e4156SSadaf Ebrahimi { ARM_INS_UXTAB16, "uxtab16" },
575*9a0e4156SSadaf Ebrahimi { ARM_INS_UXTAH, "uxtah" },
576*9a0e4156SSadaf Ebrahimi { ARM_INS_UXTB, "uxtb" },
577*9a0e4156SSadaf Ebrahimi { ARM_INS_UXTB16, "uxtb16" },
578*9a0e4156SSadaf Ebrahimi { ARM_INS_UXTH, "uxth" },
579*9a0e4156SSadaf Ebrahimi { ARM_INS_VABAL, "vabal" },
580*9a0e4156SSadaf Ebrahimi { ARM_INS_VABA, "vaba" },
581*9a0e4156SSadaf Ebrahimi { ARM_INS_VABDL, "vabdl" },
582*9a0e4156SSadaf Ebrahimi { ARM_INS_VABD, "vabd" },
583*9a0e4156SSadaf Ebrahimi { ARM_INS_VABS, "vabs" },
584*9a0e4156SSadaf Ebrahimi { ARM_INS_VACGE, "vacge" },
585*9a0e4156SSadaf Ebrahimi { ARM_INS_VACGT, "vacgt" },
586*9a0e4156SSadaf Ebrahimi { ARM_INS_VADD, "vadd" },
587*9a0e4156SSadaf Ebrahimi { ARM_INS_VADDHN, "vaddhn" },
588*9a0e4156SSadaf Ebrahimi { ARM_INS_VADDL, "vaddl" },
589*9a0e4156SSadaf Ebrahimi { ARM_INS_VADDW, "vaddw" },
590*9a0e4156SSadaf Ebrahimi { ARM_INS_VAND, "vand" },
591*9a0e4156SSadaf Ebrahimi { ARM_INS_VBIC, "vbic" },
592*9a0e4156SSadaf Ebrahimi { ARM_INS_VBIF, "vbif" },
593*9a0e4156SSadaf Ebrahimi { ARM_INS_VBIT, "vbit" },
594*9a0e4156SSadaf Ebrahimi { ARM_INS_VBSL, "vbsl" },
595*9a0e4156SSadaf Ebrahimi { ARM_INS_VCEQ, "vceq" },
596*9a0e4156SSadaf Ebrahimi { ARM_INS_VCGE, "vcge" },
597*9a0e4156SSadaf Ebrahimi { ARM_INS_VCGT, "vcgt" },
598*9a0e4156SSadaf Ebrahimi { ARM_INS_VCLE, "vcle" },
599*9a0e4156SSadaf Ebrahimi { ARM_INS_VCLS, "vcls" },
600*9a0e4156SSadaf Ebrahimi { ARM_INS_VCLT, "vclt" },
601*9a0e4156SSadaf Ebrahimi { ARM_INS_VCLZ, "vclz" },
602*9a0e4156SSadaf Ebrahimi { ARM_INS_VCMP, "vcmp" },
603*9a0e4156SSadaf Ebrahimi { ARM_INS_VCMPE, "vcmpe" },
604*9a0e4156SSadaf Ebrahimi { ARM_INS_VCNT, "vcnt" },
605*9a0e4156SSadaf Ebrahimi { ARM_INS_VCVTA, "vcvta" },
606*9a0e4156SSadaf Ebrahimi { ARM_INS_VCVTB, "vcvtb" },
607*9a0e4156SSadaf Ebrahimi { ARM_INS_VCVT, "vcvt" },
608*9a0e4156SSadaf Ebrahimi { ARM_INS_VCVTM, "vcvtm" },
609*9a0e4156SSadaf Ebrahimi { ARM_INS_VCVTN, "vcvtn" },
610*9a0e4156SSadaf Ebrahimi { ARM_INS_VCVTP, "vcvtp" },
611*9a0e4156SSadaf Ebrahimi { ARM_INS_VCVTT, "vcvtt" },
612*9a0e4156SSadaf Ebrahimi { ARM_INS_VDIV, "vdiv" },
613*9a0e4156SSadaf Ebrahimi { ARM_INS_VDUP, "vdup" },
614*9a0e4156SSadaf Ebrahimi { ARM_INS_VEOR, "veor" },
615*9a0e4156SSadaf Ebrahimi { ARM_INS_VEXT, "vext" },
616*9a0e4156SSadaf Ebrahimi { ARM_INS_VFMA, "vfma" },
617*9a0e4156SSadaf Ebrahimi { ARM_INS_VFMS, "vfms" },
618*9a0e4156SSadaf Ebrahimi { ARM_INS_VFNMA, "vfnma" },
619*9a0e4156SSadaf Ebrahimi { ARM_INS_VFNMS, "vfnms" },
620*9a0e4156SSadaf Ebrahimi { ARM_INS_VHADD, "vhadd" },
621*9a0e4156SSadaf Ebrahimi { ARM_INS_VHSUB, "vhsub" },
622*9a0e4156SSadaf Ebrahimi { ARM_INS_VLD1, "vld1" },
623*9a0e4156SSadaf Ebrahimi { ARM_INS_VLD2, "vld2" },
624*9a0e4156SSadaf Ebrahimi { ARM_INS_VLD3, "vld3" },
625*9a0e4156SSadaf Ebrahimi { ARM_INS_VLD4, "vld4" },
626*9a0e4156SSadaf Ebrahimi { ARM_INS_VLDMDB, "vldmdb" },
627*9a0e4156SSadaf Ebrahimi { ARM_INS_VLDMIA, "vldmia" },
628*9a0e4156SSadaf Ebrahimi { ARM_INS_VLDR, "vldr" },
629*9a0e4156SSadaf Ebrahimi { ARM_INS_VMAXNM, "vmaxnm" },
630*9a0e4156SSadaf Ebrahimi { ARM_INS_VMAX, "vmax" },
631*9a0e4156SSadaf Ebrahimi { ARM_INS_VMINNM, "vminnm" },
632*9a0e4156SSadaf Ebrahimi { ARM_INS_VMIN, "vmin" },
633*9a0e4156SSadaf Ebrahimi { ARM_INS_VMLA, "vmla" },
634*9a0e4156SSadaf Ebrahimi { ARM_INS_VMLAL, "vmlal" },
635*9a0e4156SSadaf Ebrahimi { ARM_INS_VMLS, "vmls" },
636*9a0e4156SSadaf Ebrahimi { ARM_INS_VMLSL, "vmlsl" },
637*9a0e4156SSadaf Ebrahimi { ARM_INS_VMOVL, "vmovl" },
638*9a0e4156SSadaf Ebrahimi { ARM_INS_VMOVN, "vmovn" },
639*9a0e4156SSadaf Ebrahimi { ARM_INS_VMSR, "vmsr" },
640*9a0e4156SSadaf Ebrahimi { ARM_INS_VMUL, "vmul" },
641*9a0e4156SSadaf Ebrahimi { ARM_INS_VMULL, "vmull" },
642*9a0e4156SSadaf Ebrahimi { ARM_INS_VMVN, "vmvn" },
643*9a0e4156SSadaf Ebrahimi { ARM_INS_VNEG, "vneg" },
644*9a0e4156SSadaf Ebrahimi { ARM_INS_VNMLA, "vnmla" },
645*9a0e4156SSadaf Ebrahimi { ARM_INS_VNMLS, "vnmls" },
646*9a0e4156SSadaf Ebrahimi { ARM_INS_VNMUL, "vnmul" },
647*9a0e4156SSadaf Ebrahimi { ARM_INS_VORN, "vorn" },
648*9a0e4156SSadaf Ebrahimi { ARM_INS_VORR, "vorr" },
649*9a0e4156SSadaf Ebrahimi { ARM_INS_VPADAL, "vpadal" },
650*9a0e4156SSadaf Ebrahimi { ARM_INS_VPADDL, "vpaddl" },
651*9a0e4156SSadaf Ebrahimi { ARM_INS_VPADD, "vpadd" },
652*9a0e4156SSadaf Ebrahimi { ARM_INS_VPMAX, "vpmax" },
653*9a0e4156SSadaf Ebrahimi { ARM_INS_VPMIN, "vpmin" },
654*9a0e4156SSadaf Ebrahimi { ARM_INS_VQABS, "vqabs" },
655*9a0e4156SSadaf Ebrahimi { ARM_INS_VQADD, "vqadd" },
656*9a0e4156SSadaf Ebrahimi { ARM_INS_VQDMLAL, "vqdmlal" },
657*9a0e4156SSadaf Ebrahimi { ARM_INS_VQDMLSL, "vqdmlsl" },
658*9a0e4156SSadaf Ebrahimi { ARM_INS_VQDMULH, "vqdmulh" },
659*9a0e4156SSadaf Ebrahimi { ARM_INS_VQDMULL, "vqdmull" },
660*9a0e4156SSadaf Ebrahimi { ARM_INS_VQMOVUN, "vqmovun" },
661*9a0e4156SSadaf Ebrahimi { ARM_INS_VQMOVN, "vqmovn" },
662*9a0e4156SSadaf Ebrahimi { ARM_INS_VQNEG, "vqneg" },
663*9a0e4156SSadaf Ebrahimi { ARM_INS_VQRDMULH, "vqrdmulh" },
664*9a0e4156SSadaf Ebrahimi { ARM_INS_VQRSHL, "vqrshl" },
665*9a0e4156SSadaf Ebrahimi { ARM_INS_VQRSHRN, "vqrshrn" },
666*9a0e4156SSadaf Ebrahimi { ARM_INS_VQRSHRUN, "vqrshrun" },
667*9a0e4156SSadaf Ebrahimi { ARM_INS_VQSHL, "vqshl" },
668*9a0e4156SSadaf Ebrahimi { ARM_INS_VQSHLU, "vqshlu" },
669*9a0e4156SSadaf Ebrahimi { ARM_INS_VQSHRN, "vqshrn" },
670*9a0e4156SSadaf Ebrahimi { ARM_INS_VQSHRUN, "vqshrun" },
671*9a0e4156SSadaf Ebrahimi { ARM_INS_VQSUB, "vqsub" },
672*9a0e4156SSadaf Ebrahimi { ARM_INS_VRADDHN, "vraddhn" },
673*9a0e4156SSadaf Ebrahimi { ARM_INS_VRECPE, "vrecpe" },
674*9a0e4156SSadaf Ebrahimi { ARM_INS_VRECPS, "vrecps" },
675*9a0e4156SSadaf Ebrahimi { ARM_INS_VREV16, "vrev16" },
676*9a0e4156SSadaf Ebrahimi { ARM_INS_VREV32, "vrev32" },
677*9a0e4156SSadaf Ebrahimi { ARM_INS_VREV64, "vrev64" },
678*9a0e4156SSadaf Ebrahimi { ARM_INS_VRHADD, "vrhadd" },
679*9a0e4156SSadaf Ebrahimi { ARM_INS_VRINTA, "vrinta" },
680*9a0e4156SSadaf Ebrahimi { ARM_INS_VRINTM, "vrintm" },
681*9a0e4156SSadaf Ebrahimi { ARM_INS_VRINTN, "vrintn" },
682*9a0e4156SSadaf Ebrahimi { ARM_INS_VRINTP, "vrintp" },
683*9a0e4156SSadaf Ebrahimi { ARM_INS_VRINTR, "vrintr" },
684*9a0e4156SSadaf Ebrahimi { ARM_INS_VRINTX, "vrintx" },
685*9a0e4156SSadaf Ebrahimi { ARM_INS_VRINTZ, "vrintz" },
686*9a0e4156SSadaf Ebrahimi { ARM_INS_VRSHL, "vrshl" },
687*9a0e4156SSadaf Ebrahimi { ARM_INS_VRSHRN, "vrshrn" },
688*9a0e4156SSadaf Ebrahimi { ARM_INS_VRSHR, "vrshr" },
689*9a0e4156SSadaf Ebrahimi { ARM_INS_VRSQRTE, "vrsqrte" },
690*9a0e4156SSadaf Ebrahimi { ARM_INS_VRSQRTS, "vrsqrts" },
691*9a0e4156SSadaf Ebrahimi { ARM_INS_VRSRA, "vrsra" },
692*9a0e4156SSadaf Ebrahimi { ARM_INS_VRSUBHN, "vrsubhn" },
693*9a0e4156SSadaf Ebrahimi { ARM_INS_VSELEQ, "vseleq" },
694*9a0e4156SSadaf Ebrahimi { ARM_INS_VSELGE, "vselge" },
695*9a0e4156SSadaf Ebrahimi { ARM_INS_VSELGT, "vselgt" },
696*9a0e4156SSadaf Ebrahimi { ARM_INS_VSELVS, "vselvs" },
697*9a0e4156SSadaf Ebrahimi { ARM_INS_VSHLL, "vshll" },
698*9a0e4156SSadaf Ebrahimi { ARM_INS_VSHL, "vshl" },
699*9a0e4156SSadaf Ebrahimi { ARM_INS_VSHRN, "vshrn" },
700*9a0e4156SSadaf Ebrahimi { ARM_INS_VSHR, "vshr" },
701*9a0e4156SSadaf Ebrahimi { ARM_INS_VSLI, "vsli" },
702*9a0e4156SSadaf Ebrahimi { ARM_INS_VSQRT, "vsqrt" },
703*9a0e4156SSadaf Ebrahimi { ARM_INS_VSRA, "vsra" },
704*9a0e4156SSadaf Ebrahimi { ARM_INS_VSRI, "vsri" },
705*9a0e4156SSadaf Ebrahimi { ARM_INS_VST1, "vst1" },
706*9a0e4156SSadaf Ebrahimi { ARM_INS_VST2, "vst2" },
707*9a0e4156SSadaf Ebrahimi { ARM_INS_VST3, "vst3" },
708*9a0e4156SSadaf Ebrahimi { ARM_INS_VST4, "vst4" },
709*9a0e4156SSadaf Ebrahimi { ARM_INS_VSTMDB, "vstmdb" },
710*9a0e4156SSadaf Ebrahimi { ARM_INS_VSTMIA, "vstmia" },
711*9a0e4156SSadaf Ebrahimi { ARM_INS_VSTR, "vstr" },
712*9a0e4156SSadaf Ebrahimi { ARM_INS_VSUB, "vsub" },
713*9a0e4156SSadaf Ebrahimi { ARM_INS_VSUBHN, "vsubhn" },
714*9a0e4156SSadaf Ebrahimi { ARM_INS_VSUBL, "vsubl" },
715*9a0e4156SSadaf Ebrahimi { ARM_INS_VSUBW, "vsubw" },
716*9a0e4156SSadaf Ebrahimi { ARM_INS_VSWP, "vswp" },
717*9a0e4156SSadaf Ebrahimi { ARM_INS_VTBL, "vtbl" },
718*9a0e4156SSadaf Ebrahimi { ARM_INS_VTBX, "vtbx" },
719*9a0e4156SSadaf Ebrahimi { ARM_INS_VCVTR, "vcvtr" },
720*9a0e4156SSadaf Ebrahimi { ARM_INS_VTRN, "vtrn" },
721*9a0e4156SSadaf Ebrahimi { ARM_INS_VTST, "vtst" },
722*9a0e4156SSadaf Ebrahimi { ARM_INS_VUZP, "vuzp" },
723*9a0e4156SSadaf Ebrahimi { ARM_INS_VZIP, "vzip" },
724*9a0e4156SSadaf Ebrahimi { ARM_INS_ADDW, "addw" },
725*9a0e4156SSadaf Ebrahimi { ARM_INS_ASR, "asr" },
726*9a0e4156SSadaf Ebrahimi { ARM_INS_DCPS1, "dcps1" },
727*9a0e4156SSadaf Ebrahimi { ARM_INS_DCPS2, "dcps2" },
728*9a0e4156SSadaf Ebrahimi { ARM_INS_DCPS3, "dcps3" },
729*9a0e4156SSadaf Ebrahimi { ARM_INS_IT, "it" },
730*9a0e4156SSadaf Ebrahimi { ARM_INS_LSL, "lsl" },
731*9a0e4156SSadaf Ebrahimi { ARM_INS_LSR, "lsr" },
732*9a0e4156SSadaf Ebrahimi { ARM_INS_ORN, "orn" },
733*9a0e4156SSadaf Ebrahimi { ARM_INS_ROR, "ror" },
734*9a0e4156SSadaf Ebrahimi { ARM_INS_RRX, "rrx" },
735*9a0e4156SSadaf Ebrahimi { ARM_INS_SUBW, "subw" },
736*9a0e4156SSadaf Ebrahimi { ARM_INS_TBB, "tbb" },
737*9a0e4156SSadaf Ebrahimi { ARM_INS_TBH, "tbh" },
738*9a0e4156SSadaf Ebrahimi { ARM_INS_CBNZ, "cbnz" },
739*9a0e4156SSadaf Ebrahimi { ARM_INS_CBZ, "cbz" },
740*9a0e4156SSadaf Ebrahimi { ARM_INS_POP, "pop" },
741*9a0e4156SSadaf Ebrahimi { ARM_INS_PUSH, "push" },
742*9a0e4156SSadaf Ebrahimi
743*9a0e4156SSadaf Ebrahimi // special instructions
744*9a0e4156SSadaf Ebrahimi { ARM_INS_NOP, "nop" },
745*9a0e4156SSadaf Ebrahimi { ARM_INS_YIELD, "yield" },
746*9a0e4156SSadaf Ebrahimi { ARM_INS_WFE, "wfe" },
747*9a0e4156SSadaf Ebrahimi { ARM_INS_WFI, "wfi" },
748*9a0e4156SSadaf Ebrahimi { ARM_INS_SEV, "sev" },
749*9a0e4156SSadaf Ebrahimi { ARM_INS_SEVL, "sevl" },
750*9a0e4156SSadaf Ebrahimi { ARM_INS_VPUSH, "vpush" },
751*9a0e4156SSadaf Ebrahimi { ARM_INS_VPOP, "vpop" },
752*9a0e4156SSadaf Ebrahimi };
753*9a0e4156SSadaf Ebrahimi #endif
754*9a0e4156SSadaf Ebrahimi
ARM_insn_name(csh handle,unsigned int id)755*9a0e4156SSadaf Ebrahimi const char *ARM_insn_name(csh handle, unsigned int id)
756*9a0e4156SSadaf Ebrahimi {
757*9a0e4156SSadaf Ebrahimi #ifndef CAPSTONE_DIET
758*9a0e4156SSadaf Ebrahimi if (id >= ARM_INS_ENDING)
759*9a0e4156SSadaf Ebrahimi return NULL;
760*9a0e4156SSadaf Ebrahimi
761*9a0e4156SSadaf Ebrahimi return insn_name_maps[id].name;
762*9a0e4156SSadaf Ebrahimi #else
763*9a0e4156SSadaf Ebrahimi return NULL;
764*9a0e4156SSadaf Ebrahimi #endif
765*9a0e4156SSadaf Ebrahimi }
766*9a0e4156SSadaf Ebrahimi
767*9a0e4156SSadaf Ebrahimi #ifndef CAPSTONE_DIET
768*9a0e4156SSadaf Ebrahimi static const name_map group_name_maps[] = {
769*9a0e4156SSadaf Ebrahimi // generic groups
770*9a0e4156SSadaf Ebrahimi { ARM_GRP_INVALID, NULL },
771*9a0e4156SSadaf Ebrahimi { ARM_GRP_JUMP, "jump" },
772*9a0e4156SSadaf Ebrahimi { ARM_GRP_CALL, "call" },
773*9a0e4156SSadaf Ebrahimi { ARM_GRP_INT, "int" },
774*9a0e4156SSadaf Ebrahimi { ARM_GRP_PRIVILEGE, "privilege" },
775*9a0e4156SSadaf Ebrahimi { ARM_GRP_BRANCH_RELATIVE, "branch_relative" },
776*9a0e4156SSadaf Ebrahimi
777*9a0e4156SSadaf Ebrahimi // architecture-specific groups
778*9a0e4156SSadaf Ebrahimi { ARM_GRP_CRYPTO, "crypto" },
779*9a0e4156SSadaf Ebrahimi { ARM_GRP_DATABARRIER, "databarrier" },
780*9a0e4156SSadaf Ebrahimi { ARM_GRP_DIVIDE, "divide" },
781*9a0e4156SSadaf Ebrahimi { ARM_GRP_FPARMV8, "fparmv8" },
782*9a0e4156SSadaf Ebrahimi { ARM_GRP_MULTPRO, "multpro" },
783*9a0e4156SSadaf Ebrahimi { ARM_GRP_NEON, "neon" },
784*9a0e4156SSadaf Ebrahimi { ARM_GRP_T2EXTRACTPACK, "T2EXTRACTPACK" },
785*9a0e4156SSadaf Ebrahimi { ARM_GRP_THUMB2DSP, "THUMB2DSP" },
786*9a0e4156SSadaf Ebrahimi { ARM_GRP_TRUSTZONE, "TRUSTZONE" },
787*9a0e4156SSadaf Ebrahimi { ARM_GRP_V4T, "v4t" },
788*9a0e4156SSadaf Ebrahimi { ARM_GRP_V5T, "v5t" },
789*9a0e4156SSadaf Ebrahimi { ARM_GRP_V5TE, "v5te" },
790*9a0e4156SSadaf Ebrahimi { ARM_GRP_V6, "v6" },
791*9a0e4156SSadaf Ebrahimi { ARM_GRP_V6T2, "v6t2" },
792*9a0e4156SSadaf Ebrahimi { ARM_GRP_V7, "v7" },
793*9a0e4156SSadaf Ebrahimi { ARM_GRP_V8, "v8" },
794*9a0e4156SSadaf Ebrahimi { ARM_GRP_VFP2, "vfp2" },
795*9a0e4156SSadaf Ebrahimi { ARM_GRP_VFP3, "vfp3" },
796*9a0e4156SSadaf Ebrahimi { ARM_GRP_VFP4, "vfp4" },
797*9a0e4156SSadaf Ebrahimi { ARM_GRP_ARM, "arm" },
798*9a0e4156SSadaf Ebrahimi { ARM_GRP_MCLASS, "mclass" },
799*9a0e4156SSadaf Ebrahimi { ARM_GRP_NOTMCLASS, "notmclass" },
800*9a0e4156SSadaf Ebrahimi { ARM_GRP_THUMB, "thumb" },
801*9a0e4156SSadaf Ebrahimi { ARM_GRP_THUMB1ONLY, "thumb1only" },
802*9a0e4156SSadaf Ebrahimi { ARM_GRP_THUMB2, "thumb2" },
803*9a0e4156SSadaf Ebrahimi { ARM_GRP_PREV8, "prev8" },
804*9a0e4156SSadaf Ebrahimi { ARM_GRP_FPVMLX, "fpvmlx" },
805*9a0e4156SSadaf Ebrahimi { ARM_GRP_MULOPS, "mulops" },
806*9a0e4156SSadaf Ebrahimi { ARM_GRP_CRC, "crc" },
807*9a0e4156SSadaf Ebrahimi { ARM_GRP_DPVFP, "dpvfp" },
808*9a0e4156SSadaf Ebrahimi { ARM_GRP_V6M, "v6m" },
809*9a0e4156SSadaf Ebrahimi { ARM_GRP_VIRTUALIZATION, "virtualization" },
810*9a0e4156SSadaf Ebrahimi };
811*9a0e4156SSadaf Ebrahimi #endif
812*9a0e4156SSadaf Ebrahimi
ARM_group_name(csh handle,unsigned int id)813*9a0e4156SSadaf Ebrahimi const char *ARM_group_name(csh handle, unsigned int id)
814*9a0e4156SSadaf Ebrahimi {
815*9a0e4156SSadaf Ebrahimi #ifndef CAPSTONE_DIET
816*9a0e4156SSadaf Ebrahimi return id2name(group_name_maps, ARR_SIZE(group_name_maps), id);
817*9a0e4156SSadaf Ebrahimi #else
818*9a0e4156SSadaf Ebrahimi return NULL;
819*9a0e4156SSadaf Ebrahimi #endif
820*9a0e4156SSadaf Ebrahimi }
821*9a0e4156SSadaf Ebrahimi
822*9a0e4156SSadaf Ebrahimi // list all relative branch instructions
823*9a0e4156SSadaf Ebrahimi // ie: insns[i].branch && !insns[i].indirect_branch
824*9a0e4156SSadaf Ebrahimi static const unsigned int insn_rel[] = {
825*9a0e4156SSadaf Ebrahimi ARM_BL,
826*9a0e4156SSadaf Ebrahimi ARM_BLX_pred,
827*9a0e4156SSadaf Ebrahimi ARM_Bcc,
828*9a0e4156SSadaf Ebrahimi ARM_t2B,
829*9a0e4156SSadaf Ebrahimi ARM_t2Bcc,
830*9a0e4156SSadaf Ebrahimi ARM_tB,
831*9a0e4156SSadaf Ebrahimi ARM_tBcc,
832*9a0e4156SSadaf Ebrahimi ARM_tCBNZ,
833*9a0e4156SSadaf Ebrahimi ARM_tCBZ,
834*9a0e4156SSadaf Ebrahimi ARM_BL_pred,
835*9a0e4156SSadaf Ebrahimi ARM_BLXi,
836*9a0e4156SSadaf Ebrahimi ARM_tBL,
837*9a0e4156SSadaf Ebrahimi ARM_tBLXi,
838*9a0e4156SSadaf Ebrahimi 0
839*9a0e4156SSadaf Ebrahimi };
840*9a0e4156SSadaf Ebrahimi
841*9a0e4156SSadaf Ebrahimi static const unsigned int insn_blx_rel_to_arm[] = {
842*9a0e4156SSadaf Ebrahimi ARM_tBLXi,
843*9a0e4156SSadaf Ebrahimi 0
844*9a0e4156SSadaf Ebrahimi };
845*9a0e4156SSadaf Ebrahimi
846*9a0e4156SSadaf Ebrahimi // check if this insn is relative branch
ARM_rel_branch(cs_struct * h,unsigned int id)847*9a0e4156SSadaf Ebrahimi bool ARM_rel_branch(cs_struct *h, unsigned int id)
848*9a0e4156SSadaf Ebrahimi {
849*9a0e4156SSadaf Ebrahimi int i;
850*9a0e4156SSadaf Ebrahimi
851*9a0e4156SSadaf Ebrahimi for (i = 0; insn_rel[i]; i++) {
852*9a0e4156SSadaf Ebrahimi if (id == insn_rel[i]) {
853*9a0e4156SSadaf Ebrahimi return true;
854*9a0e4156SSadaf Ebrahimi }
855*9a0e4156SSadaf Ebrahimi }
856*9a0e4156SSadaf Ebrahimi
857*9a0e4156SSadaf Ebrahimi // not found
858*9a0e4156SSadaf Ebrahimi return false;
859*9a0e4156SSadaf Ebrahimi }
860*9a0e4156SSadaf Ebrahimi
ARM_blx_to_arm_mode(cs_struct * h,unsigned int id)861*9a0e4156SSadaf Ebrahimi bool ARM_blx_to_arm_mode(cs_struct *h, unsigned int id) {
862*9a0e4156SSadaf Ebrahimi int i;
863*9a0e4156SSadaf Ebrahimi
864*9a0e4156SSadaf Ebrahimi for (i = 0; insn_blx_rel_to_arm[i]; i++)
865*9a0e4156SSadaf Ebrahimi if (id == insn_blx_rel_to_arm[i])
866*9a0e4156SSadaf Ebrahimi return true;
867*9a0e4156SSadaf Ebrahimi
868*9a0e4156SSadaf Ebrahimi // not found
869*9a0e4156SSadaf Ebrahimi return false;
870*9a0e4156SSadaf Ebrahimi
871*9a0e4156SSadaf Ebrahimi }
872*9a0e4156SSadaf Ebrahimi
873*9a0e4156SSadaf Ebrahimi #ifndef CAPSTONE_DIET
874*9a0e4156SSadaf Ebrahimi // map instruction to its characteristics
875*9a0e4156SSadaf Ebrahimi typedef struct insn_op {
876*9a0e4156SSadaf Ebrahimi uint8_t access[7];
877*9a0e4156SSadaf Ebrahimi } insn_op;
878*9a0e4156SSadaf Ebrahimi
879*9a0e4156SSadaf Ebrahimi static insn_op insn_ops[] = {
880*9a0e4156SSadaf Ebrahimi {
881*9a0e4156SSadaf Ebrahimi // NULL item
882*9a0e4156SSadaf Ebrahimi { 0 }
883*9a0e4156SSadaf Ebrahimi },
884*9a0e4156SSadaf Ebrahimi
885*9a0e4156SSadaf Ebrahimi #include "ARMMappingInsnOp.inc"
886*9a0e4156SSadaf Ebrahimi };
887*9a0e4156SSadaf Ebrahimi
888*9a0e4156SSadaf Ebrahimi // given internal insn id, return operand access info
ARM_get_op_access(cs_struct * h,unsigned int id)889*9a0e4156SSadaf Ebrahimi uint8_t *ARM_get_op_access(cs_struct *h, unsigned int id)
890*9a0e4156SSadaf Ebrahimi {
891*9a0e4156SSadaf Ebrahimi int i = insn_find(insns, ARR_SIZE(insns), id, &h->insn_cache);
892*9a0e4156SSadaf Ebrahimi if (i != 0) {
893*9a0e4156SSadaf Ebrahimi return insn_ops[i].access;
894*9a0e4156SSadaf Ebrahimi }
895*9a0e4156SSadaf Ebrahimi
896*9a0e4156SSadaf Ebrahimi return NULL;
897*9a0e4156SSadaf Ebrahimi }
898*9a0e4156SSadaf Ebrahimi
ARM_reg_access(const cs_insn * insn,cs_regs regs_read,uint8_t * regs_read_count,cs_regs regs_write,uint8_t * regs_write_count)899*9a0e4156SSadaf Ebrahimi void ARM_reg_access(const cs_insn *insn,
900*9a0e4156SSadaf Ebrahimi cs_regs regs_read, uint8_t *regs_read_count,
901*9a0e4156SSadaf Ebrahimi cs_regs regs_write, uint8_t *regs_write_count)
902*9a0e4156SSadaf Ebrahimi {
903*9a0e4156SSadaf Ebrahimi uint8_t i;
904*9a0e4156SSadaf Ebrahimi uint8_t read_count, write_count;
905*9a0e4156SSadaf Ebrahimi cs_arm *arm = &(insn->detail->arm);
906*9a0e4156SSadaf Ebrahimi
907*9a0e4156SSadaf Ebrahimi read_count = insn->detail->regs_read_count;
908*9a0e4156SSadaf Ebrahimi write_count = insn->detail->regs_write_count;
909*9a0e4156SSadaf Ebrahimi
910*9a0e4156SSadaf Ebrahimi // implicit registers
911*9a0e4156SSadaf Ebrahimi memcpy(regs_read, insn->detail->regs_read, read_count * sizeof(insn->detail->regs_read[0]));
912*9a0e4156SSadaf Ebrahimi memcpy(regs_write, insn->detail->regs_write, write_count * sizeof(insn->detail->regs_write[0]));
913*9a0e4156SSadaf Ebrahimi
914*9a0e4156SSadaf Ebrahimi // explicit registers
915*9a0e4156SSadaf Ebrahimi for (i = 0; i < arm->op_count; i++) {
916*9a0e4156SSadaf Ebrahimi cs_arm_op *op = &(arm->operands[i]);
917*9a0e4156SSadaf Ebrahimi switch((int)op->type) {
918*9a0e4156SSadaf Ebrahimi case ARM_OP_REG:
919*9a0e4156SSadaf Ebrahimi if ((op->access & CS_AC_READ) && !arr_exist(regs_read, read_count, op->reg)) {
920*9a0e4156SSadaf Ebrahimi regs_read[read_count] = (uint16_t)op->reg;
921*9a0e4156SSadaf Ebrahimi read_count++;
922*9a0e4156SSadaf Ebrahimi }
923*9a0e4156SSadaf Ebrahimi if ((op->access & CS_AC_WRITE) && !arr_exist(regs_write, write_count, op->reg)) {
924*9a0e4156SSadaf Ebrahimi regs_write[write_count] = (uint16_t)op->reg;
925*9a0e4156SSadaf Ebrahimi write_count++;
926*9a0e4156SSadaf Ebrahimi }
927*9a0e4156SSadaf Ebrahimi break;
928*9a0e4156SSadaf Ebrahimi case ARM_OP_MEM:
929*9a0e4156SSadaf Ebrahimi // registers appeared in memory references always being read
930*9a0e4156SSadaf Ebrahimi if ((op->mem.base != ARM_REG_INVALID) && !arr_exist(regs_read, read_count, op->mem.base)) {
931*9a0e4156SSadaf Ebrahimi regs_read[read_count] = (uint16_t)op->mem.base;
932*9a0e4156SSadaf Ebrahimi read_count++;
933*9a0e4156SSadaf Ebrahimi }
934*9a0e4156SSadaf Ebrahimi if ((op->mem.index != ARM_REG_INVALID) && !arr_exist(regs_read, read_count, op->mem.index)) {
935*9a0e4156SSadaf Ebrahimi regs_read[read_count] = (uint16_t)op->mem.index;
936*9a0e4156SSadaf Ebrahimi read_count++;
937*9a0e4156SSadaf Ebrahimi }
938*9a0e4156SSadaf Ebrahimi if ((arm->writeback) && (op->mem.base != ARM_REG_INVALID) && !arr_exist(regs_write, write_count, op->mem.base)) {
939*9a0e4156SSadaf Ebrahimi regs_write[write_count] = (uint16_t)op->mem.base;
940*9a0e4156SSadaf Ebrahimi write_count++;
941*9a0e4156SSadaf Ebrahimi }
942*9a0e4156SSadaf Ebrahimi default:
943*9a0e4156SSadaf Ebrahimi break;
944*9a0e4156SSadaf Ebrahimi }
945*9a0e4156SSadaf Ebrahimi }
946*9a0e4156SSadaf Ebrahimi
947*9a0e4156SSadaf Ebrahimi *regs_read_count = read_count;
948*9a0e4156SSadaf Ebrahimi *regs_write_count = write_count;
949*9a0e4156SSadaf Ebrahimi }
950*9a0e4156SSadaf Ebrahimi #endif
951*9a0e4156SSadaf Ebrahimi
952*9a0e4156SSadaf Ebrahimi #endif
953