1*ece92f85SJason Jin /**************************************************************************** 2*ece92f85SJason Jin * 3*ece92f85SJason Jin * Realmode X86 Emulator Library 4*ece92f85SJason Jin * 5*ece92f85SJason Jin * Copyright (C) 2007 Freescale Semiconductor, Inc. All rights reserved. 6*ece92f85SJason Jin * Jason Jin <Jason.jin@freescale.com> 7*ece92f85SJason Jin * 8*ece92f85SJason Jin * Copyright (C) 1991-2004 SciTech Software, Inc. 9*ece92f85SJason Jin * Copyright (C) David Mosberger-Tang 10*ece92f85SJason Jin * Copyright (C) 1999 Egbert Eich 11*ece92f85SJason Jin * 12*ece92f85SJason Jin * ======================================================================== 13*ece92f85SJason Jin * 14*ece92f85SJason Jin * Permission to use, copy, modify, distribute, and sell this software and 15*ece92f85SJason Jin * its documentation for any purpose is hereby granted without fee, 16*ece92f85SJason Jin * provided that the above copyright notice appear in all copies and that 17*ece92f85SJason Jin * both that copyright notice and this permission notice appear in 18*ece92f85SJason Jin * supporting documentation, and that the name of the authors not be used 19*ece92f85SJason Jin * in advertising or publicity pertaining to distribution of the software 20*ece92f85SJason Jin * without specific, written prior permission. The authors makes no 21*ece92f85SJason Jin * representations about the suitability of this software for any purpose. 22*ece92f85SJason Jin * It is provided "as is" without express or implied warranty. 23*ece92f85SJason Jin * 24*ece92f85SJason Jin * THE AUTHORS DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, 25*ece92f85SJason Jin * INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO 26*ece92f85SJason Jin * EVENT SHALL THE AUTHORS BE LIABLE FOR ANY SPECIAL, INDIRECT OR 27*ece92f85SJason Jin * CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF 28*ece92f85SJason Jin * USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR 29*ece92f85SJason Jin * OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR 30*ece92f85SJason Jin * PERFORMANCE OF THIS SOFTWARE. 31*ece92f85SJason Jin * 32*ece92f85SJason Jin * ======================================================================== 33*ece92f85SJason Jin * 34*ece92f85SJason Jin * Language: ANSI C 35*ece92f85SJason Jin * Environment: Any 36*ece92f85SJason Jin * Developer: Kendall Bennett 37*ece92f85SJason Jin * 38*ece92f85SJason Jin * Description: This file includes subroutines to implement the decoding 39*ece92f85SJason Jin * and emulation of all the x86 extended two-byte processor 40*ece92f85SJason Jin * instructions. 41*ece92f85SJason Jin * 42*ece92f85SJason Jin * Jason port this file to u-boot. Put the function pointer into 43*ece92f85SJason Jin * got2 sector. 44*ece92f85SJason Jin * 45*ece92f85SJason Jin ****************************************************************************/ 46*ece92f85SJason Jin 47*ece92f85SJason Jin #include "x86emu/x86emui.h" 48*ece92f85SJason Jin 49*ece92f85SJason Jin /*----------------------------- Implementation ----------------------------*/ 50*ece92f85SJason Jin 51*ece92f85SJason Jin /**************************************************************************** 52*ece92f85SJason Jin PARAMETERS: 53*ece92f85SJason Jin op1 - Instruction op code 54*ece92f85SJason Jin 55*ece92f85SJason Jin REMARKS: 56*ece92f85SJason Jin Handles illegal opcodes. 57*ece92f85SJason Jin ****************************************************************************/ 58*ece92f85SJason Jin void x86emuOp2_illegal_op( 59*ece92f85SJason Jin u8 op2) 60*ece92f85SJason Jin { 61*ece92f85SJason Jin START_OF_INSTR(); 62*ece92f85SJason Jin DECODE_PRINTF("ILLEGAL EXTENDED X86 OPCODE\n"); 63*ece92f85SJason Jin TRACE_REGS(); 64*ece92f85SJason Jin printk("%04x:%04x: %02X ILLEGAL EXTENDED X86 OPCODE!\n", 65*ece92f85SJason Jin M.x86.R_CS, M.x86.R_IP-2,op2); 66*ece92f85SJason Jin HALT_SYS(); 67*ece92f85SJason Jin END_OF_INSTR(); 68*ece92f85SJason Jin } 69*ece92f85SJason Jin 70*ece92f85SJason Jin #define xorl(a,b) ((a) && !(b)) || (!(a) && (b)) 71*ece92f85SJason Jin 72*ece92f85SJason Jin /**************************************************************************** 73*ece92f85SJason Jin REMARKS: 74*ece92f85SJason Jin Handles opcode 0x0f,0x80-0x8F 75*ece92f85SJason Jin ****************************************************************************/ 76*ece92f85SJason Jin int x86emu_check_jump_condition(u8 op) 77*ece92f85SJason Jin { 78*ece92f85SJason Jin switch (op) { 79*ece92f85SJason Jin case 0x0: 80*ece92f85SJason Jin DECODE_PRINTF("JO\t"); 81*ece92f85SJason Jin return ACCESS_FLAG(F_OF); 82*ece92f85SJason Jin case 0x1: 83*ece92f85SJason Jin DECODE_PRINTF("JNO\t"); 84*ece92f85SJason Jin return !ACCESS_FLAG(F_OF); 85*ece92f85SJason Jin break; 86*ece92f85SJason Jin case 0x2: 87*ece92f85SJason Jin DECODE_PRINTF("JB\t"); 88*ece92f85SJason Jin return ACCESS_FLAG(F_CF); 89*ece92f85SJason Jin break; 90*ece92f85SJason Jin case 0x3: 91*ece92f85SJason Jin DECODE_PRINTF("JNB\t"); 92*ece92f85SJason Jin return !ACCESS_FLAG(F_CF); 93*ece92f85SJason Jin break; 94*ece92f85SJason Jin case 0x4: 95*ece92f85SJason Jin DECODE_PRINTF("JZ\t"); 96*ece92f85SJason Jin return ACCESS_FLAG(F_ZF); 97*ece92f85SJason Jin break; 98*ece92f85SJason Jin case 0x5: 99*ece92f85SJason Jin DECODE_PRINTF("JNZ\t"); 100*ece92f85SJason Jin return !ACCESS_FLAG(F_ZF); 101*ece92f85SJason Jin break; 102*ece92f85SJason Jin case 0x6: 103*ece92f85SJason Jin DECODE_PRINTF("JBE\t"); 104*ece92f85SJason Jin return ACCESS_FLAG(F_CF) || ACCESS_FLAG(F_ZF); 105*ece92f85SJason Jin break; 106*ece92f85SJason Jin case 0x7: 107*ece92f85SJason Jin DECODE_PRINTF("JNBE\t"); 108*ece92f85SJason Jin return !(ACCESS_FLAG(F_CF) || ACCESS_FLAG(F_ZF)); 109*ece92f85SJason Jin break; 110*ece92f85SJason Jin case 0x8: 111*ece92f85SJason Jin DECODE_PRINTF("JS\t"); 112*ece92f85SJason Jin return ACCESS_FLAG(F_SF); 113*ece92f85SJason Jin break; 114*ece92f85SJason Jin case 0x9: 115*ece92f85SJason Jin DECODE_PRINTF("JNS\t"); 116*ece92f85SJason Jin return !ACCESS_FLAG(F_SF); 117*ece92f85SJason Jin break; 118*ece92f85SJason Jin case 0xa: 119*ece92f85SJason Jin DECODE_PRINTF("JP\t"); 120*ece92f85SJason Jin return ACCESS_FLAG(F_PF); 121*ece92f85SJason Jin break; 122*ece92f85SJason Jin case 0xb: 123*ece92f85SJason Jin DECODE_PRINTF("JNP\t"); 124*ece92f85SJason Jin return !ACCESS_FLAG(F_PF); 125*ece92f85SJason Jin break; 126*ece92f85SJason Jin case 0xc: 127*ece92f85SJason Jin DECODE_PRINTF("JL\t"); 128*ece92f85SJason Jin return xorl(ACCESS_FLAG(F_SF), ACCESS_FLAG(F_OF)); 129*ece92f85SJason Jin break; 130*ece92f85SJason Jin case 0xd: 131*ece92f85SJason Jin DECODE_PRINTF("JNL\t"); 132*ece92f85SJason Jin return !xorl(ACCESS_FLAG(F_SF), ACCESS_FLAG(F_OF)); 133*ece92f85SJason Jin break; 134*ece92f85SJason Jin case 0xe: 135*ece92f85SJason Jin DECODE_PRINTF("JLE\t"); 136*ece92f85SJason Jin return (xorl(ACCESS_FLAG(F_SF), ACCESS_FLAG(F_OF)) || 137*ece92f85SJason Jin ACCESS_FLAG(F_ZF)); 138*ece92f85SJason Jin break; 139*ece92f85SJason Jin default: 140*ece92f85SJason Jin DECODE_PRINTF("JNLE\t"); 141*ece92f85SJason Jin return !(xorl(ACCESS_FLAG(F_SF), ACCESS_FLAG(F_OF)) || 142*ece92f85SJason Jin ACCESS_FLAG(F_ZF)); 143*ece92f85SJason Jin } 144*ece92f85SJason Jin } 145*ece92f85SJason Jin 146*ece92f85SJason Jin void x86emuOp2_long_jump(u8 op2) 147*ece92f85SJason Jin { 148*ece92f85SJason Jin s32 target; 149*ece92f85SJason Jin int cond; 150*ece92f85SJason Jin 151*ece92f85SJason Jin /* conditional jump to word offset. */ 152*ece92f85SJason Jin START_OF_INSTR(); 153*ece92f85SJason Jin cond = x86emu_check_jump_condition(op2 & 0xF); 154*ece92f85SJason Jin target = (s16) fetch_word_imm(); 155*ece92f85SJason Jin target += (s16) M.x86.R_IP; 156*ece92f85SJason Jin DECODE_PRINTF2("%04x\n", target); 157*ece92f85SJason Jin TRACE_AND_STEP(); 158*ece92f85SJason Jin if (cond) 159*ece92f85SJason Jin M.x86.R_IP = (u16)target; 160*ece92f85SJason Jin DECODE_CLEAR_SEGOVR(); 161*ece92f85SJason Jin END_OF_INSTR(); 162*ece92f85SJason Jin } 163*ece92f85SJason Jin 164*ece92f85SJason Jin /**************************************************************************** 165*ece92f85SJason Jin REMARKS: 166*ece92f85SJason Jin Handles opcode 0x0f,0x90-0x9F 167*ece92f85SJason Jin ****************************************************************************/ 168*ece92f85SJason Jin void x86emuOp2_set_byte(u8 op2) 169*ece92f85SJason Jin { 170*ece92f85SJason Jin int mod, rl, rh; 171*ece92f85SJason Jin uint destoffset; 172*ece92f85SJason Jin u8 *destreg; 173*ece92f85SJason Jin char *name = 0; 174*ece92f85SJason Jin int cond = 0; 175*ece92f85SJason Jin 176*ece92f85SJason Jin START_OF_INSTR(); 177*ece92f85SJason Jin switch (op2) { 178*ece92f85SJason Jin case 0x90: 179*ece92f85SJason Jin name = "SETO\t"; 180*ece92f85SJason Jin cond = ACCESS_FLAG(F_OF); 181*ece92f85SJason Jin break; 182*ece92f85SJason Jin case 0x91: 183*ece92f85SJason Jin name = "SETNO\t"; 184*ece92f85SJason Jin cond = !ACCESS_FLAG(F_OF); 185*ece92f85SJason Jin break; 186*ece92f85SJason Jin case 0x92: 187*ece92f85SJason Jin name = "SETB\t"; 188*ece92f85SJason Jin cond = ACCESS_FLAG(F_CF); 189*ece92f85SJason Jin break; 190*ece92f85SJason Jin case 0x93: 191*ece92f85SJason Jin name = "SETNB\t"; 192*ece92f85SJason Jin cond = !ACCESS_FLAG(F_CF); 193*ece92f85SJason Jin break; 194*ece92f85SJason Jin case 0x94: 195*ece92f85SJason Jin name = "SETZ\t"; 196*ece92f85SJason Jin cond = ACCESS_FLAG(F_ZF); 197*ece92f85SJason Jin break; 198*ece92f85SJason Jin case 0x95: 199*ece92f85SJason Jin name = "SETNZ\t"; 200*ece92f85SJason Jin cond = !ACCESS_FLAG(F_ZF); 201*ece92f85SJason Jin break; 202*ece92f85SJason Jin case 0x96: 203*ece92f85SJason Jin name = "SETBE\t"; 204*ece92f85SJason Jin cond = ACCESS_FLAG(F_CF) || ACCESS_FLAG(F_ZF); 205*ece92f85SJason Jin break; 206*ece92f85SJason Jin case 0x97: 207*ece92f85SJason Jin name = "SETNBE\t"; 208*ece92f85SJason Jin cond = !(ACCESS_FLAG(F_CF) || ACCESS_FLAG(F_ZF)); 209*ece92f85SJason Jin break; 210*ece92f85SJason Jin case 0x98: 211*ece92f85SJason Jin name = "SETS\t"; 212*ece92f85SJason Jin cond = ACCESS_FLAG(F_SF); 213*ece92f85SJason Jin break; 214*ece92f85SJason Jin case 0x99: 215*ece92f85SJason Jin name = "SETNS\t"; 216*ece92f85SJason Jin cond = !ACCESS_FLAG(F_SF); 217*ece92f85SJason Jin break; 218*ece92f85SJason Jin case 0x9a: 219*ece92f85SJason Jin name = "SETP\t"; 220*ece92f85SJason Jin cond = ACCESS_FLAG(F_PF); 221*ece92f85SJason Jin break; 222*ece92f85SJason Jin case 0x9b: 223*ece92f85SJason Jin name = "SETNP\t"; 224*ece92f85SJason Jin cond = !ACCESS_FLAG(F_PF); 225*ece92f85SJason Jin break; 226*ece92f85SJason Jin case 0x9c: 227*ece92f85SJason Jin name = "SETL\t"; 228*ece92f85SJason Jin cond = xorl(ACCESS_FLAG(F_SF), ACCESS_FLAG(F_OF)); 229*ece92f85SJason Jin break; 230*ece92f85SJason Jin case 0x9d: 231*ece92f85SJason Jin name = "SETNL\t"; 232*ece92f85SJason Jin cond = !xorl(ACCESS_FLAG(F_SF), ACCESS_FLAG(F_OF)); 233*ece92f85SJason Jin break; 234*ece92f85SJason Jin case 0x9e: 235*ece92f85SJason Jin name = "SETLE\t"; 236*ece92f85SJason Jin cond = (xorl(ACCESS_FLAG(F_SF), ACCESS_FLAG(F_OF)) || 237*ece92f85SJason Jin ACCESS_FLAG(F_ZF)); 238*ece92f85SJason Jin break; 239*ece92f85SJason Jin case 0x9f: 240*ece92f85SJason Jin name = "SETNLE\t"; 241*ece92f85SJason Jin cond = !(xorl(ACCESS_FLAG(F_SF), ACCESS_FLAG(F_OF)) || 242*ece92f85SJason Jin ACCESS_FLAG(F_ZF)); 243*ece92f85SJason Jin break; 244*ece92f85SJason Jin } 245*ece92f85SJason Jin DECODE_PRINTF(name); 246*ece92f85SJason Jin FETCH_DECODE_MODRM(mod, rh, rl); 247*ece92f85SJason Jin if (mod < 3) { 248*ece92f85SJason Jin destoffset = decode_rmXX_address(mod, rl); 249*ece92f85SJason Jin TRACE_AND_STEP(); 250*ece92f85SJason Jin store_data_byte(destoffset, cond ? 0x01 : 0x00); 251*ece92f85SJason Jin } else { /* register to register */ 252*ece92f85SJason Jin destreg = DECODE_RM_BYTE_REGISTER(rl); 253*ece92f85SJason Jin TRACE_AND_STEP(); 254*ece92f85SJason Jin *destreg = cond ? 0x01 : 0x00; 255*ece92f85SJason Jin } 256*ece92f85SJason Jin DECODE_CLEAR_SEGOVR(); 257*ece92f85SJason Jin END_OF_INSTR(); 258*ece92f85SJason Jin } 259*ece92f85SJason Jin 260*ece92f85SJason Jin /**************************************************************************** 261*ece92f85SJason Jin REMARKS: 262*ece92f85SJason Jin Handles opcode 0x0f,0xa0 263*ece92f85SJason Jin ****************************************************************************/ 264*ece92f85SJason Jin void x86emuOp2_push_FS(u8 X86EMU_UNUSED(op2)) 265*ece92f85SJason Jin { 266*ece92f85SJason Jin START_OF_INSTR(); 267*ece92f85SJason Jin DECODE_PRINTF("PUSH\tFS\n"); 268*ece92f85SJason Jin TRACE_AND_STEP(); 269*ece92f85SJason Jin push_word(M.x86.R_FS); 270*ece92f85SJason Jin DECODE_CLEAR_SEGOVR(); 271*ece92f85SJason Jin END_OF_INSTR(); 272*ece92f85SJason Jin } 273*ece92f85SJason Jin 274*ece92f85SJason Jin /**************************************************************************** 275*ece92f85SJason Jin REMARKS: 276*ece92f85SJason Jin Handles opcode 0x0f,0xa1 277*ece92f85SJason Jin ****************************************************************************/ 278*ece92f85SJason Jin void x86emuOp2_pop_FS(u8 X86EMU_UNUSED(op2)) 279*ece92f85SJason Jin { 280*ece92f85SJason Jin START_OF_INSTR(); 281*ece92f85SJason Jin DECODE_PRINTF("POP\tFS\n"); 282*ece92f85SJason Jin TRACE_AND_STEP(); 283*ece92f85SJason Jin M.x86.R_FS = pop_word(); 284*ece92f85SJason Jin DECODE_CLEAR_SEGOVR(); 285*ece92f85SJason Jin END_OF_INSTR(); 286*ece92f85SJason Jin } 287*ece92f85SJason Jin 288*ece92f85SJason Jin /**************************************************************************** 289*ece92f85SJason Jin REMARKS: 290*ece92f85SJason Jin Handles opcode 0x0f,0xa3 291*ece92f85SJason Jin ****************************************************************************/ 292*ece92f85SJason Jin void x86emuOp2_bt_R(u8 X86EMU_UNUSED(op2)) 293*ece92f85SJason Jin { 294*ece92f85SJason Jin int mod, rl, rh; 295*ece92f85SJason Jin uint srcoffset; 296*ece92f85SJason Jin int bit,disp; 297*ece92f85SJason Jin 298*ece92f85SJason Jin START_OF_INSTR(); 299*ece92f85SJason Jin DECODE_PRINTF("BT\t"); 300*ece92f85SJason Jin FETCH_DECODE_MODRM(mod, rh, rl); 301*ece92f85SJason Jin if (mod < 3) { 302*ece92f85SJason Jin srcoffset = decode_rmXX_address(mod, rl); 303*ece92f85SJason Jin if (M.x86.mode & SYSMODE_PREFIX_DATA) { 304*ece92f85SJason Jin u32 srcval; 305*ece92f85SJason Jin u32 *shiftreg; 306*ece92f85SJason Jin 307*ece92f85SJason Jin DECODE_PRINTF(","); 308*ece92f85SJason Jin shiftreg = DECODE_RM_LONG_REGISTER(rh); 309*ece92f85SJason Jin TRACE_AND_STEP(); 310*ece92f85SJason Jin bit = *shiftreg & 0x1F; 311*ece92f85SJason Jin disp = (s16)*shiftreg >> 5; 312*ece92f85SJason Jin srcval = fetch_data_long(srcoffset+disp); 313*ece92f85SJason Jin CONDITIONAL_SET_FLAG(srcval & (0x1 << bit),F_CF); 314*ece92f85SJason Jin } else { 315*ece92f85SJason Jin u16 srcval; 316*ece92f85SJason Jin u16 *shiftreg; 317*ece92f85SJason Jin 318*ece92f85SJason Jin DECODE_PRINTF(","); 319*ece92f85SJason Jin shiftreg = DECODE_RM_WORD_REGISTER(rh); 320*ece92f85SJason Jin TRACE_AND_STEP(); 321*ece92f85SJason Jin bit = *shiftreg & 0xF; 322*ece92f85SJason Jin disp = (s16)*shiftreg >> 4; 323*ece92f85SJason Jin srcval = fetch_data_word(srcoffset+disp); 324*ece92f85SJason Jin CONDITIONAL_SET_FLAG(srcval & (0x1 << bit),F_CF); 325*ece92f85SJason Jin } 326*ece92f85SJason Jin } else { /* register to register */ 327*ece92f85SJason Jin if (M.x86.mode & SYSMODE_PREFIX_DATA) { 328*ece92f85SJason Jin u32 *srcreg,*shiftreg; 329*ece92f85SJason Jin 330*ece92f85SJason Jin srcreg = DECODE_RM_LONG_REGISTER(rl); 331*ece92f85SJason Jin DECODE_PRINTF(","); 332*ece92f85SJason Jin shiftreg = DECODE_RM_LONG_REGISTER(rh); 333*ece92f85SJason Jin TRACE_AND_STEP(); 334*ece92f85SJason Jin bit = *shiftreg & 0x1F; 335*ece92f85SJason Jin CONDITIONAL_SET_FLAG(*srcreg & (0x1 << bit),F_CF); 336*ece92f85SJason Jin } else { 337*ece92f85SJason Jin u16 *srcreg,*shiftreg; 338*ece92f85SJason Jin 339*ece92f85SJason Jin srcreg = DECODE_RM_WORD_REGISTER(rl); 340*ece92f85SJason Jin DECODE_PRINTF(","); 341*ece92f85SJason Jin shiftreg = DECODE_RM_WORD_REGISTER(rh); 342*ece92f85SJason Jin TRACE_AND_STEP(); 343*ece92f85SJason Jin bit = *shiftreg & 0xF; 344*ece92f85SJason Jin CONDITIONAL_SET_FLAG(*srcreg & (0x1 << bit),F_CF); 345*ece92f85SJason Jin } 346*ece92f85SJason Jin } 347*ece92f85SJason Jin DECODE_CLEAR_SEGOVR(); 348*ece92f85SJason Jin END_OF_INSTR(); 349*ece92f85SJason Jin } 350*ece92f85SJason Jin 351*ece92f85SJason Jin /**************************************************************************** 352*ece92f85SJason Jin REMARKS: 353*ece92f85SJason Jin Handles opcode 0x0f,0xa4 354*ece92f85SJason Jin ****************************************************************************/ 355*ece92f85SJason Jin void x86emuOp2_shld_IMM(u8 X86EMU_UNUSED(op2)) 356*ece92f85SJason Jin { 357*ece92f85SJason Jin int mod, rl, rh; 358*ece92f85SJason Jin uint destoffset; 359*ece92f85SJason Jin u8 shift; 360*ece92f85SJason Jin 361*ece92f85SJason Jin START_OF_INSTR(); 362*ece92f85SJason Jin DECODE_PRINTF("SHLD\t"); 363*ece92f85SJason Jin FETCH_DECODE_MODRM(mod, rh, rl); 364*ece92f85SJason Jin if (mod < 3) { 365*ece92f85SJason Jin destoffset = decode_rmXX_address(mod, rl); 366*ece92f85SJason Jin if (M.x86.mode & SYSMODE_PREFIX_DATA) { 367*ece92f85SJason Jin u32 destval; 368*ece92f85SJason Jin u32 *shiftreg; 369*ece92f85SJason Jin 370*ece92f85SJason Jin DECODE_PRINTF(","); 371*ece92f85SJason Jin shiftreg = DECODE_RM_LONG_REGISTER(rh); 372*ece92f85SJason Jin DECODE_PRINTF(","); 373*ece92f85SJason Jin shift = fetch_byte_imm(); 374*ece92f85SJason Jin DECODE_PRINTF2("%d\n", shift); 375*ece92f85SJason Jin TRACE_AND_STEP(); 376*ece92f85SJason Jin destval = fetch_data_long(destoffset); 377*ece92f85SJason Jin destval = shld_long(destval,*shiftreg,shift); 378*ece92f85SJason Jin store_data_long(destoffset, destval); 379*ece92f85SJason Jin } else { 380*ece92f85SJason Jin u16 destval; 381*ece92f85SJason Jin u16 *shiftreg; 382*ece92f85SJason Jin 383*ece92f85SJason Jin DECODE_PRINTF(","); 384*ece92f85SJason Jin shiftreg = DECODE_RM_WORD_REGISTER(rh); 385*ece92f85SJason Jin DECODE_PRINTF(","); 386*ece92f85SJason Jin shift = fetch_byte_imm(); 387*ece92f85SJason Jin DECODE_PRINTF2("%d\n", shift); 388*ece92f85SJason Jin TRACE_AND_STEP(); 389*ece92f85SJason Jin destval = fetch_data_word(destoffset); 390*ece92f85SJason Jin destval = shld_word(destval,*shiftreg,shift); 391*ece92f85SJason Jin store_data_word(destoffset, destval); 392*ece92f85SJason Jin } 393*ece92f85SJason Jin } else { /* register to register */ 394*ece92f85SJason Jin if (M.x86.mode & SYSMODE_PREFIX_DATA) { 395*ece92f85SJason Jin u32 *destreg,*shiftreg; 396*ece92f85SJason Jin 397*ece92f85SJason Jin destreg = DECODE_RM_LONG_REGISTER(rl); 398*ece92f85SJason Jin DECODE_PRINTF(","); 399*ece92f85SJason Jin shiftreg = DECODE_RM_LONG_REGISTER(rh); 400*ece92f85SJason Jin DECODE_PRINTF(","); 401*ece92f85SJason Jin shift = fetch_byte_imm(); 402*ece92f85SJason Jin DECODE_PRINTF2("%d\n", shift); 403*ece92f85SJason Jin TRACE_AND_STEP(); 404*ece92f85SJason Jin *destreg = shld_long(*destreg,*shiftreg,shift); 405*ece92f85SJason Jin } else { 406*ece92f85SJason Jin u16 *destreg,*shiftreg; 407*ece92f85SJason Jin 408*ece92f85SJason Jin destreg = DECODE_RM_WORD_REGISTER(rl); 409*ece92f85SJason Jin DECODE_PRINTF(","); 410*ece92f85SJason Jin shiftreg = DECODE_RM_WORD_REGISTER(rh); 411*ece92f85SJason Jin DECODE_PRINTF(","); 412*ece92f85SJason Jin shift = fetch_byte_imm(); 413*ece92f85SJason Jin DECODE_PRINTF2("%d\n", shift); 414*ece92f85SJason Jin TRACE_AND_STEP(); 415*ece92f85SJason Jin *destreg = shld_word(*destreg,*shiftreg,shift); 416*ece92f85SJason Jin } 417*ece92f85SJason Jin } 418*ece92f85SJason Jin DECODE_CLEAR_SEGOVR(); 419*ece92f85SJason Jin END_OF_INSTR(); 420*ece92f85SJason Jin } 421*ece92f85SJason Jin 422*ece92f85SJason Jin /**************************************************************************** 423*ece92f85SJason Jin REMARKS: 424*ece92f85SJason Jin Handles opcode 0x0f,0xa5 425*ece92f85SJason Jin ****************************************************************************/ 426*ece92f85SJason Jin void x86emuOp2_shld_CL(u8 X86EMU_UNUSED(op2)) 427*ece92f85SJason Jin { 428*ece92f85SJason Jin int mod, rl, rh; 429*ece92f85SJason Jin uint destoffset; 430*ece92f85SJason Jin 431*ece92f85SJason Jin START_OF_INSTR(); 432*ece92f85SJason Jin DECODE_PRINTF("SHLD\t"); 433*ece92f85SJason Jin FETCH_DECODE_MODRM(mod, rh, rl); 434*ece92f85SJason Jin if (mod < 3) { 435*ece92f85SJason Jin destoffset = decode_rmXX_address(mod, rl); 436*ece92f85SJason Jin if (M.x86.mode & SYSMODE_PREFIX_DATA) { 437*ece92f85SJason Jin u32 destval; 438*ece92f85SJason Jin u32 *shiftreg; 439*ece92f85SJason Jin 440*ece92f85SJason Jin DECODE_PRINTF(","); 441*ece92f85SJason Jin shiftreg = DECODE_RM_LONG_REGISTER(rh); 442*ece92f85SJason Jin DECODE_PRINTF(",CL\n"); 443*ece92f85SJason Jin TRACE_AND_STEP(); 444*ece92f85SJason Jin destval = fetch_data_long(destoffset); 445*ece92f85SJason Jin destval = shld_long(destval,*shiftreg,M.x86.R_CL); 446*ece92f85SJason Jin store_data_long(destoffset, destval); 447*ece92f85SJason Jin } else { 448*ece92f85SJason Jin u16 destval; 449*ece92f85SJason Jin u16 *shiftreg; 450*ece92f85SJason Jin 451*ece92f85SJason Jin DECODE_PRINTF(","); 452*ece92f85SJason Jin shiftreg = DECODE_RM_WORD_REGISTER(rh); 453*ece92f85SJason Jin DECODE_PRINTF(",CL\n"); 454*ece92f85SJason Jin TRACE_AND_STEP(); 455*ece92f85SJason Jin destval = fetch_data_word(destoffset); 456*ece92f85SJason Jin destval = shld_word(destval,*shiftreg,M.x86.R_CL); 457*ece92f85SJason Jin store_data_word(destoffset, destval); 458*ece92f85SJason Jin } 459*ece92f85SJason Jin } else { /* register to register */ 460*ece92f85SJason Jin if (M.x86.mode & SYSMODE_PREFIX_DATA) { 461*ece92f85SJason Jin u32 *destreg,*shiftreg; 462*ece92f85SJason Jin 463*ece92f85SJason Jin destreg = DECODE_RM_LONG_REGISTER(rl); 464*ece92f85SJason Jin DECODE_PRINTF(","); 465*ece92f85SJason Jin shiftreg = DECODE_RM_LONG_REGISTER(rh); 466*ece92f85SJason Jin DECODE_PRINTF(",CL\n"); 467*ece92f85SJason Jin TRACE_AND_STEP(); 468*ece92f85SJason Jin *destreg = shld_long(*destreg,*shiftreg,M.x86.R_CL); 469*ece92f85SJason Jin } else { 470*ece92f85SJason Jin u16 *destreg,*shiftreg; 471*ece92f85SJason Jin 472*ece92f85SJason Jin destreg = DECODE_RM_WORD_REGISTER(rl); 473*ece92f85SJason Jin DECODE_PRINTF(","); 474*ece92f85SJason Jin shiftreg = DECODE_RM_WORD_REGISTER(rh); 475*ece92f85SJason Jin DECODE_PRINTF(",CL\n"); 476*ece92f85SJason Jin TRACE_AND_STEP(); 477*ece92f85SJason Jin *destreg = shld_word(*destreg,*shiftreg,M.x86.R_CL); 478*ece92f85SJason Jin } 479*ece92f85SJason Jin } 480*ece92f85SJason Jin DECODE_CLEAR_SEGOVR(); 481*ece92f85SJason Jin END_OF_INSTR(); 482*ece92f85SJason Jin } 483*ece92f85SJason Jin 484*ece92f85SJason Jin /**************************************************************************** 485*ece92f85SJason Jin REMARKS: 486*ece92f85SJason Jin Handles opcode 0x0f,0xa8 487*ece92f85SJason Jin ****************************************************************************/ 488*ece92f85SJason Jin void x86emuOp2_push_GS(u8 X86EMU_UNUSED(op2)) 489*ece92f85SJason Jin { 490*ece92f85SJason Jin START_OF_INSTR(); 491*ece92f85SJason Jin DECODE_PRINTF("PUSH\tGS\n"); 492*ece92f85SJason Jin TRACE_AND_STEP(); 493*ece92f85SJason Jin push_word(M.x86.R_GS); 494*ece92f85SJason Jin DECODE_CLEAR_SEGOVR(); 495*ece92f85SJason Jin END_OF_INSTR(); 496*ece92f85SJason Jin } 497*ece92f85SJason Jin 498*ece92f85SJason Jin /**************************************************************************** 499*ece92f85SJason Jin REMARKS: 500*ece92f85SJason Jin Handles opcode 0x0f,0xa9 501*ece92f85SJason Jin ****************************************************************************/ 502*ece92f85SJason Jin void x86emuOp2_pop_GS(u8 X86EMU_UNUSED(op2)) 503*ece92f85SJason Jin { 504*ece92f85SJason Jin START_OF_INSTR(); 505*ece92f85SJason Jin DECODE_PRINTF("POP\tGS\n"); 506*ece92f85SJason Jin TRACE_AND_STEP(); 507*ece92f85SJason Jin M.x86.R_GS = pop_word(); 508*ece92f85SJason Jin DECODE_CLEAR_SEGOVR(); 509*ece92f85SJason Jin END_OF_INSTR(); 510*ece92f85SJason Jin } 511*ece92f85SJason Jin 512*ece92f85SJason Jin /**************************************************************************** 513*ece92f85SJason Jin REMARKS: 514*ece92f85SJason Jin Handles opcode 0x0f,0xaa 515*ece92f85SJason Jin ****************************************************************************/ 516*ece92f85SJason Jin void x86emuOp2_bts_R(u8 X86EMU_UNUSED(op2)) 517*ece92f85SJason Jin { 518*ece92f85SJason Jin int mod, rl, rh; 519*ece92f85SJason Jin uint srcoffset; 520*ece92f85SJason Jin int bit,disp; 521*ece92f85SJason Jin 522*ece92f85SJason Jin START_OF_INSTR(); 523*ece92f85SJason Jin DECODE_PRINTF("BTS\t"); 524*ece92f85SJason Jin FETCH_DECODE_MODRM(mod, rh, rl); 525*ece92f85SJason Jin if (mod < 3) { 526*ece92f85SJason Jin srcoffset = decode_rmXX_address(mod, rl); 527*ece92f85SJason Jin if (M.x86.mode & SYSMODE_PREFIX_DATA) { 528*ece92f85SJason Jin u32 srcval,mask; 529*ece92f85SJason Jin u32 *shiftreg; 530*ece92f85SJason Jin 531*ece92f85SJason Jin DECODE_PRINTF(","); 532*ece92f85SJason Jin shiftreg = DECODE_RM_LONG_REGISTER(rh); 533*ece92f85SJason Jin TRACE_AND_STEP(); 534*ece92f85SJason Jin bit = *shiftreg & 0x1F; 535*ece92f85SJason Jin disp = (s16)*shiftreg >> 5; 536*ece92f85SJason Jin srcval = fetch_data_long(srcoffset+disp); 537*ece92f85SJason Jin mask = (0x1 << bit); 538*ece92f85SJason Jin CONDITIONAL_SET_FLAG(srcval & mask,F_CF); 539*ece92f85SJason Jin store_data_long(srcoffset+disp, srcval | mask); 540*ece92f85SJason Jin } else { 541*ece92f85SJason Jin u16 srcval,mask; 542*ece92f85SJason Jin u16 *shiftreg; 543*ece92f85SJason Jin 544*ece92f85SJason Jin DECODE_PRINTF(","); 545*ece92f85SJason Jin shiftreg = DECODE_RM_WORD_REGISTER(rh); 546*ece92f85SJason Jin TRACE_AND_STEP(); 547*ece92f85SJason Jin bit = *shiftreg & 0xF; 548*ece92f85SJason Jin disp = (s16)*shiftreg >> 4; 549*ece92f85SJason Jin srcval = fetch_data_word(srcoffset+disp); 550*ece92f85SJason Jin mask = (u16)(0x1 << bit); 551*ece92f85SJason Jin CONDITIONAL_SET_FLAG(srcval & mask,F_CF); 552*ece92f85SJason Jin store_data_word(srcoffset+disp, srcval | mask); 553*ece92f85SJason Jin } 554*ece92f85SJason Jin } else { /* register to register */ 555*ece92f85SJason Jin if (M.x86.mode & SYSMODE_PREFIX_DATA) { 556*ece92f85SJason Jin u32 *srcreg,*shiftreg; 557*ece92f85SJason Jin u32 mask; 558*ece92f85SJason Jin 559*ece92f85SJason Jin srcreg = DECODE_RM_LONG_REGISTER(rl); 560*ece92f85SJason Jin DECODE_PRINTF(","); 561*ece92f85SJason Jin shiftreg = DECODE_RM_LONG_REGISTER(rh); 562*ece92f85SJason Jin TRACE_AND_STEP(); 563*ece92f85SJason Jin bit = *shiftreg & 0x1F; 564*ece92f85SJason Jin mask = (0x1 << bit); 565*ece92f85SJason Jin CONDITIONAL_SET_FLAG(*srcreg & mask,F_CF); 566*ece92f85SJason Jin *srcreg |= mask; 567*ece92f85SJason Jin } else { 568*ece92f85SJason Jin u16 *srcreg,*shiftreg; 569*ece92f85SJason Jin u16 mask; 570*ece92f85SJason Jin 571*ece92f85SJason Jin srcreg = DECODE_RM_WORD_REGISTER(rl); 572*ece92f85SJason Jin DECODE_PRINTF(","); 573*ece92f85SJason Jin shiftreg = DECODE_RM_WORD_REGISTER(rh); 574*ece92f85SJason Jin TRACE_AND_STEP(); 575*ece92f85SJason Jin bit = *shiftreg & 0xF; 576*ece92f85SJason Jin mask = (u16)(0x1 << bit); 577*ece92f85SJason Jin CONDITIONAL_SET_FLAG(*srcreg & mask,F_CF); 578*ece92f85SJason Jin *srcreg |= mask; 579*ece92f85SJason Jin } 580*ece92f85SJason Jin } 581*ece92f85SJason Jin DECODE_CLEAR_SEGOVR(); 582*ece92f85SJason Jin END_OF_INSTR(); 583*ece92f85SJason Jin } 584*ece92f85SJason Jin 585*ece92f85SJason Jin /**************************************************************************** 586*ece92f85SJason Jin REMARKS: 587*ece92f85SJason Jin Handles opcode 0x0f,0xac 588*ece92f85SJason Jin ****************************************************************************/ 589*ece92f85SJason Jin void x86emuOp2_shrd_IMM(u8 X86EMU_UNUSED(op2)) 590*ece92f85SJason Jin { 591*ece92f85SJason Jin int mod, rl, rh; 592*ece92f85SJason Jin uint destoffset; 593*ece92f85SJason Jin u8 shift; 594*ece92f85SJason Jin 595*ece92f85SJason Jin START_OF_INSTR(); 596*ece92f85SJason Jin DECODE_PRINTF("SHLD\t"); 597*ece92f85SJason Jin FETCH_DECODE_MODRM(mod, rh, rl); 598*ece92f85SJason Jin if (mod < 3) { 599*ece92f85SJason Jin destoffset = decode_rmXX_address(mod, rl); 600*ece92f85SJason Jin if (M.x86.mode & SYSMODE_PREFIX_DATA) { 601*ece92f85SJason Jin u32 destval; 602*ece92f85SJason Jin u32 *shiftreg; 603*ece92f85SJason Jin 604*ece92f85SJason Jin DECODE_PRINTF(","); 605*ece92f85SJason Jin shiftreg = DECODE_RM_LONG_REGISTER(rh); 606*ece92f85SJason Jin DECODE_PRINTF(","); 607*ece92f85SJason Jin shift = fetch_byte_imm(); 608*ece92f85SJason Jin DECODE_PRINTF2("%d\n", shift); 609*ece92f85SJason Jin TRACE_AND_STEP(); 610*ece92f85SJason Jin destval = fetch_data_long(destoffset); 611*ece92f85SJason Jin destval = shrd_long(destval,*shiftreg,shift); 612*ece92f85SJason Jin store_data_long(destoffset, destval); 613*ece92f85SJason Jin } else { 614*ece92f85SJason Jin u16 destval; 615*ece92f85SJason Jin u16 *shiftreg; 616*ece92f85SJason Jin 617*ece92f85SJason Jin DECODE_PRINTF(","); 618*ece92f85SJason Jin shiftreg = DECODE_RM_WORD_REGISTER(rh); 619*ece92f85SJason Jin DECODE_PRINTF(","); 620*ece92f85SJason Jin shift = fetch_byte_imm(); 621*ece92f85SJason Jin DECODE_PRINTF2("%d\n", shift); 622*ece92f85SJason Jin TRACE_AND_STEP(); 623*ece92f85SJason Jin destval = fetch_data_word(destoffset); 624*ece92f85SJason Jin destval = shrd_word(destval,*shiftreg,shift); 625*ece92f85SJason Jin store_data_word(destoffset, destval); 626*ece92f85SJason Jin } 627*ece92f85SJason Jin } else { /* register to register */ 628*ece92f85SJason Jin if (M.x86.mode & SYSMODE_PREFIX_DATA) { 629*ece92f85SJason Jin u32 *destreg,*shiftreg; 630*ece92f85SJason Jin 631*ece92f85SJason Jin destreg = DECODE_RM_LONG_REGISTER(rl); 632*ece92f85SJason Jin DECODE_PRINTF(","); 633*ece92f85SJason Jin shiftreg = DECODE_RM_LONG_REGISTER(rh); 634*ece92f85SJason Jin DECODE_PRINTF(","); 635*ece92f85SJason Jin shift = fetch_byte_imm(); 636*ece92f85SJason Jin DECODE_PRINTF2("%d\n", shift); 637*ece92f85SJason Jin TRACE_AND_STEP(); 638*ece92f85SJason Jin *destreg = shrd_long(*destreg,*shiftreg,shift); 639*ece92f85SJason Jin } else { 640*ece92f85SJason Jin u16 *destreg,*shiftreg; 641*ece92f85SJason Jin 642*ece92f85SJason Jin destreg = DECODE_RM_WORD_REGISTER(rl); 643*ece92f85SJason Jin DECODE_PRINTF(","); 644*ece92f85SJason Jin shiftreg = DECODE_RM_WORD_REGISTER(rh); 645*ece92f85SJason Jin DECODE_PRINTF(","); 646*ece92f85SJason Jin shift = fetch_byte_imm(); 647*ece92f85SJason Jin DECODE_PRINTF2("%d\n", shift); 648*ece92f85SJason Jin TRACE_AND_STEP(); 649*ece92f85SJason Jin *destreg = shrd_word(*destreg,*shiftreg,shift); 650*ece92f85SJason Jin } 651*ece92f85SJason Jin } 652*ece92f85SJason Jin DECODE_CLEAR_SEGOVR(); 653*ece92f85SJason Jin END_OF_INSTR(); 654*ece92f85SJason Jin } 655*ece92f85SJason Jin 656*ece92f85SJason Jin /**************************************************************************** 657*ece92f85SJason Jin REMARKS: 658*ece92f85SJason Jin Handles opcode 0x0f,0xad 659*ece92f85SJason Jin ****************************************************************************/ 660*ece92f85SJason Jin void x86emuOp2_shrd_CL(u8 X86EMU_UNUSED(op2)) 661*ece92f85SJason Jin { 662*ece92f85SJason Jin int mod, rl, rh; 663*ece92f85SJason Jin uint destoffset; 664*ece92f85SJason Jin 665*ece92f85SJason Jin START_OF_INSTR(); 666*ece92f85SJason Jin DECODE_PRINTF("SHLD\t"); 667*ece92f85SJason Jin FETCH_DECODE_MODRM(mod, rh, rl); 668*ece92f85SJason Jin if (mod < 3) { 669*ece92f85SJason Jin destoffset = decode_rmXX_address(mod, rl); 670*ece92f85SJason Jin DECODE_PRINTF(","); 671*ece92f85SJason Jin if (M.x86.mode & SYSMODE_PREFIX_DATA) { 672*ece92f85SJason Jin u32 destval; 673*ece92f85SJason Jin u32 *shiftreg; 674*ece92f85SJason Jin 675*ece92f85SJason Jin shiftreg = DECODE_RM_LONG_REGISTER(rh); 676*ece92f85SJason Jin DECODE_PRINTF(",CL\n"); 677*ece92f85SJason Jin TRACE_AND_STEP(); 678*ece92f85SJason Jin destval = fetch_data_long(destoffset); 679*ece92f85SJason Jin destval = shrd_long(destval,*shiftreg,M.x86.R_CL); 680*ece92f85SJason Jin store_data_long(destoffset, destval); 681*ece92f85SJason Jin } else { 682*ece92f85SJason Jin u16 destval; 683*ece92f85SJason Jin u16 *shiftreg; 684*ece92f85SJason Jin 685*ece92f85SJason Jin shiftreg = DECODE_RM_WORD_REGISTER(rh); 686*ece92f85SJason Jin DECODE_PRINTF(",CL\n"); 687*ece92f85SJason Jin TRACE_AND_STEP(); 688*ece92f85SJason Jin destval = fetch_data_word(destoffset); 689*ece92f85SJason Jin destval = shrd_word(destval,*shiftreg,M.x86.R_CL); 690*ece92f85SJason Jin store_data_word(destoffset, destval); 691*ece92f85SJason Jin } 692*ece92f85SJason Jin } else { /* register to register */ 693*ece92f85SJason Jin if (M.x86.mode & SYSMODE_PREFIX_DATA) { 694*ece92f85SJason Jin u32 *destreg,*shiftreg; 695*ece92f85SJason Jin 696*ece92f85SJason Jin destreg = DECODE_RM_LONG_REGISTER(rl); 697*ece92f85SJason Jin DECODE_PRINTF(","); 698*ece92f85SJason Jin shiftreg = DECODE_RM_LONG_REGISTER(rh); 699*ece92f85SJason Jin DECODE_PRINTF(",CL\n"); 700*ece92f85SJason Jin TRACE_AND_STEP(); 701*ece92f85SJason Jin *destreg = shrd_long(*destreg,*shiftreg,M.x86.R_CL); 702*ece92f85SJason Jin } else { 703*ece92f85SJason Jin u16 *destreg,*shiftreg; 704*ece92f85SJason Jin 705*ece92f85SJason Jin destreg = DECODE_RM_WORD_REGISTER(rl); 706*ece92f85SJason Jin DECODE_PRINTF(","); 707*ece92f85SJason Jin shiftreg = DECODE_RM_WORD_REGISTER(rh); 708*ece92f85SJason Jin DECODE_PRINTF(",CL\n"); 709*ece92f85SJason Jin TRACE_AND_STEP(); 710*ece92f85SJason Jin *destreg = shrd_word(*destreg,*shiftreg,M.x86.R_CL); 711*ece92f85SJason Jin } 712*ece92f85SJason Jin } 713*ece92f85SJason Jin DECODE_CLEAR_SEGOVR(); 714*ece92f85SJason Jin END_OF_INSTR(); 715*ece92f85SJason Jin } 716*ece92f85SJason Jin 717*ece92f85SJason Jin /**************************************************************************** 718*ece92f85SJason Jin REMARKS: 719*ece92f85SJason Jin Handles opcode 0x0f,0xaf 720*ece92f85SJason Jin ****************************************************************************/ 721*ece92f85SJason Jin void x86emuOp2_imul_R_RM(u8 X86EMU_UNUSED(op2)) 722*ece92f85SJason Jin { 723*ece92f85SJason Jin int mod, rl, rh; 724*ece92f85SJason Jin uint srcoffset; 725*ece92f85SJason Jin 726*ece92f85SJason Jin START_OF_INSTR(); 727*ece92f85SJason Jin DECODE_PRINTF("IMUL\t"); 728*ece92f85SJason Jin FETCH_DECODE_MODRM(mod, rh, rl); 729*ece92f85SJason Jin if (mod < 3) { 730*ece92f85SJason Jin if (M.x86.mode & SYSMODE_PREFIX_DATA) { 731*ece92f85SJason Jin u32 *destreg; 732*ece92f85SJason Jin u32 srcval; 733*ece92f85SJason Jin u32 res_lo,res_hi; 734*ece92f85SJason Jin 735*ece92f85SJason Jin destreg = DECODE_RM_LONG_REGISTER(rh); 736*ece92f85SJason Jin DECODE_PRINTF(","); 737*ece92f85SJason Jin srcoffset = decode_rmXX_address(mod, rl); 738*ece92f85SJason Jin srcval = fetch_data_long(srcoffset); 739*ece92f85SJason Jin TRACE_AND_STEP(); 740*ece92f85SJason Jin imul_long_direct(&res_lo,&res_hi,(s32)*destreg,(s32)srcval); 741*ece92f85SJason Jin if (res_hi != 0) { 742*ece92f85SJason Jin SET_FLAG(F_CF); 743*ece92f85SJason Jin SET_FLAG(F_OF); 744*ece92f85SJason Jin } else { 745*ece92f85SJason Jin CLEAR_FLAG(F_CF); 746*ece92f85SJason Jin CLEAR_FLAG(F_OF); 747*ece92f85SJason Jin } 748*ece92f85SJason Jin *destreg = (u32)res_lo; 749*ece92f85SJason Jin } else { 750*ece92f85SJason Jin u16 *destreg; 751*ece92f85SJason Jin u16 srcval; 752*ece92f85SJason Jin u32 res; 753*ece92f85SJason Jin 754*ece92f85SJason Jin destreg = DECODE_RM_WORD_REGISTER(rh); 755*ece92f85SJason Jin DECODE_PRINTF(","); 756*ece92f85SJason Jin srcoffset = decode_rmXX_address(mod, rl); 757*ece92f85SJason Jin srcval = fetch_data_word(srcoffset); 758*ece92f85SJason Jin TRACE_AND_STEP(); 759*ece92f85SJason Jin res = (s16)*destreg * (s16)srcval; 760*ece92f85SJason Jin if (res > 0xFFFF) { 761*ece92f85SJason Jin SET_FLAG(F_CF); 762*ece92f85SJason Jin SET_FLAG(F_OF); 763*ece92f85SJason Jin } else { 764*ece92f85SJason Jin CLEAR_FLAG(F_CF); 765*ece92f85SJason Jin CLEAR_FLAG(F_OF); 766*ece92f85SJason Jin } 767*ece92f85SJason Jin *destreg = (u16)res; 768*ece92f85SJason Jin } 769*ece92f85SJason Jin } else { /* register to register */ 770*ece92f85SJason Jin if (M.x86.mode & SYSMODE_PREFIX_DATA) { 771*ece92f85SJason Jin u32 *destreg,*srcreg; 772*ece92f85SJason Jin u32 res_lo,res_hi; 773*ece92f85SJason Jin 774*ece92f85SJason Jin destreg = DECODE_RM_LONG_REGISTER(rh); 775*ece92f85SJason Jin DECODE_PRINTF(","); 776*ece92f85SJason Jin srcreg = DECODE_RM_LONG_REGISTER(rl); 777*ece92f85SJason Jin TRACE_AND_STEP(); 778*ece92f85SJason Jin imul_long_direct(&res_lo,&res_hi,(s32)*destreg,(s32)*srcreg); 779*ece92f85SJason Jin if (res_hi != 0) { 780*ece92f85SJason Jin SET_FLAG(F_CF); 781*ece92f85SJason Jin SET_FLAG(F_OF); 782*ece92f85SJason Jin } else { 783*ece92f85SJason Jin CLEAR_FLAG(F_CF); 784*ece92f85SJason Jin CLEAR_FLAG(F_OF); 785*ece92f85SJason Jin } 786*ece92f85SJason Jin *destreg = (u32)res_lo; 787*ece92f85SJason Jin } else { 788*ece92f85SJason Jin u16 *destreg,*srcreg; 789*ece92f85SJason Jin u32 res; 790*ece92f85SJason Jin 791*ece92f85SJason Jin destreg = DECODE_RM_WORD_REGISTER(rh); 792*ece92f85SJason Jin DECODE_PRINTF(","); 793*ece92f85SJason Jin srcreg = DECODE_RM_WORD_REGISTER(rl); 794*ece92f85SJason Jin res = (s16)*destreg * (s16)*srcreg; 795*ece92f85SJason Jin if (res > 0xFFFF) { 796*ece92f85SJason Jin SET_FLAG(F_CF); 797*ece92f85SJason Jin SET_FLAG(F_OF); 798*ece92f85SJason Jin } else { 799*ece92f85SJason Jin CLEAR_FLAG(F_CF); 800*ece92f85SJason Jin CLEAR_FLAG(F_OF); 801*ece92f85SJason Jin } 802*ece92f85SJason Jin *destreg = (u16)res; 803*ece92f85SJason Jin } 804*ece92f85SJason Jin } 805*ece92f85SJason Jin DECODE_CLEAR_SEGOVR(); 806*ece92f85SJason Jin END_OF_INSTR(); 807*ece92f85SJason Jin } 808*ece92f85SJason Jin 809*ece92f85SJason Jin /**************************************************************************** 810*ece92f85SJason Jin REMARKS: 811*ece92f85SJason Jin Handles opcode 0x0f,0xb2 812*ece92f85SJason Jin ****************************************************************************/ 813*ece92f85SJason Jin void x86emuOp2_lss_R_IMM(u8 X86EMU_UNUSED(op2)) 814*ece92f85SJason Jin { 815*ece92f85SJason Jin int mod, rh, rl; 816*ece92f85SJason Jin u16 *dstreg; 817*ece92f85SJason Jin uint srcoffset; 818*ece92f85SJason Jin 819*ece92f85SJason Jin START_OF_INSTR(); 820*ece92f85SJason Jin DECODE_PRINTF("LSS\t"); 821*ece92f85SJason Jin FETCH_DECODE_MODRM(mod, rh, rl); 822*ece92f85SJason Jin if (mod < 3) { 823*ece92f85SJason Jin dstreg = DECODE_RM_WORD_REGISTER(rh); 824*ece92f85SJason Jin DECODE_PRINTF(","); 825*ece92f85SJason Jin srcoffset = decode_rmXX_address(mod, rl); 826*ece92f85SJason Jin DECODE_PRINTF("\n"); 827*ece92f85SJason Jin TRACE_AND_STEP(); 828*ece92f85SJason Jin *dstreg = fetch_data_word(srcoffset); 829*ece92f85SJason Jin M.x86.R_SS = fetch_data_word(srcoffset + 2); 830*ece92f85SJason Jin } else { /* register to register */ 831*ece92f85SJason Jin /* UNDEFINED! */ 832*ece92f85SJason Jin TRACE_AND_STEP(); 833*ece92f85SJason Jin } 834*ece92f85SJason Jin DECODE_CLEAR_SEGOVR(); 835*ece92f85SJason Jin END_OF_INSTR(); 836*ece92f85SJason Jin } 837*ece92f85SJason Jin 838*ece92f85SJason Jin /**************************************************************************** 839*ece92f85SJason Jin REMARKS: 840*ece92f85SJason Jin Handles opcode 0x0f,0xb3 841*ece92f85SJason Jin ****************************************************************************/ 842*ece92f85SJason Jin void x86emuOp2_btr_R(u8 X86EMU_UNUSED(op2)) 843*ece92f85SJason Jin { 844*ece92f85SJason Jin int mod, rl, rh; 845*ece92f85SJason Jin uint srcoffset; 846*ece92f85SJason Jin int bit,disp; 847*ece92f85SJason Jin 848*ece92f85SJason Jin START_OF_INSTR(); 849*ece92f85SJason Jin DECODE_PRINTF("BTR\t"); 850*ece92f85SJason Jin FETCH_DECODE_MODRM(mod, rh, rl); 851*ece92f85SJason Jin if (mod < 3) { 852*ece92f85SJason Jin srcoffset = decode_rmXX_address(mod, rl); 853*ece92f85SJason Jin DECODE_PRINTF(","); 854*ece92f85SJason Jin if (M.x86.mode & SYSMODE_PREFIX_DATA) { 855*ece92f85SJason Jin u32 srcval,mask; 856*ece92f85SJason Jin u32 *shiftreg; 857*ece92f85SJason Jin 858*ece92f85SJason Jin shiftreg = DECODE_RM_LONG_REGISTER(rh); 859*ece92f85SJason Jin TRACE_AND_STEP(); 860*ece92f85SJason Jin bit = *shiftreg & 0x1F; 861*ece92f85SJason Jin disp = (s16)*shiftreg >> 5; 862*ece92f85SJason Jin srcval = fetch_data_long(srcoffset+disp); 863*ece92f85SJason Jin mask = (0x1 << bit); 864*ece92f85SJason Jin CONDITIONAL_SET_FLAG(srcval & mask,F_CF); 865*ece92f85SJason Jin store_data_long(srcoffset+disp, srcval & ~mask); 866*ece92f85SJason Jin } else { 867*ece92f85SJason Jin u16 srcval,mask; 868*ece92f85SJason Jin u16 *shiftreg; 869*ece92f85SJason Jin 870*ece92f85SJason Jin shiftreg = DECODE_RM_WORD_REGISTER(rh); 871*ece92f85SJason Jin TRACE_AND_STEP(); 872*ece92f85SJason Jin bit = *shiftreg & 0xF; 873*ece92f85SJason Jin disp = (s16)*shiftreg >> 4; 874*ece92f85SJason Jin srcval = fetch_data_word(srcoffset+disp); 875*ece92f85SJason Jin mask = (u16)(0x1 << bit); 876*ece92f85SJason Jin CONDITIONAL_SET_FLAG(srcval & mask,F_CF); 877*ece92f85SJason Jin store_data_word(srcoffset+disp, (u16)(srcval & ~mask)); 878*ece92f85SJason Jin } 879*ece92f85SJason Jin } else { /* register to register */ 880*ece92f85SJason Jin if (M.x86.mode & SYSMODE_PREFIX_DATA) { 881*ece92f85SJason Jin u32 *srcreg,*shiftreg; 882*ece92f85SJason Jin u32 mask; 883*ece92f85SJason Jin 884*ece92f85SJason Jin srcreg = DECODE_RM_LONG_REGISTER(rl); 885*ece92f85SJason Jin DECODE_PRINTF(","); 886*ece92f85SJason Jin shiftreg = DECODE_RM_LONG_REGISTER(rh); 887*ece92f85SJason Jin TRACE_AND_STEP(); 888*ece92f85SJason Jin bit = *shiftreg & 0x1F; 889*ece92f85SJason Jin mask = (0x1 << bit); 890*ece92f85SJason Jin CONDITIONAL_SET_FLAG(*srcreg & mask,F_CF); 891*ece92f85SJason Jin *srcreg &= ~mask; 892*ece92f85SJason Jin } else { 893*ece92f85SJason Jin u16 *srcreg,*shiftreg; 894*ece92f85SJason Jin u16 mask; 895*ece92f85SJason Jin 896*ece92f85SJason Jin srcreg = DECODE_RM_WORD_REGISTER(rl); 897*ece92f85SJason Jin DECODE_PRINTF(","); 898*ece92f85SJason Jin shiftreg = DECODE_RM_WORD_REGISTER(rh); 899*ece92f85SJason Jin TRACE_AND_STEP(); 900*ece92f85SJason Jin bit = *shiftreg & 0xF; 901*ece92f85SJason Jin mask = (u16)(0x1 << bit); 902*ece92f85SJason Jin CONDITIONAL_SET_FLAG(*srcreg & mask,F_CF); 903*ece92f85SJason Jin *srcreg &= ~mask; 904*ece92f85SJason Jin } 905*ece92f85SJason Jin } 906*ece92f85SJason Jin DECODE_CLEAR_SEGOVR(); 907*ece92f85SJason Jin END_OF_INSTR(); 908*ece92f85SJason Jin } 909*ece92f85SJason Jin 910*ece92f85SJason Jin /**************************************************************************** 911*ece92f85SJason Jin REMARKS: 912*ece92f85SJason Jin Handles opcode 0x0f,0xb4 913*ece92f85SJason Jin ****************************************************************************/ 914*ece92f85SJason Jin void x86emuOp2_lfs_R_IMM(u8 X86EMU_UNUSED(op2)) 915*ece92f85SJason Jin { 916*ece92f85SJason Jin int mod, rh, rl; 917*ece92f85SJason Jin u16 *dstreg; 918*ece92f85SJason Jin uint srcoffset; 919*ece92f85SJason Jin 920*ece92f85SJason Jin START_OF_INSTR(); 921*ece92f85SJason Jin DECODE_PRINTF("LFS\t"); 922*ece92f85SJason Jin FETCH_DECODE_MODRM(mod, rh, rl); 923*ece92f85SJason Jin if (mod < 3) { 924*ece92f85SJason Jin dstreg = DECODE_RM_WORD_REGISTER(rh); 925*ece92f85SJason Jin DECODE_PRINTF(","); 926*ece92f85SJason Jin srcoffset = decode_rmXX_address(mod, rl); 927*ece92f85SJason Jin DECODE_PRINTF("\n"); 928*ece92f85SJason Jin TRACE_AND_STEP(); 929*ece92f85SJason Jin *dstreg = fetch_data_word(srcoffset); 930*ece92f85SJason Jin M.x86.R_FS = fetch_data_word(srcoffset + 2); 931*ece92f85SJason Jin } else { /* register to register */ 932*ece92f85SJason Jin /* UNDEFINED! */ 933*ece92f85SJason Jin TRACE_AND_STEP(); 934*ece92f85SJason Jin } 935*ece92f85SJason Jin DECODE_CLEAR_SEGOVR(); 936*ece92f85SJason Jin END_OF_INSTR(); 937*ece92f85SJason Jin } 938*ece92f85SJason Jin 939*ece92f85SJason Jin /**************************************************************************** 940*ece92f85SJason Jin REMARKS: 941*ece92f85SJason Jin Handles opcode 0x0f,0xb5 942*ece92f85SJason Jin ****************************************************************************/ 943*ece92f85SJason Jin void x86emuOp2_lgs_R_IMM(u8 X86EMU_UNUSED(op2)) 944*ece92f85SJason Jin { 945*ece92f85SJason Jin int mod, rh, rl; 946*ece92f85SJason Jin u16 *dstreg; 947*ece92f85SJason Jin uint srcoffset; 948*ece92f85SJason Jin 949*ece92f85SJason Jin START_OF_INSTR(); 950*ece92f85SJason Jin DECODE_PRINTF("LGS\t"); 951*ece92f85SJason Jin FETCH_DECODE_MODRM(mod, rh, rl); 952*ece92f85SJason Jin if (mod < 3) { 953*ece92f85SJason Jin dstreg = DECODE_RM_WORD_REGISTER(rh); 954*ece92f85SJason Jin DECODE_PRINTF(","); 955*ece92f85SJason Jin srcoffset = decode_rmXX_address(mod, rl); 956*ece92f85SJason Jin DECODE_PRINTF("\n"); 957*ece92f85SJason Jin TRACE_AND_STEP(); 958*ece92f85SJason Jin *dstreg = fetch_data_word(srcoffset); 959*ece92f85SJason Jin M.x86.R_GS = fetch_data_word(srcoffset + 2); 960*ece92f85SJason Jin } else { /* register to register */ 961*ece92f85SJason Jin /* UNDEFINED! */ 962*ece92f85SJason Jin TRACE_AND_STEP(); 963*ece92f85SJason Jin } 964*ece92f85SJason Jin DECODE_CLEAR_SEGOVR(); 965*ece92f85SJason Jin END_OF_INSTR(); 966*ece92f85SJason Jin } 967*ece92f85SJason Jin 968*ece92f85SJason Jin /**************************************************************************** 969*ece92f85SJason Jin REMARKS: 970*ece92f85SJason Jin Handles opcode 0x0f,0xb6 971*ece92f85SJason Jin ****************************************************************************/ 972*ece92f85SJason Jin void x86emuOp2_movzx_byte_R_RM(u8 X86EMU_UNUSED(op2)) 973*ece92f85SJason Jin { 974*ece92f85SJason Jin int mod, rl, rh; 975*ece92f85SJason Jin uint srcoffset; 976*ece92f85SJason Jin 977*ece92f85SJason Jin START_OF_INSTR(); 978*ece92f85SJason Jin DECODE_PRINTF("MOVZX\t"); 979*ece92f85SJason Jin FETCH_DECODE_MODRM(mod, rh, rl); 980*ece92f85SJason Jin if (mod < 3) { 981*ece92f85SJason Jin if (M.x86.mode & SYSMODE_PREFIX_DATA) { 982*ece92f85SJason Jin u32 *destreg; 983*ece92f85SJason Jin u32 srcval; 984*ece92f85SJason Jin 985*ece92f85SJason Jin destreg = DECODE_RM_LONG_REGISTER(rh); 986*ece92f85SJason Jin DECODE_PRINTF(","); 987*ece92f85SJason Jin srcoffset = decode_rmXX_address(mod, rl); 988*ece92f85SJason Jin srcval = fetch_data_byte(srcoffset); 989*ece92f85SJason Jin DECODE_PRINTF("\n"); 990*ece92f85SJason Jin TRACE_AND_STEP(); 991*ece92f85SJason Jin *destreg = srcval; 992*ece92f85SJason Jin } else { 993*ece92f85SJason Jin u16 *destreg; 994*ece92f85SJason Jin u16 srcval; 995*ece92f85SJason Jin 996*ece92f85SJason Jin destreg = DECODE_RM_WORD_REGISTER(rh); 997*ece92f85SJason Jin DECODE_PRINTF(","); 998*ece92f85SJason Jin srcoffset = decode_rmXX_address(mod, rl); 999*ece92f85SJason Jin srcval = fetch_data_byte(srcoffset); 1000*ece92f85SJason Jin DECODE_PRINTF("\n"); 1001*ece92f85SJason Jin TRACE_AND_STEP(); 1002*ece92f85SJason Jin *destreg = srcval; 1003*ece92f85SJason Jin } 1004*ece92f85SJason Jin } else { /* register to register */ 1005*ece92f85SJason Jin if (M.x86.mode & SYSMODE_PREFIX_DATA) { 1006*ece92f85SJason Jin u32 *destreg; 1007*ece92f85SJason Jin u8 *srcreg; 1008*ece92f85SJason Jin 1009*ece92f85SJason Jin destreg = DECODE_RM_LONG_REGISTER(rh); 1010*ece92f85SJason Jin DECODE_PRINTF(","); 1011*ece92f85SJason Jin srcreg = DECODE_RM_BYTE_REGISTER(rl); 1012*ece92f85SJason Jin DECODE_PRINTF("\n"); 1013*ece92f85SJason Jin TRACE_AND_STEP(); 1014*ece92f85SJason Jin *destreg = *srcreg; 1015*ece92f85SJason Jin } else { 1016*ece92f85SJason Jin u16 *destreg; 1017*ece92f85SJason Jin u8 *srcreg; 1018*ece92f85SJason Jin 1019*ece92f85SJason Jin destreg = DECODE_RM_WORD_REGISTER(rh); 1020*ece92f85SJason Jin DECODE_PRINTF(","); 1021*ece92f85SJason Jin srcreg = DECODE_RM_BYTE_REGISTER(rl); 1022*ece92f85SJason Jin DECODE_PRINTF("\n"); 1023*ece92f85SJason Jin TRACE_AND_STEP(); 1024*ece92f85SJason Jin *destreg = *srcreg; 1025*ece92f85SJason Jin } 1026*ece92f85SJason Jin } 1027*ece92f85SJason Jin DECODE_CLEAR_SEGOVR(); 1028*ece92f85SJason Jin END_OF_INSTR(); 1029*ece92f85SJason Jin } 1030*ece92f85SJason Jin 1031*ece92f85SJason Jin /**************************************************************************** 1032*ece92f85SJason Jin REMARKS: 1033*ece92f85SJason Jin Handles opcode 0x0f,0xb7 1034*ece92f85SJason Jin ****************************************************************************/ 1035*ece92f85SJason Jin void x86emuOp2_movzx_word_R_RM(u8 X86EMU_UNUSED(op2)) 1036*ece92f85SJason Jin { 1037*ece92f85SJason Jin int mod, rl, rh; 1038*ece92f85SJason Jin uint srcoffset; 1039*ece92f85SJason Jin u32 *destreg; 1040*ece92f85SJason Jin u32 srcval; 1041*ece92f85SJason Jin u16 *srcreg; 1042*ece92f85SJason Jin 1043*ece92f85SJason Jin START_OF_INSTR(); 1044*ece92f85SJason Jin DECODE_PRINTF("MOVZX\t"); 1045*ece92f85SJason Jin FETCH_DECODE_MODRM(mod, rh, rl); 1046*ece92f85SJason Jin if (mod < 3) { 1047*ece92f85SJason Jin destreg = DECODE_RM_LONG_REGISTER(rh); 1048*ece92f85SJason Jin DECODE_PRINTF(","); 1049*ece92f85SJason Jin srcoffset = decode_rmXX_address(mod, rl); 1050*ece92f85SJason Jin srcval = fetch_data_word(srcoffset); 1051*ece92f85SJason Jin DECODE_PRINTF("\n"); 1052*ece92f85SJason Jin TRACE_AND_STEP(); 1053*ece92f85SJason Jin *destreg = srcval; 1054*ece92f85SJason Jin } else { /* register to register */ 1055*ece92f85SJason Jin destreg = DECODE_RM_LONG_REGISTER(rh); 1056*ece92f85SJason Jin DECODE_PRINTF(","); 1057*ece92f85SJason Jin srcreg = DECODE_RM_WORD_REGISTER(rl); 1058*ece92f85SJason Jin DECODE_PRINTF("\n"); 1059*ece92f85SJason Jin TRACE_AND_STEP(); 1060*ece92f85SJason Jin *destreg = *srcreg; 1061*ece92f85SJason Jin } 1062*ece92f85SJason Jin DECODE_CLEAR_SEGOVR(); 1063*ece92f85SJason Jin END_OF_INSTR(); 1064*ece92f85SJason Jin } 1065*ece92f85SJason Jin 1066*ece92f85SJason Jin /**************************************************************************** 1067*ece92f85SJason Jin REMARKS: 1068*ece92f85SJason Jin Handles opcode 0x0f,0xba 1069*ece92f85SJason Jin ****************************************************************************/ 1070*ece92f85SJason Jin void x86emuOp2_btX_I(u8 X86EMU_UNUSED(op2)) 1071*ece92f85SJason Jin { 1072*ece92f85SJason Jin int mod, rl, rh; 1073*ece92f85SJason Jin uint srcoffset; 1074*ece92f85SJason Jin u8 shift; 1075*ece92f85SJason Jin int bit; 1076*ece92f85SJason Jin 1077*ece92f85SJason Jin START_OF_INSTR(); 1078*ece92f85SJason Jin FETCH_DECODE_MODRM(mod, rh, rl); 1079*ece92f85SJason Jin switch (rh) { 1080*ece92f85SJason Jin case 4: 1081*ece92f85SJason Jin DECODE_PRINTF("BT\t"); 1082*ece92f85SJason Jin break; 1083*ece92f85SJason Jin case 5: 1084*ece92f85SJason Jin DECODE_PRINTF("BTS\t"); 1085*ece92f85SJason Jin break; 1086*ece92f85SJason Jin case 6: 1087*ece92f85SJason Jin DECODE_PRINTF("BTR\t"); 1088*ece92f85SJason Jin break; 1089*ece92f85SJason Jin case 7: 1090*ece92f85SJason Jin DECODE_PRINTF("BTC\t"); 1091*ece92f85SJason Jin break; 1092*ece92f85SJason Jin default: 1093*ece92f85SJason Jin DECODE_PRINTF("ILLEGAL EXTENDED X86 OPCODE\n"); 1094*ece92f85SJason Jin TRACE_REGS(); 1095*ece92f85SJason Jin printk("%04x:%04x: %02X%02X ILLEGAL EXTENDED X86 OPCODE EXTENSION!\n", 1096*ece92f85SJason Jin M.x86.R_CS, M.x86.R_IP-3,op2, (mod<<6)|(rh<<3)|rl); 1097*ece92f85SJason Jin HALT_SYS(); 1098*ece92f85SJason Jin } 1099*ece92f85SJason Jin if (mod < 3) { 1100*ece92f85SJason Jin 1101*ece92f85SJason Jin srcoffset = decode_rmXX_address(mod, rl); 1102*ece92f85SJason Jin shift = fetch_byte_imm(); 1103*ece92f85SJason Jin DECODE_PRINTF2(",%d\n", shift); 1104*ece92f85SJason Jin TRACE_AND_STEP(); 1105*ece92f85SJason Jin 1106*ece92f85SJason Jin if (M.x86.mode & SYSMODE_PREFIX_DATA) { 1107*ece92f85SJason Jin u32 srcval, mask; 1108*ece92f85SJason Jin 1109*ece92f85SJason Jin bit = shift & 0x1F; 1110*ece92f85SJason Jin srcval = fetch_data_long(srcoffset); 1111*ece92f85SJason Jin mask = (0x1 << bit); 1112*ece92f85SJason Jin CONDITIONAL_SET_FLAG(srcval & mask,F_CF); 1113*ece92f85SJason Jin switch (rh) { 1114*ece92f85SJason Jin case 5: 1115*ece92f85SJason Jin store_data_long(srcoffset, srcval | mask); 1116*ece92f85SJason Jin break; 1117*ece92f85SJason Jin case 6: 1118*ece92f85SJason Jin store_data_long(srcoffset, srcval & ~mask); 1119*ece92f85SJason Jin break; 1120*ece92f85SJason Jin case 7: 1121*ece92f85SJason Jin store_data_long(srcoffset, srcval ^ mask); 1122*ece92f85SJason Jin break; 1123*ece92f85SJason Jin default: 1124*ece92f85SJason Jin break; 1125*ece92f85SJason Jin } 1126*ece92f85SJason Jin } else { 1127*ece92f85SJason Jin u16 srcval, mask; 1128*ece92f85SJason Jin 1129*ece92f85SJason Jin bit = shift & 0xF; 1130*ece92f85SJason Jin srcval = fetch_data_word(srcoffset); 1131*ece92f85SJason Jin mask = (0x1 << bit); 1132*ece92f85SJason Jin CONDITIONAL_SET_FLAG(srcval & mask,F_CF); 1133*ece92f85SJason Jin switch (rh) { 1134*ece92f85SJason Jin case 5: 1135*ece92f85SJason Jin store_data_word(srcoffset, srcval | mask); 1136*ece92f85SJason Jin break; 1137*ece92f85SJason Jin case 6: 1138*ece92f85SJason Jin store_data_word(srcoffset, srcval & ~mask); 1139*ece92f85SJason Jin break; 1140*ece92f85SJason Jin case 7: 1141*ece92f85SJason Jin store_data_word(srcoffset, srcval ^ mask); 1142*ece92f85SJason Jin break; 1143*ece92f85SJason Jin default: 1144*ece92f85SJason Jin break; 1145*ece92f85SJason Jin } 1146*ece92f85SJason Jin } 1147*ece92f85SJason Jin } else { /* register to register */ 1148*ece92f85SJason Jin if (M.x86.mode & SYSMODE_PREFIX_DATA) { 1149*ece92f85SJason Jin u32 *srcreg; 1150*ece92f85SJason Jin u32 mask; 1151*ece92f85SJason Jin 1152*ece92f85SJason Jin srcreg = DECODE_RM_LONG_REGISTER(rl); 1153*ece92f85SJason Jin shift = fetch_byte_imm(); 1154*ece92f85SJason Jin DECODE_PRINTF2(",%d\n", shift); 1155*ece92f85SJason Jin TRACE_AND_STEP(); 1156*ece92f85SJason Jin bit = shift & 0x1F; 1157*ece92f85SJason Jin mask = (0x1 << bit); 1158*ece92f85SJason Jin CONDITIONAL_SET_FLAG(*srcreg & mask,F_CF); 1159*ece92f85SJason Jin switch (rh) { 1160*ece92f85SJason Jin case 5: 1161*ece92f85SJason Jin *srcreg |= mask; 1162*ece92f85SJason Jin break; 1163*ece92f85SJason Jin case 6: 1164*ece92f85SJason Jin *srcreg &= ~mask; 1165*ece92f85SJason Jin break; 1166*ece92f85SJason Jin case 7: 1167*ece92f85SJason Jin *srcreg ^= mask; 1168*ece92f85SJason Jin break; 1169*ece92f85SJason Jin default: 1170*ece92f85SJason Jin break; 1171*ece92f85SJason Jin } 1172*ece92f85SJason Jin } else { 1173*ece92f85SJason Jin u16 *srcreg; 1174*ece92f85SJason Jin u16 mask; 1175*ece92f85SJason Jin 1176*ece92f85SJason Jin srcreg = DECODE_RM_WORD_REGISTER(rl); 1177*ece92f85SJason Jin shift = fetch_byte_imm(); 1178*ece92f85SJason Jin DECODE_PRINTF2(",%d\n", shift); 1179*ece92f85SJason Jin TRACE_AND_STEP(); 1180*ece92f85SJason Jin bit = shift & 0xF; 1181*ece92f85SJason Jin mask = (0x1 << bit); 1182*ece92f85SJason Jin CONDITIONAL_SET_FLAG(*srcreg & mask,F_CF); 1183*ece92f85SJason Jin switch (rh) { 1184*ece92f85SJason Jin case 5: 1185*ece92f85SJason Jin *srcreg |= mask; 1186*ece92f85SJason Jin break; 1187*ece92f85SJason Jin case 6: 1188*ece92f85SJason Jin *srcreg &= ~mask; 1189*ece92f85SJason Jin break; 1190*ece92f85SJason Jin case 7: 1191*ece92f85SJason Jin *srcreg ^= mask; 1192*ece92f85SJason Jin break; 1193*ece92f85SJason Jin default: 1194*ece92f85SJason Jin break; 1195*ece92f85SJason Jin } 1196*ece92f85SJason Jin } 1197*ece92f85SJason Jin } 1198*ece92f85SJason Jin DECODE_CLEAR_SEGOVR(); 1199*ece92f85SJason Jin END_OF_INSTR(); 1200*ece92f85SJason Jin } 1201*ece92f85SJason Jin 1202*ece92f85SJason Jin /**************************************************************************** 1203*ece92f85SJason Jin REMARKS: 1204*ece92f85SJason Jin Handles opcode 0x0f,0xbb 1205*ece92f85SJason Jin ****************************************************************************/ 1206*ece92f85SJason Jin void x86emuOp2_btc_R(u8 X86EMU_UNUSED(op2)) 1207*ece92f85SJason Jin { 1208*ece92f85SJason Jin int mod, rl, rh; 1209*ece92f85SJason Jin uint srcoffset; 1210*ece92f85SJason Jin int bit,disp; 1211*ece92f85SJason Jin 1212*ece92f85SJason Jin START_OF_INSTR(); 1213*ece92f85SJason Jin DECODE_PRINTF("BTC\t"); 1214*ece92f85SJason Jin FETCH_DECODE_MODRM(mod, rh, rl); 1215*ece92f85SJason Jin if (mod < 3) { 1216*ece92f85SJason Jin srcoffset = decode_rmXX_address(mod, rl); 1217*ece92f85SJason Jin DECODE_PRINTF(","); 1218*ece92f85SJason Jin if (M.x86.mode & SYSMODE_PREFIX_DATA) { 1219*ece92f85SJason Jin u32 srcval,mask; 1220*ece92f85SJason Jin u32 *shiftreg; 1221*ece92f85SJason Jin 1222*ece92f85SJason Jin shiftreg = DECODE_RM_LONG_REGISTER(rh); 1223*ece92f85SJason Jin TRACE_AND_STEP(); 1224*ece92f85SJason Jin bit = *shiftreg & 0x1F; 1225*ece92f85SJason Jin disp = (s16)*shiftreg >> 5; 1226*ece92f85SJason Jin srcval = fetch_data_long(srcoffset+disp); 1227*ece92f85SJason Jin mask = (0x1 << bit); 1228*ece92f85SJason Jin CONDITIONAL_SET_FLAG(srcval & mask,F_CF); 1229*ece92f85SJason Jin store_data_long(srcoffset+disp, srcval ^ mask); 1230*ece92f85SJason Jin } else { 1231*ece92f85SJason Jin u16 srcval,mask; 1232*ece92f85SJason Jin u16 *shiftreg; 1233*ece92f85SJason Jin 1234*ece92f85SJason Jin shiftreg = DECODE_RM_WORD_REGISTER(rh); 1235*ece92f85SJason Jin TRACE_AND_STEP(); 1236*ece92f85SJason Jin bit = *shiftreg & 0xF; 1237*ece92f85SJason Jin disp = (s16)*shiftreg >> 4; 1238*ece92f85SJason Jin srcval = fetch_data_word(srcoffset+disp); 1239*ece92f85SJason Jin mask = (u16)(0x1 << bit); 1240*ece92f85SJason Jin CONDITIONAL_SET_FLAG(srcval & mask,F_CF); 1241*ece92f85SJason Jin store_data_word(srcoffset+disp, (u16)(srcval ^ mask)); 1242*ece92f85SJason Jin } 1243*ece92f85SJason Jin } else { /* register to register */ 1244*ece92f85SJason Jin if (M.x86.mode & SYSMODE_PREFIX_DATA) { 1245*ece92f85SJason Jin u32 *srcreg,*shiftreg; 1246*ece92f85SJason Jin u32 mask; 1247*ece92f85SJason Jin 1248*ece92f85SJason Jin srcreg = DECODE_RM_LONG_REGISTER(rl); 1249*ece92f85SJason Jin DECODE_PRINTF(","); 1250*ece92f85SJason Jin shiftreg = DECODE_RM_LONG_REGISTER(rh); 1251*ece92f85SJason Jin TRACE_AND_STEP(); 1252*ece92f85SJason Jin bit = *shiftreg & 0x1F; 1253*ece92f85SJason Jin mask = (0x1 << bit); 1254*ece92f85SJason Jin CONDITIONAL_SET_FLAG(*srcreg & mask,F_CF); 1255*ece92f85SJason Jin *srcreg ^= mask; 1256*ece92f85SJason Jin } else { 1257*ece92f85SJason Jin u16 *srcreg,*shiftreg; 1258*ece92f85SJason Jin u16 mask; 1259*ece92f85SJason Jin 1260*ece92f85SJason Jin srcreg = DECODE_RM_WORD_REGISTER(rl); 1261*ece92f85SJason Jin DECODE_PRINTF(","); 1262*ece92f85SJason Jin shiftreg = DECODE_RM_WORD_REGISTER(rh); 1263*ece92f85SJason Jin TRACE_AND_STEP(); 1264*ece92f85SJason Jin bit = *shiftreg & 0xF; 1265*ece92f85SJason Jin mask = (u16)(0x1 << bit); 1266*ece92f85SJason Jin CONDITIONAL_SET_FLAG(*srcreg & mask,F_CF); 1267*ece92f85SJason Jin *srcreg ^= mask; 1268*ece92f85SJason Jin } 1269*ece92f85SJason Jin } 1270*ece92f85SJason Jin DECODE_CLEAR_SEGOVR(); 1271*ece92f85SJason Jin END_OF_INSTR(); 1272*ece92f85SJason Jin } 1273*ece92f85SJason Jin 1274*ece92f85SJason Jin /**************************************************************************** 1275*ece92f85SJason Jin REMARKS: 1276*ece92f85SJason Jin Handles opcode 0x0f,0xbc 1277*ece92f85SJason Jin ****************************************************************************/ 1278*ece92f85SJason Jin void x86emuOp2_bsf(u8 X86EMU_UNUSED(op2)) 1279*ece92f85SJason Jin { 1280*ece92f85SJason Jin int mod, rl, rh; 1281*ece92f85SJason Jin uint srcoffset; 1282*ece92f85SJason Jin 1283*ece92f85SJason Jin START_OF_INSTR(); 1284*ece92f85SJason Jin DECODE_PRINTF("BSF\n"); 1285*ece92f85SJason Jin FETCH_DECODE_MODRM(mod, rh, rl); 1286*ece92f85SJason Jin if (mod < 3) { 1287*ece92f85SJason Jin srcoffset = decode_rmXX_address(mod, rl); 1288*ece92f85SJason Jin DECODE_PRINTF(","); 1289*ece92f85SJason Jin if (M.x86.mode & SYSMODE_PREFIX_DATA) { 1290*ece92f85SJason Jin u32 srcval, *dstreg; 1291*ece92f85SJason Jin 1292*ece92f85SJason Jin dstreg = DECODE_RM_LONG_REGISTER(rh); 1293*ece92f85SJason Jin TRACE_AND_STEP(); 1294*ece92f85SJason Jin srcval = fetch_data_long(srcoffset); 1295*ece92f85SJason Jin CONDITIONAL_SET_FLAG(srcval == 0, F_ZF); 1296*ece92f85SJason Jin for(*dstreg = 0; *dstreg < 32; (*dstreg)++) 1297*ece92f85SJason Jin if ((srcval >> *dstreg) & 1) break; 1298*ece92f85SJason Jin } else { 1299*ece92f85SJason Jin u16 srcval, *dstreg; 1300*ece92f85SJason Jin 1301*ece92f85SJason Jin dstreg = DECODE_RM_WORD_REGISTER(rh); 1302*ece92f85SJason Jin TRACE_AND_STEP(); 1303*ece92f85SJason Jin srcval = fetch_data_word(srcoffset); 1304*ece92f85SJason Jin CONDITIONAL_SET_FLAG(srcval == 0, F_ZF); 1305*ece92f85SJason Jin for(*dstreg = 0; *dstreg < 16; (*dstreg)++) 1306*ece92f85SJason Jin if ((srcval >> *dstreg) & 1) break; 1307*ece92f85SJason Jin } 1308*ece92f85SJason Jin } else { /* register to register */ 1309*ece92f85SJason Jin if (M.x86.mode & SYSMODE_PREFIX_DATA) { 1310*ece92f85SJason Jin u32 *srcreg, *dstreg; 1311*ece92f85SJason Jin 1312*ece92f85SJason Jin srcreg = DECODE_RM_LONG_REGISTER(rl); 1313*ece92f85SJason Jin DECODE_PRINTF(","); 1314*ece92f85SJason Jin dstreg = DECODE_RM_LONG_REGISTER(rh); 1315*ece92f85SJason Jin TRACE_AND_STEP(); 1316*ece92f85SJason Jin CONDITIONAL_SET_FLAG(*srcreg == 0, F_ZF); 1317*ece92f85SJason Jin for(*dstreg = 0; *dstreg < 32; (*dstreg)++) 1318*ece92f85SJason Jin if ((*srcreg >> *dstreg) & 1) break; 1319*ece92f85SJason Jin } else { 1320*ece92f85SJason Jin u16 *srcreg, *dstreg; 1321*ece92f85SJason Jin 1322*ece92f85SJason Jin srcreg = DECODE_RM_WORD_REGISTER(rl); 1323*ece92f85SJason Jin DECODE_PRINTF(","); 1324*ece92f85SJason Jin dstreg = DECODE_RM_WORD_REGISTER(rh); 1325*ece92f85SJason Jin TRACE_AND_STEP(); 1326*ece92f85SJason Jin CONDITIONAL_SET_FLAG(*srcreg == 0, F_ZF); 1327*ece92f85SJason Jin for(*dstreg = 0; *dstreg < 16; (*dstreg)++) 1328*ece92f85SJason Jin if ((*srcreg >> *dstreg) & 1) break; 1329*ece92f85SJason Jin } 1330*ece92f85SJason Jin } 1331*ece92f85SJason Jin DECODE_CLEAR_SEGOVR(); 1332*ece92f85SJason Jin END_OF_INSTR(); 1333*ece92f85SJason Jin } 1334*ece92f85SJason Jin 1335*ece92f85SJason Jin /**************************************************************************** 1336*ece92f85SJason Jin REMARKS: 1337*ece92f85SJason Jin Handles opcode 0x0f,0xbd 1338*ece92f85SJason Jin ****************************************************************************/ 1339*ece92f85SJason Jin void x86emuOp2_bsr(u8 X86EMU_UNUSED(op2)) 1340*ece92f85SJason Jin { 1341*ece92f85SJason Jin int mod, rl, rh; 1342*ece92f85SJason Jin uint srcoffset; 1343*ece92f85SJason Jin 1344*ece92f85SJason Jin START_OF_INSTR(); 1345*ece92f85SJason Jin DECODE_PRINTF("BSF\n"); 1346*ece92f85SJason Jin FETCH_DECODE_MODRM(mod, rh, rl); 1347*ece92f85SJason Jin if (mod < 3) { 1348*ece92f85SJason Jin srcoffset = decode_rmXX_address(mod, rl); 1349*ece92f85SJason Jin DECODE_PRINTF(","); 1350*ece92f85SJason Jin if (M.x86.mode & SYSMODE_PREFIX_DATA) { 1351*ece92f85SJason Jin u32 srcval, *dstreg; 1352*ece92f85SJason Jin 1353*ece92f85SJason Jin dstreg = DECODE_RM_LONG_REGISTER(rh); 1354*ece92f85SJason Jin TRACE_AND_STEP(); 1355*ece92f85SJason Jin srcval = fetch_data_long(srcoffset); 1356*ece92f85SJason Jin CONDITIONAL_SET_FLAG(srcval == 0, F_ZF); 1357*ece92f85SJason Jin for(*dstreg = 31; *dstreg > 0; (*dstreg)--) 1358*ece92f85SJason Jin if ((srcval >> *dstreg) & 1) break; 1359*ece92f85SJason Jin } else { 1360*ece92f85SJason Jin u16 srcval, *dstreg; 1361*ece92f85SJason Jin 1362*ece92f85SJason Jin dstreg = DECODE_RM_WORD_REGISTER(rh); 1363*ece92f85SJason Jin TRACE_AND_STEP(); 1364*ece92f85SJason Jin srcval = fetch_data_word(srcoffset); 1365*ece92f85SJason Jin CONDITIONAL_SET_FLAG(srcval == 0, F_ZF); 1366*ece92f85SJason Jin for(*dstreg = 15; *dstreg > 0; (*dstreg)--) 1367*ece92f85SJason Jin if ((srcval >> *dstreg) & 1) break; 1368*ece92f85SJason Jin } 1369*ece92f85SJason Jin } else { /* register to register */ 1370*ece92f85SJason Jin if (M.x86.mode & SYSMODE_PREFIX_DATA) { 1371*ece92f85SJason Jin u32 *srcreg, *dstreg; 1372*ece92f85SJason Jin 1373*ece92f85SJason Jin srcreg = DECODE_RM_LONG_REGISTER(rl); 1374*ece92f85SJason Jin DECODE_PRINTF(","); 1375*ece92f85SJason Jin dstreg = DECODE_RM_LONG_REGISTER(rh); 1376*ece92f85SJason Jin TRACE_AND_STEP(); 1377*ece92f85SJason Jin CONDITIONAL_SET_FLAG(*srcreg == 0, F_ZF); 1378*ece92f85SJason Jin for(*dstreg = 31; *dstreg > 0; (*dstreg)--) 1379*ece92f85SJason Jin if ((*srcreg >> *dstreg) & 1) break; 1380*ece92f85SJason Jin } else { 1381*ece92f85SJason Jin u16 *srcreg, *dstreg; 1382*ece92f85SJason Jin 1383*ece92f85SJason Jin srcreg = DECODE_RM_WORD_REGISTER(rl); 1384*ece92f85SJason Jin DECODE_PRINTF(","); 1385*ece92f85SJason Jin dstreg = DECODE_RM_WORD_REGISTER(rh); 1386*ece92f85SJason Jin TRACE_AND_STEP(); 1387*ece92f85SJason Jin CONDITIONAL_SET_FLAG(*srcreg == 0, F_ZF); 1388*ece92f85SJason Jin for(*dstreg = 15; *dstreg > 0; (*dstreg)--) 1389*ece92f85SJason Jin if ((*srcreg >> *dstreg) & 1) break; 1390*ece92f85SJason Jin } 1391*ece92f85SJason Jin } 1392*ece92f85SJason Jin DECODE_CLEAR_SEGOVR(); 1393*ece92f85SJason Jin END_OF_INSTR(); 1394*ece92f85SJason Jin } 1395*ece92f85SJason Jin 1396*ece92f85SJason Jin /**************************************************************************** 1397*ece92f85SJason Jin REMARKS: 1398*ece92f85SJason Jin Handles opcode 0x0f,0xbe 1399*ece92f85SJason Jin ****************************************************************************/ 1400*ece92f85SJason Jin void x86emuOp2_movsx_byte_R_RM(u8 X86EMU_UNUSED(op2)) 1401*ece92f85SJason Jin { 1402*ece92f85SJason Jin int mod, rl, rh; 1403*ece92f85SJason Jin uint srcoffset; 1404*ece92f85SJason Jin 1405*ece92f85SJason Jin START_OF_INSTR(); 1406*ece92f85SJason Jin DECODE_PRINTF("MOVSX\t"); 1407*ece92f85SJason Jin FETCH_DECODE_MODRM(mod, rh, rl); 1408*ece92f85SJason Jin if (mod < 3) { 1409*ece92f85SJason Jin if (M.x86.mode & SYSMODE_PREFIX_DATA) { 1410*ece92f85SJason Jin u32 *destreg; 1411*ece92f85SJason Jin u32 srcval; 1412*ece92f85SJason Jin 1413*ece92f85SJason Jin destreg = DECODE_RM_LONG_REGISTER(rh); 1414*ece92f85SJason Jin DECODE_PRINTF(","); 1415*ece92f85SJason Jin srcoffset = decode_rmXX_address(mod, rl); 1416*ece92f85SJason Jin srcval = (s32)((s8)fetch_data_byte(srcoffset)); 1417*ece92f85SJason Jin DECODE_PRINTF("\n"); 1418*ece92f85SJason Jin TRACE_AND_STEP(); 1419*ece92f85SJason Jin *destreg = srcval; 1420*ece92f85SJason Jin } else { 1421*ece92f85SJason Jin u16 *destreg; 1422*ece92f85SJason Jin u16 srcval; 1423*ece92f85SJason Jin 1424*ece92f85SJason Jin destreg = DECODE_RM_WORD_REGISTER(rh); 1425*ece92f85SJason Jin DECODE_PRINTF(","); 1426*ece92f85SJason Jin srcoffset = decode_rmXX_address(mod, rl); 1427*ece92f85SJason Jin srcval = (s16)((s8)fetch_data_byte(srcoffset)); 1428*ece92f85SJason Jin DECODE_PRINTF("\n"); 1429*ece92f85SJason Jin TRACE_AND_STEP(); 1430*ece92f85SJason Jin *destreg = srcval; 1431*ece92f85SJason Jin } 1432*ece92f85SJason Jin } else { /* register to register */ 1433*ece92f85SJason Jin if (M.x86.mode & SYSMODE_PREFIX_DATA) { 1434*ece92f85SJason Jin u32 *destreg; 1435*ece92f85SJason Jin u8 *srcreg; 1436*ece92f85SJason Jin 1437*ece92f85SJason Jin destreg = DECODE_RM_LONG_REGISTER(rh); 1438*ece92f85SJason Jin DECODE_PRINTF(","); 1439*ece92f85SJason Jin srcreg = DECODE_RM_BYTE_REGISTER(rl); 1440*ece92f85SJason Jin DECODE_PRINTF("\n"); 1441*ece92f85SJason Jin TRACE_AND_STEP(); 1442*ece92f85SJason Jin *destreg = (s32)((s8)*srcreg); 1443*ece92f85SJason Jin } else { 1444*ece92f85SJason Jin u16 *destreg; 1445*ece92f85SJason Jin u8 *srcreg; 1446*ece92f85SJason Jin 1447*ece92f85SJason Jin destreg = DECODE_RM_WORD_REGISTER(rh); 1448*ece92f85SJason Jin DECODE_PRINTF(","); 1449*ece92f85SJason Jin srcreg = DECODE_RM_BYTE_REGISTER(rl); 1450*ece92f85SJason Jin DECODE_PRINTF("\n"); 1451*ece92f85SJason Jin TRACE_AND_STEP(); 1452*ece92f85SJason Jin *destreg = (s16)((s8)*srcreg); 1453*ece92f85SJason Jin } 1454*ece92f85SJason Jin } 1455*ece92f85SJason Jin DECODE_CLEAR_SEGOVR(); 1456*ece92f85SJason Jin END_OF_INSTR(); 1457*ece92f85SJason Jin } 1458*ece92f85SJason Jin 1459*ece92f85SJason Jin /**************************************************************************** 1460*ece92f85SJason Jin REMARKS: 1461*ece92f85SJason Jin Handles opcode 0x0f,0xbf 1462*ece92f85SJason Jin ****************************************************************************/ 1463*ece92f85SJason Jin void x86emuOp2_movsx_word_R_RM(u8 X86EMU_UNUSED(op2)) 1464*ece92f85SJason Jin { 1465*ece92f85SJason Jin int mod, rl, rh; 1466*ece92f85SJason Jin uint srcoffset; 1467*ece92f85SJason Jin u32 *destreg; 1468*ece92f85SJason Jin u32 srcval; 1469*ece92f85SJason Jin u16 *srcreg; 1470*ece92f85SJason Jin 1471*ece92f85SJason Jin START_OF_INSTR(); 1472*ece92f85SJason Jin DECODE_PRINTF("MOVSX\t"); 1473*ece92f85SJason Jin FETCH_DECODE_MODRM(mod, rh, rl); 1474*ece92f85SJason Jin if (mod < 3) { 1475*ece92f85SJason Jin destreg = DECODE_RM_LONG_REGISTER(rh); 1476*ece92f85SJason Jin DECODE_PRINTF(","); 1477*ece92f85SJason Jin srcoffset = decode_rmXX_address(mod, rl); 1478*ece92f85SJason Jin srcval = (s32)((s16)fetch_data_word(srcoffset)); 1479*ece92f85SJason Jin DECODE_PRINTF("\n"); 1480*ece92f85SJason Jin TRACE_AND_STEP(); 1481*ece92f85SJason Jin *destreg = srcval; 1482*ece92f85SJason Jin } else { /* register to register */ 1483*ece92f85SJason Jin destreg = DECODE_RM_LONG_REGISTER(rh); 1484*ece92f85SJason Jin DECODE_PRINTF(","); 1485*ece92f85SJason Jin srcreg = DECODE_RM_WORD_REGISTER(rl); 1486*ece92f85SJason Jin DECODE_PRINTF("\n"); 1487*ece92f85SJason Jin TRACE_AND_STEP(); 1488*ece92f85SJason Jin *destreg = (s32)((s16)*srcreg); 1489*ece92f85SJason Jin } 1490*ece92f85SJason Jin DECODE_CLEAR_SEGOVR(); 1491*ece92f85SJason Jin END_OF_INSTR(); 1492*ece92f85SJason Jin } 1493*ece92f85SJason Jin 1494*ece92f85SJason Jin /*************************************************************************** 1495*ece92f85SJason Jin * Double byte operation code table: 1496*ece92f85SJason Jin **************************************************************************/ 1497*ece92f85SJason Jin void (*x86emu_optab2[256])(u8) __attribute__((section(".got2"))) = 1498*ece92f85SJason Jin { 1499*ece92f85SJason Jin /* 0x00 */ x86emuOp2_illegal_op, /* Group F (ring 0 PM) */ 1500*ece92f85SJason Jin /* 0x01 */ x86emuOp2_illegal_op, /* Group G (ring 0 PM) */ 1501*ece92f85SJason Jin /* 0x02 */ x86emuOp2_illegal_op, /* lar (ring 0 PM) */ 1502*ece92f85SJason Jin /* 0x03 */ x86emuOp2_illegal_op, /* lsl (ring 0 PM) */ 1503*ece92f85SJason Jin /* 0x04 */ x86emuOp2_illegal_op, 1504*ece92f85SJason Jin /* 0x05 */ x86emuOp2_illegal_op, /* loadall (undocumented) */ 1505*ece92f85SJason Jin /* 0x06 */ x86emuOp2_illegal_op, /* clts (ring 0 PM) */ 1506*ece92f85SJason Jin /* 0x07 */ x86emuOp2_illegal_op, /* loadall (undocumented) */ 1507*ece92f85SJason Jin /* 0x08 */ x86emuOp2_illegal_op, /* invd (ring 0 PM) */ 1508*ece92f85SJason Jin /* 0x09 */ x86emuOp2_illegal_op, /* wbinvd (ring 0 PM) */ 1509*ece92f85SJason Jin /* 0x0a */ x86emuOp2_illegal_op, 1510*ece92f85SJason Jin /* 0x0b */ x86emuOp2_illegal_op, 1511*ece92f85SJason Jin /* 0x0c */ x86emuOp2_illegal_op, 1512*ece92f85SJason Jin /* 0x0d */ x86emuOp2_illegal_op, 1513*ece92f85SJason Jin /* 0x0e */ x86emuOp2_illegal_op, 1514*ece92f85SJason Jin /* 0x0f */ x86emuOp2_illegal_op, 1515*ece92f85SJason Jin 1516*ece92f85SJason Jin /* 0x10 */ x86emuOp2_illegal_op, 1517*ece92f85SJason Jin /* 0x11 */ x86emuOp2_illegal_op, 1518*ece92f85SJason Jin /* 0x12 */ x86emuOp2_illegal_op, 1519*ece92f85SJason Jin /* 0x13 */ x86emuOp2_illegal_op, 1520*ece92f85SJason Jin /* 0x14 */ x86emuOp2_illegal_op, 1521*ece92f85SJason Jin /* 0x15 */ x86emuOp2_illegal_op, 1522*ece92f85SJason Jin /* 0x16 */ x86emuOp2_illegal_op, 1523*ece92f85SJason Jin /* 0x17 */ x86emuOp2_illegal_op, 1524*ece92f85SJason Jin /* 0x18 */ x86emuOp2_illegal_op, 1525*ece92f85SJason Jin /* 0x19 */ x86emuOp2_illegal_op, 1526*ece92f85SJason Jin /* 0x1a */ x86emuOp2_illegal_op, 1527*ece92f85SJason Jin /* 0x1b */ x86emuOp2_illegal_op, 1528*ece92f85SJason Jin /* 0x1c */ x86emuOp2_illegal_op, 1529*ece92f85SJason Jin /* 0x1d */ x86emuOp2_illegal_op, 1530*ece92f85SJason Jin /* 0x1e */ x86emuOp2_illegal_op, 1531*ece92f85SJason Jin /* 0x1f */ x86emuOp2_illegal_op, 1532*ece92f85SJason Jin 1533*ece92f85SJason Jin /* 0x20 */ x86emuOp2_illegal_op, /* mov reg32,creg (ring 0 PM) */ 1534*ece92f85SJason Jin /* 0x21 */ x86emuOp2_illegal_op, /* mov reg32,dreg (ring 0 PM) */ 1535*ece92f85SJason Jin /* 0x22 */ x86emuOp2_illegal_op, /* mov creg,reg32 (ring 0 PM) */ 1536*ece92f85SJason Jin /* 0x23 */ x86emuOp2_illegal_op, /* mov dreg,reg32 (ring 0 PM) */ 1537*ece92f85SJason Jin /* 0x24 */ x86emuOp2_illegal_op, /* mov reg32,treg (ring 0 PM) */ 1538*ece92f85SJason Jin /* 0x25 */ x86emuOp2_illegal_op, 1539*ece92f85SJason Jin /* 0x26 */ x86emuOp2_illegal_op, /* mov treg,reg32 (ring 0 PM) */ 1540*ece92f85SJason Jin /* 0x27 */ x86emuOp2_illegal_op, 1541*ece92f85SJason Jin /* 0x28 */ x86emuOp2_illegal_op, 1542*ece92f85SJason Jin /* 0x29 */ x86emuOp2_illegal_op, 1543*ece92f85SJason Jin /* 0x2a */ x86emuOp2_illegal_op, 1544*ece92f85SJason Jin /* 0x2b */ x86emuOp2_illegal_op, 1545*ece92f85SJason Jin /* 0x2c */ x86emuOp2_illegal_op, 1546*ece92f85SJason Jin /* 0x2d */ x86emuOp2_illegal_op, 1547*ece92f85SJason Jin /* 0x2e */ x86emuOp2_illegal_op, 1548*ece92f85SJason Jin /* 0x2f */ x86emuOp2_illegal_op, 1549*ece92f85SJason Jin 1550*ece92f85SJason Jin /* 0x30 */ x86emuOp2_illegal_op, 1551*ece92f85SJason Jin /* 0x31 */ x86emuOp2_illegal_op, 1552*ece92f85SJason Jin /* 0x32 */ x86emuOp2_illegal_op, 1553*ece92f85SJason Jin /* 0x33 */ x86emuOp2_illegal_op, 1554*ece92f85SJason Jin /* 0x34 */ x86emuOp2_illegal_op, 1555*ece92f85SJason Jin /* 0x35 */ x86emuOp2_illegal_op, 1556*ece92f85SJason Jin /* 0x36 */ x86emuOp2_illegal_op, 1557*ece92f85SJason Jin /* 0x37 */ x86emuOp2_illegal_op, 1558*ece92f85SJason Jin /* 0x38 */ x86emuOp2_illegal_op, 1559*ece92f85SJason Jin /* 0x39 */ x86emuOp2_illegal_op, 1560*ece92f85SJason Jin /* 0x3a */ x86emuOp2_illegal_op, 1561*ece92f85SJason Jin /* 0x3b */ x86emuOp2_illegal_op, 1562*ece92f85SJason Jin /* 0x3c */ x86emuOp2_illegal_op, 1563*ece92f85SJason Jin /* 0x3d */ x86emuOp2_illegal_op, 1564*ece92f85SJason Jin /* 0x3e */ x86emuOp2_illegal_op, 1565*ece92f85SJason Jin /* 0x3f */ x86emuOp2_illegal_op, 1566*ece92f85SJason Jin 1567*ece92f85SJason Jin /* 0x40 */ x86emuOp2_illegal_op, 1568*ece92f85SJason Jin /* 0x41 */ x86emuOp2_illegal_op, 1569*ece92f85SJason Jin /* 0x42 */ x86emuOp2_illegal_op, 1570*ece92f85SJason Jin /* 0x43 */ x86emuOp2_illegal_op, 1571*ece92f85SJason Jin /* 0x44 */ x86emuOp2_illegal_op, 1572*ece92f85SJason Jin /* 0x45 */ x86emuOp2_illegal_op, 1573*ece92f85SJason Jin /* 0x46 */ x86emuOp2_illegal_op, 1574*ece92f85SJason Jin /* 0x47 */ x86emuOp2_illegal_op, 1575*ece92f85SJason Jin /* 0x48 */ x86emuOp2_illegal_op, 1576*ece92f85SJason Jin /* 0x49 */ x86emuOp2_illegal_op, 1577*ece92f85SJason Jin /* 0x4a */ x86emuOp2_illegal_op, 1578*ece92f85SJason Jin /* 0x4b */ x86emuOp2_illegal_op, 1579*ece92f85SJason Jin /* 0x4c */ x86emuOp2_illegal_op, 1580*ece92f85SJason Jin /* 0x4d */ x86emuOp2_illegal_op, 1581*ece92f85SJason Jin /* 0x4e */ x86emuOp2_illegal_op, 1582*ece92f85SJason Jin /* 0x4f */ x86emuOp2_illegal_op, 1583*ece92f85SJason Jin 1584*ece92f85SJason Jin /* 0x50 */ x86emuOp2_illegal_op, 1585*ece92f85SJason Jin /* 0x51 */ x86emuOp2_illegal_op, 1586*ece92f85SJason Jin /* 0x52 */ x86emuOp2_illegal_op, 1587*ece92f85SJason Jin /* 0x53 */ x86emuOp2_illegal_op, 1588*ece92f85SJason Jin /* 0x54 */ x86emuOp2_illegal_op, 1589*ece92f85SJason Jin /* 0x55 */ x86emuOp2_illegal_op, 1590*ece92f85SJason Jin /* 0x56 */ x86emuOp2_illegal_op, 1591*ece92f85SJason Jin /* 0x57 */ x86emuOp2_illegal_op, 1592*ece92f85SJason Jin /* 0x58 */ x86emuOp2_illegal_op, 1593*ece92f85SJason Jin /* 0x59 */ x86emuOp2_illegal_op, 1594*ece92f85SJason Jin /* 0x5a */ x86emuOp2_illegal_op, 1595*ece92f85SJason Jin /* 0x5b */ x86emuOp2_illegal_op, 1596*ece92f85SJason Jin /* 0x5c */ x86emuOp2_illegal_op, 1597*ece92f85SJason Jin /* 0x5d */ x86emuOp2_illegal_op, 1598*ece92f85SJason Jin /* 0x5e */ x86emuOp2_illegal_op, 1599*ece92f85SJason Jin /* 0x5f */ x86emuOp2_illegal_op, 1600*ece92f85SJason Jin 1601*ece92f85SJason Jin /* 0x60 */ x86emuOp2_illegal_op, 1602*ece92f85SJason Jin /* 0x61 */ x86emuOp2_illegal_op, 1603*ece92f85SJason Jin /* 0x62 */ x86emuOp2_illegal_op, 1604*ece92f85SJason Jin /* 0x63 */ x86emuOp2_illegal_op, 1605*ece92f85SJason Jin /* 0x64 */ x86emuOp2_illegal_op, 1606*ece92f85SJason Jin /* 0x65 */ x86emuOp2_illegal_op, 1607*ece92f85SJason Jin /* 0x66 */ x86emuOp2_illegal_op, 1608*ece92f85SJason Jin /* 0x67 */ x86emuOp2_illegal_op, 1609*ece92f85SJason Jin /* 0x68 */ x86emuOp2_illegal_op, 1610*ece92f85SJason Jin /* 0x69 */ x86emuOp2_illegal_op, 1611*ece92f85SJason Jin /* 0x6a */ x86emuOp2_illegal_op, 1612*ece92f85SJason Jin /* 0x6b */ x86emuOp2_illegal_op, 1613*ece92f85SJason Jin /* 0x6c */ x86emuOp2_illegal_op, 1614*ece92f85SJason Jin /* 0x6d */ x86emuOp2_illegal_op, 1615*ece92f85SJason Jin /* 0x6e */ x86emuOp2_illegal_op, 1616*ece92f85SJason Jin /* 0x6f */ x86emuOp2_illegal_op, 1617*ece92f85SJason Jin 1618*ece92f85SJason Jin /* 0x70 */ x86emuOp2_illegal_op, 1619*ece92f85SJason Jin /* 0x71 */ x86emuOp2_illegal_op, 1620*ece92f85SJason Jin /* 0x72 */ x86emuOp2_illegal_op, 1621*ece92f85SJason Jin /* 0x73 */ x86emuOp2_illegal_op, 1622*ece92f85SJason Jin /* 0x74 */ x86emuOp2_illegal_op, 1623*ece92f85SJason Jin /* 0x75 */ x86emuOp2_illegal_op, 1624*ece92f85SJason Jin /* 0x76 */ x86emuOp2_illegal_op, 1625*ece92f85SJason Jin /* 0x77 */ x86emuOp2_illegal_op, 1626*ece92f85SJason Jin /* 0x78 */ x86emuOp2_illegal_op, 1627*ece92f85SJason Jin /* 0x79 */ x86emuOp2_illegal_op, 1628*ece92f85SJason Jin /* 0x7a */ x86emuOp2_illegal_op, 1629*ece92f85SJason Jin /* 0x7b */ x86emuOp2_illegal_op, 1630*ece92f85SJason Jin /* 0x7c */ x86emuOp2_illegal_op, 1631*ece92f85SJason Jin /* 0x7d */ x86emuOp2_illegal_op, 1632*ece92f85SJason Jin /* 0x7e */ x86emuOp2_illegal_op, 1633*ece92f85SJason Jin /* 0x7f */ x86emuOp2_illegal_op, 1634*ece92f85SJason Jin 1635*ece92f85SJason Jin /* 0x80 */ x86emuOp2_long_jump, 1636*ece92f85SJason Jin /* 0x81 */ x86emuOp2_long_jump, 1637*ece92f85SJason Jin /* 0x82 */ x86emuOp2_long_jump, 1638*ece92f85SJason Jin /* 0x83 */ x86emuOp2_long_jump, 1639*ece92f85SJason Jin /* 0x84 */ x86emuOp2_long_jump, 1640*ece92f85SJason Jin /* 0x85 */ x86emuOp2_long_jump, 1641*ece92f85SJason Jin /* 0x86 */ x86emuOp2_long_jump, 1642*ece92f85SJason Jin /* 0x87 */ x86emuOp2_long_jump, 1643*ece92f85SJason Jin /* 0x88 */ x86emuOp2_long_jump, 1644*ece92f85SJason Jin /* 0x89 */ x86emuOp2_long_jump, 1645*ece92f85SJason Jin /* 0x8a */ x86emuOp2_long_jump, 1646*ece92f85SJason Jin /* 0x8b */ x86emuOp2_long_jump, 1647*ece92f85SJason Jin /* 0x8c */ x86emuOp2_long_jump, 1648*ece92f85SJason Jin /* 0x8d */ x86emuOp2_long_jump, 1649*ece92f85SJason Jin /* 0x8e */ x86emuOp2_long_jump, 1650*ece92f85SJason Jin /* 0x8f */ x86emuOp2_long_jump, 1651*ece92f85SJason Jin 1652*ece92f85SJason Jin /* 0x90 */ x86emuOp2_set_byte, 1653*ece92f85SJason Jin /* 0x91 */ x86emuOp2_set_byte, 1654*ece92f85SJason Jin /* 0x92 */ x86emuOp2_set_byte, 1655*ece92f85SJason Jin /* 0x93 */ x86emuOp2_set_byte, 1656*ece92f85SJason Jin /* 0x94 */ x86emuOp2_set_byte, 1657*ece92f85SJason Jin /* 0x95 */ x86emuOp2_set_byte, 1658*ece92f85SJason Jin /* 0x96 */ x86emuOp2_set_byte, 1659*ece92f85SJason Jin /* 0x97 */ x86emuOp2_set_byte, 1660*ece92f85SJason Jin /* 0x98 */ x86emuOp2_set_byte, 1661*ece92f85SJason Jin /* 0x99 */ x86emuOp2_set_byte, 1662*ece92f85SJason Jin /* 0x9a */ x86emuOp2_set_byte, 1663*ece92f85SJason Jin /* 0x9b */ x86emuOp2_set_byte, 1664*ece92f85SJason Jin /* 0x9c */ x86emuOp2_set_byte, 1665*ece92f85SJason Jin /* 0x9d */ x86emuOp2_set_byte, 1666*ece92f85SJason Jin /* 0x9e */ x86emuOp2_set_byte, 1667*ece92f85SJason Jin /* 0x9f */ x86emuOp2_set_byte, 1668*ece92f85SJason Jin 1669*ece92f85SJason Jin /* 0xa0 */ x86emuOp2_push_FS, 1670*ece92f85SJason Jin /* 0xa1 */ x86emuOp2_pop_FS, 1671*ece92f85SJason Jin /* 0xa2 */ x86emuOp2_illegal_op, 1672*ece92f85SJason Jin /* 0xa3 */ x86emuOp2_bt_R, 1673*ece92f85SJason Jin /* 0xa4 */ x86emuOp2_shld_IMM, 1674*ece92f85SJason Jin /* 0xa5 */ x86emuOp2_shld_CL, 1675*ece92f85SJason Jin /* 0xa6 */ x86emuOp2_illegal_op, 1676*ece92f85SJason Jin /* 0xa7 */ x86emuOp2_illegal_op, 1677*ece92f85SJason Jin /* 0xa8 */ x86emuOp2_push_GS, 1678*ece92f85SJason Jin /* 0xa9 */ x86emuOp2_pop_GS, 1679*ece92f85SJason Jin /* 0xaa */ x86emuOp2_illegal_op, 1680*ece92f85SJason Jin /* 0xab */ x86emuOp2_bt_R, 1681*ece92f85SJason Jin /* 0xac */ x86emuOp2_shrd_IMM, 1682*ece92f85SJason Jin /* 0xad */ x86emuOp2_shrd_CL, 1683*ece92f85SJason Jin /* 0xae */ x86emuOp2_illegal_op, 1684*ece92f85SJason Jin /* 0xaf */ x86emuOp2_imul_R_RM, 1685*ece92f85SJason Jin 1686*ece92f85SJason Jin /* 0xb0 */ x86emuOp2_illegal_op, /* TODO: cmpxchg */ 1687*ece92f85SJason Jin /* 0xb1 */ x86emuOp2_illegal_op, /* TODO: cmpxchg */ 1688*ece92f85SJason Jin /* 0xb2 */ x86emuOp2_lss_R_IMM, 1689*ece92f85SJason Jin /* 0xb3 */ x86emuOp2_btr_R, 1690*ece92f85SJason Jin /* 0xb4 */ x86emuOp2_lfs_R_IMM, 1691*ece92f85SJason Jin /* 0xb5 */ x86emuOp2_lgs_R_IMM, 1692*ece92f85SJason Jin /* 0xb6 */ x86emuOp2_movzx_byte_R_RM, 1693*ece92f85SJason Jin /* 0xb7 */ x86emuOp2_movzx_word_R_RM, 1694*ece92f85SJason Jin /* 0xb8 */ x86emuOp2_illegal_op, 1695*ece92f85SJason Jin /* 0xb9 */ x86emuOp2_illegal_op, 1696*ece92f85SJason Jin /* 0xba */ x86emuOp2_btX_I, 1697*ece92f85SJason Jin /* 0xbb */ x86emuOp2_btc_R, 1698*ece92f85SJason Jin /* 0xbc */ x86emuOp2_bsf, 1699*ece92f85SJason Jin /* 0xbd */ x86emuOp2_bsr, 1700*ece92f85SJason Jin /* 0xbe */ x86emuOp2_movsx_byte_R_RM, 1701*ece92f85SJason Jin /* 0xbf */ x86emuOp2_movsx_word_R_RM, 1702*ece92f85SJason Jin 1703*ece92f85SJason Jin /* 0xc0 */ x86emuOp2_illegal_op, /* TODO: xadd */ 1704*ece92f85SJason Jin /* 0xc1 */ x86emuOp2_illegal_op, /* TODO: xadd */ 1705*ece92f85SJason Jin /* 0xc2 */ x86emuOp2_illegal_op, 1706*ece92f85SJason Jin /* 0xc3 */ x86emuOp2_illegal_op, 1707*ece92f85SJason Jin /* 0xc4 */ x86emuOp2_illegal_op, 1708*ece92f85SJason Jin /* 0xc5 */ x86emuOp2_illegal_op, 1709*ece92f85SJason Jin /* 0xc6 */ x86emuOp2_illegal_op, 1710*ece92f85SJason Jin /* 0xc7 */ x86emuOp2_illegal_op, 1711*ece92f85SJason Jin /* 0xc8 */ x86emuOp2_illegal_op, /* TODO: bswap */ 1712*ece92f85SJason Jin /* 0xc9 */ x86emuOp2_illegal_op, /* TODO: bswap */ 1713*ece92f85SJason Jin /* 0xca */ x86emuOp2_illegal_op, /* TODO: bswap */ 1714*ece92f85SJason Jin /* 0xcb */ x86emuOp2_illegal_op, /* TODO: bswap */ 1715*ece92f85SJason Jin /* 0xcc */ x86emuOp2_illegal_op, /* TODO: bswap */ 1716*ece92f85SJason Jin /* 0xcd */ x86emuOp2_illegal_op, /* TODO: bswap */ 1717*ece92f85SJason Jin /* 0xce */ x86emuOp2_illegal_op, /* TODO: bswap */ 1718*ece92f85SJason Jin /* 0xcf */ x86emuOp2_illegal_op, /* TODO: bswap */ 1719*ece92f85SJason Jin 1720*ece92f85SJason Jin /* 0xd0 */ x86emuOp2_illegal_op, 1721*ece92f85SJason Jin /* 0xd1 */ x86emuOp2_illegal_op, 1722*ece92f85SJason Jin /* 0xd2 */ x86emuOp2_illegal_op, 1723*ece92f85SJason Jin /* 0xd3 */ x86emuOp2_illegal_op, 1724*ece92f85SJason Jin /* 0xd4 */ x86emuOp2_illegal_op, 1725*ece92f85SJason Jin /* 0xd5 */ x86emuOp2_illegal_op, 1726*ece92f85SJason Jin /* 0xd6 */ x86emuOp2_illegal_op, 1727*ece92f85SJason Jin /* 0xd7 */ x86emuOp2_illegal_op, 1728*ece92f85SJason Jin /* 0xd8 */ x86emuOp2_illegal_op, 1729*ece92f85SJason Jin /* 0xd9 */ x86emuOp2_illegal_op, 1730*ece92f85SJason Jin /* 0xda */ x86emuOp2_illegal_op, 1731*ece92f85SJason Jin /* 0xdb */ x86emuOp2_illegal_op, 1732*ece92f85SJason Jin /* 0xdc */ x86emuOp2_illegal_op, 1733*ece92f85SJason Jin /* 0xdd */ x86emuOp2_illegal_op, 1734*ece92f85SJason Jin /* 0xde */ x86emuOp2_illegal_op, 1735*ece92f85SJason Jin /* 0xdf */ x86emuOp2_illegal_op, 1736*ece92f85SJason Jin 1737*ece92f85SJason Jin /* 0xe0 */ x86emuOp2_illegal_op, 1738*ece92f85SJason Jin /* 0xe1 */ x86emuOp2_illegal_op, 1739*ece92f85SJason Jin /* 0xe2 */ x86emuOp2_illegal_op, 1740*ece92f85SJason Jin /* 0xe3 */ x86emuOp2_illegal_op, 1741*ece92f85SJason Jin /* 0xe4 */ x86emuOp2_illegal_op, 1742*ece92f85SJason Jin /* 0xe5 */ x86emuOp2_illegal_op, 1743*ece92f85SJason Jin /* 0xe6 */ x86emuOp2_illegal_op, 1744*ece92f85SJason Jin /* 0xe7 */ x86emuOp2_illegal_op, 1745*ece92f85SJason Jin /* 0xe8 */ x86emuOp2_illegal_op, 1746*ece92f85SJason Jin /* 0xe9 */ x86emuOp2_illegal_op, 1747*ece92f85SJason Jin /* 0xea */ x86emuOp2_illegal_op, 1748*ece92f85SJason Jin /* 0xeb */ x86emuOp2_illegal_op, 1749*ece92f85SJason Jin /* 0xec */ x86emuOp2_illegal_op, 1750*ece92f85SJason Jin /* 0xed */ x86emuOp2_illegal_op, 1751*ece92f85SJason Jin /* 0xee */ x86emuOp2_illegal_op, 1752*ece92f85SJason Jin /* 0xef */ x86emuOp2_illegal_op, 1753*ece92f85SJason Jin 1754*ece92f85SJason Jin /* 0xf0 */ x86emuOp2_illegal_op, 1755*ece92f85SJason Jin /* 0xf1 */ x86emuOp2_illegal_op, 1756*ece92f85SJason Jin /* 0xf2 */ x86emuOp2_illegal_op, 1757*ece92f85SJason Jin /* 0xf3 */ x86emuOp2_illegal_op, 1758*ece92f85SJason Jin /* 0xf4 */ x86emuOp2_illegal_op, 1759*ece92f85SJason Jin /* 0xf5 */ x86emuOp2_illegal_op, 1760*ece92f85SJason Jin /* 0xf6 */ x86emuOp2_illegal_op, 1761*ece92f85SJason Jin /* 0xf7 */ x86emuOp2_illegal_op, 1762*ece92f85SJason Jin /* 0xf8 */ x86emuOp2_illegal_op, 1763*ece92f85SJason Jin /* 0xf9 */ x86emuOp2_illegal_op, 1764*ece92f85SJason Jin /* 0xfa */ x86emuOp2_illegal_op, 1765*ece92f85SJason Jin /* 0xfb */ x86emuOp2_illegal_op, 1766*ece92f85SJason Jin /* 0xfc */ x86emuOp2_illegal_op, 1767*ece92f85SJason Jin /* 0xfd */ x86emuOp2_illegal_op, 1768*ece92f85SJason Jin /* 0xfe */ x86emuOp2_illegal_op, 1769*ece92f85SJason Jin /* 0xff */ x86emuOp2_illegal_op, 1770*ece92f85SJason Jin }; 1771