18 #ifdef CAPSTONE_HAS_X86
20 #if defined (WIN32) || defined (WIN64) || defined (_WIN32) || defined (_WIN64)
21 #pragma warning(disable:4996) // disable MSVC's warning on strncpy()
22 #pragma warning(disable:28719) // disable MSVC's warning on strncpy()
25 #if !defined(CAPSTONE_HAS_OSXKERNEL)
30 #if defined(CAPSTONE_HAS_OSXKERNEL)
31 #include <Availability.h>
32 #include <libkern/libkern.h>
39 #include "../../utils.h"
40 #include "../../MCInst.h"
41 #include "../../SStream.h"
42 #include "../../MCRegisterInfo.h"
47 #define GET_INSTRINFO_ENUM
48 #ifdef CAPSTONE_X86_REDUCE
49 #include "X86GenInstrInfo_reduce.inc"
51 #include "X86GenInstrInfo.inc"
56 static void printMemReference(
MCInst *MI,
unsigned Op,
SStream *O);
57 static void printOperand(
MCInst *MI,
unsigned OpNo,
SStream *O);
72 static void printopaquemem(
MCInst *MI,
unsigned OpNo,
SStream *O)
144 printMemReference(MI, OpNo, O);
147 static void printi8mem(
MCInst *MI,
unsigned OpNo,
SStream *O)
151 printMemReference(MI, OpNo, O);
154 static void printi16mem(
MCInst *MI,
unsigned OpNo,
SStream *O)
158 printMemReference(MI, OpNo, O);
161 static void printi32mem(
MCInst *MI,
unsigned OpNo,
SStream *O)
165 printMemReference(MI, OpNo, O);
168 static void printi64mem(
MCInst *MI,
unsigned OpNo,
SStream *O)
172 printMemReference(MI, OpNo, O);
175 static void printi128mem(
MCInst *MI,
unsigned OpNo,
SStream *O)
179 printMemReference(MI, OpNo, O);
182 #ifndef CAPSTONE_X86_REDUCE
183 static void printi256mem(
MCInst *MI,
unsigned OpNo,
SStream *O)
187 printMemReference(MI, OpNo, O);
190 static void printi512mem(
MCInst *MI,
unsigned OpNo,
SStream *O)
194 printMemReference(MI, OpNo, O);
197 static void printf32mem(
MCInst *MI,
unsigned OpNo,
SStream *O)
227 printMemReference(MI, OpNo, O);
230 static void printf64mem(
MCInst *MI,
unsigned OpNo,
SStream *O)
234 printMemReference(MI, OpNo, O);
237 static void printf80mem(
MCInst *MI,
unsigned OpNo,
SStream *O)
241 printMemReference(MI, OpNo, O);
244 static void printf128mem(
MCInst *MI,
unsigned OpNo,
SStream *O)
248 printMemReference(MI, OpNo, O);
251 static void printf256mem(
MCInst *MI,
unsigned OpNo,
SStream *O)
255 printMemReference(MI, OpNo, O);
258 static void printf512mem(
MCInst *MI,
unsigned OpNo,
SStream *O)
262 printMemReference(MI, OpNo, O);
342 static void printRoundingControl(
MCInst *MI,
unsigned Op,
SStream *O)
356 static const char *getRegisterName(
unsigned RegNo);
357 static void printRegName(
SStream *
OS,
unsigned RegNo)
364 static bool need_zero_prefix(
uint64_t imm)
398 if (imm == 0x8000000000000000LL)
400 else if (need_zero_prefix(imm))
406 if (need_zero_prefix(imm))
442 if (imm == 0x8000000000000000LL)
445 if (need_zero_prefix(imm))
453 if (need_zero_prefix(imm))
462 if (imm == 0x8000000000000000LL)
480 static void _printOperand(
MCInst *MI,
unsigned OpNo,
SStream *O)
491 #ifndef CAPSTONE_DIET
495 #ifndef CAPSTONE_DIET
505 for(
i = 0; arr[
i];
i++) {
524 #ifndef CAPSTONE_DIET
533 MI->
flat_insn->detail->x86.operands[MI->
flat_insn->detail->x86.op_count].mem.scale = 1;
534 MI->
flat_insn->detail->x86.operands[MI->
flat_insn->detail->x86.op_count].mem.disp = 0;
536 #ifndef CAPSTONE_DIET
547 _printOperand(MI, Op+1, O);
549 MI->
flat_insn->detail->x86.operands[MI->
flat_insn->detail->x86.op_count].mem.segment = reg;
555 set_mem_access(MI,
true);
556 printOperand(MI, Op, O);
558 set_mem_access(MI,
false);
564 #ifndef CAPSTONE_DIET
573 MI->
flat_insn->detail->x86.operands[MI->
flat_insn->detail->x86.op_count].mem.scale = 1;
574 MI->
flat_insn->detail->x86.operands[MI->
flat_insn->detail->x86.op_count].mem.disp = 0;
576 #ifndef CAPSTONE_DIET
591 set_mem_access(MI,
true);
592 printOperand(MI, Op, O);
594 set_mem_access(MI,
false);
597 static void printSrcIdx8(
MCInst *MI,
unsigned OpNo,
SStream *O)
601 printSrcIdx(MI, OpNo, O);
604 static void printSrcIdx16(
MCInst *MI,
unsigned OpNo,
SStream *O)
608 printSrcIdx(MI, OpNo, O);
611 static void printSrcIdx32(
MCInst *MI,
unsigned OpNo,
SStream *O)
615 printSrcIdx(MI, OpNo, O);
618 static void printSrcIdx64(
MCInst *MI,
unsigned OpNo,
SStream *O)
622 printSrcIdx(MI, OpNo, O);
625 static void printDstIdx8(
MCInst *MI,
unsigned OpNo,
SStream *O)
629 printDstIdx(MI, OpNo, O);
632 static void printDstIdx16(
MCInst *MI,
unsigned OpNo,
SStream *O)
636 printDstIdx(MI, OpNo, O);
639 static void printDstIdx32(
MCInst *MI,
unsigned OpNo,
SStream *O)
643 printDstIdx(MI, OpNo, O);
646 static void printDstIdx64(
MCInst *MI,
unsigned OpNo,
SStream *O)
650 printDstIdx(MI, OpNo, O);
653 static void printMemOffset(
MCInst *MI,
unsigned Op,
SStream *O)
660 #ifndef CAPSTONE_DIET
669 MI->
flat_insn->detail->x86.operands[MI->
flat_insn->detail->x86.op_count].mem.scale = 1;
670 MI->
flat_insn->detail->x86.operands[MI->
flat_insn->detail->x86.op_count].mem.disp = 0;
672 #ifndef CAPSTONE_DIET
681 _printOperand(MI, Op + 1, O);
684 MI->
flat_insn->detail->x86.operands[MI->
flat_insn->detail->x86.op_count].mem.segment = reg;
693 MI->
flat_insn->detail->x86.operands[MI->
flat_insn->detail->x86.op_count].mem.disp = imm;
698 printImm(MI, O, imm,
true);
710 #ifndef CAPSTONE_X86_REDUCE
715 printImm(MI, O, val,
true);
718 #ifndef CAPSTONE_DIET
726 #ifndef CAPSTONE_DIET
736 static void printMemOffs8(
MCInst *MI,
unsigned OpNo,
SStream *O)
740 printMemOffset(MI, OpNo, O);
743 static void printMemOffs16(
MCInst *MI,
unsigned OpNo,
SStream *O)
747 printMemOffset(MI, OpNo, O);
750 static void printMemOffs32(
MCInst *MI,
unsigned OpNo,
SStream *O)
754 printMemOffset(MI, OpNo, O);
757 static void printMemOffs64(
MCInst *MI,
unsigned OpNo,
SStream *O)
761 printMemOffset(MI, OpNo, O);
764 #ifndef CAPSTONE_DIET
771 #ifndef CAPSTONE_DIET
783 #ifndef CAPSTONE_DIET
785 mnem = printAliasInstr(MI, O, Info);
790 printInstruction(MI, O, Info);
794 #ifndef CAPSTONE_DIET
802 memmove(&(MI->
flat_insn->detail->x86.operands[1]), &(MI->
flat_insn->detail->x86.operands[0]),
805 MI->
flat_insn->detail->x86.operands[0].reg = reg;
807 MI->
flat_insn->detail->x86.operands[0].access = access1;
812 MI->
flat_insn->detail->x86.operands[0].reg = reg;
814 MI->
flat_insn->detail->x86.operands[0].access = access1;
816 MI->
flat_insn->detail->x86.operands[1].reg = reg2;
818 MI->
flat_insn->detail->x86.operands[1].access = access2;
823 #ifndef CAPSTONE_DIET
836 static void printPCRelImm(
MCInst *MI,
unsigned OpNo,
SStream *O)
845 imm = imm & 0xffffffff;
849 (MI->
Opcode != X86_JMP_4 && MI->
Opcode != X86_CALLpcrel32))
858 if (MI->
Opcode == X86_CALLpcrel16 || MI->
Opcode == X86_JMP_2)
861 printImm(MI, O, imm,
true);
864 #ifndef CAPSTONE_DIET
870 if (MI->
flat_insn->detail->x86.op_count > 0)
873 MI->
flat_insn->detail->x86.operands[MI->
flat_insn->detail->x86.op_count].size = opsize;
878 #ifndef CAPSTONE_DIET
891 static void printOperand(
MCInst *MI,
unsigned OpNo,
SStream *O)
898 printRegName(O, reg);
901 MI->
flat_insn->detail->x86.operands[MI->
flat_insn->detail->x86.op_count].mem.base = reg;
903 #ifndef CAPSTONE_DIET
911 #ifndef CAPSTONE_DIET
938 printImm(MI, O, imm,
true);
946 printImm(MI, O, imm,
true);
956 printImm(MI, O, imm,
true);
964 printImm(MI, O, imm,
true);
967 printImm(MI, O, imm,
true);
975 printImm(MI, O, imm,
true);
978 printImm(MI, O, imm,
true);
985 MI->
flat_insn->detail->x86.operands[MI->
flat_insn->detail->x86.op_count].mem.disp = imm;
987 #ifndef CAPSTONE_DIET
993 MI->
flat_insn->detail->x86.operands[MI->
flat_insn->detail->x86.op_count].size = opsize;
994 MI->
flat_insn->detail->x86.encoding.imm_size = encsize;
995 }
else if (MI->
flat_insn->detail->x86.op_count > 0) {
998 MI->
flat_insn->detail->x86.operands[0].size;
1005 #ifndef CAPSTONE_DIET
1016 static void printMemReference(
MCInst *MI,
unsigned Op,
SStream *O)
1018 bool NeedPlus =
false;
1027 #ifndef CAPSTONE_DIET
1037 MI->
flat_insn->detail->x86.operands[MI->
flat_insn->detail->x86.op_count].mem.disp = 0;
1039 #ifndef CAPSTONE_DIET
1050 MI->
flat_insn->detail->x86.operands[MI->
flat_insn->detail->x86.op_count].mem.segment = reg;
1073 MI->
flat_insn->detail->x86.operands[MI->
flat_insn->detail->x86.op_count].mem.disp = DispVal;
1078 printImm(MI, O, -DispVal,
true);
1081 printImm(MI, O, DispVal,
true);
1088 printImm(MI, O, DispVal,
true);
1108 static void printanymem(
MCInst *MI,
unsigned OpNo,
SStream *O)
1123 printMemReference(MI, OpNo, O);
1126 #define GET_REGINFO_ENUM
1127 #include "X86GenRegisterInfo.inc"
1129 #define PRINT_ALIAS_INSTR
1130 #ifdef CAPSTONE_X86_REDUCE
1131 #include "X86GenAsmWriter1_reduce.inc"
1133 #include "X86GenAsmWriter1.inc"