19 #if defined(CAPSTONE_HAS_X86) && !defined(CAPSTONE_DIET) && !defined(CAPSTONE_X86_ATT_DISABLE)
21 #if defined (WIN32) || defined (WIN64) || defined (_WIN32) || defined (_WIN64)
22 #pragma warning(disable:4996) // disable MSVC's warning on strncpy()
23 #pragma warning(disable:28719) // disable MSVC's warning on strncpy()
26 #if !defined(CAPSTONE_HAS_OSXKERNEL)
31 #if defined(CAPSTONE_HAS_OSXKERNEL)
32 #include <Availability.h>
33 #include <libkern/libkern.h>
41 #include "../../utils.h"
42 #include "../../MCInst.h"
43 #include "../../SStream.h"
44 #include "../../MCRegisterInfo.h"
49 #define GET_INSTRINFO_ENUM
50 #ifdef CAPSTONE_X86_REDUCE
51 #include "X86GenInstrInfo_reduce.inc"
53 #include "X86GenInstrInfo.inc"
56 static void printMemReference(
MCInst *MI,
unsigned Op,
SStream *O);
57 static void printOperand(
MCInst *MI,
unsigned OpNo,
SStream *O);
71 static void printopaquemem(
MCInst *MI,
unsigned OpNo,
SStream *O)
125 printMemReference(MI, OpNo, O);
128 static void printi8mem(
MCInst *MI,
unsigned OpNo,
SStream *O)
131 printMemReference(MI, OpNo, O);
134 static void printi16mem(
MCInst *MI,
unsigned OpNo,
SStream *O)
138 printMemReference(MI, OpNo, O);
141 static void printi32mem(
MCInst *MI,
unsigned OpNo,
SStream *O)
145 printMemReference(MI, OpNo, O);
148 static void printi64mem(
MCInst *MI,
unsigned OpNo,
SStream *O)
151 printMemReference(MI, OpNo, O);
154 static void printi128mem(
MCInst *MI,
unsigned OpNo,
SStream *O)
157 printMemReference(MI, OpNo, O);
160 #ifndef CAPSTONE_X86_REDUCE
161 static void printi256mem(
MCInst *MI,
unsigned OpNo,
SStream *O)
164 printMemReference(MI, OpNo, O);
167 static void printi512mem(
MCInst *MI,
unsigned OpNo,
SStream *O)
170 printMemReference(MI, OpNo, O);
173 static void printf32mem(
MCInst *MI,
unsigned OpNo,
SStream *O)
201 printMemReference(MI, OpNo, O);
204 static void printf64mem(
MCInst *MI,
unsigned OpNo,
SStream *O)
207 printMemReference(MI, OpNo, O);
210 static void printf80mem(
MCInst *MI,
unsigned OpNo,
SStream *O)
213 printMemReference(MI, OpNo, O);
216 static void printf128mem(
MCInst *MI,
unsigned OpNo,
SStream *O)
219 printMemReference(MI, OpNo, O);
222 static void printf256mem(
MCInst *MI,
unsigned OpNo,
SStream *O)
225 printMemReference(MI, OpNo, O);
228 static void printf512mem(
MCInst *MI,
unsigned OpNo,
SStream *O)
231 printMemReference(MI, OpNo, O);
311 static void printRoundingControl(
MCInst *MI,
unsigned Op,
SStream *O)
325 static void printRegName(
SStream *
OS,
unsigned RegNo);
328 static void _printOperand(
MCInst *MI,
unsigned OpNo,
SStream *O)
413 MI->
flat_insn->detail->x86.operands[MI->
flat_insn->detail->x86.op_count].mem.scale = 1;
414 MI->
flat_insn->detail->x86.operands[MI->
flat_insn->detail->x86.op_count].mem.disp = 0;
425 _printOperand(MI, Op+1, O);
427 MI->
flat_insn->detail->x86.operands[MI->
flat_insn->detail->x86.op_count].mem.segment = reg;
434 set_mem_access(MI,
true);
436 printOperand(MI, Op, O);
439 set_mem_access(MI,
false);
452 MI->
flat_insn->detail->x86.operands[MI->
flat_insn->detail->x86.op_count].mem.scale = 1;
453 MI->
flat_insn->detail->x86.operands[MI->
flat_insn->detail->x86.op_count].mem.disp = 0;
468 set_mem_access(MI,
true);
470 printOperand(MI, Op, O);
473 set_mem_access(MI,
false);
476 static void printSrcIdx8(
MCInst *MI,
unsigned OpNo,
SStream *O)
479 printSrcIdx(MI, OpNo, O);
482 static void printSrcIdx16(
MCInst *MI,
unsigned OpNo,
SStream *O)
485 printSrcIdx(MI, OpNo, O);
488 static void printSrcIdx32(
MCInst *MI,
unsigned OpNo,
SStream *O)
491 printSrcIdx(MI, OpNo, O);
494 static void printSrcIdx64(
MCInst *MI,
unsigned OpNo,
SStream *O)
497 printSrcIdx(MI, OpNo, O);
500 static void printDstIdx8(
MCInst *MI,
unsigned OpNo,
SStream *O)
503 printDstIdx(MI, OpNo, O);
506 static void printDstIdx16(
MCInst *MI,
unsigned OpNo,
SStream *O)
509 printDstIdx(MI, OpNo, O);
512 static void printDstIdx32(
MCInst *MI,
unsigned OpNo,
SStream *O)
515 printDstIdx(MI, OpNo, O);
518 static void printDstIdx64(
MCInst *MI,
unsigned OpNo,
SStream *O)
521 printDstIdx(MI, OpNo, O);
524 static void printMemOffset(
MCInst *MI,
unsigned Op,
SStream *O)
538 MI->
flat_insn->detail->x86.operands[MI->
flat_insn->detail->x86.op_count].mem.scale = 1;
539 MI->
flat_insn->detail->x86.operands[MI->
flat_insn->detail->x86.op_count].mem.disp = 0;
548 _printOperand(MI, Op + 1, O);
551 MI->
flat_insn->detail->x86.operands[MI->
flat_insn->detail->x86.op_count].mem.segment = reg;
558 MI->
flat_insn->detail->x86.operands[MI->
flat_insn->detail->x86.op_count].mem.disp = imm;
573 #ifndef CAPSTONE_X86_REDUCE
592 static void printMemOffs8(
MCInst *MI,
unsigned OpNo,
SStream *O)
595 printMemOffset(MI, OpNo, O);
598 static void printMemOffs16(
MCInst *MI,
unsigned OpNo,
SStream *O)
601 printMemOffset(MI, OpNo, O);
604 static void printMemOffs32(
MCInst *MI,
unsigned OpNo,
SStream *O)
607 printMemOffset(MI, OpNo, O);
610 static void printMemOffs64(
MCInst *MI,
unsigned OpNo,
SStream *O)
613 printMemOffset(MI, OpNo, O);
620 static void printPCRelImm(
MCInst *MI,
unsigned OpNo,
SStream *O)
628 imm = imm & 0xffffffff;
632 (MI->
Opcode != X86_JMP_4 && MI->
Opcode != X86_CALLpcrel32))
641 if (MI->
Opcode == X86_CALLpcrel16 || MI->
Opcode == X86_JMP_2)
661 static void printOperand(
MCInst *MI,
unsigned OpNo,
SStream *O)
666 printRegName(O, reg);
669 MI->
flat_insn->detail->x86.operands[MI->
flat_insn->detail->x86.op_count].mem.base = reg;
719 if (imm == 0x8000000000000000LL)
783 MI->
flat_insn->detail->x86.operands[MI->
flat_insn->detail->x86.op_count].mem.disp = imm;
790 MI->
flat_insn->detail->x86.operands[MI->
flat_insn->detail->x86.op_count].size = opsize;
791 MI->
flat_insn->detail->x86.encoding.imm_size = encsize;
803 static void printMemReference(
MCInst *MI,
unsigned Op,
SStream *O)
821 MI->
flat_insn->detail->x86.operands[MI->
flat_insn->detail->x86.op_count].mem.scale = 1;
822 MI->
flat_insn->detail->x86.operands[MI->
flat_insn->detail->x86.op_count].mem.disp = 0;
833 MI->
flat_insn->detail->x86.operands[MI->
flat_insn->detail->x86.op_count].mem.segment = segreg;
842 MI->
flat_insn->detail->x86.operands[MI->
flat_insn->detail->x86.op_count].mem.disp = DispVal;
887 static void printanymem(
MCInst *MI,
unsigned OpNo,
SStream *O)
902 printMemReference(MI, OpNo, O);
907 #define GET_REGINFO_ENUM
908 #include "X86GenRegisterInfo.inc"
911 #define PRINT_ALIAS_INSTR
912 #ifdef CAPSTONE_X86_REDUCE
913 #include "X86GenAsmWriter_reduce.inc"
915 #include "X86GenAsmWriter.inc"
918 static void printRegName(
SStream *
OS,
unsigned RegNo)
945 printPCRelImm(MI, 0,
OS);
950 mnem = printAliasInstr(MI,
OS, info);
954 printInstruction(MI,
OS, info);
967 if (MI->
flat_insn->detail->x86.op_count > 1) {
969 for (
i = 0;
i < MI->
flat_insn->detail->x86.op_count;
i++) {
1051 memmove(&(MI->
flat_insn->detail->x86.operands[1]), &(MI->
flat_insn->detail->x86.operands[0]),
1054 MI->
flat_insn->detail->x86.operands[0].imm = 1;
1055 MI->
flat_insn->detail->x86.operands[0].size = 1;
1068 memmove(&(MI->
flat_insn->detail->x86.operands[1]), &(MI->
flat_insn->detail->x86.operands[0]),
1071 MI->
flat_insn->detail->x86.operands[0].reg = reg;
1073 MI->
flat_insn->detail->x86.operands[0].access = access1;
1080 MI->
flat_insn->detail->x86.operands[0].reg = reg;
1082 MI->
flat_insn->detail->x86.operands[0].access = access1;
1084 MI->
flat_insn->detail->x86.operands[1].reg = reg2;
1086 MI->
flat_insn->detail->x86.operands[0].access = access2;
1087 MI->
flat_insn->detail->x86.op_count = 2;
1091 #ifndef CAPSTONE_DIET