4 #ifdef CAPSTONE_HAS_X86
6 #if defined(CAPSTONE_HAS_OSXKERNEL)
7 #include <Availability.h>
11 #ifndef CAPSTONE_HAS_OSXKERNEL
20 #include "../../utils.h"
32 static const x86_reg sib_base_map[] = {
34 #define ENTRY(x) X86_REG_##x,
51 static const x86_reg sib_index_map[] = {
53 #define ENTRY(x) X86_REG_##x,
61 static const x86_reg segment_map[] = {
73 return sib_base_map[
r];
78 return sib_index_map[
r];
83 return segment_map[
r];
87 static const name_map reg_name_maps[] = {
828 #ifndef CAPSTONE_DIET
841 return reg_name_maps[reg].
name;
847 #ifndef CAPSTONE_DIET
848 static const name_map insn_name_maps[] = {
2366 #ifndef CAPSTONE_DIET
2370 return insn_name_maps[
id].
name;
2376 #ifndef CAPSTONE_DIET
2436 #ifndef CAPSTONE_DIET
2443 #define GET_INSTRINFO_ENUM
2444 #ifdef CAPSTONE_X86_REDUCE
2445 #include "X86GenInstrInfo_reduce.inc"
2447 #include "X86GenInstrInfo.inc"
2450 #ifndef CAPSTONE_X86_REDUCE
2455 #ifndef CAPSTONE_DIET
2456 { 0 }, { 0 }, { 0 }, 0, 0
2460 #include "X86MappingInsn.inc"
2462 #else // X86 reduce (defined CAPSTONE_X86_REDUCE)
2467 #ifndef CAPSTONE_DIET
2468 { 0 }, { 0 }, { 0 }, 0, 0
2472 #include "X86MappingInsn_reduce.inc"
2476 #ifndef CAPSTONE_DIET
2482 for(
i = 0;
i <
max;
i++) {
2496 insn->id = insns[
i].
mapid;
2499 #ifndef CAPSTONE_DIET
2500 memcpy(insn->detail->regs_read, insns[
i].regs_use,
sizeof(insns[
i].regs_use));
2506 memcpy(insn->detail->regs_write, insns[
i].regs_mod,
sizeof(insns[
i].regs_mod));
2511 memcpy(insn->detail->regs_write, insns[
i].regs_mod,
sizeof(insns[
i].regs_mod));
2516 insn->detail->regs_write_count = 2;
2521 memcpy(insn->detail->regs_write, insns[
i].regs_mod,
sizeof(insns[
i].regs_mod));
2527 insn->detail->regs_write_count = 3;
2543 insn->detail->regs_read_count = 1;
2545 insn->detail->regs_write_count = 1;
2549 insn->detail->regs_read_count = 1;
2551 insn->detail->regs_write_count = 1;
2555 insn->detail->regs_read_count = 1;
2557 insn->detail->regs_write_count = 1;
2564 insn->detail->regs_read_count = 2;
2649 insn->detail->regs_write_count = 1;
2650 insn->detail->regs_read_count = 1;
2654 memcpy(insn->detail->groups, insns[
i].groups,
sizeof(insns[
i].groups));
2657 if (insns[
i].
branch || insns[
i].indirect_branch) {
2659 insn->detail->groups[insn->detail->groups_count] =
X86_GRP_JUMP;
2660 insn->detail->groups_count++;
2663 switch (insns[
i].
id) {
2667 if (insn->detail->x86.operands[0].imm == -78) {
2670 insn->detail->groups[insn->detail->groups_count] =
X86_GRP_INT;
2671 insn->detail->groups_count++;
2698 static struct insn_reg insn_regs_att[] = {
2800 #ifndef CAPSTONE_X86_REDUCE
2820 static struct insn_reg insn_regs_intel[] = {
2924 #ifndef CAPSTONE_X86_REDUCE
2954 static struct insn_reg2 insn_regs_intel2[] = {
2967 static struct insn_reg insn_regs_intel_sorted [
ARR_SIZE(insn_regs_intel)];
2984 static bool intel_regs_sorted =
false;
2985 unsigned int first = 0;
2986 unsigned int last =
ARR_SIZE(insn_regs_intel) - 1;
2989 if (!intel_regs_sorted) {
2990 memcpy(insn_regs_intel_sorted, insn_regs_intel,
2991 sizeof(insn_regs_intel_sorted));
2992 qsort(insn_regs_intel_sorted,
2994 sizeof(
struct insn_reg), regs_cmp);
2995 intel_regs_sorted =
true;
2998 if (insn_regs_intel_sorted[0].insn >
id ||
2999 insn_regs_intel_sorted[last].insn <
id) {
3003 while (
first <= last) {
3004 mid = (
first + last) / 2;
3005 if (insn_regs_intel_sorted[mid].insn <
id) {
3007 }
else if (insn_regs_intel_sorted[mid].insn ==
id) {
3009 *
access = insn_regs_intel_sorted[mid].access;
3011 return insn_regs_intel_sorted[mid].reg;
3027 for (
i = 0;
i <
ARR_SIZE(insn_regs_intel2);
i++) {
3028 if (insn_regs_intel2[
i].insn ==
id) {
3029 *reg1 = insn_regs_intel2[
i].reg1;
3030 *reg2 = insn_regs_intel2[
i].reg2;
3032 *access1 = insn_regs_intel2[
i].access1;
3034 *access2 = insn_regs_intel2[
i].access2;
3048 for (
i = 0;
i <
ARR_SIZE(insn_regs_intel2);
i++) {
3049 if (insn_regs_intel2[
i].insn ==
id) {
3051 *reg1 = insn_regs_intel2[
i].reg2;
3052 *reg2 = insn_regs_intel2[
i].reg1;
3054 *access1 = insn_regs_intel2[
i].access2;
3056 *access2 = insn_regs_intel2[
i].access1;
3070 if (insn_regs_att[
i].insn ==
id) {
3072 *
access = insn_regs_att[
i].access;
3073 return insn_regs_att[
i].reg;
3143 #ifndef CAPSTONE_DIET
3281 #ifndef CAPSTONE_DIET
3283 static void add_cx(
MCInst *MI)
3296 MI->
flat_insn->detail->regs_read_count++;
3299 MI->
flat_insn->detail->regs_write_count++;
3314 #ifndef CAPSTONE_DIET
3320 #ifndef CAPSTONE_DIET // only care about memonic in standard (non-diet) mode
3324 }
else if (valid_bnd(MI->
csh,
opcode)) {
3331 #ifndef CAPSTONE_X86_REDUCE
3332 if (
opcode == X86_MULPDrr) {
3339 #else // diet mode -> only patch opcode in special cases
3343 #ifndef CAPSTONE_X86_REDUCE
3345 if (
opcode == X86_MULPDrr) {
3354 #ifndef CAPSTONE_DIET // only care about memonic in standard (non-diet) mode
3358 }
else if (valid_repe(MI->
csh,
opcode)) {
3366 #ifndef CAPSTONE_X86_REDUCE
3367 if (
opcode == X86_MULPDrr) {
3374 #else // diet mode -> only patch opcode in special cases
3378 #ifndef CAPSTONE_X86_REDUCE
3380 if (
opcode == X86_MULPDrr) {
3415 if (MI->
flat_insn->detail->x86.op_count > 0)
3461 MI->
flat_insn->detail->x86.operands[MI->
flat_insn->detail->x86.op_count - 1].avx_zero_opmask =
true;
3468 MI->
flat_insn->detail->x86.avx_sae =
true;
3476 MI->
flat_insn->detail->x86.operands[MI->
flat_insn->detail->x86.op_count - 1].avx_bcast =
v;
3480 #ifndef CAPSTONE_DIET
3482 typedef struct insn_op {
3487 static insn_op insn_ops[] = {
3493 #ifdef CAPSTONE_X86_REDUCE
3494 #include "X86MappingInsnOp_reduce.inc"
3496 #include "X86MappingInsnOp.inc"
3505 *eflags = insn_ops[
i].flags;
3506 return insn_ops[
i].access;
3513 cs_regs regs_read,
uint8_t *regs_read_count,
3514 cs_regs regs_write,
uint8_t *regs_write_count)
3517 uint8_t read_count, write_count;
3520 read_count = insn->detail->regs_read_count;
3521 write_count = insn->detail->regs_write_count;
3524 memcpy(regs_read, insn->detail->regs_read, read_count *
sizeof(insn->detail->regs_read[0]));
3525 memcpy(regs_write, insn->detail->regs_write, write_count *
sizeof(insn->detail->regs_write[0]));
3528 for (
i = 0;
i <
x86->op_count;
i++) {
3530 switch((
int)
op->type) {
3533 regs_read[read_count] =
op->reg;
3537 regs_write[write_count] =
op->reg;
3544 regs_read[read_count] =
op->mem.segment;
3548 regs_read[read_count] =
op->mem.base;
3552 regs_read[read_count] =
op->mem.index;
3560 *regs_read_count = read_count;
3561 *regs_write_count = write_count;
3566 static struct size_id {
3570 } x86_imm_size[] = {
3571 #include "X86ImmSize.inc"
3582 if (
id == x86_imm_size[
i].
id) {
3583 return x86_imm_size[
i].size;
3589 unsigned int left, right,
m;
3592 right =
ARR_SIZE(x86_imm_size) - 1;
3594 while(left <= right) {
3595 m = (left + right) / 2;
3596 if (
id == x86_imm_size[
m].
id) {
3597 if (enc_size != NULL)
3598 *enc_size = x86_imm_size[
m].enc_size;
3600 return x86_imm_size[
m].size;
3603 if (
id < x86_imm_size[
m].
id)