1*c97d6d2cSSergio Andres Gomez Del Real /* 2*c97d6d2cSSergio Andres Gomez Del Real * Copyright (C) 2016 Veertu Inc, 3*c97d6d2cSSergio Andres Gomez Del Real * Copyright (C) 2017 Google Inc, 4*c97d6d2cSSergio Andres Gomez Del Real * 5*c97d6d2cSSergio Andres Gomez Del Real * This program is free software; you can redistribute it and/or 6*c97d6d2cSSergio Andres Gomez Del Real * modify it under the terms of the GNU General Public License as 7*c97d6d2cSSergio Andres Gomez Del Real * published by the Free Software Foundation; either version 2 or 8*c97d6d2cSSergio Andres Gomez Del Real * (at your option) version 3 of the License. 9*c97d6d2cSSergio Andres Gomez Del Real * 10*c97d6d2cSSergio Andres Gomez Del Real * This program is distributed in the hope that it will be useful, 11*c97d6d2cSSergio Andres Gomez Del Real * but WITHOUT ANY WARRANTY; without even the implied warranty of 12*c97d6d2cSSergio Andres Gomez Del Real * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 13*c97d6d2cSSergio Andres Gomez Del Real * GNU General Public License for more details. 14*c97d6d2cSSergio Andres Gomez Del Real * 15*c97d6d2cSSergio Andres Gomez Del Real * You should have received a copy of the GNU General Public License along 16*c97d6d2cSSergio Andres Gomez Del Real * with this program; if not, see <http://www.gnu.org/licenses/>. 17*c97d6d2cSSergio Andres Gomez Del Real */ 18*c97d6d2cSSergio Andres Gomez Del Real 19*c97d6d2cSSergio Andres Gomez Del Real #include "qemu/osdep.h" 20*c97d6d2cSSergio Andres Gomez Del Real 21*c97d6d2cSSergio Andres Gomez Del Real #include "x86_decode.h" 22*c97d6d2cSSergio Andres Gomez Del Real #include "string.h" 23*c97d6d2cSSergio Andres Gomez Del Real #include "vmx.h" 24*c97d6d2cSSergio Andres Gomez Del Real #include "x86_gen.h" 25*c97d6d2cSSergio Andres Gomez Del Real #include "x86_mmu.h" 26*c97d6d2cSSergio Andres Gomez Del Real #include "x86_descr.h" 27*c97d6d2cSSergio Andres Gomez Del Real 28*c97d6d2cSSergio Andres Gomez Del Real #define OPCODE_ESCAPE 0xf 29*c97d6d2cSSergio Andres Gomez Del Real 30*c97d6d2cSSergio Andres Gomez Del Real static void decode_invalid(CPUX86State *env, struct x86_decode *decode) 31*c97d6d2cSSergio Andres Gomez Del Real { 32*c97d6d2cSSergio Andres Gomez Del Real printf("%llx: failed to decode instruction ", env->hvf_emul->fetch_rip - 33*c97d6d2cSSergio Andres Gomez Del Real decode->len); 34*c97d6d2cSSergio Andres Gomez Del Real for (int i = 0; i < decode->opcode_len; i++) { 35*c97d6d2cSSergio Andres Gomez Del Real printf("%x ", decode->opcode[i]); 36*c97d6d2cSSergio Andres Gomez Del Real } 37*c97d6d2cSSergio Andres Gomez Del Real printf("\n"); 38*c97d6d2cSSergio Andres Gomez Del Real VM_PANIC("decoder failed\n"); 39*c97d6d2cSSergio Andres Gomez Del Real } 40*c97d6d2cSSergio Andres Gomez Del Real 41*c97d6d2cSSergio Andres Gomez Del Real uint64_t sign(uint64_t val, int size) 42*c97d6d2cSSergio Andres Gomez Del Real { 43*c97d6d2cSSergio Andres Gomez Del Real switch (size) { 44*c97d6d2cSSergio Andres Gomez Del Real case 1: 45*c97d6d2cSSergio Andres Gomez Del Real val = (int8_t)val; 46*c97d6d2cSSergio Andres Gomez Del Real break; 47*c97d6d2cSSergio Andres Gomez Del Real case 2: 48*c97d6d2cSSergio Andres Gomez Del Real val = (int16_t)val; 49*c97d6d2cSSergio Andres Gomez Del Real break; 50*c97d6d2cSSergio Andres Gomez Del Real case 4: 51*c97d6d2cSSergio Andres Gomez Del Real val = (int32_t)val; 52*c97d6d2cSSergio Andres Gomez Del Real break; 53*c97d6d2cSSergio Andres Gomez Del Real case 8: 54*c97d6d2cSSergio Andres Gomez Del Real val = (int64_t)val; 55*c97d6d2cSSergio Andres Gomez Del Real break; 56*c97d6d2cSSergio Andres Gomez Del Real default: 57*c97d6d2cSSergio Andres Gomez Del Real VM_PANIC_EX("%s invalid size %d\n", __func__, size); 58*c97d6d2cSSergio Andres Gomez Del Real break; 59*c97d6d2cSSergio Andres Gomez Del Real } 60*c97d6d2cSSergio Andres Gomez Del Real return val; 61*c97d6d2cSSergio Andres Gomez Del Real } 62*c97d6d2cSSergio Andres Gomez Del Real 63*c97d6d2cSSergio Andres Gomez Del Real static inline uint64_t decode_bytes(CPUX86State *env, struct x86_decode *decode, 64*c97d6d2cSSergio Andres Gomez Del Real int size) 65*c97d6d2cSSergio Andres Gomez Del Real { 66*c97d6d2cSSergio Andres Gomez Del Real addr_t val = 0; 67*c97d6d2cSSergio Andres Gomez Del Real 68*c97d6d2cSSergio Andres Gomez Del Real switch (size) { 69*c97d6d2cSSergio Andres Gomez Del Real case 1: 70*c97d6d2cSSergio Andres Gomez Del Real case 2: 71*c97d6d2cSSergio Andres Gomez Del Real case 4: 72*c97d6d2cSSergio Andres Gomez Del Real case 8: 73*c97d6d2cSSergio Andres Gomez Del Real break; 74*c97d6d2cSSergio Andres Gomez Del Real default: 75*c97d6d2cSSergio Andres Gomez Del Real VM_PANIC_EX("%s invalid size %d\n", __func__, size); 76*c97d6d2cSSergio Andres Gomez Del Real break; 77*c97d6d2cSSergio Andres Gomez Del Real } 78*c97d6d2cSSergio Andres Gomez Del Real addr_t va = linear_rip(ENV_GET_CPU(env), RIP(env)) + decode->len; 79*c97d6d2cSSergio Andres Gomez Del Real vmx_read_mem(ENV_GET_CPU(env), &val, va, size); 80*c97d6d2cSSergio Andres Gomez Del Real decode->len += size; 81*c97d6d2cSSergio Andres Gomez Del Real 82*c97d6d2cSSergio Andres Gomez Del Real return val; 83*c97d6d2cSSergio Andres Gomez Del Real } 84*c97d6d2cSSergio Andres Gomez Del Real 85*c97d6d2cSSergio Andres Gomez Del Real static inline uint8_t decode_byte(CPUX86State *env, struct x86_decode *decode) 86*c97d6d2cSSergio Andres Gomez Del Real { 87*c97d6d2cSSergio Andres Gomez Del Real return (uint8_t)decode_bytes(env, decode, 1); 88*c97d6d2cSSergio Andres Gomez Del Real } 89*c97d6d2cSSergio Andres Gomez Del Real 90*c97d6d2cSSergio Andres Gomez Del Real static inline uint16_t decode_word(CPUX86State *env, struct x86_decode *decode) 91*c97d6d2cSSergio Andres Gomez Del Real { 92*c97d6d2cSSergio Andres Gomez Del Real return (uint16_t)decode_bytes(env, decode, 2); 93*c97d6d2cSSergio Andres Gomez Del Real } 94*c97d6d2cSSergio Andres Gomez Del Real 95*c97d6d2cSSergio Andres Gomez Del Real static inline uint32_t decode_dword(CPUX86State *env, struct x86_decode *decode) 96*c97d6d2cSSergio Andres Gomez Del Real { 97*c97d6d2cSSergio Andres Gomez Del Real return (uint32_t)decode_bytes(env, decode, 4); 98*c97d6d2cSSergio Andres Gomez Del Real } 99*c97d6d2cSSergio Andres Gomez Del Real 100*c97d6d2cSSergio Andres Gomez Del Real static inline uint64_t decode_qword(CPUX86State *env, struct x86_decode *decode) 101*c97d6d2cSSergio Andres Gomez Del Real { 102*c97d6d2cSSergio Andres Gomez Del Real return decode_bytes(env, decode, 8); 103*c97d6d2cSSergio Andres Gomez Del Real } 104*c97d6d2cSSergio Andres Gomez Del Real 105*c97d6d2cSSergio Andres Gomez Del Real static void decode_modrm_rm(CPUX86State *env, struct x86_decode *decode, 106*c97d6d2cSSergio Andres Gomez Del Real struct x86_decode_op *op) 107*c97d6d2cSSergio Andres Gomez Del Real { 108*c97d6d2cSSergio Andres Gomez Del Real op->type = X86_VAR_RM; 109*c97d6d2cSSergio Andres Gomez Del Real } 110*c97d6d2cSSergio Andres Gomez Del Real 111*c97d6d2cSSergio Andres Gomez Del Real static void decode_modrm_reg(CPUX86State *env, struct x86_decode *decode, 112*c97d6d2cSSergio Andres Gomez Del Real struct x86_decode_op *op) 113*c97d6d2cSSergio Andres Gomez Del Real { 114*c97d6d2cSSergio Andres Gomez Del Real op->type = X86_VAR_REG; 115*c97d6d2cSSergio Andres Gomez Del Real op->reg = decode->modrm.reg; 116*c97d6d2cSSergio Andres Gomez Del Real op->ptr = get_reg_ref(env, op->reg, decode->rex.r, decode->operand_size); 117*c97d6d2cSSergio Andres Gomez Del Real } 118*c97d6d2cSSergio Andres Gomez Del Real 119*c97d6d2cSSergio Andres Gomez Del Real static void decode_rax(CPUX86State *env, struct x86_decode *decode, 120*c97d6d2cSSergio Andres Gomez Del Real struct x86_decode_op *op) 121*c97d6d2cSSergio Andres Gomez Del Real { 122*c97d6d2cSSergio Andres Gomez Del Real op->type = X86_VAR_REG; 123*c97d6d2cSSergio Andres Gomez Del Real op->reg = REG_RAX; 124*c97d6d2cSSergio Andres Gomez Del Real op->ptr = get_reg_ref(env, op->reg, 0, decode->operand_size); 125*c97d6d2cSSergio Andres Gomez Del Real } 126*c97d6d2cSSergio Andres Gomez Del Real 127*c97d6d2cSSergio Andres Gomez Del Real static inline void decode_immediate(CPUX86State *env, struct x86_decode *decode, 128*c97d6d2cSSergio Andres Gomez Del Real struct x86_decode_op *var, int size) 129*c97d6d2cSSergio Andres Gomez Del Real { 130*c97d6d2cSSergio Andres Gomez Del Real var->type = X86_VAR_IMMEDIATE; 131*c97d6d2cSSergio Andres Gomez Del Real var->size = size; 132*c97d6d2cSSergio Andres Gomez Del Real switch (size) { 133*c97d6d2cSSergio Andres Gomez Del Real case 1: 134*c97d6d2cSSergio Andres Gomez Del Real var->val = decode_byte(env, decode); 135*c97d6d2cSSergio Andres Gomez Del Real break; 136*c97d6d2cSSergio Andres Gomez Del Real case 2: 137*c97d6d2cSSergio Andres Gomez Del Real var->val = decode_word(env, decode); 138*c97d6d2cSSergio Andres Gomez Del Real break; 139*c97d6d2cSSergio Andres Gomez Del Real case 4: 140*c97d6d2cSSergio Andres Gomez Del Real var->val = decode_dword(env, decode); 141*c97d6d2cSSergio Andres Gomez Del Real break; 142*c97d6d2cSSergio Andres Gomez Del Real case 8: 143*c97d6d2cSSergio Andres Gomez Del Real var->val = decode_qword(env, decode); 144*c97d6d2cSSergio Andres Gomez Del Real break; 145*c97d6d2cSSergio Andres Gomez Del Real default: 146*c97d6d2cSSergio Andres Gomez Del Real VM_PANIC_EX("bad size %d\n", size); 147*c97d6d2cSSergio Andres Gomez Del Real } 148*c97d6d2cSSergio Andres Gomez Del Real } 149*c97d6d2cSSergio Andres Gomez Del Real 150*c97d6d2cSSergio Andres Gomez Del Real static void decode_imm8(CPUX86State *env, struct x86_decode *decode, 151*c97d6d2cSSergio Andres Gomez Del Real struct x86_decode_op *op) 152*c97d6d2cSSergio Andres Gomez Del Real { 153*c97d6d2cSSergio Andres Gomez Del Real decode_immediate(env, decode, op, 1); 154*c97d6d2cSSergio Andres Gomez Del Real op->type = X86_VAR_IMMEDIATE; 155*c97d6d2cSSergio Andres Gomez Del Real } 156*c97d6d2cSSergio Andres Gomez Del Real 157*c97d6d2cSSergio Andres Gomez Del Real static void decode_imm8_signed(CPUX86State *env, struct x86_decode *decode, 158*c97d6d2cSSergio Andres Gomez Del Real struct x86_decode_op *op) 159*c97d6d2cSSergio Andres Gomez Del Real { 160*c97d6d2cSSergio Andres Gomez Del Real decode_immediate(env, decode, op, 1); 161*c97d6d2cSSergio Andres Gomez Del Real op->val = sign(op->val, 1); 162*c97d6d2cSSergio Andres Gomez Del Real op->type = X86_VAR_IMMEDIATE; 163*c97d6d2cSSergio Andres Gomez Del Real } 164*c97d6d2cSSergio Andres Gomez Del Real 165*c97d6d2cSSergio Andres Gomez Del Real static void decode_imm16(CPUX86State *env, struct x86_decode *decode, 166*c97d6d2cSSergio Andres Gomez Del Real struct x86_decode_op *op) 167*c97d6d2cSSergio Andres Gomez Del Real { 168*c97d6d2cSSergio Andres Gomez Del Real decode_immediate(env, decode, op, 2); 169*c97d6d2cSSergio Andres Gomez Del Real op->type = X86_VAR_IMMEDIATE; 170*c97d6d2cSSergio Andres Gomez Del Real } 171*c97d6d2cSSergio Andres Gomez Del Real 172*c97d6d2cSSergio Andres Gomez Del Real 173*c97d6d2cSSergio Andres Gomez Del Real static void decode_imm(CPUX86State *env, struct x86_decode *decode, 174*c97d6d2cSSergio Andres Gomez Del Real struct x86_decode_op *op) 175*c97d6d2cSSergio Andres Gomez Del Real { 176*c97d6d2cSSergio Andres Gomez Del Real if (8 == decode->operand_size) { 177*c97d6d2cSSergio Andres Gomez Del Real decode_immediate(env, decode, op, 4); 178*c97d6d2cSSergio Andres Gomez Del Real op->val = sign(op->val, decode->operand_size); 179*c97d6d2cSSergio Andres Gomez Del Real } else { 180*c97d6d2cSSergio Andres Gomez Del Real decode_immediate(env, decode, op, decode->operand_size); 181*c97d6d2cSSergio Andres Gomez Del Real } 182*c97d6d2cSSergio Andres Gomez Del Real op->type = X86_VAR_IMMEDIATE; 183*c97d6d2cSSergio Andres Gomez Del Real } 184*c97d6d2cSSergio Andres Gomez Del Real 185*c97d6d2cSSergio Andres Gomez Del Real static void decode_imm_signed(CPUX86State *env, struct x86_decode *decode, 186*c97d6d2cSSergio Andres Gomez Del Real struct x86_decode_op *op) 187*c97d6d2cSSergio Andres Gomez Del Real { 188*c97d6d2cSSergio Andres Gomez Del Real decode_immediate(env, decode, op, decode->operand_size); 189*c97d6d2cSSergio Andres Gomez Del Real op->val = sign(op->val, decode->operand_size); 190*c97d6d2cSSergio Andres Gomez Del Real op->type = X86_VAR_IMMEDIATE; 191*c97d6d2cSSergio Andres Gomez Del Real } 192*c97d6d2cSSergio Andres Gomez Del Real 193*c97d6d2cSSergio Andres Gomez Del Real static void decode_imm_1(CPUX86State *env, struct x86_decode *decode, 194*c97d6d2cSSergio Andres Gomez Del Real struct x86_decode_op *op) 195*c97d6d2cSSergio Andres Gomez Del Real { 196*c97d6d2cSSergio Andres Gomez Del Real op->type = X86_VAR_IMMEDIATE; 197*c97d6d2cSSergio Andres Gomez Del Real op->val = 1; 198*c97d6d2cSSergio Andres Gomez Del Real } 199*c97d6d2cSSergio Andres Gomez Del Real 200*c97d6d2cSSergio Andres Gomez Del Real static void decode_imm_0(CPUX86State *env, struct x86_decode *decode, 201*c97d6d2cSSergio Andres Gomez Del Real struct x86_decode_op *op) 202*c97d6d2cSSergio Andres Gomez Del Real { 203*c97d6d2cSSergio Andres Gomez Del Real op->type = X86_VAR_IMMEDIATE; 204*c97d6d2cSSergio Andres Gomez Del Real op->val = 0; 205*c97d6d2cSSergio Andres Gomez Del Real } 206*c97d6d2cSSergio Andres Gomez Del Real 207*c97d6d2cSSergio Andres Gomez Del Real 208*c97d6d2cSSergio Andres Gomez Del Real static void decode_pushseg(CPUX86State *env, struct x86_decode *decode) 209*c97d6d2cSSergio Andres Gomez Del Real { 210*c97d6d2cSSergio Andres Gomez Del Real uint8_t op = (decode->opcode_len > 1) ? decode->opcode[1] : decode->opcode[0]; 211*c97d6d2cSSergio Andres Gomez Del Real 212*c97d6d2cSSergio Andres Gomez Del Real decode->op[0].type = X86_VAR_REG; 213*c97d6d2cSSergio Andres Gomez Del Real switch (op) { 214*c97d6d2cSSergio Andres Gomez Del Real case 0xe: 215*c97d6d2cSSergio Andres Gomez Del Real decode->op[0].reg = REG_SEG_CS; 216*c97d6d2cSSergio Andres Gomez Del Real break; 217*c97d6d2cSSergio Andres Gomez Del Real case 0x16: 218*c97d6d2cSSergio Andres Gomez Del Real decode->op[0].reg = REG_SEG_SS; 219*c97d6d2cSSergio Andres Gomez Del Real break; 220*c97d6d2cSSergio Andres Gomez Del Real case 0x1e: 221*c97d6d2cSSergio Andres Gomez Del Real decode->op[0].reg = REG_SEG_DS; 222*c97d6d2cSSergio Andres Gomez Del Real break; 223*c97d6d2cSSergio Andres Gomez Del Real case 0x06: 224*c97d6d2cSSergio Andres Gomez Del Real decode->op[0].reg = REG_SEG_ES; 225*c97d6d2cSSergio Andres Gomez Del Real break; 226*c97d6d2cSSergio Andres Gomez Del Real case 0xa0: 227*c97d6d2cSSergio Andres Gomez Del Real decode->op[0].reg = REG_SEG_FS; 228*c97d6d2cSSergio Andres Gomez Del Real break; 229*c97d6d2cSSergio Andres Gomez Del Real case 0xa8: 230*c97d6d2cSSergio Andres Gomez Del Real decode->op[0].reg = REG_SEG_GS; 231*c97d6d2cSSergio Andres Gomez Del Real break; 232*c97d6d2cSSergio Andres Gomez Del Real } 233*c97d6d2cSSergio Andres Gomez Del Real } 234*c97d6d2cSSergio Andres Gomez Del Real 235*c97d6d2cSSergio Andres Gomez Del Real static void decode_popseg(CPUX86State *env, struct x86_decode *decode) 236*c97d6d2cSSergio Andres Gomez Del Real { 237*c97d6d2cSSergio Andres Gomez Del Real uint8_t op = (decode->opcode_len > 1) ? decode->opcode[1] : decode->opcode[0]; 238*c97d6d2cSSergio Andres Gomez Del Real 239*c97d6d2cSSergio Andres Gomez Del Real decode->op[0].type = X86_VAR_REG; 240*c97d6d2cSSergio Andres Gomez Del Real switch (op) { 241*c97d6d2cSSergio Andres Gomez Del Real case 0xf: 242*c97d6d2cSSergio Andres Gomez Del Real decode->op[0].reg = REG_SEG_CS; 243*c97d6d2cSSergio Andres Gomez Del Real break; 244*c97d6d2cSSergio Andres Gomez Del Real case 0x17: 245*c97d6d2cSSergio Andres Gomez Del Real decode->op[0].reg = REG_SEG_SS; 246*c97d6d2cSSergio Andres Gomez Del Real break; 247*c97d6d2cSSergio Andres Gomez Del Real case 0x1f: 248*c97d6d2cSSergio Andres Gomez Del Real decode->op[0].reg = REG_SEG_DS; 249*c97d6d2cSSergio Andres Gomez Del Real break; 250*c97d6d2cSSergio Andres Gomez Del Real case 0x07: 251*c97d6d2cSSergio Andres Gomez Del Real decode->op[0].reg = REG_SEG_ES; 252*c97d6d2cSSergio Andres Gomez Del Real break; 253*c97d6d2cSSergio Andres Gomez Del Real case 0xa1: 254*c97d6d2cSSergio Andres Gomez Del Real decode->op[0].reg = REG_SEG_FS; 255*c97d6d2cSSergio Andres Gomez Del Real break; 256*c97d6d2cSSergio Andres Gomez Del Real case 0xa9: 257*c97d6d2cSSergio Andres Gomez Del Real decode->op[0].reg = REG_SEG_GS; 258*c97d6d2cSSergio Andres Gomez Del Real break; 259*c97d6d2cSSergio Andres Gomez Del Real } 260*c97d6d2cSSergio Andres Gomez Del Real } 261*c97d6d2cSSergio Andres Gomez Del Real 262*c97d6d2cSSergio Andres Gomez Del Real static void decode_incgroup(CPUX86State *env, struct x86_decode *decode) 263*c97d6d2cSSergio Andres Gomez Del Real { 264*c97d6d2cSSergio Andres Gomez Del Real decode->op[0].type = X86_VAR_REG; 265*c97d6d2cSSergio Andres Gomez Del Real decode->op[0].reg = decode->opcode[0] - 0x40; 266*c97d6d2cSSergio Andres Gomez Del Real decode->op[0].ptr = get_reg_ref(env, decode->op[0].reg, decode->rex.b, 267*c97d6d2cSSergio Andres Gomez Del Real decode->operand_size); 268*c97d6d2cSSergio Andres Gomez Del Real } 269*c97d6d2cSSergio Andres Gomez Del Real 270*c97d6d2cSSergio Andres Gomez Del Real static void decode_decgroup(CPUX86State *env, struct x86_decode *decode) 271*c97d6d2cSSergio Andres Gomez Del Real { 272*c97d6d2cSSergio Andres Gomez Del Real decode->op[0].type = X86_VAR_REG; 273*c97d6d2cSSergio Andres Gomez Del Real decode->op[0].reg = decode->opcode[0] - 0x48; 274*c97d6d2cSSergio Andres Gomez Del Real decode->op[0].ptr = get_reg_ref(env, decode->op[0].reg, decode->rex.b, 275*c97d6d2cSSergio Andres Gomez Del Real decode->operand_size); 276*c97d6d2cSSergio Andres Gomez Del Real } 277*c97d6d2cSSergio Andres Gomez Del Real 278*c97d6d2cSSergio Andres Gomez Del Real static void decode_incgroup2(CPUX86State *env, struct x86_decode *decode) 279*c97d6d2cSSergio Andres Gomez Del Real { 280*c97d6d2cSSergio Andres Gomez Del Real if (!decode->modrm.reg) { 281*c97d6d2cSSergio Andres Gomez Del Real decode->cmd = X86_DECODE_CMD_INC; 282*c97d6d2cSSergio Andres Gomez Del Real } else if (1 == decode->modrm.reg) { 283*c97d6d2cSSergio Andres Gomez Del Real decode->cmd = X86_DECODE_CMD_DEC; 284*c97d6d2cSSergio Andres Gomez Del Real } 285*c97d6d2cSSergio Andres Gomez Del Real } 286*c97d6d2cSSergio Andres Gomez Del Real 287*c97d6d2cSSergio Andres Gomez Del Real static void decode_pushgroup(CPUX86State *env, struct x86_decode *decode) 288*c97d6d2cSSergio Andres Gomez Del Real { 289*c97d6d2cSSergio Andres Gomez Del Real decode->op[0].type = X86_VAR_REG; 290*c97d6d2cSSergio Andres Gomez Del Real decode->op[0].reg = decode->opcode[0] - 0x50; 291*c97d6d2cSSergio Andres Gomez Del Real decode->op[0].ptr = get_reg_ref(env, decode->op[0].reg, decode->rex.b, 292*c97d6d2cSSergio Andres Gomez Del Real decode->operand_size); 293*c97d6d2cSSergio Andres Gomez Del Real } 294*c97d6d2cSSergio Andres Gomez Del Real 295*c97d6d2cSSergio Andres Gomez Del Real static void decode_popgroup(CPUX86State *env, struct x86_decode *decode) 296*c97d6d2cSSergio Andres Gomez Del Real { 297*c97d6d2cSSergio Andres Gomez Del Real decode->op[0].type = X86_VAR_REG; 298*c97d6d2cSSergio Andres Gomez Del Real decode->op[0].reg = decode->opcode[0] - 0x58; 299*c97d6d2cSSergio Andres Gomez Del Real decode->op[0].ptr = get_reg_ref(env, decode->op[0].reg, decode->rex.b, 300*c97d6d2cSSergio Andres Gomez Del Real decode->operand_size); 301*c97d6d2cSSergio Andres Gomez Del Real } 302*c97d6d2cSSergio Andres Gomez Del Real 303*c97d6d2cSSergio Andres Gomez Del Real static void decode_jxx(CPUX86State *env, struct x86_decode *decode) 304*c97d6d2cSSergio Andres Gomez Del Real { 305*c97d6d2cSSergio Andres Gomez Del Real decode->displacement = decode_bytes(env, decode, decode->operand_size); 306*c97d6d2cSSergio Andres Gomez Del Real decode->displacement_size = decode->operand_size; 307*c97d6d2cSSergio Andres Gomez Del Real } 308*c97d6d2cSSergio Andres Gomez Del Real 309*c97d6d2cSSergio Andres Gomez Del Real static void decode_farjmp(CPUX86State *env, struct x86_decode *decode) 310*c97d6d2cSSergio Andres Gomez Del Real { 311*c97d6d2cSSergio Andres Gomez Del Real decode->op[0].type = X86_VAR_IMMEDIATE; 312*c97d6d2cSSergio Andres Gomez Del Real decode->op[0].val = decode_bytes(env, decode, decode->operand_size); 313*c97d6d2cSSergio Andres Gomez Del Real decode->displacement = decode_word(env, decode); 314*c97d6d2cSSergio Andres Gomez Del Real } 315*c97d6d2cSSergio Andres Gomez Del Real 316*c97d6d2cSSergio Andres Gomez Del Real static void decode_addgroup(CPUX86State *env, struct x86_decode *decode) 317*c97d6d2cSSergio Andres Gomez Del Real { 318*c97d6d2cSSergio Andres Gomez Del Real enum x86_decode_cmd group[] = { 319*c97d6d2cSSergio Andres Gomez Del Real X86_DECODE_CMD_ADD, 320*c97d6d2cSSergio Andres Gomez Del Real X86_DECODE_CMD_OR, 321*c97d6d2cSSergio Andres Gomez Del Real X86_DECODE_CMD_ADC, 322*c97d6d2cSSergio Andres Gomez Del Real X86_DECODE_CMD_SBB, 323*c97d6d2cSSergio Andres Gomez Del Real X86_DECODE_CMD_AND, 324*c97d6d2cSSergio Andres Gomez Del Real X86_DECODE_CMD_SUB, 325*c97d6d2cSSergio Andres Gomez Del Real X86_DECODE_CMD_XOR, 326*c97d6d2cSSergio Andres Gomez Del Real X86_DECODE_CMD_CMP 327*c97d6d2cSSergio Andres Gomez Del Real }; 328*c97d6d2cSSergio Andres Gomez Del Real decode->cmd = group[decode->modrm.reg]; 329*c97d6d2cSSergio Andres Gomez Del Real } 330*c97d6d2cSSergio Andres Gomez Del Real 331*c97d6d2cSSergio Andres Gomez Del Real static void decode_rotgroup(CPUX86State *env, struct x86_decode *decode) 332*c97d6d2cSSergio Andres Gomez Del Real { 333*c97d6d2cSSergio Andres Gomez Del Real enum x86_decode_cmd group[] = { 334*c97d6d2cSSergio Andres Gomez Del Real X86_DECODE_CMD_ROL, 335*c97d6d2cSSergio Andres Gomez Del Real X86_DECODE_CMD_ROR, 336*c97d6d2cSSergio Andres Gomez Del Real X86_DECODE_CMD_RCL, 337*c97d6d2cSSergio Andres Gomez Del Real X86_DECODE_CMD_RCR, 338*c97d6d2cSSergio Andres Gomez Del Real X86_DECODE_CMD_SHL, 339*c97d6d2cSSergio Andres Gomez Del Real X86_DECODE_CMD_SHR, 340*c97d6d2cSSergio Andres Gomez Del Real X86_DECODE_CMD_SHL, 341*c97d6d2cSSergio Andres Gomez Del Real X86_DECODE_CMD_SAR 342*c97d6d2cSSergio Andres Gomez Del Real }; 343*c97d6d2cSSergio Andres Gomez Del Real decode->cmd = group[decode->modrm.reg]; 344*c97d6d2cSSergio Andres Gomez Del Real } 345*c97d6d2cSSergio Andres Gomez Del Real 346*c97d6d2cSSergio Andres Gomez Del Real static void decode_f7group(CPUX86State *env, struct x86_decode *decode) 347*c97d6d2cSSergio Andres Gomez Del Real { 348*c97d6d2cSSergio Andres Gomez Del Real enum x86_decode_cmd group[] = { 349*c97d6d2cSSergio Andres Gomez Del Real X86_DECODE_CMD_TST, 350*c97d6d2cSSergio Andres Gomez Del Real X86_DECODE_CMD_TST, 351*c97d6d2cSSergio Andres Gomez Del Real X86_DECODE_CMD_NOT, 352*c97d6d2cSSergio Andres Gomez Del Real X86_DECODE_CMD_NEG, 353*c97d6d2cSSergio Andres Gomez Del Real X86_DECODE_CMD_MUL, 354*c97d6d2cSSergio Andres Gomez Del Real X86_DECODE_CMD_IMUL_1, 355*c97d6d2cSSergio Andres Gomez Del Real X86_DECODE_CMD_DIV, 356*c97d6d2cSSergio Andres Gomez Del Real X86_DECODE_CMD_IDIV 357*c97d6d2cSSergio Andres Gomez Del Real }; 358*c97d6d2cSSergio Andres Gomez Del Real decode->cmd = group[decode->modrm.reg]; 359*c97d6d2cSSergio Andres Gomez Del Real decode_modrm_rm(env, decode, &decode->op[0]); 360*c97d6d2cSSergio Andres Gomez Del Real 361*c97d6d2cSSergio Andres Gomez Del Real switch (decode->modrm.reg) { 362*c97d6d2cSSergio Andres Gomez Del Real case 0: 363*c97d6d2cSSergio Andres Gomez Del Real case 1: 364*c97d6d2cSSergio Andres Gomez Del Real decode_imm(env, decode, &decode->op[1]); 365*c97d6d2cSSergio Andres Gomez Del Real break; 366*c97d6d2cSSergio Andres Gomez Del Real case 2: 367*c97d6d2cSSergio Andres Gomez Del Real break; 368*c97d6d2cSSergio Andres Gomez Del Real case 3: 369*c97d6d2cSSergio Andres Gomez Del Real decode->op[1].type = X86_VAR_IMMEDIATE; 370*c97d6d2cSSergio Andres Gomez Del Real decode->op[1].val = 0; 371*c97d6d2cSSergio Andres Gomez Del Real break; 372*c97d6d2cSSergio Andres Gomez Del Real default: 373*c97d6d2cSSergio Andres Gomez Del Real break; 374*c97d6d2cSSergio Andres Gomez Del Real } 375*c97d6d2cSSergio Andres Gomez Del Real } 376*c97d6d2cSSergio Andres Gomez Del Real 377*c97d6d2cSSergio Andres Gomez Del Real static void decode_xchgroup(CPUX86State *env, struct x86_decode *decode) 378*c97d6d2cSSergio Andres Gomez Del Real { 379*c97d6d2cSSergio Andres Gomez Del Real decode->op[0].type = X86_VAR_REG; 380*c97d6d2cSSergio Andres Gomez Del Real decode->op[0].reg = decode->opcode[0] - 0x90; 381*c97d6d2cSSergio Andres Gomez Del Real decode->op[0].ptr = get_reg_ref(env, decode->op[0].reg, decode->rex.b, 382*c97d6d2cSSergio Andres Gomez Del Real decode->operand_size); 383*c97d6d2cSSergio Andres Gomez Del Real } 384*c97d6d2cSSergio Andres Gomez Del Real 385*c97d6d2cSSergio Andres Gomez Del Real static void decode_movgroup(CPUX86State *env, struct x86_decode *decode) 386*c97d6d2cSSergio Andres Gomez Del Real { 387*c97d6d2cSSergio Andres Gomez Del Real decode->op[0].type = X86_VAR_REG; 388*c97d6d2cSSergio Andres Gomez Del Real decode->op[0].reg = decode->opcode[0] - 0xb8; 389*c97d6d2cSSergio Andres Gomez Del Real decode->op[0].ptr = get_reg_ref(env, decode->op[0].reg, decode->rex.b, 390*c97d6d2cSSergio Andres Gomez Del Real decode->operand_size); 391*c97d6d2cSSergio Andres Gomez Del Real decode_immediate(env, decode, &decode->op[1], decode->operand_size); 392*c97d6d2cSSergio Andres Gomez Del Real } 393*c97d6d2cSSergio Andres Gomez Del Real 394*c97d6d2cSSergio Andres Gomez Del Real static void fetch_moffs(CPUX86State *env, struct x86_decode *decode, 395*c97d6d2cSSergio Andres Gomez Del Real struct x86_decode_op *op) 396*c97d6d2cSSergio Andres Gomez Del Real { 397*c97d6d2cSSergio Andres Gomez Del Real op->type = X86_VAR_OFFSET; 398*c97d6d2cSSergio Andres Gomez Del Real op->ptr = decode_bytes(env, decode, decode->addressing_size); 399*c97d6d2cSSergio Andres Gomez Del Real } 400*c97d6d2cSSergio Andres Gomez Del Real 401*c97d6d2cSSergio Andres Gomez Del Real static void decode_movgroup8(CPUX86State *env, struct x86_decode *decode) 402*c97d6d2cSSergio Andres Gomez Del Real { 403*c97d6d2cSSergio Andres Gomez Del Real decode->op[0].type = X86_VAR_REG; 404*c97d6d2cSSergio Andres Gomez Del Real decode->op[0].reg = decode->opcode[0] - 0xb0; 405*c97d6d2cSSergio Andres Gomez Del Real decode->op[0].ptr = get_reg_ref(env, decode->op[0].reg, decode->rex.b, 406*c97d6d2cSSergio Andres Gomez Del Real decode->operand_size); 407*c97d6d2cSSergio Andres Gomez Del Real decode_immediate(env, decode, &decode->op[1], decode->operand_size); 408*c97d6d2cSSergio Andres Gomez Del Real } 409*c97d6d2cSSergio Andres Gomez Del Real 410*c97d6d2cSSergio Andres Gomez Del Real static void decode_rcx(CPUX86State *env, struct x86_decode *decode, 411*c97d6d2cSSergio Andres Gomez Del Real struct x86_decode_op *op) 412*c97d6d2cSSergio Andres Gomez Del Real { 413*c97d6d2cSSergio Andres Gomez Del Real op->type = X86_VAR_REG; 414*c97d6d2cSSergio Andres Gomez Del Real op->reg = REG_RCX; 415*c97d6d2cSSergio Andres Gomez Del Real op->ptr = get_reg_ref(env, op->reg, decode->rex.b, decode->operand_size); 416*c97d6d2cSSergio Andres Gomez Del Real } 417*c97d6d2cSSergio Andres Gomez Del Real 418*c97d6d2cSSergio Andres Gomez Del Real struct decode_tbl { 419*c97d6d2cSSergio Andres Gomez Del Real uint8_t opcode; 420*c97d6d2cSSergio Andres Gomez Del Real enum x86_decode_cmd cmd; 421*c97d6d2cSSergio Andres Gomez Del Real uint8_t operand_size; 422*c97d6d2cSSergio Andres Gomez Del Real bool is_modrm; 423*c97d6d2cSSergio Andres Gomez Del Real void (*decode_op1)(CPUX86State *env, struct x86_decode *decode, 424*c97d6d2cSSergio Andres Gomez Del Real struct x86_decode_op *op1); 425*c97d6d2cSSergio Andres Gomez Del Real void (*decode_op2)(CPUX86State *env, struct x86_decode *decode, 426*c97d6d2cSSergio Andres Gomez Del Real struct x86_decode_op *op2); 427*c97d6d2cSSergio Andres Gomez Del Real void (*decode_op3)(CPUX86State *env, struct x86_decode *decode, 428*c97d6d2cSSergio Andres Gomez Del Real struct x86_decode_op *op3); 429*c97d6d2cSSergio Andres Gomez Del Real void (*decode_op4)(CPUX86State *env, struct x86_decode *decode, 430*c97d6d2cSSergio Andres Gomez Del Real struct x86_decode_op *op4); 431*c97d6d2cSSergio Andres Gomez Del Real void (*decode_postfix)(CPUX86State *env, struct x86_decode *decode); 432*c97d6d2cSSergio Andres Gomez Del Real addr_t flags_mask; 433*c97d6d2cSSergio Andres Gomez Del Real }; 434*c97d6d2cSSergio Andres Gomez Del Real 435*c97d6d2cSSergio Andres Gomez Del Real struct decode_x87_tbl { 436*c97d6d2cSSergio Andres Gomez Del Real uint8_t opcode; 437*c97d6d2cSSergio Andres Gomez Del Real uint8_t modrm_reg; 438*c97d6d2cSSergio Andres Gomez Del Real uint8_t modrm_mod; 439*c97d6d2cSSergio Andres Gomez Del Real enum x86_decode_cmd cmd; 440*c97d6d2cSSergio Andres Gomez Del Real uint8_t operand_size; 441*c97d6d2cSSergio Andres Gomez Del Real bool rev; 442*c97d6d2cSSergio Andres Gomez Del Real bool pop; 443*c97d6d2cSSergio Andres Gomez Del Real void (*decode_op1)(CPUX86State *env, struct x86_decode *decode, 444*c97d6d2cSSergio Andres Gomez Del Real struct x86_decode_op *op1); 445*c97d6d2cSSergio Andres Gomez Del Real void (*decode_op2)(CPUX86State *env, struct x86_decode *decode, 446*c97d6d2cSSergio Andres Gomez Del Real struct x86_decode_op *op2); 447*c97d6d2cSSergio Andres Gomez Del Real void (*decode_postfix)(CPUX86State *env, struct x86_decode *decode); 448*c97d6d2cSSergio Andres Gomez Del Real addr_t flags_mask; 449*c97d6d2cSSergio Andres Gomez Del Real }; 450*c97d6d2cSSergio Andres Gomez Del Real 451*c97d6d2cSSergio Andres Gomez Del Real struct decode_tbl invl_inst = {0x0, 0, 0, false, NULL, NULL, NULL, NULL, 452*c97d6d2cSSergio Andres Gomez Del Real decode_invalid}; 453*c97d6d2cSSergio Andres Gomez Del Real 454*c97d6d2cSSergio Andres Gomez Del Real struct decode_tbl _decode_tbl1[255]; 455*c97d6d2cSSergio Andres Gomez Del Real struct decode_tbl _decode_tbl2[255]; 456*c97d6d2cSSergio Andres Gomez Del Real struct decode_x87_tbl _decode_tbl3[255]; 457*c97d6d2cSSergio Andres Gomez Del Real 458*c97d6d2cSSergio Andres Gomez Del Real static void decode_x87_ins(CPUX86State *env, struct x86_decode *decode) 459*c97d6d2cSSergio Andres Gomez Del Real { 460*c97d6d2cSSergio Andres Gomez Del Real struct decode_x87_tbl *decoder; 461*c97d6d2cSSergio Andres Gomez Del Real 462*c97d6d2cSSergio Andres Gomez Del Real decode->is_fpu = true; 463*c97d6d2cSSergio Andres Gomez Del Real int mode = decode->modrm.mod == 3 ? 1 : 0; 464*c97d6d2cSSergio Andres Gomez Del Real int index = ((decode->opcode[0] & 0xf) << 4) | (mode << 3) | 465*c97d6d2cSSergio Andres Gomez Del Real decode->modrm.reg; 466*c97d6d2cSSergio Andres Gomez Del Real 467*c97d6d2cSSergio Andres Gomez Del Real decoder = &_decode_tbl3[index]; 468*c97d6d2cSSergio Andres Gomez Del Real 469*c97d6d2cSSergio Andres Gomez Del Real decode->cmd = decoder->cmd; 470*c97d6d2cSSergio Andres Gomez Del Real if (decoder->operand_size) { 471*c97d6d2cSSergio Andres Gomez Del Real decode->operand_size = decoder->operand_size; 472*c97d6d2cSSergio Andres Gomez Del Real } 473*c97d6d2cSSergio Andres Gomez Del Real decode->flags_mask = decoder->flags_mask; 474*c97d6d2cSSergio Andres Gomez Del Real decode->fpop_stack = decoder->pop; 475*c97d6d2cSSergio Andres Gomez Del Real decode->frev = decoder->rev; 476*c97d6d2cSSergio Andres Gomez Del Real 477*c97d6d2cSSergio Andres Gomez Del Real if (decoder->decode_op1) { 478*c97d6d2cSSergio Andres Gomez Del Real decoder->decode_op1(env, decode, &decode->op[0]); 479*c97d6d2cSSergio Andres Gomez Del Real } 480*c97d6d2cSSergio Andres Gomez Del Real if (decoder->decode_op2) { 481*c97d6d2cSSergio Andres Gomez Del Real decoder->decode_op2(env, decode, &decode->op[1]); 482*c97d6d2cSSergio Andres Gomez Del Real } 483*c97d6d2cSSergio Andres Gomez Del Real if (decoder->decode_postfix) { 484*c97d6d2cSSergio Andres Gomez Del Real decoder->decode_postfix(env, decode); 485*c97d6d2cSSergio Andres Gomez Del Real } 486*c97d6d2cSSergio Andres Gomez Del Real 487*c97d6d2cSSergio Andres Gomez Del Real VM_PANIC_ON_EX(!decode->cmd, "x87 opcode %x %x (%x %x) not decoded\n", 488*c97d6d2cSSergio Andres Gomez Del Real decode->opcode[0], decode->modrm.modrm, decoder->modrm_reg, 489*c97d6d2cSSergio Andres Gomez Del Real decoder->modrm_mod); 490*c97d6d2cSSergio Andres Gomez Del Real } 491*c97d6d2cSSergio Andres Gomez Del Real 492*c97d6d2cSSergio Andres Gomez Del Real static void decode_ffgroup(CPUX86State *env, struct x86_decode *decode) 493*c97d6d2cSSergio Andres Gomez Del Real { 494*c97d6d2cSSergio Andres Gomez Del Real enum x86_decode_cmd group[] = { 495*c97d6d2cSSergio Andres Gomez Del Real X86_DECODE_CMD_INC, 496*c97d6d2cSSergio Andres Gomez Del Real X86_DECODE_CMD_DEC, 497*c97d6d2cSSergio Andres Gomez Del Real X86_DECODE_CMD_CALL_NEAR_ABS_INDIRECT, 498*c97d6d2cSSergio Andres Gomez Del Real X86_DECODE_CMD_CALL_FAR_ABS_INDIRECT, 499*c97d6d2cSSergio Andres Gomez Del Real X86_DECODE_CMD_JMP_NEAR_ABS_INDIRECT, 500*c97d6d2cSSergio Andres Gomez Del Real X86_DECODE_CMD_JMP_FAR_ABS_INDIRECT, 501*c97d6d2cSSergio Andres Gomez Del Real X86_DECODE_CMD_PUSH, 502*c97d6d2cSSergio Andres Gomez Del Real X86_DECODE_CMD_INVL, 503*c97d6d2cSSergio Andres Gomez Del Real X86_DECODE_CMD_INVL 504*c97d6d2cSSergio Andres Gomez Del Real }; 505*c97d6d2cSSergio Andres Gomez Del Real decode->cmd = group[decode->modrm.reg]; 506*c97d6d2cSSergio Andres Gomez Del Real if (decode->modrm.reg > 2) { 507*c97d6d2cSSergio Andres Gomez Del Real decode->flags_mask = 0; 508*c97d6d2cSSergio Andres Gomez Del Real } 509*c97d6d2cSSergio Andres Gomez Del Real } 510*c97d6d2cSSergio Andres Gomez Del Real 511*c97d6d2cSSergio Andres Gomez Del Real static void decode_sldtgroup(CPUX86State *env, struct x86_decode *decode) 512*c97d6d2cSSergio Andres Gomez Del Real { 513*c97d6d2cSSergio Andres Gomez Del Real 514*c97d6d2cSSergio Andres Gomez Del Real enum x86_decode_cmd group[] = { 515*c97d6d2cSSergio Andres Gomez Del Real X86_DECODE_CMD_SLDT, 516*c97d6d2cSSergio Andres Gomez Del Real X86_DECODE_CMD_STR, 517*c97d6d2cSSergio Andres Gomez Del Real X86_DECODE_CMD_LLDT, 518*c97d6d2cSSergio Andres Gomez Del Real X86_DECODE_CMD_LTR, 519*c97d6d2cSSergio Andres Gomez Del Real X86_DECODE_CMD_VERR, 520*c97d6d2cSSergio Andres Gomez Del Real X86_DECODE_CMD_VERW, 521*c97d6d2cSSergio Andres Gomez Del Real X86_DECODE_CMD_INVL, 522*c97d6d2cSSergio Andres Gomez Del Real X86_DECODE_CMD_INVL 523*c97d6d2cSSergio Andres Gomez Del Real }; 524*c97d6d2cSSergio Andres Gomez Del Real decode->cmd = group[decode->modrm.reg]; 525*c97d6d2cSSergio Andres Gomez Del Real printf("%llx: decode_sldtgroup: %d\n", env->hvf_emul->fetch_rip, 526*c97d6d2cSSergio Andres Gomez Del Real decode->modrm.reg); 527*c97d6d2cSSergio Andres Gomez Del Real } 528*c97d6d2cSSergio Andres Gomez Del Real 529*c97d6d2cSSergio Andres Gomez Del Real static void decode_lidtgroup(CPUX86State *env, struct x86_decode *decode) 530*c97d6d2cSSergio Andres Gomez Del Real { 531*c97d6d2cSSergio Andres Gomez Del Real enum x86_decode_cmd group[] = { 532*c97d6d2cSSergio Andres Gomez Del Real X86_DECODE_CMD_SGDT, 533*c97d6d2cSSergio Andres Gomez Del Real X86_DECODE_CMD_SIDT, 534*c97d6d2cSSergio Andres Gomez Del Real X86_DECODE_CMD_LGDT, 535*c97d6d2cSSergio Andres Gomez Del Real X86_DECODE_CMD_LIDT, 536*c97d6d2cSSergio Andres Gomez Del Real X86_DECODE_CMD_SMSW, 537*c97d6d2cSSergio Andres Gomez Del Real X86_DECODE_CMD_LMSW, 538*c97d6d2cSSergio Andres Gomez Del Real X86_DECODE_CMD_LMSW, 539*c97d6d2cSSergio Andres Gomez Del Real X86_DECODE_CMD_INVLPG 540*c97d6d2cSSergio Andres Gomez Del Real }; 541*c97d6d2cSSergio Andres Gomez Del Real decode->cmd = group[decode->modrm.reg]; 542*c97d6d2cSSergio Andres Gomez Del Real if (0xf9 == decode->modrm.modrm) { 543*c97d6d2cSSergio Andres Gomez Del Real decode->opcode[decode->len++] = decode->modrm.modrm; 544*c97d6d2cSSergio Andres Gomez Del Real decode->cmd = X86_DECODE_CMD_RDTSCP; 545*c97d6d2cSSergio Andres Gomez Del Real } 546*c97d6d2cSSergio Andres Gomez Del Real } 547*c97d6d2cSSergio Andres Gomez Del Real 548*c97d6d2cSSergio Andres Gomez Del Real static void decode_btgroup(CPUX86State *env, struct x86_decode *decode) 549*c97d6d2cSSergio Andres Gomez Del Real { 550*c97d6d2cSSergio Andres Gomez Del Real enum x86_decode_cmd group[] = { 551*c97d6d2cSSergio Andres Gomez Del Real X86_DECODE_CMD_INVL, 552*c97d6d2cSSergio Andres Gomez Del Real X86_DECODE_CMD_INVL, 553*c97d6d2cSSergio Andres Gomez Del Real X86_DECODE_CMD_INVL, 554*c97d6d2cSSergio Andres Gomez Del Real X86_DECODE_CMD_INVL, 555*c97d6d2cSSergio Andres Gomez Del Real X86_DECODE_CMD_BT, 556*c97d6d2cSSergio Andres Gomez Del Real X86_DECODE_CMD_BTS, 557*c97d6d2cSSergio Andres Gomez Del Real X86_DECODE_CMD_BTR, 558*c97d6d2cSSergio Andres Gomez Del Real X86_DECODE_CMD_BTC 559*c97d6d2cSSergio Andres Gomez Del Real }; 560*c97d6d2cSSergio Andres Gomez Del Real decode->cmd = group[decode->modrm.reg]; 561*c97d6d2cSSergio Andres Gomez Del Real } 562*c97d6d2cSSergio Andres Gomez Del Real 563*c97d6d2cSSergio Andres Gomez Del Real static void decode_x87_general(CPUX86State *env, struct x86_decode *decode) 564*c97d6d2cSSergio Andres Gomez Del Real { 565*c97d6d2cSSergio Andres Gomez Del Real decode->is_fpu = true; 566*c97d6d2cSSergio Andres Gomez Del Real } 567*c97d6d2cSSergio Andres Gomez Del Real 568*c97d6d2cSSergio Andres Gomez Del Real static void decode_x87_modrm_floatp(CPUX86State *env, struct x86_decode *decode, 569*c97d6d2cSSergio Andres Gomez Del Real struct x86_decode_op *op) 570*c97d6d2cSSergio Andres Gomez Del Real { 571*c97d6d2cSSergio Andres Gomez Del Real op->type = X87_VAR_FLOATP; 572*c97d6d2cSSergio Andres Gomez Del Real } 573*c97d6d2cSSergio Andres Gomez Del Real 574*c97d6d2cSSergio Andres Gomez Del Real static void decode_x87_modrm_intp(CPUX86State *env, struct x86_decode *decode, 575*c97d6d2cSSergio Andres Gomez Del Real struct x86_decode_op *op) 576*c97d6d2cSSergio Andres Gomez Del Real { 577*c97d6d2cSSergio Andres Gomez Del Real op->type = X87_VAR_INTP; 578*c97d6d2cSSergio Andres Gomez Del Real } 579*c97d6d2cSSergio Andres Gomez Del Real 580*c97d6d2cSSergio Andres Gomez Del Real static void decode_x87_modrm_bytep(CPUX86State *env, struct x86_decode *decode, 581*c97d6d2cSSergio Andres Gomez Del Real struct x86_decode_op *op) 582*c97d6d2cSSergio Andres Gomez Del Real { 583*c97d6d2cSSergio Andres Gomez Del Real op->type = X87_VAR_BYTEP; 584*c97d6d2cSSergio Andres Gomez Del Real } 585*c97d6d2cSSergio Andres Gomez Del Real 586*c97d6d2cSSergio Andres Gomez Del Real static void decode_x87_modrm_st0(CPUX86State *env, struct x86_decode *decode, 587*c97d6d2cSSergio Andres Gomez Del Real struct x86_decode_op *op) 588*c97d6d2cSSergio Andres Gomez Del Real { 589*c97d6d2cSSergio Andres Gomez Del Real op->type = X87_VAR_REG; 590*c97d6d2cSSergio Andres Gomez Del Real op->reg = 0; 591*c97d6d2cSSergio Andres Gomez Del Real } 592*c97d6d2cSSergio Andres Gomez Del Real 593*c97d6d2cSSergio Andres Gomez Del Real static void decode_decode_x87_modrm_st0(CPUX86State *env, 594*c97d6d2cSSergio Andres Gomez Del Real struct x86_decode *decode, 595*c97d6d2cSSergio Andres Gomez Del Real struct x86_decode_op *op) 596*c97d6d2cSSergio Andres Gomez Del Real { 597*c97d6d2cSSergio Andres Gomez Del Real op->type = X87_VAR_REG; 598*c97d6d2cSSergio Andres Gomez Del Real op->reg = decode->modrm.modrm & 7; 599*c97d6d2cSSergio Andres Gomez Del Real } 600*c97d6d2cSSergio Andres Gomez Del Real 601*c97d6d2cSSergio Andres Gomez Del Real 602*c97d6d2cSSergio Andres Gomez Del Real static void decode_aegroup(CPUX86State *env, struct x86_decode *decode) 603*c97d6d2cSSergio Andres Gomez Del Real { 604*c97d6d2cSSergio Andres Gomez Del Real decode->is_fpu = true; 605*c97d6d2cSSergio Andres Gomez Del Real switch (decode->modrm.reg) { 606*c97d6d2cSSergio Andres Gomez Del Real case 0: 607*c97d6d2cSSergio Andres Gomez Del Real decode->cmd = X86_DECODE_CMD_FXSAVE; 608*c97d6d2cSSergio Andres Gomez Del Real decode_x87_modrm_bytep(env, decode, &decode->op[0]); 609*c97d6d2cSSergio Andres Gomez Del Real break; 610*c97d6d2cSSergio Andres Gomez Del Real case 1: 611*c97d6d2cSSergio Andres Gomez Del Real decode_x87_modrm_bytep(env, decode, &decode->op[0]); 612*c97d6d2cSSergio Andres Gomez Del Real decode->cmd = X86_DECODE_CMD_FXRSTOR; 613*c97d6d2cSSergio Andres Gomez Del Real break; 614*c97d6d2cSSergio Andres Gomez Del Real case 5: 615*c97d6d2cSSergio Andres Gomez Del Real if (decode->modrm.modrm == 0xe8) { 616*c97d6d2cSSergio Andres Gomez Del Real decode->cmd = X86_DECODE_CMD_LFENCE; 617*c97d6d2cSSergio Andres Gomez Del Real } else { 618*c97d6d2cSSergio Andres Gomez Del Real VM_PANIC("xrstor"); 619*c97d6d2cSSergio Andres Gomez Del Real } 620*c97d6d2cSSergio Andres Gomez Del Real break; 621*c97d6d2cSSergio Andres Gomez Del Real case 6: 622*c97d6d2cSSergio Andres Gomez Del Real VM_PANIC_ON(decode->modrm.modrm != 0xf0); 623*c97d6d2cSSergio Andres Gomez Del Real decode->cmd = X86_DECODE_CMD_MFENCE; 624*c97d6d2cSSergio Andres Gomez Del Real break; 625*c97d6d2cSSergio Andres Gomez Del Real case 7: 626*c97d6d2cSSergio Andres Gomez Del Real if (decode->modrm.modrm == 0xf8) { 627*c97d6d2cSSergio Andres Gomez Del Real decode->cmd = X86_DECODE_CMD_SFENCE; 628*c97d6d2cSSergio Andres Gomez Del Real } else { 629*c97d6d2cSSergio Andres Gomez Del Real decode->cmd = X86_DECODE_CMD_CLFLUSH; 630*c97d6d2cSSergio Andres Gomez Del Real } 631*c97d6d2cSSergio Andres Gomez Del Real break; 632*c97d6d2cSSergio Andres Gomez Del Real default: 633*c97d6d2cSSergio Andres Gomez Del Real VM_PANIC_ON_EX(1, "0xae: reg %d\n", decode->modrm.reg); 634*c97d6d2cSSergio Andres Gomez Del Real break; 635*c97d6d2cSSergio Andres Gomez Del Real } 636*c97d6d2cSSergio Andres Gomez Del Real } 637*c97d6d2cSSergio Andres Gomez Del Real 638*c97d6d2cSSergio Andres Gomez Del Real static void decode_bswap(CPUX86State *env, struct x86_decode *decode) 639*c97d6d2cSSergio Andres Gomez Del Real { 640*c97d6d2cSSergio Andres Gomez Del Real decode->op[0].type = X86_VAR_REG; 641*c97d6d2cSSergio Andres Gomez Del Real decode->op[0].reg = decode->opcode[1] - 0xc8; 642*c97d6d2cSSergio Andres Gomez Del Real decode->op[0].ptr = get_reg_ref(env, decode->op[0].reg, decode->rex.b, 643*c97d6d2cSSergio Andres Gomez Del Real decode->operand_size); 644*c97d6d2cSSergio Andres Gomez Del Real } 645*c97d6d2cSSergio Andres Gomez Del Real 646*c97d6d2cSSergio Andres Gomez Del Real static void decode_d9_4(CPUX86State *env, struct x86_decode *decode) 647*c97d6d2cSSergio Andres Gomez Del Real { 648*c97d6d2cSSergio Andres Gomez Del Real switch (decode->modrm.modrm) { 649*c97d6d2cSSergio Andres Gomez Del Real case 0xe0: 650*c97d6d2cSSergio Andres Gomez Del Real /* FCHS */ 651*c97d6d2cSSergio Andres Gomez Del Real decode->cmd = X86_DECODE_CMD_FCHS; 652*c97d6d2cSSergio Andres Gomez Del Real break; 653*c97d6d2cSSergio Andres Gomez Del Real case 0xe1: 654*c97d6d2cSSergio Andres Gomez Del Real decode->cmd = X86_DECODE_CMD_FABS; 655*c97d6d2cSSergio Andres Gomez Del Real break; 656*c97d6d2cSSergio Andres Gomez Del Real case 0xe4: 657*c97d6d2cSSergio Andres Gomez Del Real VM_PANIC_ON_EX(1, "FTST"); 658*c97d6d2cSSergio Andres Gomez Del Real break; 659*c97d6d2cSSergio Andres Gomez Del Real case 0xe5: 660*c97d6d2cSSergio Andres Gomez Del Real /* FXAM */ 661*c97d6d2cSSergio Andres Gomez Del Real decode->cmd = X86_DECODE_CMD_FXAM; 662*c97d6d2cSSergio Andres Gomez Del Real break; 663*c97d6d2cSSergio Andres Gomez Del Real default: 664*c97d6d2cSSergio Andres Gomez Del Real VM_PANIC_ON_EX(1, "FLDENV"); 665*c97d6d2cSSergio Andres Gomez Del Real break; 666*c97d6d2cSSergio Andres Gomez Del Real } 667*c97d6d2cSSergio Andres Gomez Del Real } 668*c97d6d2cSSergio Andres Gomez Del Real 669*c97d6d2cSSergio Andres Gomez Del Real static void decode_db_4(CPUX86State *env, struct x86_decode *decode) 670*c97d6d2cSSergio Andres Gomez Del Real { 671*c97d6d2cSSergio Andres Gomez Del Real switch (decode->modrm.modrm) { 672*c97d6d2cSSergio Andres Gomez Del Real case 0xe0: 673*c97d6d2cSSergio Andres Gomez Del Real VM_PANIC_ON_EX(1, "unhandled FNENI: %x %x\n", decode->opcode[0], 674*c97d6d2cSSergio Andres Gomez Del Real decode->modrm.modrm); 675*c97d6d2cSSergio Andres Gomez Del Real break; 676*c97d6d2cSSergio Andres Gomez Del Real case 0xe1: 677*c97d6d2cSSergio Andres Gomez Del Real VM_PANIC_ON_EX(1, "unhandled FNDISI: %x %x\n", decode->opcode[0], 678*c97d6d2cSSergio Andres Gomez Del Real decode->modrm.modrm); 679*c97d6d2cSSergio Andres Gomez Del Real break; 680*c97d6d2cSSergio Andres Gomez Del Real case 0xe2: 681*c97d6d2cSSergio Andres Gomez Del Real VM_PANIC_ON_EX(1, "unhandled FCLEX: %x %x\n", decode->opcode[0], 682*c97d6d2cSSergio Andres Gomez Del Real decode->modrm.modrm); 683*c97d6d2cSSergio Andres Gomez Del Real break; 684*c97d6d2cSSergio Andres Gomez Del Real case 0xe3: 685*c97d6d2cSSergio Andres Gomez Del Real decode->cmd = X86_DECODE_CMD_FNINIT; 686*c97d6d2cSSergio Andres Gomez Del Real break; 687*c97d6d2cSSergio Andres Gomez Del Real case 0xe4: 688*c97d6d2cSSergio Andres Gomez Del Real decode->cmd = X86_DECODE_CMD_FNSETPM; 689*c97d6d2cSSergio Andres Gomez Del Real break; 690*c97d6d2cSSergio Andres Gomez Del Real default: 691*c97d6d2cSSergio Andres Gomez Del Real VM_PANIC_ON_EX(1, "unhandled fpu opcode: %x %x\n", decode->opcode[0], 692*c97d6d2cSSergio Andres Gomez Del Real decode->modrm.modrm); 693*c97d6d2cSSergio Andres Gomez Del Real break; 694*c97d6d2cSSergio Andres Gomez Del Real } 695*c97d6d2cSSergio Andres Gomez Del Real } 696*c97d6d2cSSergio Andres Gomez Del Real 697*c97d6d2cSSergio Andres Gomez Del Real 698*c97d6d2cSSergio Andres Gomez Del Real #define RFLAGS_MASK_NONE 0 699*c97d6d2cSSergio Andres Gomez Del Real #define RFLAGS_MASK_OSZAPC (RFLAGS_OF | RFLAGS_SF | RFLAGS_ZF | RFLAGS_AF | \ 700*c97d6d2cSSergio Andres Gomez Del Real RFLAGS_PF | RFLAGS_CF) 701*c97d6d2cSSergio Andres Gomez Del Real #define RFLAGS_MASK_LAHF (RFLAGS_SF | RFLAGS_ZF | RFLAGS_AF | RFLAGS_PF | \ 702*c97d6d2cSSergio Andres Gomez Del Real RFLAGS_CF) 703*c97d6d2cSSergio Andres Gomez Del Real #define RFLAGS_MASK_CF (RFLAGS_CF) 704*c97d6d2cSSergio Andres Gomez Del Real #define RFLAGS_MASK_IF (RFLAGS_IF) 705*c97d6d2cSSergio Andres Gomez Del Real #define RFLAGS_MASK_TF (RFLAGS_TF) 706*c97d6d2cSSergio Andres Gomez Del Real #define RFLAGS_MASK_DF (RFLAGS_DF) 707*c97d6d2cSSergio Andres Gomez Del Real #define RFLAGS_MASK_ZF (RFLAGS_ZF) 708*c97d6d2cSSergio Andres Gomez Del Real 709*c97d6d2cSSergio Andres Gomez Del Real struct decode_tbl _1op_inst[] = { 710*c97d6d2cSSergio Andres Gomez Del Real {0x0, X86_DECODE_CMD_ADD, 1, true, decode_modrm_rm, decode_modrm_reg, NULL, 711*c97d6d2cSSergio Andres Gomez Del Real NULL, NULL, RFLAGS_MASK_OSZAPC}, 712*c97d6d2cSSergio Andres Gomez Del Real {0x1, X86_DECODE_CMD_ADD, 0, true, decode_modrm_rm, decode_modrm_reg, NULL, 713*c97d6d2cSSergio Andres Gomez Del Real NULL, NULL, RFLAGS_MASK_OSZAPC}, 714*c97d6d2cSSergio Andres Gomez Del Real {0x2, X86_DECODE_CMD_ADD, 1, true, decode_modrm_reg, decode_modrm_rm, NULL, 715*c97d6d2cSSergio Andres Gomez Del Real NULL, NULL, RFLAGS_MASK_OSZAPC}, 716*c97d6d2cSSergio Andres Gomez Del Real {0x3, X86_DECODE_CMD_ADD, 0, true, decode_modrm_reg, decode_modrm_rm, NULL, 717*c97d6d2cSSergio Andres Gomez Del Real NULL, NULL, RFLAGS_MASK_OSZAPC}, 718*c97d6d2cSSergio Andres Gomez Del Real {0x4, X86_DECODE_CMD_ADD, 1, false, decode_rax, decode_imm8, NULL, NULL, 719*c97d6d2cSSergio Andres Gomez Del Real NULL, RFLAGS_MASK_OSZAPC}, 720*c97d6d2cSSergio Andres Gomez Del Real {0x5, X86_DECODE_CMD_ADD, 0, false, decode_rax, decode_imm, NULL, NULL, 721*c97d6d2cSSergio Andres Gomez Del Real NULL, RFLAGS_MASK_OSZAPC}, 722*c97d6d2cSSergio Andres Gomez Del Real {0x6, X86_DECODE_CMD_PUSH_SEG, 0, false, false, NULL, NULL, NULL, 723*c97d6d2cSSergio Andres Gomez Del Real decode_pushseg, RFLAGS_MASK_NONE}, 724*c97d6d2cSSergio Andres Gomez Del Real {0x7, X86_DECODE_CMD_POP_SEG, 0, false, false, NULL, NULL, NULL, 725*c97d6d2cSSergio Andres Gomez Del Real decode_popseg, RFLAGS_MASK_NONE}, 726*c97d6d2cSSergio Andres Gomez Del Real {0x8, X86_DECODE_CMD_OR, 1, true, decode_modrm_rm, decode_modrm_reg, NULL, 727*c97d6d2cSSergio Andres Gomez Del Real NULL, NULL, RFLAGS_MASK_OSZAPC}, 728*c97d6d2cSSergio Andres Gomez Del Real {0x9, X86_DECODE_CMD_OR, 0, true, decode_modrm_rm, decode_modrm_reg, NULL, 729*c97d6d2cSSergio Andres Gomez Del Real NULL, NULL, RFLAGS_MASK_OSZAPC}, 730*c97d6d2cSSergio Andres Gomez Del Real {0xa, X86_DECODE_CMD_OR, 1, true, decode_modrm_reg, decode_modrm_rm, NULL, 731*c97d6d2cSSergio Andres Gomez Del Real NULL, NULL, RFLAGS_MASK_OSZAPC}, 732*c97d6d2cSSergio Andres Gomez Del Real {0xb, X86_DECODE_CMD_OR, 0, true, decode_modrm_reg, decode_modrm_rm, 733*c97d6d2cSSergio Andres Gomez Del Real NULL, NULL, NULL, RFLAGS_MASK_OSZAPC}, 734*c97d6d2cSSergio Andres Gomez Del Real {0xc, X86_DECODE_CMD_OR, 1, false, decode_rax, decode_imm8, 735*c97d6d2cSSergio Andres Gomez Del Real NULL, NULL, NULL, RFLAGS_MASK_OSZAPC}, 736*c97d6d2cSSergio Andres Gomez Del Real {0xd, X86_DECODE_CMD_OR, 0, false, decode_rax, decode_imm, 737*c97d6d2cSSergio Andres Gomez Del Real NULL, NULL, NULL, RFLAGS_MASK_OSZAPC}, 738*c97d6d2cSSergio Andres Gomez Del Real 739*c97d6d2cSSergio Andres Gomez Del Real {0xe, X86_DECODE_CMD_PUSH_SEG, 0, false, false, 740*c97d6d2cSSergio Andres Gomez Del Real NULL, NULL, NULL, decode_pushseg, RFLAGS_MASK_NONE}, 741*c97d6d2cSSergio Andres Gomez Del Real {0xf, X86_DECODE_CMD_POP_SEG, 0, false, false, 742*c97d6d2cSSergio Andres Gomez Del Real NULL, NULL, NULL, decode_popseg, RFLAGS_MASK_NONE}, 743*c97d6d2cSSergio Andres Gomez Del Real 744*c97d6d2cSSergio Andres Gomez Del Real {0x10, X86_DECODE_CMD_ADC, 1, true, decode_modrm_rm, decode_modrm_reg, 745*c97d6d2cSSergio Andres Gomez Del Real NULL, NULL, NULL, RFLAGS_MASK_OSZAPC}, 746*c97d6d2cSSergio Andres Gomez Del Real {0x11, X86_DECODE_CMD_ADC, 0, true, decode_modrm_rm, decode_modrm_reg, 747*c97d6d2cSSergio Andres Gomez Del Real NULL, NULL, NULL, RFLAGS_MASK_OSZAPC}, 748*c97d6d2cSSergio Andres Gomez Del Real {0x12, X86_DECODE_CMD_ADC, 1, true, decode_modrm_reg, decode_modrm_rm, 749*c97d6d2cSSergio Andres Gomez Del Real NULL, NULL, NULL, RFLAGS_MASK_OSZAPC}, 750*c97d6d2cSSergio Andres Gomez Del Real {0x13, X86_DECODE_CMD_ADC, 0, true, decode_modrm_reg, decode_modrm_rm, 751*c97d6d2cSSergio Andres Gomez Del Real NULL, NULL, NULL, RFLAGS_MASK_OSZAPC}, 752*c97d6d2cSSergio Andres Gomez Del Real {0x14, X86_DECODE_CMD_ADC, 1, false, decode_rax, decode_imm, 753*c97d6d2cSSergio Andres Gomez Del Real NULL, NULL, NULL, RFLAGS_MASK_OSZAPC}, 754*c97d6d2cSSergio Andres Gomez Del Real {0x15, X86_DECODE_CMD_ADC, 0, false, decode_rax, decode_imm, 755*c97d6d2cSSergio Andres Gomez Del Real NULL, NULL, NULL, RFLAGS_MASK_OSZAPC}, 756*c97d6d2cSSergio Andres Gomez Del Real 757*c97d6d2cSSergio Andres Gomez Del Real {0x16, X86_DECODE_CMD_PUSH_SEG, 0, false, false, 758*c97d6d2cSSergio Andres Gomez Del Real NULL, NULL, NULL, decode_pushseg, RFLAGS_MASK_NONE}, 759*c97d6d2cSSergio Andres Gomez Del Real {0x17, X86_DECODE_CMD_POP_SEG, 0, false, false, 760*c97d6d2cSSergio Andres Gomez Del Real NULL, NULL, NULL, decode_popseg, RFLAGS_MASK_NONE}, 761*c97d6d2cSSergio Andres Gomez Del Real 762*c97d6d2cSSergio Andres Gomez Del Real {0x18, X86_DECODE_CMD_SBB, 1, true, decode_modrm_rm, decode_modrm_reg, 763*c97d6d2cSSergio Andres Gomez Del Real NULL, NULL, NULL, RFLAGS_MASK_OSZAPC}, 764*c97d6d2cSSergio Andres Gomez Del Real {0x19, X86_DECODE_CMD_SBB, 0, true, decode_modrm_rm, decode_modrm_reg, 765*c97d6d2cSSergio Andres Gomez Del Real NULL, NULL, NULL, RFLAGS_MASK_OSZAPC}, 766*c97d6d2cSSergio Andres Gomez Del Real {0x1a, X86_DECODE_CMD_SBB, 1, true, decode_modrm_reg, decode_modrm_rm, 767*c97d6d2cSSergio Andres Gomez Del Real NULL, NULL, NULL, RFLAGS_MASK_OSZAPC}, 768*c97d6d2cSSergio Andres Gomez Del Real {0x1b, X86_DECODE_CMD_SBB, 0, true, decode_modrm_reg, decode_modrm_rm, 769*c97d6d2cSSergio Andres Gomez Del Real NULL, NULL, NULL, RFLAGS_MASK_OSZAPC}, 770*c97d6d2cSSergio Andres Gomez Del Real {0x1c, X86_DECODE_CMD_SBB, 1, false, decode_rax, decode_imm8, 771*c97d6d2cSSergio Andres Gomez Del Real NULL, NULL, NULL, RFLAGS_MASK_OSZAPC}, 772*c97d6d2cSSergio Andres Gomez Del Real {0x1d, X86_DECODE_CMD_SBB, 0, false, decode_rax, decode_imm, 773*c97d6d2cSSergio Andres Gomez Del Real NULL, NULL, NULL, RFLAGS_MASK_OSZAPC}, 774*c97d6d2cSSergio Andres Gomez Del Real 775*c97d6d2cSSergio Andres Gomez Del Real {0x1e, X86_DECODE_CMD_PUSH_SEG, 0, false, false, 776*c97d6d2cSSergio Andres Gomez Del Real NULL, NULL, NULL, decode_pushseg, RFLAGS_MASK_NONE}, 777*c97d6d2cSSergio Andres Gomez Del Real {0x1f, X86_DECODE_CMD_POP_SEG, 0, false, false, 778*c97d6d2cSSergio Andres Gomez Del Real NULL, NULL, NULL, decode_popseg, RFLAGS_MASK_NONE}, 779*c97d6d2cSSergio Andres Gomez Del Real 780*c97d6d2cSSergio Andres Gomez Del Real {0x20, X86_DECODE_CMD_AND, 1, true, decode_modrm_rm, decode_modrm_reg, 781*c97d6d2cSSergio Andres Gomez Del Real NULL, NULL, NULL, RFLAGS_MASK_OSZAPC}, 782*c97d6d2cSSergio Andres Gomez Del Real {0x21, X86_DECODE_CMD_AND, 0, true, decode_modrm_rm, decode_modrm_reg, 783*c97d6d2cSSergio Andres Gomez Del Real NULL, NULL, NULL, RFLAGS_MASK_OSZAPC}, 784*c97d6d2cSSergio Andres Gomez Del Real {0x22, X86_DECODE_CMD_AND, 1, true, decode_modrm_reg, decode_modrm_rm, 785*c97d6d2cSSergio Andres Gomez Del Real NULL, NULL, NULL, RFLAGS_MASK_OSZAPC}, 786*c97d6d2cSSergio Andres Gomez Del Real {0x23, X86_DECODE_CMD_AND, 0, true, decode_modrm_reg, decode_modrm_rm, 787*c97d6d2cSSergio Andres Gomez Del Real NULL, NULL, NULL, RFLAGS_MASK_OSZAPC}, 788*c97d6d2cSSergio Andres Gomez Del Real {0x24, X86_DECODE_CMD_AND, 1, false, decode_rax, decode_imm, 789*c97d6d2cSSergio Andres Gomez Del Real NULL, NULL, NULL, RFLAGS_MASK_OSZAPC}, 790*c97d6d2cSSergio Andres Gomez Del Real {0x25, X86_DECODE_CMD_AND, 0, false, decode_rax, decode_imm, 791*c97d6d2cSSergio Andres Gomez Del Real NULL, NULL, NULL, RFLAGS_MASK_OSZAPC}, 792*c97d6d2cSSergio Andres Gomez Del Real {0x28, X86_DECODE_CMD_SUB, 1, true, decode_modrm_rm, decode_modrm_reg, 793*c97d6d2cSSergio Andres Gomez Del Real NULL, NULL, NULL, RFLAGS_MASK_OSZAPC}, 794*c97d6d2cSSergio Andres Gomez Del Real {0x29, X86_DECODE_CMD_SUB, 0, true, decode_modrm_rm, decode_modrm_reg, 795*c97d6d2cSSergio Andres Gomez Del Real NULL, NULL, NULL, RFLAGS_MASK_OSZAPC}, 796*c97d6d2cSSergio Andres Gomez Del Real {0x2a, X86_DECODE_CMD_SUB, 1, true, decode_modrm_reg, decode_modrm_rm, 797*c97d6d2cSSergio Andres Gomez Del Real NULL, NULL, NULL, RFLAGS_MASK_OSZAPC}, 798*c97d6d2cSSergio Andres Gomez Del Real {0x2b, X86_DECODE_CMD_SUB, 0, true, decode_modrm_reg, decode_modrm_rm, 799*c97d6d2cSSergio Andres Gomez Del Real NULL, NULL, NULL, RFLAGS_MASK_OSZAPC}, 800*c97d6d2cSSergio Andres Gomez Del Real {0x2c, X86_DECODE_CMD_SUB, 1, false, decode_rax, decode_imm, 801*c97d6d2cSSergio Andres Gomez Del Real NULL, NULL, NULL, RFLAGS_MASK_OSZAPC}, 802*c97d6d2cSSergio Andres Gomez Del Real {0x2d, X86_DECODE_CMD_SUB, 0, false, decode_rax, decode_imm, 803*c97d6d2cSSergio Andres Gomez Del Real NULL, NULL, NULL, RFLAGS_MASK_OSZAPC}, 804*c97d6d2cSSergio Andres Gomez Del Real {0x2f, X86_DECODE_CMD_DAS, 0, false, 805*c97d6d2cSSergio Andres Gomez Del Real NULL, NULL, NULL, NULL, NULL, RFLAGS_MASK_OSZAPC}, 806*c97d6d2cSSergio Andres Gomez Del Real {0x30, X86_DECODE_CMD_XOR, 1, true, decode_modrm_rm, decode_modrm_reg, 807*c97d6d2cSSergio Andres Gomez Del Real NULL, NULL, NULL, RFLAGS_MASK_OSZAPC}, 808*c97d6d2cSSergio Andres Gomez Del Real {0x31, X86_DECODE_CMD_XOR, 0, true, decode_modrm_rm, decode_modrm_reg, 809*c97d6d2cSSergio Andres Gomez Del Real NULL, NULL, NULL, RFLAGS_MASK_OSZAPC}, 810*c97d6d2cSSergio Andres Gomez Del Real {0x32, X86_DECODE_CMD_XOR, 1, true, decode_modrm_reg, decode_modrm_rm, 811*c97d6d2cSSergio Andres Gomez Del Real NULL, NULL, NULL, RFLAGS_MASK_OSZAPC}, 812*c97d6d2cSSergio Andres Gomez Del Real {0x33, X86_DECODE_CMD_XOR, 0, true, decode_modrm_reg, decode_modrm_rm, 813*c97d6d2cSSergio Andres Gomez Del Real NULL, NULL, NULL, RFLAGS_MASK_OSZAPC}, 814*c97d6d2cSSergio Andres Gomez Del Real {0x34, X86_DECODE_CMD_XOR, 1, false, decode_rax, decode_imm, 815*c97d6d2cSSergio Andres Gomez Del Real NULL, NULL, NULL, RFLAGS_MASK_OSZAPC}, 816*c97d6d2cSSergio Andres Gomez Del Real {0x35, X86_DECODE_CMD_XOR, 0, false, decode_rax, decode_imm, 817*c97d6d2cSSergio Andres Gomez Del Real NULL, NULL, NULL, RFLAGS_MASK_OSZAPC}, 818*c97d6d2cSSergio Andres Gomez Del Real 819*c97d6d2cSSergio Andres Gomez Del Real {0x38, X86_DECODE_CMD_CMP, 1, true, decode_modrm_rm, decode_modrm_reg, 820*c97d6d2cSSergio Andres Gomez Del Real NULL, NULL, NULL, RFLAGS_MASK_OSZAPC}, 821*c97d6d2cSSergio Andres Gomez Del Real {0x39, X86_DECODE_CMD_CMP, 0, true, decode_modrm_rm, decode_modrm_reg, 822*c97d6d2cSSergio Andres Gomez Del Real NULL, NULL, NULL, RFLAGS_MASK_OSZAPC}, 823*c97d6d2cSSergio Andres Gomez Del Real {0x3a, X86_DECODE_CMD_CMP, 1, true, decode_modrm_reg, decode_modrm_rm, 824*c97d6d2cSSergio Andres Gomez Del Real NULL, NULL, NULL, RFLAGS_MASK_OSZAPC}, 825*c97d6d2cSSergio Andres Gomez Del Real {0x3b, X86_DECODE_CMD_CMP, 0, true, decode_modrm_reg, decode_modrm_rm, 826*c97d6d2cSSergio Andres Gomez Del Real NULL, NULL, NULL, RFLAGS_MASK_OSZAPC}, 827*c97d6d2cSSergio Andres Gomez Del Real {0x3c, X86_DECODE_CMD_CMP, 1, false, decode_rax, decode_imm8, 828*c97d6d2cSSergio Andres Gomez Del Real NULL, NULL, NULL, RFLAGS_MASK_OSZAPC}, 829*c97d6d2cSSergio Andres Gomez Del Real {0x3d, X86_DECODE_CMD_CMP, 0, false, decode_rax, decode_imm, 830*c97d6d2cSSergio Andres Gomez Del Real NULL, NULL, NULL, RFLAGS_MASK_OSZAPC}, 831*c97d6d2cSSergio Andres Gomez Del Real 832*c97d6d2cSSergio Andres Gomez Del Real {0x3f, X86_DECODE_CMD_AAS, 0, false, 833*c97d6d2cSSergio Andres Gomez Del Real NULL, NULL, NULL, NULL, NULL, RFLAGS_MASK_OSZAPC}, 834*c97d6d2cSSergio Andres Gomez Del Real 835*c97d6d2cSSergio Andres Gomez Del Real {0x40, X86_DECODE_CMD_INC, 0, false, 836*c97d6d2cSSergio Andres Gomez Del Real NULL, NULL, NULL, NULL, decode_incgroup, RFLAGS_MASK_OSZAPC}, 837*c97d6d2cSSergio Andres Gomez Del Real {0x41, X86_DECODE_CMD_INC, 0, false, 838*c97d6d2cSSergio Andres Gomez Del Real NULL, NULL, NULL, NULL, decode_incgroup, RFLAGS_MASK_OSZAPC}, 839*c97d6d2cSSergio Andres Gomez Del Real {0x42, X86_DECODE_CMD_INC, 0, false, 840*c97d6d2cSSergio Andres Gomez Del Real NULL, NULL, NULL, NULL, decode_incgroup, RFLAGS_MASK_OSZAPC}, 841*c97d6d2cSSergio Andres Gomez Del Real {0x43, X86_DECODE_CMD_INC, 0, false, 842*c97d6d2cSSergio Andres Gomez Del Real NULL, NULL, NULL, NULL, decode_incgroup, RFLAGS_MASK_OSZAPC}, 843*c97d6d2cSSergio Andres Gomez Del Real {0x44, X86_DECODE_CMD_INC, 0, false, 844*c97d6d2cSSergio Andres Gomez Del Real NULL, NULL, NULL, NULL, decode_incgroup, RFLAGS_MASK_OSZAPC}, 845*c97d6d2cSSergio Andres Gomez Del Real {0x45, X86_DECODE_CMD_INC, 0, false, 846*c97d6d2cSSergio Andres Gomez Del Real NULL, NULL, NULL, NULL, decode_incgroup, RFLAGS_MASK_OSZAPC}, 847*c97d6d2cSSergio Andres Gomez Del Real {0x46, X86_DECODE_CMD_INC, 0, false, 848*c97d6d2cSSergio Andres Gomez Del Real NULL, NULL, NULL, NULL, decode_incgroup, RFLAGS_MASK_OSZAPC}, 849*c97d6d2cSSergio Andres Gomez Del Real {0x47, X86_DECODE_CMD_INC, 0, false, 850*c97d6d2cSSergio Andres Gomez Del Real NULL, NULL, NULL, NULL, decode_incgroup, RFLAGS_MASK_OSZAPC}, 851*c97d6d2cSSergio Andres Gomez Del Real 852*c97d6d2cSSergio Andres Gomez Del Real {0x48, X86_DECODE_CMD_DEC, 0, false, 853*c97d6d2cSSergio Andres Gomez Del Real NULL, NULL, NULL, NULL, decode_decgroup, RFLAGS_MASK_OSZAPC}, 854*c97d6d2cSSergio Andres Gomez Del Real {0x49, X86_DECODE_CMD_DEC, 0, false, 855*c97d6d2cSSergio Andres Gomez Del Real NULL, NULL, NULL, NULL, decode_decgroup, RFLAGS_MASK_OSZAPC}, 856*c97d6d2cSSergio Andres Gomez Del Real {0x4a, X86_DECODE_CMD_DEC, 0, false, 857*c97d6d2cSSergio Andres Gomez Del Real NULL, NULL, NULL, NULL, decode_decgroup, RFLAGS_MASK_OSZAPC}, 858*c97d6d2cSSergio Andres Gomez Del Real {0x4b, X86_DECODE_CMD_DEC, 0, false, 859*c97d6d2cSSergio Andres Gomez Del Real NULL, NULL, NULL, NULL, decode_decgroup, RFLAGS_MASK_OSZAPC}, 860*c97d6d2cSSergio Andres Gomez Del Real {0x4c, X86_DECODE_CMD_DEC, 0, false, 861*c97d6d2cSSergio Andres Gomez Del Real NULL, NULL, NULL, NULL, decode_decgroup, RFLAGS_MASK_OSZAPC}, 862*c97d6d2cSSergio Andres Gomez Del Real {0x4d, X86_DECODE_CMD_DEC, 0, false, 863*c97d6d2cSSergio Andres Gomez Del Real NULL, NULL, NULL, NULL, decode_decgroup, RFLAGS_MASK_OSZAPC}, 864*c97d6d2cSSergio Andres Gomez Del Real {0x4e, X86_DECODE_CMD_DEC, 0, false, 865*c97d6d2cSSergio Andres Gomez Del Real NULL, NULL, NULL, NULL, decode_decgroup, RFLAGS_MASK_OSZAPC}, 866*c97d6d2cSSergio Andres Gomez Del Real {0x4f, X86_DECODE_CMD_DEC, 0, false, 867*c97d6d2cSSergio Andres Gomez Del Real NULL, NULL, NULL, NULL, decode_decgroup, RFLAGS_MASK_OSZAPC}, 868*c97d6d2cSSergio Andres Gomez Del Real 869*c97d6d2cSSergio Andres Gomez Del Real {0x50, X86_DECODE_CMD_PUSH, 0, false, 870*c97d6d2cSSergio Andres Gomez Del Real NULL, NULL, NULL, NULL, decode_pushgroup, RFLAGS_MASK_NONE}, 871*c97d6d2cSSergio Andres Gomez Del Real {0x51, X86_DECODE_CMD_PUSH, 0, false, 872*c97d6d2cSSergio Andres Gomez Del Real NULL, NULL, NULL, NULL, decode_pushgroup, RFLAGS_MASK_NONE}, 873*c97d6d2cSSergio Andres Gomez Del Real {0x52, X86_DECODE_CMD_PUSH, 0, false, 874*c97d6d2cSSergio Andres Gomez Del Real NULL, NULL, NULL, NULL, decode_pushgroup, RFLAGS_MASK_NONE}, 875*c97d6d2cSSergio Andres Gomez Del Real {0x53, X86_DECODE_CMD_PUSH, 0, false, 876*c97d6d2cSSergio Andres Gomez Del Real NULL, NULL, NULL, NULL, decode_pushgroup, RFLAGS_MASK_NONE}, 877*c97d6d2cSSergio Andres Gomez Del Real {0x54, X86_DECODE_CMD_PUSH, 0, false, 878*c97d6d2cSSergio Andres Gomez Del Real NULL, NULL, NULL, NULL, decode_pushgroup, RFLAGS_MASK_NONE}, 879*c97d6d2cSSergio Andres Gomez Del Real {0x55, X86_DECODE_CMD_PUSH, 0, false, 880*c97d6d2cSSergio Andres Gomez Del Real NULL, NULL, NULL, NULL, decode_pushgroup, RFLAGS_MASK_NONE}, 881*c97d6d2cSSergio Andres Gomez Del Real {0x56, X86_DECODE_CMD_PUSH, 0, false, 882*c97d6d2cSSergio Andres Gomez Del Real NULL, NULL, NULL, NULL, decode_pushgroup, RFLAGS_MASK_NONE}, 883*c97d6d2cSSergio Andres Gomez Del Real {0x57, X86_DECODE_CMD_PUSH, 0, false, 884*c97d6d2cSSergio Andres Gomez Del Real NULL, NULL, NULL, NULL, decode_pushgroup, RFLAGS_MASK_NONE}, 885*c97d6d2cSSergio Andres Gomez Del Real 886*c97d6d2cSSergio Andres Gomez Del Real {0x58, X86_DECODE_CMD_POP, 0, false, 887*c97d6d2cSSergio Andres Gomez Del Real NULL, NULL, NULL, NULL, decode_popgroup, RFLAGS_MASK_NONE}, 888*c97d6d2cSSergio Andres Gomez Del Real {0x59, X86_DECODE_CMD_POP, 0, false, 889*c97d6d2cSSergio Andres Gomez Del Real NULL, NULL, NULL, NULL, decode_popgroup, RFLAGS_MASK_NONE}, 890*c97d6d2cSSergio Andres Gomez Del Real {0x5a, X86_DECODE_CMD_POP, 0, false, 891*c97d6d2cSSergio Andres Gomez Del Real NULL, NULL, NULL, NULL, decode_popgroup, RFLAGS_MASK_NONE}, 892*c97d6d2cSSergio Andres Gomez Del Real {0x5b, X86_DECODE_CMD_POP, 0, false, 893*c97d6d2cSSergio Andres Gomez Del Real NULL, NULL, NULL, NULL, decode_popgroup, RFLAGS_MASK_NONE}, 894*c97d6d2cSSergio Andres Gomez Del Real {0x5c, X86_DECODE_CMD_POP, 0, false, 895*c97d6d2cSSergio Andres Gomez Del Real NULL, NULL, NULL, NULL, decode_popgroup, RFLAGS_MASK_NONE}, 896*c97d6d2cSSergio Andres Gomez Del Real {0x5d, X86_DECODE_CMD_POP, 0, false, 897*c97d6d2cSSergio Andres Gomez Del Real NULL, NULL, NULL, NULL, decode_popgroup, RFLAGS_MASK_NONE}, 898*c97d6d2cSSergio Andres Gomez Del Real {0x5e, X86_DECODE_CMD_POP, 0, false, 899*c97d6d2cSSergio Andres Gomez Del Real NULL, NULL, NULL, NULL, decode_popgroup, RFLAGS_MASK_NONE}, 900*c97d6d2cSSergio Andres Gomez Del Real {0x5f, X86_DECODE_CMD_POP, 0, false, 901*c97d6d2cSSergio Andres Gomez Del Real NULL, NULL, NULL, NULL, decode_popgroup, RFLAGS_MASK_NONE}, 902*c97d6d2cSSergio Andres Gomez Del Real 903*c97d6d2cSSergio Andres Gomez Del Real {0x60, X86_DECODE_CMD_PUSHA, 0, false, 904*c97d6d2cSSergio Andres Gomez Del Real NULL, NULL, NULL, NULL, NULL, RFLAGS_MASK_NONE}, 905*c97d6d2cSSergio Andres Gomez Del Real {0x61, X86_DECODE_CMD_POPA, 0, false, 906*c97d6d2cSSergio Andres Gomez Del Real NULL, NULL, NULL, NULL, NULL, RFLAGS_MASK_NONE}, 907*c97d6d2cSSergio Andres Gomez Del Real 908*c97d6d2cSSergio Andres Gomez Del Real {0x68, X86_DECODE_CMD_PUSH, 0, false, decode_imm, 909*c97d6d2cSSergio Andres Gomez Del Real NULL, NULL, NULL, NULL, RFLAGS_MASK_NONE}, 910*c97d6d2cSSergio Andres Gomez Del Real {0x6a, X86_DECODE_CMD_PUSH, 0, false, decode_imm8_signed, 911*c97d6d2cSSergio Andres Gomez Del Real NULL, NULL, NULL, NULL, RFLAGS_MASK_NONE}, 912*c97d6d2cSSergio Andres Gomez Del Real {0x69, X86_DECODE_CMD_IMUL_3, 0, true, decode_modrm_reg, 913*c97d6d2cSSergio Andres Gomez Del Real decode_modrm_rm, decode_imm, NULL, NULL, RFLAGS_MASK_OSZAPC}, 914*c97d6d2cSSergio Andres Gomez Del Real {0x6b, X86_DECODE_CMD_IMUL_3, 0, true, decode_modrm_reg, decode_modrm_rm, 915*c97d6d2cSSergio Andres Gomez Del Real decode_imm8_signed, NULL, NULL, RFLAGS_MASK_OSZAPC}, 916*c97d6d2cSSergio Andres Gomez Del Real 917*c97d6d2cSSergio Andres Gomez Del Real {0x6c, X86_DECODE_CMD_INS, 1, false, 918*c97d6d2cSSergio Andres Gomez Del Real NULL, NULL, NULL, NULL, NULL, RFLAGS_MASK_NONE}, 919*c97d6d2cSSergio Andres Gomez Del Real {0x6d, X86_DECODE_CMD_INS, 0, false, 920*c97d6d2cSSergio Andres Gomez Del Real NULL, NULL, NULL, NULL, NULL, RFLAGS_MASK_NONE}, 921*c97d6d2cSSergio Andres Gomez Del Real {0x6e, X86_DECODE_CMD_OUTS, 1, false, 922*c97d6d2cSSergio Andres Gomez Del Real NULL, NULL, NULL, NULL, NULL, RFLAGS_MASK_NONE}, 923*c97d6d2cSSergio Andres Gomez Del Real {0x6f, X86_DECODE_CMD_OUTS, 0, false, 924*c97d6d2cSSergio Andres Gomez Del Real NULL, NULL, NULL, NULL, NULL, RFLAGS_MASK_NONE}, 925*c97d6d2cSSergio Andres Gomez Del Real 926*c97d6d2cSSergio Andres Gomez Del Real {0x70, X86_DECODE_CMD_JXX, 1, false, 927*c97d6d2cSSergio Andres Gomez Del Real NULL, NULL, NULL, NULL, decode_jxx, RFLAGS_MASK_NONE}, 928*c97d6d2cSSergio Andres Gomez Del Real {0x71, X86_DECODE_CMD_JXX, 1, false, 929*c97d6d2cSSergio Andres Gomez Del Real NULL, NULL, NULL, NULL, decode_jxx, RFLAGS_MASK_NONE}, 930*c97d6d2cSSergio Andres Gomez Del Real {0x72, X86_DECODE_CMD_JXX, 1, false, 931*c97d6d2cSSergio Andres Gomez Del Real NULL, NULL, NULL, NULL, decode_jxx, RFLAGS_MASK_NONE}, 932*c97d6d2cSSergio Andres Gomez Del Real {0x73, X86_DECODE_CMD_JXX, 1, false, 933*c97d6d2cSSergio Andres Gomez Del Real NULL, NULL, NULL, NULL, decode_jxx, RFLAGS_MASK_NONE}, 934*c97d6d2cSSergio Andres Gomez Del Real {0x74, X86_DECODE_CMD_JXX, 1, false, 935*c97d6d2cSSergio Andres Gomez Del Real NULL, NULL, NULL, NULL, decode_jxx, RFLAGS_MASK_NONE}, 936*c97d6d2cSSergio Andres Gomez Del Real {0x75, X86_DECODE_CMD_JXX, 1, false, 937*c97d6d2cSSergio Andres Gomez Del Real NULL, NULL, NULL, NULL, decode_jxx, RFLAGS_MASK_NONE}, 938*c97d6d2cSSergio Andres Gomez Del Real {0x76, X86_DECODE_CMD_JXX, 1, false, 939*c97d6d2cSSergio Andres Gomez Del Real NULL, NULL, NULL, NULL, decode_jxx, RFLAGS_MASK_NONE}, 940*c97d6d2cSSergio Andres Gomez Del Real {0x77, X86_DECODE_CMD_JXX, 1, false, 941*c97d6d2cSSergio Andres Gomez Del Real NULL, NULL, NULL, NULL, decode_jxx, RFLAGS_MASK_NONE}, 942*c97d6d2cSSergio Andres Gomez Del Real {0x78, X86_DECODE_CMD_JXX, 1, false, 943*c97d6d2cSSergio Andres Gomez Del Real NULL, NULL, NULL, NULL, decode_jxx, RFLAGS_MASK_NONE}, 944*c97d6d2cSSergio Andres Gomez Del Real {0x79, X86_DECODE_CMD_JXX, 1, false, 945*c97d6d2cSSergio Andres Gomez Del Real NULL, NULL, NULL, NULL, decode_jxx, RFLAGS_MASK_NONE}, 946*c97d6d2cSSergio Andres Gomez Del Real {0x7a, X86_DECODE_CMD_JXX, 1, false, 947*c97d6d2cSSergio Andres Gomez Del Real NULL, NULL, NULL, NULL, decode_jxx, RFLAGS_MASK_NONE}, 948*c97d6d2cSSergio Andres Gomez Del Real {0x7b, X86_DECODE_CMD_JXX, 1, false, 949*c97d6d2cSSergio Andres Gomez Del Real NULL, NULL, NULL, NULL, decode_jxx, RFLAGS_MASK_NONE}, 950*c97d6d2cSSergio Andres Gomez Del Real {0x7c, X86_DECODE_CMD_JXX, 1, false, 951*c97d6d2cSSergio Andres Gomez Del Real NULL, NULL, NULL, NULL, decode_jxx, RFLAGS_MASK_NONE}, 952*c97d6d2cSSergio Andres Gomez Del Real {0x7d, X86_DECODE_CMD_JXX, 1, false, 953*c97d6d2cSSergio Andres Gomez Del Real NULL, NULL, NULL, NULL, decode_jxx, RFLAGS_MASK_NONE}, 954*c97d6d2cSSergio Andres Gomez Del Real {0x7e, X86_DECODE_CMD_JXX, 1, false, 955*c97d6d2cSSergio Andres Gomez Del Real NULL, NULL, NULL, NULL, decode_jxx, RFLAGS_MASK_NONE}, 956*c97d6d2cSSergio Andres Gomez Del Real {0x7f, X86_DECODE_CMD_JXX, 1, false, 957*c97d6d2cSSergio Andres Gomez Del Real NULL, NULL, NULL, NULL, decode_jxx, RFLAGS_MASK_NONE}, 958*c97d6d2cSSergio Andres Gomez Del Real 959*c97d6d2cSSergio Andres Gomez Del Real {0x80, X86_DECODE_CMD_INVL, 1, true, decode_modrm_rm, decode_imm8, 960*c97d6d2cSSergio Andres Gomez Del Real NULL, NULL, decode_addgroup, RFLAGS_MASK_OSZAPC}, 961*c97d6d2cSSergio Andres Gomez Del Real {0x81, X86_DECODE_CMD_INVL, 0, true, decode_modrm_rm, decode_imm, 962*c97d6d2cSSergio Andres Gomez Del Real NULL, NULL, decode_addgroup, RFLAGS_MASK_OSZAPC}, 963*c97d6d2cSSergio Andres Gomez Del Real {0x82, X86_DECODE_CMD_INVL, 1, true, decode_modrm_rm, decode_imm8, 964*c97d6d2cSSergio Andres Gomez Del Real NULL, NULL, decode_addgroup, RFLAGS_MASK_OSZAPC}, 965*c97d6d2cSSergio Andres Gomez Del Real {0x83, X86_DECODE_CMD_INVL, 0, true, decode_modrm_rm, decode_imm8_signed, 966*c97d6d2cSSergio Andres Gomez Del Real NULL, NULL, decode_addgroup, RFLAGS_MASK_OSZAPC}, 967*c97d6d2cSSergio Andres Gomez Del Real {0x84, X86_DECODE_CMD_TST, 1, true, decode_modrm_rm, decode_modrm_reg, 968*c97d6d2cSSergio Andres Gomez Del Real NULL, NULL, NULL, RFLAGS_MASK_OSZAPC}, 969*c97d6d2cSSergio Andres Gomez Del Real {0x85, X86_DECODE_CMD_TST, 0, true, decode_modrm_rm, decode_modrm_reg, 970*c97d6d2cSSergio Andres Gomez Del Real NULL, NULL, NULL, RFLAGS_MASK_OSZAPC}, 971*c97d6d2cSSergio Andres Gomez Del Real {0x86, X86_DECODE_CMD_XCHG, 1, true, decode_modrm_reg, decode_modrm_rm, 972*c97d6d2cSSergio Andres Gomez Del Real NULL, NULL, NULL, RFLAGS_MASK_NONE}, 973*c97d6d2cSSergio Andres Gomez Del Real {0x87, X86_DECODE_CMD_XCHG, 0, true, decode_modrm_reg, decode_modrm_rm, 974*c97d6d2cSSergio Andres Gomez Del Real NULL, NULL, NULL, RFLAGS_MASK_NONE}, 975*c97d6d2cSSergio Andres Gomez Del Real {0x88, X86_DECODE_CMD_MOV, 1, true, decode_modrm_rm, decode_modrm_reg, 976*c97d6d2cSSergio Andres Gomez Del Real NULL, NULL, NULL, RFLAGS_MASK_NONE}, 977*c97d6d2cSSergio Andres Gomez Del Real {0x89, X86_DECODE_CMD_MOV, 0, true, decode_modrm_rm, decode_modrm_reg, 978*c97d6d2cSSergio Andres Gomez Del Real NULL, NULL, NULL, RFLAGS_MASK_NONE}, 979*c97d6d2cSSergio Andres Gomez Del Real {0x8a, X86_DECODE_CMD_MOV, 1, true, decode_modrm_reg, decode_modrm_rm, 980*c97d6d2cSSergio Andres Gomez Del Real NULL, NULL, NULL, RFLAGS_MASK_NONE}, 981*c97d6d2cSSergio Andres Gomez Del Real {0x8b, X86_DECODE_CMD_MOV, 0, true, decode_modrm_reg, decode_modrm_rm, 982*c97d6d2cSSergio Andres Gomez Del Real NULL, NULL, NULL, RFLAGS_MASK_NONE}, 983*c97d6d2cSSergio Andres Gomez Del Real {0x8c, X86_DECODE_CMD_MOV_FROM_SEG, 0, true, decode_modrm_rm, 984*c97d6d2cSSergio Andres Gomez Del Real decode_modrm_reg, NULL, NULL, NULL, RFLAGS_MASK_NONE}, 985*c97d6d2cSSergio Andres Gomez Del Real {0x8d, X86_DECODE_CMD_LEA, 0, true, decode_modrm_reg, decode_modrm_rm, 986*c97d6d2cSSergio Andres Gomez Del Real NULL, NULL, NULL, RFLAGS_MASK_NONE}, 987*c97d6d2cSSergio Andres Gomez Del Real {0x8e, X86_DECODE_CMD_MOV_TO_SEG, 0, true, decode_modrm_reg, 988*c97d6d2cSSergio Andres Gomez Del Real decode_modrm_rm, NULL, NULL, NULL, RFLAGS_MASK_NONE}, 989*c97d6d2cSSergio Andres Gomez Del Real {0x8f, X86_DECODE_CMD_POP, 0, true, decode_modrm_rm, 990*c97d6d2cSSergio Andres Gomez Del Real NULL, NULL, NULL, NULL, RFLAGS_MASK_NONE}, 991*c97d6d2cSSergio Andres Gomez Del Real 992*c97d6d2cSSergio Andres Gomez Del Real {0x90, X86_DECODE_CMD_NOP, 0, false, 993*c97d6d2cSSergio Andres Gomez Del Real NULL, NULL, NULL, NULL, NULL, RFLAGS_MASK_NONE}, 994*c97d6d2cSSergio Andres Gomez Del Real {0x91, X86_DECODE_CMD_XCHG, 0, false, NULL, decode_rax, 995*c97d6d2cSSergio Andres Gomez Del Real NULL, NULL, decode_xchgroup, RFLAGS_MASK_NONE}, 996*c97d6d2cSSergio Andres Gomez Del Real {0x92, X86_DECODE_CMD_XCHG, 0, false, NULL, decode_rax, 997*c97d6d2cSSergio Andres Gomez Del Real NULL, NULL, decode_xchgroup, RFLAGS_MASK_NONE}, 998*c97d6d2cSSergio Andres Gomez Del Real {0x93, X86_DECODE_CMD_XCHG, 0, false, NULL, decode_rax, 999*c97d6d2cSSergio Andres Gomez Del Real NULL, NULL, decode_xchgroup, RFLAGS_MASK_NONE}, 1000*c97d6d2cSSergio Andres Gomez Del Real {0x94, X86_DECODE_CMD_XCHG, 0, false, NULL, decode_rax, 1001*c97d6d2cSSergio Andres Gomez Del Real NULL, NULL, decode_xchgroup, RFLAGS_MASK_NONE}, 1002*c97d6d2cSSergio Andres Gomez Del Real {0x95, X86_DECODE_CMD_XCHG, 0, false, NULL, decode_rax, 1003*c97d6d2cSSergio Andres Gomez Del Real NULL, NULL, decode_xchgroup, RFLAGS_MASK_NONE}, 1004*c97d6d2cSSergio Andres Gomez Del Real {0x96, X86_DECODE_CMD_XCHG, 0, false, NULL, decode_rax, 1005*c97d6d2cSSergio Andres Gomez Del Real NULL, NULL, decode_xchgroup, RFLAGS_MASK_NONE}, 1006*c97d6d2cSSergio Andres Gomez Del Real {0x97, X86_DECODE_CMD_XCHG, 0, false, NULL, decode_rax, 1007*c97d6d2cSSergio Andres Gomez Del Real NULL, NULL, decode_xchgroup, RFLAGS_MASK_NONE}, 1008*c97d6d2cSSergio Andres Gomez Del Real 1009*c97d6d2cSSergio Andres Gomez Del Real {0x98, X86_DECODE_CMD_CBW, 0, false, NULL, NULL, 1010*c97d6d2cSSergio Andres Gomez Del Real NULL, NULL, NULL, RFLAGS_MASK_NONE}, 1011*c97d6d2cSSergio Andres Gomez Del Real {0x99, X86_DECODE_CMD_CWD, 0, false, NULL, NULL, 1012*c97d6d2cSSergio Andres Gomez Del Real NULL, NULL, NULL, RFLAGS_MASK_NONE}, 1013*c97d6d2cSSergio Andres Gomez Del Real 1014*c97d6d2cSSergio Andres Gomez Del Real {0x9a, X86_DECODE_CMD_CALL_FAR, 0, false, NULL, 1015*c97d6d2cSSergio Andres Gomez Del Real NULL, NULL, NULL, decode_farjmp, RFLAGS_MASK_NONE}, 1016*c97d6d2cSSergio Andres Gomez Del Real 1017*c97d6d2cSSergio Andres Gomez Del Real {0x9c, X86_DECODE_CMD_PUSHF, 0, false, NULL, NULL, 1018*c97d6d2cSSergio Andres Gomez Del Real NULL, NULL, NULL, RFLAGS_MASK_NONE}, 1019*c97d6d2cSSergio Andres Gomez Del Real /*{0x9d, X86_DECODE_CMD_POPF, 0, false, NULL, NULL, 1020*c97d6d2cSSergio Andres Gomez Del Real NULL, NULL, NULL, RFLAGS_MASK_POPF},*/ 1021*c97d6d2cSSergio Andres Gomez Del Real {0x9e, X86_DECODE_CMD_SAHF, 0, false, NULL, NULL, 1022*c97d6d2cSSergio Andres Gomez Del Real NULL, NULL, NULL, RFLAGS_MASK_NONE}, 1023*c97d6d2cSSergio Andres Gomez Del Real {0x9f, X86_DECODE_CMD_LAHF, 0, false, NULL, NULL, 1024*c97d6d2cSSergio Andres Gomez Del Real NULL, NULL, NULL, RFLAGS_MASK_LAHF}, 1025*c97d6d2cSSergio Andres Gomez Del Real 1026*c97d6d2cSSergio Andres Gomez Del Real {0xa0, X86_DECODE_CMD_MOV, 1, false, decode_rax, fetch_moffs, 1027*c97d6d2cSSergio Andres Gomez Del Real NULL, NULL, NULL, RFLAGS_MASK_NONE}, 1028*c97d6d2cSSergio Andres Gomez Del Real {0xa1, X86_DECODE_CMD_MOV, 0, false, decode_rax, fetch_moffs, 1029*c97d6d2cSSergio Andres Gomez Del Real NULL, NULL, NULL, RFLAGS_MASK_NONE}, 1030*c97d6d2cSSergio Andres Gomez Del Real {0xa2, X86_DECODE_CMD_MOV, 1, false, fetch_moffs, decode_rax, 1031*c97d6d2cSSergio Andres Gomez Del Real NULL, NULL, NULL, RFLAGS_MASK_NONE}, 1032*c97d6d2cSSergio Andres Gomez Del Real {0xa3, X86_DECODE_CMD_MOV, 0, false, fetch_moffs, decode_rax, 1033*c97d6d2cSSergio Andres Gomez Del Real NULL, NULL, NULL, RFLAGS_MASK_NONE}, 1034*c97d6d2cSSergio Andres Gomez Del Real 1035*c97d6d2cSSergio Andres Gomez Del Real {0xa4, X86_DECODE_CMD_MOVS, 1, false, NULL, NULL, 1036*c97d6d2cSSergio Andres Gomez Del Real NULL, NULL, NULL, RFLAGS_MASK_NONE}, 1037*c97d6d2cSSergio Andres Gomez Del Real {0xa5, X86_DECODE_CMD_MOVS, 0, false, NULL, NULL, 1038*c97d6d2cSSergio Andres Gomez Del Real NULL, NULL, NULL, RFLAGS_MASK_NONE}, 1039*c97d6d2cSSergio Andres Gomez Del Real {0xa6, X86_DECODE_CMD_CMPS, 1, false, NULL, NULL, 1040*c97d6d2cSSergio Andres Gomez Del Real NULL, NULL, NULL, RFLAGS_MASK_OSZAPC}, 1041*c97d6d2cSSergio Andres Gomez Del Real {0xa7, X86_DECODE_CMD_CMPS, 0, false, NULL, NULL, 1042*c97d6d2cSSergio Andres Gomez Del Real NULL, NULL, NULL, RFLAGS_MASK_OSZAPC}, 1043*c97d6d2cSSergio Andres Gomez Del Real {0xaa, X86_DECODE_CMD_STOS, 1, false, NULL, NULL, 1044*c97d6d2cSSergio Andres Gomez Del Real NULL, NULL, NULL, RFLAGS_MASK_NONE}, 1045*c97d6d2cSSergio Andres Gomez Del Real {0xab, X86_DECODE_CMD_STOS, 0, false, NULL, NULL, 1046*c97d6d2cSSergio Andres Gomez Del Real NULL, NULL, NULL, RFLAGS_MASK_NONE}, 1047*c97d6d2cSSergio Andres Gomez Del Real {0xac, X86_DECODE_CMD_LODS, 1, false, NULL, NULL, 1048*c97d6d2cSSergio Andres Gomez Del Real NULL, NULL, NULL, RFLAGS_MASK_NONE}, 1049*c97d6d2cSSergio Andres Gomez Del Real {0xad, X86_DECODE_CMD_LODS, 0, false, NULL, NULL, 1050*c97d6d2cSSergio Andres Gomez Del Real NULL, NULL, NULL, RFLAGS_MASK_NONE}, 1051*c97d6d2cSSergio Andres Gomez Del Real {0xae, X86_DECODE_CMD_SCAS, 1, false, NULL, NULL, 1052*c97d6d2cSSergio Andres Gomez Del Real NULL, NULL, NULL, RFLAGS_MASK_OSZAPC}, 1053*c97d6d2cSSergio Andres Gomez Del Real {0xaf, X86_DECODE_CMD_SCAS, 0, false, NULL, NULL, 1054*c97d6d2cSSergio Andres Gomez Del Real NULL, NULL, NULL, RFLAGS_MASK_OSZAPC}, 1055*c97d6d2cSSergio Andres Gomez Del Real 1056*c97d6d2cSSergio Andres Gomez Del Real {0xa8, X86_DECODE_CMD_TST, 1, false, decode_rax, decode_imm, 1057*c97d6d2cSSergio Andres Gomez Del Real NULL, NULL, NULL, RFLAGS_MASK_OSZAPC}, 1058*c97d6d2cSSergio Andres Gomez Del Real {0xa9, X86_DECODE_CMD_TST, 0, false, decode_rax, decode_imm, 1059*c97d6d2cSSergio Andres Gomez Del Real NULL, NULL, NULL, RFLAGS_MASK_OSZAPC}, 1060*c97d6d2cSSergio Andres Gomez Del Real 1061*c97d6d2cSSergio Andres Gomez Del Real {0xb0, X86_DECODE_CMD_MOV, 1, false, NULL, 1062*c97d6d2cSSergio Andres Gomez Del Real NULL, NULL, NULL, decode_movgroup8, RFLAGS_MASK_NONE}, 1063*c97d6d2cSSergio Andres Gomez Del Real {0xb1, X86_DECODE_CMD_MOV, 1, false, NULL, 1064*c97d6d2cSSergio Andres Gomez Del Real NULL, NULL, NULL, decode_movgroup8, RFLAGS_MASK_NONE}, 1065*c97d6d2cSSergio Andres Gomez Del Real {0xb2, X86_DECODE_CMD_MOV, 1, false, NULL, 1066*c97d6d2cSSergio Andres Gomez Del Real NULL, NULL, NULL, decode_movgroup8, RFLAGS_MASK_NONE}, 1067*c97d6d2cSSergio Andres Gomez Del Real {0xb3, X86_DECODE_CMD_MOV, 1, false, NULL, 1068*c97d6d2cSSergio Andres Gomez Del Real NULL, NULL, NULL, decode_movgroup8, RFLAGS_MASK_NONE}, 1069*c97d6d2cSSergio Andres Gomez Del Real {0xb4, X86_DECODE_CMD_MOV, 1, false, NULL, 1070*c97d6d2cSSergio Andres Gomez Del Real NULL, NULL, NULL, decode_movgroup8, RFLAGS_MASK_NONE}, 1071*c97d6d2cSSergio Andres Gomez Del Real {0xb5, X86_DECODE_CMD_MOV, 1, false, NULL, 1072*c97d6d2cSSergio Andres Gomez Del Real NULL, NULL, NULL, decode_movgroup8, RFLAGS_MASK_NONE}, 1073*c97d6d2cSSergio Andres Gomez Del Real {0xb6, X86_DECODE_CMD_MOV, 1, false, NULL, 1074*c97d6d2cSSergio Andres Gomez Del Real NULL, NULL, NULL, decode_movgroup8, RFLAGS_MASK_NONE}, 1075*c97d6d2cSSergio Andres Gomez Del Real {0xb7, X86_DECODE_CMD_MOV, 1, false, NULL, 1076*c97d6d2cSSergio Andres Gomez Del Real NULL, NULL, NULL, decode_movgroup8, RFLAGS_MASK_NONE}, 1077*c97d6d2cSSergio Andres Gomez Del Real 1078*c97d6d2cSSergio Andres Gomez Del Real {0xb8, X86_DECODE_CMD_MOV, 0, false, NULL, 1079*c97d6d2cSSergio Andres Gomez Del Real NULL, NULL, NULL, decode_movgroup, RFLAGS_MASK_NONE}, 1080*c97d6d2cSSergio Andres Gomez Del Real {0xb9, X86_DECODE_CMD_MOV, 0, false, NULL, 1081*c97d6d2cSSergio Andres Gomez Del Real NULL, NULL, NULL, decode_movgroup, RFLAGS_MASK_NONE}, 1082*c97d6d2cSSergio Andres Gomez Del Real {0xba, X86_DECODE_CMD_MOV, 0, false, NULL, 1083*c97d6d2cSSergio Andres Gomez Del Real NULL, NULL, NULL, decode_movgroup, RFLAGS_MASK_NONE}, 1084*c97d6d2cSSergio Andres Gomez Del Real {0xbb, X86_DECODE_CMD_MOV, 0, false, NULL, 1085*c97d6d2cSSergio Andres Gomez Del Real NULL, NULL, NULL, decode_movgroup, RFLAGS_MASK_NONE}, 1086*c97d6d2cSSergio Andres Gomez Del Real {0xbc, X86_DECODE_CMD_MOV, 0, false, NULL, 1087*c97d6d2cSSergio Andres Gomez Del Real NULL, NULL, NULL, decode_movgroup, RFLAGS_MASK_NONE}, 1088*c97d6d2cSSergio Andres Gomez Del Real {0xbd, X86_DECODE_CMD_MOV, 0, false, NULL, 1089*c97d6d2cSSergio Andres Gomez Del Real NULL, NULL, NULL, decode_movgroup, RFLAGS_MASK_NONE}, 1090*c97d6d2cSSergio Andres Gomez Del Real {0xbe, X86_DECODE_CMD_MOV, 0, false, NULL, 1091*c97d6d2cSSergio Andres Gomez Del Real NULL, NULL, NULL, decode_movgroup, RFLAGS_MASK_NONE}, 1092*c97d6d2cSSergio Andres Gomez Del Real {0xbf, X86_DECODE_CMD_MOV, 0, false, NULL, 1093*c97d6d2cSSergio Andres Gomez Del Real NULL, NULL, NULL, decode_movgroup, RFLAGS_MASK_NONE}, 1094*c97d6d2cSSergio Andres Gomez Del Real 1095*c97d6d2cSSergio Andres Gomez Del Real {0xc0, X86_DECODE_CMD_INVL, 1, true, decode_modrm_rm, decode_imm8, 1096*c97d6d2cSSergio Andres Gomez Del Real NULL, NULL, decode_rotgroup, RFLAGS_MASK_OSZAPC}, 1097*c97d6d2cSSergio Andres Gomez Del Real {0xc1, X86_DECODE_CMD_INVL, 0, true, decode_modrm_rm, decode_imm8, 1098*c97d6d2cSSergio Andres Gomez Del Real NULL, NULL, decode_rotgroup, RFLAGS_MASK_OSZAPC}, 1099*c97d6d2cSSergio Andres Gomez Del Real 1100*c97d6d2cSSergio Andres Gomez Del Real {0xc2, X86_DECODE_RET_NEAR, 0, false, decode_imm16, 1101*c97d6d2cSSergio Andres Gomez Del Real NULL, NULL, NULL, NULL, RFLAGS_MASK_NONE}, 1102*c97d6d2cSSergio Andres Gomez Del Real {0xc3, X86_DECODE_RET_NEAR, 0, false, NULL, 1103*c97d6d2cSSergio Andres Gomez Del Real NULL, NULL, NULL, NULL, RFLAGS_MASK_NONE}, 1104*c97d6d2cSSergio Andres Gomez Del Real 1105*c97d6d2cSSergio Andres Gomez Del Real {0xc4, X86_DECODE_CMD_LES, 0, true, decode_modrm_reg, decode_modrm_rm, 1106*c97d6d2cSSergio Andres Gomez Del Real NULL, NULL, NULL, RFLAGS_MASK_NONE}, 1107*c97d6d2cSSergio Andres Gomez Del Real {0xc5, X86_DECODE_CMD_LDS, 0, true, decode_modrm_reg, decode_modrm_rm, 1108*c97d6d2cSSergio Andres Gomez Del Real NULL, NULL, NULL, RFLAGS_MASK_NONE}, 1109*c97d6d2cSSergio Andres Gomez Del Real 1110*c97d6d2cSSergio Andres Gomez Del Real {0xc6, X86_DECODE_CMD_MOV, 1, true, decode_modrm_rm, decode_imm8, 1111*c97d6d2cSSergio Andres Gomez Del Real NULL, NULL, NULL, RFLAGS_MASK_NONE}, 1112*c97d6d2cSSergio Andres Gomez Del Real {0xc7, X86_DECODE_CMD_MOV, 0, true, decode_modrm_rm, decode_imm, 1113*c97d6d2cSSergio Andres Gomez Del Real NULL, NULL, NULL, RFLAGS_MASK_NONE}, 1114*c97d6d2cSSergio Andres Gomez Del Real 1115*c97d6d2cSSergio Andres Gomez Del Real {0xc8, X86_DECODE_CMD_ENTER, 0, false, decode_imm16, decode_imm8, 1116*c97d6d2cSSergio Andres Gomez Del Real NULL, NULL, NULL, RFLAGS_MASK_NONE}, 1117*c97d6d2cSSergio Andres Gomez Del Real {0xc9, X86_DECODE_CMD_LEAVE, 0, false, NULL, NULL, 1118*c97d6d2cSSergio Andres Gomez Del Real NULL, NULL, NULL, RFLAGS_MASK_NONE}, 1119*c97d6d2cSSergio Andres Gomez Del Real {0xca, X86_DECODE_RET_FAR, 0, false, decode_imm16, NULL, 1120*c97d6d2cSSergio Andres Gomez Del Real NULL, NULL, NULL, RFLAGS_MASK_NONE}, 1121*c97d6d2cSSergio Andres Gomez Del Real {0xcb, X86_DECODE_RET_FAR, 0, false, decode_imm_0, NULL, 1122*c97d6d2cSSergio Andres Gomez Del Real NULL, NULL, NULL, RFLAGS_MASK_NONE}, 1123*c97d6d2cSSergio Andres Gomez Del Real {0xcd, X86_DECODE_CMD_INT, 0, false, decode_imm8, NULL, 1124*c97d6d2cSSergio Andres Gomez Del Real NULL, NULL, NULL, RFLAGS_MASK_NONE}, 1125*c97d6d2cSSergio Andres Gomez Del Real /*{0xcf, X86_DECODE_CMD_IRET, 0, false, NULL, NULL, 1126*c97d6d2cSSergio Andres Gomez Del Real NULL, NULL, NULL, RFLAGS_MASK_IRET},*/ 1127*c97d6d2cSSergio Andres Gomez Del Real 1128*c97d6d2cSSergio Andres Gomez Del Real {0xd0, X86_DECODE_CMD_INVL, 1, true, decode_modrm_rm, decode_imm_1, 1129*c97d6d2cSSergio Andres Gomez Del Real NULL, NULL, decode_rotgroup, RFLAGS_MASK_OSZAPC}, 1130*c97d6d2cSSergio Andres Gomez Del Real {0xd1, X86_DECODE_CMD_INVL, 0, true, decode_modrm_rm, decode_imm_1, 1131*c97d6d2cSSergio Andres Gomez Del Real NULL, NULL, decode_rotgroup, RFLAGS_MASK_OSZAPC}, 1132*c97d6d2cSSergio Andres Gomez Del Real {0xd2, X86_DECODE_CMD_INVL, 1, true, decode_modrm_rm, decode_rcx, 1133*c97d6d2cSSergio Andres Gomez Del Real NULL, NULL, decode_rotgroup, RFLAGS_MASK_OSZAPC}, 1134*c97d6d2cSSergio Andres Gomez Del Real {0xd3, X86_DECODE_CMD_INVL, 0, true, decode_modrm_rm, decode_rcx, 1135*c97d6d2cSSergio Andres Gomez Del Real NULL, NULL, decode_rotgroup, RFLAGS_MASK_OSZAPC}, 1136*c97d6d2cSSergio Andres Gomez Del Real 1137*c97d6d2cSSergio Andres Gomez Del Real {0xd4, X86_DECODE_CMD_AAM, 0, false, decode_imm8, 1138*c97d6d2cSSergio Andres Gomez Del Real NULL, NULL, NULL, NULL, RFLAGS_MASK_OSZAPC}, 1139*c97d6d2cSSergio Andres Gomez Del Real {0xd5, X86_DECODE_CMD_AAD, 0, false, decode_imm8, 1140*c97d6d2cSSergio Andres Gomez Del Real NULL, NULL, NULL, NULL, RFLAGS_MASK_OSZAPC}, 1141*c97d6d2cSSergio Andres Gomez Del Real 1142*c97d6d2cSSergio Andres Gomez Del Real {0xd7, X86_DECODE_CMD_XLAT, 0, false, 1143*c97d6d2cSSergio Andres Gomez Del Real NULL, NULL, NULL, NULL, NULL, RFLAGS_MASK_NONE}, 1144*c97d6d2cSSergio Andres Gomez Del Real 1145*c97d6d2cSSergio Andres Gomez Del Real {0xd8, X86_DECODE_CMD_INVL, 0, true, NULL, 1146*c97d6d2cSSergio Andres Gomez Del Real NULL, NULL, NULL, decode_x87_ins, RFLAGS_MASK_NONE}, 1147*c97d6d2cSSergio Andres Gomez Del Real {0xd9, X86_DECODE_CMD_INVL, 0, true, NULL, 1148*c97d6d2cSSergio Andres Gomez Del Real NULL, NULL, NULL, decode_x87_ins, RFLAGS_MASK_NONE}, 1149*c97d6d2cSSergio Andres Gomez Del Real {0xda, X86_DECODE_CMD_INVL, 0, true, NULL, 1150*c97d6d2cSSergio Andres Gomez Del Real NULL, NULL, NULL, decode_x87_ins, RFLAGS_MASK_NONE}, 1151*c97d6d2cSSergio Andres Gomez Del Real {0xdb, X86_DECODE_CMD_INVL, 0, true, NULL, 1152*c97d6d2cSSergio Andres Gomez Del Real NULL, NULL, NULL, decode_x87_ins, RFLAGS_MASK_NONE}, 1153*c97d6d2cSSergio Andres Gomez Del Real {0xdc, X86_DECODE_CMD_INVL, 0, true, NULL, 1154*c97d6d2cSSergio Andres Gomez Del Real NULL, NULL, NULL, decode_x87_ins, RFLAGS_MASK_NONE}, 1155*c97d6d2cSSergio Andres Gomez Del Real {0xdd, X86_DECODE_CMD_INVL, 0, true, NULL, 1156*c97d6d2cSSergio Andres Gomez Del Real NULL, NULL, NULL, decode_x87_ins, RFLAGS_MASK_NONE}, 1157*c97d6d2cSSergio Andres Gomez Del Real {0xde, X86_DECODE_CMD_INVL, 0, true, NULL, 1158*c97d6d2cSSergio Andres Gomez Del Real NULL, NULL, NULL, decode_x87_ins, RFLAGS_MASK_NONE}, 1159*c97d6d2cSSergio Andres Gomez Del Real {0xdf, X86_DECODE_CMD_INVL, 0, true, NULL, 1160*c97d6d2cSSergio Andres Gomez Del Real NULL, NULL, NULL, decode_x87_ins, RFLAGS_MASK_NONE}, 1161*c97d6d2cSSergio Andres Gomez Del Real 1162*c97d6d2cSSergio Andres Gomez Del Real {0xe0, X86_DECODE_CMD_LOOP, 0, false, decode_imm8_signed, 1163*c97d6d2cSSergio Andres Gomez Del Real NULL, NULL, NULL, NULL, RFLAGS_MASK_NONE}, 1164*c97d6d2cSSergio Andres Gomez Del Real {0xe1, X86_DECODE_CMD_LOOP, 0, false, decode_imm8_signed, 1165*c97d6d2cSSergio Andres Gomez Del Real NULL, NULL, NULL, NULL, RFLAGS_MASK_NONE}, 1166*c97d6d2cSSergio Andres Gomez Del Real {0xe2, X86_DECODE_CMD_LOOP, 0, false, decode_imm8_signed, 1167*c97d6d2cSSergio Andres Gomez Del Real NULL, NULL, NULL, NULL, RFLAGS_MASK_NONE}, 1168*c97d6d2cSSergio Andres Gomez Del Real 1169*c97d6d2cSSergio Andres Gomez Del Real {0xe3, X86_DECODE_CMD_JCXZ, 1, false, 1170*c97d6d2cSSergio Andres Gomez Del Real NULL, NULL, NULL, NULL, decode_jxx, RFLAGS_MASK_NONE}, 1171*c97d6d2cSSergio Andres Gomez Del Real 1172*c97d6d2cSSergio Andres Gomez Del Real {0xe4, X86_DECODE_CMD_IN, 1, false, decode_imm8, 1173*c97d6d2cSSergio Andres Gomez Del Real NULL, NULL, NULL, NULL, RFLAGS_MASK_NONE}, 1174*c97d6d2cSSergio Andres Gomez Del Real {0xe5, X86_DECODE_CMD_IN, 0, false, decode_imm8, 1175*c97d6d2cSSergio Andres Gomez Del Real NULL, NULL, NULL, NULL, RFLAGS_MASK_NONE}, 1176*c97d6d2cSSergio Andres Gomez Del Real {0xe6, X86_DECODE_CMD_OUT, 1, false, decode_imm8, 1177*c97d6d2cSSergio Andres Gomez Del Real NULL, NULL, NULL, NULL, RFLAGS_MASK_NONE}, 1178*c97d6d2cSSergio Andres Gomez Del Real {0xe7, X86_DECODE_CMD_OUT, 0, false, decode_imm8, 1179*c97d6d2cSSergio Andres Gomez Del Real NULL, NULL, NULL, NULL, RFLAGS_MASK_NONE}, 1180*c97d6d2cSSergio Andres Gomez Del Real {0xe8, X86_DECODE_CMD_CALL_NEAR, 0, false, decode_imm_signed, 1181*c97d6d2cSSergio Andres Gomez Del Real NULL, NULL, NULL, NULL, RFLAGS_MASK_NONE}, 1182*c97d6d2cSSergio Andres Gomez Del Real {0xe9, X86_DECODE_CMD_JMP_NEAR, 0, false, decode_imm_signed, 1183*c97d6d2cSSergio Andres Gomez Del Real NULL, NULL, NULL, NULL, RFLAGS_MASK_NONE}, 1184*c97d6d2cSSergio Andres Gomez Del Real {0xea, X86_DECODE_CMD_JMP_FAR, 0, false, 1185*c97d6d2cSSergio Andres Gomez Del Real NULL, NULL, NULL, NULL, decode_farjmp, RFLAGS_MASK_NONE}, 1186*c97d6d2cSSergio Andres Gomez Del Real {0xeb, X86_DECODE_CMD_JMP_NEAR, 1, false, decode_imm8_signed, 1187*c97d6d2cSSergio Andres Gomez Del Real NULL, NULL, NULL, NULL, RFLAGS_MASK_NONE}, 1188*c97d6d2cSSergio Andres Gomez Del Real {0xec, X86_DECODE_CMD_IN, 1, false, 1189*c97d6d2cSSergio Andres Gomez Del Real NULL, NULL, NULL, NULL, NULL, RFLAGS_MASK_NONE}, 1190*c97d6d2cSSergio Andres Gomez Del Real {0xed, X86_DECODE_CMD_IN, 0, false, 1191*c97d6d2cSSergio Andres Gomez Del Real NULL, NULL, NULL, NULL, NULL, RFLAGS_MASK_NONE}, 1192*c97d6d2cSSergio Andres Gomez Del Real {0xee, X86_DECODE_CMD_OUT, 1, false, 1193*c97d6d2cSSergio Andres Gomez Del Real NULL, NULL, NULL, NULL, NULL, RFLAGS_MASK_NONE}, 1194*c97d6d2cSSergio Andres Gomez Del Real {0xef, X86_DECODE_CMD_OUT, 0, false, 1195*c97d6d2cSSergio Andres Gomez Del Real NULL, NULL, NULL, NULL, NULL, RFLAGS_MASK_NONE}, 1196*c97d6d2cSSergio Andres Gomez Del Real 1197*c97d6d2cSSergio Andres Gomez Del Real {0xf4, X86_DECODE_CMD_HLT, 0, false, 1198*c97d6d2cSSergio Andres Gomez Del Real NULL, NULL, NULL, NULL, NULL, RFLAGS_MASK_NONE}, 1199*c97d6d2cSSergio Andres Gomez Del Real 1200*c97d6d2cSSergio Andres Gomez Del Real {0xf5, X86_DECODE_CMD_CMC, 0, false, 1201*c97d6d2cSSergio Andres Gomez Del Real NULL, NULL, NULL, NULL, NULL, RFLAGS_MASK_CF}, 1202*c97d6d2cSSergio Andres Gomez Del Real 1203*c97d6d2cSSergio Andres Gomez Del Real {0xf6, X86_DECODE_CMD_INVL, 1, true, 1204*c97d6d2cSSergio Andres Gomez Del Real NULL, NULL, NULL, NULL, decode_f7group, RFLAGS_MASK_OSZAPC}, 1205*c97d6d2cSSergio Andres Gomez Del Real {0xf7, X86_DECODE_CMD_INVL, 0, true, 1206*c97d6d2cSSergio Andres Gomez Del Real NULL, NULL, NULL, NULL, decode_f7group, RFLAGS_MASK_OSZAPC}, 1207*c97d6d2cSSergio Andres Gomez Del Real 1208*c97d6d2cSSergio Andres Gomez Del Real {0xf8, X86_DECODE_CMD_CLC, 0, false, 1209*c97d6d2cSSergio Andres Gomez Del Real NULL, NULL, NULL, NULL, NULL, RFLAGS_MASK_CF}, 1210*c97d6d2cSSergio Andres Gomez Del Real {0xf9, X86_DECODE_CMD_STC, 0, false, 1211*c97d6d2cSSergio Andres Gomez Del Real NULL, NULL, NULL, NULL, NULL, RFLAGS_MASK_CF}, 1212*c97d6d2cSSergio Andres Gomez Del Real 1213*c97d6d2cSSergio Andres Gomez Del Real {0xfa, X86_DECODE_CMD_CLI, 0, false, 1214*c97d6d2cSSergio Andres Gomez Del Real NULL, NULL, NULL, NULL, NULL, RFLAGS_MASK_IF}, 1215*c97d6d2cSSergio Andres Gomez Del Real {0xfb, X86_DECODE_CMD_STI, 0, false, 1216*c97d6d2cSSergio Andres Gomez Del Real NULL, NULL, NULL, NULL, NULL, RFLAGS_MASK_IF}, 1217*c97d6d2cSSergio Andres Gomez Del Real {0xfc, X86_DECODE_CMD_CLD, 0, false, 1218*c97d6d2cSSergio Andres Gomez Del Real NULL, NULL, NULL, NULL, NULL, RFLAGS_MASK_DF}, 1219*c97d6d2cSSergio Andres Gomez Del Real {0xfd, X86_DECODE_CMD_STD, 0, false, 1220*c97d6d2cSSergio Andres Gomez Del Real NULL, NULL, NULL, NULL, NULL, RFLAGS_MASK_DF}, 1221*c97d6d2cSSergio Andres Gomez Del Real {0xfe, X86_DECODE_CMD_INVL, 1, true, decode_modrm_rm, 1222*c97d6d2cSSergio Andres Gomez Del Real NULL, NULL, NULL, decode_incgroup2, RFLAGS_MASK_OSZAPC}, 1223*c97d6d2cSSergio Andres Gomez Del Real {0xff, X86_DECODE_CMD_INVL, 0, true, decode_modrm_rm, 1224*c97d6d2cSSergio Andres Gomez Del Real NULL, NULL, NULL, decode_ffgroup, RFLAGS_MASK_OSZAPC}, 1225*c97d6d2cSSergio Andres Gomez Del Real }; 1226*c97d6d2cSSergio Andres Gomez Del Real 1227*c97d6d2cSSergio Andres Gomez Del Real struct decode_tbl _2op_inst[] = { 1228*c97d6d2cSSergio Andres Gomez Del Real {0x0, X86_DECODE_CMD_INVL, 0, true, decode_modrm_rm, 1229*c97d6d2cSSergio Andres Gomez Del Real NULL, NULL, NULL, decode_sldtgroup, RFLAGS_MASK_NONE}, 1230*c97d6d2cSSergio Andres Gomez Del Real {0x1, X86_DECODE_CMD_INVL, 0, true, decode_modrm_rm, 1231*c97d6d2cSSergio Andres Gomez Del Real NULL, NULL, NULL, decode_lidtgroup, RFLAGS_MASK_NONE}, 1232*c97d6d2cSSergio Andres Gomez Del Real {0x6, X86_DECODE_CMD_CLTS, 0, false, 1233*c97d6d2cSSergio Andres Gomez Del Real NULL, NULL, NULL, NULL, NULL, RFLAGS_MASK_TF}, 1234*c97d6d2cSSergio Andres Gomez Del Real {0x9, X86_DECODE_CMD_WBINVD, 0, false, 1235*c97d6d2cSSergio Andres Gomez Del Real NULL, NULL, NULL, NULL, NULL, RFLAGS_MASK_NONE}, 1236*c97d6d2cSSergio Andres Gomez Del Real {0x18, X86_DECODE_CMD_PREFETCH, 0, true, 1237*c97d6d2cSSergio Andres Gomez Del Real NULL, NULL, NULL, NULL, decode_x87_general, RFLAGS_MASK_NONE}, 1238*c97d6d2cSSergio Andres Gomez Del Real {0x1f, X86_DECODE_CMD_NOP, 0, true, decode_modrm_rm, 1239*c97d6d2cSSergio Andres Gomez Del Real NULL, NULL, NULL, NULL, RFLAGS_MASK_NONE}, 1240*c97d6d2cSSergio Andres Gomez Del Real {0x20, X86_DECODE_CMD_MOV_FROM_CR, 0, true, decode_modrm_rm, 1241*c97d6d2cSSergio Andres Gomez Del Real decode_modrm_reg, NULL, NULL, NULL, RFLAGS_MASK_NONE}, 1242*c97d6d2cSSergio Andres Gomez Del Real {0x21, X86_DECODE_CMD_MOV_FROM_DR, 0, true, decode_modrm_rm, 1243*c97d6d2cSSergio Andres Gomez Del Real decode_modrm_reg, NULL, NULL, NULL, RFLAGS_MASK_NONE}, 1244*c97d6d2cSSergio Andres Gomez Del Real {0x22, X86_DECODE_CMD_MOV_TO_CR, 0, true, decode_modrm_reg, 1245*c97d6d2cSSergio Andres Gomez Del Real decode_modrm_rm, NULL, NULL, NULL, RFLAGS_MASK_NONE}, 1246*c97d6d2cSSergio Andres Gomez Del Real {0x23, X86_DECODE_CMD_MOV_TO_DR, 0, true, decode_modrm_reg, 1247*c97d6d2cSSergio Andres Gomez Del Real decode_modrm_rm, NULL, NULL, NULL, RFLAGS_MASK_NONE}, 1248*c97d6d2cSSergio Andres Gomez Del Real {0x30, X86_DECODE_CMD_WRMSR, 0, false, 1249*c97d6d2cSSergio Andres Gomez Del Real NULL, NULL, NULL, NULL, NULL, RFLAGS_MASK_NONE}, 1250*c97d6d2cSSergio Andres Gomez Del Real {0x31, X86_DECODE_CMD_RDTSC, 0, false, 1251*c97d6d2cSSergio Andres Gomez Del Real NULL, NULL, NULL, NULL, NULL, RFLAGS_MASK_NONE}, 1252*c97d6d2cSSergio Andres Gomez Del Real {0x32, X86_DECODE_CMD_RDMSR, 0, false, 1253*c97d6d2cSSergio Andres Gomez Del Real NULL, NULL, NULL, NULL, NULL, RFLAGS_MASK_NONE}, 1254*c97d6d2cSSergio Andres Gomez Del Real {0x40, X86_DECODE_CMD_CMOV, 0, true, decode_modrm_reg, decode_modrm_rm, 1255*c97d6d2cSSergio Andres Gomez Del Real NULL, NULL, NULL, RFLAGS_MASK_NONE}, 1256*c97d6d2cSSergio Andres Gomez Del Real {0x41, X86_DECODE_CMD_CMOV, 0, true, decode_modrm_reg, decode_modrm_rm, 1257*c97d6d2cSSergio Andres Gomez Del Real NULL, NULL, NULL, RFLAGS_MASK_NONE}, 1258*c97d6d2cSSergio Andres Gomez Del Real {0x42, X86_DECODE_CMD_CMOV, 0, true, decode_modrm_reg, decode_modrm_rm, 1259*c97d6d2cSSergio Andres Gomez Del Real NULL, NULL, NULL, RFLAGS_MASK_NONE}, 1260*c97d6d2cSSergio Andres Gomez Del Real {0x43, X86_DECODE_CMD_CMOV, 0, true, decode_modrm_reg, decode_modrm_rm, 1261*c97d6d2cSSergio Andres Gomez Del Real NULL, NULL, NULL, RFLAGS_MASK_NONE}, 1262*c97d6d2cSSergio Andres Gomez Del Real {0x44, X86_DECODE_CMD_CMOV, 0, true, decode_modrm_reg, decode_modrm_rm, 1263*c97d6d2cSSergio Andres Gomez Del Real NULL, NULL, NULL, RFLAGS_MASK_NONE}, 1264*c97d6d2cSSergio Andres Gomez Del Real {0x45, X86_DECODE_CMD_CMOV, 0, true, decode_modrm_reg, decode_modrm_rm, 1265*c97d6d2cSSergio Andres Gomez Del Real NULL, NULL, NULL, RFLAGS_MASK_NONE}, 1266*c97d6d2cSSergio Andres Gomez Del Real {0x46, X86_DECODE_CMD_CMOV, 0, true, decode_modrm_reg, decode_modrm_rm, 1267*c97d6d2cSSergio Andres Gomez Del Real NULL, NULL, NULL, RFLAGS_MASK_NONE}, 1268*c97d6d2cSSergio Andres Gomez Del Real {0x47, X86_DECODE_CMD_CMOV, 0, true, decode_modrm_reg, decode_modrm_rm, 1269*c97d6d2cSSergio Andres Gomez Del Real NULL, NULL, NULL, RFLAGS_MASK_NONE}, 1270*c97d6d2cSSergio Andres Gomez Del Real {0x48, X86_DECODE_CMD_CMOV, 0, true, decode_modrm_reg, decode_modrm_rm, 1271*c97d6d2cSSergio Andres Gomez Del Real NULL, NULL, NULL, RFLAGS_MASK_NONE}, 1272*c97d6d2cSSergio Andres Gomez Del Real {0x49, X86_DECODE_CMD_CMOV, 0, true, decode_modrm_reg, decode_modrm_rm, 1273*c97d6d2cSSergio Andres Gomez Del Real NULL, NULL, NULL, RFLAGS_MASK_NONE}, 1274*c97d6d2cSSergio Andres Gomez Del Real {0x4a, X86_DECODE_CMD_CMOV, 0, true, decode_modrm_reg, decode_modrm_rm, 1275*c97d6d2cSSergio Andres Gomez Del Real NULL, NULL, NULL, RFLAGS_MASK_NONE}, 1276*c97d6d2cSSergio Andres Gomez Del Real {0x4b, X86_DECODE_CMD_CMOV, 0, true, decode_modrm_reg, decode_modrm_rm, 1277*c97d6d2cSSergio Andres Gomez Del Real NULL, NULL, NULL, RFLAGS_MASK_NONE}, 1278*c97d6d2cSSergio Andres Gomez Del Real {0x4c, X86_DECODE_CMD_CMOV, 0, true, decode_modrm_reg, decode_modrm_rm, 1279*c97d6d2cSSergio Andres Gomez Del Real NULL, NULL, NULL, RFLAGS_MASK_NONE}, 1280*c97d6d2cSSergio Andres Gomez Del Real {0x4d, X86_DECODE_CMD_CMOV, 0, true, decode_modrm_reg, decode_modrm_rm, 1281*c97d6d2cSSergio Andres Gomez Del Real NULL, NULL, NULL, RFLAGS_MASK_NONE}, 1282*c97d6d2cSSergio Andres Gomez Del Real {0x4e, X86_DECODE_CMD_CMOV, 0, true, decode_modrm_reg, decode_modrm_rm, 1283*c97d6d2cSSergio Andres Gomez Del Real NULL, NULL, NULL, RFLAGS_MASK_NONE}, 1284*c97d6d2cSSergio Andres Gomez Del Real {0x4f, X86_DECODE_CMD_CMOV, 0, true, decode_modrm_reg, decode_modrm_rm, 1285*c97d6d2cSSergio Andres Gomez Del Real NULL, NULL, NULL, RFLAGS_MASK_NONE}, 1286*c97d6d2cSSergio Andres Gomez Del Real {0x77, X86_DECODE_CMD_EMMS, 0, false, 1287*c97d6d2cSSergio Andres Gomez Del Real NULL, NULL, NULL, NULL, decode_x87_general, RFLAGS_MASK_NONE}, 1288*c97d6d2cSSergio Andres Gomez Del Real {0x82, X86_DECODE_CMD_JXX, 0, false, 1289*c97d6d2cSSergio Andres Gomez Del Real NULL, NULL, NULL, NULL, decode_jxx, RFLAGS_MASK_NONE}, 1290*c97d6d2cSSergio Andres Gomez Del Real {0x83, X86_DECODE_CMD_JXX, 0, false, 1291*c97d6d2cSSergio Andres Gomez Del Real NULL, NULL, NULL, NULL, decode_jxx, RFLAGS_MASK_NONE}, 1292*c97d6d2cSSergio Andres Gomez Del Real {0x84, X86_DECODE_CMD_JXX, 0, false, 1293*c97d6d2cSSergio Andres Gomez Del Real NULL, NULL, NULL, NULL, decode_jxx, RFLAGS_MASK_NONE}, 1294*c97d6d2cSSergio Andres Gomez Del Real {0x85, X86_DECODE_CMD_JXX, 0, false, 1295*c97d6d2cSSergio Andres Gomez Del Real NULL, NULL, NULL, NULL, decode_jxx, RFLAGS_MASK_NONE}, 1296*c97d6d2cSSergio Andres Gomez Del Real {0x86, X86_DECODE_CMD_JXX, 0, false, 1297*c97d6d2cSSergio Andres Gomez Del Real NULL, NULL, NULL, NULL, decode_jxx, RFLAGS_MASK_NONE}, 1298*c97d6d2cSSergio Andres Gomez Del Real {0x87, X86_DECODE_CMD_JXX, 0, false, 1299*c97d6d2cSSergio Andres Gomez Del Real NULL, NULL, NULL, NULL, decode_jxx, RFLAGS_MASK_NONE}, 1300*c97d6d2cSSergio Andres Gomez Del Real {0x88, X86_DECODE_CMD_JXX, 0, false, 1301*c97d6d2cSSergio Andres Gomez Del Real NULL, NULL, NULL, NULL, decode_jxx, RFLAGS_MASK_NONE}, 1302*c97d6d2cSSergio Andres Gomez Del Real {0x89, X86_DECODE_CMD_JXX, 0, false, 1303*c97d6d2cSSergio Andres Gomez Del Real NULL, NULL, NULL, NULL, decode_jxx, RFLAGS_MASK_NONE}, 1304*c97d6d2cSSergio Andres Gomez Del Real {0x8a, X86_DECODE_CMD_JXX, 0, false, 1305*c97d6d2cSSergio Andres Gomez Del Real NULL, NULL, NULL, NULL, decode_jxx, RFLAGS_MASK_NONE}, 1306*c97d6d2cSSergio Andres Gomez Del Real {0x8b, X86_DECODE_CMD_JXX, 0, false, 1307*c97d6d2cSSergio Andres Gomez Del Real NULL, NULL, NULL, NULL, decode_jxx, RFLAGS_MASK_NONE}, 1308*c97d6d2cSSergio Andres Gomez Del Real {0x8c, X86_DECODE_CMD_JXX, 0, false, 1309*c97d6d2cSSergio Andres Gomez Del Real NULL, NULL, NULL, NULL, decode_jxx, RFLAGS_MASK_NONE}, 1310*c97d6d2cSSergio Andres Gomez Del Real {0x8d, X86_DECODE_CMD_JXX, 0, false, 1311*c97d6d2cSSergio Andres Gomez Del Real NULL, NULL, NULL, NULL, decode_jxx, RFLAGS_MASK_NONE}, 1312*c97d6d2cSSergio Andres Gomez Del Real {0x8e, X86_DECODE_CMD_JXX, 0, false, 1313*c97d6d2cSSergio Andres Gomez Del Real NULL, NULL, NULL, NULL, decode_jxx, RFLAGS_MASK_NONE}, 1314*c97d6d2cSSergio Andres Gomez Del Real {0x8f, X86_DECODE_CMD_JXX, 0, false, 1315*c97d6d2cSSergio Andres Gomez Del Real NULL, NULL, NULL, NULL, decode_jxx, RFLAGS_MASK_NONE}, 1316*c97d6d2cSSergio Andres Gomez Del Real {0x90, X86_DECODE_CMD_SETXX, 1, true, decode_modrm_rm, 1317*c97d6d2cSSergio Andres Gomez Del Real NULL, NULL, NULL, NULL, RFLAGS_MASK_NONE}, 1318*c97d6d2cSSergio Andres Gomez Del Real {0x91, X86_DECODE_CMD_SETXX, 1, true, decode_modrm_rm, 1319*c97d6d2cSSergio Andres Gomez Del Real NULL, NULL, NULL, NULL, RFLAGS_MASK_NONE}, 1320*c97d6d2cSSergio Andres Gomez Del Real {0x92, X86_DECODE_CMD_SETXX, 1, true, decode_modrm_rm, 1321*c97d6d2cSSergio Andres Gomez Del Real NULL, NULL, NULL, NULL, RFLAGS_MASK_NONE}, 1322*c97d6d2cSSergio Andres Gomez Del Real {0x93, X86_DECODE_CMD_SETXX, 1, true, decode_modrm_rm, 1323*c97d6d2cSSergio Andres Gomez Del Real NULL, NULL, NULL, NULL, RFLAGS_MASK_NONE}, 1324*c97d6d2cSSergio Andres Gomez Del Real {0x94, X86_DECODE_CMD_SETXX, 1, true, decode_modrm_rm, 1325*c97d6d2cSSergio Andres Gomez Del Real NULL, NULL, NULL, NULL, RFLAGS_MASK_NONE}, 1326*c97d6d2cSSergio Andres Gomez Del Real {0x95, X86_DECODE_CMD_SETXX, 1, true, decode_modrm_rm, 1327*c97d6d2cSSergio Andres Gomez Del Real NULL, NULL, NULL, NULL, RFLAGS_MASK_NONE}, 1328*c97d6d2cSSergio Andres Gomez Del Real {0x96, X86_DECODE_CMD_SETXX, 1, true, decode_modrm_rm, 1329*c97d6d2cSSergio Andres Gomez Del Real NULL, NULL, NULL, NULL, RFLAGS_MASK_NONE}, 1330*c97d6d2cSSergio Andres Gomez Del Real {0x97, X86_DECODE_CMD_SETXX, 1, true, decode_modrm_rm, 1331*c97d6d2cSSergio Andres Gomez Del Real NULL, NULL, NULL, NULL, RFLAGS_MASK_NONE}, 1332*c97d6d2cSSergio Andres Gomez Del Real {0x98, X86_DECODE_CMD_SETXX, 1, true, decode_modrm_rm, 1333*c97d6d2cSSergio Andres Gomez Del Real NULL, NULL, NULL, NULL, RFLAGS_MASK_NONE}, 1334*c97d6d2cSSergio Andres Gomez Del Real {0x99, X86_DECODE_CMD_SETXX, 1, true, decode_modrm_rm, 1335*c97d6d2cSSergio Andres Gomez Del Real NULL, NULL, NULL, NULL, RFLAGS_MASK_NONE}, 1336*c97d6d2cSSergio Andres Gomez Del Real {0x9a, X86_DECODE_CMD_SETXX, 1, true, decode_modrm_rm, 1337*c97d6d2cSSergio Andres Gomez Del Real NULL, NULL, NULL, NULL, RFLAGS_MASK_NONE}, 1338*c97d6d2cSSergio Andres Gomez Del Real {0x9b, X86_DECODE_CMD_SETXX, 1, true, decode_modrm_rm, 1339*c97d6d2cSSergio Andres Gomez Del Real NULL, NULL, NULL, NULL, RFLAGS_MASK_NONE}, 1340*c97d6d2cSSergio Andres Gomez Del Real {0x9c, X86_DECODE_CMD_SETXX, 1, true, decode_modrm_rm, 1341*c97d6d2cSSergio Andres Gomez Del Real NULL, NULL, NULL, NULL, RFLAGS_MASK_NONE}, 1342*c97d6d2cSSergio Andres Gomez Del Real {0x9d, X86_DECODE_CMD_SETXX, 1, true, decode_modrm_rm, 1343*c97d6d2cSSergio Andres Gomez Del Real NULL, NULL, NULL, NULL, RFLAGS_MASK_NONE}, 1344*c97d6d2cSSergio Andres Gomez Del Real {0x9e, X86_DECODE_CMD_SETXX, 1, true, decode_modrm_rm, 1345*c97d6d2cSSergio Andres Gomez Del Real NULL, NULL, NULL, NULL, RFLAGS_MASK_NONE}, 1346*c97d6d2cSSergio Andres Gomez Del Real {0x9f, X86_DECODE_CMD_SETXX, 1, true, decode_modrm_rm, 1347*c97d6d2cSSergio Andres Gomez Del Real NULL, NULL, NULL, NULL, RFLAGS_MASK_NONE}, 1348*c97d6d2cSSergio Andres Gomez Del Real 1349*c97d6d2cSSergio Andres Gomez Del Real {0xb0, X86_DECODE_CMD_CMPXCHG, 1, true, decode_modrm_rm, decode_modrm_reg, 1350*c97d6d2cSSergio Andres Gomez Del Real NULL, NULL, NULL, RFLAGS_MASK_NONE}, 1351*c97d6d2cSSergio Andres Gomez Del Real {0xb1, X86_DECODE_CMD_CMPXCHG, 0, true, decode_modrm_rm, decode_modrm_reg, 1352*c97d6d2cSSergio Andres Gomez Del Real NULL, NULL, NULL, RFLAGS_MASK_NONE}, 1353*c97d6d2cSSergio Andres Gomez Del Real 1354*c97d6d2cSSergio Andres Gomez Del Real {0xb6, X86_DECODE_CMD_MOVZX, 0, true, decode_modrm_reg, decode_modrm_rm, 1355*c97d6d2cSSergio Andres Gomez Del Real NULL, NULL, NULL, RFLAGS_MASK_NONE}, 1356*c97d6d2cSSergio Andres Gomez Del Real {0xb7, X86_DECODE_CMD_MOVZX, 0, true, decode_modrm_reg, decode_modrm_rm, 1357*c97d6d2cSSergio Andres Gomez Del Real NULL, NULL, NULL, RFLAGS_MASK_NONE}, 1358*c97d6d2cSSergio Andres Gomez Del Real {0xb8, X86_DECODE_CMD_POPCNT, 0, true, decode_modrm_reg, decode_modrm_rm, 1359*c97d6d2cSSergio Andres Gomez Del Real NULL, NULL, NULL, RFLAGS_MASK_OSZAPC}, 1360*c97d6d2cSSergio Andres Gomez Del Real {0xbe, X86_DECODE_CMD_MOVSX, 0, true, decode_modrm_reg, decode_modrm_rm, 1361*c97d6d2cSSergio Andres Gomez Del Real NULL, NULL, NULL, RFLAGS_MASK_NONE}, 1362*c97d6d2cSSergio Andres Gomez Del Real {0xbf, X86_DECODE_CMD_MOVSX, 0, true, decode_modrm_reg, decode_modrm_rm, 1363*c97d6d2cSSergio Andres Gomez Del Real NULL, NULL, NULL, RFLAGS_MASK_NONE}, 1364*c97d6d2cSSergio Andres Gomez Del Real {0xa0, X86_DECODE_CMD_PUSH_SEG, 0, false, false, 1365*c97d6d2cSSergio Andres Gomez Del Real NULL, NULL, NULL, decode_pushseg, RFLAGS_MASK_NONE}, 1366*c97d6d2cSSergio Andres Gomez Del Real {0xa1, X86_DECODE_CMD_POP_SEG, 0, false, false, 1367*c97d6d2cSSergio Andres Gomez Del Real NULL, NULL, NULL, decode_popseg, RFLAGS_MASK_NONE}, 1368*c97d6d2cSSergio Andres Gomez Del Real {0xa2, X86_DECODE_CMD_CPUID, 0, false, 1369*c97d6d2cSSergio Andres Gomez Del Real NULL, NULL, NULL, NULL, NULL, RFLAGS_MASK_NONE}, 1370*c97d6d2cSSergio Andres Gomez Del Real {0xa3, X86_DECODE_CMD_BT, 0, true, decode_modrm_rm, decode_modrm_reg, 1371*c97d6d2cSSergio Andres Gomez Del Real NULL, NULL, NULL, RFLAGS_MASK_CF}, 1372*c97d6d2cSSergio Andres Gomez Del Real {0xa4, X86_DECODE_CMD_SHLD, 0, true, decode_modrm_rm, decode_modrm_reg, 1373*c97d6d2cSSergio Andres Gomez Del Real decode_imm8, NULL, NULL, RFLAGS_MASK_OSZAPC}, 1374*c97d6d2cSSergio Andres Gomez Del Real {0xa5, X86_DECODE_CMD_SHLD, 0, true, decode_modrm_rm, decode_modrm_reg, 1375*c97d6d2cSSergio Andres Gomez Del Real decode_rcx, NULL, NULL, RFLAGS_MASK_OSZAPC}, 1376*c97d6d2cSSergio Andres Gomez Del Real {0xa8, X86_DECODE_CMD_PUSH_SEG, 0, false, false, 1377*c97d6d2cSSergio Andres Gomez Del Real NULL, NULL, NULL, decode_pushseg, RFLAGS_MASK_NONE}, 1378*c97d6d2cSSergio Andres Gomez Del Real {0xa9, X86_DECODE_CMD_POP_SEG, 0, false, false, 1379*c97d6d2cSSergio Andres Gomez Del Real NULL, NULL, NULL, decode_popseg, RFLAGS_MASK_NONE}, 1380*c97d6d2cSSergio Andres Gomez Del Real {0xab, X86_DECODE_CMD_BTS, 0, true, decode_modrm_rm, decode_modrm_reg, 1381*c97d6d2cSSergio Andres Gomez Del Real NULL, NULL, NULL, RFLAGS_MASK_CF}, 1382*c97d6d2cSSergio Andres Gomez Del Real {0xac, X86_DECODE_CMD_SHRD, 0, true, decode_modrm_rm, decode_modrm_reg, 1383*c97d6d2cSSergio Andres Gomez Del Real decode_imm8, NULL, NULL, RFLAGS_MASK_OSZAPC}, 1384*c97d6d2cSSergio Andres Gomez Del Real {0xad, X86_DECODE_CMD_SHRD, 0, true, decode_modrm_rm, decode_modrm_reg, 1385*c97d6d2cSSergio Andres Gomez Del Real decode_rcx, NULL, NULL, RFLAGS_MASK_OSZAPC}, 1386*c97d6d2cSSergio Andres Gomez Del Real 1387*c97d6d2cSSergio Andres Gomez Del Real {0xae, X86_DECODE_CMD_INVL, 0, true, decode_modrm_rm, 1388*c97d6d2cSSergio Andres Gomez Del Real NULL, NULL, NULL, decode_aegroup, RFLAGS_MASK_NONE}, 1389*c97d6d2cSSergio Andres Gomez Del Real 1390*c97d6d2cSSergio Andres Gomez Del Real {0xaf, X86_DECODE_CMD_IMUL_2, 0, true, decode_modrm_reg, decode_modrm_rm, 1391*c97d6d2cSSergio Andres Gomez Del Real NULL, NULL, NULL, RFLAGS_MASK_OSZAPC}, 1392*c97d6d2cSSergio Andres Gomez Del Real {0xb2, X86_DECODE_CMD_LSS, 0, true, decode_modrm_reg, decode_modrm_rm, 1393*c97d6d2cSSergio Andres Gomez Del Real NULL, NULL, NULL, RFLAGS_MASK_NONE}, 1394*c97d6d2cSSergio Andres Gomez Del Real {0xb3, X86_DECODE_CMD_BTR, 0, true, decode_modrm_rm, decode_modrm_reg, 1395*c97d6d2cSSergio Andres Gomez Del Real NULL, NULL, NULL, RFLAGS_MASK_OSZAPC}, 1396*c97d6d2cSSergio Andres Gomez Del Real {0xba, X86_DECODE_CMD_INVL, 0, true, decode_modrm_rm, decode_imm8, 1397*c97d6d2cSSergio Andres Gomez Del Real NULL, NULL, decode_btgroup, RFLAGS_MASK_OSZAPC}, 1398*c97d6d2cSSergio Andres Gomez Del Real {0xbb, X86_DECODE_CMD_BTC, 0, true, decode_modrm_rm, decode_modrm_reg, 1399*c97d6d2cSSergio Andres Gomez Del Real NULL, NULL, NULL, RFLAGS_MASK_OSZAPC}, 1400*c97d6d2cSSergio Andres Gomez Del Real {0xbc, X86_DECODE_CMD_BSF, 0, true, decode_modrm_reg, decode_modrm_rm, 1401*c97d6d2cSSergio Andres Gomez Del Real NULL, NULL, NULL, RFLAGS_MASK_OSZAPC}, 1402*c97d6d2cSSergio Andres Gomez Del Real {0xbd, X86_DECODE_CMD_BSR, 0, true, decode_modrm_reg, decode_modrm_rm, 1403*c97d6d2cSSergio Andres Gomez Del Real NULL, NULL, NULL, RFLAGS_MASK_OSZAPC}, 1404*c97d6d2cSSergio Andres Gomez Del Real 1405*c97d6d2cSSergio Andres Gomez Del Real {0xc1, X86_DECODE_CMD_XADD, 0, true, decode_modrm_rm, decode_modrm_reg, 1406*c97d6d2cSSergio Andres Gomez Del Real NULL, NULL, NULL, RFLAGS_MASK_OSZAPC}, 1407*c97d6d2cSSergio Andres Gomez Del Real 1408*c97d6d2cSSergio Andres Gomez Del Real {0xc7, X86_DECODE_CMD_CMPXCHG8B, 0, true, decode_modrm_rm, 1409*c97d6d2cSSergio Andres Gomez Del Real NULL, NULL, NULL, NULL, RFLAGS_MASK_ZF}, 1410*c97d6d2cSSergio Andres Gomez Del Real 1411*c97d6d2cSSergio Andres Gomez Del Real {0xc8, X86_DECODE_CMD_BSWAP, 0, false, 1412*c97d6d2cSSergio Andres Gomez Del Real NULL, NULL, NULL, NULL, decode_bswap, RFLAGS_MASK_NONE}, 1413*c97d6d2cSSergio Andres Gomez Del Real {0xc9, X86_DECODE_CMD_BSWAP, 0, false, 1414*c97d6d2cSSergio Andres Gomez Del Real NULL, NULL, NULL, NULL, decode_bswap, RFLAGS_MASK_NONE}, 1415*c97d6d2cSSergio Andres Gomez Del Real {0xca, X86_DECODE_CMD_BSWAP, 0, false, 1416*c97d6d2cSSergio Andres Gomez Del Real NULL, NULL, NULL, NULL, decode_bswap, RFLAGS_MASK_NONE}, 1417*c97d6d2cSSergio Andres Gomez Del Real {0xcb, X86_DECODE_CMD_BSWAP, 0, false, 1418*c97d6d2cSSergio Andres Gomez Del Real NULL, NULL, NULL, NULL, decode_bswap, RFLAGS_MASK_NONE}, 1419*c97d6d2cSSergio Andres Gomez Del Real {0xcc, X86_DECODE_CMD_BSWAP, 0, false, 1420*c97d6d2cSSergio Andres Gomez Del Real NULL, NULL, NULL, NULL, decode_bswap, RFLAGS_MASK_NONE}, 1421*c97d6d2cSSergio Andres Gomez Del Real {0xcd, X86_DECODE_CMD_BSWAP, 0, false, 1422*c97d6d2cSSergio Andres Gomez Del Real NULL, NULL, NULL, NULL, decode_bswap, RFLAGS_MASK_NONE}, 1423*c97d6d2cSSergio Andres Gomez Del Real {0xce, X86_DECODE_CMD_BSWAP, 0, false, 1424*c97d6d2cSSergio Andres Gomez Del Real NULL, NULL, NULL, NULL, decode_bswap, RFLAGS_MASK_NONE}, 1425*c97d6d2cSSergio Andres Gomez Del Real {0xcf, X86_DECODE_CMD_BSWAP, 0, false, 1426*c97d6d2cSSergio Andres Gomez Del Real NULL, NULL, NULL, NULL, decode_bswap, RFLAGS_MASK_NONE}, 1427*c97d6d2cSSergio Andres Gomez Del Real }; 1428*c97d6d2cSSergio Andres Gomez Del Real 1429*c97d6d2cSSergio Andres Gomez Del Real struct decode_x87_tbl invl_inst_x87 = {0x0, 0, 0, 0, 0, false, false, NULL, 1430*c97d6d2cSSergio Andres Gomez Del Real NULL, decode_invalid, 0}; 1431*c97d6d2cSSergio Andres Gomez Del Real 1432*c97d6d2cSSergio Andres Gomez Del Real struct decode_x87_tbl _x87_inst[] = { 1433*c97d6d2cSSergio Andres Gomez Del Real {0xd8, 0, 3, X86_DECODE_CMD_FADD, 10, false, false, 1434*c97d6d2cSSergio Andres Gomez Del Real decode_x87_modrm_st0, decode_decode_x87_modrm_st0, NULL, RFLAGS_MASK_NONE}, 1435*c97d6d2cSSergio Andres Gomez Del Real {0xd8, 0, 0, X86_DECODE_CMD_FADD, 4, false, false, decode_x87_modrm_st0, 1436*c97d6d2cSSergio Andres Gomez Del Real decode_x87_modrm_floatp, NULL, RFLAGS_MASK_NONE}, 1437*c97d6d2cSSergio Andres Gomez Del Real {0xd8, 1, 3, X86_DECODE_CMD_FMUL, 10, false, false, decode_x87_modrm_st0, 1438*c97d6d2cSSergio Andres Gomez Del Real decode_decode_x87_modrm_st0, NULL, RFLAGS_MASK_NONE}, 1439*c97d6d2cSSergio Andres Gomez Del Real {0xd8, 1, 0, X86_DECODE_CMD_FMUL, 4, false, false, decode_x87_modrm_st0, 1440*c97d6d2cSSergio Andres Gomez Del Real decode_x87_modrm_floatp, NULL, RFLAGS_MASK_NONE}, 1441*c97d6d2cSSergio Andres Gomez Del Real {0xd8, 4, 3, X86_DECODE_CMD_FSUB, 10, false, false, decode_x87_modrm_st0, 1442*c97d6d2cSSergio Andres Gomez Del Real decode_x87_modrm_st0, NULL, RFLAGS_MASK_NONE}, 1443*c97d6d2cSSergio Andres Gomez Del Real {0xd8, 4, 0, X86_DECODE_CMD_FSUB, 4, false, false, decode_x87_modrm_st0, 1444*c97d6d2cSSergio Andres Gomez Del Real decode_x87_modrm_floatp, NULL, RFLAGS_MASK_NONE}, 1445*c97d6d2cSSergio Andres Gomez Del Real {0xd8, 5, 3, X86_DECODE_CMD_FSUB, 10, true, false, decode_x87_modrm_st0, 1446*c97d6d2cSSergio Andres Gomez Del Real decode_x87_modrm_st0, NULL, RFLAGS_MASK_NONE}, 1447*c97d6d2cSSergio Andres Gomez Del Real {0xd8, 5, 0, X86_DECODE_CMD_FSUB, 4, true, false, decode_x87_modrm_st0, 1448*c97d6d2cSSergio Andres Gomez Del Real decode_x87_modrm_floatp, NULL, RFLAGS_MASK_NONE}, 1449*c97d6d2cSSergio Andres Gomez Del Real {0xd8, 6, 3, X86_DECODE_CMD_FDIV, 10, false, false, decode_x87_modrm_st0, 1450*c97d6d2cSSergio Andres Gomez Del Real decode_x87_modrm_st0, NULL, RFLAGS_MASK_NONE}, 1451*c97d6d2cSSergio Andres Gomez Del Real {0xd8, 6, 0, X86_DECODE_CMD_FDIV, 4, false, false, decode_x87_modrm_st0, 1452*c97d6d2cSSergio Andres Gomez Del Real decode_x87_modrm_floatp, NULL, RFLAGS_MASK_NONE}, 1453*c97d6d2cSSergio Andres Gomez Del Real {0xd8, 7, 3, X86_DECODE_CMD_FDIV, 10, true, false, decode_x87_modrm_st0, 1454*c97d6d2cSSergio Andres Gomez Del Real decode_x87_modrm_st0, NULL, RFLAGS_MASK_NONE}, 1455*c97d6d2cSSergio Andres Gomez Del Real {0xd8, 7, 0, X86_DECODE_CMD_FDIV, 4, true, false, decode_x87_modrm_st0, 1456*c97d6d2cSSergio Andres Gomez Del Real decode_x87_modrm_floatp, NULL, RFLAGS_MASK_NONE}, 1457*c97d6d2cSSergio Andres Gomez Del Real 1458*c97d6d2cSSergio Andres Gomez Del Real {0xd9, 0, 3, X86_DECODE_CMD_FLD, 10, false, false, 1459*c97d6d2cSSergio Andres Gomez Del Real decode_x87_modrm_st0, NULL, NULL, RFLAGS_MASK_NONE}, 1460*c97d6d2cSSergio Andres Gomez Del Real {0xd9, 0, 0, X86_DECODE_CMD_FLD, 4, false, false, 1461*c97d6d2cSSergio Andres Gomez Del Real decode_x87_modrm_floatp, NULL, NULL, RFLAGS_MASK_NONE}, 1462*c97d6d2cSSergio Andres Gomez Del Real {0xd9, 1, 3, X86_DECODE_CMD_FXCH, 10, false, false, decode_x87_modrm_st0, 1463*c97d6d2cSSergio Andres Gomez Del Real decode_x87_modrm_st0, NULL, RFLAGS_MASK_NONE}, 1464*c97d6d2cSSergio Andres Gomez Del Real {0xd9, 1, 0, X86_DECODE_CMD_INVL, 10, false, false, 1465*c97d6d2cSSergio Andres Gomez Del Real decode_x87_modrm_st0, NULL, NULL, RFLAGS_MASK_NONE}, 1466*c97d6d2cSSergio Andres Gomez Del Real {0xd9, 2, 3, X86_DECODE_CMD_INVL, 10, false, false, 1467*c97d6d2cSSergio Andres Gomez Del Real decode_x87_modrm_st0, NULL, NULL, RFLAGS_MASK_NONE}, 1468*c97d6d2cSSergio Andres Gomez Del Real {0xd9, 2, 0, X86_DECODE_CMD_FST, 4, false, false, 1469*c97d6d2cSSergio Andres Gomez Del Real decode_x87_modrm_floatp, NULL, NULL, RFLAGS_MASK_NONE}, 1470*c97d6d2cSSergio Andres Gomez Del Real {0xd9, 3, 3, X86_DECODE_CMD_INVL, 10, false, false, 1471*c97d6d2cSSergio Andres Gomez Del Real decode_x87_modrm_st0, NULL, NULL, RFLAGS_MASK_NONE}, 1472*c97d6d2cSSergio Andres Gomez Del Real {0xd9, 3, 0, X86_DECODE_CMD_FST, 4, false, true, 1473*c97d6d2cSSergio Andres Gomez Del Real decode_x87_modrm_floatp, NULL, NULL, RFLAGS_MASK_NONE}, 1474*c97d6d2cSSergio Andres Gomez Del Real {0xd9, 4, 3, X86_DECODE_CMD_INVL, 10, false, false, 1475*c97d6d2cSSergio Andres Gomez Del Real decode_x87_modrm_st0, NULL, decode_d9_4, RFLAGS_MASK_NONE}, 1476*c97d6d2cSSergio Andres Gomez Del Real {0xd9, 4, 0, X86_DECODE_CMD_INVL, 4, false, false, 1477*c97d6d2cSSergio Andres Gomez Del Real decode_x87_modrm_bytep, NULL, NULL, RFLAGS_MASK_NONE}, 1478*c97d6d2cSSergio Andres Gomez Del Real {0xd9, 5, 3, X86_DECODE_CMD_FLDxx, 10, false, false, NULL, NULL, NULL, 1479*c97d6d2cSSergio Andres Gomez Del Real RFLAGS_MASK_NONE}, 1480*c97d6d2cSSergio Andres Gomez Del Real {0xd9, 5, 0, X86_DECODE_CMD_FLDCW, 2, false, false, 1481*c97d6d2cSSergio Andres Gomez Del Real decode_x87_modrm_bytep, NULL, NULL, RFLAGS_MASK_NONE}, 1482*c97d6d2cSSergio Andres Gomez Del Real 1483*c97d6d2cSSergio Andres Gomez Del Real {0xd9, 7, 3, X86_DECODE_CMD_FNSTCW, 2, false, false, 1484*c97d6d2cSSergio Andres Gomez Del Real decode_x87_modrm_bytep, NULL, NULL, RFLAGS_MASK_NONE}, 1485*c97d6d2cSSergio Andres Gomez Del Real {0xd9, 7, 0, X86_DECODE_CMD_FNSTCW, 2, false, false, 1486*c97d6d2cSSergio Andres Gomez Del Real decode_x87_modrm_bytep, NULL, NULL, RFLAGS_MASK_NONE}, 1487*c97d6d2cSSergio Andres Gomez Del Real 1488*c97d6d2cSSergio Andres Gomez Del Real {0xda, 0, 3, X86_DECODE_CMD_FCMOV, 10, false, false, 1489*c97d6d2cSSergio Andres Gomez Del Real decode_x87_modrm_st0, decode_x87_modrm_st0, NULL, RFLAGS_MASK_NONE}, 1490*c97d6d2cSSergio Andres Gomez Del Real {0xda, 0, 0, X86_DECODE_CMD_FADD, 4, false, false, decode_x87_modrm_st0, 1491*c97d6d2cSSergio Andres Gomez Del Real decode_x87_modrm_intp, NULL, RFLAGS_MASK_NONE}, 1492*c97d6d2cSSergio Andres Gomez Del Real {0xda, 1, 3, X86_DECODE_CMD_FCMOV, 10, false, false, decode_x87_modrm_st0, 1493*c97d6d2cSSergio Andres Gomez Del Real decode_decode_x87_modrm_st0, NULL, RFLAGS_MASK_NONE}, 1494*c97d6d2cSSergio Andres Gomez Del Real {0xda, 1, 0, X86_DECODE_CMD_FMUL, 4, false, false, decode_x87_modrm_st0, 1495*c97d6d2cSSergio Andres Gomez Del Real decode_x87_modrm_intp, NULL, RFLAGS_MASK_NONE}, 1496*c97d6d2cSSergio Andres Gomez Del Real {0xda, 2, 3, X86_DECODE_CMD_FCMOV, 10, false, false, decode_x87_modrm_st0, 1497*c97d6d2cSSergio Andres Gomez Del Real decode_x87_modrm_st0, NULL, RFLAGS_MASK_NONE}, 1498*c97d6d2cSSergio Andres Gomez Del Real {0xda, 3, 3, X86_DECODE_CMD_FCMOV, 10, false, false, decode_x87_modrm_st0, 1499*c97d6d2cSSergio Andres Gomez Del Real decode_x87_modrm_st0, NULL, RFLAGS_MASK_NONE}, 1500*c97d6d2cSSergio Andres Gomez Del Real {0xda, 4, 3, X86_DECODE_CMD_INVL, 10, false, false, NULL, NULL, NULL, 1501*c97d6d2cSSergio Andres Gomez Del Real RFLAGS_MASK_NONE}, 1502*c97d6d2cSSergio Andres Gomez Del Real {0xda, 4, 0, X86_DECODE_CMD_FSUB, 4, false, false, decode_x87_modrm_st0, 1503*c97d6d2cSSergio Andres Gomez Del Real decode_x87_modrm_intp, NULL, RFLAGS_MASK_NONE}, 1504*c97d6d2cSSergio Andres Gomez Del Real {0xda, 5, 3, X86_DECODE_CMD_FUCOM, 10, false, true, decode_x87_modrm_st0, 1505*c97d6d2cSSergio Andres Gomez Del Real decode_decode_x87_modrm_st0, NULL, RFLAGS_MASK_NONE}, 1506*c97d6d2cSSergio Andres Gomez Del Real {0xda, 5, 0, X86_DECODE_CMD_FSUB, 4, true, false, decode_x87_modrm_st0, 1507*c97d6d2cSSergio Andres Gomez Del Real decode_x87_modrm_intp, NULL, RFLAGS_MASK_NONE}, 1508*c97d6d2cSSergio Andres Gomez Del Real {0xda, 6, 3, X86_DECODE_CMD_INVL, 10, false, false, NULL, NULL, NULL, 1509*c97d6d2cSSergio Andres Gomez Del Real RFLAGS_MASK_NONE}, 1510*c97d6d2cSSergio Andres Gomez Del Real {0xda, 6, 0, X86_DECODE_CMD_FDIV, 4, false, false, decode_x87_modrm_st0, 1511*c97d6d2cSSergio Andres Gomez Del Real decode_x87_modrm_intp, NULL, RFLAGS_MASK_NONE}, 1512*c97d6d2cSSergio Andres Gomez Del Real {0xda, 7, 3, X86_DECODE_CMD_INVL, 10, false, false, NULL, NULL, NULL, 1513*c97d6d2cSSergio Andres Gomez Del Real RFLAGS_MASK_NONE}, 1514*c97d6d2cSSergio Andres Gomez Del Real {0xda, 7, 0, X86_DECODE_CMD_FDIV, 4, true, false, decode_x87_modrm_st0, 1515*c97d6d2cSSergio Andres Gomez Del Real decode_x87_modrm_intp, NULL, RFLAGS_MASK_NONE}, 1516*c97d6d2cSSergio Andres Gomez Del Real 1517*c97d6d2cSSergio Andres Gomez Del Real {0xdb, 0, 3, X86_DECODE_CMD_FCMOV, 10, false, false, decode_x87_modrm_st0, 1518*c97d6d2cSSergio Andres Gomez Del Real decode_x87_modrm_st0, NULL, RFLAGS_MASK_NONE}, 1519*c97d6d2cSSergio Andres Gomez Del Real {0xdb, 0, 0, X86_DECODE_CMD_FLD, 4, false, false, 1520*c97d6d2cSSergio Andres Gomez Del Real decode_x87_modrm_intp, NULL, NULL, RFLAGS_MASK_NONE}, 1521*c97d6d2cSSergio Andres Gomez Del Real {0xdb, 1, 3, X86_DECODE_CMD_FCMOV, 10, false, false, 1522*c97d6d2cSSergio Andres Gomez Del Real decode_x87_modrm_st0, decode_x87_modrm_st0, NULL, RFLAGS_MASK_NONE}, 1523*c97d6d2cSSergio Andres Gomez Del Real {0xdb, 2, 3, X86_DECODE_CMD_FCMOV, 10, false, false, 1524*c97d6d2cSSergio Andres Gomez Del Real decode_x87_modrm_st0, decode_x87_modrm_st0, NULL, RFLAGS_MASK_NONE}, 1525*c97d6d2cSSergio Andres Gomez Del Real {0xdb, 2, 0, X86_DECODE_CMD_FST, 4, false, false, 1526*c97d6d2cSSergio Andres Gomez Del Real decode_x87_modrm_intp, NULL, NULL, RFLAGS_MASK_NONE}, 1527*c97d6d2cSSergio Andres Gomez Del Real {0xdb, 3, 3, X86_DECODE_CMD_FCMOV, 10, false, false, 1528*c97d6d2cSSergio Andres Gomez Del Real decode_x87_modrm_st0, decode_x87_modrm_st0, NULL, RFLAGS_MASK_NONE}, 1529*c97d6d2cSSergio Andres Gomez Del Real {0xdb, 3, 0, X86_DECODE_CMD_FST, 4, false, true, 1530*c97d6d2cSSergio Andres Gomez Del Real decode_x87_modrm_intp, NULL, NULL, RFLAGS_MASK_NONE}, 1531*c97d6d2cSSergio Andres Gomez Del Real {0xdb, 4, 3, X86_DECODE_CMD_INVL, 10, false, false, NULL, NULL, 1532*c97d6d2cSSergio Andres Gomez Del Real decode_db_4, RFLAGS_MASK_NONE}, 1533*c97d6d2cSSergio Andres Gomez Del Real {0xdb, 4, 0, X86_DECODE_CMD_INVL, 10, false, false, NULL, NULL, NULL, 1534*c97d6d2cSSergio Andres Gomez Del Real RFLAGS_MASK_NONE}, 1535*c97d6d2cSSergio Andres Gomez Del Real {0xdb, 5, 3, X86_DECODE_CMD_FUCOMI, 10, false, false, 1536*c97d6d2cSSergio Andres Gomez Del Real decode_x87_modrm_st0, decode_x87_modrm_st0, NULL, RFLAGS_MASK_NONE}, 1537*c97d6d2cSSergio Andres Gomez Del Real {0xdb, 5, 0, X86_DECODE_CMD_FLD, 10, false, false, 1538*c97d6d2cSSergio Andres Gomez Del Real decode_x87_modrm_floatp, NULL, NULL, RFLAGS_MASK_NONE}, 1539*c97d6d2cSSergio Andres Gomez Del Real {0xdb, 7, 0, X86_DECODE_CMD_FST, 10, false, true, 1540*c97d6d2cSSergio Andres Gomez Del Real decode_x87_modrm_floatp, NULL, NULL, RFLAGS_MASK_NONE}, 1541*c97d6d2cSSergio Andres Gomez Del Real 1542*c97d6d2cSSergio Andres Gomez Del Real {0xdc, 0, 3, X86_DECODE_CMD_FADD, 10, false, false, 1543*c97d6d2cSSergio Andres Gomez Del Real decode_x87_modrm_st0, decode_x87_modrm_st0, NULL, RFLAGS_MASK_NONE}, 1544*c97d6d2cSSergio Andres Gomez Del Real {0xdc, 0, 0, X86_DECODE_CMD_FADD, 8, false, false, 1545*c97d6d2cSSergio Andres Gomez Del Real decode_x87_modrm_st0, decode_x87_modrm_floatp, NULL, RFLAGS_MASK_NONE}, 1546*c97d6d2cSSergio Andres Gomez Del Real {0xdc, 1, 3, X86_DECODE_CMD_FMUL, 10, false, false, 1547*c97d6d2cSSergio Andres Gomez Del Real decode_x87_modrm_st0, decode_x87_modrm_st0, NULL, RFLAGS_MASK_NONE}, 1548*c97d6d2cSSergio Andres Gomez Del Real {0xdc, 1, 0, X86_DECODE_CMD_FMUL, 8, false, false, 1549*c97d6d2cSSergio Andres Gomez Del Real decode_x87_modrm_st0, decode_x87_modrm_floatp, NULL, RFLAGS_MASK_NONE}, 1550*c97d6d2cSSergio Andres Gomez Del Real {0xdc, 4, 3, X86_DECODE_CMD_FSUB, 10, true, false, 1551*c97d6d2cSSergio Andres Gomez Del Real decode_x87_modrm_st0, decode_x87_modrm_st0, NULL, RFLAGS_MASK_NONE}, 1552*c97d6d2cSSergio Andres Gomez Del Real {0xdc, 4, 0, X86_DECODE_CMD_FSUB, 8, false, false, 1553*c97d6d2cSSergio Andres Gomez Del Real decode_x87_modrm_st0, decode_x87_modrm_floatp, NULL, RFLAGS_MASK_NONE}, 1554*c97d6d2cSSergio Andres Gomez Del Real {0xdc, 5, 3, X86_DECODE_CMD_FSUB, 10, false, false, 1555*c97d6d2cSSergio Andres Gomez Del Real decode_x87_modrm_st0, decode_x87_modrm_st0, NULL, RFLAGS_MASK_NONE}, 1556*c97d6d2cSSergio Andres Gomez Del Real {0xdc, 5, 0, X86_DECODE_CMD_FSUB, 8, true, false, 1557*c97d6d2cSSergio Andres Gomez Del Real decode_x87_modrm_st0, decode_x87_modrm_floatp, NULL, RFLAGS_MASK_NONE}, 1558*c97d6d2cSSergio Andres Gomez Del Real {0xdc, 6, 3, X86_DECODE_CMD_FDIV, 10, true, false, 1559*c97d6d2cSSergio Andres Gomez Del Real decode_x87_modrm_st0, decode_x87_modrm_st0, NULL, RFLAGS_MASK_NONE}, 1560*c97d6d2cSSergio Andres Gomez Del Real {0xdc, 6, 0, X86_DECODE_CMD_FDIV, 8, false, false, 1561*c97d6d2cSSergio Andres Gomez Del Real decode_x87_modrm_st0, decode_x87_modrm_floatp, NULL, RFLAGS_MASK_NONE}, 1562*c97d6d2cSSergio Andres Gomez Del Real {0xdc, 7, 3, X86_DECODE_CMD_FDIV, 10, false, false, 1563*c97d6d2cSSergio Andres Gomez Del Real decode_x87_modrm_st0, decode_x87_modrm_st0, NULL, RFLAGS_MASK_NONE}, 1564*c97d6d2cSSergio Andres Gomez Del Real {0xdc, 7, 0, X86_DECODE_CMD_FDIV, 8, true, false, 1565*c97d6d2cSSergio Andres Gomez Del Real decode_x87_modrm_st0, decode_x87_modrm_floatp, NULL, RFLAGS_MASK_NONE}, 1566*c97d6d2cSSergio Andres Gomez Del Real 1567*c97d6d2cSSergio Andres Gomez Del Real {0xdd, 0, 0, X86_DECODE_CMD_FLD, 8, false, false, 1568*c97d6d2cSSergio Andres Gomez Del Real decode_x87_modrm_floatp, NULL, NULL, RFLAGS_MASK_NONE}, 1569*c97d6d2cSSergio Andres Gomez Del Real {0xdd, 1, 3, X86_DECODE_CMD_FXCH, 10, false, false, 1570*c97d6d2cSSergio Andres Gomez Del Real decode_x87_modrm_st0, decode_x87_modrm_st0, NULL, RFLAGS_MASK_NONE}, 1571*c97d6d2cSSergio Andres Gomez Del Real {0xdd, 2, 3, X86_DECODE_CMD_FST, 10, false, false, 1572*c97d6d2cSSergio Andres Gomez Del Real decode_x87_modrm_st0, NULL, NULL, RFLAGS_MASK_NONE}, 1573*c97d6d2cSSergio Andres Gomez Del Real {0xdd, 2, 0, X86_DECODE_CMD_FST, 8, false, false, 1574*c97d6d2cSSergio Andres Gomez Del Real decode_x87_modrm_floatp, NULL, NULL, RFLAGS_MASK_NONE}, 1575*c97d6d2cSSergio Andres Gomez Del Real {0xdd, 3, 3, X86_DECODE_CMD_FST, 10, false, true, 1576*c97d6d2cSSergio Andres Gomez Del Real decode_x87_modrm_st0, NULL, NULL, RFLAGS_MASK_NONE}, 1577*c97d6d2cSSergio Andres Gomez Del Real {0xdd, 3, 0, X86_DECODE_CMD_FST, 8, false, true, 1578*c97d6d2cSSergio Andres Gomez Del Real decode_x87_modrm_floatp, NULL, NULL, RFLAGS_MASK_NONE}, 1579*c97d6d2cSSergio Andres Gomez Del Real {0xdd, 4, 3, X86_DECODE_CMD_FUCOM, 10, false, false, 1580*c97d6d2cSSergio Andres Gomez Del Real decode_x87_modrm_st0, decode_x87_modrm_st0, NULL, RFLAGS_MASK_NONE}, 1581*c97d6d2cSSergio Andres Gomez Del Real {0xdd, 4, 0, X86_DECODE_CMD_FRSTOR, 8, false, false, 1582*c97d6d2cSSergio Andres Gomez Del Real decode_x87_modrm_bytep, NULL, NULL, RFLAGS_MASK_NONE}, 1583*c97d6d2cSSergio Andres Gomez Del Real {0xdd, 5, 3, X86_DECODE_CMD_FUCOM, 10, false, true, 1584*c97d6d2cSSergio Andres Gomez Del Real decode_x87_modrm_st0, decode_x87_modrm_st0, NULL, RFLAGS_MASK_NONE}, 1585*c97d6d2cSSergio Andres Gomez Del Real {0xdd, 7, 0, X86_DECODE_CMD_FNSTSW, 0, false, false, 1586*c97d6d2cSSergio Andres Gomez Del Real decode_x87_modrm_bytep, NULL, NULL, RFLAGS_MASK_NONE}, 1587*c97d6d2cSSergio Andres Gomez Del Real {0xdd, 7, 3, X86_DECODE_CMD_FNSTSW, 0, false, false, 1588*c97d6d2cSSergio Andres Gomez Del Real decode_x87_modrm_bytep, NULL, NULL, RFLAGS_MASK_NONE}, 1589*c97d6d2cSSergio Andres Gomez Del Real 1590*c97d6d2cSSergio Andres Gomez Del Real {0xde, 0, 3, X86_DECODE_CMD_FADD, 10, false, true, 1591*c97d6d2cSSergio Andres Gomez Del Real decode_x87_modrm_st0, decode_x87_modrm_st0, NULL, RFLAGS_MASK_NONE}, 1592*c97d6d2cSSergio Andres Gomez Del Real {0xde, 0, 0, X86_DECODE_CMD_FADD, 2, false, false, 1593*c97d6d2cSSergio Andres Gomez Del Real decode_x87_modrm_st0, decode_x87_modrm_intp, NULL, RFLAGS_MASK_NONE}, 1594*c97d6d2cSSergio Andres Gomez Del Real {0xde, 1, 3, X86_DECODE_CMD_FMUL, 10, false, true, 1595*c97d6d2cSSergio Andres Gomez Del Real decode_x87_modrm_st0, decode_x87_modrm_st0, NULL, RFLAGS_MASK_NONE}, 1596*c97d6d2cSSergio Andres Gomez Del Real {0xde, 1, 0, X86_DECODE_CMD_FMUL, 2, false, false, 1597*c97d6d2cSSergio Andres Gomez Del Real decode_x87_modrm_st0, decode_x87_modrm_intp, NULL, RFLAGS_MASK_NONE}, 1598*c97d6d2cSSergio Andres Gomez Del Real {0xde, 4, 3, X86_DECODE_CMD_FSUB, 10, true, true, 1599*c97d6d2cSSergio Andres Gomez Del Real decode_x87_modrm_st0, decode_x87_modrm_st0, NULL, RFLAGS_MASK_NONE}, 1600*c97d6d2cSSergio Andres Gomez Del Real {0xde, 4, 0, X86_DECODE_CMD_FSUB, 2, false, false, 1601*c97d6d2cSSergio Andres Gomez Del Real decode_x87_modrm_st0, decode_x87_modrm_intp, NULL, RFLAGS_MASK_NONE}, 1602*c97d6d2cSSergio Andres Gomez Del Real {0xde, 5, 3, X86_DECODE_CMD_FSUB, 10, false, true, 1603*c97d6d2cSSergio Andres Gomez Del Real decode_x87_modrm_st0, decode_x87_modrm_st0, NULL, RFLAGS_MASK_NONE}, 1604*c97d6d2cSSergio Andres Gomez Del Real {0xde, 5, 0, X86_DECODE_CMD_FSUB, 2, true, false, 1605*c97d6d2cSSergio Andres Gomez Del Real decode_x87_modrm_st0, decode_x87_modrm_intp, NULL, RFLAGS_MASK_NONE}, 1606*c97d6d2cSSergio Andres Gomez Del Real {0xde, 6, 3, X86_DECODE_CMD_FDIV, 10, true, true, 1607*c97d6d2cSSergio Andres Gomez Del Real decode_x87_modrm_st0, decode_x87_modrm_st0, NULL, RFLAGS_MASK_NONE}, 1608*c97d6d2cSSergio Andres Gomez Del Real {0xde, 6, 0, X86_DECODE_CMD_FDIV, 2, false, false, 1609*c97d6d2cSSergio Andres Gomez Del Real decode_x87_modrm_st0, decode_x87_modrm_intp, NULL, RFLAGS_MASK_NONE}, 1610*c97d6d2cSSergio Andres Gomez Del Real {0xde, 7, 3, X86_DECODE_CMD_FDIV, 10, false, true, 1611*c97d6d2cSSergio Andres Gomez Del Real decode_x87_modrm_st0, decode_x87_modrm_st0, NULL, RFLAGS_MASK_NONE}, 1612*c97d6d2cSSergio Andres Gomez Del Real {0xde, 7, 0, X86_DECODE_CMD_FDIV, 2, true, false, 1613*c97d6d2cSSergio Andres Gomez Del Real decode_x87_modrm_st0, decode_x87_modrm_intp, NULL, RFLAGS_MASK_NONE}, 1614*c97d6d2cSSergio Andres Gomez Del Real 1615*c97d6d2cSSergio Andres Gomez Del Real {0xdf, 0, 0, X86_DECODE_CMD_FLD, 2, false, false, 1616*c97d6d2cSSergio Andres Gomez Del Real decode_x87_modrm_intp, NULL, NULL, RFLAGS_MASK_NONE}, 1617*c97d6d2cSSergio Andres Gomez Del Real {0xdf, 1, 3, X86_DECODE_CMD_FXCH, 10, false, false, 1618*c97d6d2cSSergio Andres Gomez Del Real decode_x87_modrm_st0, decode_x87_modrm_st0, NULL, RFLAGS_MASK_NONE}, 1619*c97d6d2cSSergio Andres Gomez Del Real {0xdf, 2, 3, X86_DECODE_CMD_FST, 10, false, true, 1620*c97d6d2cSSergio Andres Gomez Del Real decode_x87_modrm_st0, decode_x87_modrm_st0, NULL, RFLAGS_MASK_NONE}, 1621*c97d6d2cSSergio Andres Gomez Del Real {0xdf, 2, 0, X86_DECODE_CMD_FST, 2, false, false, 1622*c97d6d2cSSergio Andres Gomez Del Real decode_x87_modrm_intp, NULL, NULL, RFLAGS_MASK_NONE}, 1623*c97d6d2cSSergio Andres Gomez Del Real {0xdf, 3, 3, X86_DECODE_CMD_FST, 10, false, true, 1624*c97d6d2cSSergio Andres Gomez Del Real decode_x87_modrm_st0, decode_x87_modrm_st0, NULL, RFLAGS_MASK_NONE}, 1625*c97d6d2cSSergio Andres Gomez Del Real {0xdf, 3, 0, X86_DECODE_CMD_FST, 2, false, true, 1626*c97d6d2cSSergio Andres Gomez Del Real decode_x87_modrm_intp, NULL, NULL, RFLAGS_MASK_NONE}, 1627*c97d6d2cSSergio Andres Gomez Del Real {0xdf, 4, 3, X86_DECODE_CMD_FNSTSW, 2, false, true, 1628*c97d6d2cSSergio Andres Gomez Del Real decode_x87_modrm_bytep, NULL, NULL, RFLAGS_MASK_NONE}, 1629*c97d6d2cSSergio Andres Gomez Del Real {0xdf, 5, 3, X86_DECODE_CMD_FUCOMI, 10, false, true, 1630*c97d6d2cSSergio Andres Gomez Del Real decode_x87_modrm_st0, decode_x87_modrm_st0, NULL, RFLAGS_MASK_NONE}, 1631*c97d6d2cSSergio Andres Gomez Del Real {0xdf, 5, 0, X86_DECODE_CMD_FLD, 8, false, false, 1632*c97d6d2cSSergio Andres Gomez Del Real decode_x87_modrm_intp, NULL, NULL, RFLAGS_MASK_NONE}, 1633*c97d6d2cSSergio Andres Gomez Del Real {0xdf, 7, 0, X86_DECODE_CMD_FST, 8, false, true, 1634*c97d6d2cSSergio Andres Gomez Del Real decode_x87_modrm_intp, NULL, NULL, RFLAGS_MASK_NONE}, 1635*c97d6d2cSSergio Andres Gomez Del Real }; 1636*c97d6d2cSSergio Andres Gomez Del Real 1637*c97d6d2cSSergio Andres Gomez Del Real void calc_modrm_operand16(CPUX86State *env, struct x86_decode *decode, 1638*c97d6d2cSSergio Andres Gomez Del Real struct x86_decode_op *op) 1639*c97d6d2cSSergio Andres Gomez Del Real { 1640*c97d6d2cSSergio Andres Gomez Del Real addr_t ptr = 0; 1641*c97d6d2cSSergio Andres Gomez Del Real x86_reg_segment seg = REG_SEG_DS; 1642*c97d6d2cSSergio Andres Gomez Del Real 1643*c97d6d2cSSergio Andres Gomez Del Real if (!decode->modrm.mod && 6 == decode->modrm.rm) { 1644*c97d6d2cSSergio Andres Gomez Del Real op->ptr = (uint16_t)decode->displacement; 1645*c97d6d2cSSergio Andres Gomez Del Real goto calc_addr; 1646*c97d6d2cSSergio Andres Gomez Del Real } 1647*c97d6d2cSSergio Andres Gomez Del Real 1648*c97d6d2cSSergio Andres Gomez Del Real if (decode->displacement_size) { 1649*c97d6d2cSSergio Andres Gomez Del Real ptr = sign(decode->displacement, decode->displacement_size); 1650*c97d6d2cSSergio Andres Gomez Del Real } 1651*c97d6d2cSSergio Andres Gomez Del Real 1652*c97d6d2cSSergio Andres Gomez Del Real switch (decode->modrm.rm) { 1653*c97d6d2cSSergio Andres Gomez Del Real case 0: 1654*c97d6d2cSSergio Andres Gomez Del Real ptr += BX(env) + SI(env); 1655*c97d6d2cSSergio Andres Gomez Del Real break; 1656*c97d6d2cSSergio Andres Gomez Del Real case 1: 1657*c97d6d2cSSergio Andres Gomez Del Real ptr += BX(env) + DI(env); 1658*c97d6d2cSSergio Andres Gomez Del Real break; 1659*c97d6d2cSSergio Andres Gomez Del Real case 2: 1660*c97d6d2cSSergio Andres Gomez Del Real ptr += BP(env) + SI(env); 1661*c97d6d2cSSergio Andres Gomez Del Real seg = REG_SEG_SS; 1662*c97d6d2cSSergio Andres Gomez Del Real break; 1663*c97d6d2cSSergio Andres Gomez Del Real case 3: 1664*c97d6d2cSSergio Andres Gomez Del Real ptr += BP(env) + DI(env); 1665*c97d6d2cSSergio Andres Gomez Del Real seg = REG_SEG_SS; 1666*c97d6d2cSSergio Andres Gomez Del Real break; 1667*c97d6d2cSSergio Andres Gomez Del Real case 4: 1668*c97d6d2cSSergio Andres Gomez Del Real ptr += SI(env); 1669*c97d6d2cSSergio Andres Gomez Del Real break; 1670*c97d6d2cSSergio Andres Gomez Del Real case 5: 1671*c97d6d2cSSergio Andres Gomez Del Real ptr += DI(env); 1672*c97d6d2cSSergio Andres Gomez Del Real break; 1673*c97d6d2cSSergio Andres Gomez Del Real case 6: 1674*c97d6d2cSSergio Andres Gomez Del Real ptr += BP(env); 1675*c97d6d2cSSergio Andres Gomez Del Real seg = REG_SEG_SS; 1676*c97d6d2cSSergio Andres Gomez Del Real break; 1677*c97d6d2cSSergio Andres Gomez Del Real case 7: 1678*c97d6d2cSSergio Andres Gomez Del Real ptr += BX(env); 1679*c97d6d2cSSergio Andres Gomez Del Real break; 1680*c97d6d2cSSergio Andres Gomez Del Real } 1681*c97d6d2cSSergio Andres Gomez Del Real calc_addr: 1682*c97d6d2cSSergio Andres Gomez Del Real if (X86_DECODE_CMD_LEA == decode->cmd) { 1683*c97d6d2cSSergio Andres Gomez Del Real op->ptr = (uint16_t)ptr; 1684*c97d6d2cSSergio Andres Gomez Del Real } else { 1685*c97d6d2cSSergio Andres Gomez Del Real op->ptr = decode_linear_addr(env, decode, (uint16_t)ptr, seg); 1686*c97d6d2cSSergio Andres Gomez Del Real } 1687*c97d6d2cSSergio Andres Gomez Del Real } 1688*c97d6d2cSSergio Andres Gomez Del Real 1689*c97d6d2cSSergio Andres Gomez Del Real addr_t get_reg_ref(CPUX86State *env, int reg, int is_extended, int size) 1690*c97d6d2cSSergio Andres Gomez Del Real { 1691*c97d6d2cSSergio Andres Gomez Del Real addr_t ptr = 0; 1692*c97d6d2cSSergio Andres Gomez Del Real int which = 0; 1693*c97d6d2cSSergio Andres Gomez Del Real 1694*c97d6d2cSSergio Andres Gomez Del Real if (is_extended) { 1695*c97d6d2cSSergio Andres Gomez Del Real reg |= REG_R8; 1696*c97d6d2cSSergio Andres Gomez Del Real } 1697*c97d6d2cSSergio Andres Gomez Del Real 1698*c97d6d2cSSergio Andres Gomez Del Real 1699*c97d6d2cSSergio Andres Gomez Del Real switch (size) { 1700*c97d6d2cSSergio Andres Gomez Del Real case 1: 1701*c97d6d2cSSergio Andres Gomez Del Real if (is_extended || reg < 4) { 1702*c97d6d2cSSergio Andres Gomez Del Real which = 1; 1703*c97d6d2cSSergio Andres Gomez Del Real ptr = (addr_t)&RL(env, reg); 1704*c97d6d2cSSergio Andres Gomez Del Real } else { 1705*c97d6d2cSSergio Andres Gomez Del Real which = 2; 1706*c97d6d2cSSergio Andres Gomez Del Real ptr = (addr_t)&RH(env, reg - 4); 1707*c97d6d2cSSergio Andres Gomez Del Real } 1708*c97d6d2cSSergio Andres Gomez Del Real break; 1709*c97d6d2cSSergio Andres Gomez Del Real default: 1710*c97d6d2cSSergio Andres Gomez Del Real which = 3; 1711*c97d6d2cSSergio Andres Gomez Del Real ptr = (addr_t)&RRX(env, reg); 1712*c97d6d2cSSergio Andres Gomez Del Real break; 1713*c97d6d2cSSergio Andres Gomez Del Real } 1714*c97d6d2cSSergio Andres Gomez Del Real return ptr; 1715*c97d6d2cSSergio Andres Gomez Del Real } 1716*c97d6d2cSSergio Andres Gomez Del Real 1717*c97d6d2cSSergio Andres Gomez Del Real addr_t get_reg_val(CPUX86State *env, int reg, int is_extended, int size) 1718*c97d6d2cSSergio Andres Gomez Del Real { 1719*c97d6d2cSSergio Andres Gomez Del Real addr_t val = 0; 1720*c97d6d2cSSergio Andres Gomez Del Real memcpy(&val, (void *)get_reg_ref(env, reg, is_extended, size), size); 1721*c97d6d2cSSergio Andres Gomez Del Real return val; 1722*c97d6d2cSSergio Andres Gomez Del Real } 1723*c97d6d2cSSergio Andres Gomez Del Real 1724*c97d6d2cSSergio Andres Gomez Del Real static addr_t get_sib_val(CPUX86State *env, struct x86_decode *decode, 1725*c97d6d2cSSergio Andres Gomez Del Real x86_reg_segment *sel) 1726*c97d6d2cSSergio Andres Gomez Del Real { 1727*c97d6d2cSSergio Andres Gomez Del Real addr_t base = 0; 1728*c97d6d2cSSergio Andres Gomez Del Real addr_t scaled_index = 0; 1729*c97d6d2cSSergio Andres Gomez Del Real int addr_size = decode->addressing_size; 1730*c97d6d2cSSergio Andres Gomez Del Real int base_reg = decode->sib.base; 1731*c97d6d2cSSergio Andres Gomez Del Real int index_reg = decode->sib.index; 1732*c97d6d2cSSergio Andres Gomez Del Real 1733*c97d6d2cSSergio Andres Gomez Del Real *sel = REG_SEG_DS; 1734*c97d6d2cSSergio Andres Gomez Del Real 1735*c97d6d2cSSergio Andres Gomez Del Real if (decode->modrm.mod || base_reg != REG_RBP) { 1736*c97d6d2cSSergio Andres Gomez Del Real if (decode->rex.b) { 1737*c97d6d2cSSergio Andres Gomez Del Real base_reg |= REG_R8; 1738*c97d6d2cSSergio Andres Gomez Del Real } 1739*c97d6d2cSSergio Andres Gomez Del Real if (REG_RSP == base_reg || REG_RBP == base_reg) { 1740*c97d6d2cSSergio Andres Gomez Del Real *sel = REG_SEG_SS; 1741*c97d6d2cSSergio Andres Gomez Del Real } 1742*c97d6d2cSSergio Andres Gomez Del Real base = get_reg_val(env, decode->sib.base, decode->rex.b, addr_size); 1743*c97d6d2cSSergio Andres Gomez Del Real } 1744*c97d6d2cSSergio Andres Gomez Del Real 1745*c97d6d2cSSergio Andres Gomez Del Real if (decode->rex.x) { 1746*c97d6d2cSSergio Andres Gomez Del Real index_reg |= REG_R8; 1747*c97d6d2cSSergio Andres Gomez Del Real } 1748*c97d6d2cSSergio Andres Gomez Del Real 1749*c97d6d2cSSergio Andres Gomez Del Real if (index_reg != REG_RSP) { 1750*c97d6d2cSSergio Andres Gomez Del Real scaled_index = get_reg_val(env, index_reg, decode->rex.x, addr_size) << 1751*c97d6d2cSSergio Andres Gomez Del Real decode->sib.scale; 1752*c97d6d2cSSergio Andres Gomez Del Real } 1753*c97d6d2cSSergio Andres Gomez Del Real return base + scaled_index; 1754*c97d6d2cSSergio Andres Gomez Del Real } 1755*c97d6d2cSSergio Andres Gomez Del Real 1756*c97d6d2cSSergio Andres Gomez Del Real void calc_modrm_operand32(CPUX86State *env, struct x86_decode *decode, 1757*c97d6d2cSSergio Andres Gomez Del Real struct x86_decode_op *op) 1758*c97d6d2cSSergio Andres Gomez Del Real { 1759*c97d6d2cSSergio Andres Gomez Del Real x86_reg_segment seg = REG_SEG_DS; 1760*c97d6d2cSSergio Andres Gomez Del Real addr_t ptr = 0; 1761*c97d6d2cSSergio Andres Gomez Del Real int addr_size = decode->addressing_size; 1762*c97d6d2cSSergio Andres Gomez Del Real 1763*c97d6d2cSSergio Andres Gomez Del Real if (decode->displacement_size) { 1764*c97d6d2cSSergio Andres Gomez Del Real ptr = sign(decode->displacement, decode->displacement_size); 1765*c97d6d2cSSergio Andres Gomez Del Real } 1766*c97d6d2cSSergio Andres Gomez Del Real 1767*c97d6d2cSSergio Andres Gomez Del Real if (4 == decode->modrm.rm) { 1768*c97d6d2cSSergio Andres Gomez Del Real ptr += get_sib_val(env, decode, &seg); 1769*c97d6d2cSSergio Andres Gomez Del Real } else if (!decode->modrm.mod && 5 == decode->modrm.rm) { 1770*c97d6d2cSSergio Andres Gomez Del Real if (x86_is_long_mode(ENV_GET_CPU(env))) { 1771*c97d6d2cSSergio Andres Gomez Del Real ptr += RIP(env) + decode->len; 1772*c97d6d2cSSergio Andres Gomez Del Real } else { 1773*c97d6d2cSSergio Andres Gomez Del Real ptr = decode->displacement; 1774*c97d6d2cSSergio Andres Gomez Del Real } 1775*c97d6d2cSSergio Andres Gomez Del Real } else { 1776*c97d6d2cSSergio Andres Gomez Del Real if (REG_RBP == decode->modrm.rm || REG_RSP == decode->modrm.rm) { 1777*c97d6d2cSSergio Andres Gomez Del Real seg = REG_SEG_SS; 1778*c97d6d2cSSergio Andres Gomez Del Real } 1779*c97d6d2cSSergio Andres Gomez Del Real ptr += get_reg_val(env, decode->modrm.rm, decode->rex.b, addr_size); 1780*c97d6d2cSSergio Andres Gomez Del Real } 1781*c97d6d2cSSergio Andres Gomez Del Real 1782*c97d6d2cSSergio Andres Gomez Del Real if (X86_DECODE_CMD_LEA == decode->cmd) { 1783*c97d6d2cSSergio Andres Gomez Del Real op->ptr = (uint32_t)ptr; 1784*c97d6d2cSSergio Andres Gomez Del Real } else { 1785*c97d6d2cSSergio Andres Gomez Del Real op->ptr = decode_linear_addr(env, decode, (uint32_t)ptr, seg); 1786*c97d6d2cSSergio Andres Gomez Del Real } 1787*c97d6d2cSSergio Andres Gomez Del Real } 1788*c97d6d2cSSergio Andres Gomez Del Real 1789*c97d6d2cSSergio Andres Gomez Del Real void calc_modrm_operand64(CPUX86State *env, struct x86_decode *decode, 1790*c97d6d2cSSergio Andres Gomez Del Real struct x86_decode_op *op) 1791*c97d6d2cSSergio Andres Gomez Del Real { 1792*c97d6d2cSSergio Andres Gomez Del Real x86_reg_segment seg = REG_SEG_DS; 1793*c97d6d2cSSergio Andres Gomez Del Real int32_t offset = 0; 1794*c97d6d2cSSergio Andres Gomez Del Real int mod = decode->modrm.mod; 1795*c97d6d2cSSergio Andres Gomez Del Real int rm = decode->modrm.rm; 1796*c97d6d2cSSergio Andres Gomez Del Real addr_t ptr; 1797*c97d6d2cSSergio Andres Gomez Del Real int src = decode->modrm.rm; 1798*c97d6d2cSSergio Andres Gomez Del Real 1799*c97d6d2cSSergio Andres Gomez Del Real if (decode->displacement_size) { 1800*c97d6d2cSSergio Andres Gomez Del Real offset = sign(decode->displacement, decode->displacement_size); 1801*c97d6d2cSSergio Andres Gomez Del Real } 1802*c97d6d2cSSergio Andres Gomez Del Real 1803*c97d6d2cSSergio Andres Gomez Del Real if (4 == rm) { 1804*c97d6d2cSSergio Andres Gomez Del Real ptr = get_sib_val(env, decode, &seg) + offset; 1805*c97d6d2cSSergio Andres Gomez Del Real } else if (0 == mod && 5 == rm) { 1806*c97d6d2cSSergio Andres Gomez Del Real ptr = RIP(env) + decode->len + (int32_t) offset; 1807*c97d6d2cSSergio Andres Gomez Del Real } else { 1808*c97d6d2cSSergio Andres Gomez Del Real ptr = get_reg_val(env, src, decode->rex.b, 8) + (int64_t) offset; 1809*c97d6d2cSSergio Andres Gomez Del Real } 1810*c97d6d2cSSergio Andres Gomez Del Real 1811*c97d6d2cSSergio Andres Gomez Del Real if (X86_DECODE_CMD_LEA == decode->cmd) { 1812*c97d6d2cSSergio Andres Gomez Del Real op->ptr = ptr; 1813*c97d6d2cSSergio Andres Gomez Del Real } else { 1814*c97d6d2cSSergio Andres Gomez Del Real op->ptr = decode_linear_addr(env, decode, ptr, seg); 1815*c97d6d2cSSergio Andres Gomez Del Real } 1816*c97d6d2cSSergio Andres Gomez Del Real } 1817*c97d6d2cSSergio Andres Gomez Del Real 1818*c97d6d2cSSergio Andres Gomez Del Real 1819*c97d6d2cSSergio Andres Gomez Del Real void calc_modrm_operand(CPUX86State *env, struct x86_decode *decode, 1820*c97d6d2cSSergio Andres Gomez Del Real struct x86_decode_op *op) 1821*c97d6d2cSSergio Andres Gomez Del Real { 1822*c97d6d2cSSergio Andres Gomez Del Real if (3 == decode->modrm.mod) { 1823*c97d6d2cSSergio Andres Gomez Del Real op->reg = decode->modrm.reg; 1824*c97d6d2cSSergio Andres Gomez Del Real op->type = X86_VAR_REG; 1825*c97d6d2cSSergio Andres Gomez Del Real op->ptr = get_reg_ref(env, decode->modrm.rm, decode->rex.b, 1826*c97d6d2cSSergio Andres Gomez Del Real decode->operand_size); 1827*c97d6d2cSSergio Andres Gomez Del Real return; 1828*c97d6d2cSSergio Andres Gomez Del Real } 1829*c97d6d2cSSergio Andres Gomez Del Real 1830*c97d6d2cSSergio Andres Gomez Del Real switch (decode->addressing_size) { 1831*c97d6d2cSSergio Andres Gomez Del Real case 2: 1832*c97d6d2cSSergio Andres Gomez Del Real calc_modrm_operand16(env, decode, op); 1833*c97d6d2cSSergio Andres Gomez Del Real break; 1834*c97d6d2cSSergio Andres Gomez Del Real case 4: 1835*c97d6d2cSSergio Andres Gomez Del Real calc_modrm_operand32(env, decode, op); 1836*c97d6d2cSSergio Andres Gomez Del Real break; 1837*c97d6d2cSSergio Andres Gomez Del Real case 8: 1838*c97d6d2cSSergio Andres Gomez Del Real calc_modrm_operand64(env, decode, op); 1839*c97d6d2cSSergio Andres Gomez Del Real break; 1840*c97d6d2cSSergio Andres Gomez Del Real default: 1841*c97d6d2cSSergio Andres Gomez Del Real VM_PANIC_EX("unsupported address size %d\n", decode->addressing_size); 1842*c97d6d2cSSergio Andres Gomez Del Real break; 1843*c97d6d2cSSergio Andres Gomez Del Real } 1844*c97d6d2cSSergio Andres Gomez Del Real } 1845*c97d6d2cSSergio Andres Gomez Del Real 1846*c97d6d2cSSergio Andres Gomez Del Real static void decode_prefix(CPUX86State *env, struct x86_decode *decode) 1847*c97d6d2cSSergio Andres Gomez Del Real { 1848*c97d6d2cSSergio Andres Gomez Del Real while (1) { 1849*c97d6d2cSSergio Andres Gomez Del Real uint8_t byte = decode_byte(env, decode); 1850*c97d6d2cSSergio Andres Gomez Del Real switch (byte) { 1851*c97d6d2cSSergio Andres Gomez Del Real case PREFIX_LOCK: 1852*c97d6d2cSSergio Andres Gomez Del Real decode->lock = byte; 1853*c97d6d2cSSergio Andres Gomez Del Real break; 1854*c97d6d2cSSergio Andres Gomez Del Real case PREFIX_REPN: 1855*c97d6d2cSSergio Andres Gomez Del Real case PREFIX_REP: 1856*c97d6d2cSSergio Andres Gomez Del Real decode->rep = byte; 1857*c97d6d2cSSergio Andres Gomez Del Real break; 1858*c97d6d2cSSergio Andres Gomez Del Real case PREFIX_CS_SEG_OVEERIDE: 1859*c97d6d2cSSergio Andres Gomez Del Real case PREFIX_SS_SEG_OVEERIDE: 1860*c97d6d2cSSergio Andres Gomez Del Real case PREFIX_DS_SEG_OVEERIDE: 1861*c97d6d2cSSergio Andres Gomez Del Real case PREFIX_ES_SEG_OVEERIDE: 1862*c97d6d2cSSergio Andres Gomez Del Real case PREFIX_FS_SEG_OVEERIDE: 1863*c97d6d2cSSergio Andres Gomez Del Real case PREFIX_GS_SEG_OVEERIDE: 1864*c97d6d2cSSergio Andres Gomez Del Real decode->segment_override = byte; 1865*c97d6d2cSSergio Andres Gomez Del Real break; 1866*c97d6d2cSSergio Andres Gomez Del Real case PREFIX_OP_SIZE_OVERRIDE: 1867*c97d6d2cSSergio Andres Gomez Del Real decode->op_size_override = byte; 1868*c97d6d2cSSergio Andres Gomez Del Real break; 1869*c97d6d2cSSergio Andres Gomez Del Real case PREFIX_ADDR_SIZE_OVERRIDE: 1870*c97d6d2cSSergio Andres Gomez Del Real decode->addr_size_override = byte; 1871*c97d6d2cSSergio Andres Gomez Del Real break; 1872*c97d6d2cSSergio Andres Gomez Del Real case PREFIX_REX ... (PREFIX_REX + 0xf): 1873*c97d6d2cSSergio Andres Gomez Del Real if (x86_is_long_mode(ENV_GET_CPU(env))) { 1874*c97d6d2cSSergio Andres Gomez Del Real decode->rex.rex = byte; 1875*c97d6d2cSSergio Andres Gomez Del Real break; 1876*c97d6d2cSSergio Andres Gomez Del Real } 1877*c97d6d2cSSergio Andres Gomez Del Real /* fall through when not in long mode */ 1878*c97d6d2cSSergio Andres Gomez Del Real default: 1879*c97d6d2cSSergio Andres Gomez Del Real decode->len--; 1880*c97d6d2cSSergio Andres Gomez Del Real return; 1881*c97d6d2cSSergio Andres Gomez Del Real } 1882*c97d6d2cSSergio Andres Gomez Del Real } 1883*c97d6d2cSSergio Andres Gomez Del Real } 1884*c97d6d2cSSergio Andres Gomez Del Real 1885*c97d6d2cSSergio Andres Gomez Del Real void set_addressing_size(CPUX86State *env, struct x86_decode *decode) 1886*c97d6d2cSSergio Andres Gomez Del Real { 1887*c97d6d2cSSergio Andres Gomez Del Real decode->addressing_size = -1; 1888*c97d6d2cSSergio Andres Gomez Del Real if (x86_is_real(ENV_GET_CPU(env)) || x86_is_v8086(ENV_GET_CPU(env))) { 1889*c97d6d2cSSergio Andres Gomez Del Real if (decode->addr_size_override) { 1890*c97d6d2cSSergio Andres Gomez Del Real decode->addressing_size = 4; 1891*c97d6d2cSSergio Andres Gomez Del Real } else { 1892*c97d6d2cSSergio Andres Gomez Del Real decode->addressing_size = 2; 1893*c97d6d2cSSergio Andres Gomez Del Real } 1894*c97d6d2cSSergio Andres Gomez Del Real } else if (!x86_is_long_mode(ENV_GET_CPU(env))) { 1895*c97d6d2cSSergio Andres Gomez Del Real /* protected */ 1896*c97d6d2cSSergio Andres Gomez Del Real struct vmx_segment cs; 1897*c97d6d2cSSergio Andres Gomez Del Real vmx_read_segment_descriptor(ENV_GET_CPU(env), &cs, REG_SEG_CS); 1898*c97d6d2cSSergio Andres Gomez Del Real /* check db */ 1899*c97d6d2cSSergio Andres Gomez Del Real if ((cs.ar >> 14) & 1) { 1900*c97d6d2cSSergio Andres Gomez Del Real if (decode->addr_size_override) { 1901*c97d6d2cSSergio Andres Gomez Del Real decode->addressing_size = 2; 1902*c97d6d2cSSergio Andres Gomez Del Real } else { 1903*c97d6d2cSSergio Andres Gomez Del Real decode->addressing_size = 4; 1904*c97d6d2cSSergio Andres Gomez Del Real } 1905*c97d6d2cSSergio Andres Gomez Del Real } else { 1906*c97d6d2cSSergio Andres Gomez Del Real if (decode->addr_size_override) { 1907*c97d6d2cSSergio Andres Gomez Del Real decode->addressing_size = 4; 1908*c97d6d2cSSergio Andres Gomez Del Real } else { 1909*c97d6d2cSSergio Andres Gomez Del Real decode->addressing_size = 2; 1910*c97d6d2cSSergio Andres Gomez Del Real } 1911*c97d6d2cSSergio Andres Gomez Del Real } 1912*c97d6d2cSSergio Andres Gomez Del Real } else { 1913*c97d6d2cSSergio Andres Gomez Del Real /* long */ 1914*c97d6d2cSSergio Andres Gomez Del Real if (decode->addr_size_override) { 1915*c97d6d2cSSergio Andres Gomez Del Real decode->addressing_size = 4; 1916*c97d6d2cSSergio Andres Gomez Del Real } else { 1917*c97d6d2cSSergio Andres Gomez Del Real decode->addressing_size = 8; 1918*c97d6d2cSSergio Andres Gomez Del Real } 1919*c97d6d2cSSergio Andres Gomez Del Real } 1920*c97d6d2cSSergio Andres Gomez Del Real } 1921*c97d6d2cSSergio Andres Gomez Del Real 1922*c97d6d2cSSergio Andres Gomez Del Real void set_operand_size(CPUX86State *env, struct x86_decode *decode) 1923*c97d6d2cSSergio Andres Gomez Del Real { 1924*c97d6d2cSSergio Andres Gomez Del Real decode->operand_size = -1; 1925*c97d6d2cSSergio Andres Gomez Del Real if (x86_is_real(ENV_GET_CPU(env)) || x86_is_v8086(ENV_GET_CPU(env))) { 1926*c97d6d2cSSergio Andres Gomez Del Real if (decode->op_size_override) { 1927*c97d6d2cSSergio Andres Gomez Del Real decode->operand_size = 4; 1928*c97d6d2cSSergio Andres Gomez Del Real } else { 1929*c97d6d2cSSergio Andres Gomez Del Real decode->operand_size = 2; 1930*c97d6d2cSSergio Andres Gomez Del Real } 1931*c97d6d2cSSergio Andres Gomez Del Real } else if (!x86_is_long_mode(ENV_GET_CPU(env))) { 1932*c97d6d2cSSergio Andres Gomez Del Real /* protected */ 1933*c97d6d2cSSergio Andres Gomez Del Real struct vmx_segment cs; 1934*c97d6d2cSSergio Andres Gomez Del Real vmx_read_segment_descriptor(ENV_GET_CPU(env), &cs, REG_SEG_CS); 1935*c97d6d2cSSergio Andres Gomez Del Real /* check db */ 1936*c97d6d2cSSergio Andres Gomez Del Real if ((cs.ar >> 14) & 1) { 1937*c97d6d2cSSergio Andres Gomez Del Real if (decode->op_size_override) { 1938*c97d6d2cSSergio Andres Gomez Del Real decode->operand_size = 2; 1939*c97d6d2cSSergio Andres Gomez Del Real } else{ 1940*c97d6d2cSSergio Andres Gomez Del Real decode->operand_size = 4; 1941*c97d6d2cSSergio Andres Gomez Del Real } 1942*c97d6d2cSSergio Andres Gomez Del Real } else { 1943*c97d6d2cSSergio Andres Gomez Del Real if (decode->op_size_override) { 1944*c97d6d2cSSergio Andres Gomez Del Real decode->operand_size = 4; 1945*c97d6d2cSSergio Andres Gomez Del Real } else { 1946*c97d6d2cSSergio Andres Gomez Del Real decode->operand_size = 2; 1947*c97d6d2cSSergio Andres Gomez Del Real } 1948*c97d6d2cSSergio Andres Gomez Del Real } 1949*c97d6d2cSSergio Andres Gomez Del Real } else { 1950*c97d6d2cSSergio Andres Gomez Del Real /* long */ 1951*c97d6d2cSSergio Andres Gomez Del Real if (decode->op_size_override) { 1952*c97d6d2cSSergio Andres Gomez Del Real decode->operand_size = 2; 1953*c97d6d2cSSergio Andres Gomez Del Real } else { 1954*c97d6d2cSSergio Andres Gomez Del Real decode->operand_size = 4; 1955*c97d6d2cSSergio Andres Gomez Del Real } 1956*c97d6d2cSSergio Andres Gomez Del Real 1957*c97d6d2cSSergio Andres Gomez Del Real if (decode->rex.w) { 1958*c97d6d2cSSergio Andres Gomez Del Real decode->operand_size = 8; 1959*c97d6d2cSSergio Andres Gomez Del Real } 1960*c97d6d2cSSergio Andres Gomez Del Real } 1961*c97d6d2cSSergio Andres Gomez Del Real } 1962*c97d6d2cSSergio Andres Gomez Del Real 1963*c97d6d2cSSergio Andres Gomez Del Real static void decode_sib(CPUX86State *env, struct x86_decode *decode) 1964*c97d6d2cSSergio Andres Gomez Del Real { 1965*c97d6d2cSSergio Andres Gomez Del Real if ((decode->modrm.mod != 3) && (4 == decode->modrm.rm) && 1966*c97d6d2cSSergio Andres Gomez Del Real (decode->addressing_size != 2)) { 1967*c97d6d2cSSergio Andres Gomez Del Real decode->sib.sib = decode_byte(env, decode); 1968*c97d6d2cSSergio Andres Gomez Del Real decode->sib_present = true; 1969*c97d6d2cSSergio Andres Gomez Del Real } 1970*c97d6d2cSSergio Andres Gomez Del Real } 1971*c97d6d2cSSergio Andres Gomez Del Real 1972*c97d6d2cSSergio Andres Gomez Del Real /* 16 bit modrm */ 1973*c97d6d2cSSergio Andres Gomez Del Real int disp16_tbl[4][8] = { 1974*c97d6d2cSSergio Andres Gomez Del Real {0, 0, 0, 0, 0, 0, 2, 0}, 1975*c97d6d2cSSergio Andres Gomez Del Real {1, 1, 1, 1, 1, 1, 1, 1}, 1976*c97d6d2cSSergio Andres Gomez Del Real {2, 2, 2, 2, 2, 2, 2, 2}, 1977*c97d6d2cSSergio Andres Gomez Del Real {0, 0, 0, 0, 0, 0, 0, 0} 1978*c97d6d2cSSergio Andres Gomez Del Real }; 1979*c97d6d2cSSergio Andres Gomez Del Real 1980*c97d6d2cSSergio Andres Gomez Del Real /* 32/64-bit modrm */ 1981*c97d6d2cSSergio Andres Gomez Del Real int disp32_tbl[4][8] = { 1982*c97d6d2cSSergio Andres Gomez Del Real {0, 0, 0, 0, -1, 4, 0, 0}, 1983*c97d6d2cSSergio Andres Gomez Del Real {1, 1, 1, 1, 1, 1, 1, 1}, 1984*c97d6d2cSSergio Andres Gomez Del Real {4, 4, 4, 4, 4, 4, 4, 4}, 1985*c97d6d2cSSergio Andres Gomez Del Real {0, 0, 0, 0, 0, 0, 0, 0} 1986*c97d6d2cSSergio Andres Gomez Del Real }; 1987*c97d6d2cSSergio Andres Gomez Del Real 1988*c97d6d2cSSergio Andres Gomez Del Real static inline void decode_displacement(CPUX86State *env, struct x86_decode *decode) 1989*c97d6d2cSSergio Andres Gomez Del Real { 1990*c97d6d2cSSergio Andres Gomez Del Real int addressing_size = decode->addressing_size; 1991*c97d6d2cSSergio Andres Gomez Del Real int mod = decode->modrm.mod; 1992*c97d6d2cSSergio Andres Gomez Del Real int rm = decode->modrm.rm; 1993*c97d6d2cSSergio Andres Gomez Del Real 1994*c97d6d2cSSergio Andres Gomez Del Real decode->displacement_size = 0; 1995*c97d6d2cSSergio Andres Gomez Del Real switch (addressing_size) { 1996*c97d6d2cSSergio Andres Gomez Del Real case 2: 1997*c97d6d2cSSergio Andres Gomez Del Real decode->displacement_size = disp16_tbl[mod][rm]; 1998*c97d6d2cSSergio Andres Gomez Del Real if (decode->displacement_size) { 1999*c97d6d2cSSergio Andres Gomez Del Real decode->displacement = (uint16_t)decode_bytes(env, decode, 2000*c97d6d2cSSergio Andres Gomez Del Real decode->displacement_size); 2001*c97d6d2cSSergio Andres Gomez Del Real } 2002*c97d6d2cSSergio Andres Gomez Del Real break; 2003*c97d6d2cSSergio Andres Gomez Del Real case 4: 2004*c97d6d2cSSergio Andres Gomez Del Real case 8: 2005*c97d6d2cSSergio Andres Gomez Del Real if (-1 == disp32_tbl[mod][rm]) { 2006*c97d6d2cSSergio Andres Gomez Del Real if (5 == decode->sib.base) { 2007*c97d6d2cSSergio Andres Gomez Del Real decode->displacement_size = 4; 2008*c97d6d2cSSergio Andres Gomez Del Real } 2009*c97d6d2cSSergio Andres Gomez Del Real } else { 2010*c97d6d2cSSergio Andres Gomez Del Real decode->displacement_size = disp32_tbl[mod][rm]; 2011*c97d6d2cSSergio Andres Gomez Del Real } 2012*c97d6d2cSSergio Andres Gomez Del Real 2013*c97d6d2cSSergio Andres Gomez Del Real if (decode->displacement_size) { 2014*c97d6d2cSSergio Andres Gomez Del Real decode->displacement = (uint32_t)decode_bytes(env, decode, 2015*c97d6d2cSSergio Andres Gomez Del Real decode->displacement_size); 2016*c97d6d2cSSergio Andres Gomez Del Real } 2017*c97d6d2cSSergio Andres Gomez Del Real break; 2018*c97d6d2cSSergio Andres Gomez Del Real } 2019*c97d6d2cSSergio Andres Gomez Del Real } 2020*c97d6d2cSSergio Andres Gomez Del Real 2021*c97d6d2cSSergio Andres Gomez Del Real static inline void decode_modrm(CPUX86State *env, struct x86_decode *decode) 2022*c97d6d2cSSergio Andres Gomez Del Real { 2023*c97d6d2cSSergio Andres Gomez Del Real decode->modrm.modrm = decode_byte(env, decode); 2024*c97d6d2cSSergio Andres Gomez Del Real decode->is_modrm = true; 2025*c97d6d2cSSergio Andres Gomez Del Real 2026*c97d6d2cSSergio Andres Gomez Del Real decode_sib(env, decode); 2027*c97d6d2cSSergio Andres Gomez Del Real decode_displacement(env, decode); 2028*c97d6d2cSSergio Andres Gomez Del Real } 2029*c97d6d2cSSergio Andres Gomez Del Real 2030*c97d6d2cSSergio Andres Gomez Del Real static inline void decode_opcode_general(CPUX86State *env, 2031*c97d6d2cSSergio Andres Gomez Del Real struct x86_decode *decode, 2032*c97d6d2cSSergio Andres Gomez Del Real uint8_t opcode, 2033*c97d6d2cSSergio Andres Gomez Del Real struct decode_tbl *inst_decoder) 2034*c97d6d2cSSergio Andres Gomez Del Real { 2035*c97d6d2cSSergio Andres Gomez Del Real decode->cmd = inst_decoder->cmd; 2036*c97d6d2cSSergio Andres Gomez Del Real if (inst_decoder->operand_size) { 2037*c97d6d2cSSergio Andres Gomez Del Real decode->operand_size = inst_decoder->operand_size; 2038*c97d6d2cSSergio Andres Gomez Del Real } 2039*c97d6d2cSSergio Andres Gomez Del Real decode->flags_mask = inst_decoder->flags_mask; 2040*c97d6d2cSSergio Andres Gomez Del Real 2041*c97d6d2cSSergio Andres Gomez Del Real if (inst_decoder->is_modrm) { 2042*c97d6d2cSSergio Andres Gomez Del Real decode_modrm(env, decode); 2043*c97d6d2cSSergio Andres Gomez Del Real } 2044*c97d6d2cSSergio Andres Gomez Del Real if (inst_decoder->decode_op1) { 2045*c97d6d2cSSergio Andres Gomez Del Real inst_decoder->decode_op1(env, decode, &decode->op[0]); 2046*c97d6d2cSSergio Andres Gomez Del Real } 2047*c97d6d2cSSergio Andres Gomez Del Real if (inst_decoder->decode_op2) { 2048*c97d6d2cSSergio Andres Gomez Del Real inst_decoder->decode_op2(env, decode, &decode->op[1]); 2049*c97d6d2cSSergio Andres Gomez Del Real } 2050*c97d6d2cSSergio Andres Gomez Del Real if (inst_decoder->decode_op3) { 2051*c97d6d2cSSergio Andres Gomez Del Real inst_decoder->decode_op3(env, decode, &decode->op[2]); 2052*c97d6d2cSSergio Andres Gomez Del Real } 2053*c97d6d2cSSergio Andres Gomez Del Real if (inst_decoder->decode_op4) { 2054*c97d6d2cSSergio Andres Gomez Del Real inst_decoder->decode_op4(env, decode, &decode->op[3]); 2055*c97d6d2cSSergio Andres Gomez Del Real } 2056*c97d6d2cSSergio Andres Gomez Del Real if (inst_decoder->decode_postfix) { 2057*c97d6d2cSSergio Andres Gomez Del Real inst_decoder->decode_postfix(env, decode); 2058*c97d6d2cSSergio Andres Gomez Del Real } 2059*c97d6d2cSSergio Andres Gomez Del Real } 2060*c97d6d2cSSergio Andres Gomez Del Real 2061*c97d6d2cSSergio Andres Gomez Del Real static inline void decode_opcode_1(CPUX86State *env, struct x86_decode *decode, 2062*c97d6d2cSSergio Andres Gomez Del Real uint8_t opcode) 2063*c97d6d2cSSergio Andres Gomez Del Real { 2064*c97d6d2cSSergio Andres Gomez Del Real struct decode_tbl *inst_decoder = &_decode_tbl1[opcode]; 2065*c97d6d2cSSergio Andres Gomez Del Real decode_opcode_general(env, decode, opcode, inst_decoder); 2066*c97d6d2cSSergio Andres Gomez Del Real } 2067*c97d6d2cSSergio Andres Gomez Del Real 2068*c97d6d2cSSergio Andres Gomez Del Real 2069*c97d6d2cSSergio Andres Gomez Del Real static inline void decode_opcode_2(CPUX86State *env, struct x86_decode *decode, 2070*c97d6d2cSSergio Andres Gomez Del Real uint8_t opcode) 2071*c97d6d2cSSergio Andres Gomez Del Real { 2072*c97d6d2cSSergio Andres Gomez Del Real struct decode_tbl *inst_decoder = &_decode_tbl2[opcode]; 2073*c97d6d2cSSergio Andres Gomez Del Real decode_opcode_general(env, decode, opcode, inst_decoder); 2074*c97d6d2cSSergio Andres Gomez Del Real } 2075*c97d6d2cSSergio Andres Gomez Del Real 2076*c97d6d2cSSergio Andres Gomez Del Real static void decode_opcodes(CPUX86State *env, struct x86_decode *decode) 2077*c97d6d2cSSergio Andres Gomez Del Real { 2078*c97d6d2cSSergio Andres Gomez Del Real uint8_t opcode; 2079*c97d6d2cSSergio Andres Gomez Del Real 2080*c97d6d2cSSergio Andres Gomez Del Real opcode = decode_byte(env, decode); 2081*c97d6d2cSSergio Andres Gomez Del Real decode->opcode[decode->opcode_len++] = opcode; 2082*c97d6d2cSSergio Andres Gomez Del Real if (opcode != OPCODE_ESCAPE) { 2083*c97d6d2cSSergio Andres Gomez Del Real decode_opcode_1(env, decode, opcode); 2084*c97d6d2cSSergio Andres Gomez Del Real } else { 2085*c97d6d2cSSergio Andres Gomez Del Real opcode = decode_byte(env, decode); 2086*c97d6d2cSSergio Andres Gomez Del Real decode->opcode[decode->opcode_len++] = opcode; 2087*c97d6d2cSSergio Andres Gomez Del Real decode_opcode_2(env, decode, opcode); 2088*c97d6d2cSSergio Andres Gomez Del Real } 2089*c97d6d2cSSergio Andres Gomez Del Real } 2090*c97d6d2cSSergio Andres Gomez Del Real 2091*c97d6d2cSSergio Andres Gomez Del Real uint32_t decode_instruction(CPUX86State *env, struct x86_decode *decode) 2092*c97d6d2cSSergio Andres Gomez Del Real { 2093*c97d6d2cSSergio Andres Gomez Del Real ZERO_INIT(*decode); 2094*c97d6d2cSSergio Andres Gomez Del Real 2095*c97d6d2cSSergio Andres Gomez Del Real decode_prefix(env, decode); 2096*c97d6d2cSSergio Andres Gomez Del Real set_addressing_size(env, decode); 2097*c97d6d2cSSergio Andres Gomez Del Real set_operand_size(env, decode); 2098*c97d6d2cSSergio Andres Gomez Del Real 2099*c97d6d2cSSergio Andres Gomez Del Real decode_opcodes(env, decode); 2100*c97d6d2cSSergio Andres Gomez Del Real 2101*c97d6d2cSSergio Andres Gomez Del Real return decode->len; 2102*c97d6d2cSSergio Andres Gomez Del Real } 2103*c97d6d2cSSergio Andres Gomez Del Real 2104*c97d6d2cSSergio Andres Gomez Del Real void init_decoder() 2105*c97d6d2cSSergio Andres Gomez Del Real { 2106*c97d6d2cSSergio Andres Gomez Del Real int i; 2107*c97d6d2cSSergio Andres Gomez Del Real 2108*c97d6d2cSSergio Andres Gomez Del Real for (i = 0; i < ARRAY_SIZE(_decode_tbl2); i++) { 2109*c97d6d2cSSergio Andres Gomez Del Real memcpy(_decode_tbl1, &invl_inst, sizeof(invl_inst)); 2110*c97d6d2cSSergio Andres Gomez Del Real } 2111*c97d6d2cSSergio Andres Gomez Del Real for (i = 0; i < ARRAY_SIZE(_decode_tbl2); i++) { 2112*c97d6d2cSSergio Andres Gomez Del Real memcpy(_decode_tbl2, &invl_inst, sizeof(invl_inst)); 2113*c97d6d2cSSergio Andres Gomez Del Real } 2114*c97d6d2cSSergio Andres Gomez Del Real for (i = 0; i < ARRAY_SIZE(_decode_tbl3); i++) { 2115*c97d6d2cSSergio Andres Gomez Del Real memcpy(_decode_tbl3, &invl_inst, sizeof(invl_inst_x87)); 2116*c97d6d2cSSergio Andres Gomez Del Real 2117*c97d6d2cSSergio Andres Gomez Del Real } 2118*c97d6d2cSSergio Andres Gomez Del Real for (i = 0; i < ARRAY_SIZE(_1op_inst); i++) { 2119*c97d6d2cSSergio Andres Gomez Del Real _decode_tbl1[_1op_inst[i].opcode] = _1op_inst[i]; 2120*c97d6d2cSSergio Andres Gomez Del Real } 2121*c97d6d2cSSergio Andres Gomez Del Real for (i = 0; i < ARRAY_SIZE(_2op_inst); i++) { 2122*c97d6d2cSSergio Andres Gomez Del Real _decode_tbl2[_2op_inst[i].opcode] = _2op_inst[i]; 2123*c97d6d2cSSergio Andres Gomez Del Real } 2124*c97d6d2cSSergio Andres Gomez Del Real for (i = 0; i < ARRAY_SIZE(_x87_inst); i++) { 2125*c97d6d2cSSergio Andres Gomez Del Real int index = ((_x87_inst[i].opcode & 0xf) << 4) | 2126*c97d6d2cSSergio Andres Gomez Del Real ((_x87_inst[i].modrm_mod & 1) << 3) | 2127*c97d6d2cSSergio Andres Gomez Del Real _x87_inst[i].modrm_reg; 2128*c97d6d2cSSergio Andres Gomez Del Real _decode_tbl3[index] = _x87_inst[i]; 2129*c97d6d2cSSergio Andres Gomez Del Real } 2130*c97d6d2cSSergio Andres Gomez Del Real } 2131*c97d6d2cSSergio Andres Gomez Del Real 2132*c97d6d2cSSergio Andres Gomez Del Real 2133*c97d6d2cSSergio Andres Gomez Del Real const char *decode_cmd_to_string(enum x86_decode_cmd cmd) 2134*c97d6d2cSSergio Andres Gomez Del Real { 2135*c97d6d2cSSergio Andres Gomez Del Real static const char *cmds[] = {"INVL", "PUSH", "PUSH_SEG", "POP", "POP_SEG", 2136*c97d6d2cSSergio Andres Gomez Del Real "MOV", "MOVSX", "MOVZX", "CALL_NEAR", "CALL_NEAR_ABS_INDIRECT", 2137*c97d6d2cSSergio Andres Gomez Del Real "CALL_FAR_ABS_INDIRECT", "CMD_CALL_FAR", "RET_NEAR", "RET_FAR", "ADD", 2138*c97d6d2cSSergio Andres Gomez Del Real "OR", "ADC", "SBB", "AND", "SUB", "XOR", "CMP", "INC", "DEC", "TST", 2139*c97d6d2cSSergio Andres Gomez Del Real "NOT", "NEG", "JMP_NEAR", "JMP_NEAR_ABS_INDIRECT", "JMP_FAR", 2140*c97d6d2cSSergio Andres Gomez Del Real "JMP_FAR_ABS_INDIRECT", "LEA", "JXX", "JCXZ", "SETXX", "MOV_TO_SEG", 2141*c97d6d2cSSergio Andres Gomez Del Real "MOV_FROM_SEG", "CLI", "STI", "CLD", "STD", "STC", "CLC", "OUT", "IN", 2142*c97d6d2cSSergio Andres Gomez Del Real "INS", "OUTS", "LIDT", "SIDT", "LGDT", "SGDT", "SMSW", "LMSW", 2143*c97d6d2cSSergio Andres Gomez Del Real "RDTSCP", "INVLPG", "MOV_TO_CR", "MOV_FROM_CR", "MOV_TO_DR", 2144*c97d6d2cSSergio Andres Gomez Del Real "MOV_FROM_DR", "PUSHF", "POPF", "CPUID", "ROL", "ROR", "RCL", "RCR", 2145*c97d6d2cSSergio Andres Gomez Del Real "SHL", "SAL", "SHR", "SHRD", "SHLD", "SAR", "DIV", "IDIV", "MUL", 2146*c97d6d2cSSergio Andres Gomez Del Real "IMUL_3", "IMUL_2", "IMUL_1", "MOVS", "CMPS", "SCAS", "LODS", "STOS", 2147*c97d6d2cSSergio Andres Gomez Del Real "BSWAP", "XCHG", "RDTSC", "RDMSR", "WRMSR", "ENTER", "LEAVE", "BT", 2148*c97d6d2cSSergio Andres Gomez Del Real "BTS", "BTC", "BTR", "BSF", "BSR", "IRET", "INT", "POPA", "PUSHA", 2149*c97d6d2cSSergio Andres Gomez Del Real "CWD", "CBW", "DAS", "AAD", "AAM", "AAS", "LOOP", "SLDT", "STR", "LLDT", 2150*c97d6d2cSSergio Andres Gomez Del Real "LTR", "VERR", "VERW", "SAHF", "LAHF", "WBINVD", "LDS", "LSS", "LES", 2151*c97d6d2cSSergio Andres Gomez Del Real "LGS", "LFS", "CMC", "XLAT", "NOP", "CMOV", "CLTS", "XADD", "HLT", 2152*c97d6d2cSSergio Andres Gomez Del Real "CMPXCHG8B", "CMPXCHG", "POPCNT", "FNINIT", "FLD", "FLDxx", "FNSTCW", 2153*c97d6d2cSSergio Andres Gomez Del Real "FNSTSW", "FNSETPM", "FSAVE", "FRSTOR", "FXSAVE", "FXRSTOR", "FDIV", 2154*c97d6d2cSSergio Andres Gomez Del Real "FMUL", "FSUB", "FADD", "EMMS", "MFENCE", "SFENCE", "LFENCE", 2155*c97d6d2cSSergio Andres Gomez Del Real "PREFETCH", "FST", "FABS", "FUCOM", "FUCOMI", "FLDCW", 2156*c97d6d2cSSergio Andres Gomez Del Real "FXCH", "FCHS", "FCMOV", "FRNDINT", "FXAM", "LAST"}; 2157*c97d6d2cSSergio Andres Gomez Del Real return cmds[cmd]; 2158*c97d6d2cSSergio Andres Gomez Del Real } 2159*c97d6d2cSSergio Andres Gomez Del Real 2160*c97d6d2cSSergio Andres Gomez Del Real addr_t decode_linear_addr(CPUX86State *env, struct x86_decode *decode, 2161*c97d6d2cSSergio Andres Gomez Del Real addr_t addr, x86_reg_segment seg) 2162*c97d6d2cSSergio Andres Gomez Del Real { 2163*c97d6d2cSSergio Andres Gomez Del Real switch (decode->segment_override) { 2164*c97d6d2cSSergio Andres Gomez Del Real case PREFIX_CS_SEG_OVEERIDE: 2165*c97d6d2cSSergio Andres Gomez Del Real seg = REG_SEG_CS; 2166*c97d6d2cSSergio Andres Gomez Del Real break; 2167*c97d6d2cSSergio Andres Gomez Del Real case PREFIX_SS_SEG_OVEERIDE: 2168*c97d6d2cSSergio Andres Gomez Del Real seg = REG_SEG_SS; 2169*c97d6d2cSSergio Andres Gomez Del Real break; 2170*c97d6d2cSSergio Andres Gomez Del Real case PREFIX_DS_SEG_OVEERIDE: 2171*c97d6d2cSSergio Andres Gomez Del Real seg = REG_SEG_DS; 2172*c97d6d2cSSergio Andres Gomez Del Real break; 2173*c97d6d2cSSergio Andres Gomez Del Real case PREFIX_ES_SEG_OVEERIDE: 2174*c97d6d2cSSergio Andres Gomez Del Real seg = REG_SEG_ES; 2175*c97d6d2cSSergio Andres Gomez Del Real break; 2176*c97d6d2cSSergio Andres Gomez Del Real case PREFIX_FS_SEG_OVEERIDE: 2177*c97d6d2cSSergio Andres Gomez Del Real seg = REG_SEG_FS; 2178*c97d6d2cSSergio Andres Gomez Del Real break; 2179*c97d6d2cSSergio Andres Gomez Del Real case PREFIX_GS_SEG_OVEERIDE: 2180*c97d6d2cSSergio Andres Gomez Del Real seg = REG_SEG_GS; 2181*c97d6d2cSSergio Andres Gomez Del Real break; 2182*c97d6d2cSSergio Andres Gomez Del Real default: 2183*c97d6d2cSSergio Andres Gomez Del Real break; 2184*c97d6d2cSSergio Andres Gomez Del Real } 2185*c97d6d2cSSergio Andres Gomez Del Real return linear_addr_size(ENV_GET_CPU(env), addr, decode->addressing_size, seg); 2186*c97d6d2cSSergio Andres Gomez Del Real } 2187