- Timestamp:
- Mar 2, 2024 1:55:02 AM (7 months ago)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/src/VBox/VMM/VMMAll/IEMAllInstOneByte.cpp.h
r103643 r103644 288 288 * memory/register as the destination. 289 289 */ 290 #define IEMOP_BODY_BINARY_rm_rv_RW(a_fnNormalU16, a_fnNormalU32, a_fnNormalU64 ) \290 #define IEMOP_BODY_BINARY_rm_rv_RW(a_fnNormalU16, a_fnNormalU32, a_fnNormalU64, a_EmitterBasename, a_fRegRegNativeArchs, a_fMemRegNativeArchs) \ 291 291 uint8_t bRm; IEM_OPCODE_GET_NEXT_U8(&bRm); \ 292 292 \ … … 301 301 IEM_MC_BEGIN(3, 0, 0, 0); \ 302 302 IEMOP_HLP_DONE_DECODING_NO_LOCK_PREFIX(); \ 303 IEM_MC_ARG(uint16_t *, pu16Dst, 0); \304 303 IEM_MC_ARG(uint16_t, u16Src, 1); \ 305 IEM_MC_ARG(uint32_t *, pEFlags, 2); \306 \307 304 IEM_MC_FETCH_GREG_U16(u16Src, IEM_GET_MODRM_REG(pVCpu, bRm)); \ 308 IEM_MC_REF_GREG_U16(pu16Dst, IEM_GET_MODRM_RM(pVCpu, bRm)); \ 309 IEM_MC_REF_EFLAGS(pEFlags); \ 310 IEM_MC_CALL_VOID_AIMPL_3(a_fnNormalU16, pu16Dst, u16Src, pEFlags); \ 311 \ 305 IEM_MC_NATIVE_IF(a_fRegRegNativeArchs) { \ 306 IEM_MC_LOCAL(uint16_t, u16Dst); \ 307 IEM_MC_FETCH_GREG_U16(u16Dst, IEM_GET_MODRM_RM(pVCpu, bRm)); \ 308 /** @todo IEM_MC_LOCAL_EFLAGS(uEFlags); */ \ 309 IEM_MC_LOCAL(uint32_t, uEFlags); \ 310 IEM_MC_FETCH_EFLAGS(uEFlags); \ 311 IEM_MC_NATIVE_EMIT_4(RT_CONCAT3(iemNativeEmit_,a_EmitterBasename,_r_r_efl), u16Dst, u16Src, uEFlags, 16); \ 312 IEM_MC_STORE_GREG_U16(IEM_GET_MODRM_RM(pVCpu, bRm), u16Dst); \ 313 IEM_MC_COMMIT_EFLAGS(uEFlags); \ 314 } IEM_MC_NATIVE_ELSE() { \ 315 IEM_MC_ARG(uint16_t *, pu16Dst, 0); \ 316 IEM_MC_REF_GREG_U16(pu16Dst, IEM_GET_MODRM_RM(pVCpu, bRm)); \ 317 IEM_MC_ARG(uint32_t *, pEFlags, 2); \ 318 IEM_MC_REF_EFLAGS(pEFlags); \ 319 IEM_MC_CALL_VOID_AIMPL_3(a_fnNormalU16, pu16Dst, u16Src, pEFlags); \ 320 } IEM_MC_NATIVE_ENDIF(); \ 312 321 IEM_MC_ADVANCE_RIP_AND_FINISH(); \ 313 322 IEM_MC_END(); \ … … 317 326 IEM_MC_BEGIN(3, 0, IEM_MC_F_MIN_386, 0); \ 318 327 IEMOP_HLP_DONE_DECODING_NO_LOCK_PREFIX(); \ 319 IEM_MC_ARG(uint32_t *, pu32Dst, 0); \320 328 IEM_MC_ARG(uint32_t, u32Src, 1); \ 321 IEM_MC_ARG(uint32_t *, pEFlags, 2); \322 \323 329 IEM_MC_FETCH_GREG_U32(u32Src, IEM_GET_MODRM_REG(pVCpu, bRm)); \ 324 IEM_MC_REF_GREG_U32(pu32Dst, IEM_GET_MODRM_RM(pVCpu, bRm)); \ 325 IEM_MC_REF_EFLAGS(pEFlags); \ 326 IEM_MC_CALL_VOID_AIMPL_3(a_fnNormalU32, pu32Dst, u32Src, pEFlags); \ 327 \ 328 IEM_MC_CLEAR_HIGH_GREG_U64(IEM_GET_MODRM_RM(pVCpu, bRm)); \ 330 IEM_MC_NATIVE_IF(a_fRegRegNativeArchs) { \ 331 IEM_MC_LOCAL(uint32_t, u32Dst); \ 332 IEM_MC_FETCH_GREG_U32(u32Dst, IEM_GET_MODRM_RM(pVCpu, bRm)); \ 333 /** @todo IEM_MC_LOCAL_EFLAGS(uEFlags); */ \ 334 IEM_MC_LOCAL(uint32_t, uEFlags); \ 335 IEM_MC_FETCH_EFLAGS(uEFlags); \ 336 IEM_MC_NATIVE_EMIT_4(RT_CONCAT3(iemNativeEmit_,a_EmitterBasename,_r_r_efl), u32Dst, u32Src, uEFlags, 32); \ 337 IEM_MC_STORE_GREG_U32(IEM_GET_MODRM_RM(pVCpu, bRm), u32Dst); \ 338 IEM_MC_COMMIT_EFLAGS(uEFlags); \ 339 } IEM_MC_NATIVE_ELSE() { \ 340 IEM_MC_ARG(uint32_t *, pu32Dst, 0); \ 341 IEM_MC_REF_GREG_U32(pu32Dst, IEM_GET_MODRM_RM(pVCpu, bRm)); \ 342 IEM_MC_ARG(uint32_t *, pEFlags, 2); \ 343 IEM_MC_REF_EFLAGS(pEFlags); \ 344 IEM_MC_CALL_VOID_AIMPL_3(a_fnNormalU32, pu32Dst, u32Src, pEFlags); \ 345 IEM_MC_CLEAR_HIGH_GREG_U64(IEM_GET_MODRM_RM(pVCpu, bRm)); \ 346 } IEM_MC_NATIVE_ENDIF(); \ 329 347 IEM_MC_ADVANCE_RIP_AND_FINISH(); \ 330 348 IEM_MC_END(); \ … … 334 352 IEM_MC_BEGIN(3, 0, IEM_MC_F_64BIT, 0); \ 335 353 IEMOP_HLP_DONE_DECODING_NO_LOCK_PREFIX(); \ 336 IEM_MC_ARG(uint64_t *, pu64Dst, 0); \ 337 IEM_MC_ARG(uint64_t, u64Src, 1); \ 338 IEM_MC_ARG(uint32_t *, pEFlags, 2); \ 339 \ 354 IEM_MC_ARG(uint64_t, u64Src, 1); \ 340 355 IEM_MC_FETCH_GREG_U64(u64Src, IEM_GET_MODRM_REG(pVCpu, bRm)); \ 341 IEM_MC_REF_GREG_U64(pu64Dst, IEM_GET_MODRM_RM(pVCpu, bRm)); \ 342 IEM_MC_REF_EFLAGS(pEFlags); \ 343 IEM_MC_CALL_VOID_AIMPL_3(a_fnNormalU64, pu64Dst, u64Src, pEFlags); \ 344 \ 356 IEM_MC_NATIVE_IF(a_fRegRegNativeArchs) { \ 357 IEM_MC_LOCAL(uint64_t, u64Dst); \ 358 IEM_MC_FETCH_GREG_U64(u64Dst, IEM_GET_MODRM_RM(pVCpu, bRm)); \ 359 /** @todo IEM_MC_LOCAL_EFLAGS(uEFlags); */ \ 360 IEM_MC_LOCAL(uint32_t, uEFlags); \ 361 IEM_MC_FETCH_EFLAGS(uEFlags); \ 362 IEM_MC_NATIVE_EMIT_4(RT_CONCAT3(iemNativeEmit_,a_EmitterBasename,_r_r_efl), u64Dst, u64Src, uEFlags, 64); \ 363 IEM_MC_STORE_GREG_U64(IEM_GET_MODRM_RM(pVCpu, bRm), u64Dst); \ 364 IEM_MC_COMMIT_EFLAGS(uEFlags); \ 365 } IEM_MC_NATIVE_ELSE() { \ 366 IEM_MC_ARG(uint64_t *, pu64Dst, 0); \ 367 IEM_MC_REF_GREG_U64(pu64Dst, IEM_GET_MODRM_RM(pVCpu, bRm)); \ 368 IEM_MC_ARG(uint32_t *, pEFlags, 2); \ 369 IEM_MC_REF_EFLAGS(pEFlags); \ 370 IEM_MC_CALL_VOID_AIMPL_3(a_fnNormalU64, pu64Dst, u64Src, pEFlags); \ 371 } IEM_MC_NATIVE_ENDIF(); \ 345 372 IEM_MC_ADVANCE_RIP_AND_FINISH(); \ 346 373 IEM_MC_END(); \ … … 507 534 * memory/register as the destination. 508 535 */ 509 #define IEMOP_BODY_BINARY_rm_rv_RO(a_fnNormalU16, a_fnNormalU32, a_fnNormalU64 ) \536 #define IEMOP_BODY_BINARY_rm_rv_RO(a_fnNormalU16, a_fnNormalU32, a_fnNormalU64, a_EmitterBasename, a_fRegRegNativeArchs, a_fMemRegNativeArchs) \ 510 537 uint8_t bRm; IEM_OPCODE_GET_NEXT_U8(&bRm); \ 511 538 \ … … 520 547 IEM_MC_BEGIN(3, 0, 0, 0); \ 521 548 IEMOP_HLP_DONE_DECODING_NO_LOCK_PREFIX(); \ 522 IEM_MC_ARG(uint16_t *, pu16Dst, 0); \523 549 IEM_MC_ARG(uint16_t, u16Src, 1); \ 524 IEM_MC_ARG(uint32_t *, pEFlags, 2); \525 \526 550 IEM_MC_FETCH_GREG_U16(u16Src, IEM_GET_MODRM_REG(pVCpu, bRm)); \ 527 IEM_MC_REF_GREG_U16(pu16Dst, IEM_GET_MODRM_RM(pVCpu, bRm)); \ 528 IEM_MC_REF_EFLAGS(pEFlags); \ 529 IEM_MC_CALL_VOID_AIMPL_3(a_fnNormalU16, pu16Dst, u16Src, pEFlags); \ 530 \ 551 IEM_MC_NATIVE_IF(a_fRegRegNativeArchs) { \ 552 IEM_MC_LOCAL(uint16_t, u16Dst); \ 553 IEM_MC_FETCH_GREG_U16(u16Dst, IEM_GET_MODRM_RM(pVCpu, bRm)); \ 554 /** @todo IEM_MC_LOCAL_EFLAGS(uEFlags); */ \ 555 IEM_MC_LOCAL(uint32_t, uEFlags); \ 556 IEM_MC_FETCH_EFLAGS(uEFlags); \ 557 IEM_MC_NATIVE_EMIT_4(RT_CONCAT3(iemNativeEmit_,a_EmitterBasename,_r_r_efl), u16Dst, u16Src, uEFlags, 16); \ 558 IEM_MC_STORE_GREG_U16(IEM_GET_MODRM_RM(pVCpu, bRm), u16Dst); \ 559 IEM_MC_COMMIT_EFLAGS(uEFlags); \ 560 } IEM_MC_NATIVE_ELSE() { \ 561 IEM_MC_ARG(uint16_t *, pu16Dst, 0); \ 562 IEM_MC_REF_GREG_U16(pu16Dst, IEM_GET_MODRM_RM(pVCpu, bRm)); \ 563 IEM_MC_ARG(uint32_t *, pEFlags, 2); \ 564 IEM_MC_REF_EFLAGS(pEFlags); \ 565 IEM_MC_CALL_VOID_AIMPL_3(a_fnNormalU16, pu16Dst, u16Src, pEFlags); \ 566 } IEM_MC_NATIVE_ENDIF(); \ 531 567 IEM_MC_ADVANCE_RIP_AND_FINISH(); \ 532 568 IEM_MC_END(); \ … … 536 572 IEM_MC_BEGIN(3, 0, IEM_MC_F_MIN_386, 0); \ 537 573 IEMOP_HLP_DONE_DECODING_NO_LOCK_PREFIX(); \ 538 IEM_MC_ARG(uint32_t *, pu32Dst, 0); \539 574 IEM_MC_ARG(uint32_t, u32Src, 1); \ 540 IEM_MC_ARG(uint32_t *, pEFlags, 2); \541 \542 575 IEM_MC_FETCH_GREG_U32(u32Src, IEM_GET_MODRM_REG(pVCpu, bRm)); \ 543 IEM_MC_REF_GREG_U32(pu32Dst, IEM_GET_MODRM_RM(pVCpu, bRm)); \ 544 IEM_MC_REF_EFLAGS(pEFlags); \ 545 IEM_MC_CALL_VOID_AIMPL_3(a_fnNormalU32, pu32Dst, u32Src, pEFlags); \ 546 \ 576 IEM_MC_NATIVE_IF(a_fRegRegNativeArchs) { \ 577 IEM_MC_LOCAL(uint32_t, u32Dst); \ 578 IEM_MC_FETCH_GREG_U32(u32Dst, IEM_GET_MODRM_RM(pVCpu, bRm)); \ 579 /** @todo IEM_MC_LOCAL_EFLAGS(uEFlags); */ \ 580 IEM_MC_LOCAL(uint32_t, uEFlags); \ 581 IEM_MC_FETCH_EFLAGS(uEFlags); \ 582 IEM_MC_NATIVE_EMIT_4(RT_CONCAT3(iemNativeEmit_,a_EmitterBasename,_r_r_efl), u32Dst, u32Src, uEFlags, 32); \ 583 IEM_MC_STORE_GREG_U32(IEM_GET_MODRM_RM(pVCpu, bRm), u32Dst); \ 584 IEM_MC_COMMIT_EFLAGS(uEFlags); \ 585 } IEM_MC_NATIVE_ELSE() { \ 586 IEM_MC_ARG(uint32_t *, pu32Dst, 0); \ 587 IEM_MC_REF_GREG_U32(pu32Dst, IEM_GET_MODRM_RM(pVCpu, bRm)); \ 588 IEM_MC_ARG(uint32_t *, pEFlags, 2); \ 589 IEM_MC_REF_EFLAGS(pEFlags); \ 590 IEM_MC_CALL_VOID_AIMPL_3(a_fnNormalU32, pu32Dst, u32Src, pEFlags); \ 591 } IEM_MC_NATIVE_ENDIF(); \ 547 592 IEM_MC_ADVANCE_RIP_AND_FINISH(); \ 548 593 IEM_MC_END(); \ … … 552 597 IEM_MC_BEGIN(3, 0, IEM_MC_F_64BIT, 0); \ 553 598 IEMOP_HLP_DONE_DECODING_NO_LOCK_PREFIX(); \ 554 IEM_MC_ARG(uint64_t *, pu64Dst, 0); \ 555 IEM_MC_ARG(uint64_t, u64Src, 1); \ 556 IEM_MC_ARG(uint32_t *, pEFlags, 2); \ 557 \ 599 IEM_MC_ARG(uint64_t, u64Src, 1); \ 558 600 IEM_MC_FETCH_GREG_U64(u64Src, IEM_GET_MODRM_REG(pVCpu, bRm)); \ 559 IEM_MC_REF_GREG_U64(pu64Dst, IEM_GET_MODRM_RM(pVCpu, bRm)); \ 560 IEM_MC_REF_EFLAGS(pEFlags); \ 561 IEM_MC_CALL_VOID_AIMPL_3(a_fnNormalU64, pu64Dst, u64Src, pEFlags); \ 562 \ 601 IEM_MC_NATIVE_IF(a_fRegRegNativeArchs) { \ 602 IEM_MC_LOCAL(uint64_t, u64Dst); \ 603 IEM_MC_FETCH_GREG_U64(u64Dst, IEM_GET_MODRM_RM(pVCpu, bRm)); \ 604 /** @todo IEM_MC_LOCAL_EFLAGS(uEFlags); */ \ 605 IEM_MC_LOCAL(uint32_t, uEFlags); \ 606 IEM_MC_FETCH_EFLAGS(uEFlags); \ 607 IEM_MC_NATIVE_EMIT_4(RT_CONCAT3(iemNativeEmit_,a_EmitterBasename,_r_r_efl), u64Dst, u64Src, uEFlags, 64); \ 608 IEM_MC_STORE_GREG_U64(IEM_GET_MODRM_RM(pVCpu, bRm), u64Dst); \ 609 IEM_MC_COMMIT_EFLAGS(uEFlags); \ 610 } IEM_MC_NATIVE_ELSE() { \ 611 IEM_MC_ARG(uint64_t *, pu64Dst, 0); \ 612 IEM_MC_REF_GREG_U64(pu64Dst, IEM_GET_MODRM_RM(pVCpu, bRm)); \ 613 IEM_MC_ARG(uint32_t *, pEFlags, 2); \ 614 IEM_MC_REF_EFLAGS(pEFlags); \ 615 IEM_MC_CALL_VOID_AIMPL_3(a_fnNormalU64, pu64Dst, u64Src, pEFlags); \ 616 } IEM_MC_NATIVE_ENDIF(); \ 563 617 IEM_MC_ADVANCE_RIP_AND_FINISH(); \ 564 618 IEM_MC_END(); \ … … 780 834 { 781 835 IEMOP_MNEMONIC2(MR, ADD, add, Ev, Gv, DISOPTYPE_HARMLESS, IEMOPHINT_LOCK_ALLOWED); 782 IEMOP_BODY_BINARY_rm_rv_RW( iemAImpl_add_u16, iemAImpl_add_u32, iemAImpl_add_u64 );836 IEMOP_BODY_BINARY_rm_rv_RW( iemAImpl_add_u16, iemAImpl_add_u32, iemAImpl_add_u64, add, 0, 0); 783 837 IEMOP_BODY_BINARY_rm_rv_LOCKED(iemAImpl_add_u16_locked, iemAImpl_add_u32_locked, iemAImpl_add_u64_locked); 784 838 } … … 905 959 IEMOP_MNEMONIC2(MR, OR, or, Ev, Gv, DISOPTYPE_HARMLESS, IEMOPHINT_LOCK_ALLOWED); 906 960 IEMOP_VERIFICATION_UNDEFINED_EFLAGS(X86_EFL_AF); 907 IEMOP_BODY_BINARY_rm_rv_RW( iemAImpl_or_u16, iemAImpl_or_u32, iemAImpl_or_u64 );961 IEMOP_BODY_BINARY_rm_rv_RW( iemAImpl_or_u16, iemAImpl_or_u32, iemAImpl_or_u64, or, 0, 0); 908 962 IEMOP_BODY_BINARY_rm_rv_LOCKED(iemAImpl_or_u16_locked, iemAImpl_or_u32_locked, iemAImpl_or_u64_locked); 909 963 } … … 1061 1115 { 1062 1116 IEMOP_MNEMONIC2(MR, ADC, adc, Ev, Gv, DISOPTYPE_HARMLESS, IEMOPHINT_LOCK_ALLOWED); 1063 IEMOP_BODY_BINARY_rm_rv_RW( iemAImpl_adc_u16, iemAImpl_adc_u32, iemAImpl_adc_u64 );1117 IEMOP_BODY_BINARY_rm_rv_RW( iemAImpl_adc_u16, iemAImpl_adc_u32, iemAImpl_adc_u64, adc, 0, 0); 1064 1118 IEMOP_BODY_BINARY_rm_rv_LOCKED(iemAImpl_adc_u16_locked, iemAImpl_adc_u32_locked, iemAImpl_adc_u64_locked); 1065 1119 } … … 1168 1222 { 1169 1223 IEMOP_MNEMONIC2(MR, SBB, sbb, Ev, Gv, DISOPTYPE_HARMLESS, IEMOPHINT_LOCK_ALLOWED); 1170 IEMOP_BODY_BINARY_rm_rv_RW( iemAImpl_sbb_u16, iemAImpl_sbb_u32, iemAImpl_sbb_u64 );1224 IEMOP_BODY_BINARY_rm_rv_RW( iemAImpl_sbb_u16, iemAImpl_sbb_u32, iemAImpl_sbb_u64, sbb, 0, 0); 1171 1225 IEMOP_BODY_BINARY_rm_rv_LOCKED(iemAImpl_sbb_u16_locked, iemAImpl_sbb_u32_locked, iemAImpl_sbb_u64_locked); 1172 1226 } … … 1275 1329 IEMOP_MNEMONIC2(MR, AND, and, Ev, Gv, DISOPTYPE_HARMLESS, IEMOPHINT_LOCK_ALLOWED); 1276 1330 IEMOP_VERIFICATION_UNDEFINED_EFLAGS(X86_EFL_AF); 1277 IEMOP_BODY_BINARY_rm_rv_RW( iemAImpl_and_u16, iemAImpl_and_u32, iemAImpl_and_u64 );1331 IEMOP_BODY_BINARY_rm_rv_RW( iemAImpl_and_u16, iemAImpl_and_u32, iemAImpl_and_u64, and, 0, 0); 1278 1332 IEMOP_BODY_BINARY_rm_rv_LOCKED(iemAImpl_and_u16_locked, iemAImpl_and_u32_locked, iemAImpl_and_u64_locked); 1279 1333 } … … 1389 1443 { 1390 1444 IEMOP_MNEMONIC2(MR, SUB, sub, Ev, Gv, DISOPTYPE_HARMLESS, IEMOPHINT_LOCK_ALLOWED); 1391 IEMOP_BODY_BINARY_rm_rv_RW( iemAImpl_sub_u16, iemAImpl_sub_u32, iemAImpl_sub_u64 );1445 IEMOP_BODY_BINARY_rm_rv_RW( iemAImpl_sub_u16, iemAImpl_sub_u32, iemAImpl_sub_u64, sub, 0, 0); 1392 1446 IEMOP_BODY_BINARY_rm_rv_LOCKED(iemAImpl_sub_u16_locked, iemAImpl_sub_u32_locked, iemAImpl_sub_u64_locked); 1393 1447 } … … 1501 1555 IEMOP_MNEMONIC2(MR, XOR, xor, Ev, Gv, DISOPTYPE_HARMLESS, IEMOPHINT_LOCK_ALLOWED); 1502 1556 IEMOP_VERIFICATION_UNDEFINED_EFLAGS(X86_EFL_AF); 1503 IEMOP_BODY_BINARY_rm_rv_RW( iemAImpl_xor_u16, iemAImpl_xor_u32, iemAImpl_xor_u64 );1557 IEMOP_BODY_BINARY_rm_rv_RW( iemAImpl_xor_u16, iemAImpl_xor_u32, iemAImpl_xor_u64, xor, RT_ARCH_VAL_AMD64 | RT_ARCH_VAL_ARM64, 0); 1504 1558 IEMOP_BODY_BINARY_rm_rv_LOCKED(iemAImpl_xor_u16_locked, iemAImpl_xor_u32_locked, iemAImpl_xor_u64_locked); 1505 1559 } … … 1700 1754 { 1701 1755 IEMOP_MNEMONIC(cmp_Ev_Gv, "cmp Ev,Gv"); 1702 IEMOP_BODY_BINARY_rm_rv_RO(iemAImpl_cmp_u16, iemAImpl_cmp_u32, iemAImpl_cmp_u64 );1756 IEMOP_BODY_BINARY_rm_rv_RO(iemAImpl_cmp_u16, iemAImpl_cmp_u32, iemAImpl_cmp_u64, cmp, 0, 0); 1703 1757 } 1704 1758 … … 5283 5337 IEMOP_MNEMONIC(test_Ev_Gv, "test Ev,Gv"); 5284 5338 IEMOP_VERIFICATION_UNDEFINED_EFLAGS(X86_EFL_AF); 5285 IEMOP_BODY_BINARY_rm_rv_RO(iemAImpl_test_u16, iemAImpl_test_u32, iemAImpl_test_u64 );5339 IEMOP_BODY_BINARY_rm_rv_RO(iemAImpl_test_u16, iemAImpl_test_u32, iemAImpl_test_u64, test, 0, 0); 5286 5340 } 5287 5341
Note:
See TracChangeset
for help on using the changeset viewer.

