1*9a0e4156SSadaf Ebrahimi //===-- X86IntelInstPrinter.cpp - Intel assembly instruction printing -----===//
2*9a0e4156SSadaf Ebrahimi //
3*9a0e4156SSadaf Ebrahimi // The LLVM Compiler Infrastructure
4*9a0e4156SSadaf Ebrahimi //
5*9a0e4156SSadaf Ebrahimi // This file is distributed under the University of Illinois Open Source
6*9a0e4156SSadaf Ebrahimi // License. See LICENSE.TXT for details.
7*9a0e4156SSadaf Ebrahimi //
8*9a0e4156SSadaf Ebrahimi //===----------------------------------------------------------------------===//
9*9a0e4156SSadaf Ebrahimi //
10*9a0e4156SSadaf Ebrahimi // This file includes code for rendering MCInst instances as Intel-style
11*9a0e4156SSadaf Ebrahimi // assembly.
12*9a0e4156SSadaf Ebrahimi //
13*9a0e4156SSadaf Ebrahimi //===----------------------------------------------------------------------===//
14*9a0e4156SSadaf Ebrahimi
15*9a0e4156SSadaf Ebrahimi /* Capstone Disassembly Engine */
16*9a0e4156SSadaf Ebrahimi /* By Nguyen Anh Quynh <[email protected]>, 2013-2015 */
17*9a0e4156SSadaf Ebrahimi
18*9a0e4156SSadaf Ebrahimi #ifdef CAPSTONE_HAS_X86
19*9a0e4156SSadaf Ebrahimi
20*9a0e4156SSadaf Ebrahimi #if defined (WIN32) || defined (WIN64) || defined (_WIN32) || defined (_WIN64)
21*9a0e4156SSadaf Ebrahimi #pragma warning(disable:4996) // disable MSVC's warning on strncpy()
22*9a0e4156SSadaf Ebrahimi #pragma warning(disable:28719) // disable MSVC's warning on strncpy()
23*9a0e4156SSadaf Ebrahimi #endif
24*9a0e4156SSadaf Ebrahimi
25*9a0e4156SSadaf Ebrahimi #if !defined(CAPSTONE_HAS_OSXKERNEL)
26*9a0e4156SSadaf Ebrahimi #include <ctype.h>
27*9a0e4156SSadaf Ebrahimi #endif
28*9a0e4156SSadaf Ebrahimi #include <capstone/platform.h>
29*9a0e4156SSadaf Ebrahimi
30*9a0e4156SSadaf Ebrahimi #if defined(CAPSTONE_HAS_OSXKERNEL)
31*9a0e4156SSadaf Ebrahimi #include <Availability.h>
32*9a0e4156SSadaf Ebrahimi #include <libkern/libkern.h>
33*9a0e4156SSadaf Ebrahimi #else
34*9a0e4156SSadaf Ebrahimi #include <stdio.h>
35*9a0e4156SSadaf Ebrahimi #include <stdlib.h>
36*9a0e4156SSadaf Ebrahimi #endif
37*9a0e4156SSadaf Ebrahimi #include <string.h>
38*9a0e4156SSadaf Ebrahimi
39*9a0e4156SSadaf Ebrahimi #include "../../utils.h"
40*9a0e4156SSadaf Ebrahimi #include "../../MCInst.h"
41*9a0e4156SSadaf Ebrahimi #include "../../SStream.h"
42*9a0e4156SSadaf Ebrahimi #include "../../MCRegisterInfo.h"
43*9a0e4156SSadaf Ebrahimi
44*9a0e4156SSadaf Ebrahimi #include "X86InstPrinter.h"
45*9a0e4156SSadaf Ebrahimi #include "X86Mapping.h"
46*9a0e4156SSadaf Ebrahimi
47*9a0e4156SSadaf Ebrahimi #define GET_INSTRINFO_ENUM
48*9a0e4156SSadaf Ebrahimi #ifdef CAPSTONE_X86_REDUCE
49*9a0e4156SSadaf Ebrahimi #include "X86GenInstrInfo_reduce.inc"
50*9a0e4156SSadaf Ebrahimi #else
51*9a0e4156SSadaf Ebrahimi #include "X86GenInstrInfo.inc"
52*9a0e4156SSadaf Ebrahimi #endif
53*9a0e4156SSadaf Ebrahimi
54*9a0e4156SSadaf Ebrahimi #include "X86BaseInfo.h"
55*9a0e4156SSadaf Ebrahimi
56*9a0e4156SSadaf Ebrahimi static void printMemReference(MCInst *MI, unsigned Op, SStream *O);
57*9a0e4156SSadaf Ebrahimi static void printOperand(MCInst *MI, unsigned OpNo, SStream *O);
58*9a0e4156SSadaf Ebrahimi
59*9a0e4156SSadaf Ebrahimi
set_mem_access(MCInst * MI,bool status)60*9a0e4156SSadaf Ebrahimi static void set_mem_access(MCInst *MI, bool status)
61*9a0e4156SSadaf Ebrahimi {
62*9a0e4156SSadaf Ebrahimi if (MI->csh->detail != CS_OPT_ON)
63*9a0e4156SSadaf Ebrahimi return;
64*9a0e4156SSadaf Ebrahimi
65*9a0e4156SSadaf Ebrahimi MI->csh->doing_mem = status;
66*9a0e4156SSadaf Ebrahimi if (!status)
67*9a0e4156SSadaf Ebrahimi // done, create the next operand slot
68*9a0e4156SSadaf Ebrahimi MI->flat_insn->detail->x86.op_count++;
69*9a0e4156SSadaf Ebrahimi
70*9a0e4156SSadaf Ebrahimi }
71*9a0e4156SSadaf Ebrahimi
printopaquemem(MCInst * MI,unsigned OpNo,SStream * O)72*9a0e4156SSadaf Ebrahimi static void printopaquemem(MCInst *MI, unsigned OpNo, SStream *O)
73*9a0e4156SSadaf Ebrahimi {
74*9a0e4156SSadaf Ebrahimi // FIXME: do this with autogen
75*9a0e4156SSadaf Ebrahimi // printf(">>> ID = %u\n", MI->flat_insn->id);
76*9a0e4156SSadaf Ebrahimi switch(MI->flat_insn->id) {
77*9a0e4156SSadaf Ebrahimi default:
78*9a0e4156SSadaf Ebrahimi SStream_concat0(O, "ptr ");
79*9a0e4156SSadaf Ebrahimi break;
80*9a0e4156SSadaf Ebrahimi case X86_INS_SGDT:
81*9a0e4156SSadaf Ebrahimi case X86_INS_SIDT:
82*9a0e4156SSadaf Ebrahimi case X86_INS_LGDT:
83*9a0e4156SSadaf Ebrahimi case X86_INS_LIDT:
84*9a0e4156SSadaf Ebrahimi case X86_INS_FXRSTOR:
85*9a0e4156SSadaf Ebrahimi case X86_INS_FXSAVE:
86*9a0e4156SSadaf Ebrahimi case X86_INS_LJMP:
87*9a0e4156SSadaf Ebrahimi case X86_INS_LCALL:
88*9a0e4156SSadaf Ebrahimi // do not print "ptr"
89*9a0e4156SSadaf Ebrahimi break;
90*9a0e4156SSadaf Ebrahimi }
91*9a0e4156SSadaf Ebrahimi
92*9a0e4156SSadaf Ebrahimi switch(MI->csh->mode) {
93*9a0e4156SSadaf Ebrahimi case CS_MODE_16:
94*9a0e4156SSadaf Ebrahimi switch(MI->flat_insn->id) {
95*9a0e4156SSadaf Ebrahimi default:
96*9a0e4156SSadaf Ebrahimi MI->x86opsize = 2;
97*9a0e4156SSadaf Ebrahimi break;
98*9a0e4156SSadaf Ebrahimi case X86_INS_LJMP:
99*9a0e4156SSadaf Ebrahimi case X86_INS_LCALL:
100*9a0e4156SSadaf Ebrahimi MI->x86opsize = 4;
101*9a0e4156SSadaf Ebrahimi break;
102*9a0e4156SSadaf Ebrahimi case X86_INS_SGDT:
103*9a0e4156SSadaf Ebrahimi case X86_INS_SIDT:
104*9a0e4156SSadaf Ebrahimi case X86_INS_LGDT:
105*9a0e4156SSadaf Ebrahimi case X86_INS_LIDT:
106*9a0e4156SSadaf Ebrahimi MI->x86opsize = 6;
107*9a0e4156SSadaf Ebrahimi break;
108*9a0e4156SSadaf Ebrahimi }
109*9a0e4156SSadaf Ebrahimi break;
110*9a0e4156SSadaf Ebrahimi case CS_MODE_32:
111*9a0e4156SSadaf Ebrahimi switch(MI->flat_insn->id) {
112*9a0e4156SSadaf Ebrahimi default:
113*9a0e4156SSadaf Ebrahimi MI->x86opsize = 4;
114*9a0e4156SSadaf Ebrahimi break;
115*9a0e4156SSadaf Ebrahimi case X86_INS_LJMP:
116*9a0e4156SSadaf Ebrahimi case X86_INS_LCALL:
117*9a0e4156SSadaf Ebrahimi case X86_INS_SGDT:
118*9a0e4156SSadaf Ebrahimi case X86_INS_SIDT:
119*9a0e4156SSadaf Ebrahimi case X86_INS_LGDT:
120*9a0e4156SSadaf Ebrahimi case X86_INS_LIDT:
121*9a0e4156SSadaf Ebrahimi MI->x86opsize = 6;
122*9a0e4156SSadaf Ebrahimi break;
123*9a0e4156SSadaf Ebrahimi }
124*9a0e4156SSadaf Ebrahimi break;
125*9a0e4156SSadaf Ebrahimi case CS_MODE_64:
126*9a0e4156SSadaf Ebrahimi switch(MI->flat_insn->id) {
127*9a0e4156SSadaf Ebrahimi default:
128*9a0e4156SSadaf Ebrahimi MI->x86opsize = 8;
129*9a0e4156SSadaf Ebrahimi break;
130*9a0e4156SSadaf Ebrahimi case X86_INS_LJMP:
131*9a0e4156SSadaf Ebrahimi case X86_INS_LCALL:
132*9a0e4156SSadaf Ebrahimi case X86_INS_SGDT:
133*9a0e4156SSadaf Ebrahimi case X86_INS_SIDT:
134*9a0e4156SSadaf Ebrahimi case X86_INS_LGDT:
135*9a0e4156SSadaf Ebrahimi case X86_INS_LIDT:
136*9a0e4156SSadaf Ebrahimi MI->x86opsize = 10;
137*9a0e4156SSadaf Ebrahimi break;
138*9a0e4156SSadaf Ebrahimi }
139*9a0e4156SSadaf Ebrahimi break;
140*9a0e4156SSadaf Ebrahimi default: // never reach
141*9a0e4156SSadaf Ebrahimi break;
142*9a0e4156SSadaf Ebrahimi }
143*9a0e4156SSadaf Ebrahimi
144*9a0e4156SSadaf Ebrahimi printMemReference(MI, OpNo, O);
145*9a0e4156SSadaf Ebrahimi }
146*9a0e4156SSadaf Ebrahimi
printi8mem(MCInst * MI,unsigned OpNo,SStream * O)147*9a0e4156SSadaf Ebrahimi static void printi8mem(MCInst *MI, unsigned OpNo, SStream *O)
148*9a0e4156SSadaf Ebrahimi {
149*9a0e4156SSadaf Ebrahimi SStream_concat0(O, "byte ptr ");
150*9a0e4156SSadaf Ebrahimi MI->x86opsize = 1;
151*9a0e4156SSadaf Ebrahimi printMemReference(MI, OpNo, O);
152*9a0e4156SSadaf Ebrahimi }
153*9a0e4156SSadaf Ebrahimi
printi16mem(MCInst * MI,unsigned OpNo,SStream * O)154*9a0e4156SSadaf Ebrahimi static void printi16mem(MCInst *MI, unsigned OpNo, SStream *O)
155*9a0e4156SSadaf Ebrahimi {
156*9a0e4156SSadaf Ebrahimi MI->x86opsize = 2;
157*9a0e4156SSadaf Ebrahimi SStream_concat0(O, "word ptr ");
158*9a0e4156SSadaf Ebrahimi printMemReference(MI, OpNo, O);
159*9a0e4156SSadaf Ebrahimi }
160*9a0e4156SSadaf Ebrahimi
printi32mem(MCInst * MI,unsigned OpNo,SStream * O)161*9a0e4156SSadaf Ebrahimi static void printi32mem(MCInst *MI, unsigned OpNo, SStream *O)
162*9a0e4156SSadaf Ebrahimi {
163*9a0e4156SSadaf Ebrahimi MI->x86opsize = 4;
164*9a0e4156SSadaf Ebrahimi SStream_concat0(O, "dword ptr ");
165*9a0e4156SSadaf Ebrahimi printMemReference(MI, OpNo, O);
166*9a0e4156SSadaf Ebrahimi }
167*9a0e4156SSadaf Ebrahimi
printi64mem(MCInst * MI,unsigned OpNo,SStream * O)168*9a0e4156SSadaf Ebrahimi static void printi64mem(MCInst *MI, unsigned OpNo, SStream *O)
169*9a0e4156SSadaf Ebrahimi {
170*9a0e4156SSadaf Ebrahimi SStream_concat0(O, "qword ptr ");
171*9a0e4156SSadaf Ebrahimi MI->x86opsize = 8;
172*9a0e4156SSadaf Ebrahimi printMemReference(MI, OpNo, O);
173*9a0e4156SSadaf Ebrahimi }
174*9a0e4156SSadaf Ebrahimi
printi128mem(MCInst * MI,unsigned OpNo,SStream * O)175*9a0e4156SSadaf Ebrahimi static void printi128mem(MCInst *MI, unsigned OpNo, SStream *O)
176*9a0e4156SSadaf Ebrahimi {
177*9a0e4156SSadaf Ebrahimi SStream_concat0(O, "xmmword ptr ");
178*9a0e4156SSadaf Ebrahimi MI->x86opsize = 16;
179*9a0e4156SSadaf Ebrahimi printMemReference(MI, OpNo, O);
180*9a0e4156SSadaf Ebrahimi }
181*9a0e4156SSadaf Ebrahimi
182*9a0e4156SSadaf Ebrahimi #ifndef CAPSTONE_X86_REDUCE
printi256mem(MCInst * MI,unsigned OpNo,SStream * O)183*9a0e4156SSadaf Ebrahimi static void printi256mem(MCInst *MI, unsigned OpNo, SStream *O)
184*9a0e4156SSadaf Ebrahimi {
185*9a0e4156SSadaf Ebrahimi SStream_concat0(O, "ymmword ptr ");
186*9a0e4156SSadaf Ebrahimi MI->x86opsize = 32;
187*9a0e4156SSadaf Ebrahimi printMemReference(MI, OpNo, O);
188*9a0e4156SSadaf Ebrahimi }
189*9a0e4156SSadaf Ebrahimi
printi512mem(MCInst * MI,unsigned OpNo,SStream * O)190*9a0e4156SSadaf Ebrahimi static void printi512mem(MCInst *MI, unsigned OpNo, SStream *O)
191*9a0e4156SSadaf Ebrahimi {
192*9a0e4156SSadaf Ebrahimi SStream_concat0(O, "zmmword ptr ");
193*9a0e4156SSadaf Ebrahimi MI->x86opsize = 64;
194*9a0e4156SSadaf Ebrahimi printMemReference(MI, OpNo, O);
195*9a0e4156SSadaf Ebrahimi }
196*9a0e4156SSadaf Ebrahimi
printf32mem(MCInst * MI,unsigned OpNo,SStream * O)197*9a0e4156SSadaf Ebrahimi static void printf32mem(MCInst *MI, unsigned OpNo, SStream *O)
198*9a0e4156SSadaf Ebrahimi {
199*9a0e4156SSadaf Ebrahimi switch(MCInst_getOpcode(MI)) {
200*9a0e4156SSadaf Ebrahimi default:
201*9a0e4156SSadaf Ebrahimi SStream_concat0(O, "dword ptr ");
202*9a0e4156SSadaf Ebrahimi MI->x86opsize = 4;
203*9a0e4156SSadaf Ebrahimi break;
204*9a0e4156SSadaf Ebrahimi case X86_FBSTPm:
205*9a0e4156SSadaf Ebrahimi case X86_FBLDm:
206*9a0e4156SSadaf Ebrahimi // TODO: fix this in tablegen instead
207*9a0e4156SSadaf Ebrahimi SStream_concat0(O, "tbyte ptr ");
208*9a0e4156SSadaf Ebrahimi MI->x86opsize = 10;
209*9a0e4156SSadaf Ebrahimi break;
210*9a0e4156SSadaf Ebrahimi case X86_FSTENVm:
211*9a0e4156SSadaf Ebrahimi case X86_FLDENVm:
212*9a0e4156SSadaf Ebrahimi // TODO: fix this in tablegen instead
213*9a0e4156SSadaf Ebrahimi switch(MI->csh->mode) {
214*9a0e4156SSadaf Ebrahimi default: // never reach
215*9a0e4156SSadaf Ebrahimi break;
216*9a0e4156SSadaf Ebrahimi case CS_MODE_16:
217*9a0e4156SSadaf Ebrahimi MI->x86opsize = 14;
218*9a0e4156SSadaf Ebrahimi break;
219*9a0e4156SSadaf Ebrahimi case CS_MODE_32:
220*9a0e4156SSadaf Ebrahimi case CS_MODE_64:
221*9a0e4156SSadaf Ebrahimi MI->x86opsize = 28;
222*9a0e4156SSadaf Ebrahimi break;
223*9a0e4156SSadaf Ebrahimi }
224*9a0e4156SSadaf Ebrahimi break;
225*9a0e4156SSadaf Ebrahimi }
226*9a0e4156SSadaf Ebrahimi
227*9a0e4156SSadaf Ebrahimi printMemReference(MI, OpNo, O);
228*9a0e4156SSadaf Ebrahimi }
229*9a0e4156SSadaf Ebrahimi
printf64mem(MCInst * MI,unsigned OpNo,SStream * O)230*9a0e4156SSadaf Ebrahimi static void printf64mem(MCInst *MI, unsigned OpNo, SStream *O)
231*9a0e4156SSadaf Ebrahimi {
232*9a0e4156SSadaf Ebrahimi SStream_concat0(O, "qword ptr ");
233*9a0e4156SSadaf Ebrahimi MI->x86opsize = 8;
234*9a0e4156SSadaf Ebrahimi printMemReference(MI, OpNo, O);
235*9a0e4156SSadaf Ebrahimi }
236*9a0e4156SSadaf Ebrahimi
printf80mem(MCInst * MI,unsigned OpNo,SStream * O)237*9a0e4156SSadaf Ebrahimi static void printf80mem(MCInst *MI, unsigned OpNo, SStream *O)
238*9a0e4156SSadaf Ebrahimi {
239*9a0e4156SSadaf Ebrahimi SStream_concat0(O, "xword ptr ");
240*9a0e4156SSadaf Ebrahimi MI->x86opsize = 10;
241*9a0e4156SSadaf Ebrahimi printMemReference(MI, OpNo, O);
242*9a0e4156SSadaf Ebrahimi }
243*9a0e4156SSadaf Ebrahimi
printf128mem(MCInst * MI,unsigned OpNo,SStream * O)244*9a0e4156SSadaf Ebrahimi static void printf128mem(MCInst *MI, unsigned OpNo, SStream *O)
245*9a0e4156SSadaf Ebrahimi {
246*9a0e4156SSadaf Ebrahimi SStream_concat0(O, "xmmword ptr ");
247*9a0e4156SSadaf Ebrahimi MI->x86opsize = 16;
248*9a0e4156SSadaf Ebrahimi printMemReference(MI, OpNo, O);
249*9a0e4156SSadaf Ebrahimi }
250*9a0e4156SSadaf Ebrahimi
printf256mem(MCInst * MI,unsigned OpNo,SStream * O)251*9a0e4156SSadaf Ebrahimi static void printf256mem(MCInst *MI, unsigned OpNo, SStream *O)
252*9a0e4156SSadaf Ebrahimi {
253*9a0e4156SSadaf Ebrahimi SStream_concat0(O, "ymmword ptr ");
254*9a0e4156SSadaf Ebrahimi MI->x86opsize = 32;
255*9a0e4156SSadaf Ebrahimi printMemReference(MI, OpNo, O);
256*9a0e4156SSadaf Ebrahimi }
257*9a0e4156SSadaf Ebrahimi
printf512mem(MCInst * MI,unsigned OpNo,SStream * O)258*9a0e4156SSadaf Ebrahimi static void printf512mem(MCInst *MI, unsigned OpNo, SStream *O)
259*9a0e4156SSadaf Ebrahimi {
260*9a0e4156SSadaf Ebrahimi SStream_concat0(O, "zmmword ptr ");
261*9a0e4156SSadaf Ebrahimi MI->x86opsize = 64;
262*9a0e4156SSadaf Ebrahimi printMemReference(MI, OpNo, O);
263*9a0e4156SSadaf Ebrahimi }
264*9a0e4156SSadaf Ebrahimi
printSSECC(MCInst * MI,unsigned Op,SStream * OS)265*9a0e4156SSadaf Ebrahimi static void printSSECC(MCInst *MI, unsigned Op, SStream *OS)
266*9a0e4156SSadaf Ebrahimi {
267*9a0e4156SSadaf Ebrahimi uint8_t Imm = (uint8_t)(MCOperand_getImm(MCInst_getOperand(MI, Op)) & 7);
268*9a0e4156SSadaf Ebrahimi switch (Imm) {
269*9a0e4156SSadaf Ebrahimi default: break; // never reach
270*9a0e4156SSadaf Ebrahimi case 0: SStream_concat0(OS, "eq"); op_addSseCC(MI, X86_SSE_CC_EQ); break;
271*9a0e4156SSadaf Ebrahimi case 1: SStream_concat0(OS, "lt"); op_addSseCC(MI, X86_SSE_CC_LT); break;
272*9a0e4156SSadaf Ebrahimi case 2: SStream_concat0(OS, "le"); op_addSseCC(MI, X86_SSE_CC_LE); break;
273*9a0e4156SSadaf Ebrahimi case 3: SStream_concat0(OS, "unord"); op_addSseCC(MI, X86_SSE_CC_UNORD); break;
274*9a0e4156SSadaf Ebrahimi case 4: SStream_concat0(OS, "neq"); op_addSseCC(MI, X86_SSE_CC_NEQ); break;
275*9a0e4156SSadaf Ebrahimi case 5: SStream_concat0(OS, "nlt"); op_addSseCC(MI, X86_SSE_CC_NLT); break;
276*9a0e4156SSadaf Ebrahimi case 6: SStream_concat0(OS, "nle"); op_addSseCC(MI, X86_SSE_CC_NLE); break;
277*9a0e4156SSadaf Ebrahimi case 7: SStream_concat0(OS, "ord"); op_addSseCC(MI, X86_SSE_CC_ORD); break;
278*9a0e4156SSadaf Ebrahimi }
279*9a0e4156SSadaf Ebrahimi
280*9a0e4156SSadaf Ebrahimi MI->popcode_adjust = Imm + 1;
281*9a0e4156SSadaf Ebrahimi }
282*9a0e4156SSadaf Ebrahimi
printAVXCC(MCInst * MI,unsigned Op,SStream * O)283*9a0e4156SSadaf Ebrahimi static void printAVXCC(MCInst *MI, unsigned Op, SStream *O)
284*9a0e4156SSadaf Ebrahimi {
285*9a0e4156SSadaf Ebrahimi uint8_t Imm = (uint8_t)(MCOperand_getImm(MCInst_getOperand(MI, Op)) & 0x1f);
286*9a0e4156SSadaf Ebrahimi switch (Imm) {
287*9a0e4156SSadaf Ebrahimi default: break;//printf("Invalid avxcc argument!\n"); break;
288*9a0e4156SSadaf Ebrahimi case 0: SStream_concat0(O, "eq"); op_addAvxCC(MI, X86_AVX_CC_EQ); break;
289*9a0e4156SSadaf Ebrahimi case 1: SStream_concat0(O, "lt"); op_addAvxCC(MI, X86_AVX_CC_LT); break;
290*9a0e4156SSadaf Ebrahimi case 2: SStream_concat0(O, "le"); op_addAvxCC(MI, X86_AVX_CC_LE); break;
291*9a0e4156SSadaf Ebrahimi case 3: SStream_concat0(O, "unord"); op_addAvxCC(MI, X86_AVX_CC_UNORD); break;
292*9a0e4156SSadaf Ebrahimi case 4: SStream_concat0(O, "neq"); op_addAvxCC(MI, X86_AVX_CC_NEQ); break;
293*9a0e4156SSadaf Ebrahimi case 5: SStream_concat0(O, "nlt"); op_addAvxCC(MI, X86_AVX_CC_NLT); break;
294*9a0e4156SSadaf Ebrahimi case 6: SStream_concat0(O, "nle"); op_addAvxCC(MI, X86_AVX_CC_NLE); break;
295*9a0e4156SSadaf Ebrahimi case 7: SStream_concat0(O, "ord"); op_addAvxCC(MI, X86_AVX_CC_ORD); break;
296*9a0e4156SSadaf Ebrahimi case 8: SStream_concat0(O, "eq_uq"); op_addAvxCC(MI, X86_AVX_CC_EQ_UQ); break;
297*9a0e4156SSadaf Ebrahimi case 9: SStream_concat0(O, "nge"); op_addAvxCC(MI, X86_AVX_CC_NGE); break;
298*9a0e4156SSadaf Ebrahimi case 0xa: SStream_concat0(O, "ngt"); op_addAvxCC(MI, X86_AVX_CC_NGT); break;
299*9a0e4156SSadaf Ebrahimi case 0xb: SStream_concat0(O, "false"); op_addAvxCC(MI, X86_AVX_CC_FALSE); break;
300*9a0e4156SSadaf Ebrahimi case 0xc: SStream_concat0(O, "neq_oq"); op_addAvxCC(MI, X86_AVX_CC_NEQ_OQ); break;
301*9a0e4156SSadaf Ebrahimi case 0xd: SStream_concat0(O, "ge"); op_addAvxCC(MI, X86_AVX_CC_GE); break;
302*9a0e4156SSadaf Ebrahimi case 0xe: SStream_concat0(O, "gt"); op_addAvxCC(MI, X86_AVX_CC_GT); break;
303*9a0e4156SSadaf Ebrahimi case 0xf: SStream_concat0(O, "true"); op_addAvxCC(MI, X86_AVX_CC_TRUE); break;
304*9a0e4156SSadaf Ebrahimi case 0x10: SStream_concat0(O, "eq_os"); op_addAvxCC(MI, X86_AVX_CC_EQ_OS); break;
305*9a0e4156SSadaf Ebrahimi case 0x11: SStream_concat0(O, "lt_oq"); op_addAvxCC(MI, X86_AVX_CC_LT_OQ); break;
306*9a0e4156SSadaf Ebrahimi case 0x12: SStream_concat0(O, "le_oq"); op_addAvxCC(MI, X86_AVX_CC_LE_OQ); break;
307*9a0e4156SSadaf Ebrahimi case 0x13: SStream_concat0(O, "unord_s"); op_addAvxCC(MI, X86_AVX_CC_UNORD_S); break;
308*9a0e4156SSadaf Ebrahimi case 0x14: SStream_concat0(O, "neq_us"); op_addAvxCC(MI, X86_AVX_CC_NEQ_US); break;
309*9a0e4156SSadaf Ebrahimi case 0x15: SStream_concat0(O, "nlt_uq"); op_addAvxCC(MI, X86_AVX_CC_NLT_UQ); break;
310*9a0e4156SSadaf Ebrahimi case 0x16: SStream_concat0(O, "nle_uq"); op_addAvxCC(MI, X86_AVX_CC_NLE_UQ); break;
311*9a0e4156SSadaf Ebrahimi case 0x17: SStream_concat0(O, "ord_s"); op_addAvxCC(MI, X86_AVX_CC_ORD_S); break;
312*9a0e4156SSadaf Ebrahimi case 0x18: SStream_concat0(O, "eq_us"); op_addAvxCC(MI, X86_AVX_CC_EQ_US); break;
313*9a0e4156SSadaf Ebrahimi case 0x19: SStream_concat0(O, "nge_uq"); op_addAvxCC(MI, X86_AVX_CC_NGE_UQ); break;
314*9a0e4156SSadaf Ebrahimi case 0x1a: SStream_concat0(O, "ngt_uq"); op_addAvxCC(MI, X86_AVX_CC_NGT_UQ); break;
315*9a0e4156SSadaf Ebrahimi case 0x1b: SStream_concat0(O, "false_os"); op_addAvxCC(MI, X86_AVX_CC_FALSE_OS); break;
316*9a0e4156SSadaf Ebrahimi case 0x1c: SStream_concat0(O, "neq_os"); op_addAvxCC(MI, X86_AVX_CC_NEQ_OS); break;
317*9a0e4156SSadaf Ebrahimi case 0x1d: SStream_concat0(O, "ge_oq"); op_addAvxCC(MI, X86_AVX_CC_GE_OQ); break;
318*9a0e4156SSadaf Ebrahimi case 0x1e: SStream_concat0(O, "gt_oq"); op_addAvxCC(MI, X86_AVX_CC_GT_OQ); break;
319*9a0e4156SSadaf Ebrahimi case 0x1f: SStream_concat0(O, "true_us"); op_addAvxCC(MI, X86_AVX_CC_TRUE_US); break;
320*9a0e4156SSadaf Ebrahimi }
321*9a0e4156SSadaf Ebrahimi
322*9a0e4156SSadaf Ebrahimi MI->popcode_adjust = Imm + 1;
323*9a0e4156SSadaf Ebrahimi }
324*9a0e4156SSadaf Ebrahimi
printXOPCC(MCInst * MI,unsigned Op,SStream * O)325*9a0e4156SSadaf Ebrahimi static void printXOPCC(MCInst *MI, unsigned Op, SStream *O)
326*9a0e4156SSadaf Ebrahimi {
327*9a0e4156SSadaf Ebrahimi int64_t Imm = MCOperand_getImm(MCInst_getOperand(MI, Op));
328*9a0e4156SSadaf Ebrahimi
329*9a0e4156SSadaf Ebrahimi switch (Imm) {
330*9a0e4156SSadaf Ebrahimi default: // llvm_unreachable("Invalid xopcc argument!");
331*9a0e4156SSadaf Ebrahimi case 0: SStream_concat0(O, "lt"); op_addXopCC(MI, X86_XOP_CC_LT); break;
332*9a0e4156SSadaf Ebrahimi case 1: SStream_concat0(O, "le"); op_addXopCC(MI, X86_XOP_CC_LE); break;
333*9a0e4156SSadaf Ebrahimi case 2: SStream_concat0(O, "gt"); op_addXopCC(MI, X86_XOP_CC_GT); break;
334*9a0e4156SSadaf Ebrahimi case 3: SStream_concat0(O, "ge"); op_addXopCC(MI, X86_XOP_CC_GE); break;
335*9a0e4156SSadaf Ebrahimi case 4: SStream_concat0(O, "eq"); op_addXopCC(MI, X86_XOP_CC_EQ); break;
336*9a0e4156SSadaf Ebrahimi case 5: SStream_concat0(O, "neq"); op_addXopCC(MI, X86_XOP_CC_NEQ); break;
337*9a0e4156SSadaf Ebrahimi case 6: SStream_concat0(O, "false"); op_addXopCC(MI, X86_XOP_CC_FALSE); break;
338*9a0e4156SSadaf Ebrahimi case 7: SStream_concat0(O, "true"); op_addXopCC(MI, X86_XOP_CC_TRUE); break;
339*9a0e4156SSadaf Ebrahimi }
340*9a0e4156SSadaf Ebrahimi }
341*9a0e4156SSadaf Ebrahimi
printRoundingControl(MCInst * MI,unsigned Op,SStream * O)342*9a0e4156SSadaf Ebrahimi static void printRoundingControl(MCInst *MI, unsigned Op, SStream *O)
343*9a0e4156SSadaf Ebrahimi {
344*9a0e4156SSadaf Ebrahimi int64_t Imm = MCOperand_getImm(MCInst_getOperand(MI, Op)) & 0x3;
345*9a0e4156SSadaf Ebrahimi switch (Imm) {
346*9a0e4156SSadaf Ebrahimi case 0: SStream_concat0(O, "{rn-sae}"); op_addAvxSae(MI); op_addAvxRoundingMode(MI, X86_AVX_RM_RN); break;
347*9a0e4156SSadaf Ebrahimi case 1: SStream_concat0(O, "{rd-sae}"); op_addAvxSae(MI); op_addAvxRoundingMode(MI, X86_AVX_RM_RD); break;
348*9a0e4156SSadaf Ebrahimi case 2: SStream_concat0(O, "{ru-sae}"); op_addAvxSae(MI); op_addAvxRoundingMode(MI, X86_AVX_RM_RU); break;
349*9a0e4156SSadaf Ebrahimi case 3: SStream_concat0(O, "{rz-sae}"); op_addAvxSae(MI); op_addAvxRoundingMode(MI, X86_AVX_RM_RZ); break;
350*9a0e4156SSadaf Ebrahimi default: break; // never reach
351*9a0e4156SSadaf Ebrahimi }
352*9a0e4156SSadaf Ebrahimi }
353*9a0e4156SSadaf Ebrahimi
354*9a0e4156SSadaf Ebrahimi #endif
355*9a0e4156SSadaf Ebrahimi
356*9a0e4156SSadaf Ebrahimi static const char *getRegisterName(unsigned RegNo);
printRegName(SStream * OS,unsigned RegNo)357*9a0e4156SSadaf Ebrahimi static void printRegName(SStream *OS, unsigned RegNo)
358*9a0e4156SSadaf Ebrahimi {
359*9a0e4156SSadaf Ebrahimi SStream_concat0(OS, getRegisterName(RegNo));
360*9a0e4156SSadaf Ebrahimi }
361*9a0e4156SSadaf Ebrahimi
362*9a0e4156SSadaf Ebrahimi // for MASM syntax, 0x123 = 123h, 0xA123 = 0A123h
363*9a0e4156SSadaf Ebrahimi // this function tell us if we need to have prefix 0 in front of a number
need_zero_prefix(uint64_t imm)364*9a0e4156SSadaf Ebrahimi static bool need_zero_prefix(uint64_t imm)
365*9a0e4156SSadaf Ebrahimi {
366*9a0e4156SSadaf Ebrahimi // find the first hex letter representing imm
367*9a0e4156SSadaf Ebrahimi while(imm >= 0x10)
368*9a0e4156SSadaf Ebrahimi imm >>= 4;
369*9a0e4156SSadaf Ebrahimi
370*9a0e4156SSadaf Ebrahimi if (imm < 0xa)
371*9a0e4156SSadaf Ebrahimi return false;
372*9a0e4156SSadaf Ebrahimi else // this need 0 prefix
373*9a0e4156SSadaf Ebrahimi return true;
374*9a0e4156SSadaf Ebrahimi }
375*9a0e4156SSadaf Ebrahimi
printImm(MCInst * MI,SStream * O,int64_t imm,bool positive)376*9a0e4156SSadaf Ebrahimi static void printImm(MCInst *MI, SStream *O, int64_t imm, bool positive)
377*9a0e4156SSadaf Ebrahimi {
378*9a0e4156SSadaf Ebrahimi if (positive) {
379*9a0e4156SSadaf Ebrahimi // always print this number in positive form
380*9a0e4156SSadaf Ebrahimi if (MI->csh->syntax == CS_OPT_SYNTAX_MASM) {
381*9a0e4156SSadaf Ebrahimi if (imm < 0) {
382*9a0e4156SSadaf Ebrahimi if (MI->op1_size) {
383*9a0e4156SSadaf Ebrahimi switch(MI->op1_size) {
384*9a0e4156SSadaf Ebrahimi default:
385*9a0e4156SSadaf Ebrahimi break;
386*9a0e4156SSadaf Ebrahimi case 1:
387*9a0e4156SSadaf Ebrahimi imm &= 0xff;
388*9a0e4156SSadaf Ebrahimi break;
389*9a0e4156SSadaf Ebrahimi case 2:
390*9a0e4156SSadaf Ebrahimi imm &= 0xffff;
391*9a0e4156SSadaf Ebrahimi break;
392*9a0e4156SSadaf Ebrahimi case 4:
393*9a0e4156SSadaf Ebrahimi imm &= 0xffffffff;
394*9a0e4156SSadaf Ebrahimi break;
395*9a0e4156SSadaf Ebrahimi }
396*9a0e4156SSadaf Ebrahimi }
397*9a0e4156SSadaf Ebrahimi
398*9a0e4156SSadaf Ebrahimi if (imm == 0x8000000000000000LL) // imm == -imm
399*9a0e4156SSadaf Ebrahimi SStream_concat0(O, "8000000000000000h");
400*9a0e4156SSadaf Ebrahimi else if (need_zero_prefix(imm))
401*9a0e4156SSadaf Ebrahimi SStream_concat(O, "0%"PRIx64"h", imm);
402*9a0e4156SSadaf Ebrahimi else
403*9a0e4156SSadaf Ebrahimi SStream_concat(O, "%"PRIx64"h", imm);
404*9a0e4156SSadaf Ebrahimi } else {
405*9a0e4156SSadaf Ebrahimi if (imm > HEX_THRESHOLD) {
406*9a0e4156SSadaf Ebrahimi if (need_zero_prefix(imm))
407*9a0e4156SSadaf Ebrahimi SStream_concat(O, "0%"PRIx64"h", imm);
408*9a0e4156SSadaf Ebrahimi else
409*9a0e4156SSadaf Ebrahimi SStream_concat(O, "%"PRIx64"h", imm);
410*9a0e4156SSadaf Ebrahimi } else
411*9a0e4156SSadaf Ebrahimi SStream_concat(O, "%"PRIu64, imm);
412*9a0e4156SSadaf Ebrahimi }
413*9a0e4156SSadaf Ebrahimi } else { // Intel syntax
414*9a0e4156SSadaf Ebrahimi if (imm < 0) {
415*9a0e4156SSadaf Ebrahimi if (MI->op1_size) {
416*9a0e4156SSadaf Ebrahimi switch(MI->op1_size) {
417*9a0e4156SSadaf Ebrahimi default:
418*9a0e4156SSadaf Ebrahimi break;
419*9a0e4156SSadaf Ebrahimi case 1:
420*9a0e4156SSadaf Ebrahimi imm &= 0xff;
421*9a0e4156SSadaf Ebrahimi break;
422*9a0e4156SSadaf Ebrahimi case 2:
423*9a0e4156SSadaf Ebrahimi imm &= 0xffff;
424*9a0e4156SSadaf Ebrahimi break;
425*9a0e4156SSadaf Ebrahimi case 4:
426*9a0e4156SSadaf Ebrahimi imm &= 0xffffffff;
427*9a0e4156SSadaf Ebrahimi break;
428*9a0e4156SSadaf Ebrahimi }
429*9a0e4156SSadaf Ebrahimi }
430*9a0e4156SSadaf Ebrahimi
431*9a0e4156SSadaf Ebrahimi SStream_concat(O, "0x%"PRIx64, imm);
432*9a0e4156SSadaf Ebrahimi } else {
433*9a0e4156SSadaf Ebrahimi if (imm > HEX_THRESHOLD)
434*9a0e4156SSadaf Ebrahimi SStream_concat(O, "0x%"PRIx64, imm);
435*9a0e4156SSadaf Ebrahimi else
436*9a0e4156SSadaf Ebrahimi SStream_concat(O, "%"PRIu64, imm);
437*9a0e4156SSadaf Ebrahimi }
438*9a0e4156SSadaf Ebrahimi }
439*9a0e4156SSadaf Ebrahimi } else {
440*9a0e4156SSadaf Ebrahimi if (MI->csh->syntax == CS_OPT_SYNTAX_MASM) {
441*9a0e4156SSadaf Ebrahimi if (imm < 0) {
442*9a0e4156SSadaf Ebrahimi if (imm == 0x8000000000000000LL) // imm == -imm
443*9a0e4156SSadaf Ebrahimi SStream_concat0(O, "8000000000000000h");
444*9a0e4156SSadaf Ebrahimi else if (imm < -HEX_THRESHOLD) {
445*9a0e4156SSadaf Ebrahimi if (need_zero_prefix(imm))
446*9a0e4156SSadaf Ebrahimi SStream_concat(O, "-0%"PRIx64"h", -imm);
447*9a0e4156SSadaf Ebrahimi else
448*9a0e4156SSadaf Ebrahimi SStream_concat(O, "-%"PRIx64"h", -imm);
449*9a0e4156SSadaf Ebrahimi } else
450*9a0e4156SSadaf Ebrahimi SStream_concat(O, "-%"PRIu64, -imm);
451*9a0e4156SSadaf Ebrahimi } else {
452*9a0e4156SSadaf Ebrahimi if (imm > HEX_THRESHOLD) {
453*9a0e4156SSadaf Ebrahimi if (need_zero_prefix(imm))
454*9a0e4156SSadaf Ebrahimi SStream_concat(O, "0%"PRIx64"h", imm);
455*9a0e4156SSadaf Ebrahimi else
456*9a0e4156SSadaf Ebrahimi SStream_concat(O, "%"PRIx64"h", imm);
457*9a0e4156SSadaf Ebrahimi } else
458*9a0e4156SSadaf Ebrahimi SStream_concat(O, "%"PRIu64, imm);
459*9a0e4156SSadaf Ebrahimi }
460*9a0e4156SSadaf Ebrahimi } else { // Intel syntax
461*9a0e4156SSadaf Ebrahimi if (imm < 0) {
462*9a0e4156SSadaf Ebrahimi if (imm == 0x8000000000000000LL) // imm == -imm
463*9a0e4156SSadaf Ebrahimi SStream_concat0(O, "0x8000000000000000");
464*9a0e4156SSadaf Ebrahimi else if (imm < -HEX_THRESHOLD)
465*9a0e4156SSadaf Ebrahimi SStream_concat(O, "-0x%"PRIx64, -imm);
466*9a0e4156SSadaf Ebrahimi else
467*9a0e4156SSadaf Ebrahimi SStream_concat(O, "-%"PRIu64, -imm);
468*9a0e4156SSadaf Ebrahimi
469*9a0e4156SSadaf Ebrahimi } else {
470*9a0e4156SSadaf Ebrahimi if (imm > HEX_THRESHOLD)
471*9a0e4156SSadaf Ebrahimi SStream_concat(O, "0x%"PRIx64, imm);
472*9a0e4156SSadaf Ebrahimi else
473*9a0e4156SSadaf Ebrahimi SStream_concat(O, "%"PRIu64, imm);
474*9a0e4156SSadaf Ebrahimi }
475*9a0e4156SSadaf Ebrahimi }
476*9a0e4156SSadaf Ebrahimi }
477*9a0e4156SSadaf Ebrahimi }
478*9a0e4156SSadaf Ebrahimi
479*9a0e4156SSadaf Ebrahimi // local printOperand, without updating public operands
_printOperand(MCInst * MI,unsigned OpNo,SStream * O)480*9a0e4156SSadaf Ebrahimi static void _printOperand(MCInst *MI, unsigned OpNo, SStream *O)
481*9a0e4156SSadaf Ebrahimi {
482*9a0e4156SSadaf Ebrahimi MCOperand *Op = MCInst_getOperand(MI, OpNo);
483*9a0e4156SSadaf Ebrahimi if (MCOperand_isReg(Op)) {
484*9a0e4156SSadaf Ebrahimi printRegName(O, MCOperand_getReg(Op));
485*9a0e4156SSadaf Ebrahimi } else if (MCOperand_isImm(Op)) {
486*9a0e4156SSadaf Ebrahimi int64_t imm = MCOperand_getImm(Op);
487*9a0e4156SSadaf Ebrahimi printImm(MI, O, imm, MI->csh->imm_unsigned);
488*9a0e4156SSadaf Ebrahimi }
489*9a0e4156SSadaf Ebrahimi }
490*9a0e4156SSadaf Ebrahimi
491*9a0e4156SSadaf Ebrahimi #ifndef CAPSTONE_DIET
492*9a0e4156SSadaf Ebrahimi // copy & normalize access info
get_op_access(cs_struct * h,unsigned int id,uint8_t * access,uint64_t * eflags)493*9a0e4156SSadaf Ebrahimi static void get_op_access(cs_struct *h, unsigned int id, uint8_t *access, uint64_t *eflags)
494*9a0e4156SSadaf Ebrahimi {
495*9a0e4156SSadaf Ebrahimi #ifndef CAPSTONE_DIET
496*9a0e4156SSadaf Ebrahimi uint8_t i;
497*9a0e4156SSadaf Ebrahimi uint8_t *arr = X86_get_op_access(h, id, eflags);
498*9a0e4156SSadaf Ebrahimi
499*9a0e4156SSadaf Ebrahimi if (!arr) {
500*9a0e4156SSadaf Ebrahimi access[0] = 0;
501*9a0e4156SSadaf Ebrahimi return;
502*9a0e4156SSadaf Ebrahimi }
503*9a0e4156SSadaf Ebrahimi
504*9a0e4156SSadaf Ebrahimi // copy to access but zero out CS_AC_IGNORE
505*9a0e4156SSadaf Ebrahimi for(i = 0; arr[i]; i++) {
506*9a0e4156SSadaf Ebrahimi if (arr[i] != CS_AC_IGNORE)
507*9a0e4156SSadaf Ebrahimi access[i] = arr[i];
508*9a0e4156SSadaf Ebrahimi else
509*9a0e4156SSadaf Ebrahimi access[i] = 0;
510*9a0e4156SSadaf Ebrahimi }
511*9a0e4156SSadaf Ebrahimi
512*9a0e4156SSadaf Ebrahimi // mark the end of array
513*9a0e4156SSadaf Ebrahimi access[i] = 0;
514*9a0e4156SSadaf Ebrahimi #endif
515*9a0e4156SSadaf Ebrahimi }
516*9a0e4156SSadaf Ebrahimi #endif
517*9a0e4156SSadaf Ebrahimi
printSrcIdx(MCInst * MI,unsigned Op,SStream * O)518*9a0e4156SSadaf Ebrahimi static void printSrcIdx(MCInst *MI, unsigned Op, SStream *O)
519*9a0e4156SSadaf Ebrahimi {
520*9a0e4156SSadaf Ebrahimi MCOperand *SegReg;
521*9a0e4156SSadaf Ebrahimi int reg;
522*9a0e4156SSadaf Ebrahimi
523*9a0e4156SSadaf Ebrahimi if (MI->csh->detail) {
524*9a0e4156SSadaf Ebrahimi #ifndef CAPSTONE_DIET
525*9a0e4156SSadaf Ebrahimi uint8_t access[6];
526*9a0e4156SSadaf Ebrahimi #endif
527*9a0e4156SSadaf Ebrahimi
528*9a0e4156SSadaf Ebrahimi MI->flat_insn->detail->x86.operands[MI->flat_insn->detail->x86.op_count].type = X86_OP_MEM;
529*9a0e4156SSadaf Ebrahimi MI->flat_insn->detail->x86.operands[MI->flat_insn->detail->x86.op_count].size = MI->x86opsize;
530*9a0e4156SSadaf Ebrahimi MI->flat_insn->detail->x86.operands[MI->flat_insn->detail->x86.op_count].mem.segment = X86_REG_INVALID;
531*9a0e4156SSadaf Ebrahimi MI->flat_insn->detail->x86.operands[MI->flat_insn->detail->x86.op_count].mem.base = X86_REG_INVALID;
532*9a0e4156SSadaf Ebrahimi MI->flat_insn->detail->x86.operands[MI->flat_insn->detail->x86.op_count].mem.index = X86_REG_INVALID;
533*9a0e4156SSadaf Ebrahimi MI->flat_insn->detail->x86.operands[MI->flat_insn->detail->x86.op_count].mem.scale = 1;
534*9a0e4156SSadaf Ebrahimi MI->flat_insn->detail->x86.operands[MI->flat_insn->detail->x86.op_count].mem.disp = 0;
535*9a0e4156SSadaf Ebrahimi
536*9a0e4156SSadaf Ebrahimi #ifndef CAPSTONE_DIET
537*9a0e4156SSadaf Ebrahimi get_op_access(MI->csh, MCInst_getOpcode(MI), access, &MI->flat_insn->detail->x86.eflags);
538*9a0e4156SSadaf Ebrahimi MI->flat_insn->detail->x86.operands[MI->flat_insn->detail->x86.op_count].access = access[MI->flat_insn->detail->x86.op_count];
539*9a0e4156SSadaf Ebrahimi #endif
540*9a0e4156SSadaf Ebrahimi }
541*9a0e4156SSadaf Ebrahimi
542*9a0e4156SSadaf Ebrahimi SegReg = MCInst_getOperand(MI, Op+1);
543*9a0e4156SSadaf Ebrahimi reg = MCOperand_getReg(SegReg);
544*9a0e4156SSadaf Ebrahimi
545*9a0e4156SSadaf Ebrahimi // If this has a segment register, print it.
546*9a0e4156SSadaf Ebrahimi if (reg) {
547*9a0e4156SSadaf Ebrahimi _printOperand(MI, Op+1, O);
548*9a0e4156SSadaf Ebrahimi if (MI->csh->detail) {
549*9a0e4156SSadaf Ebrahimi MI->flat_insn->detail->x86.operands[MI->flat_insn->detail->x86.op_count].mem.segment = reg;
550*9a0e4156SSadaf Ebrahimi }
551*9a0e4156SSadaf Ebrahimi SStream_concat0(O, ":");
552*9a0e4156SSadaf Ebrahimi }
553*9a0e4156SSadaf Ebrahimi
554*9a0e4156SSadaf Ebrahimi SStream_concat0(O, "[");
555*9a0e4156SSadaf Ebrahimi set_mem_access(MI, true);
556*9a0e4156SSadaf Ebrahimi printOperand(MI, Op, O);
557*9a0e4156SSadaf Ebrahimi SStream_concat0(O, "]");
558*9a0e4156SSadaf Ebrahimi set_mem_access(MI, false);
559*9a0e4156SSadaf Ebrahimi }
560*9a0e4156SSadaf Ebrahimi
printDstIdx(MCInst * MI,unsigned Op,SStream * O)561*9a0e4156SSadaf Ebrahimi static void printDstIdx(MCInst *MI, unsigned Op, SStream *O)
562*9a0e4156SSadaf Ebrahimi {
563*9a0e4156SSadaf Ebrahimi if (MI->csh->detail) {
564*9a0e4156SSadaf Ebrahimi #ifndef CAPSTONE_DIET
565*9a0e4156SSadaf Ebrahimi uint8_t access[6];
566*9a0e4156SSadaf Ebrahimi #endif
567*9a0e4156SSadaf Ebrahimi
568*9a0e4156SSadaf Ebrahimi MI->flat_insn->detail->x86.operands[MI->flat_insn->detail->x86.op_count].type = X86_OP_MEM;
569*9a0e4156SSadaf Ebrahimi MI->flat_insn->detail->x86.operands[MI->flat_insn->detail->x86.op_count].size = MI->x86opsize;
570*9a0e4156SSadaf Ebrahimi MI->flat_insn->detail->x86.operands[MI->flat_insn->detail->x86.op_count].mem.segment = X86_REG_INVALID;
571*9a0e4156SSadaf Ebrahimi MI->flat_insn->detail->x86.operands[MI->flat_insn->detail->x86.op_count].mem.base = X86_REG_INVALID;
572*9a0e4156SSadaf Ebrahimi MI->flat_insn->detail->x86.operands[MI->flat_insn->detail->x86.op_count].mem.index = X86_REG_INVALID;
573*9a0e4156SSadaf Ebrahimi MI->flat_insn->detail->x86.operands[MI->flat_insn->detail->x86.op_count].mem.scale = 1;
574*9a0e4156SSadaf Ebrahimi MI->flat_insn->detail->x86.operands[MI->flat_insn->detail->x86.op_count].mem.disp = 0;
575*9a0e4156SSadaf Ebrahimi
576*9a0e4156SSadaf Ebrahimi #ifndef CAPSTONE_DIET
577*9a0e4156SSadaf Ebrahimi get_op_access(MI->csh, MCInst_getOpcode(MI), access, &MI->flat_insn->detail->x86.eflags);
578*9a0e4156SSadaf Ebrahimi MI->flat_insn->detail->x86.operands[MI->flat_insn->detail->x86.op_count].access = access[MI->flat_insn->detail->x86.op_count];
579*9a0e4156SSadaf Ebrahimi #endif
580*9a0e4156SSadaf Ebrahimi }
581*9a0e4156SSadaf Ebrahimi
582*9a0e4156SSadaf Ebrahimi // DI accesses are always ES-based on non-64bit mode
583*9a0e4156SSadaf Ebrahimi if (MI->csh->mode != CS_MODE_64) {
584*9a0e4156SSadaf Ebrahimi SStream_concat(O, "es:[");
585*9a0e4156SSadaf Ebrahimi if (MI->csh->detail) {
586*9a0e4156SSadaf Ebrahimi MI->flat_insn->detail->x86.operands[MI->flat_insn->detail->x86.op_count].mem.segment = X86_REG_ES;
587*9a0e4156SSadaf Ebrahimi }
588*9a0e4156SSadaf Ebrahimi } else
589*9a0e4156SSadaf Ebrahimi SStream_concat(O, "[");
590*9a0e4156SSadaf Ebrahimi
591*9a0e4156SSadaf Ebrahimi set_mem_access(MI, true);
592*9a0e4156SSadaf Ebrahimi printOperand(MI, Op, O);
593*9a0e4156SSadaf Ebrahimi SStream_concat0(O, "]");
594*9a0e4156SSadaf Ebrahimi set_mem_access(MI, false);
595*9a0e4156SSadaf Ebrahimi }
596*9a0e4156SSadaf Ebrahimi
printSrcIdx8(MCInst * MI,unsigned OpNo,SStream * O)597*9a0e4156SSadaf Ebrahimi static void printSrcIdx8(MCInst *MI, unsigned OpNo, SStream *O)
598*9a0e4156SSadaf Ebrahimi {
599*9a0e4156SSadaf Ebrahimi SStream_concat0(O, "byte ptr ");
600*9a0e4156SSadaf Ebrahimi MI->x86opsize = 1;
601*9a0e4156SSadaf Ebrahimi printSrcIdx(MI, OpNo, O);
602*9a0e4156SSadaf Ebrahimi }
603*9a0e4156SSadaf Ebrahimi
printSrcIdx16(MCInst * MI,unsigned OpNo,SStream * O)604*9a0e4156SSadaf Ebrahimi static void printSrcIdx16(MCInst *MI, unsigned OpNo, SStream *O)
605*9a0e4156SSadaf Ebrahimi {
606*9a0e4156SSadaf Ebrahimi SStream_concat0(O, "word ptr ");
607*9a0e4156SSadaf Ebrahimi MI->x86opsize = 2;
608*9a0e4156SSadaf Ebrahimi printSrcIdx(MI, OpNo, O);
609*9a0e4156SSadaf Ebrahimi }
610*9a0e4156SSadaf Ebrahimi
printSrcIdx32(MCInst * MI,unsigned OpNo,SStream * O)611*9a0e4156SSadaf Ebrahimi static void printSrcIdx32(MCInst *MI, unsigned OpNo, SStream *O)
612*9a0e4156SSadaf Ebrahimi {
613*9a0e4156SSadaf Ebrahimi SStream_concat0(O, "dword ptr ");
614*9a0e4156SSadaf Ebrahimi MI->x86opsize = 4;
615*9a0e4156SSadaf Ebrahimi printSrcIdx(MI, OpNo, O);
616*9a0e4156SSadaf Ebrahimi }
617*9a0e4156SSadaf Ebrahimi
printSrcIdx64(MCInst * MI,unsigned OpNo,SStream * O)618*9a0e4156SSadaf Ebrahimi static void printSrcIdx64(MCInst *MI, unsigned OpNo, SStream *O)
619*9a0e4156SSadaf Ebrahimi {
620*9a0e4156SSadaf Ebrahimi SStream_concat0(O, "qword ptr ");
621*9a0e4156SSadaf Ebrahimi MI->x86opsize = 8;
622*9a0e4156SSadaf Ebrahimi printSrcIdx(MI, OpNo, O);
623*9a0e4156SSadaf Ebrahimi }
624*9a0e4156SSadaf Ebrahimi
printDstIdx8(MCInst * MI,unsigned OpNo,SStream * O)625*9a0e4156SSadaf Ebrahimi static void printDstIdx8(MCInst *MI, unsigned OpNo, SStream *O)
626*9a0e4156SSadaf Ebrahimi {
627*9a0e4156SSadaf Ebrahimi SStream_concat0(O, "byte ptr ");
628*9a0e4156SSadaf Ebrahimi MI->x86opsize = 1;
629*9a0e4156SSadaf Ebrahimi printDstIdx(MI, OpNo, O);
630*9a0e4156SSadaf Ebrahimi }
631*9a0e4156SSadaf Ebrahimi
printDstIdx16(MCInst * MI,unsigned OpNo,SStream * O)632*9a0e4156SSadaf Ebrahimi static void printDstIdx16(MCInst *MI, unsigned OpNo, SStream *O)
633*9a0e4156SSadaf Ebrahimi {
634*9a0e4156SSadaf Ebrahimi SStream_concat0(O, "word ptr ");
635*9a0e4156SSadaf Ebrahimi MI->x86opsize = 2;
636*9a0e4156SSadaf Ebrahimi printDstIdx(MI, OpNo, O);
637*9a0e4156SSadaf Ebrahimi }
638*9a0e4156SSadaf Ebrahimi
printDstIdx32(MCInst * MI,unsigned OpNo,SStream * O)639*9a0e4156SSadaf Ebrahimi static void printDstIdx32(MCInst *MI, unsigned OpNo, SStream *O)
640*9a0e4156SSadaf Ebrahimi {
641*9a0e4156SSadaf Ebrahimi SStream_concat0(O, "dword ptr ");
642*9a0e4156SSadaf Ebrahimi MI->x86opsize = 4;
643*9a0e4156SSadaf Ebrahimi printDstIdx(MI, OpNo, O);
644*9a0e4156SSadaf Ebrahimi }
645*9a0e4156SSadaf Ebrahimi
printDstIdx64(MCInst * MI,unsigned OpNo,SStream * O)646*9a0e4156SSadaf Ebrahimi static void printDstIdx64(MCInst *MI, unsigned OpNo, SStream *O)
647*9a0e4156SSadaf Ebrahimi {
648*9a0e4156SSadaf Ebrahimi SStream_concat0(O, "qword ptr ");
649*9a0e4156SSadaf Ebrahimi MI->x86opsize = 8;
650*9a0e4156SSadaf Ebrahimi printDstIdx(MI, OpNo, O);
651*9a0e4156SSadaf Ebrahimi }
652*9a0e4156SSadaf Ebrahimi
printMemOffset(MCInst * MI,unsigned Op,SStream * O)653*9a0e4156SSadaf Ebrahimi static void printMemOffset(MCInst *MI, unsigned Op, SStream *O)
654*9a0e4156SSadaf Ebrahimi {
655*9a0e4156SSadaf Ebrahimi MCOperand *DispSpec = MCInst_getOperand(MI, Op);
656*9a0e4156SSadaf Ebrahimi MCOperand *SegReg = MCInst_getOperand(MI, Op + 1);
657*9a0e4156SSadaf Ebrahimi int reg;
658*9a0e4156SSadaf Ebrahimi
659*9a0e4156SSadaf Ebrahimi if (MI->csh->detail) {
660*9a0e4156SSadaf Ebrahimi #ifndef CAPSTONE_DIET
661*9a0e4156SSadaf Ebrahimi uint8_t access[6];
662*9a0e4156SSadaf Ebrahimi #endif
663*9a0e4156SSadaf Ebrahimi
664*9a0e4156SSadaf Ebrahimi MI->flat_insn->detail->x86.operands[MI->flat_insn->detail->x86.op_count].type = X86_OP_MEM;
665*9a0e4156SSadaf Ebrahimi MI->flat_insn->detail->x86.operands[MI->flat_insn->detail->x86.op_count].size = MI->x86opsize;
666*9a0e4156SSadaf Ebrahimi MI->flat_insn->detail->x86.operands[MI->flat_insn->detail->x86.op_count].mem.segment = X86_REG_INVALID;
667*9a0e4156SSadaf Ebrahimi MI->flat_insn->detail->x86.operands[MI->flat_insn->detail->x86.op_count].mem.base = X86_REG_INVALID;
668*9a0e4156SSadaf Ebrahimi MI->flat_insn->detail->x86.operands[MI->flat_insn->detail->x86.op_count].mem.index = X86_REG_INVALID;
669*9a0e4156SSadaf Ebrahimi MI->flat_insn->detail->x86.operands[MI->flat_insn->detail->x86.op_count].mem.scale = 1;
670*9a0e4156SSadaf Ebrahimi MI->flat_insn->detail->x86.operands[MI->flat_insn->detail->x86.op_count].mem.disp = 0;
671*9a0e4156SSadaf Ebrahimi
672*9a0e4156SSadaf Ebrahimi #ifndef CAPSTONE_DIET
673*9a0e4156SSadaf Ebrahimi get_op_access(MI->csh, MCInst_getOpcode(MI), access, &MI->flat_insn->detail->x86.eflags);
674*9a0e4156SSadaf Ebrahimi MI->flat_insn->detail->x86.operands[MI->flat_insn->detail->x86.op_count].access = access[MI->flat_insn->detail->x86.op_count];
675*9a0e4156SSadaf Ebrahimi #endif
676*9a0e4156SSadaf Ebrahimi }
677*9a0e4156SSadaf Ebrahimi
678*9a0e4156SSadaf Ebrahimi // If this has a segment register, print it.
679*9a0e4156SSadaf Ebrahimi reg = MCOperand_getReg(SegReg);
680*9a0e4156SSadaf Ebrahimi if (reg) {
681*9a0e4156SSadaf Ebrahimi _printOperand(MI, Op + 1, O);
682*9a0e4156SSadaf Ebrahimi SStream_concat0(O, ":");
683*9a0e4156SSadaf Ebrahimi if (MI->csh->detail) {
684*9a0e4156SSadaf Ebrahimi MI->flat_insn->detail->x86.operands[MI->flat_insn->detail->x86.op_count].mem.segment = reg;
685*9a0e4156SSadaf Ebrahimi }
686*9a0e4156SSadaf Ebrahimi }
687*9a0e4156SSadaf Ebrahimi
688*9a0e4156SSadaf Ebrahimi SStream_concat0(O, "[");
689*9a0e4156SSadaf Ebrahimi
690*9a0e4156SSadaf Ebrahimi if (MCOperand_isImm(DispSpec)) {
691*9a0e4156SSadaf Ebrahimi int64_t imm = MCOperand_getImm(DispSpec);
692*9a0e4156SSadaf Ebrahimi if (MI->csh->detail)
693*9a0e4156SSadaf Ebrahimi MI->flat_insn->detail->x86.operands[MI->flat_insn->detail->x86.op_count].mem.disp = imm;
694*9a0e4156SSadaf Ebrahimi
695*9a0e4156SSadaf Ebrahimi if (imm < 0)
696*9a0e4156SSadaf Ebrahimi printImm(MI, O, arch_masks[MI->csh->mode] & imm, true);
697*9a0e4156SSadaf Ebrahimi else
698*9a0e4156SSadaf Ebrahimi printImm(MI, O, imm, true);
699*9a0e4156SSadaf Ebrahimi }
700*9a0e4156SSadaf Ebrahimi
701*9a0e4156SSadaf Ebrahimi SStream_concat0(O, "]");
702*9a0e4156SSadaf Ebrahimi
703*9a0e4156SSadaf Ebrahimi if (MI->csh->detail)
704*9a0e4156SSadaf Ebrahimi MI->flat_insn->detail->x86.op_count++;
705*9a0e4156SSadaf Ebrahimi
706*9a0e4156SSadaf Ebrahimi if (MI->op1_size == 0)
707*9a0e4156SSadaf Ebrahimi MI->op1_size = MI->x86opsize;
708*9a0e4156SSadaf Ebrahimi }
709*9a0e4156SSadaf Ebrahimi
710*9a0e4156SSadaf Ebrahimi #ifndef CAPSTONE_X86_REDUCE
printU8Imm(MCInst * MI,unsigned Op,SStream * O)711*9a0e4156SSadaf Ebrahimi static void printU8Imm(MCInst *MI, unsigned Op, SStream *O)
712*9a0e4156SSadaf Ebrahimi {
713*9a0e4156SSadaf Ebrahimi uint8_t val = MCOperand_getImm(MCInst_getOperand(MI, Op)) & 0xff;
714*9a0e4156SSadaf Ebrahimi
715*9a0e4156SSadaf Ebrahimi printImm(MI, O, val, true);
716*9a0e4156SSadaf Ebrahimi
717*9a0e4156SSadaf Ebrahimi if (MI->csh->detail) {
718*9a0e4156SSadaf Ebrahimi #ifndef CAPSTONE_DIET
719*9a0e4156SSadaf Ebrahimi uint8_t access[6];
720*9a0e4156SSadaf Ebrahimi #endif
721*9a0e4156SSadaf Ebrahimi
722*9a0e4156SSadaf Ebrahimi MI->flat_insn->detail->x86.operands[MI->flat_insn->detail->x86.op_count].type = X86_OP_IMM;
723*9a0e4156SSadaf Ebrahimi MI->flat_insn->detail->x86.operands[MI->flat_insn->detail->x86.op_count].imm = val;
724*9a0e4156SSadaf Ebrahimi MI->flat_insn->detail->x86.operands[MI->flat_insn->detail->x86.op_count].size = 1;
725*9a0e4156SSadaf Ebrahimi
726*9a0e4156SSadaf Ebrahimi #ifndef CAPSTONE_DIET
727*9a0e4156SSadaf Ebrahimi get_op_access(MI->csh, MCInst_getOpcode(MI), access, &MI->flat_insn->detail->x86.eflags);
728*9a0e4156SSadaf Ebrahimi MI->flat_insn->detail->x86.operands[MI->flat_insn->detail->x86.op_count].access = access[MI->flat_insn->detail->x86.op_count];
729*9a0e4156SSadaf Ebrahimi #endif
730*9a0e4156SSadaf Ebrahimi
731*9a0e4156SSadaf Ebrahimi MI->flat_insn->detail->x86.op_count++;
732*9a0e4156SSadaf Ebrahimi }
733*9a0e4156SSadaf Ebrahimi }
734*9a0e4156SSadaf Ebrahimi #endif
735*9a0e4156SSadaf Ebrahimi
printMemOffs8(MCInst * MI,unsigned OpNo,SStream * O)736*9a0e4156SSadaf Ebrahimi static void printMemOffs8(MCInst *MI, unsigned OpNo, SStream *O)
737*9a0e4156SSadaf Ebrahimi {
738*9a0e4156SSadaf Ebrahimi SStream_concat0(O, "byte ptr ");
739*9a0e4156SSadaf Ebrahimi MI->x86opsize = 1;
740*9a0e4156SSadaf Ebrahimi printMemOffset(MI, OpNo, O);
741*9a0e4156SSadaf Ebrahimi }
742*9a0e4156SSadaf Ebrahimi
printMemOffs16(MCInst * MI,unsigned OpNo,SStream * O)743*9a0e4156SSadaf Ebrahimi static void printMemOffs16(MCInst *MI, unsigned OpNo, SStream *O)
744*9a0e4156SSadaf Ebrahimi {
745*9a0e4156SSadaf Ebrahimi SStream_concat0(O, "word ptr ");
746*9a0e4156SSadaf Ebrahimi MI->x86opsize = 2;
747*9a0e4156SSadaf Ebrahimi printMemOffset(MI, OpNo, O);
748*9a0e4156SSadaf Ebrahimi }
749*9a0e4156SSadaf Ebrahimi
printMemOffs32(MCInst * MI,unsigned OpNo,SStream * O)750*9a0e4156SSadaf Ebrahimi static void printMemOffs32(MCInst *MI, unsigned OpNo, SStream *O)
751*9a0e4156SSadaf Ebrahimi {
752*9a0e4156SSadaf Ebrahimi SStream_concat0(O, "dword ptr ");
753*9a0e4156SSadaf Ebrahimi MI->x86opsize = 4;
754*9a0e4156SSadaf Ebrahimi printMemOffset(MI, OpNo, O);
755*9a0e4156SSadaf Ebrahimi }
756*9a0e4156SSadaf Ebrahimi
printMemOffs64(MCInst * MI,unsigned OpNo,SStream * O)757*9a0e4156SSadaf Ebrahimi static void printMemOffs64(MCInst *MI, unsigned OpNo, SStream *O)
758*9a0e4156SSadaf Ebrahimi {
759*9a0e4156SSadaf Ebrahimi SStream_concat0(O, "qword ptr ");
760*9a0e4156SSadaf Ebrahimi MI->x86opsize = 8;
761*9a0e4156SSadaf Ebrahimi printMemOffset(MI, OpNo, O);
762*9a0e4156SSadaf Ebrahimi }
763*9a0e4156SSadaf Ebrahimi
764*9a0e4156SSadaf Ebrahimi #ifndef CAPSTONE_DIET
765*9a0e4156SSadaf Ebrahimi static char *printAliasInstr(MCInst *MI, SStream *OS, void *info);
766*9a0e4156SSadaf Ebrahimi #endif
767*9a0e4156SSadaf Ebrahimi static void printInstruction(MCInst *MI, SStream *O, MCRegisterInfo *MRI);
768*9a0e4156SSadaf Ebrahimi
X86_Intel_printInst(MCInst * MI,SStream * O,void * Info)769*9a0e4156SSadaf Ebrahimi void X86_Intel_printInst(MCInst *MI, SStream *O, void *Info)
770*9a0e4156SSadaf Ebrahimi {
771*9a0e4156SSadaf Ebrahimi #ifndef CAPSTONE_DIET
772*9a0e4156SSadaf Ebrahimi char *mnem;
773*9a0e4156SSadaf Ebrahimi #endif
774*9a0e4156SSadaf Ebrahimi x86_reg reg, reg2;
775*9a0e4156SSadaf Ebrahimi enum cs_ac_type access1, access2;
776*9a0e4156SSadaf Ebrahimi
777*9a0e4156SSadaf Ebrahimi // perhaps this instruction does not need printer
778*9a0e4156SSadaf Ebrahimi if (MI->assembly[0]) {
779*9a0e4156SSadaf Ebrahimi strncpy(O->buffer, MI->assembly, sizeof(O->buffer));
780*9a0e4156SSadaf Ebrahimi return;
781*9a0e4156SSadaf Ebrahimi }
782*9a0e4156SSadaf Ebrahimi
783*9a0e4156SSadaf Ebrahimi #ifndef CAPSTONE_DIET
784*9a0e4156SSadaf Ebrahimi // Try to print any aliases first.
785*9a0e4156SSadaf Ebrahimi mnem = printAliasInstr(MI, O, Info);
786*9a0e4156SSadaf Ebrahimi if (mnem)
787*9a0e4156SSadaf Ebrahimi cs_mem_free(mnem);
788*9a0e4156SSadaf Ebrahimi else
789*9a0e4156SSadaf Ebrahimi #endif
790*9a0e4156SSadaf Ebrahimi printInstruction(MI, O, Info);
791*9a0e4156SSadaf Ebrahimi
792*9a0e4156SSadaf Ebrahimi reg = X86_insn_reg_intel(MCInst_getOpcode(MI), &access1);
793*9a0e4156SSadaf Ebrahimi if (MI->csh->detail) {
794*9a0e4156SSadaf Ebrahimi #ifndef CAPSTONE_DIET
795*9a0e4156SSadaf Ebrahimi uint8_t access[6] = {0};
796*9a0e4156SSadaf Ebrahimi #endif
797*9a0e4156SSadaf Ebrahimi
798*9a0e4156SSadaf Ebrahimi // first op can be embedded in the asm by llvm.
799*9a0e4156SSadaf Ebrahimi // so we have to add the missing register as the first operand
800*9a0e4156SSadaf Ebrahimi if (reg) {
801*9a0e4156SSadaf Ebrahimi // shift all the ops right to leave 1st slot for this new register op
802*9a0e4156SSadaf Ebrahimi memmove(&(MI->flat_insn->detail->x86.operands[1]), &(MI->flat_insn->detail->x86.operands[0]),
803*9a0e4156SSadaf Ebrahimi sizeof(MI->flat_insn->detail->x86.operands[0]) * (ARR_SIZE(MI->flat_insn->detail->x86.operands) - 1));
804*9a0e4156SSadaf Ebrahimi MI->flat_insn->detail->x86.operands[0].type = X86_OP_REG;
805*9a0e4156SSadaf Ebrahimi MI->flat_insn->detail->x86.operands[0].reg = reg;
806*9a0e4156SSadaf Ebrahimi MI->flat_insn->detail->x86.operands[0].size = MI->csh->regsize_map[reg];
807*9a0e4156SSadaf Ebrahimi MI->flat_insn->detail->x86.operands[0].access = access1;
808*9a0e4156SSadaf Ebrahimi MI->flat_insn->detail->x86.op_count++;
809*9a0e4156SSadaf Ebrahimi } else {
810*9a0e4156SSadaf Ebrahimi if (X86_insn_reg_intel2(MCInst_getOpcode(MI), ®, &access1, ®2, &access2)) {
811*9a0e4156SSadaf Ebrahimi MI->flat_insn->detail->x86.operands[0].type = X86_OP_REG;
812*9a0e4156SSadaf Ebrahimi MI->flat_insn->detail->x86.operands[0].reg = reg;
813*9a0e4156SSadaf Ebrahimi MI->flat_insn->detail->x86.operands[0].size = MI->csh->regsize_map[reg];
814*9a0e4156SSadaf Ebrahimi MI->flat_insn->detail->x86.operands[0].access = access1;
815*9a0e4156SSadaf Ebrahimi MI->flat_insn->detail->x86.operands[1].type = X86_OP_REG;
816*9a0e4156SSadaf Ebrahimi MI->flat_insn->detail->x86.operands[1].reg = reg2;
817*9a0e4156SSadaf Ebrahimi MI->flat_insn->detail->x86.operands[1].size = MI->csh->regsize_map[reg2];
818*9a0e4156SSadaf Ebrahimi MI->flat_insn->detail->x86.operands[1].access = access2;
819*9a0e4156SSadaf Ebrahimi MI->flat_insn->detail->x86.op_count = 2;
820*9a0e4156SSadaf Ebrahimi }
821*9a0e4156SSadaf Ebrahimi }
822*9a0e4156SSadaf Ebrahimi
823*9a0e4156SSadaf Ebrahimi #ifndef CAPSTONE_DIET
824*9a0e4156SSadaf Ebrahimi get_op_access(MI->csh, MCInst_getOpcode(MI), access, &MI->flat_insn->detail->x86.eflags);
825*9a0e4156SSadaf Ebrahimi MI->flat_insn->detail->x86.operands[0].access = access[0];
826*9a0e4156SSadaf Ebrahimi MI->flat_insn->detail->x86.operands[1].access = access[1];
827*9a0e4156SSadaf Ebrahimi #endif
828*9a0e4156SSadaf Ebrahimi }
829*9a0e4156SSadaf Ebrahimi
830*9a0e4156SSadaf Ebrahimi if (MI->op1_size == 0 && reg)
831*9a0e4156SSadaf Ebrahimi MI->op1_size = MI->csh->regsize_map[reg];
832*9a0e4156SSadaf Ebrahimi }
833*9a0e4156SSadaf Ebrahimi
834*9a0e4156SSadaf Ebrahimi /// printPCRelImm - This is used to print an immediate value that ends up
835*9a0e4156SSadaf Ebrahimi /// being encoded as a pc-relative value.
printPCRelImm(MCInst * MI,unsigned OpNo,SStream * O)836*9a0e4156SSadaf Ebrahimi static void printPCRelImm(MCInst *MI, unsigned OpNo, SStream *O)
837*9a0e4156SSadaf Ebrahimi {
838*9a0e4156SSadaf Ebrahimi MCOperand *Op = MCInst_getOperand(MI, OpNo);
839*9a0e4156SSadaf Ebrahimi if (MCOperand_isImm(Op)) {
840*9a0e4156SSadaf Ebrahimi int64_t imm = MCOperand_getImm(Op) + MI->flat_insn->size + MI->address;
841*9a0e4156SSadaf Ebrahimi uint8_t opsize = X86_immediate_size(MI->Opcode, NULL);
842*9a0e4156SSadaf Ebrahimi
843*9a0e4156SSadaf Ebrahimi // truncat imm for non-64bit
844*9a0e4156SSadaf Ebrahimi if (MI->csh->mode != CS_MODE_64) {
845*9a0e4156SSadaf Ebrahimi imm = imm & 0xffffffff;
846*9a0e4156SSadaf Ebrahimi }
847*9a0e4156SSadaf Ebrahimi
848*9a0e4156SSadaf Ebrahimi if (MI->csh->mode == CS_MODE_16 &&
849*9a0e4156SSadaf Ebrahimi (MI->Opcode != X86_JMP_4 && MI->Opcode != X86_CALLpcrel32))
850*9a0e4156SSadaf Ebrahimi imm = imm & 0xffff;
851*9a0e4156SSadaf Ebrahimi
852*9a0e4156SSadaf Ebrahimi // Hack: X86 16bit with opcode X86_JMP_4
853*9a0e4156SSadaf Ebrahimi if (MI->csh->mode == CS_MODE_16 &&
854*9a0e4156SSadaf Ebrahimi (MI->Opcode == X86_JMP_4 && MI->x86_prefix[2] != 0x66))
855*9a0e4156SSadaf Ebrahimi imm = imm & 0xffff;
856*9a0e4156SSadaf Ebrahimi
857*9a0e4156SSadaf Ebrahimi // CALL/JMP rel16 is special
858*9a0e4156SSadaf Ebrahimi if (MI->Opcode == X86_CALLpcrel16 || MI->Opcode == X86_JMP_2)
859*9a0e4156SSadaf Ebrahimi imm = imm & 0xffff;
860*9a0e4156SSadaf Ebrahimi
861*9a0e4156SSadaf Ebrahimi printImm(MI, O, imm, true);
862*9a0e4156SSadaf Ebrahimi
863*9a0e4156SSadaf Ebrahimi if (MI->csh->detail) {
864*9a0e4156SSadaf Ebrahimi #ifndef CAPSTONE_DIET
865*9a0e4156SSadaf Ebrahimi uint8_t access[6];
866*9a0e4156SSadaf Ebrahimi #endif
867*9a0e4156SSadaf Ebrahimi
868*9a0e4156SSadaf Ebrahimi MI->flat_insn->detail->x86.operands[MI->flat_insn->detail->x86.op_count].type = X86_OP_IMM;
869*9a0e4156SSadaf Ebrahimi // if op_count > 0, then this operand's size is taken from the destination op
870*9a0e4156SSadaf Ebrahimi if (MI->flat_insn->detail->x86.op_count > 0)
871*9a0e4156SSadaf Ebrahimi MI->flat_insn->detail->x86.operands[MI->flat_insn->detail->x86.op_count].size = MI->flat_insn->detail->x86.operands[0].size;
872*9a0e4156SSadaf Ebrahimi else if (opsize > 0)
873*9a0e4156SSadaf Ebrahimi MI->flat_insn->detail->x86.operands[MI->flat_insn->detail->x86.op_count].size = opsize;
874*9a0e4156SSadaf Ebrahimi else
875*9a0e4156SSadaf Ebrahimi MI->flat_insn->detail->x86.operands[MI->flat_insn->detail->x86.op_count].size = MI->imm_size;
876*9a0e4156SSadaf Ebrahimi MI->flat_insn->detail->x86.operands[MI->flat_insn->detail->x86.op_count].imm = imm;
877*9a0e4156SSadaf Ebrahimi
878*9a0e4156SSadaf Ebrahimi #ifndef CAPSTONE_DIET
879*9a0e4156SSadaf Ebrahimi get_op_access(MI->csh, MCInst_getOpcode(MI), access, &MI->flat_insn->detail->x86.eflags);
880*9a0e4156SSadaf Ebrahimi MI->flat_insn->detail->x86.operands[MI->flat_insn->detail->x86.op_count].access = access[MI->flat_insn->detail->x86.op_count];
881*9a0e4156SSadaf Ebrahimi #endif
882*9a0e4156SSadaf Ebrahimi
883*9a0e4156SSadaf Ebrahimi MI->flat_insn->detail->x86.op_count++;
884*9a0e4156SSadaf Ebrahimi }
885*9a0e4156SSadaf Ebrahimi
886*9a0e4156SSadaf Ebrahimi if (MI->op1_size == 0)
887*9a0e4156SSadaf Ebrahimi MI->op1_size = MI->imm_size;
888*9a0e4156SSadaf Ebrahimi }
889*9a0e4156SSadaf Ebrahimi }
890*9a0e4156SSadaf Ebrahimi
printOperand(MCInst * MI,unsigned OpNo,SStream * O)891*9a0e4156SSadaf Ebrahimi static void printOperand(MCInst *MI, unsigned OpNo, SStream *O)
892*9a0e4156SSadaf Ebrahimi {
893*9a0e4156SSadaf Ebrahimi MCOperand *Op = MCInst_getOperand(MI, OpNo);
894*9a0e4156SSadaf Ebrahimi
895*9a0e4156SSadaf Ebrahimi if (MCOperand_isReg(Op)) {
896*9a0e4156SSadaf Ebrahimi unsigned int reg = MCOperand_getReg(Op);
897*9a0e4156SSadaf Ebrahimi
898*9a0e4156SSadaf Ebrahimi printRegName(O, reg);
899*9a0e4156SSadaf Ebrahimi if (MI->csh->detail) {
900*9a0e4156SSadaf Ebrahimi if (MI->csh->doing_mem) {
901*9a0e4156SSadaf Ebrahimi MI->flat_insn->detail->x86.operands[MI->flat_insn->detail->x86.op_count].mem.base = reg;
902*9a0e4156SSadaf Ebrahimi } else {
903*9a0e4156SSadaf Ebrahimi #ifndef CAPSTONE_DIET
904*9a0e4156SSadaf Ebrahimi uint8_t access[6];
905*9a0e4156SSadaf Ebrahimi #endif
906*9a0e4156SSadaf Ebrahimi
907*9a0e4156SSadaf Ebrahimi MI->flat_insn->detail->x86.operands[MI->flat_insn->detail->x86.op_count].type = X86_OP_REG;
908*9a0e4156SSadaf Ebrahimi MI->flat_insn->detail->x86.operands[MI->flat_insn->detail->x86.op_count].reg = reg;
909*9a0e4156SSadaf Ebrahimi MI->flat_insn->detail->x86.operands[MI->flat_insn->detail->x86.op_count].size = MI->csh->regsize_map[reg];
910*9a0e4156SSadaf Ebrahimi
911*9a0e4156SSadaf Ebrahimi #ifndef CAPSTONE_DIET
912*9a0e4156SSadaf Ebrahimi get_op_access(MI->csh, MCInst_getOpcode(MI), access, &MI->flat_insn->detail->x86.eflags);
913*9a0e4156SSadaf Ebrahimi MI->flat_insn->detail->x86.operands[MI->flat_insn->detail->x86.op_count].access = access[MI->flat_insn->detail->x86.op_count];
914*9a0e4156SSadaf Ebrahimi #endif
915*9a0e4156SSadaf Ebrahimi
916*9a0e4156SSadaf Ebrahimi MI->flat_insn->detail->x86.op_count++;
917*9a0e4156SSadaf Ebrahimi }
918*9a0e4156SSadaf Ebrahimi }
919*9a0e4156SSadaf Ebrahimi
920*9a0e4156SSadaf Ebrahimi if (MI->op1_size == 0)
921*9a0e4156SSadaf Ebrahimi MI->op1_size = MI->csh->regsize_map[reg];
922*9a0e4156SSadaf Ebrahimi } else if (MCOperand_isImm(Op)) {
923*9a0e4156SSadaf Ebrahimi uint8_t encsize;
924*9a0e4156SSadaf Ebrahimi int64_t imm = MCOperand_getImm(Op);
925*9a0e4156SSadaf Ebrahimi uint8_t opsize = X86_immediate_size(MCInst_getOpcode(MI), &encsize);
926*9a0e4156SSadaf Ebrahimi
927*9a0e4156SSadaf Ebrahimi if (opsize == 1) // print 1 byte immediate in positive form
928*9a0e4156SSadaf Ebrahimi imm = imm & 0xff;
929*9a0e4156SSadaf Ebrahimi
930*9a0e4156SSadaf Ebrahimi // printf(">>> id = %u\n", MI->flat_insn->id);
931*9a0e4156SSadaf Ebrahimi switch(MI->flat_insn->id) {
932*9a0e4156SSadaf Ebrahimi default:
933*9a0e4156SSadaf Ebrahimi printImm(MI, O, imm, MI->csh->imm_unsigned);
934*9a0e4156SSadaf Ebrahimi break;
935*9a0e4156SSadaf Ebrahimi
936*9a0e4156SSadaf Ebrahimi case X86_INS_MOVABS:
937*9a0e4156SSadaf Ebrahimi // do not print number in negative form
938*9a0e4156SSadaf Ebrahimi printImm(MI, O, imm, true);
939*9a0e4156SSadaf Ebrahimi break;
940*9a0e4156SSadaf Ebrahimi
941*9a0e4156SSadaf Ebrahimi case X86_INS_IN:
942*9a0e4156SSadaf Ebrahimi case X86_INS_OUT:
943*9a0e4156SSadaf Ebrahimi case X86_INS_INT:
944*9a0e4156SSadaf Ebrahimi // do not print number in negative form
945*9a0e4156SSadaf Ebrahimi imm = imm & 0xff;
946*9a0e4156SSadaf Ebrahimi printImm(MI, O, imm, true);
947*9a0e4156SSadaf Ebrahimi break;
948*9a0e4156SSadaf Ebrahimi
949*9a0e4156SSadaf Ebrahimi case X86_INS_LCALL:
950*9a0e4156SSadaf Ebrahimi case X86_INS_LJMP:
951*9a0e4156SSadaf Ebrahimi // always print address in positive form
952*9a0e4156SSadaf Ebrahimi if (OpNo == 1) { // ptr16 part
953*9a0e4156SSadaf Ebrahimi imm = imm & 0xffff;
954*9a0e4156SSadaf Ebrahimi opsize = 2;
955*9a0e4156SSadaf Ebrahimi }
956*9a0e4156SSadaf Ebrahimi printImm(MI, O, imm, true);
957*9a0e4156SSadaf Ebrahimi break;
958*9a0e4156SSadaf Ebrahimi
959*9a0e4156SSadaf Ebrahimi case X86_INS_AND:
960*9a0e4156SSadaf Ebrahimi case X86_INS_OR:
961*9a0e4156SSadaf Ebrahimi case X86_INS_XOR:
962*9a0e4156SSadaf Ebrahimi // do not print number in negative form
963*9a0e4156SSadaf Ebrahimi if (imm >= 0 && imm <= HEX_THRESHOLD)
964*9a0e4156SSadaf Ebrahimi printImm(MI, O, imm, true);
965*9a0e4156SSadaf Ebrahimi else {
966*9a0e4156SSadaf Ebrahimi imm = arch_masks[opsize? opsize : MI->imm_size] & imm;
967*9a0e4156SSadaf Ebrahimi printImm(MI, O, imm, true);
968*9a0e4156SSadaf Ebrahimi }
969*9a0e4156SSadaf Ebrahimi break;
970*9a0e4156SSadaf Ebrahimi
971*9a0e4156SSadaf Ebrahimi case X86_INS_RET:
972*9a0e4156SSadaf Ebrahimi case X86_INS_RETF:
973*9a0e4156SSadaf Ebrahimi // RET imm16
974*9a0e4156SSadaf Ebrahimi if (imm >= 0 && imm <= HEX_THRESHOLD)
975*9a0e4156SSadaf Ebrahimi printImm(MI, O, imm, true);
976*9a0e4156SSadaf Ebrahimi else {
977*9a0e4156SSadaf Ebrahimi imm = 0xffff & imm;
978*9a0e4156SSadaf Ebrahimi printImm(MI, O, imm, true);
979*9a0e4156SSadaf Ebrahimi }
980*9a0e4156SSadaf Ebrahimi break;
981*9a0e4156SSadaf Ebrahimi }
982*9a0e4156SSadaf Ebrahimi
983*9a0e4156SSadaf Ebrahimi if (MI->csh->detail) {
984*9a0e4156SSadaf Ebrahimi if (MI->csh->doing_mem) {
985*9a0e4156SSadaf Ebrahimi MI->flat_insn->detail->x86.operands[MI->flat_insn->detail->x86.op_count].mem.disp = imm;
986*9a0e4156SSadaf Ebrahimi } else {
987*9a0e4156SSadaf Ebrahimi #ifndef CAPSTONE_DIET
988*9a0e4156SSadaf Ebrahimi uint8_t access[6];
989*9a0e4156SSadaf Ebrahimi #endif
990*9a0e4156SSadaf Ebrahimi
991*9a0e4156SSadaf Ebrahimi MI->flat_insn->detail->x86.operands[MI->flat_insn->detail->x86.op_count].type = X86_OP_IMM;
992*9a0e4156SSadaf Ebrahimi if (opsize > 0) {
993*9a0e4156SSadaf Ebrahimi MI->flat_insn->detail->x86.operands[MI->flat_insn->detail->x86.op_count].size = opsize;
994*9a0e4156SSadaf Ebrahimi MI->flat_insn->detail->x86.encoding.imm_size = encsize;
995*9a0e4156SSadaf Ebrahimi } else if (MI->flat_insn->detail->x86.op_count > 0) {
996*9a0e4156SSadaf Ebrahimi if (MI->flat_insn->id != X86_INS_LCALL && MI->flat_insn->id != X86_INS_LJMP) {
997*9a0e4156SSadaf Ebrahimi MI->flat_insn->detail->x86.operands[MI->flat_insn->detail->x86.op_count].size =
998*9a0e4156SSadaf Ebrahimi MI->flat_insn->detail->x86.operands[0].size;
999*9a0e4156SSadaf Ebrahimi } else
1000*9a0e4156SSadaf Ebrahimi MI->flat_insn->detail->x86.operands[MI->flat_insn->detail->x86.op_count].size = MI->imm_size;
1001*9a0e4156SSadaf Ebrahimi } else
1002*9a0e4156SSadaf Ebrahimi MI->flat_insn->detail->x86.operands[MI->flat_insn->detail->x86.op_count].size = MI->imm_size;
1003*9a0e4156SSadaf Ebrahimi MI->flat_insn->detail->x86.operands[MI->flat_insn->detail->x86.op_count].imm = imm;
1004*9a0e4156SSadaf Ebrahimi
1005*9a0e4156SSadaf Ebrahimi #ifndef CAPSTONE_DIET
1006*9a0e4156SSadaf Ebrahimi get_op_access(MI->csh, MCInst_getOpcode(MI), access, &MI->flat_insn->detail->x86.eflags);
1007*9a0e4156SSadaf Ebrahimi MI->flat_insn->detail->x86.operands[MI->flat_insn->detail->x86.op_count].access = access[MI->flat_insn->detail->x86.op_count];
1008*9a0e4156SSadaf Ebrahimi #endif
1009*9a0e4156SSadaf Ebrahimi
1010*9a0e4156SSadaf Ebrahimi MI->flat_insn->detail->x86.op_count++;
1011*9a0e4156SSadaf Ebrahimi }
1012*9a0e4156SSadaf Ebrahimi }
1013*9a0e4156SSadaf Ebrahimi }
1014*9a0e4156SSadaf Ebrahimi }
1015*9a0e4156SSadaf Ebrahimi
printMemReference(MCInst * MI,unsigned Op,SStream * O)1016*9a0e4156SSadaf Ebrahimi static void printMemReference(MCInst *MI, unsigned Op, SStream *O)
1017*9a0e4156SSadaf Ebrahimi {
1018*9a0e4156SSadaf Ebrahimi bool NeedPlus = false;
1019*9a0e4156SSadaf Ebrahimi MCOperand *BaseReg = MCInst_getOperand(MI, Op + X86_AddrBaseReg);
1020*9a0e4156SSadaf Ebrahimi uint64_t ScaleVal = MCOperand_getImm(MCInst_getOperand(MI, Op + X86_AddrScaleAmt));
1021*9a0e4156SSadaf Ebrahimi MCOperand *IndexReg = MCInst_getOperand(MI, Op + X86_AddrIndexReg);
1022*9a0e4156SSadaf Ebrahimi MCOperand *DispSpec = MCInst_getOperand(MI, Op + X86_AddrDisp);
1023*9a0e4156SSadaf Ebrahimi MCOperand *SegReg = MCInst_getOperand(MI, Op + X86_AddrSegmentReg);
1024*9a0e4156SSadaf Ebrahimi int reg;
1025*9a0e4156SSadaf Ebrahimi
1026*9a0e4156SSadaf Ebrahimi if (MI->csh->detail) {
1027*9a0e4156SSadaf Ebrahimi #ifndef CAPSTONE_DIET
1028*9a0e4156SSadaf Ebrahimi uint8_t access[6];
1029*9a0e4156SSadaf Ebrahimi #endif
1030*9a0e4156SSadaf Ebrahimi
1031*9a0e4156SSadaf Ebrahimi MI->flat_insn->detail->x86.operands[MI->flat_insn->detail->x86.op_count].type = X86_OP_MEM;
1032*9a0e4156SSadaf Ebrahimi MI->flat_insn->detail->x86.operands[MI->flat_insn->detail->x86.op_count].size = MI->x86opsize;
1033*9a0e4156SSadaf Ebrahimi MI->flat_insn->detail->x86.operands[MI->flat_insn->detail->x86.op_count].mem.segment = X86_REG_INVALID;
1034*9a0e4156SSadaf Ebrahimi MI->flat_insn->detail->x86.operands[MI->flat_insn->detail->x86.op_count].mem.base = MCOperand_getReg(BaseReg);
1035*9a0e4156SSadaf Ebrahimi MI->flat_insn->detail->x86.operands[MI->flat_insn->detail->x86.op_count].mem.index = MCOperand_getReg(IndexReg);
1036*9a0e4156SSadaf Ebrahimi MI->flat_insn->detail->x86.operands[MI->flat_insn->detail->x86.op_count].mem.scale = (int)ScaleVal;
1037*9a0e4156SSadaf Ebrahimi MI->flat_insn->detail->x86.operands[MI->flat_insn->detail->x86.op_count].mem.disp = 0;
1038*9a0e4156SSadaf Ebrahimi
1039*9a0e4156SSadaf Ebrahimi #ifndef CAPSTONE_DIET
1040*9a0e4156SSadaf Ebrahimi get_op_access(MI->csh, MCInst_getOpcode(MI), access, &MI->flat_insn->detail->x86.eflags);
1041*9a0e4156SSadaf Ebrahimi MI->flat_insn->detail->x86.operands[MI->flat_insn->detail->x86.op_count].access = access[MI->flat_insn->detail->x86.op_count];
1042*9a0e4156SSadaf Ebrahimi #endif
1043*9a0e4156SSadaf Ebrahimi }
1044*9a0e4156SSadaf Ebrahimi
1045*9a0e4156SSadaf Ebrahimi // If this has a segment register, print it.
1046*9a0e4156SSadaf Ebrahimi reg = MCOperand_getReg(SegReg);
1047*9a0e4156SSadaf Ebrahimi if (reg) {
1048*9a0e4156SSadaf Ebrahimi _printOperand(MI, Op + X86_AddrSegmentReg, O);
1049*9a0e4156SSadaf Ebrahimi if (MI->csh->detail) {
1050*9a0e4156SSadaf Ebrahimi MI->flat_insn->detail->x86.operands[MI->flat_insn->detail->x86.op_count].mem.segment = reg;
1051*9a0e4156SSadaf Ebrahimi }
1052*9a0e4156SSadaf Ebrahimi SStream_concat0(O, ":");
1053*9a0e4156SSadaf Ebrahimi }
1054*9a0e4156SSadaf Ebrahimi
1055*9a0e4156SSadaf Ebrahimi SStream_concat0(O, "[");
1056*9a0e4156SSadaf Ebrahimi
1057*9a0e4156SSadaf Ebrahimi if (MCOperand_getReg(BaseReg)) {
1058*9a0e4156SSadaf Ebrahimi _printOperand(MI, Op + X86_AddrBaseReg, O);
1059*9a0e4156SSadaf Ebrahimi NeedPlus = true;
1060*9a0e4156SSadaf Ebrahimi }
1061*9a0e4156SSadaf Ebrahimi
1062*9a0e4156SSadaf Ebrahimi if (MCOperand_getReg(IndexReg)) {
1063*9a0e4156SSadaf Ebrahimi if (NeedPlus) SStream_concat0(O, " + ");
1064*9a0e4156SSadaf Ebrahimi _printOperand(MI, Op + X86_AddrIndexReg, O);
1065*9a0e4156SSadaf Ebrahimi if (ScaleVal != 1)
1066*9a0e4156SSadaf Ebrahimi SStream_concat(O, "*%u", ScaleVal);
1067*9a0e4156SSadaf Ebrahimi NeedPlus = true;
1068*9a0e4156SSadaf Ebrahimi }
1069*9a0e4156SSadaf Ebrahimi
1070*9a0e4156SSadaf Ebrahimi if (MCOperand_isImm(DispSpec)) {
1071*9a0e4156SSadaf Ebrahimi int64_t DispVal = MCOperand_getImm(DispSpec);
1072*9a0e4156SSadaf Ebrahimi if (MI->csh->detail)
1073*9a0e4156SSadaf Ebrahimi MI->flat_insn->detail->x86.operands[MI->flat_insn->detail->x86.op_count].mem.disp = DispVal;
1074*9a0e4156SSadaf Ebrahimi if (DispVal) {
1075*9a0e4156SSadaf Ebrahimi if (NeedPlus) {
1076*9a0e4156SSadaf Ebrahimi if (DispVal < 0) {
1077*9a0e4156SSadaf Ebrahimi SStream_concat0(O, " - ");
1078*9a0e4156SSadaf Ebrahimi printImm(MI, O, -DispVal, true);
1079*9a0e4156SSadaf Ebrahimi } else {
1080*9a0e4156SSadaf Ebrahimi SStream_concat0(O, " + ");
1081*9a0e4156SSadaf Ebrahimi printImm(MI, O, DispVal, true);
1082*9a0e4156SSadaf Ebrahimi }
1083*9a0e4156SSadaf Ebrahimi } else {
1084*9a0e4156SSadaf Ebrahimi // memory reference to an immediate address
1085*9a0e4156SSadaf Ebrahimi if (DispVal < 0) {
1086*9a0e4156SSadaf Ebrahimi printImm(MI, O, arch_masks[MI->csh->mode] & DispVal, true);
1087*9a0e4156SSadaf Ebrahimi } else {
1088*9a0e4156SSadaf Ebrahimi printImm(MI, O, DispVal, true);
1089*9a0e4156SSadaf Ebrahimi }
1090*9a0e4156SSadaf Ebrahimi }
1091*9a0e4156SSadaf Ebrahimi
1092*9a0e4156SSadaf Ebrahimi } else {
1093*9a0e4156SSadaf Ebrahimi // DispVal = 0
1094*9a0e4156SSadaf Ebrahimi if (!NeedPlus) // [0]
1095*9a0e4156SSadaf Ebrahimi SStream_concat0(O, "0");
1096*9a0e4156SSadaf Ebrahimi }
1097*9a0e4156SSadaf Ebrahimi }
1098*9a0e4156SSadaf Ebrahimi
1099*9a0e4156SSadaf Ebrahimi SStream_concat0(O, "]");
1100*9a0e4156SSadaf Ebrahimi
1101*9a0e4156SSadaf Ebrahimi if (MI->csh->detail)
1102*9a0e4156SSadaf Ebrahimi MI->flat_insn->detail->x86.op_count++;
1103*9a0e4156SSadaf Ebrahimi
1104*9a0e4156SSadaf Ebrahimi if (MI->op1_size == 0)
1105*9a0e4156SSadaf Ebrahimi MI->op1_size = MI->x86opsize;
1106*9a0e4156SSadaf Ebrahimi }
1107*9a0e4156SSadaf Ebrahimi
printanymem(MCInst * MI,unsigned OpNo,SStream * O)1108*9a0e4156SSadaf Ebrahimi static void printanymem(MCInst *MI, unsigned OpNo, SStream *O)
1109*9a0e4156SSadaf Ebrahimi {
1110*9a0e4156SSadaf Ebrahimi switch(MI->Opcode) {
1111*9a0e4156SSadaf Ebrahimi default: break;
1112*9a0e4156SSadaf Ebrahimi case X86_LEA16r:
1113*9a0e4156SSadaf Ebrahimi MI->x86opsize = 2;
1114*9a0e4156SSadaf Ebrahimi break;
1115*9a0e4156SSadaf Ebrahimi case X86_LEA32r:
1116*9a0e4156SSadaf Ebrahimi case X86_LEA64_32r:
1117*9a0e4156SSadaf Ebrahimi MI->x86opsize = 4;
1118*9a0e4156SSadaf Ebrahimi break;
1119*9a0e4156SSadaf Ebrahimi case X86_LEA64r:
1120*9a0e4156SSadaf Ebrahimi MI->x86opsize = 8;
1121*9a0e4156SSadaf Ebrahimi break;
1122*9a0e4156SSadaf Ebrahimi }
1123*9a0e4156SSadaf Ebrahimi printMemReference(MI, OpNo, O);
1124*9a0e4156SSadaf Ebrahimi }
1125*9a0e4156SSadaf Ebrahimi
1126*9a0e4156SSadaf Ebrahimi #define GET_REGINFO_ENUM
1127*9a0e4156SSadaf Ebrahimi #include "X86GenRegisterInfo.inc"
1128*9a0e4156SSadaf Ebrahimi
1129*9a0e4156SSadaf Ebrahimi #define PRINT_ALIAS_INSTR
1130*9a0e4156SSadaf Ebrahimi #ifdef CAPSTONE_X86_REDUCE
1131*9a0e4156SSadaf Ebrahimi #include "X86GenAsmWriter1_reduce.inc"
1132*9a0e4156SSadaf Ebrahimi #else
1133*9a0e4156SSadaf Ebrahimi #include "X86GenAsmWriter1.inc"
1134*9a0e4156SSadaf Ebrahimi #endif
1135*9a0e4156SSadaf Ebrahimi
1136*9a0e4156SSadaf Ebrahimi #endif
1137