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