Changeset 98795 in vbox for trunk/src/VBox/VMM/VMMAll/IEMAllInstructionsInterpretOnly.cpp
- Timestamp:
- Mar 1, 2023 12:05:10 AM (21 months ago)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/src/VBox/VMM/VMMAll/IEMAllInstructionsInterpretOnly.cpp
r98103 r98795 75 75 76 76 77 #ifdef _MSC_VER 78 # pragma warning(push) 79 # pragma warning(disable: 4702) /* Unreachable code like return in iemOp_Grp6_lldt.*/80 # endif77 /********************************************************************************************************************************* 78 * Defined Constants And Macros * 79 *********************************************************************************************************************************/ 80 #define g_apfnOneByteMap g_apfnIemInterpretOnlyOneByteMap 81 81 82 82 83 /*********************************************************************************************************************************84 * Global Variables *85 *********************************************************************************************************************************/86 #ifndef TST_IEM_CHECK_MC87 /** Function table for the ADD instruction. */88 IEM_STATIC const IEMOPBINSIZES g_iemAImpl_add =89 {90 iemAImpl_add_u8, iemAImpl_add_u8_locked,91 iemAImpl_add_u16, iemAImpl_add_u16_locked,92 iemAImpl_add_u32, iemAImpl_add_u32_locked,93 iemAImpl_add_u64, iemAImpl_add_u64_locked94 };95 83 96 /** Function table for the ADC instruction. */ 97 IEM_STATIC const IEMOPBINSIZES g_iemAImpl_adc = 98 { 99 iemAImpl_adc_u8, iemAImpl_adc_u8_locked, 100 iemAImpl_adc_u16, iemAImpl_adc_u16_locked, 101 iemAImpl_adc_u32, iemAImpl_adc_u32_locked, 102 iemAImpl_adc_u64, iemAImpl_adc_u64_locked 103 }; 84 /* 85 * Include common bits. 86 */ 87 #include "IEMAllInstructionsCommon.cpp.h" 104 88 105 /** Function table for the SUB instruction. */106 IEM_STATIC const IEMOPBINSIZES g_iemAImpl_sub =107 {108 iemAImpl_sub_u8, iemAImpl_sub_u8_locked,109 iemAImpl_sub_u16, iemAImpl_sub_u16_locked,110 iemAImpl_sub_u32, iemAImpl_sub_u32_locked,111 iemAImpl_sub_u64, iemAImpl_sub_u64_locked112 };113 114 /** Function table for the SBB instruction. */115 IEM_STATIC const IEMOPBINSIZES g_iemAImpl_sbb =116 {117 iemAImpl_sbb_u8, iemAImpl_sbb_u8_locked,118 iemAImpl_sbb_u16, iemAImpl_sbb_u16_locked,119 iemAImpl_sbb_u32, iemAImpl_sbb_u32_locked,120 iemAImpl_sbb_u64, iemAImpl_sbb_u64_locked121 };122 123 /** Function table for the OR instruction. */124 IEM_STATIC const IEMOPBINSIZES g_iemAImpl_or =125 {126 iemAImpl_or_u8, iemAImpl_or_u8_locked,127 iemAImpl_or_u16, iemAImpl_or_u16_locked,128 iemAImpl_or_u32, iemAImpl_or_u32_locked,129 iemAImpl_or_u64, iemAImpl_or_u64_locked130 };131 132 /** Function table for the XOR instruction. */133 IEM_STATIC const IEMOPBINSIZES g_iemAImpl_xor =134 {135 iemAImpl_xor_u8, iemAImpl_xor_u8_locked,136 iemAImpl_xor_u16, iemAImpl_xor_u16_locked,137 iemAImpl_xor_u32, iemAImpl_xor_u32_locked,138 iemAImpl_xor_u64, iemAImpl_xor_u64_locked139 };140 141 /** Function table for the AND instruction. */142 IEM_STATIC const IEMOPBINSIZES g_iemAImpl_and =143 {144 iemAImpl_and_u8, iemAImpl_and_u8_locked,145 iemAImpl_and_u16, iemAImpl_and_u16_locked,146 iemAImpl_and_u32, iemAImpl_and_u32_locked,147 iemAImpl_and_u64, iemAImpl_and_u64_locked148 };149 150 /** Function table for the CMP instruction.151 * @remarks Making operand order ASSUMPTIONS.152 */153 IEM_STATIC const IEMOPBINSIZES g_iemAImpl_cmp =154 {155 iemAImpl_cmp_u8, NULL,156 iemAImpl_cmp_u16, NULL,157 iemAImpl_cmp_u32, NULL,158 iemAImpl_cmp_u64, NULL159 };160 161 /** Function table for the TEST instruction.162 * @remarks Making operand order ASSUMPTIONS.163 */164 IEM_STATIC const IEMOPBINSIZES g_iemAImpl_test =165 {166 iemAImpl_test_u8, NULL,167 iemAImpl_test_u16, NULL,168 iemAImpl_test_u32, NULL,169 iemAImpl_test_u64, NULL170 };171 172 173 /** Function table for the BT instruction. */174 IEM_STATIC const IEMOPBINSIZES g_iemAImpl_bt =175 {176 NULL, NULL,177 iemAImpl_bt_u16, NULL,178 iemAImpl_bt_u32, NULL,179 iemAImpl_bt_u64, NULL180 };181 182 /** Function table for the BTC instruction. */183 IEM_STATIC const IEMOPBINSIZES g_iemAImpl_btc =184 {185 NULL, NULL,186 iemAImpl_btc_u16, iemAImpl_btc_u16_locked,187 iemAImpl_btc_u32, iemAImpl_btc_u32_locked,188 iemAImpl_btc_u64, iemAImpl_btc_u64_locked189 };190 191 /** Function table for the BTR instruction. */192 IEM_STATIC const IEMOPBINSIZES g_iemAImpl_btr =193 {194 NULL, NULL,195 iemAImpl_btr_u16, iemAImpl_btr_u16_locked,196 iemAImpl_btr_u32, iemAImpl_btr_u32_locked,197 iemAImpl_btr_u64, iemAImpl_btr_u64_locked198 };199 200 /** Function table for the BTS instruction. */201 IEM_STATIC const IEMOPBINSIZES g_iemAImpl_bts =202 {203 NULL, NULL,204 iemAImpl_bts_u16, iemAImpl_bts_u16_locked,205 iemAImpl_bts_u32, iemAImpl_bts_u32_locked,206 iemAImpl_bts_u64, iemAImpl_bts_u64_locked207 };208 209 /** Function table for the BSF instruction. */210 IEM_STATIC const IEMOPBINSIZES g_iemAImpl_bsf =211 {212 NULL, NULL,213 iemAImpl_bsf_u16, NULL,214 iemAImpl_bsf_u32, NULL,215 iemAImpl_bsf_u64, NULL216 };217 218 /** Function table for the BSF instruction, AMD EFLAGS variant. */219 IEM_STATIC const IEMOPBINSIZES g_iemAImpl_bsf_amd =220 {221 NULL, NULL,222 iemAImpl_bsf_u16_amd, NULL,223 iemAImpl_bsf_u32_amd, NULL,224 iemAImpl_bsf_u64_amd, NULL225 };226 227 /** Function table for the BSF instruction, Intel EFLAGS variant. */228 IEM_STATIC const IEMOPBINSIZES g_iemAImpl_bsf_intel =229 {230 NULL, NULL,231 iemAImpl_bsf_u16_intel, NULL,232 iemAImpl_bsf_u32_intel, NULL,233 iemAImpl_bsf_u64_intel, NULL234 };235 236 /** EFLAGS variation selection table for the BSF instruction. */237 IEM_STATIC const IEMOPBINSIZES * const g_iemAImpl_bsf_eflags[] =238 {239 &g_iemAImpl_bsf,240 &g_iemAImpl_bsf_intel,241 &g_iemAImpl_bsf_amd,242 &g_iemAImpl_bsf,243 };244 245 /** Function table for the BSR instruction. */246 IEM_STATIC const IEMOPBINSIZES g_iemAImpl_bsr =247 {248 NULL, NULL,249 iemAImpl_bsr_u16, NULL,250 iemAImpl_bsr_u32, NULL,251 iemAImpl_bsr_u64, NULL252 };253 254 /** Function table for the BSR instruction, AMD EFLAGS variant. */255 IEM_STATIC const IEMOPBINSIZES g_iemAImpl_bsr_amd =256 {257 NULL, NULL,258 iemAImpl_bsr_u16_amd, NULL,259 iemAImpl_bsr_u32_amd, NULL,260 iemAImpl_bsr_u64_amd, NULL261 };262 263 /** Function table for the BSR instruction, Intel EFLAGS variant. */264 IEM_STATIC const IEMOPBINSIZES g_iemAImpl_bsr_intel =265 {266 NULL, NULL,267 iemAImpl_bsr_u16_intel, NULL,268 iemAImpl_bsr_u32_intel, NULL,269 iemAImpl_bsr_u64_intel, NULL270 };271 272 /** EFLAGS variation selection table for the BSR instruction. */273 IEM_STATIC const IEMOPBINSIZES * const g_iemAImpl_bsr_eflags[] =274 {275 &g_iemAImpl_bsr,276 &g_iemAImpl_bsr_intel,277 &g_iemAImpl_bsr_amd,278 &g_iemAImpl_bsr,279 };280 281 /** Function table for the IMUL instruction. */282 IEM_STATIC const IEMOPBINSIZES g_iemAImpl_imul_two =283 {284 NULL, NULL,285 iemAImpl_imul_two_u16, NULL,286 iemAImpl_imul_two_u32, NULL,287 iemAImpl_imul_two_u64, NULL288 };289 290 /** Function table for the IMUL instruction, AMD EFLAGS variant. */291 IEM_STATIC const IEMOPBINSIZES g_iemAImpl_imul_two_amd =292 {293 NULL, NULL,294 iemAImpl_imul_two_u16_amd, NULL,295 iemAImpl_imul_two_u32_amd, NULL,296 iemAImpl_imul_two_u64_amd, NULL297 };298 299 /** Function table for the IMUL instruction, Intel EFLAGS variant. */300 IEM_STATIC const IEMOPBINSIZES g_iemAImpl_imul_two_intel =301 {302 NULL, NULL,303 iemAImpl_imul_two_u16_intel, NULL,304 iemAImpl_imul_two_u32_intel, NULL,305 iemAImpl_imul_two_u64_intel, NULL306 };307 308 /** EFLAGS variation selection table for the IMUL instruction. */309 IEM_STATIC const IEMOPBINSIZES * const g_iemAImpl_imul_two_eflags[] =310 {311 &g_iemAImpl_imul_two,312 &g_iemAImpl_imul_two_intel,313 &g_iemAImpl_imul_two_amd,314 &g_iemAImpl_imul_two,315 };316 317 /** EFLAGS variation selection table for the 16-bit IMUL instruction. */318 IEM_STATIC PFNIEMAIMPLBINU16 const g_iemAImpl_imul_two_u16_eflags[] =319 {320 iemAImpl_imul_two_u16,321 iemAImpl_imul_two_u16_intel,322 iemAImpl_imul_two_u16_amd,323 iemAImpl_imul_two_u16,324 };325 326 /** EFLAGS variation selection table for the 32-bit IMUL instruction. */327 IEM_STATIC PFNIEMAIMPLBINU32 const g_iemAImpl_imul_two_u32_eflags[] =328 {329 iemAImpl_imul_two_u32,330 iemAImpl_imul_two_u32_intel,331 iemAImpl_imul_two_u32_amd,332 iemAImpl_imul_two_u32,333 };334 335 /** EFLAGS variation selection table for the 64-bit IMUL instruction. */336 IEM_STATIC PFNIEMAIMPLBINU64 const g_iemAImpl_imul_two_u64_eflags[] =337 {338 iemAImpl_imul_two_u64,339 iemAImpl_imul_two_u64_intel,340 iemAImpl_imul_two_u64_amd,341 iemAImpl_imul_two_u64,342 };343 344 /** Group 1 /r lookup table. */345 IEM_STATIC const PCIEMOPBINSIZES g_apIemImplGrp1[8] =346 {347 &g_iemAImpl_add,348 &g_iemAImpl_or,349 &g_iemAImpl_adc,350 &g_iemAImpl_sbb,351 &g_iemAImpl_and,352 &g_iemAImpl_sub,353 &g_iemAImpl_xor,354 &g_iemAImpl_cmp355 };356 357 /** Function table for the INC instruction. */358 IEM_STATIC const IEMOPUNARYSIZES g_iemAImpl_inc =359 {360 iemAImpl_inc_u8, iemAImpl_inc_u8_locked,361 iemAImpl_inc_u16, iemAImpl_inc_u16_locked,362 iemAImpl_inc_u32, iemAImpl_inc_u32_locked,363 iemAImpl_inc_u64, iemAImpl_inc_u64_locked364 };365 366 /** Function table for the DEC instruction. */367 IEM_STATIC const IEMOPUNARYSIZES g_iemAImpl_dec =368 {369 iemAImpl_dec_u8, iemAImpl_dec_u8_locked,370 iemAImpl_dec_u16, iemAImpl_dec_u16_locked,371 iemAImpl_dec_u32, iemAImpl_dec_u32_locked,372 iemAImpl_dec_u64, iemAImpl_dec_u64_locked373 };374 375 /** Function table for the NEG instruction. */376 IEM_STATIC const IEMOPUNARYSIZES g_iemAImpl_neg =377 {378 iemAImpl_neg_u8, iemAImpl_neg_u8_locked,379 iemAImpl_neg_u16, iemAImpl_neg_u16_locked,380 iemAImpl_neg_u32, iemAImpl_neg_u32_locked,381 iemAImpl_neg_u64, iemAImpl_neg_u64_locked382 };383 384 /** Function table for the NOT instruction. */385 IEM_STATIC const IEMOPUNARYSIZES g_iemAImpl_not =386 {387 iemAImpl_not_u8, iemAImpl_not_u8_locked,388 iemAImpl_not_u16, iemAImpl_not_u16_locked,389 iemAImpl_not_u32, iemAImpl_not_u32_locked,390 iemAImpl_not_u64, iemAImpl_not_u64_locked391 };392 393 394 /** Function table for the ROL instruction. */395 IEM_STATIC const IEMOPSHIFTSIZES g_iemAImpl_rol =396 {397 iemAImpl_rol_u8,398 iemAImpl_rol_u16,399 iemAImpl_rol_u32,400 iemAImpl_rol_u64401 };402 403 /** Function table for the ROL instruction, AMD EFLAGS variant. */404 IEM_STATIC const IEMOPSHIFTSIZES g_iemAImpl_rol_amd =405 {406 iemAImpl_rol_u8_amd,407 iemAImpl_rol_u16_amd,408 iemAImpl_rol_u32_amd,409 iemAImpl_rol_u64_amd410 };411 412 /** Function table for the ROL instruction, Intel EFLAGS variant. */413 IEM_STATIC const IEMOPSHIFTSIZES g_iemAImpl_rol_intel =414 {415 iemAImpl_rol_u8_intel,416 iemAImpl_rol_u16_intel,417 iemAImpl_rol_u32_intel,418 iemAImpl_rol_u64_intel419 };420 421 /** EFLAGS variation selection table for the ROL instruction. */422 IEM_STATIC const IEMOPSHIFTSIZES * const g_iemAImpl_rol_eflags[] =423 {424 &g_iemAImpl_rol,425 &g_iemAImpl_rol_intel,426 &g_iemAImpl_rol_amd,427 &g_iemAImpl_rol,428 };429 430 431 /** Function table for the ROR instruction. */432 IEM_STATIC const IEMOPSHIFTSIZES g_iemAImpl_ror =433 {434 iemAImpl_ror_u8,435 iemAImpl_ror_u16,436 iemAImpl_ror_u32,437 iemAImpl_ror_u64438 };439 440 /** Function table for the ROR instruction, AMD EFLAGS variant. */441 IEM_STATIC const IEMOPSHIFTSIZES g_iemAImpl_ror_amd =442 {443 iemAImpl_ror_u8_amd,444 iemAImpl_ror_u16_amd,445 iemAImpl_ror_u32_amd,446 iemAImpl_ror_u64_amd447 };448 449 /** Function table for the ROR instruction, Intel EFLAGS variant. */450 IEM_STATIC const IEMOPSHIFTSIZES g_iemAImpl_ror_intel =451 {452 iemAImpl_ror_u8_intel,453 iemAImpl_ror_u16_intel,454 iemAImpl_ror_u32_intel,455 iemAImpl_ror_u64_intel456 };457 458 /** EFLAGS variation selection table for the ROR instruction. */459 IEM_STATIC const IEMOPSHIFTSIZES * const g_iemAImpl_ror_eflags[] =460 {461 &g_iemAImpl_ror,462 &g_iemAImpl_ror_intel,463 &g_iemAImpl_ror_amd,464 &g_iemAImpl_ror,465 };466 467 468 /** Function table for the RCL instruction. */469 IEM_STATIC const IEMOPSHIFTSIZES g_iemAImpl_rcl =470 {471 iemAImpl_rcl_u8,472 iemAImpl_rcl_u16,473 iemAImpl_rcl_u32,474 iemAImpl_rcl_u64475 };476 477 /** Function table for the RCL instruction, AMD EFLAGS variant. */478 IEM_STATIC const IEMOPSHIFTSIZES g_iemAImpl_rcl_amd =479 {480 iemAImpl_rcl_u8_amd,481 iemAImpl_rcl_u16_amd,482 iemAImpl_rcl_u32_amd,483 iemAImpl_rcl_u64_amd484 };485 486 /** Function table for the RCL instruction, Intel EFLAGS variant. */487 IEM_STATIC const IEMOPSHIFTSIZES g_iemAImpl_rcl_intel =488 {489 iemAImpl_rcl_u8_intel,490 iemAImpl_rcl_u16_intel,491 iemAImpl_rcl_u32_intel,492 iemAImpl_rcl_u64_intel493 };494 495 /** EFLAGS variation selection table for the RCL instruction. */496 IEM_STATIC const IEMOPSHIFTSIZES * const g_iemAImpl_rcl_eflags[] =497 {498 &g_iemAImpl_rcl,499 &g_iemAImpl_rcl_intel,500 &g_iemAImpl_rcl_amd,501 &g_iemAImpl_rcl,502 };503 504 505 /** Function table for the RCR instruction. */506 IEM_STATIC const IEMOPSHIFTSIZES g_iemAImpl_rcr =507 {508 iemAImpl_rcr_u8,509 iemAImpl_rcr_u16,510 iemAImpl_rcr_u32,511 iemAImpl_rcr_u64512 };513 514 /** Function table for the RCR instruction, AMD EFLAGS variant. */515 IEM_STATIC const IEMOPSHIFTSIZES g_iemAImpl_rcr_amd =516 {517 iemAImpl_rcr_u8_amd,518 iemAImpl_rcr_u16_amd,519 iemAImpl_rcr_u32_amd,520 iemAImpl_rcr_u64_amd521 };522 523 /** Function table for the RCR instruction, Intel EFLAGS variant. */524 IEM_STATIC const IEMOPSHIFTSIZES g_iemAImpl_rcr_intel =525 {526 iemAImpl_rcr_u8_intel,527 iemAImpl_rcr_u16_intel,528 iemAImpl_rcr_u32_intel,529 iemAImpl_rcr_u64_intel530 };531 532 /** EFLAGS variation selection table for the RCR instruction. */533 IEM_STATIC const IEMOPSHIFTSIZES * const g_iemAImpl_rcr_eflags[] =534 {535 &g_iemAImpl_rcr,536 &g_iemAImpl_rcr_intel,537 &g_iemAImpl_rcr_amd,538 &g_iemAImpl_rcr,539 };540 541 542 /** Function table for the SHL instruction. */543 IEM_STATIC const IEMOPSHIFTSIZES g_iemAImpl_shl =544 {545 iemAImpl_shl_u8,546 iemAImpl_shl_u16,547 iemAImpl_shl_u32,548 iemAImpl_shl_u64549 };550 551 /** Function table for the SHL instruction, AMD EFLAGS variant. */552 IEM_STATIC const IEMOPSHIFTSIZES g_iemAImpl_shl_amd =553 {554 iemAImpl_shl_u8_amd,555 iemAImpl_shl_u16_amd,556 iemAImpl_shl_u32_amd,557 iemAImpl_shl_u64_amd558 };559 560 /** Function table for the SHL instruction, Intel EFLAGS variant. */561 IEM_STATIC const IEMOPSHIFTSIZES g_iemAImpl_shl_intel =562 {563 iemAImpl_shl_u8_intel,564 iemAImpl_shl_u16_intel,565 iemAImpl_shl_u32_intel,566 iemAImpl_shl_u64_intel567 };568 569 /** EFLAGS variation selection table for the SHL instruction. */570 IEM_STATIC const IEMOPSHIFTSIZES * const g_iemAImpl_shl_eflags[] =571 {572 &g_iemAImpl_shl,573 &g_iemAImpl_shl_intel,574 &g_iemAImpl_shl_amd,575 &g_iemAImpl_shl,576 };577 578 579 /** Function table for the SHR instruction. */580 IEM_STATIC const IEMOPSHIFTSIZES g_iemAImpl_shr =581 {582 iemAImpl_shr_u8,583 iemAImpl_shr_u16,584 iemAImpl_shr_u32,585 iemAImpl_shr_u64586 };587 588 /** Function table for the SHR instruction, AMD EFLAGS variant. */589 IEM_STATIC const IEMOPSHIFTSIZES g_iemAImpl_shr_amd =590 {591 iemAImpl_shr_u8_amd,592 iemAImpl_shr_u16_amd,593 iemAImpl_shr_u32_amd,594 iemAImpl_shr_u64_amd595 };596 597 /** Function table for the SHR instruction, Intel EFLAGS variant. */598 IEM_STATIC const IEMOPSHIFTSIZES g_iemAImpl_shr_intel =599 {600 iemAImpl_shr_u8_intel,601 iemAImpl_shr_u16_intel,602 iemAImpl_shr_u32_intel,603 iemAImpl_shr_u64_intel604 };605 606 /** EFLAGS variation selection table for the SHR instruction. */607 IEM_STATIC const IEMOPSHIFTSIZES * const g_iemAImpl_shr_eflags[] =608 {609 &g_iemAImpl_shr,610 &g_iemAImpl_shr_intel,611 &g_iemAImpl_shr_amd,612 &g_iemAImpl_shr,613 };614 615 616 /** Function table for the SAR instruction. */617 IEM_STATIC const IEMOPSHIFTSIZES g_iemAImpl_sar =618 {619 iemAImpl_sar_u8,620 iemAImpl_sar_u16,621 iemAImpl_sar_u32,622 iemAImpl_sar_u64623 };624 625 /** Function table for the SAR instruction, AMD EFLAGS variant. */626 IEM_STATIC const IEMOPSHIFTSIZES g_iemAImpl_sar_amd =627 {628 iemAImpl_sar_u8_amd,629 iemAImpl_sar_u16_amd,630 iemAImpl_sar_u32_amd,631 iemAImpl_sar_u64_amd632 };633 634 /** Function table for the SAR instruction, Intel EFLAGS variant. */635 IEM_STATIC const IEMOPSHIFTSIZES g_iemAImpl_sar_intel =636 {637 iemAImpl_sar_u8_intel,638 iemAImpl_sar_u16_intel,639 iemAImpl_sar_u32_intel,640 iemAImpl_sar_u64_intel641 };642 643 /** EFLAGS variation selection table for the SAR instruction. */644 IEM_STATIC const IEMOPSHIFTSIZES * const g_iemAImpl_sar_eflags[] =645 {646 &g_iemAImpl_sar,647 &g_iemAImpl_sar_intel,648 &g_iemAImpl_sar_amd,649 &g_iemAImpl_sar,650 };651 652 653 /** Function table for the MUL instruction. */654 IEM_STATIC const IEMOPMULDIVSIZES g_iemAImpl_mul =655 {656 iemAImpl_mul_u8,657 iemAImpl_mul_u16,658 iemAImpl_mul_u32,659 iemAImpl_mul_u64660 };661 662 /** Function table for the MUL instruction, AMD EFLAGS variation. */663 IEM_STATIC const IEMOPMULDIVSIZES g_iemAImpl_mul_amd =664 {665 iemAImpl_mul_u8_amd,666 iemAImpl_mul_u16_amd,667 iemAImpl_mul_u32_amd,668 iemAImpl_mul_u64_amd669 };670 671 /** Function table for the MUL instruction, Intel EFLAGS variation. */672 IEM_STATIC const IEMOPMULDIVSIZES g_iemAImpl_mul_intel =673 {674 iemAImpl_mul_u8_intel,675 iemAImpl_mul_u16_intel,676 iemAImpl_mul_u32_intel,677 iemAImpl_mul_u64_intel678 };679 680 /** EFLAGS variation selection table for the MUL instruction. */681 IEM_STATIC const IEMOPMULDIVSIZES * const g_iemAImpl_mul_eflags[] =682 {683 &g_iemAImpl_mul,684 &g_iemAImpl_mul_intel,685 &g_iemAImpl_mul_amd,686 &g_iemAImpl_mul,687 };688 689 /** EFLAGS variation selection table for the 8-bit MUL instruction. */690 IEM_STATIC PFNIEMAIMPLMULDIVU8 const g_iemAImpl_mul_u8_eflags[] =691 {692 iemAImpl_mul_u8,693 iemAImpl_mul_u8_intel,694 iemAImpl_mul_u8_amd,695 iemAImpl_mul_u8696 };697 698 699 /** Function table for the IMUL instruction working implicitly on rAX. */700 IEM_STATIC const IEMOPMULDIVSIZES g_iemAImpl_imul =701 {702 iemAImpl_imul_u8,703 iemAImpl_imul_u16,704 iemAImpl_imul_u32,705 iemAImpl_imul_u64706 };707 708 /** Function table for the IMUL instruction working implicitly on rAX, AMD EFLAGS variation. */709 IEM_STATIC const IEMOPMULDIVSIZES g_iemAImpl_imul_amd =710 {711 iemAImpl_imul_u8_amd,712 iemAImpl_imul_u16_amd,713 iemAImpl_imul_u32_amd,714 iemAImpl_imul_u64_amd715 };716 717 /** Function table for the IMUL instruction working implicitly on rAX, Intel EFLAGS variation. */718 IEM_STATIC const IEMOPMULDIVSIZES g_iemAImpl_imul_intel =719 {720 iemAImpl_imul_u8_intel,721 iemAImpl_imul_u16_intel,722 iemAImpl_imul_u32_intel,723 iemAImpl_imul_u64_intel724 };725 726 /** EFLAGS variation selection table for the IMUL instruction. */727 IEM_STATIC const IEMOPMULDIVSIZES * const g_iemAImpl_imul_eflags[] =728 {729 &g_iemAImpl_imul,730 &g_iemAImpl_imul_intel,731 &g_iemAImpl_imul_amd,732 &g_iemAImpl_imul,733 };734 735 /** EFLAGS variation selection table for the 8-bit IMUL instruction. */736 IEM_STATIC PFNIEMAIMPLMULDIVU8 const g_iemAImpl_imul_u8_eflags[] =737 {738 iemAImpl_imul_u8,739 iemAImpl_imul_u8_intel,740 iemAImpl_imul_u8_amd,741 iemAImpl_imul_u8742 };743 744 745 /** Function table for the DIV instruction. */746 IEM_STATIC const IEMOPMULDIVSIZES g_iemAImpl_div =747 {748 iemAImpl_div_u8,749 iemAImpl_div_u16,750 iemAImpl_div_u32,751 iemAImpl_div_u64752 };753 754 /** Function table for the DIV instruction, AMD EFLAGS variation. */755 IEM_STATIC const IEMOPMULDIVSIZES g_iemAImpl_div_amd =756 {757 iemAImpl_div_u8_amd,758 iemAImpl_div_u16_amd,759 iemAImpl_div_u32_amd,760 iemAImpl_div_u64_amd761 };762 763 /** Function table for the DIV instruction, Intel EFLAGS variation. */764 IEM_STATIC const IEMOPMULDIVSIZES g_iemAImpl_div_intel =765 {766 iemAImpl_div_u8_intel,767 iemAImpl_div_u16_intel,768 iemAImpl_div_u32_intel,769 iemAImpl_div_u64_intel770 };771 772 /** EFLAGS variation selection table for the DIV instruction. */773 IEM_STATIC const IEMOPMULDIVSIZES * const g_iemAImpl_div_eflags[] =774 {775 &g_iemAImpl_div,776 &g_iemAImpl_div_intel,777 &g_iemAImpl_div_amd,778 &g_iemAImpl_div,779 };780 781 /** EFLAGS variation selection table for the 8-bit DIV instruction. */782 IEM_STATIC PFNIEMAIMPLMULDIVU8 const g_iemAImpl_div_u8_eflags[] =783 {784 iemAImpl_div_u8,785 iemAImpl_div_u8_intel,786 iemAImpl_div_u8_amd,787 iemAImpl_div_u8788 };789 790 791 /** Function table for the IDIV instruction. */792 IEM_STATIC const IEMOPMULDIVSIZES g_iemAImpl_idiv =793 {794 iemAImpl_idiv_u8,795 iemAImpl_idiv_u16,796 iemAImpl_idiv_u32,797 iemAImpl_idiv_u64798 };799 800 /** Function table for the IDIV instruction, AMD EFLAGS variation. */801 IEM_STATIC const IEMOPMULDIVSIZES g_iemAImpl_idiv_amd =802 {803 iemAImpl_idiv_u8_amd,804 iemAImpl_idiv_u16_amd,805 iemAImpl_idiv_u32_amd,806 iemAImpl_idiv_u64_amd807 };808 809 /** Function table for the IDIV instruction, Intel EFLAGS variation. */810 IEM_STATIC const IEMOPMULDIVSIZES g_iemAImpl_idiv_intel =811 {812 iemAImpl_idiv_u8_intel,813 iemAImpl_idiv_u16_intel,814 iemAImpl_idiv_u32_intel,815 iemAImpl_idiv_u64_intel816 };817 818 /** EFLAGS variation selection table for the IDIV instruction. */819 IEM_STATIC const IEMOPMULDIVSIZES * const g_iemAImpl_idiv_eflags[] =820 {821 &g_iemAImpl_idiv,822 &g_iemAImpl_idiv_intel,823 &g_iemAImpl_idiv_amd,824 &g_iemAImpl_idiv,825 };826 827 /** EFLAGS variation selection table for the 8-bit IDIV instruction. */828 IEM_STATIC PFNIEMAIMPLMULDIVU8 const g_iemAImpl_idiv_u8_eflags[] =829 {830 iemAImpl_idiv_u8,831 iemAImpl_idiv_u8_intel,832 iemAImpl_idiv_u8_amd,833 iemAImpl_idiv_u8834 };835 836 837 /** Function table for the SHLD instruction. */838 IEM_STATIC const IEMOPSHIFTDBLSIZES g_iemAImpl_shld =839 {840 iemAImpl_shld_u16,841 iemAImpl_shld_u32,842 iemAImpl_shld_u64,843 };844 845 /** Function table for the SHLD instruction, AMD EFLAGS variation. */846 IEM_STATIC const IEMOPSHIFTDBLSIZES g_iemAImpl_shld_amd =847 {848 iemAImpl_shld_u16_amd,849 iemAImpl_shld_u32_amd,850 iemAImpl_shld_u64_amd851 };852 853 /** Function table for the SHLD instruction, Intel EFLAGS variation. */854 IEM_STATIC const IEMOPSHIFTDBLSIZES g_iemAImpl_shld_intel =855 {856 iemAImpl_shld_u16_intel,857 iemAImpl_shld_u32_intel,858 iemAImpl_shld_u64_intel859 };860 861 /** EFLAGS variation selection table for the SHLD instruction. */862 IEM_STATIC const IEMOPSHIFTDBLSIZES * const g_iemAImpl_shld_eflags[] =863 {864 &g_iemAImpl_shld,865 &g_iemAImpl_shld_intel,866 &g_iemAImpl_shld_amd,867 &g_iemAImpl_shld868 };869 870 /** Function table for the SHRD instruction. */871 IEM_STATIC const IEMOPSHIFTDBLSIZES g_iemAImpl_shrd =872 {873 iemAImpl_shrd_u16,874 iemAImpl_shrd_u32,875 iemAImpl_shrd_u64876 };877 878 /** Function table for the SHRD instruction, AMD EFLAGS variation. */879 IEM_STATIC const IEMOPSHIFTDBLSIZES g_iemAImpl_shrd_amd =880 {881 iemAImpl_shrd_u16_amd,882 iemAImpl_shrd_u32_amd,883 iemAImpl_shrd_u64_amd884 };885 886 /** Function table for the SHRD instruction, Intel EFLAGS variation. */887 IEM_STATIC const IEMOPSHIFTDBLSIZES g_iemAImpl_shrd_intel =888 {889 iemAImpl_shrd_u16_intel,890 iemAImpl_shrd_u32_intel,891 iemAImpl_shrd_u64_intel892 };893 894 /** EFLAGS variation selection table for the SHRD instruction. */895 IEM_STATIC const IEMOPSHIFTDBLSIZES * const g_iemAImpl_shrd_eflags[] =896 {897 &g_iemAImpl_shrd,898 &g_iemAImpl_shrd_intel,899 &g_iemAImpl_shrd_amd,900 &g_iemAImpl_shrd901 };902 903 904 # ifndef IEM_WITHOUT_ASSEMBLY905 /** Function table for the VPXOR instruction */906 IEM_STATIC const IEMOPMEDIAF3 g_iemAImpl_vpand = { iemAImpl_vpand_u128, iemAImpl_vpand_u256 };907 /** Function table for the VPXORN instruction */908 IEM_STATIC const IEMOPMEDIAF3 g_iemAImpl_vpandn = { iemAImpl_vpandn_u128, iemAImpl_vpandn_u256 };909 /** Function table for the VPOR instruction */910 IEM_STATIC const IEMOPMEDIAF3 g_iemAImpl_vpor = { iemAImpl_vpor_u128, iemAImpl_vpor_u256 };911 /** Function table for the VPXOR instruction */912 IEM_STATIC const IEMOPMEDIAF3 g_iemAImpl_vpxor = { iemAImpl_vpxor_u128, iemAImpl_vpxor_u256 };913 # endif914 915 /** Function table for the VPAND instruction, software fallback. */916 IEM_STATIC const IEMOPMEDIAF3 g_iemAImpl_vpand_fallback = { iemAImpl_vpand_u128_fallback, iemAImpl_vpand_u256_fallback };917 /** Function table for the VPANDN instruction, software fallback. */918 IEM_STATIC const IEMOPMEDIAF3 g_iemAImpl_vpandn_fallback= { iemAImpl_vpandn_u128_fallback, iemAImpl_vpandn_u256_fallback };919 /** Function table for the VPOR instruction, software fallback. */920 IEM_STATIC const IEMOPMEDIAF3 g_iemAImpl_vpor_fallback = { iemAImpl_vpor_u128_fallback, iemAImpl_vpor_u256_fallback };921 /** Function table for the VPXOR instruction, software fallback. */922 IEM_STATIC const IEMOPMEDIAF3 g_iemAImpl_vpxor_fallback = { iemAImpl_vpxor_u128_fallback, iemAImpl_vpxor_u256_fallback };923 924 #endif /* !TST_IEM_CHECK_MC */925 926 927 /**928 * Common worker for instructions like ADD, AND, OR, ++ with a byte929 * memory/register as the destination.930 *931 * @param pImpl Pointer to the instruction implementation (assembly).932 */933 FNIEMOP_DEF_1(iemOpHlpBinaryOperator_rm_r8, PCIEMOPBINSIZES, pImpl)934 {935 uint8_t bRm; IEM_OPCODE_GET_NEXT_U8(&bRm);936 937 /*938 * If rm is denoting a register, no more instruction bytes.939 */940 if (IEM_IS_MODRM_REG_MODE(bRm))941 {942 IEMOP_HLP_DONE_DECODING_NO_LOCK_PREFIX();943 944 IEM_MC_BEGIN(3, 0);945 IEM_MC_ARG(uint8_t *, pu8Dst, 0);946 IEM_MC_ARG(uint8_t, u8Src, 1);947 IEM_MC_ARG(uint32_t *, pEFlags, 2);948 949 IEM_MC_FETCH_GREG_U8(u8Src, IEM_GET_MODRM_REG(pVCpu, bRm));950 IEM_MC_REF_GREG_U8(pu8Dst, IEM_GET_MODRM_RM(pVCpu, bRm));951 IEM_MC_REF_EFLAGS(pEFlags);952 IEM_MC_CALL_VOID_AIMPL_3(pImpl->pfnNormalU8, pu8Dst, u8Src, pEFlags);953 954 IEM_MC_ADVANCE_RIP_AND_FINISH();955 IEM_MC_END();956 }957 else958 {959 /*960 * We're accessing memory.961 * Note! We're putting the eflags on the stack here so we can commit them962 * after the memory.963 */964 uint32_t const fAccess = pImpl->pfnLockedU8 ? IEM_ACCESS_DATA_RW : IEM_ACCESS_DATA_R; /* CMP,TEST */965 IEM_MC_BEGIN(3, 2);966 IEM_MC_ARG(uint8_t *, pu8Dst, 0);967 IEM_MC_ARG(uint8_t, u8Src, 1);968 IEM_MC_ARG_LOCAL_EFLAGS(pEFlags, EFlags, 2);969 IEM_MC_LOCAL(RTGCPTR, GCPtrEffDst);970 971 IEM_MC_CALC_RM_EFF_ADDR(GCPtrEffDst, bRm, 0);972 if (!pImpl->pfnLockedU8)973 IEMOP_HLP_DONE_DECODING_NO_LOCK_PREFIX();974 IEM_MC_MEM_MAP(pu8Dst, fAccess, pVCpu->iem.s.iEffSeg, GCPtrEffDst, 0 /*arg*/);975 IEM_MC_FETCH_GREG_U8(u8Src, IEM_GET_MODRM_REG(pVCpu, bRm));976 IEM_MC_FETCH_EFLAGS(EFlags);977 if (!(pVCpu->iem.s.fPrefixes & IEM_OP_PRF_LOCK))978 IEM_MC_CALL_VOID_AIMPL_3(pImpl->pfnNormalU8, pu8Dst, u8Src, pEFlags);979 else980 IEM_MC_CALL_VOID_AIMPL_3(pImpl->pfnLockedU8, pu8Dst, u8Src, pEFlags);981 982 IEM_MC_MEM_COMMIT_AND_UNMAP(pu8Dst, fAccess);983 IEM_MC_COMMIT_EFLAGS(EFlags);984 IEM_MC_ADVANCE_RIP_AND_FINISH();985 IEM_MC_END();986 }987 }988 989 990 /**991 * Common worker for word/dword/qword instructions like ADD, AND, OR, ++ with992 * memory/register as the destination.993 *994 * @param pImpl Pointer to the instruction implementation (assembly).995 */996 FNIEMOP_DEF_1(iemOpHlpBinaryOperator_rm_rv, PCIEMOPBINSIZES, pImpl)997 {998 uint8_t bRm; IEM_OPCODE_GET_NEXT_U8(&bRm);999 1000 /*1001 * If rm is denoting a register, no more instruction bytes.1002 */1003 if (IEM_IS_MODRM_REG_MODE(bRm))1004 {1005 IEMOP_HLP_DONE_DECODING_NO_LOCK_PREFIX();1006 1007 switch (pVCpu->iem.s.enmEffOpSize)1008 {1009 case IEMMODE_16BIT:1010 IEM_MC_BEGIN(3, 0);1011 IEM_MC_ARG(uint16_t *, pu16Dst, 0);1012 IEM_MC_ARG(uint16_t, u16Src, 1);1013 IEM_MC_ARG(uint32_t *, pEFlags, 2);1014 1015 IEM_MC_FETCH_GREG_U16(u16Src, IEM_GET_MODRM_REG(pVCpu, bRm));1016 IEM_MC_REF_GREG_U16(pu16Dst, IEM_GET_MODRM_RM(pVCpu, bRm));1017 IEM_MC_REF_EFLAGS(pEFlags);1018 IEM_MC_CALL_VOID_AIMPL_3(pImpl->pfnNormalU16, pu16Dst, u16Src, pEFlags);1019 1020 IEM_MC_ADVANCE_RIP_AND_FINISH();1021 IEM_MC_END();1022 break;1023 1024 case IEMMODE_32BIT:1025 IEM_MC_BEGIN(3, 0);1026 IEM_MC_ARG(uint32_t *, pu32Dst, 0);1027 IEM_MC_ARG(uint32_t, u32Src, 1);1028 IEM_MC_ARG(uint32_t *, pEFlags, 2);1029 1030 IEM_MC_FETCH_GREG_U32(u32Src, IEM_GET_MODRM_REG(pVCpu, bRm));1031 IEM_MC_REF_GREG_U32(pu32Dst, IEM_GET_MODRM_RM(pVCpu, bRm));1032 IEM_MC_REF_EFLAGS(pEFlags);1033 IEM_MC_CALL_VOID_AIMPL_3(pImpl->pfnNormalU32, pu32Dst, u32Src, pEFlags);1034 1035 if ((pImpl != &g_iemAImpl_test) && (pImpl != &g_iemAImpl_cmp))1036 IEM_MC_CLEAR_HIGH_GREG_U64_BY_REF(pu32Dst);1037 IEM_MC_ADVANCE_RIP_AND_FINISH();1038 IEM_MC_END();1039 break;1040 1041 case IEMMODE_64BIT:1042 IEM_MC_BEGIN(3, 0);1043 IEM_MC_ARG(uint64_t *, pu64Dst, 0);1044 IEM_MC_ARG(uint64_t, u64Src, 1);1045 IEM_MC_ARG(uint32_t *, pEFlags, 2);1046 1047 IEM_MC_FETCH_GREG_U64(u64Src, IEM_GET_MODRM_REG(pVCpu, bRm));1048 IEM_MC_REF_GREG_U64(pu64Dst, IEM_GET_MODRM_RM(pVCpu, bRm));1049 IEM_MC_REF_EFLAGS(pEFlags);1050 IEM_MC_CALL_VOID_AIMPL_3(pImpl->pfnNormalU64, pu64Dst, u64Src, pEFlags);1051 1052 IEM_MC_ADVANCE_RIP_AND_FINISH();1053 IEM_MC_END();1054 break;1055 1056 IEM_NOT_REACHED_DEFAULT_CASE_RET();1057 }1058 }1059 else1060 {1061 /*1062 * We're accessing memory.1063 * Note! We're putting the eflags on the stack here so we can commit them1064 * after the memory.1065 */1066 uint32_t const fAccess = pImpl->pfnLockedU8 ? IEM_ACCESS_DATA_RW : IEM_ACCESS_DATA_R /* CMP,TEST */;1067 switch (pVCpu->iem.s.enmEffOpSize)1068 {1069 case IEMMODE_16BIT:1070 IEM_MC_BEGIN(3, 2);1071 IEM_MC_ARG(uint16_t *, pu16Dst, 0);1072 IEM_MC_ARG(uint16_t, u16Src, 1);1073 IEM_MC_ARG_LOCAL_EFLAGS(pEFlags, EFlags, 2);1074 IEM_MC_LOCAL(RTGCPTR, GCPtrEffDst);1075 1076 IEM_MC_CALC_RM_EFF_ADDR(GCPtrEffDst, bRm, 0);1077 if (!pImpl->pfnLockedU16)1078 IEMOP_HLP_DONE_DECODING_NO_LOCK_PREFIX();1079 IEM_MC_MEM_MAP(pu16Dst, fAccess, pVCpu->iem.s.iEffSeg, GCPtrEffDst, 0 /*arg*/);1080 IEM_MC_FETCH_GREG_U16(u16Src, IEM_GET_MODRM_REG(pVCpu, bRm));1081 IEM_MC_FETCH_EFLAGS(EFlags);1082 if (!(pVCpu->iem.s.fPrefixes & IEM_OP_PRF_LOCK))1083 IEM_MC_CALL_VOID_AIMPL_3(pImpl->pfnNormalU16, pu16Dst, u16Src, pEFlags);1084 else1085 IEM_MC_CALL_VOID_AIMPL_3(pImpl->pfnLockedU16, pu16Dst, u16Src, pEFlags);1086 1087 IEM_MC_MEM_COMMIT_AND_UNMAP(pu16Dst, fAccess);1088 IEM_MC_COMMIT_EFLAGS(EFlags);1089 IEM_MC_ADVANCE_RIP_AND_FINISH();1090 IEM_MC_END();1091 break;1092 1093 case IEMMODE_32BIT:1094 IEM_MC_BEGIN(3, 2);1095 IEM_MC_ARG(uint32_t *, pu32Dst, 0);1096 IEM_MC_ARG(uint32_t, u32Src, 1);1097 IEM_MC_ARG_LOCAL_EFLAGS(pEFlags, EFlags, 2);1098 IEM_MC_LOCAL(RTGCPTR, GCPtrEffDst);1099 1100 IEM_MC_CALC_RM_EFF_ADDR(GCPtrEffDst, bRm, 0);1101 if (!pImpl->pfnLockedU32)1102 IEMOP_HLP_DONE_DECODING_NO_LOCK_PREFIX();1103 IEM_MC_MEM_MAP(pu32Dst, fAccess, pVCpu->iem.s.iEffSeg, GCPtrEffDst, 0 /*arg*/);1104 IEM_MC_FETCH_GREG_U32(u32Src, IEM_GET_MODRM_REG(pVCpu, bRm));1105 IEM_MC_FETCH_EFLAGS(EFlags);1106 if (!(pVCpu->iem.s.fPrefixes & IEM_OP_PRF_LOCK))1107 IEM_MC_CALL_VOID_AIMPL_3(pImpl->pfnNormalU32, pu32Dst, u32Src, pEFlags);1108 else1109 IEM_MC_CALL_VOID_AIMPL_3(pImpl->pfnLockedU32, pu32Dst, u32Src, pEFlags);1110 1111 IEM_MC_MEM_COMMIT_AND_UNMAP(pu32Dst, fAccess);1112 IEM_MC_COMMIT_EFLAGS(EFlags);1113 IEM_MC_ADVANCE_RIP_AND_FINISH();1114 IEM_MC_END();1115 break;1116 1117 case IEMMODE_64BIT:1118 IEM_MC_BEGIN(3, 2);1119 IEM_MC_ARG(uint64_t *, pu64Dst, 0);1120 IEM_MC_ARG(uint64_t, u64Src, 1);1121 IEM_MC_ARG_LOCAL_EFLAGS(pEFlags, EFlags, 2);1122 IEM_MC_LOCAL(RTGCPTR, GCPtrEffDst);1123 1124 IEM_MC_CALC_RM_EFF_ADDR(GCPtrEffDst, bRm, 0);1125 if (!pImpl->pfnLockedU64)1126 IEMOP_HLP_DONE_DECODING_NO_LOCK_PREFIX();1127 IEM_MC_MEM_MAP(pu64Dst, fAccess, pVCpu->iem.s.iEffSeg, GCPtrEffDst, 0 /*arg*/);1128 IEM_MC_FETCH_GREG_U64(u64Src, IEM_GET_MODRM_REG(pVCpu, bRm));1129 IEM_MC_FETCH_EFLAGS(EFlags);1130 if (!(pVCpu->iem.s.fPrefixes & IEM_OP_PRF_LOCK))1131 IEM_MC_CALL_VOID_AIMPL_3(pImpl->pfnNormalU64, pu64Dst, u64Src, pEFlags);1132 else1133 IEM_MC_CALL_VOID_AIMPL_3(pImpl->pfnLockedU64, pu64Dst, u64Src, pEFlags);1134 1135 IEM_MC_MEM_COMMIT_AND_UNMAP(pu64Dst, fAccess);1136 IEM_MC_COMMIT_EFLAGS(EFlags);1137 IEM_MC_ADVANCE_RIP_AND_FINISH();1138 IEM_MC_END();1139 break;1140 1141 IEM_NOT_REACHED_DEFAULT_CASE_RET();1142 }1143 }1144 }1145 1146 1147 /**1148 * Common worker for byte instructions like ADD, AND, OR, ++ with a register as1149 * the destination.1150 *1151 * @param pImpl Pointer to the instruction implementation (assembly).1152 */1153 FNIEMOP_DEF_1(iemOpHlpBinaryOperator_r8_rm, PCIEMOPBINSIZES, pImpl)1154 {1155 uint8_t bRm; IEM_OPCODE_GET_NEXT_U8(&bRm);1156 1157 /*1158 * If rm is denoting a register, no more instruction bytes.1159 */1160 if (IEM_IS_MODRM_REG_MODE(bRm))1161 {1162 IEMOP_HLP_DONE_DECODING_NO_LOCK_PREFIX();1163 IEM_MC_BEGIN(3, 0);1164 IEM_MC_ARG(uint8_t *, pu8Dst, 0);1165 IEM_MC_ARG(uint8_t, u8Src, 1);1166 IEM_MC_ARG(uint32_t *, pEFlags, 2);1167 1168 IEM_MC_FETCH_GREG_U8(u8Src, IEM_GET_MODRM_RM(pVCpu, bRm));1169 IEM_MC_REF_GREG_U8(pu8Dst, IEM_GET_MODRM_REG(pVCpu, bRm));1170 IEM_MC_REF_EFLAGS(pEFlags);1171 IEM_MC_CALL_VOID_AIMPL_3(pImpl->pfnNormalU8, pu8Dst, u8Src, pEFlags);1172 1173 IEM_MC_ADVANCE_RIP_AND_FINISH();1174 IEM_MC_END();1175 }1176 else1177 {1178 /*1179 * We're accessing memory.1180 */1181 IEM_MC_BEGIN(3, 1);1182 IEM_MC_ARG(uint8_t *, pu8Dst, 0);1183 IEM_MC_ARG(uint8_t, u8Src, 1);1184 IEM_MC_ARG(uint32_t *, pEFlags, 2);1185 IEM_MC_LOCAL(RTGCPTR, GCPtrEffDst);1186 1187 IEM_MC_CALC_RM_EFF_ADDR(GCPtrEffDst, bRm, 0);1188 IEMOP_HLP_DONE_DECODING_NO_LOCK_PREFIX();1189 IEM_MC_FETCH_MEM_U8(u8Src, pVCpu->iem.s.iEffSeg, GCPtrEffDst);1190 IEM_MC_REF_GREG_U8(pu8Dst, IEM_GET_MODRM_REG(pVCpu, bRm));1191 IEM_MC_REF_EFLAGS(pEFlags);1192 IEM_MC_CALL_VOID_AIMPL_3(pImpl->pfnNormalU8, pu8Dst, u8Src, pEFlags);1193 1194 IEM_MC_ADVANCE_RIP_AND_FINISH();1195 IEM_MC_END();1196 }1197 }1198 1199 1200 /**1201 * Common worker for word/dword/qword instructions like ADD, AND, OR, ++ with a1202 * register as the destination.1203 *1204 * @param pImpl Pointer to the instruction implementation (assembly).1205 */1206 FNIEMOP_DEF_1(iemOpHlpBinaryOperator_rv_rm, PCIEMOPBINSIZES, pImpl)1207 {1208 uint8_t bRm; IEM_OPCODE_GET_NEXT_U8(&bRm);1209 1210 /*1211 * If rm is denoting a register, no more instruction bytes.1212 */1213 if (IEM_IS_MODRM_REG_MODE(bRm))1214 {1215 IEMOP_HLP_DONE_DECODING_NO_LOCK_PREFIX();1216 switch (pVCpu->iem.s.enmEffOpSize)1217 {1218 case IEMMODE_16BIT:1219 IEM_MC_BEGIN(3, 0);1220 IEM_MC_ARG(uint16_t *, pu16Dst, 0);1221 IEM_MC_ARG(uint16_t, u16Src, 1);1222 IEM_MC_ARG(uint32_t *, pEFlags, 2);1223 1224 IEM_MC_FETCH_GREG_U16(u16Src, IEM_GET_MODRM_RM(pVCpu, bRm));1225 IEM_MC_REF_GREG_U16(pu16Dst, IEM_GET_MODRM_REG(pVCpu, bRm));1226 IEM_MC_REF_EFLAGS(pEFlags);1227 IEM_MC_CALL_VOID_AIMPL_3(pImpl->pfnNormalU16, pu16Dst, u16Src, pEFlags);1228 1229 IEM_MC_ADVANCE_RIP_AND_FINISH();1230 IEM_MC_END();1231 break;1232 1233 case IEMMODE_32BIT:1234 IEM_MC_BEGIN(3, 0);1235 IEM_MC_ARG(uint32_t *, pu32Dst, 0);1236 IEM_MC_ARG(uint32_t, u32Src, 1);1237 IEM_MC_ARG(uint32_t *, pEFlags, 2);1238 1239 IEM_MC_FETCH_GREG_U32(u32Src, IEM_GET_MODRM_RM(pVCpu, bRm));1240 IEM_MC_REF_GREG_U32(pu32Dst, IEM_GET_MODRM_REG(pVCpu, bRm));1241 IEM_MC_REF_EFLAGS(pEFlags);1242 IEM_MC_CALL_VOID_AIMPL_3(pImpl->pfnNormalU32, pu32Dst, u32Src, pEFlags);1243 1244 if (pImpl != &g_iemAImpl_cmp) /* Not used with TEST. */1245 IEM_MC_CLEAR_HIGH_GREG_U64_BY_REF(pu32Dst);1246 IEM_MC_ADVANCE_RIP_AND_FINISH();1247 IEM_MC_END();1248 break;1249 1250 case IEMMODE_64BIT:1251 IEM_MC_BEGIN(3, 0);1252 IEM_MC_ARG(uint64_t *, pu64Dst, 0);1253 IEM_MC_ARG(uint64_t, u64Src, 1);1254 IEM_MC_ARG(uint32_t *, pEFlags, 2);1255 1256 IEM_MC_FETCH_GREG_U64(u64Src, IEM_GET_MODRM_RM(pVCpu, bRm));1257 IEM_MC_REF_GREG_U64(pu64Dst, IEM_GET_MODRM_REG(pVCpu, bRm));1258 IEM_MC_REF_EFLAGS(pEFlags);1259 IEM_MC_CALL_VOID_AIMPL_3(pImpl->pfnNormalU64, pu64Dst, u64Src, pEFlags);1260 1261 IEM_MC_ADVANCE_RIP_AND_FINISH();1262 IEM_MC_END();1263 break;1264 1265 IEM_NOT_REACHED_DEFAULT_CASE_RET();1266 }1267 }1268 else1269 {1270 /*1271 * We're accessing memory.1272 */1273 switch (pVCpu->iem.s.enmEffOpSize)1274 {1275 case IEMMODE_16BIT:1276 IEM_MC_BEGIN(3, 1);1277 IEM_MC_ARG(uint16_t *, pu16Dst, 0);1278 IEM_MC_ARG(uint16_t, u16Src, 1);1279 IEM_MC_ARG(uint32_t *, pEFlags, 2);1280 IEM_MC_LOCAL(RTGCPTR, GCPtrEffDst);1281 1282 IEM_MC_CALC_RM_EFF_ADDR(GCPtrEffDst, bRm, 0);1283 IEMOP_HLP_DONE_DECODING_NO_LOCK_PREFIX();1284 IEM_MC_FETCH_MEM_U16(u16Src, pVCpu->iem.s.iEffSeg, GCPtrEffDst);1285 IEM_MC_REF_GREG_U16(pu16Dst, IEM_GET_MODRM_REG(pVCpu, bRm));1286 IEM_MC_REF_EFLAGS(pEFlags);1287 IEM_MC_CALL_VOID_AIMPL_3(pImpl->pfnNormalU16, pu16Dst, u16Src, pEFlags);1288 1289 IEM_MC_ADVANCE_RIP_AND_FINISH();1290 IEM_MC_END();1291 break;1292 1293 case IEMMODE_32BIT:1294 IEM_MC_BEGIN(3, 1);1295 IEM_MC_ARG(uint32_t *, pu32Dst, 0);1296 IEM_MC_ARG(uint32_t, u32Src, 1);1297 IEM_MC_ARG(uint32_t *, pEFlags, 2);1298 IEM_MC_LOCAL(RTGCPTR, GCPtrEffDst);1299 1300 IEM_MC_CALC_RM_EFF_ADDR(GCPtrEffDst, bRm, 0);1301 IEMOP_HLP_DONE_DECODING_NO_LOCK_PREFIX();1302 IEM_MC_FETCH_MEM_U32(u32Src, pVCpu->iem.s.iEffSeg, GCPtrEffDst);1303 IEM_MC_REF_GREG_U32(pu32Dst, IEM_GET_MODRM_REG(pVCpu, bRm));1304 IEM_MC_REF_EFLAGS(pEFlags);1305 IEM_MC_CALL_VOID_AIMPL_3(pImpl->pfnNormalU32, pu32Dst, u32Src, pEFlags);1306 1307 if (pImpl != &g_iemAImpl_cmp)1308 IEM_MC_CLEAR_HIGH_GREG_U64_BY_REF(pu32Dst);1309 IEM_MC_ADVANCE_RIP_AND_FINISH();1310 IEM_MC_END();1311 break;1312 1313 case IEMMODE_64BIT:1314 IEM_MC_BEGIN(3, 1);1315 IEM_MC_ARG(uint64_t *, pu64Dst, 0);1316 IEM_MC_ARG(uint64_t, u64Src, 1);1317 IEM_MC_ARG(uint32_t *, pEFlags, 2);1318 IEM_MC_LOCAL(RTGCPTR, GCPtrEffDst);1319 1320 IEM_MC_CALC_RM_EFF_ADDR(GCPtrEffDst, bRm, 0);1321 IEMOP_HLP_DONE_DECODING_NO_LOCK_PREFIX();1322 IEM_MC_FETCH_MEM_U64(u64Src, pVCpu->iem.s.iEffSeg, GCPtrEffDst);1323 IEM_MC_REF_GREG_U64(pu64Dst, IEM_GET_MODRM_REG(pVCpu, bRm));1324 IEM_MC_REF_EFLAGS(pEFlags);1325 IEM_MC_CALL_VOID_AIMPL_3(pImpl->pfnNormalU64, pu64Dst, u64Src, pEFlags);1326 1327 IEM_MC_ADVANCE_RIP_AND_FINISH();1328 IEM_MC_END();1329 break;1330 1331 IEM_NOT_REACHED_DEFAULT_CASE_RET();1332 }1333 }1334 }1335 1336 1337 /**1338 * Common worker for instructions like ADD, AND, OR, ++ with working on AL with1339 * a byte immediate.1340 *1341 * @param pImpl Pointer to the instruction implementation (assembly).1342 */1343 FNIEMOP_DEF_1(iemOpHlpBinaryOperator_AL_Ib, PCIEMOPBINSIZES, pImpl)1344 {1345 uint8_t u8Imm; IEM_OPCODE_GET_NEXT_U8(&u8Imm);1346 IEMOP_HLP_DONE_DECODING_NO_LOCK_PREFIX();1347 1348 IEM_MC_BEGIN(3, 0);1349 IEM_MC_ARG(uint8_t *, pu8Dst, 0);1350 IEM_MC_ARG_CONST(uint8_t, u8Src,/*=*/ u8Imm, 1);1351 IEM_MC_ARG(uint32_t *, pEFlags, 2);1352 1353 IEM_MC_REF_GREG_U8(pu8Dst, X86_GREG_xAX);1354 IEM_MC_REF_EFLAGS(pEFlags);1355 IEM_MC_CALL_VOID_AIMPL_3(pImpl->pfnNormalU8, pu8Dst, u8Src, pEFlags);1356 1357 IEM_MC_ADVANCE_RIP_AND_FINISH();1358 IEM_MC_END();1359 }1360 1361 1362 /**1363 * Common worker for instructions like ADD, AND, OR, ++ with working on1364 * AX/EAX/RAX with a word/dword immediate.1365 *1366 * @param pImpl Pointer to the instruction implementation (assembly).1367 */1368 FNIEMOP_DEF_1(iemOpHlpBinaryOperator_rAX_Iz, PCIEMOPBINSIZES, pImpl)1369 {1370 switch (pVCpu->iem.s.enmEffOpSize)1371 {1372 case IEMMODE_16BIT:1373 {1374 uint16_t u16Imm; IEM_OPCODE_GET_NEXT_U16(&u16Imm);1375 IEMOP_HLP_DONE_DECODING_NO_LOCK_PREFIX();1376 1377 IEM_MC_BEGIN(3, 0);1378 IEM_MC_ARG(uint16_t *, pu16Dst, 0);1379 IEM_MC_ARG_CONST(uint16_t, u16Src,/*=*/ u16Imm, 1);1380 IEM_MC_ARG(uint32_t *, pEFlags, 2);1381 1382 IEM_MC_REF_GREG_U16(pu16Dst, X86_GREG_xAX);1383 IEM_MC_REF_EFLAGS(pEFlags);1384 IEM_MC_CALL_VOID_AIMPL_3(pImpl->pfnNormalU16, pu16Dst, u16Src, pEFlags);1385 1386 IEM_MC_ADVANCE_RIP_AND_FINISH();1387 IEM_MC_END();1388 return VINF_SUCCESS;1389 }1390 1391 case IEMMODE_32BIT:1392 {1393 uint32_t u32Imm; IEM_OPCODE_GET_NEXT_U32(&u32Imm);1394 IEMOP_HLP_DONE_DECODING_NO_LOCK_PREFIX();1395 1396 IEM_MC_BEGIN(3, 0);1397 IEM_MC_ARG(uint32_t *, pu32Dst, 0);1398 IEM_MC_ARG_CONST(uint32_t, u32Src,/*=*/ u32Imm, 1);1399 IEM_MC_ARG(uint32_t *, pEFlags, 2);1400 1401 IEM_MC_REF_GREG_U32(pu32Dst, X86_GREG_xAX);1402 IEM_MC_REF_EFLAGS(pEFlags);1403 IEM_MC_CALL_VOID_AIMPL_3(pImpl->pfnNormalU32, pu32Dst, u32Src, pEFlags);1404 1405 if ((pImpl != &g_iemAImpl_test) && (pImpl != &g_iemAImpl_cmp))1406 IEM_MC_CLEAR_HIGH_GREG_U64_BY_REF(pu32Dst);1407 IEM_MC_ADVANCE_RIP_AND_FINISH();1408 IEM_MC_END();1409 return VINF_SUCCESS;1410 }1411 1412 case IEMMODE_64BIT:1413 {1414 uint64_t u64Imm; IEM_OPCODE_GET_NEXT_S32_SX_U64(&u64Imm);1415 IEMOP_HLP_DONE_DECODING_NO_LOCK_PREFIX();1416 1417 IEM_MC_BEGIN(3, 0);1418 IEM_MC_ARG(uint64_t *, pu64Dst, 0);1419 IEM_MC_ARG_CONST(uint64_t, u64Src,/*=*/ u64Imm, 1);1420 IEM_MC_ARG(uint32_t *, pEFlags, 2);1421 1422 IEM_MC_REF_GREG_U64(pu64Dst, X86_GREG_xAX);1423 IEM_MC_REF_EFLAGS(pEFlags);1424 IEM_MC_CALL_VOID_AIMPL_3(pImpl->pfnNormalU64, pu64Dst, u64Src, pEFlags);1425 1426 IEM_MC_ADVANCE_RIP_AND_FINISH();1427 IEM_MC_END();1428 return VINF_SUCCESS;1429 }1430 1431 IEM_NOT_REACHED_DEFAULT_CASE_RET();1432 }1433 }1434 1435 1436 /** Opcodes 0xf1, 0xd6. */1437 FNIEMOP_DEF(iemOp_Invalid)1438 {1439 IEMOP_MNEMONIC(Invalid, "Invalid");1440 return IEMOP_RAISE_INVALID_OPCODE();1441 }1442 1443 1444 /** Invalid with RM byte . */1445 FNIEMOPRM_DEF(iemOp_InvalidWithRM)1446 {1447 RT_NOREF_PV(bRm);1448 IEMOP_MNEMONIC(InvalidWithRm, "InvalidWithRM");1449 return IEMOP_RAISE_INVALID_OPCODE();1450 }1451 1452 1453 /** Invalid with RM byte where intel decodes any additional address encoding1454 * bytes. */1455 FNIEMOPRM_DEF(iemOp_InvalidWithRMNeedDecode)1456 {1457 IEMOP_MNEMONIC(InvalidWithRMNeedDecode, "InvalidWithRMNeedDecode");1458 if (pVCpu->iem.s.enmCpuVendor == CPUMCPUVENDOR_INTEL)1459 {1460 #ifndef TST_IEM_CHECK_MC1461 if (IEM_IS_MODRM_MEM_MODE(bRm))1462 {1463 RTGCPTR GCPtrEff;1464 VBOXSTRICTRC rcStrict = iemOpHlpCalcRmEffAddr(pVCpu, bRm, 0, &GCPtrEff);1465 if (rcStrict != VINF_SUCCESS)1466 return rcStrict;1467 }1468 #endif1469 }1470 IEMOP_HLP_DONE_DECODING();1471 return IEMOP_RAISE_INVALID_OPCODE();1472 }1473 1474 1475 /** Invalid with RM byte where both AMD and Intel decodes any additional1476 * address encoding bytes. */1477 FNIEMOPRM_DEF(iemOp_InvalidWithRMAllNeeded)1478 {1479 IEMOP_MNEMONIC(InvalidWithRMAllNeeded, "InvalidWithRMAllNeeded");1480 #ifndef TST_IEM_CHECK_MC1481 if (IEM_IS_MODRM_MEM_MODE(bRm))1482 {1483 RTGCPTR GCPtrEff;1484 VBOXSTRICTRC rcStrict = iemOpHlpCalcRmEffAddr(pVCpu, bRm, 0, &GCPtrEff);1485 if (rcStrict != VINF_SUCCESS)1486 return rcStrict;1487 }1488 #endif1489 IEMOP_HLP_DONE_DECODING();1490 return IEMOP_RAISE_INVALID_OPCODE();1491 }1492 1493 1494 /** Invalid with RM byte where intel requires 8-byte immediate.1495 * Intel will also need SIB and displacement if bRm indicates memory. */1496 FNIEMOPRM_DEF(iemOp_InvalidWithRMNeedImm8)1497 {1498 IEMOP_MNEMONIC(InvalidWithRMNeedImm8, "InvalidWithRMNeedImm8");1499 if (pVCpu->iem.s.enmCpuVendor == CPUMCPUVENDOR_INTEL)1500 {1501 #ifndef TST_IEM_CHECK_MC1502 if (IEM_IS_MODRM_MEM_MODE(bRm))1503 {1504 RTGCPTR GCPtrEff;1505 VBOXSTRICTRC rcStrict = iemOpHlpCalcRmEffAddr(pVCpu, bRm, 0, &GCPtrEff);1506 if (rcStrict != VINF_SUCCESS)1507 return rcStrict;1508 }1509 #endif1510 uint8_t bImm8; IEM_OPCODE_GET_NEXT_U8(&bImm8); RT_NOREF(bRm);1511 }1512 IEMOP_HLP_DONE_DECODING();1513 return IEMOP_RAISE_INVALID_OPCODE();1514 }1515 1516 1517 /** Invalid with RM byte where intel requires 8-byte immediate.1518 * Both AMD and Intel also needs SIB and displacement according to bRm. */1519 FNIEMOPRM_DEF(iemOp_InvalidWithRMAllNeedImm8)1520 {1521 IEMOP_MNEMONIC(InvalidWithRMAllNeedImm8, "InvalidWithRMAllNeedImm8");1522 #ifndef TST_IEM_CHECK_MC1523 if (IEM_IS_MODRM_MEM_MODE(bRm))1524 {1525 RTGCPTR GCPtrEff;1526 VBOXSTRICTRC rcStrict = iemOpHlpCalcRmEffAddr(pVCpu, bRm, 0, &GCPtrEff);1527 if (rcStrict != VINF_SUCCESS)1528 return rcStrict;1529 }1530 #endif1531 uint8_t bImm8; IEM_OPCODE_GET_NEXT_U8(&bImm8); RT_NOREF(bRm);1532 IEMOP_HLP_DONE_DECODING();1533 return IEMOP_RAISE_INVALID_OPCODE();1534 }1535 1536 1537 /** Invalid opcode where intel requires Mod R/M sequence. */1538 FNIEMOP_DEF(iemOp_InvalidNeedRM)1539 {1540 IEMOP_MNEMONIC(InvalidNeedRM, "InvalidNeedRM");1541 if (pVCpu->iem.s.enmCpuVendor == CPUMCPUVENDOR_INTEL)1542 {1543 uint8_t bRm; IEM_OPCODE_GET_NEXT_U8(&bRm); RT_NOREF(bRm);1544 #ifndef TST_IEM_CHECK_MC1545 if (IEM_IS_MODRM_MEM_MODE(bRm))1546 {1547 RTGCPTR GCPtrEff;1548 VBOXSTRICTRC rcStrict = iemOpHlpCalcRmEffAddr(pVCpu, bRm, 0, &GCPtrEff);1549 if (rcStrict != VINF_SUCCESS)1550 return rcStrict;1551 }1552 #endif1553 }1554 IEMOP_HLP_DONE_DECODING();1555 return IEMOP_RAISE_INVALID_OPCODE();1556 }1557 1558 1559 /** Invalid opcode where both AMD and Intel requires Mod R/M sequence. */1560 FNIEMOP_DEF(iemOp_InvalidAllNeedRM)1561 {1562 IEMOP_MNEMONIC(InvalidAllNeedRM, "InvalidAllNeedRM");1563 uint8_t bRm; IEM_OPCODE_GET_NEXT_U8(&bRm); RT_NOREF(bRm);1564 #ifndef TST_IEM_CHECK_MC1565 if (IEM_IS_MODRM_MEM_MODE(bRm))1566 {1567 RTGCPTR GCPtrEff;1568 VBOXSTRICTRC rcStrict = iemOpHlpCalcRmEffAddr(pVCpu, bRm, 0, &GCPtrEff);1569 if (rcStrict != VINF_SUCCESS)1570 return rcStrict;1571 }1572 #endif1573 IEMOP_HLP_DONE_DECODING();1574 return IEMOP_RAISE_INVALID_OPCODE();1575 }1576 1577 1578 /** Invalid opcode where intel requires Mod R/M sequence and 8-byte1579 * immediate. */1580 FNIEMOP_DEF(iemOp_InvalidNeedRMImm8)1581 {1582 IEMOP_MNEMONIC(InvalidNeedRMImm8, "InvalidNeedRMImm8");1583 if (pVCpu->iem.s.enmCpuVendor == CPUMCPUVENDOR_INTEL)1584 {1585 uint8_t bRm; IEM_OPCODE_GET_NEXT_U8(&bRm); RT_NOREF(bRm);1586 #ifndef TST_IEM_CHECK_MC1587 if (IEM_IS_MODRM_MEM_MODE(bRm))1588 {1589 RTGCPTR GCPtrEff;1590 VBOXSTRICTRC rcStrict = iemOpHlpCalcRmEffAddr(pVCpu, bRm, 0, &GCPtrEff);1591 if (rcStrict != VINF_SUCCESS)1592 return rcStrict;1593 }1594 #endif1595 uint8_t bImm; IEM_OPCODE_GET_NEXT_U8(&bImm); RT_NOREF(bImm);1596 }1597 IEMOP_HLP_DONE_DECODING();1598 return IEMOP_RAISE_INVALID_OPCODE();1599 }1600 1601 1602 /** Invalid opcode where intel requires a 3rd escape byte and a Mod R/M1603 * sequence. */1604 FNIEMOP_DEF(iemOp_InvalidNeed3ByteEscRM)1605 {1606 IEMOP_MNEMONIC(InvalidNeed3ByteEscRM, "InvalidNeed3ByteEscRM");1607 if (pVCpu->iem.s.enmCpuVendor == CPUMCPUVENDOR_INTEL)1608 {1609 uint8_t b3rd; IEM_OPCODE_GET_NEXT_U8(&b3rd); RT_NOREF(b3rd);1610 uint8_t bRm; IEM_OPCODE_GET_NEXT_U8(&bRm); RT_NOREF(bRm);1611 #ifndef TST_IEM_CHECK_MC1612 if (IEM_IS_MODRM_MEM_MODE(bRm))1613 {1614 RTGCPTR GCPtrEff;1615 VBOXSTRICTRC rcStrict = iemOpHlpCalcRmEffAddr(pVCpu, bRm, 0, &GCPtrEff);1616 if (rcStrict != VINF_SUCCESS)1617 return rcStrict;1618 }1619 #endif1620 }1621 IEMOP_HLP_DONE_DECODING();1622 return IEMOP_RAISE_INVALID_OPCODE();1623 }1624 1625 1626 /** Invalid opcode where intel requires a 3rd escape byte, Mod R/M sequence, and1627 * a 8-byte immediate. */1628 FNIEMOP_DEF(iemOp_InvalidNeed3ByteEscRMImm8)1629 {1630 IEMOP_MNEMONIC(InvalidNeed3ByteEscRMImm8, "InvalidNeed3ByteEscRMImm8");1631 if (pVCpu->iem.s.enmCpuVendor == CPUMCPUVENDOR_INTEL)1632 {1633 uint8_t b3rd; IEM_OPCODE_GET_NEXT_U8(&b3rd); RT_NOREF(b3rd);1634 uint8_t bRm; IEM_OPCODE_GET_NEXT_U8(&bRm); RT_NOREF(bRm);1635 #ifndef TST_IEM_CHECK_MC1636 if (IEM_IS_MODRM_MEM_MODE(bRm))1637 {1638 RTGCPTR GCPtrEff;1639 VBOXSTRICTRC rcStrict = iemOpHlpCalcRmEffAddr(pVCpu, bRm, 1, &GCPtrEff);1640 if (rcStrict != VINF_SUCCESS)1641 return rcStrict;1642 }1643 #endif1644 uint8_t bImm; IEM_OPCODE_GET_NEXT_U8(&bImm); RT_NOREF(bImm);1645 IEMOP_HLP_DONE_DECODING();1646 }1647 return IEMOP_RAISE_INVALID_OPCODE();1648 }1649 1650 1651 /** Repeats a_fn four times. For decoding tables. */1652 #define IEMOP_X4(a_fn) a_fn, a_fn, a_fn, a_fn1653 89 1654 90 /* … … 1658 94 # include "IEMAllInstructions3DNow.cpp.h" 1659 95 #endif 96 1660 97 #ifdef IEM_WITH_THREE_0F_38 1661 98 # include "IEMAllInstructionsThree0f38.cpp.h" 1662 99 #endif 100 1663 101 #ifdef IEM_WITH_THREE_0F_3A 1664 102 # include "IEMAllInstructionsThree0f3a.cpp.h" 1665 103 #endif 104 105 #ifdef _MSC_VER 106 # pragma warning(push) 107 # pragma warning(disable: 4702) /* Unreachable code like return after IEM_MC_ADVANCE_RIP_AND_FINISH. */ 108 #endif 109 1666 110 #include "IEMAllInstructionsTwoByte0f.cpp.h" 111 1667 112 #ifdef IEM_WITH_VEX 1668 113 # include "IEMAllInstructionsVexMap1.cpp.h" … … 1670 115 # include "IEMAllInstructionsVexMap3.cpp.h" 1671 116 #endif 117 1672 118 #include "IEMAllInstructionsOneByte.cpp.h" 1673 1674 1675 119 #ifdef _MSC_VER 1676 120 # pragma warning(pop)
Note:
See TracChangeset
for help on using the changeset viewer.