Changeset 97607 in vbox for trunk/src/VBox
- Timestamp:
- Nov 18, 2022 10:58:11 AM (2 years ago)
- svn:sync-xref-src-repo-rev:
- 154651
- Location:
- trunk/src/VBox/VMM
- Files:
-
- 3 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/src/VBox/VMM/VMMAll/IEMAllInstructionsThree0f3a.cpp.h
r97547 r97607 329 329 /* Opcode 0x66 0x0f 0x12 - invalid */ 330 330 /* Opcode 0x66 0x0f 0x13 - invalid */ 331 332 331 333 /** Opcode 0x66 0x0f 0x14. */ 332 FNIEMOP_STUB(iemOp_pextrb_RdMb_Vdq_Ib); 334 FNIEMOP_DEF(iemOp_pextrb_RdMb_Vdq_Ib) 335 { 336 uint8_t bRm; IEM_OPCODE_GET_NEXT_U8(&bRm); 337 IEMOP_MNEMONIC3(MRI, PEXTRB, pextrb, Ev, Vq, Ib, DISOPTYPE_HARMLESS | DISOPTYPE_SSE, IEMOPHINT_IGNORES_OP_SIZES); 338 if (IEM_IS_MODRM_REG_MODE(bRm)) 339 { 340 /* 341 * greg32, XMM. 342 */ 343 uint8_t bImm; IEM_OPCODE_GET_NEXT_U8(&bImm); 344 IEMOP_HLP_DONE_DECODING_NO_LOCK_PREFIX(); 345 IEM_MC_BEGIN(0, 1); 346 IEM_MC_LOCAL(uint8_t, uValue); 347 IEM_MC_MAYBE_RAISE_SSE41_RELATED_XCPT(); 348 IEM_MC_PREPARE_SSE_USAGE(); 349 IEM_MC_AND_LOCAL_U8(bImm, 15); 350 IEM_MC_FETCH_XREG_U8(uValue, IEM_GET_MODRM_REG(pVCpu, bRm), bImm /*a_iByte*/); 351 IEM_MC_STORE_GREG_U32(IEM_GET_MODRM_RM(pVCpu, bRm), uValue); 352 IEM_MC_ADVANCE_RIP_AND_FINISH(); 353 IEM_MC_END(); 354 } 355 else 356 { 357 /* 358 * [mem8], XMM. 359 */ 360 IEM_MC_BEGIN(0, 2); 361 IEM_MC_LOCAL(uint8_t, uValue); 362 IEM_MC_LOCAL(RTGCPTR, GCPtrEffSrc); 363 364 IEM_MC_CALC_RM_EFF_ADDR(GCPtrEffSrc, bRm, 1); 365 uint8_t bImm; IEM_OPCODE_GET_NEXT_U8(&bImm); 366 IEMOP_HLP_DONE_DECODING_NO_LOCK_PREFIX(); 367 IEM_MC_MAYBE_RAISE_SSE41_RELATED_XCPT(); 368 IEM_MC_PREPARE_SSE_USAGE(); 369 370 IEM_MC_AND_LOCAL_U8(bImm, 15); 371 IEM_MC_FETCH_XREG_U8(uValue, IEM_GET_MODRM_REG(pVCpu, bRm), bImm /*a_iByte*/); 372 IEM_MC_STORE_MEM_U8(pVCpu->iem.s.iEffSeg, GCPtrEffSrc, uValue); 373 IEM_MC_ADVANCE_RIP_AND_FINISH(); 374 IEM_MC_END(); 375 } 376 } 377 378 333 379 /** Opcode 0x66 0x0f 0x15. */ 334 FNIEMOP_STUB(iemOp_pextrw_RdMw_Vdq_Ib); 380 FNIEMOP_DEF(iemOp_pextrw_RdMw_Vdq_Ib) 381 { 382 uint8_t bRm; IEM_OPCODE_GET_NEXT_U8(&bRm); 383 IEMOP_MNEMONIC3(MRI, PEXTRW, pextrw, Ev, Vq, Ib, DISOPTYPE_HARMLESS | DISOPTYPE_SSE, IEMOPHINT_IGNORES_OP_SIZES); 384 if (IEM_IS_MODRM_REG_MODE(bRm)) 385 { 386 /* 387 * greg32, XMM. 388 */ 389 uint8_t bImm; IEM_OPCODE_GET_NEXT_U8(&bImm); 390 IEMOP_HLP_DONE_DECODING_NO_LOCK_PREFIX(); 391 IEM_MC_BEGIN(0, 1); 392 IEM_MC_LOCAL(uint16_t, uValue); 393 IEM_MC_MAYBE_RAISE_SSE41_RELATED_XCPT(); 394 IEM_MC_PREPARE_SSE_USAGE(); 395 IEM_MC_AND_LOCAL_U8(bImm, 7); 396 IEM_MC_FETCH_XREG_U16(uValue, IEM_GET_MODRM_REG(pVCpu, bRm), bImm /*a_iWord*/); 397 IEM_MC_STORE_GREG_U32(IEM_GET_MODRM_RM(pVCpu, bRm), uValue); 398 IEM_MC_ADVANCE_RIP_AND_FINISH(); 399 IEM_MC_END(); 400 } 401 else 402 { 403 /* 404 * [mem16], XMM. 405 */ 406 IEM_MC_BEGIN(0, 2); 407 IEM_MC_LOCAL(uint16_t, uValue); 408 IEM_MC_LOCAL(RTGCPTR, GCPtrEffSrc); 409 410 IEM_MC_CALC_RM_EFF_ADDR(GCPtrEffSrc, bRm, 1); 411 uint8_t bImm; IEM_OPCODE_GET_NEXT_U8(&bImm); 412 IEMOP_HLP_DONE_DECODING_NO_LOCK_PREFIX(); 413 IEM_MC_MAYBE_RAISE_SSE41_RELATED_XCPT(); 414 IEM_MC_PREPARE_SSE_USAGE(); 415 416 IEM_MC_AND_LOCAL_U8(bImm, 7); 417 IEM_MC_FETCH_XREG_U16(uValue, IEM_GET_MODRM_REG(pVCpu, bRm), bImm /*a_iWord*/); 418 IEM_MC_STORE_MEM_U16(pVCpu->iem.s.iEffSeg, GCPtrEffSrc, uValue); 419 IEM_MC_ADVANCE_RIP_AND_FINISH(); 420 IEM_MC_END(); 421 } 422 } 335 423 336 424 … … 350 438 { 351 439 /* 352 * XMM, greg64.440 * greg64, XMM. 353 441 */ 354 442 uint8_t bImm; IEM_OPCODE_GET_NEXT_U8(&bImm); … … 367 455 { 368 456 /* 369 * XMM, [mem64].457 * [mem64], XMM. 370 458 */ 371 459 IEM_MC_BEGIN(0, 2); … … 399 487 { 400 488 /* 401 * XMM, greg32.489 * greg32, XMM. 402 490 */ 403 491 uint8_t bImm; IEM_OPCODE_GET_NEXT_U8(&bImm); … … 416 504 { 417 505 /* 418 * XMM, [mem32].506 * [mem32], XMM. 419 507 */ 420 508 IEM_MC_BEGIN(0, 2); … … 438 526 439 527 /** Opcode 0x66 0x0f 0x17. */ 440 FNIEMOP_STUB(iemOp_extractps_Ed_Vdq_Ib); 528 FNIEMOP_DEF(iemOp_extractps_Ed_Vdq_Ib) 529 { 530 IEMOP_MNEMONIC3(MRI, EXTRACTPS, extractps, Ed, Vdq, Ib, DISOPTYPE_HARMLESS | DISOPTYPE_SSE, IEMOPHINT_IGNORES_OP_SIZES); 531 uint8_t bRm; IEM_OPCODE_GET_NEXT_U8(&bRm); 532 if (IEM_IS_MODRM_REG_MODE(bRm)) 533 { 534 /* 535 * greg32, XMM. 536 */ 537 uint8_t bImm; IEM_OPCODE_GET_NEXT_U8(&bImm); 538 IEMOP_HLP_DONE_DECODING_NO_LOCK_PREFIX(); 539 IEM_MC_BEGIN(0, 1); 540 IEM_MC_LOCAL(uint32_t, uSrc); 541 IEM_MC_MAYBE_RAISE_SSE41_RELATED_XCPT(); 542 IEM_MC_PREPARE_SSE_USAGE(); 543 IEM_MC_AND_LOCAL_U8(bImm, 3); 544 IEM_MC_FETCH_XREG_U32(uSrc, IEM_GET_MODRM_REG(pVCpu, bRm), bImm /*a_iDword*/); 545 IEM_MC_STORE_GREG_U32(IEM_GET_MODRM_RM(pVCpu, bRm), uSrc); 546 IEM_MC_ADVANCE_RIP_AND_FINISH(); 547 IEM_MC_END(); 548 } 549 else 550 { 551 /* 552 * [mem32], XMM. 553 */ 554 IEM_MC_BEGIN(0, 2); 555 IEM_MC_LOCAL(uint32_t, uSrc); 556 IEM_MC_LOCAL(RTGCPTR, GCPtrEffSrc); 557 558 IEM_MC_CALC_RM_EFF_ADDR(GCPtrEffSrc, bRm, 1); 559 uint8_t bImm; IEM_OPCODE_GET_NEXT_U8(&bImm); 560 IEMOP_HLP_DONE_DECODING_NO_LOCK_PREFIX(); 561 IEM_MC_MAYBE_RAISE_SSE41_RELATED_XCPT(); 562 IEM_MC_PREPARE_SSE_USAGE(); 563 IEM_MC_AND_LOCAL_U8(bImm, 3); 564 IEM_MC_FETCH_XREG_U32(uSrc, IEM_GET_MODRM_REG(pVCpu, bRm), bImm /*a_iDword*/); 565 IEM_MC_STORE_MEM_U32(pVCpu->iem.s.iEffSeg, GCPtrEffSrc, uSrc); 566 IEM_MC_ADVANCE_RIP_AND_FINISH(); 567 IEM_MC_END(); 568 } 569 } 570 571 441 572 /* Opcode 0x66 0x0f 0x18 - invalid (vex only). */ 442 573 /* Opcode 0x66 0x0f 0x19 - invalid (vex only). */ … … 450 581 451 582 /** Opcode 0x66 0x0f 0x20. */ 452 FNIEMOP_STUB(iemOp_pinsrb_Vdq_RyMb_Ib); 583 FNIEMOP_DEF(iemOp_pinsrb_Vdq_RyMb_Ib) 584 { 585 IEMOP_MNEMONIC3(RMI, PINSRB, pinsrb, Vd, Ey, Ib, DISOPTYPE_HARMLESS | DISOPTYPE_SSE, IEMOPHINT_IGNORES_OP_SIZES); 586 uint8_t bRm; IEM_OPCODE_GET_NEXT_U8(&bRm); 587 if (IEM_IS_MODRM_REG_MODE(bRm)) 588 { 589 /* 590 * XMM, greg32. 591 */ 592 uint8_t bImm; IEM_OPCODE_GET_NEXT_U8(&bImm); 593 IEMOP_HLP_DONE_DECODING_NO_LOCK_PREFIX(); 594 IEM_MC_BEGIN(0, 1); 595 IEM_MC_LOCAL(uint8_t, uSrc); 596 IEM_MC_MAYBE_RAISE_SSE41_RELATED_XCPT(); 597 IEM_MC_PREPARE_SSE_USAGE(); 598 IEM_MC_FETCH_GREG_U8(uSrc, IEM_GET_MODRM_RM(pVCpu, bRm)); 599 IEM_MC_AND_LOCAL_U8(bImm, 15); 600 IEM_MC_STORE_XREG_U8(IEM_GET_MODRM_REG(pVCpu, bRm), bImm /*a_iByte*/, uSrc); 601 IEM_MC_ADVANCE_RIP_AND_FINISH(); 602 IEM_MC_END(); 603 } 604 else 605 { 606 /* 607 * XMM, [mem8]. 608 */ 609 IEM_MC_BEGIN(0, 2); 610 IEM_MC_LOCAL(uint8_t, uSrc); 611 IEM_MC_LOCAL(RTGCPTR, GCPtrEffSrc); 612 613 IEM_MC_CALC_RM_EFF_ADDR(GCPtrEffSrc, bRm, 1); 614 uint8_t bImm; IEM_OPCODE_GET_NEXT_U8(&bImm); 615 IEMOP_HLP_DONE_DECODING_NO_LOCK_PREFIX(); 616 IEM_MC_MAYBE_RAISE_SSE41_RELATED_XCPT(); 617 IEM_MC_PREPARE_SSE_USAGE(); 618 619 IEM_MC_FETCH_MEM_U8(uSrc, pVCpu->iem.s.iEffSeg, GCPtrEffSrc); 620 IEM_MC_AND_LOCAL_U8(bImm, 15); 621 IEM_MC_STORE_XREG_U8(IEM_GET_MODRM_REG(pVCpu, bRm), bImm /*a_iByte*/, uSrc); 622 IEM_MC_ADVANCE_RIP_AND_FINISH(); 623 IEM_MC_END(); 624 } 625 } 626 453 627 /** Opcode 0x66 0x0f 0x21, */ 454 628 FNIEMOP_STUB(iemOp_insertps_Vdq_UdqMd_Ib); -
trunk/src/VBox/VMM/include/IEMMc.h
r97543 r97607 504 504 #define IEM_MC_STORE_XREG_U64(a_iXReg, a_iQword, a_u64Value) \ 505 505 do { pVCpu->cpum.GstCtx.XState.x87.aXMM[(a_iXReg)].au64[(a_iQword)] = (a_u64Value); } while (0) 506 #define IEM_MC_STORE_XREG_U32(a_iXReg, a_iDword, a_u32Value) \ 507 do { pVCpu->cpum.GstCtx.XState.x87.aXMM[(a_iXReg)].au32[(a_iDword)] = (a_u32Value); } while (0) 508 #define IEM_MC_STORE_XREG_U16(a_iXReg, a_iWord, a_u16Value) \ 509 do { pVCpu->cpum.GstCtx.XState.x87.aXMM[(a_iXReg)].au32[(a_iWord)] = (a_u16Value); } while (0) 510 #define IEM_MC_STORE_XREG_U8(a_iXReg, a_iByte, a_u8Value) \ 511 do { pVCpu->cpum.GstCtx.XState.x87.aXMM[(a_iXReg)].au32[(a_iByte)] = (a_u8Value); } while (0) 512 506 513 #define IEM_MC_STORE_XREG_U64_ZX_U128(a_iXReg, a_u64Value) \ 507 514 do { pVCpu->cpum.GstCtx.XState.x87.aXMM[(a_iXReg)].au64[0] = (a_u64Value); \ 508 515 pVCpu->cpum.GstCtx.XState.x87.aXMM[(a_iXReg)].au64[1] = 0; \ 509 516 } while (0) 510 #define IEM_MC_STORE_XREG_U32(a_iXReg, a_iDword, a_u32Value) \ 511 do { pVCpu->cpum.GstCtx.XState.x87.aXMM[(a_iXReg)].au32[(a_iDword)] = (a_u32Value); } while (0) 517 512 518 #define IEM_MC_STORE_XREG_U32_U128(a_iXReg, a_iDwDst, a_u128Value, a_iDwSrc) \ 513 519 do { pVCpu->cpum.GstCtx.XState.x87.aXMM[(a_iXReg)].au32[(a_iDwDst)] = (a_u128Value).au32[(a_iDwSrc)]; } while (0) -
trunk/src/VBox/VMM/testcase/tstIEMCheckMc.cpp
r97543 r97607 770 770 #define IEM_MC_FETCH_XREG_U64(a_u64Value, a_iXReg, a_iQWord) do { CHK_XREG_IDX(a_iXReg); (a_u64Value) = 0; CHK_TYPE(uint64_t, a_u64Value); (void)fSseRead; (void)fMcBegin; } while (0) 771 771 #define IEM_MC_FETCH_XREG_U32(a_u32Value, a_iXReg, a_iDWord) do { CHK_XREG_IDX(a_iXReg); (a_u32Value) = 0; CHK_TYPE(uint32_t, a_u32Value); (void)fSseRead; (void)fMcBegin; } while (0) 772 #define IEM_MC_FETCH_XREG_U16(a_u16Value, a_iXReg, a_iWord ) do { CHK_XREG_IDX(a_iXReg); (a_u 32Value) = 0; CHK_TYPE(uint32_t, a_u32Value); (void)fSseRead; (void)fMcBegin; } while (0)773 #define IEM_MC_FETCH_XREG_U8( a_u8Value, a_iXReg, a_iByte) do { CHK_XREG_IDX(a_iXReg); (a_u 32Value) = 0; CHK_TYPE(uint32_t, a_u32Value);(void)fSseRead; (void)fMcBegin; } while (0)772 #define IEM_MC_FETCH_XREG_U16(a_u16Value, a_iXReg, a_iWord ) do { CHK_XREG_IDX(a_iXReg); (a_u16Value) = 0; CHK_TYPE(uint16_t, a_u16Value); (void)fSseRead; (void)fMcBegin; } while (0) 773 #define IEM_MC_FETCH_XREG_U8( a_u8Value, a_iXReg, a_iByte) do { CHK_XREG_IDX(a_iXReg); (a_u8Value) = 0; CHK_TYPE(uint8_t, a_u8Value); (void)fSseRead; (void)fMcBegin; } while (0) 774 774 #define IEM_MC_STORE_XREG_U32_U128(a_iXReg, a_iDwDst, a_u128Value, a_iDwSrc) do { CHK_XREG_IDX(a_iXReg); CHK_TYPE(RTUINT128U, a_u128Value); AssertCompile((a_iDwDst) < RT_ELEMENTS((a_u128Value).au32)); AssertCompile((a_iDwSrc) < RT_ELEMENTS((a_u128Value).au32)); (void)fSseWrite; (void)fMcBegin; } while (0) 775 775 #define IEM_MC_STORE_XREG_U128(a_iXReg, a_u128Value) do { CHK_TYPE(RTUINT128U, a_u128Value); (void)fSseWrite; (void)fMcBegin; } while (0) … … 780 780 #define IEM_MC_STORE_XREG_U64_ZX_U128(a_iXReg, a_u64Value) do { CHK_XREG_IDX(a_iXReg); CHK_TYPE(uint64_t, a_u64Value); (void)fSseWrite; (void)fMcBegin; } while (0) 781 781 #define IEM_MC_STORE_XREG_U32(a_iXReg, a_iDword, a_u32Value) do { CHK_XREG_IDX(a_iXReg); CHK_TYPE(uint32_t, a_u32Value); (void)fSseWrite; (void)fMcBegin; } while (0) 782 #define IEM_MC_STORE_XREG_U16(a_iXReg, a_iWord, a_u16Value) do { CHK_XREG_IDX(a_iXReg); CHK_TYPE(uint16_t, a_u16Value); (void)fSseWrite; (void)fMcBegin; } while (0) 783 #define IEM_MC_STORE_XREG_U8( a_iXReg, a_iByte, a_u8Value ) do { CHK_XREG_IDX(a_iXReg); CHK_TYPE(uint8_t, a_u8Value ); (void)fSseWrite; (void)fMcBegin; } while (0) 782 784 #define IEM_MC_STORE_XREG_U32_ZX_U128(a_iXReg, a_u32Value) do { CHK_XREG_IDX(a_iXReg); CHK_TYPE(uint32_t, a_u32Value); (void)fSseWrite; (void)fMcBegin; } while (0) 783 785 #define IEM_MC_STORE_XREG_HI_U64(a_iXReg, a_u64Value) do { CHK_XREG_IDX(a_iXReg); CHK_TYPE(uint64_t, a_u64Value); (void)fSseWrite; (void)fMcBegin; } while (0)
Note:
See TracChangeset
for help on using the changeset viewer.