Changeset 95509 in vbox
- Timestamp:
- Jul 4, 2022 10:53:58 PM (3 years ago)
- svn:sync-xref-src-repo-rev:
- 152128
- Location:
- trunk/src/VBox/VMM/VMMAll
- Files:
-
- 6 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/src/VBox/VMM/VMMAll/IEMAllAImpl.asm
r95499 r95509 3629 3629 ; @param 2 1 if MMX is included, 0 if not. 3630 3630 ; 3631 ; @param A0 FPU context (fxsave). 3632 ; @param A1 Pointer to the first full sized media register operand (input/output). 3633 ; @param A2 Pointer to the second half sized media register operand (input). 3631 ; @param A0 Pointer to the first full sized media register operand (input/output). 3632 ; @param A1 Pointer to the second half sized media register operand (input). 3634 3633 ; 3635 3634 %macro IEMIMPL_MEDIA_F1L1 2 3636 3635 %if %2 != 0 3637 BEGINPROC_FASTCALL iemAImpl_ %+ %1 %+ _u64, 123638 PROLOGUE_ 3_ARGS3636 BEGINPROC_FASTCALL iemAImpl_ %+ %1 %+ _u64, 8 3637 PROLOGUE_2_ARGS 3639 3638 IEMIMPL_MMX_PROLOGUE 3640 3639 3641 movq mm0, [A 1]3642 mov d mm1, [A2]3640 movq mm0, [A0] 3641 movq mm1, [A1] 3643 3642 %1 mm0, mm1 3644 movq [A 1], mm03643 movq [A0], mm0 3645 3644 3646 3645 IEMIMPL_MMX_EPILOGUE 3647 EPILOGUE_ 3_ARGS3646 EPILOGUE_2_ARGS 3648 3647 ENDPROC iemAImpl_ %+ %1 %+ _u64 3649 3648 %endif 3650 3649 3651 BEGINPROC_FASTCALL iemAImpl_ %+ %1 %+ _u128, 123652 PROLOGUE_ 3_ARGS3650 BEGINPROC_FASTCALL iemAImpl_ %+ %1 %+ _u128, 8 3651 PROLOGUE_2_ARGS 3653 3652 IEMIMPL_SSE_PROLOGUE 3654 3653 3655 movdqu xmm0, [A 1]3656 mov q xmm1, [A2]3654 movdqu xmm0, [A0] 3655 movdqu xmm1, [A1] 3657 3656 %1 xmm0, xmm1 3658 movdqu [A 1], xmm03657 movdqu [A0], xmm0 3659 3658 3660 3659 IEMIMPL_SSE_EPILOGUE 3661 EPILOGUE_ 3_ARGS3660 EPILOGUE_2_ARGS 3662 3661 ENDPROC iemAImpl_ %+ %1 %+ _u128 3663 3662 %endmacro … … 3670 3669 3671 3670 ;; 3671 ; Media instruction working two half sized input registers (lower half) and a full sized 3672 ; destination register (vpunpckh*). 3673 ; 3674 ; @param 1 The instruction 3675 ; 3676 ; @param A0 Pointer to the destination register (full sized, output only). 3677 ; @param A1 Pointer to the first full sized media source register operand, where we 3678 ; will only use the lower half as input - but we'll be loading it in full. 3679 ; @param A2 Pointer to the second full sized media source register operand, where we 3680 ; will only use the lower half as input - but we'll be loading it in full. 3681 ; 3682 %macro IEMIMPL_MEDIA_F1L1L1 1 3683 BEGINPROC_FASTCALL iemAImpl_ %+ %1 %+ _u128, 12 3684 PROLOGUE_3_ARGS 3685 IEMIMPL_AVX_PROLOGUE 3686 3687 vmovdqu xmm0, [A1] 3688 vmovdqu xmm1, [A2] 3689 %1 xmm0, xmm0, xmm1 3690 vmovdqu [A0], xmm0 3691 3692 IEMIMPL_AVX_PROLOGUE 3693 EPILOGUE_3_ARGS 3694 ENDPROC iemAImpl_ %+ %1 %+ _u128 3695 3696 BEGINPROC_FASTCALL iemAImpl_ %+ %1 %+ _u256, 12 3697 PROLOGUE_3_ARGS 3698 IEMIMPL_AVX_PROLOGUE 3699 3700 vmovdqu ymm0, [A1] 3701 vmovdqu ymm1, [A2] 3702 %1 ymm0, ymm0, ymm1 3703 vmovdqu [A0], ymm0 3704 3705 IEMIMPL_AVX_PROLOGUE 3706 EPILOGUE_3_ARGS 3707 ENDPROC iemAImpl_ %+ %1 %+ _u256 3708 %endmacro 3709 3710 IEMIMPL_MEDIA_F1L1L1 vpunpcklbw 3711 IEMIMPL_MEDIA_F1L1L1 vpunpcklwd 3712 IEMIMPL_MEDIA_F1L1L1 vpunpckldq 3713 IEMIMPL_MEDIA_F1L1L1 vpunpcklqdq 3714 3715 3716 ;; 3672 3717 ; Media instruction working on one full sized and one half sized register (high half). 3673 3718 ; … … 3675 3720 ; @param 2 1 if MMX is included, 0 if not. 3676 3721 ; 3677 ; @param A0 FPU context (fxsave). 3678 ; @param A1 Pointer to the first full sized media register operand (input/output). 3679 ; @param A2 Pointer to the second full sized media register operand, where we 3680 ; will only use the upper half (input). 3722 ; @param A0 Pointer to the first full sized media register operand (input/output). 3723 ; @param A1 Pointer to the second full sized media register operand, where we 3724 ; will only use the upper half as input - but we'll load it in full. 3681 3725 ; 3682 3726 %macro IEMIMPL_MEDIA_F1H1 2 3683 %if %2 != 0 3684 BEGINPROC_FASTCALL iemAImpl_ %+ %1 %+ _u64, 12 3685 PROLOGUE_3_ARGS 3686 IEMIMPL_MMX_PROLOGUE 3687 3688 movq mm0, [A1] 3689 movq mm1, [A2] 3690 %1 mm0, mm1 3691 movq [A1], mm0 3692 3693 IEMIMPL_MMX_EPILOGUE 3694 EPILOGUE_3_ARGS 3695 ENDPROC iemAImpl_ %+ %1 %+ _u64 3696 %endif 3697 3698 BEGINPROC_FASTCALL iemAImpl_ %+ %1 %+ _u128, 12 3699 PROLOGUE_3_ARGS 3700 IEMIMPL_SSE_PROLOGUE 3701 3702 movdqu xmm0, [A1] 3703 movdqu xmm1, [A2] 3704 %1 xmm0, xmm1 3705 movdqu [A1], xmm0 3706 3707 IEMIMPL_SSE_EPILOGUE 3708 EPILOGUE_3_ARGS 3709 ENDPROC iemAImpl_ %+ %1 %+ _u128 3727 IEMIMPL_MEDIA_F1L1 %1, %2 3710 3728 %endmacro 3711 3729 … … 3714 3732 IEMIMPL_MEDIA_F1L1 punpckhdq, 1 3715 3733 IEMIMPL_MEDIA_F1L1 punpckhqdq, 0 3734 3735 3736 ;; 3737 ; Media instruction working two half sized input registers (high half) and a full sized 3738 ; destination register (vpunpckh*). 3739 ; 3740 ; @param 1 The instruction 3741 ; 3742 ; @param A0 Pointer to the destination register (full sized, output only). 3743 ; @param A1 Pointer to the first full sized media source register operand, where we 3744 ; will only use the upper half as input - but we'll be loading it in full. 3745 ; @param A2 Pointer to the second full sized media source register operand, where we 3746 ; will only use the upper half as input - but we'll be loading it in full. 3747 ; 3748 %macro IEMIMPL_MEDIA_F1H1H1 1 3749 IEMIMPL_MEDIA_F1L1L1 %1 3750 %endmacro 3751 3752 IEMIMPL_MEDIA_F1H1H1 vpunpckhbw 3753 IEMIMPL_MEDIA_F1H1H1 vpunpckhwd 3754 IEMIMPL_MEDIA_F1H1H1 vpunpckhdq 3755 IEMIMPL_MEDIA_F1H1H1 vpunpckhqdq 3716 3756 3717 3757 -
trunk/src/VBox/VMM/VMMAll/IEMAllAImplC.cpp
r95499 r95509 8548 8548 8549 8549 8550 /* 8551 * PUNPCKHBW - high bytes -> words 8552 */ 8550 8553 #ifdef IEM_WITHOUT_ASSEMBLY 8551 8554 8552 /* PUNPCKHxxx */ 8553 8554 IEM_DECL_IMPL_DEF(void, iemAImpl_punpckhbw_u64,(PCX86FXSTATE pFpuState, uint64_t *pu64Dst, uint64_t const *pu64Src)) 8555 { 8556 RT_NOREF(pFpuState, pu64Dst, pu64Src); 8557 AssertReleaseFailed(); 8558 } 8559 8560 8561 IEM_DECL_IMPL_DEF(void, iemAImpl_punpckhbw_u128,(PCX86FXSTATE pFpuState, PRTUINT128U pu128Dst, PCRTUINT128U pu128Src)) 8562 { 8563 RT_NOREF(pFpuState, pu128Dst, pu128Src); 8564 AssertReleaseFailed(); 8565 } 8566 8567 8568 IEM_DECL_IMPL_DEF(void, iemAImpl_punpckhwd_u64,(PCX86FXSTATE pFpuState, uint64_t *pu64Dst, uint64_t const *pu64Src)) 8569 { 8570 RT_NOREF(pFpuState, pu64Dst, pu64Src); 8571 AssertReleaseFailed(); 8572 } 8573 8574 8575 IEM_DECL_IMPL_DEF(void, iemAImpl_punpckhwd_u128,(PCX86FXSTATE pFpuState, PRTUINT128U pu128Dst, PCRTUINT128U pu128Src)) 8576 { 8577 RT_NOREF(pFpuState, pu128Dst, pu128Src); 8578 AssertReleaseFailed(); 8579 } 8580 8581 8582 IEM_DECL_IMPL_DEF(void, iemAImpl_punpckhdq_u64,(PCX86FXSTATE pFpuState, uint64_t *pu64Dst, uint64_t const *pu64Src)) 8583 { 8584 RT_NOREF(pFpuState, pu64Dst, pu64Src); 8585 AssertReleaseFailed(); 8586 } 8587 8588 8589 IEM_DECL_IMPL_DEF(void, iemAImpl_punpckhdq_u128,(PCX86FXSTATE pFpuState, PRTUINT128U pu128Dst, PCRTUINT128U pu128Src)) 8590 { 8591 RT_NOREF(pFpuState, pu128Dst, pu128Src); 8592 AssertReleaseFailed(); 8593 } 8594 8595 8596 IEM_DECL_IMPL_DEF(void, iemAImpl_punpckhqdq_u128,(PCX86FXSTATE pFpuState, PRTUINT128U pu128Dst, PCRTUINT128U pu128Src)) 8597 { 8598 RT_NOREF(pFpuState, pu128Dst, pu128Src); 8599 AssertReleaseFailed(); 8600 } 8601 8602 /* PUNPCKLxxx */ 8603 8604 IEM_DECL_IMPL_DEF(void, iemAImpl_punpcklbw_u64,(PCX86FXSTATE pFpuState, uint64_t *pu64Dst, uint32_t const *pu32Src)) 8605 { 8606 RT_NOREF(pFpuState, pu64Dst, pu32Src); 8607 AssertReleaseFailed(); 8608 } 8609 8610 8611 IEM_DECL_IMPL_DEF(void, iemAImpl_punpcklbw_u128,(PCX86FXSTATE pFpuState, PRTUINT128U pu128Dst, uint64_t const *pu64Src)) 8612 { 8613 RT_NOREF(pFpuState, pu128Dst, pu64Src); 8614 AssertReleaseFailed(); 8615 } 8616 8617 8618 IEM_DECL_IMPL_DEF(void, iemAImpl_punpcklwd_u64,(PCX86FXSTATE pFpuState, uint64_t *pu64Dst, uint32_t const *pu32Src)) 8619 { 8620 RT_NOREF(pFpuState, pu64Dst, pu32Src); 8621 AssertReleaseFailed(); 8622 } 8623 8624 8625 IEM_DECL_IMPL_DEF(void, iemAImpl_punpcklwd_u128,(PCX86FXSTATE pFpuState, PRTUINT128U pu128Dst, uint64_t const *pu64Src)) 8626 { 8627 RT_NOREF(pFpuState, pu128Dst, pu64Src); 8628 AssertReleaseFailed(); 8629 } 8630 8631 8632 IEM_DECL_IMPL_DEF(void, iemAImpl_punpckldq_u64,(PCX86FXSTATE pFpuState, uint64_t *pu64Dst, uint32_t const *pu32Src)) 8633 { 8634 RT_NOREF(pFpuState, pu64Dst, pu32Src); 8635 AssertReleaseFailed(); 8636 } 8637 8638 8639 IEM_DECL_IMPL_DEF(void, iemAImpl_punpckldq_u128,(PCX86FXSTATE pFpuState, PRTUINT128U pu128Dst, uint64_t const *pu64Src)) 8640 { 8641 RT_NOREF(pFpuState, pu128Dst, pu64Src); 8642 AssertReleaseFailed(); 8643 } 8644 8645 8646 IEM_DECL_IMPL_DEF(void, iemAImpl_punpcklqdq_u128,(PCX86FXSTATE pFpuState, PRTUINT128U pu128Dst, uint64_t const *pu64Src)) 8647 { 8648 RT_NOREF(pFpuState, pu128Dst, pu64Src); 8649 AssertReleaseFailed(); 8650 } 8651 8652 #endif /* IEM_WITHOUT_ASSEMBLY */ 8555 IEM_DECL_IMPL_DEF(void, iemAImpl_punpckhbw_u64,(uint64_t *puDst, uint64_t const *puSrc)) 8556 { 8557 RTUINT64U const uSrc2 = { *puSrc }; 8558 RTUINT64U const uSrc1 = { *puDst }; 8559 ASMCompilerBarrier(); 8560 RTUINT64U uDstOut; 8561 uDstOut.au8[0] = uSrc1.au8[4]; 8562 uDstOut.au8[1] = uSrc2.au8[4]; 8563 uDstOut.au8[2] = uSrc1.au8[5]; 8564 uDstOut.au8[3] = uSrc2.au8[5]; 8565 uDstOut.au8[4] = uSrc1.au8[6]; 8566 uDstOut.au8[5] = uSrc2.au8[6]; 8567 uDstOut.au8[6] = uSrc1.au8[7]; 8568 uDstOut.au8[7] = uSrc2.au8[7]; 8569 *puDst = uDstOut.u; 8570 } 8571 8572 8573 IEM_DECL_IMPL_DEF(void, iemAImpl_punpckhbw_u128,(PRTUINT128U puDst, PCRTUINT128U puSrc)) 8574 { 8575 RTUINT128U const uSrc2 = { *puSrc }; 8576 RTUINT128U const uSrc1 = { *puDst }; 8577 ASMCompilerBarrier(); 8578 RTUINT128U uDstOut; 8579 uDstOut.au8[ 0] = uSrc1.au8[ 8]; 8580 uDstOut.au8[ 1] = uSrc2.au8[ 8]; 8581 uDstOut.au8[ 2] = uSrc1.au8[ 9]; 8582 uDstOut.au8[ 3] = uSrc2.au8[ 9]; 8583 uDstOut.au8[ 4] = uSrc1.au8[10]; 8584 uDstOut.au8[ 5] = uSrc2.au8[10]; 8585 uDstOut.au8[ 6] = uSrc1.au8[11]; 8586 uDstOut.au8[ 7] = uSrc2.au8[11]; 8587 uDstOut.au8[ 8] = uSrc1.au8[12]; 8588 uDstOut.au8[ 9] = uSrc2.au8[12]; 8589 uDstOut.au8[10] = uSrc1.au8[13]; 8590 uDstOut.au8[11] = uSrc2.au8[13]; 8591 uDstOut.au8[12] = uSrc1.au8[14]; 8592 uDstOut.au8[13] = uSrc2.au8[14]; 8593 uDstOut.au8[14] = uSrc1.au8[15]; 8594 uDstOut.au8[15] = uSrc2.au8[15]; 8595 *puDst = uDstOut; 8596 } 8597 8598 #endif 8599 8600 IEM_DECL_IMPL_DEF(void, iemAImpl_vpunpckhbw_u128_fallback,(PRTUINT128U puDst, PCRTUINT128U puSrc1, PCRTUINT128U puSrc2)) 8601 { 8602 RTUINT128U const uSrc2 = { *puSrc2 }; 8603 RTUINT128U const uSrc1 = { *puSrc1 }; 8604 ASMCompilerBarrier(); 8605 RTUINT128U uDstOut; 8606 uDstOut.au8[ 0] = uSrc1.au8[ 8]; 8607 uDstOut.au8[ 1] = uSrc2.au8[ 8]; 8608 uDstOut.au8[ 2] = uSrc1.au8[ 9]; 8609 uDstOut.au8[ 3] = uSrc2.au8[ 9]; 8610 uDstOut.au8[ 4] = uSrc1.au8[10]; 8611 uDstOut.au8[ 5] = uSrc2.au8[10]; 8612 uDstOut.au8[ 6] = uSrc1.au8[11]; 8613 uDstOut.au8[ 7] = uSrc2.au8[11]; 8614 uDstOut.au8[ 8] = uSrc1.au8[12]; 8615 uDstOut.au8[ 9] = uSrc2.au8[12]; 8616 uDstOut.au8[10] = uSrc1.au8[13]; 8617 uDstOut.au8[11] = uSrc2.au8[13]; 8618 uDstOut.au8[12] = uSrc1.au8[14]; 8619 uDstOut.au8[13] = uSrc2.au8[14]; 8620 uDstOut.au8[14] = uSrc1.au8[15]; 8621 uDstOut.au8[15] = uSrc2.au8[15]; 8622 *puDst = uDstOut; 8623 } 8624 8625 8626 IEM_DECL_IMPL_DEF(void, iemAImpl_vpunpckhbw_u256_fallback,(PRTUINT256U puDst, PCRTUINT256U puSrc1, PCRTUINT256U puSrc2)) 8627 { 8628 RTUINT256U const uSrc2 = { *puSrc2 }; 8629 RTUINT256U const uSrc1 = { *puSrc1 }; 8630 ASMCompilerBarrier(); 8631 RTUINT256U uDstOut; 8632 uDstOut.au8[ 0] = uSrc1.au8[ 8]; 8633 uDstOut.au8[ 1] = uSrc2.au8[ 8]; 8634 uDstOut.au8[ 2] = uSrc1.au8[ 9]; 8635 uDstOut.au8[ 3] = uSrc2.au8[ 9]; 8636 uDstOut.au8[ 4] = uSrc1.au8[10]; 8637 uDstOut.au8[ 5] = uSrc2.au8[10]; 8638 uDstOut.au8[ 6] = uSrc1.au8[11]; 8639 uDstOut.au8[ 7] = uSrc2.au8[11]; 8640 uDstOut.au8[ 8] = uSrc1.au8[12]; 8641 uDstOut.au8[ 9] = uSrc2.au8[12]; 8642 uDstOut.au8[10] = uSrc1.au8[13]; 8643 uDstOut.au8[11] = uSrc2.au8[13]; 8644 uDstOut.au8[12] = uSrc1.au8[14]; 8645 uDstOut.au8[13] = uSrc2.au8[14]; 8646 uDstOut.au8[14] = uSrc1.au8[15]; 8647 uDstOut.au8[15] = uSrc2.au8[15]; 8648 /* As usual, the upper 128-bits are treated like a parallel register to the lower half. */ 8649 uDstOut.au8[16] = uSrc1.au8[24]; 8650 uDstOut.au8[17] = uSrc2.au8[24]; 8651 uDstOut.au8[18] = uSrc1.au8[25]; 8652 uDstOut.au8[19] = uSrc2.au8[25]; 8653 uDstOut.au8[20] = uSrc1.au8[26]; 8654 uDstOut.au8[21] = uSrc2.au8[26]; 8655 uDstOut.au8[22] = uSrc1.au8[27]; 8656 uDstOut.au8[23] = uSrc2.au8[27]; 8657 uDstOut.au8[24] = uSrc1.au8[28]; 8658 uDstOut.au8[25] = uSrc2.au8[28]; 8659 uDstOut.au8[26] = uSrc1.au8[29]; 8660 uDstOut.au8[27] = uSrc2.au8[29]; 8661 uDstOut.au8[28] = uSrc1.au8[30]; 8662 uDstOut.au8[29] = uSrc2.au8[30]; 8663 uDstOut.au8[30] = uSrc1.au8[31]; 8664 uDstOut.au8[31] = uSrc2.au8[31]; 8665 *puDst = uDstOut; 8666 } 8667 8668 8669 /* 8670 * PUNPCKHBW - high words -> dwords 8671 */ 8672 #ifdef IEM_WITHOUT_ASSEMBLY 8673 8674 IEM_DECL_IMPL_DEF(void, iemAImpl_punpckhwd_u64,(uint64_t *puDst, uint64_t const *puSrc)) 8675 { 8676 RTUINT64U const uSrc2 = { *puSrc }; 8677 RTUINT64U const uSrc1 = { *puDst }; 8678 ASMCompilerBarrier(); 8679 RTUINT64U uDstOut; 8680 uDstOut.au16[0] = uSrc1.au16[2]; 8681 uDstOut.au16[1] = uSrc2.au16[2]; 8682 uDstOut.au16[2] = uSrc1.au16[3]; 8683 uDstOut.au16[3] = uSrc2.au16[3]; 8684 *puDst = uDstOut.u; 8685 } 8686 8687 8688 IEM_DECL_IMPL_DEF(void, iemAImpl_punpckhwd_u128,(PRTUINT128U puDst, PCRTUINT128U puSrc)) 8689 { 8690 RTUINT128U const uSrc2 = { *puSrc }; 8691 RTUINT128U const uSrc1 = { *puDst }; 8692 ASMCompilerBarrier(); 8693 RTUINT128U uDstOut; 8694 uDstOut.au16[0] = uSrc1.au16[4]; 8695 uDstOut.au16[1] = uSrc2.au16[4]; 8696 uDstOut.au16[2] = uSrc1.au16[5]; 8697 uDstOut.au16[3] = uSrc2.au16[5]; 8698 uDstOut.au16[4] = uSrc1.au16[6]; 8699 uDstOut.au16[5] = uSrc2.au16[6]; 8700 uDstOut.au16[6] = uSrc1.au16[7]; 8701 uDstOut.au16[7] = uSrc2.au16[7]; 8702 *puDst = uDstOut; 8703 } 8704 8705 #endif 8706 8707 IEM_DECL_IMPL_DEF(void, iemAImpl_vpunpckhwd_u128_fallback,(PRTUINT128U puDst, PCRTUINT128U puSrc1, PCRTUINT128U puSrc2)) 8708 { 8709 RTUINT128U const uSrc2 = { *puSrc2 }; 8710 RTUINT128U const uSrc1 = { *puSrc1 }; 8711 ASMCompilerBarrier(); 8712 RTUINT128U uDstOut; 8713 uDstOut.au16[0] = uSrc1.au16[4]; 8714 uDstOut.au16[1] = uSrc2.au16[4]; 8715 uDstOut.au16[2] = uSrc1.au16[5]; 8716 uDstOut.au16[3] = uSrc2.au16[5]; 8717 uDstOut.au16[4] = uSrc1.au16[6]; 8718 uDstOut.au16[5] = uSrc2.au16[6]; 8719 uDstOut.au16[6] = uSrc1.au16[7]; 8720 uDstOut.au16[7] = uSrc2.au16[7]; 8721 *puDst = uDstOut; 8722 } 8723 8724 8725 IEM_DECL_IMPL_DEF(void, iemAImpl_vpunpckhwd_u256_fallback,(PRTUINT256U puDst, PCRTUINT256U puSrc1, PCRTUINT256U puSrc2)) 8726 { 8727 RTUINT256U const uSrc2 = { *puSrc2 }; 8728 RTUINT256U const uSrc1 = { *puSrc1 }; 8729 ASMCompilerBarrier(); 8730 RTUINT256U uDstOut; 8731 uDstOut.au16[0] = uSrc1.au16[4]; 8732 uDstOut.au16[1] = uSrc2.au16[4]; 8733 uDstOut.au16[2] = uSrc1.au16[5]; 8734 uDstOut.au16[3] = uSrc2.au16[5]; 8735 uDstOut.au16[4] = uSrc1.au16[6]; 8736 uDstOut.au16[5] = uSrc2.au16[6]; 8737 uDstOut.au16[6] = uSrc1.au16[7]; 8738 uDstOut.au16[7] = uSrc2.au16[7]; 8739 8740 uDstOut.au16[8] = uSrc1.au16[12]; 8741 uDstOut.au16[9] = uSrc2.au16[12]; 8742 uDstOut.au16[10] = uSrc1.au16[13]; 8743 uDstOut.au16[11] = uSrc2.au16[13]; 8744 uDstOut.au16[12] = uSrc1.au16[14]; 8745 uDstOut.au16[13] = uSrc2.au16[14]; 8746 uDstOut.au16[14] = uSrc1.au16[15]; 8747 uDstOut.au16[15] = uSrc2.au16[15]; 8748 *puDst = uDstOut; 8749 } 8750 8751 8752 /* 8753 * PUNPCKHBW - high dwords -> qword(s) 8754 */ 8755 #ifdef IEM_WITHOUT_ASSEMBLY 8756 8757 IEM_DECL_IMPL_DEF(void, iemAImpl_punpckhdq_u64,(uint64_t *puDst, uint64_t const *puSrc)) 8758 { 8759 RTUINT64U const uSrc2 = { *puSrc }; 8760 RTUINT64U const uSrc1 = { *puDst }; 8761 ASMCompilerBarrier(); 8762 RTUINT64U uDstOut; 8763 uDstOut.au32[0] = uSrc1.au32[1]; 8764 uDstOut.au32[1] = uSrc2.au32[1]; 8765 *puDst = uDstOut.u; 8766 } 8767 8768 8769 IEM_DECL_IMPL_DEF(void, iemAImpl_punpckhdq_u128,(PRTUINT128U puDst, PCRTUINT128U puSrc)) 8770 { 8771 RTUINT128U const uSrc2 = { *puSrc }; 8772 RTUINT128U const uSrc1 = { *puDst }; 8773 ASMCompilerBarrier(); 8774 RTUINT128U uDstOut; 8775 uDstOut.au32[0] = uSrc1.au32[2]; 8776 uDstOut.au32[1] = uSrc2.au32[2]; 8777 uDstOut.au32[2] = uSrc1.au32[3]; 8778 uDstOut.au32[3] = uSrc2.au32[3]; 8779 *puDst = uDstOut; 8780 } 8781 8782 #endif 8783 8784 IEM_DECL_IMPL_DEF(void, iemAImpl_vpunpckhdq_u128_fallback,(PRTUINT128U puDst, PCRTUINT128U puSrc1, PCRTUINT128U puSrc2)) 8785 { 8786 RTUINT128U const uSrc2 = { *puSrc2 }; 8787 RTUINT128U const uSrc1 = { *puSrc1 }; 8788 ASMCompilerBarrier(); 8789 RTUINT128U uDstOut; 8790 uDstOut.au32[0] = uSrc1.au32[2]; 8791 uDstOut.au32[1] = uSrc2.au32[2]; 8792 uDstOut.au32[2] = uSrc1.au32[3]; 8793 uDstOut.au32[3] = uSrc2.au32[3]; 8794 *puDst = uDstOut; 8795 } 8796 8797 8798 IEM_DECL_IMPL_DEF(void, iemAImpl_vpunpckhdq_u256_fallback,(PRTUINT256U puDst, PCRTUINT256U puSrc1, PCRTUINT256U puSrc2)) 8799 { 8800 RTUINT256U const uSrc2 = { *puSrc2 }; 8801 RTUINT256U const uSrc1 = { *puSrc1 }; 8802 ASMCompilerBarrier(); 8803 RTUINT256U uDstOut; 8804 uDstOut.au32[0] = uSrc1.au32[2]; 8805 uDstOut.au32[1] = uSrc2.au32[2]; 8806 uDstOut.au32[2] = uSrc1.au32[3]; 8807 uDstOut.au32[3] = uSrc2.au32[3]; 8808 8809 uDstOut.au32[4] = uSrc1.au32[6]; 8810 uDstOut.au32[5] = uSrc2.au32[6]; 8811 uDstOut.au32[6] = uSrc1.au32[7]; 8812 uDstOut.au32[7] = uSrc2.au32[7]; 8813 *puDst = uDstOut; 8814 } 8815 8816 8817 /* 8818 * PUNPCKHQDQ -> High qwords -> double qword(s). 8819 */ 8820 #ifdef IEM_WITHOUT_ASSEMBLY 8821 IEM_DECL_IMPL_DEF(void, iemAImpl_punpckhqdq_u128,(PRTUINT128U puDst, PCRTUINT128U puSrc)) 8822 { 8823 RTUINT128U const uSrc2 = { *puSrc }; 8824 RTUINT128U const uSrc1 = { *puDst }; 8825 ASMCompilerBarrier(); 8826 RTUINT128U uDstOut; 8827 uDstOut.au64[0] = uSrc1.au64[1]; 8828 uDstOut.au64[1] = uSrc2.au64[1]; 8829 *puDst = uDstOut; 8830 } 8831 #endif 8832 8833 8834 IEM_DECL_IMPL_DEF(void, iemAImpl_vpunpckhqdq_u128_fallback,(PRTUINT128U puDst, PCRTUINT128U puSrc1, PCRTUINT128U puSrc2)) 8835 { 8836 RTUINT128U const uSrc2 = { *puSrc2 }; 8837 RTUINT128U const uSrc1 = { *puSrc1 }; 8838 ASMCompilerBarrier(); 8839 RTUINT128U uDstOut; 8840 uDstOut.au64[0] = uSrc1.au64[1]; 8841 uDstOut.au64[1] = uSrc2.au64[1]; 8842 *puDst = uDstOut; 8843 } 8844 8845 8846 IEM_DECL_IMPL_DEF(void, iemAImpl_vpunpckhqdq_u256_fallback,(PRTUINT256U puDst, PCRTUINT256U puSrc1, PCRTUINT256U puSrc2)) 8847 { 8848 RTUINT256U const uSrc2 = { *puSrc2 }; 8849 RTUINT256U const uSrc1 = { *puSrc1 }; 8850 ASMCompilerBarrier(); 8851 RTUINT256U uDstOut; 8852 uDstOut.au64[0] = uSrc1.au64[1]; 8853 uDstOut.au64[1] = uSrc2.au64[1]; 8854 8855 uDstOut.au64[2] = uSrc1.au64[3]; 8856 uDstOut.au64[3] = uSrc2.au64[3]; 8857 *puDst = uDstOut; 8858 } 8859 8860 8861 /* 8862 * PUNPCKLBW - low bytes -> words 8863 */ 8864 #ifdef IEM_WITHOUT_ASSEMBLY 8865 8866 IEM_DECL_IMPL_DEF(void, iemAImpl_punpcklbw_u64,(uint64_t *puDst, uint64_t const *puSrc)) 8867 { 8868 RTUINT64U const uSrc2 = { *puSrc }; 8869 RTUINT64U const uSrc1 = { *puDst }; 8870 ASMCompilerBarrier(); 8871 RTUINT64U uDstOut; 8872 uDstOut.au8[0] = uSrc1.au8[0]; 8873 uDstOut.au8[1] = uSrc2.au8[0]; 8874 uDstOut.au8[2] = uSrc1.au8[1]; 8875 uDstOut.au8[3] = uSrc2.au8[1]; 8876 uDstOut.au8[4] = uSrc1.au8[2]; 8877 uDstOut.au8[5] = uSrc2.au8[2]; 8878 uDstOut.au8[6] = uSrc1.au8[3]; 8879 uDstOut.au8[7] = uSrc2.au8[3]; 8880 *puDst = uDstOut.u; 8881 } 8882 8883 8884 IEM_DECL_IMPL_DEF(void, iemAImpl_punpcklbw_u128,(PRTUINT128U puDst, PCRTUINT128U puSrc)) 8885 { 8886 RTUINT128U const uSrc2 = { *puSrc }; 8887 RTUINT128U const uSrc1 = { *puDst }; 8888 ASMCompilerBarrier(); 8889 RTUINT128U uDstOut; 8890 uDstOut.au8[ 0] = uSrc1.au8[0]; 8891 uDstOut.au8[ 1] = uSrc2.au8[0]; 8892 uDstOut.au8[ 2] = uSrc1.au8[1]; 8893 uDstOut.au8[ 3] = uSrc2.au8[1]; 8894 uDstOut.au8[ 4] = uSrc1.au8[2]; 8895 uDstOut.au8[ 5] = uSrc2.au8[2]; 8896 uDstOut.au8[ 6] = uSrc1.au8[3]; 8897 uDstOut.au8[ 7] = uSrc2.au8[3]; 8898 uDstOut.au8[ 8] = uSrc1.au8[4]; 8899 uDstOut.au8[ 9] = uSrc2.au8[4]; 8900 uDstOut.au8[10] = uSrc1.au8[5]; 8901 uDstOut.au8[11] = uSrc2.au8[5]; 8902 uDstOut.au8[12] = uSrc1.au8[6]; 8903 uDstOut.au8[13] = uSrc2.au8[6]; 8904 uDstOut.au8[14] = uSrc1.au8[7]; 8905 uDstOut.au8[15] = uSrc2.au8[7]; 8906 *puDst = uDstOut; 8907 } 8908 8909 #endif 8910 8911 IEM_DECL_IMPL_DEF(void, iemAImpl_vpunpcklbw_u128_fallback,(PRTUINT128U puDst, PCRTUINT128U puSrc1, PCRTUINT128U puSrc2)) 8912 { 8913 RTUINT128U const uSrc2 = { *puSrc2 }; 8914 RTUINT128U const uSrc1 = { *puSrc1 }; 8915 ASMCompilerBarrier(); 8916 RTUINT128U uDstOut; 8917 uDstOut.au8[ 0] = uSrc1.au8[0]; 8918 uDstOut.au8[ 1] = uSrc2.au8[0]; 8919 uDstOut.au8[ 2] = uSrc1.au8[1]; 8920 uDstOut.au8[ 3] = uSrc2.au8[1]; 8921 uDstOut.au8[ 4] = uSrc1.au8[2]; 8922 uDstOut.au8[ 5] = uSrc2.au8[2]; 8923 uDstOut.au8[ 6] = uSrc1.au8[3]; 8924 uDstOut.au8[ 7] = uSrc2.au8[3]; 8925 uDstOut.au8[ 8] = uSrc1.au8[4]; 8926 uDstOut.au8[ 9] = uSrc2.au8[4]; 8927 uDstOut.au8[10] = uSrc1.au8[5]; 8928 uDstOut.au8[11] = uSrc2.au8[5]; 8929 uDstOut.au8[12] = uSrc1.au8[6]; 8930 uDstOut.au8[13] = uSrc2.au8[6]; 8931 uDstOut.au8[14] = uSrc1.au8[7]; 8932 uDstOut.au8[15] = uSrc2.au8[7]; 8933 *puDst = uDstOut; 8934 } 8935 8936 8937 IEM_DECL_IMPL_DEF(void, iemAImpl_vpunpcklbw_u256_fallback,(PRTUINT256U puDst, PCRTUINT256U puSrc1, PCRTUINT256U puSrc2)) 8938 { 8939 RTUINT256U const uSrc2 = { *puSrc2 }; 8940 RTUINT256U const uSrc1 = { *puSrc1 }; 8941 ASMCompilerBarrier(); 8942 RTUINT256U uDstOut; 8943 uDstOut.au8[ 0] = uSrc1.au8[0]; 8944 uDstOut.au8[ 1] = uSrc2.au8[0]; 8945 uDstOut.au8[ 2] = uSrc1.au8[1]; 8946 uDstOut.au8[ 3] = uSrc2.au8[1]; 8947 uDstOut.au8[ 4] = uSrc1.au8[2]; 8948 uDstOut.au8[ 5] = uSrc2.au8[2]; 8949 uDstOut.au8[ 6] = uSrc1.au8[3]; 8950 uDstOut.au8[ 7] = uSrc2.au8[3]; 8951 uDstOut.au8[ 8] = uSrc1.au8[4]; 8952 uDstOut.au8[ 9] = uSrc2.au8[4]; 8953 uDstOut.au8[10] = uSrc1.au8[5]; 8954 uDstOut.au8[11] = uSrc2.au8[5]; 8955 uDstOut.au8[12] = uSrc1.au8[6]; 8956 uDstOut.au8[13] = uSrc2.au8[6]; 8957 uDstOut.au8[14] = uSrc1.au8[7]; 8958 uDstOut.au8[15] = uSrc2.au8[7]; 8959 /* As usual, the upper 128-bits are treated like a parallel register to the lower half. */ 8960 uDstOut.au8[16] = uSrc1.au8[16]; 8961 uDstOut.au8[17] = uSrc2.au8[16]; 8962 uDstOut.au8[18] = uSrc1.au8[17]; 8963 uDstOut.au8[19] = uSrc2.au8[17]; 8964 uDstOut.au8[20] = uSrc1.au8[18]; 8965 uDstOut.au8[21] = uSrc2.au8[18]; 8966 uDstOut.au8[22] = uSrc1.au8[19]; 8967 uDstOut.au8[23] = uSrc2.au8[19]; 8968 uDstOut.au8[24] = uSrc1.au8[20]; 8969 uDstOut.au8[25] = uSrc2.au8[20]; 8970 uDstOut.au8[26] = uSrc1.au8[21]; 8971 uDstOut.au8[27] = uSrc2.au8[21]; 8972 uDstOut.au8[28] = uSrc1.au8[22]; 8973 uDstOut.au8[29] = uSrc2.au8[22]; 8974 uDstOut.au8[30] = uSrc1.au8[23]; 8975 uDstOut.au8[31] = uSrc2.au8[23]; 8976 *puDst = uDstOut; 8977 } 8978 8979 8980 /* 8981 * PUNPCKLBW - low words -> dwords 8982 */ 8983 #ifdef IEM_WITHOUT_ASSEMBLY 8984 8985 IEM_DECL_IMPL_DEF(void, iemAImpl_punpcklwd_u64,(uint64_t *puDst, uint64_t const *puSrc)) 8986 { 8987 RTUINT64U const uSrc2 = { *puSrc }; 8988 RTUINT64U const uSrc1 = { *puDst }; 8989 ASMCompilerBarrier(); 8990 RTUINT64U uDstOut; 8991 uDstOut.au16[0] = uSrc1.au16[0]; 8992 uDstOut.au16[1] = uSrc2.au16[0]; 8993 uDstOut.au16[2] = uSrc1.au16[1]; 8994 uDstOut.au16[3] = uSrc2.au16[1]; 8995 *puDst = uDstOut.u; 8996 } 8997 8998 8999 IEM_DECL_IMPL_DEF(void, iemAImpl_punpcklwd_u128,(PRTUINT128U puDst, PCRTUINT128U puSrc)) 9000 { 9001 RTUINT128U const uSrc2 = { *puSrc }; 9002 RTUINT128U const uSrc1 = { *puDst }; 9003 ASMCompilerBarrier(); 9004 RTUINT128U uDstOut; 9005 uDstOut.au16[0] = uSrc1.au16[0]; 9006 uDstOut.au16[1] = uSrc2.au16[0]; 9007 uDstOut.au16[2] = uSrc1.au16[1]; 9008 uDstOut.au16[3] = uSrc2.au16[1]; 9009 uDstOut.au16[4] = uSrc1.au16[2]; 9010 uDstOut.au16[5] = uSrc2.au16[2]; 9011 uDstOut.au16[6] = uSrc1.au16[3]; 9012 uDstOut.au16[7] = uSrc2.au16[3]; 9013 *puDst = uDstOut; 9014 } 9015 9016 #endif 9017 9018 IEM_DECL_IMPL_DEF(void, iemAImpl_vpunpcklwd_u128_fallback,(PRTUINT128U puDst, PCRTUINT128U puSrc1, PCRTUINT128U puSrc2)) 9019 { 9020 RTUINT128U const uSrc2 = { *puSrc2 }; 9021 RTUINT128U const uSrc1 = { *puSrc1 }; 9022 ASMCompilerBarrier(); 9023 RTUINT128U uDstOut; 9024 uDstOut.au16[0] = uSrc1.au16[0]; 9025 uDstOut.au16[1] = uSrc2.au16[0]; 9026 uDstOut.au16[2] = uSrc1.au16[1]; 9027 uDstOut.au16[3] = uSrc2.au16[1]; 9028 uDstOut.au16[4] = uSrc1.au16[2]; 9029 uDstOut.au16[5] = uSrc2.au16[2]; 9030 uDstOut.au16[6] = uSrc1.au16[3]; 9031 uDstOut.au16[7] = uSrc2.au16[3]; 9032 *puDst = uDstOut; 9033 } 9034 9035 9036 IEM_DECL_IMPL_DEF(void, iemAImpl_vpunpcklwd_u256_fallback,(PRTUINT256U puDst, PCRTUINT256U puSrc1, PCRTUINT256U puSrc2)) 9037 { 9038 RTUINT256U const uSrc2 = { *puSrc2 }; 9039 RTUINT256U const uSrc1 = { *puSrc1 }; 9040 ASMCompilerBarrier(); 9041 RTUINT256U uDstOut; 9042 uDstOut.au16[0] = uSrc1.au16[0]; 9043 uDstOut.au16[1] = uSrc2.au16[0]; 9044 uDstOut.au16[2] = uSrc1.au16[1]; 9045 uDstOut.au16[3] = uSrc2.au16[1]; 9046 uDstOut.au16[4] = uSrc1.au16[2]; 9047 uDstOut.au16[5] = uSrc2.au16[2]; 9048 uDstOut.au16[6] = uSrc1.au16[3]; 9049 uDstOut.au16[7] = uSrc2.au16[3]; 9050 9051 uDstOut.au16[8] = uSrc1.au16[8]; 9052 uDstOut.au16[9] = uSrc2.au16[8]; 9053 uDstOut.au16[10] = uSrc1.au16[9]; 9054 uDstOut.au16[11] = uSrc2.au16[9]; 9055 uDstOut.au16[12] = uSrc1.au16[10]; 9056 uDstOut.au16[13] = uSrc2.au16[10]; 9057 uDstOut.au16[14] = uSrc1.au16[11]; 9058 uDstOut.au16[15] = uSrc2.au16[11]; 9059 *puDst = uDstOut; 9060 } 9061 9062 9063 /* 9064 * PUNPCKLBW - low dwords -> qword(s) 9065 */ 9066 #ifdef IEM_WITHOUT_ASSEMBLY 9067 9068 IEM_DECL_IMPL_DEF(void, iemAImpl_punpckldq_u64,(uint64_t *puDst, uint64_t const *puSrc)) 9069 { 9070 RTUINT64U const uSrc2 = { *puSrc }; 9071 RTUINT64U const uSrc1 = { *puDst }; 9072 ASMCompilerBarrier(); 9073 RTUINT64U uDstOut; 9074 uDstOut.au32[0] = uSrc1.au32[0]; 9075 uDstOut.au32[1] = uSrc2.au32[0]; 9076 *puDst = uDstOut.u; 9077 } 9078 9079 9080 IEM_DECL_IMPL_DEF(void, iemAImpl_punpckldq_u128,(PRTUINT128U puDst, PCRTUINT128U puSrc)) 9081 { 9082 RTUINT128U const uSrc2 = { *puSrc }; 9083 RTUINT128U const uSrc1 = { *puDst }; 9084 ASMCompilerBarrier(); 9085 RTUINT128U uDstOut; 9086 uDstOut.au32[0] = uSrc1.au32[0]; 9087 uDstOut.au32[1] = uSrc2.au32[0]; 9088 uDstOut.au32[2] = uSrc1.au32[1]; 9089 uDstOut.au32[3] = uSrc2.au32[1]; 9090 *puDst = uDstOut; 9091 } 9092 9093 #endif 9094 9095 IEM_DECL_IMPL_DEF(void, iemAImpl_vpunpckldq_u128_fallback,(PRTUINT128U puDst, PCRTUINT128U puSrc1, PCRTUINT128U puSrc2)) 9096 { 9097 RTUINT128U const uSrc2 = { *puSrc2 }; 9098 RTUINT128U const uSrc1 = { *puSrc1 }; 9099 ASMCompilerBarrier(); 9100 RTUINT128U uDstOut; 9101 uDstOut.au32[0] = uSrc1.au32[0]; 9102 uDstOut.au32[1] = uSrc2.au32[0]; 9103 uDstOut.au32[2] = uSrc1.au32[1]; 9104 uDstOut.au32[3] = uSrc2.au32[1]; 9105 *puDst = uDstOut; 9106 } 9107 9108 9109 IEM_DECL_IMPL_DEF(void, iemAImpl_vpunpckldq_u256_fallback,(PRTUINT256U puDst, PCRTUINT256U puSrc1, PCRTUINT256U puSrc2)) 9110 { 9111 RTUINT256U const uSrc2 = { *puSrc2 }; 9112 RTUINT256U const uSrc1 = { *puSrc1 }; 9113 ASMCompilerBarrier(); 9114 RTUINT256U uDstOut; 9115 uDstOut.au32[0] = uSrc1.au32[0]; 9116 uDstOut.au32[1] = uSrc2.au32[0]; 9117 uDstOut.au32[2] = uSrc1.au32[1]; 9118 uDstOut.au32[3] = uSrc2.au32[1]; 9119 9120 uDstOut.au32[4] = uSrc1.au32[4]; 9121 uDstOut.au32[5] = uSrc2.au32[4]; 9122 uDstOut.au32[6] = uSrc1.au32[5]; 9123 uDstOut.au32[7] = uSrc2.au32[5]; 9124 *puDst = uDstOut; 9125 } 9126 9127 9128 /* 9129 * PUNPCKLQDQ -> Low qwords -> double qword(s). 9130 */ 9131 #ifdef IEM_WITHOUT_ASSEMBLY 9132 IEM_DECL_IMPL_DEF(void, iemAImpl_punpcklqdq_u128,(PRTUINT128U puDst, PCRTUINT128U puSrc)) 9133 { 9134 RTUINT128U const uSrc2 = { *puSrc }; 9135 RTUINT128U const uSrc1 = { *puDst }; 9136 ASMCompilerBarrier(); 9137 RTUINT128U uDstOut; 9138 uDstOut.au64[0] = uSrc1.au64[0]; 9139 uDstOut.au64[1] = uSrc2.au64[0]; 9140 *puDst = uDstOut; 9141 } 9142 #endif 9143 9144 9145 IEM_DECL_IMPL_DEF(void, iemAImpl_vpunpcklqdq_u128_fallback,(PRTUINT128U puDst, PCRTUINT128U puSrc1, PCRTUINT128U puSrc2)) 9146 { 9147 RTUINT128U const uSrc2 = { *puSrc2 }; 9148 RTUINT128U const uSrc1 = { *puSrc1 }; 9149 ASMCompilerBarrier(); 9150 RTUINT128U uDstOut; 9151 uDstOut.au64[0] = uSrc1.au64[0]; 9152 uDstOut.au64[1] = uSrc2.au64[0]; 9153 *puDst = uDstOut; 9154 } 9155 9156 9157 IEM_DECL_IMPL_DEF(void, iemAImpl_vpunpcklqdq_u256_fallback,(PRTUINT256U puDst, PCRTUINT256U puSrc1, PCRTUINT256U puSrc2)) 9158 { 9159 RTUINT256U const uSrc2 = { *puSrc2 }; 9160 RTUINT256U const uSrc1 = { *puSrc1 }; 9161 ASMCompilerBarrier(); 9162 RTUINT256U uDstOut; 9163 uDstOut.au64[0] = uSrc1.au64[0]; 9164 uDstOut.au64[1] = uSrc2.au64[0]; 9165 9166 uDstOut.au64[2] = uSrc1.au64[2]; 9167 uDstOut.au64[3] = uSrc2.au64[2]; 9168 *puDst = uDstOut; 9169 } 8653 9170 8654 9171 -
trunk/src/VBox/VMM/VMMAll/IEMAllInstructionsInterpretOnly.cpp
r95499 r95509 891 891 }; 892 892 893 894 /** Function table for the PUNPCKLBW instruction */895 IEM_STATIC const IEMOPMEDIAF1L1 g_iemAImpl_punpcklbw = { iemAImpl_punpcklbw_u64, iemAImpl_punpcklbw_u128 };896 /** Function table for the PUNPCKLBD instruction */897 IEM_STATIC const IEMOPMEDIAF1L1 g_iemAImpl_punpcklwd = { iemAImpl_punpcklwd_u64, iemAImpl_punpcklwd_u128 };898 /** Function table for the PUNPCKLDQ instruction */899 IEM_STATIC const IEMOPMEDIAF1L1 g_iemAImpl_punpckldq = { iemAImpl_punpckldq_u64, iemAImpl_punpckldq_u128 };900 /** Function table for the PUNPCKLQDQ instruction */901 IEM_STATIC const IEMOPMEDIAF1L1 g_iemAImpl_punpcklqdq = { NULL, iemAImpl_punpcklqdq_u128 };902 903 /** Function table for the PUNPCKHBW instruction */904 IEM_STATIC const IEMOPMEDIAF1H1 g_iemAImpl_punpckhbw = { iemAImpl_punpckhbw_u64, iemAImpl_punpckhbw_u128 };905 /** Function table for the PUNPCKHBD instruction */906 IEM_STATIC const IEMOPMEDIAF1H1 g_iemAImpl_punpckhwd = { iemAImpl_punpckhwd_u64, iemAImpl_punpckhwd_u128 };907 /** Function table for the PUNPCKHDQ instruction */908 IEM_STATIC const IEMOPMEDIAF1H1 g_iemAImpl_punpckhdq = { iemAImpl_punpckhdq_u64, iemAImpl_punpckhdq_u128 };909 /** Function table for the PUNPCKHQDQ instruction */910 IEM_STATIC const IEMOPMEDIAF1H1 g_iemAImpl_punpckhqdq = { NULL, iemAImpl_punpckhqdq_u128 };911 893 912 894 # ifndef IEM_WITHOUT_ASSEMBLY -
trunk/src/VBox/VMM/VMMAll/IEMAllInstructionsPython.py
r95487 r95509 223 223 'Ev': ( 'IDX_UseModRM', 'rm', '%Ev', 'Ev', 'RM', ), 224 224 'Ey': ( 'IDX_UseModRM', 'rm', '%Ey', 'Ey', 'RM', ), 225 'Qd': ( 'IDX_UseModRM', 'rm', '%Qd', 'Qd', 'RM', ), 225 226 'Qq': ( 'IDX_UseModRM', 'rm', '%Qq', 'Qq', 'RM', ), 226 227 'Qq_WO': ( 'IDX_UseModRM', 'rm', '%Qq', 'Qq', 'RM', ), -
trunk/src/VBox/VMM/VMMAll/IEMAllInstructionsTwoByte0f.cpp.h
r95489 r95509 3246 3246 * 3247 3247 * The 2nd operand is the first half of a register, which in the memory case 3248 * means a 32-bit memory access for MMX and 128-bit aligned 64-bit or 128-bit 3249 * memory accessed for MMX. 3250 * 3251 * Exceptions type 4. 3248 * means a 32-bit memory access. 3252 3249 */ 3253 FNIEMOP_DEF_1(iemOpCommonMmx_LowLow_To_Full, PCIEMOPMEDIAF1L1, pImpl)3250 FNIEMOP_DEF_1(iemOpCommonMmx_LowLow_To_Full, FNIEMAIMPLMEDIAOPTF2U64, pfnU64) 3254 3251 { 3255 3252 uint8_t bRm; IEM_OPCODE_GET_NEXT_U8(&bRm); … … 3261 3258 IEMOP_HLP_DONE_DECODING_NO_LOCK_PREFIX(); 3262 3259 IEM_MC_BEGIN(2, 0); 3263 IEM_MC_ARG(PRTUINT128U, pDst, 0); 3264 IEM_MC_ARG(uint64_t const *, pSrc, 1); 3265 IEM_MC_MAYBE_RAISE_SSE2_RELATED_XCPT(); 3266 IEM_MC_PREPARE_SSE_USAGE(); 3267 IEM_MC_REF_XREG_U128(pDst, ((bRm >> X86_MODRM_REG_SHIFT) & X86_MODRM_REG_SMASK) | pVCpu->iem.s.uRexReg); 3268 IEM_MC_REF_XREG_U64_CONST(pSrc, (bRm & X86_MODRM_RM_MASK) | pVCpu->iem.s.uRexB); 3269 IEM_MC_CALL_SSE_AIMPL_2(pImpl->pfnU128, pDst, pSrc); 3260 IEM_MC_ARG(uint64_t *, puDst, 0); 3261 IEM_MC_ARG(uint64_t const *, puSrc, 1); 3262 IEM_MC_MAYBE_RAISE_MMX_RELATED_XCPT(); 3263 IEM_MC_PREPARE_FPU_USAGE(); 3264 IEM_MC_REF_MREG_U64(puDst, IEM_GET_MODRM_REG_8(bRm)); 3265 IEM_MC_REF_MREG_U64_CONST(puSrc, IEM_GET_MODRM_RM_8(bRm)); 3266 IEM_MC_CALL_VOID_AIMPL_2(pfnU64, puDst, puSrc); 3267 IEM_MC_MODIFIED_MREG_BY_REF(puDst); 3268 IEM_MC_FPU_TO_MMX_MODE(); 3270 3269 IEM_MC_ADVANCE_RIP(); 3271 3270 IEM_MC_END(); … … 3277 3276 */ 3278 3277 IEM_MC_BEGIN(2, 2); 3279 IEM_MC_ARG( PRTUINT128U, pDst, 0);3278 IEM_MC_ARG(uint64_t *, puDst, 0); 3280 3279 IEM_MC_LOCAL(uint64_t, uSrc); 3281 IEM_MC_ARG_LOCAL_REF(uint64_t const *, p Src, uSrc, 1);3280 IEM_MC_ARG_LOCAL_REF(uint64_t const *, puSrc, uSrc, 1); 3282 3281 IEM_MC_LOCAL(RTGCPTR, GCPtrEffSrc); 3283 3282 3284 3283 IEM_MC_CALC_RM_EFF_ADDR(GCPtrEffSrc, bRm, 0); 3285 3284 IEMOP_HLP_DONE_DECODING_NO_LOCK_PREFIX(); 3286 IEM_MC_MAYBE_RAISE_SSE2_RELATED_XCPT(); 3287 IEM_MC_FETCH_MEM_U64_ALIGN_U128(uSrc, pVCpu->iem.s.iEffSeg, GCPtrEffSrc); 3288 3289 IEM_MC_PREPARE_SSE_USAGE(); 3290 IEM_MC_REF_XREG_U128(pDst, ((bRm >> X86_MODRM_REG_SHIFT) & X86_MODRM_REG_SMASK) | pVCpu->iem.s.uRexReg); 3291 IEM_MC_CALL_SSE_AIMPL_2(pImpl->pfnU128, pDst, pSrc); 3285 IEM_MC_MAYBE_RAISE_MMX_RELATED_XCPT(); 3286 IEM_MC_FETCH_MEM_U32_ZX_U64(uSrc, pVCpu->iem.s.iEffSeg, GCPtrEffSrc); 3287 3288 IEM_MC_PREPARE_FPU_USAGE(); 3289 IEM_MC_REF_MREG_U64(puDst, IEM_GET_MODRM_REG_8(bRm)); 3290 IEM_MC_CALL_VOID_AIMPL_2(pfnU64, puDst, puSrc); 3291 IEM_MC_MODIFIED_MREG_BY_REF(puDst); 3292 IEM_MC_FPU_TO_MMX_MODE(); 3292 3293 3293 3294 IEM_MC_ADVANCE_RIP(); … … 3303 3304 * 3304 3305 * The 2nd operand is the first half of a register, which in the memory case 3305 * means a 32-bit memory access for MMX and 128-bit aligned 64-bit or 128-bit 3306 * memory accessed for MMX. 3306 * 128-bit aligned 64-bit or 128-bit memory accessed for SSE. 3307 3307 * 3308 3308 * Exceptions type 4. 3309 3309 */ 3310 FNIEMOP_DEF_1(iemOpCommonSse _LowLow_To_Full, PCIEMOPMEDIAF1L1, pImpl)3310 FNIEMOP_DEF_1(iemOpCommonSse2_LowLow_To_Full, PFNIEMAIMPLMEDIAOPTF2U128, pfnU128) 3311 3311 { 3312 3312 uint8_t bRm; IEM_OPCODE_GET_NEXT_U8(&bRm); 3313 if (!pImpl->pfnU64) 3314 return IEMOP_RAISE_INVALID_OPCODE(); 3313 if ((bRm & X86_MODRM_MOD_MASK) == (3 << X86_MODRM_MOD_SHIFT)) 3314 { 3315 /* 3316 * Register, register. 3317 */ 3318 IEMOP_HLP_DONE_DECODING_NO_LOCK_PREFIX(); 3319 IEM_MC_BEGIN(2, 0); 3320 IEM_MC_ARG(PRTUINT128U, puDst, 0); 3321 IEM_MC_ARG(PCRTUINT128U, puSrc, 1); 3322 IEM_MC_MAYBE_RAISE_SSE2_RELATED_XCPT(); 3323 IEM_MC_ACTUALIZE_SSE_STATE_FOR_CHANGE(); 3324 IEM_MC_REF_XREG_U128(puDst, IEM_GET_MODRM_REG(pVCpu, bRm)); 3325 IEM_MC_REF_XREG_U128_CONST(puSrc, IEM_GET_MODRM_RM(pVCpu, bRm)); 3326 IEM_MC_CALL_VOID_AIMPL_2(pfnU128, puDst, puSrc); 3327 IEM_MC_ADVANCE_RIP(); 3328 IEM_MC_END(); 3329 } 3330 else 3331 { 3332 /* 3333 * Register, memory. 3334 */ 3335 IEM_MC_BEGIN(2, 2); 3336 IEM_MC_ARG(PRTUINT128U, puDst, 0); 3337 IEM_MC_LOCAL(RTUINT128U, uSrc); 3338 IEM_MC_ARG_LOCAL_REF(PCRTUINT128U, puSrc, uSrc, 1); 3339 IEM_MC_LOCAL(RTGCPTR, GCPtrEffSrc); 3340 3341 IEM_MC_CALC_RM_EFF_ADDR(GCPtrEffSrc, bRm, 0); 3342 IEMOP_HLP_DONE_DECODING_NO_LOCK_PREFIX(); 3343 IEM_MC_MAYBE_RAISE_SSE2_RELATED_XCPT(); 3344 /** @todo Most CPUs probably only read the low qword. We read everything to 3345 * make sure we apply segmentation and alignment checks correctly. 3346 * When we have time, it would be interesting to explore what real 3347 * CPUs actually does and whether it will do a TLB load for the high 3348 * part or skip any associated \#PF. Ditto for segmentation \#GPs. */ 3349 IEM_MC_FETCH_MEM_U128_ALIGN_SSE(uSrc, pVCpu->iem.s.iEffSeg, GCPtrEffSrc); 3350 3351 IEM_MC_ACTUALIZE_SSE_STATE_FOR_CHANGE(); 3352 IEM_MC_REF_XREG_U128(puDst, IEM_GET_MODRM_REG(pVCpu, bRm)); 3353 IEM_MC_CALL_VOID_AIMPL_2(pfnU128, puDst, puSrc); 3354 3355 IEM_MC_ADVANCE_RIP(); 3356 IEM_MC_END(); 3357 } 3358 return VINF_SUCCESS; 3359 } 3360 3361 3362 /** Opcode 0x0f 0x60 - punpcklbw Pq, Qd */ 3363 FNIEMOP_DEF(iemOp_punpcklbw_Pq_Qd) 3364 { 3365 IEMOP_MNEMONIC2(RM, PUNPCKLBW, punpcklbw, Pq, Qd, DISOPTYPE_HARMLESS | DISOPTYPE_MMX, 0); 3366 return FNIEMOP_CALL_1(iemOpCommonMmx_LowLow_To_Full, iemAImpl_punpcklbw_u64); 3367 } 3368 3369 3370 /** Opcode 0x66 0x0f 0x60 - punpcklbw Vx, W */ 3371 FNIEMOP_DEF(iemOp_punpcklbw_Vx_Wx) 3372 { 3373 IEMOP_MNEMONIC2(RM, PUNPCKLBW, punpcklbw, Vx, Wx, DISOPTYPE_HARMLESS | DISOPTYPE_SSE, 0); 3374 return FNIEMOP_CALL_1(iemOpCommonSse2_LowLow_To_Full, iemAImpl_punpcklbw_u128); 3375 } 3376 3377 3378 /* Opcode 0xf3 0x0f 0x60 - invalid */ 3379 3380 3381 /** Opcode 0x0f 0x61 - punpcklwd Pq, Qd */ 3382 FNIEMOP_DEF(iemOp_punpcklwd_Pq_Qd) 3383 { 3384 /** @todo AMD mark the MMX version as 3DNow!. Intel says MMX CPUID req. */ 3385 IEMOP_MNEMONIC2(RM, PUNPCKLWD, punpcklwd, Pq, Qd, DISOPTYPE_HARMLESS | DISOPTYPE_MMX, 0); 3386 return FNIEMOP_CALL_1(iemOpCommonMmx_LowLow_To_Full, iemAImpl_punpcklwd_u64); 3387 } 3388 3389 3390 /** Opcode 0x66 0x0f 0x61 - punpcklwd Vx, Wx */ 3391 FNIEMOP_DEF(iemOp_punpcklwd_Vx_Wx) 3392 { 3393 IEMOP_MNEMONIC2(RM, PUNPCKLWD, punpcklwd, Vx, Wx, DISOPTYPE_HARMLESS | DISOPTYPE_SSE, 0); 3394 return FNIEMOP_CALL_1(iemOpCommonSse2_LowLow_To_Full, iemAImpl_punpcklwd_u128); 3395 } 3396 3397 3398 /* Opcode 0xf3 0x0f 0x61 - invalid */ 3399 3400 3401 /** Opcode 0x0f 0x62 - punpckldq Pq, Qd */ 3402 FNIEMOP_DEF(iemOp_punpckldq_Pq_Qd) 3403 { 3404 IEMOP_MNEMONIC2(RM, PUNPCKLDQ, punpckldq, Pq, Qd, DISOPTYPE_HARMLESS | DISOPTYPE_MMX, 0); 3405 return FNIEMOP_CALL_1(iemOpCommonMmx_LowLow_To_Full, iemAImpl_punpckldq_u64); 3406 } 3407 3408 3409 /** Opcode 0x66 0x0f 0x62 - punpckldq Vx, Wx */ 3410 FNIEMOP_DEF(iemOp_punpckldq_Vx_Wx) 3411 { 3412 IEMOP_MNEMONIC2(RM, PUNPCKLDQ, punpckldq, Vx, Wx, DISOPTYPE_HARMLESS | DISOPTYPE_SSE, 0); 3413 return FNIEMOP_CALL_1(iemOpCommonSse2_LowLow_To_Full, iemAImpl_punpckldq_u128); 3414 } 3415 3416 3417 /* Opcode 0xf3 0x0f 0x62 - invalid */ 3418 3419 3420 3421 /** Opcode 0x0f 0x63 - packsswb Pq, Qq */ 3422 FNIEMOP_STUB(iemOp_packsswb_Pq_Qq); 3423 /** Opcode 0x66 0x0f 0x63 - packsswb Vx, Wx */ 3424 FNIEMOP_STUB(iemOp_packsswb_Vx_Wx); 3425 /* Opcode 0xf3 0x0f 0x63 - invalid */ 3426 3427 3428 /** Opcode 0x0f 0x64 - pcmpgtb Pq, Qq */ 3429 FNIEMOP_DEF(iemOp_pcmpgtb_Pq_Qq) 3430 { 3431 IEMOP_MNEMONIC2(RM, PCMPGTB, pcmpgtb, Pq, Qq, DISOPTYPE_HARMLESS, IEMOPHINT_IGNORES_OP_SIZES); 3432 return FNIEMOP_CALL_1(iemOpCommonMmx_FullFull_To_Full, &g_iemAImpl_pcmpgtb); 3433 } 3434 3435 3436 /** Opcode 0x66 0x0f 0x64 - pcmpgtb Vx, Wx */ 3437 FNIEMOP_DEF(iemOp_pcmpgtb_Vx_Wx) 3438 { 3439 IEMOP_MNEMONIC2(RM, PCMPGTB, pcmpgtb, Vx, Wx, DISOPTYPE_HARMLESS, IEMOPHINT_IGNORES_OP_SIZES); 3440 return FNIEMOP_CALL_1(iemOpCommonSse2_FullFull_To_Full, &g_iemAImpl_pcmpgtb); 3441 } 3442 3443 3444 /* Opcode 0xf3 0x0f 0x64 - invalid */ 3445 3446 3447 /** Opcode 0x0f 0x65 - pcmpgtw Pq, Qq */ 3448 FNIEMOP_DEF(iemOp_pcmpgtw_Pq_Qq) 3449 { 3450 IEMOP_MNEMONIC2(RM, PCMPGTW, pcmpgtw, Pq, Qq, DISOPTYPE_HARMLESS, IEMOPHINT_IGNORES_OP_SIZES); 3451 return FNIEMOP_CALL_1(iemOpCommonMmx_FullFull_To_Full, &g_iemAImpl_pcmpgtw); 3452 } 3453 3454 3455 /** Opcode 0x66 0x0f 0x65 - pcmpgtw Vx, Wx */ 3456 FNIEMOP_DEF(iemOp_pcmpgtw_Vx_Wx) 3457 { 3458 IEMOP_MNEMONIC2(RM, PCMPGTW, pcmpgtw, Vx, Wx, DISOPTYPE_HARMLESS, IEMOPHINT_IGNORES_OP_SIZES); 3459 return FNIEMOP_CALL_1(iemOpCommonSse2_FullFull_To_Full, &g_iemAImpl_pcmpgtw); 3460 } 3461 3462 3463 /* Opcode 0xf3 0x0f 0x65 - invalid */ 3464 3465 3466 /** Opcode 0x0f 0x66 - pcmpgtd Pq, Qq */ 3467 FNIEMOP_DEF(iemOp_pcmpgtd_Pq_Qq) 3468 { 3469 IEMOP_MNEMONIC2(RM, PCMPGTD, pcmpgtd, Pq, Qq, DISOPTYPE_HARMLESS, IEMOPHINT_IGNORES_OP_SIZES); 3470 return FNIEMOP_CALL_1(iemOpCommonMmx_FullFull_To_Full, &g_iemAImpl_pcmpgtd); 3471 } 3472 3473 3474 /** Opcode 0x66 0x0f 0x66 - pcmpgtd Vx, Wx */ 3475 FNIEMOP_DEF(iemOp_pcmpgtd_Vx_Wx) 3476 { 3477 IEMOP_MNEMONIC2(RM, PCMPGTD, pcmpgtd, Vx, Wx, DISOPTYPE_HARMLESS, IEMOPHINT_IGNORES_OP_SIZES); 3478 return FNIEMOP_CALL_1(iemOpCommonSse2_FullFull_To_Full, &g_iemAImpl_pcmpgtd); 3479 } 3480 3481 3482 /* Opcode 0xf3 0x0f 0x66 - invalid */ 3483 3484 /** Opcode 0x0f 0x67 - packuswb Pq, Qq */ 3485 FNIEMOP_STUB(iemOp_packuswb_Pq_Qq); 3486 /** Opcode 0x66 0x0f 0x67 - packuswb Vx, W */ 3487 FNIEMOP_STUB(iemOp_packuswb_Vx_W); 3488 /* Opcode 0xf3 0x0f 0x67 - invalid */ 3489 3490 3491 /** 3492 * Common worker for MMX instructions on the form: 3493 * pxxxx mm1, mm2/mem64 3494 * 3495 * The 2nd operand is the second half of a register, which in the memory case 3496 * means a 64-bit memory access for MMX. 3497 */ 3498 FNIEMOP_DEF_1(iemOpCommonMmx_HighHigh_To_Full, PFNIEMAIMPLMEDIAOPTF2U64, pfnU64) 3499 { 3500 uint8_t bRm; IEM_OPCODE_GET_NEXT_U8(&bRm); 3315 3501 if ((bRm & X86_MODRM_MOD_MASK) == (3 << X86_MODRM_MOD_SHIFT)) 3316 3502 { … … 3322 3508 IEMOP_HLP_DONE_DECODING_NO_LOCK_PREFIX(); 3323 3509 IEM_MC_BEGIN(2, 0); 3324 IEM_MC_ARG(uint64_t *, pDst, 0);3325 IEM_MC_ARG(uint 32_t const *, pSrc, 1);3510 IEM_MC_ARG(uint64_t *, puDst, 0); 3511 IEM_MC_ARG(uint64_t const *, puSrc, 1); 3326 3512 IEM_MC_MAYBE_RAISE_MMX_RELATED_XCPT(); 3327 3513 IEM_MC_PREPARE_FPU_USAGE(); 3328 IEM_MC_REF_MREG_U64(pDst, (bRm >> X86_MODRM_REG_SHIFT) & X86_MODRM_REG_SMASK); 3329 IEM_MC_REF_MREG_U32_CONST(pSrc, bRm & X86_MODRM_RM_MASK); 3330 IEM_MC_CALL_MMX_AIMPL_2(pImpl->pfnU64, pDst, pSrc); 3514 IEM_MC_REF_MREG_U64(puDst, IEM_GET_MODRM_REG_8(bRm)); 3515 IEM_MC_REF_MREG_U64_CONST(puSrc, IEM_GET_MODRM_RM_8(bRm)); 3516 IEM_MC_CALL_VOID_AIMPL_2(pfnU64, puDst, puSrc); 3517 IEM_MC_MODIFIED_MREG_BY_REF(puDst); 3518 IEM_MC_FPU_TO_MMX_MODE(); 3331 3519 IEM_MC_ADVANCE_RIP(); 3332 3520 IEM_MC_END(); … … 3338 3526 */ 3339 3527 IEM_MC_BEGIN(2, 2); 3340 IEM_MC_ARG(uint64_t *, p Dst, 0);3341 IEM_MC_LOCAL(uint 32_t, uSrc);3342 IEM_MC_ARG_LOCAL_REF(uint 32_t const *, pSrc, uSrc, 1);3528 IEM_MC_ARG(uint64_t *, puDst, 0); 3529 IEM_MC_LOCAL(uint64_t, uSrc); 3530 IEM_MC_ARG_LOCAL_REF(uint64_t const *, puSrc, uSrc, 1); 3343 3531 IEM_MC_LOCAL(RTGCPTR, GCPtrEffSrc); 3344 3532 … … 3346 3534 IEMOP_HLP_DONE_DECODING_NO_LOCK_PREFIX(); 3347 3535 IEM_MC_MAYBE_RAISE_MMX_RELATED_XCPT(); 3348 IEM_MC_FETCH_MEM_U 32(uSrc, pVCpu->iem.s.iEffSeg, GCPtrEffSrc);3536 IEM_MC_FETCH_MEM_U64(uSrc, pVCpu->iem.s.iEffSeg, GCPtrEffSrc); /* intel docs this to be full 64-bit read */ 3349 3537 3350 3538 IEM_MC_PREPARE_FPU_USAGE(); 3351 IEM_MC_REF_MREG_U64(pDst, (bRm >> X86_MODRM_REG_SHIFT) & X86_MODRM_REG_SMASK); 3352 IEM_MC_CALL_MMX_AIMPL_2(pImpl->pfnU64, pDst, pSrc); 3353 3354 IEM_MC_ADVANCE_RIP(); 3355 IEM_MC_END(); 3356 } 3357 return VINF_SUCCESS; 3358 } 3359 3360 3361 /** Opcode 0x0f 0x60 - punpcklbw Pq, Qd */ 3362 FNIEMOP_DEF(iemOp_punpcklbw_Pq_Qd) 3363 { 3364 IEMOP_MNEMONIC(punpcklbw, "punpcklbw Pq, Qd"); 3365 return FNIEMOP_CALL_1(iemOpCommonMmx_LowLow_To_Full, &g_iemAImpl_punpcklbw); 3366 } 3367 3368 /** Opcode 0x66 0x0f 0x60 - punpcklbw Vx, W */ 3369 FNIEMOP_DEF(iemOp_punpcklbw_Vx_Wx) 3370 { 3371 IEMOP_MNEMONIC(vpunpcklbw_Vx_Wx, "vpunpcklbw Vx, Wx"); 3372 return FNIEMOP_CALL_1(iemOpCommonSse_LowLow_To_Full, &g_iemAImpl_punpcklbw); 3373 } 3374 3375 /* Opcode 0xf3 0x0f 0x60 - invalid */ 3376 3377 3378 /** Opcode 0x0f 0x61 - punpcklwd Pq, Qd */ 3379 FNIEMOP_DEF(iemOp_punpcklwd_Pq_Qd) 3380 { 3381 IEMOP_MNEMONIC(punpcklwd, "punpcklwd Pq, Qd"); /** @todo AMD mark the MMX version as 3DNow!. Intel says MMX CPUID req. */ 3382 return FNIEMOP_CALL_1(iemOpCommonMmx_LowLow_To_Full, &g_iemAImpl_punpcklwd); 3383 } 3384 3385 /** Opcode 0x66 0x0f 0x61 - punpcklwd Vx, Wx */ 3386 FNIEMOP_DEF(iemOp_punpcklwd_Vx_Wx) 3387 { 3388 IEMOP_MNEMONIC(vpunpcklwd_Vx_Wx, "punpcklwd Vx, Wx"); 3389 return FNIEMOP_CALL_1(iemOpCommonSse_LowLow_To_Full, &g_iemAImpl_punpcklwd); 3390 } 3391 3392 /* Opcode 0xf3 0x0f 0x61 - invalid */ 3393 3394 3395 /** Opcode 0x0f 0x62 - punpckldq Pq, Qd */ 3396 FNIEMOP_DEF(iemOp_punpckldq_Pq_Qd) 3397 { 3398 IEMOP_MNEMONIC(punpckldq, "punpckldq Pq, Qd"); 3399 return FNIEMOP_CALL_1(iemOpCommonMmx_LowLow_To_Full, &g_iemAImpl_punpckldq); 3400 } 3401 3402 /** Opcode 0x66 0x0f 0x62 - punpckldq Vx, Wx */ 3403 FNIEMOP_DEF(iemOp_punpckldq_Vx_Wx) 3404 { 3405 IEMOP_MNEMONIC(punpckldq_Vx_Wx, "punpckldq Vx, Wx"); 3406 return FNIEMOP_CALL_1(iemOpCommonSse_LowLow_To_Full, &g_iemAImpl_punpckldq); 3407 } 3408 3409 /* Opcode 0xf3 0x0f 0x62 - invalid */ 3410 3411 3412 3413 /** Opcode 0x0f 0x63 - packsswb Pq, Qq */ 3414 FNIEMOP_STUB(iemOp_packsswb_Pq_Qq); 3415 /** Opcode 0x66 0x0f 0x63 - packsswb Vx, Wx */ 3416 FNIEMOP_STUB(iemOp_packsswb_Vx_Wx); 3417 /* Opcode 0xf3 0x0f 0x63 - invalid */ 3418 3419 3420 /** Opcode 0x0f 0x64 - pcmpgtb Pq, Qq */ 3421 FNIEMOP_DEF(iemOp_pcmpgtb_Pq_Qq) 3422 { 3423 IEMOP_MNEMONIC2(RM, PCMPGTB, pcmpgtb, Pq, Qq, DISOPTYPE_HARMLESS, IEMOPHINT_IGNORES_OP_SIZES); 3424 return FNIEMOP_CALL_1(iemOpCommonMmx_FullFull_To_Full, &g_iemAImpl_pcmpgtb); 3425 } 3426 3427 3428 /** Opcode 0x66 0x0f 0x64 - pcmpgtb Vx, Wx */ 3429 FNIEMOP_DEF(iemOp_pcmpgtb_Vx_Wx) 3430 { 3431 IEMOP_MNEMONIC2(RM, PCMPGTB, pcmpgtb, Vx, Wx, DISOPTYPE_HARMLESS, IEMOPHINT_IGNORES_OP_SIZES); 3432 return FNIEMOP_CALL_1(iemOpCommonSse2_FullFull_To_Full, &g_iemAImpl_pcmpgtb); 3433 } 3434 3435 3436 /* Opcode 0xf3 0x0f 0x64 - invalid */ 3437 3438 3439 /** Opcode 0x0f 0x65 - pcmpgtw Pq, Qq */ 3440 FNIEMOP_DEF(iemOp_pcmpgtw_Pq_Qq) 3441 { 3442 IEMOP_MNEMONIC2(RM, PCMPGTW, pcmpgtw, Pq, Qq, DISOPTYPE_HARMLESS, IEMOPHINT_IGNORES_OP_SIZES); 3443 return FNIEMOP_CALL_1(iemOpCommonMmx_FullFull_To_Full, &g_iemAImpl_pcmpgtw); 3444 } 3445 3446 3447 /** Opcode 0x66 0x0f 0x65 - pcmpgtw Vx, Wx */ 3448 FNIEMOP_DEF(iemOp_pcmpgtw_Vx_Wx) 3449 { 3450 IEMOP_MNEMONIC2(RM, PCMPGTW, pcmpgtw, Vx, Wx, DISOPTYPE_HARMLESS, IEMOPHINT_IGNORES_OP_SIZES); 3451 return FNIEMOP_CALL_1(iemOpCommonSse2_FullFull_To_Full, &g_iemAImpl_pcmpgtw); 3452 } 3453 3454 3455 /* Opcode 0xf3 0x0f 0x65 - invalid */ 3456 3457 3458 /** Opcode 0x0f 0x66 - pcmpgtd Pq, Qq */ 3459 FNIEMOP_DEF(iemOp_pcmpgtd_Pq_Qq) 3460 { 3461 IEMOP_MNEMONIC2(RM, PCMPGTD, pcmpgtd, Pq, Qq, DISOPTYPE_HARMLESS, IEMOPHINT_IGNORES_OP_SIZES); 3462 return FNIEMOP_CALL_1(iemOpCommonMmx_FullFull_To_Full, &g_iemAImpl_pcmpgtd); 3463 } 3464 3465 3466 /** Opcode 0x66 0x0f 0x66 - pcmpgtd Vx, Wx */ 3467 FNIEMOP_DEF(iemOp_pcmpgtd_Vx_Wx) 3468 { 3469 IEMOP_MNEMONIC2(RM, PCMPGTD, pcmpgtd, Vx, Wx, DISOPTYPE_HARMLESS, IEMOPHINT_IGNORES_OP_SIZES); 3470 return FNIEMOP_CALL_1(iemOpCommonSse2_FullFull_To_Full, &g_iemAImpl_pcmpgtd); 3471 } 3472 3473 3474 /* Opcode 0xf3 0x0f 0x66 - invalid */ 3475 3476 /** Opcode 0x0f 0x67 - packuswb Pq, Qq */ 3477 FNIEMOP_STUB(iemOp_packuswb_Pq_Qq); 3478 /** Opcode 0x66 0x0f 0x67 - packuswb Vx, W */ 3479 FNIEMOP_STUB(iemOp_packuswb_Vx_W); 3480 /* Opcode 0xf3 0x0f 0x67 - invalid */ 3539 IEM_MC_REF_MREG_U64(puDst, IEM_GET_MODRM_REG_8(bRm)); 3540 IEM_MC_CALL_VOID_AIMPL_2(pfnU64, puDst, puSrc); 3541 IEM_MC_MODIFIED_MREG_BY_REF(puDst); 3542 IEM_MC_FPU_TO_MMX_MODE(); 3543 3544 IEM_MC_ADVANCE_RIP(); 3545 IEM_MC_END(); 3546 } 3547 return VINF_SUCCESS; 3548 } 3481 3549 3482 3550 3483 3551 /** 3484 * Common worker for MMXinstructions on the form:3485 * pxxxx mm1, mm2/mem643552 * Common worker for SSE2 instructions on the form: 3553 * pxxxx xmm1, xmm2/mem128 3486 3554 * 3487 * The 2nd operand is the second half of a register, which in the memory case 3488 * means a 64-bit memory access for MMX, and for SSE a 128-bit aligned access 3489 * where it may read the full 128 bits or only the upper 64 bits. 3555 * The 2nd operand is the second half of a register, which for SSE a 128-bit 3556 * aligned access where it may read the full 128 bits or only the upper 64 bits. 3490 3557 * 3491 3558 * Exceptions type 4. 3492 3559 */ 3493 FNIEMOP_DEF_1(iemOpCommon Mmx_HighHigh_To_Full, PCIEMOPMEDIAF1H1, pImpl)3560 FNIEMOP_DEF_1(iemOpCommonSse2_HighHigh_To_Full, PFNIEMAIMPLMEDIAOPTF2U128, pfnU128) 3494 3561 { 3495 3562 uint8_t bRm; IEM_OPCODE_GET_NEXT_U8(&bRm); 3496 AssertReturn(pImpl->pfnU64, IEMOP_RAISE_INVALID_OPCODE());3497 3563 if ((bRm & X86_MODRM_MOD_MASK) == (3 << X86_MODRM_MOD_SHIFT)) 3498 3564 { … … 3500 3566 * Register, register. 3501 3567 */ 3502 /** @todo testcase: REX.B / REX.R and MMX register indexing. Ignored? */3503 /** @todo testcase: REX.B / REX.R and segment register indexing. Ignored? */3504 3568 IEMOP_HLP_DONE_DECODING_NO_LOCK_PREFIX(); 3505 3569 IEM_MC_BEGIN(2, 0); 3506 IEM_MC_ARG( uint64_t *, pDst, 0);3507 IEM_MC_ARG( uint64_t const *, pSrc, 1);3508 IEM_MC_MAYBE_RAISE_ MMX_RELATED_XCPT();3509 IEM_MC_PREPARE_ FPU_USAGE();3510 IEM_MC_REF_ MREG_U64(pDst, (bRm >> X86_MODRM_REG_SHIFT) & X86_MODRM_REG_SMASK);3511 IEM_MC_REF_ MREG_U64_CONST(pSrc, bRm & X86_MODRM_RM_MASK);3512 IEM_MC_CALL_ MMX_AIMPL_2(pImpl->pfnU64, pDst, pSrc);3570 IEM_MC_ARG(PRTUINT128U, puDst, 0); 3571 IEM_MC_ARG(PCRTUINT128U, puSrc, 1); 3572 IEM_MC_MAYBE_RAISE_SSE2_RELATED_XCPT(); 3573 IEM_MC_PREPARE_SSE_USAGE(); 3574 IEM_MC_REF_XREG_U128(puDst, IEM_GET_MODRM_REG(pVCpu, bRm)); 3575 IEM_MC_REF_XREG_U128_CONST(puSrc, IEM_GET_MODRM_RM(pVCpu, bRm)); 3576 IEM_MC_CALL_VOID_AIMPL_2(pfnU128, puDst, puSrc); 3513 3577 IEM_MC_ADVANCE_RIP(); 3514 3578 IEM_MC_END(); … … 3520 3584 */ 3521 3585 IEM_MC_BEGIN(2, 2); 3522 IEM_MC_ARG( uint64_t *, pDst, 0);3523 IEM_MC_LOCAL( uint64_t,uSrc);3524 IEM_MC_ARG_LOCAL_REF( uint64_t const *, pSrc, uSrc, 1);3586 IEM_MC_ARG(PRTUINT128U, puDst, 0); 3587 IEM_MC_LOCAL(RTUINT128U, uSrc); 3588 IEM_MC_ARG_LOCAL_REF(PCRTUINT128U, puSrc, uSrc, 1); 3525 3589 IEM_MC_LOCAL(RTGCPTR, GCPtrEffSrc); 3526 3590 3527 3591 IEM_MC_CALC_RM_EFF_ADDR(GCPtrEffSrc, bRm, 0); 3528 3592 IEMOP_HLP_DONE_DECODING_NO_LOCK_PREFIX(); 3529 IEM_MC_MAYBE_RAISE_MMX_RELATED_XCPT();3530 IEM_MC_FETCH_MEM_U64(uSrc, pVCpu->iem.s.iEffSeg, GCPtrEffSrc);3531 3532 IEM_MC_PREPARE_FPU_USAGE();3533 IEM_MC_REF_MREG_U64(pDst, (bRm >> X86_MODRM_REG_SHIFT) & X86_MODRM_REG_SMASK);3534 IEM_MC_CALL_MMX_AIMPL_2(pImpl->pfnU64, pDst, pSrc);3535 3536 IEM_MC_ADVANCE_RIP();3537 IEM_MC_END();3538 }3539 return VINF_SUCCESS;3540 }3541 3542 3543 /**3544 * Common worker for SSE2 instructions on the form:3545 * pxxxx xmm1, xmm2/mem1283546 *3547 * The 2nd operand is the second half of a register, which in the memory case3548 * means a 64-bit memory access for MMX, and for SSE a 128-bit aligned access3549 * where it may read the full 128 bits or only the upper 64 bits.3550 *3551 * Exceptions type 4.3552 */3553 FNIEMOP_DEF_1(iemOpCommonSse_HighHigh_To_Full, PCIEMOPMEDIAF1H1, pImpl)3554 {3555 uint8_t bRm; IEM_OPCODE_GET_NEXT_U8(&bRm);3556 if ((bRm & X86_MODRM_MOD_MASK) == (3 << X86_MODRM_MOD_SHIFT))3557 {3558 /*3559 * Register, register.3560 */3561 IEMOP_HLP_DONE_DECODING_NO_LOCK_PREFIX();3562 IEM_MC_BEGIN(2, 0);3563 IEM_MC_ARG(PRTUINT128U, pDst, 0);3564 IEM_MC_ARG(PCRTUINT128U, pSrc, 1);3565 3593 IEM_MC_MAYBE_RAISE_SSE2_RELATED_XCPT(); 3594 /** @todo Most CPUs probably only read the high qword. We read everything to 3595 * make sure we apply segmentation and alignment checks correctly. 3596 * When we have time, it would be interesting to explore what real 3597 * CPUs actually does and whether it will do a TLB load for the lower 3598 * part or skip any associated \#PF. */ 3599 IEM_MC_FETCH_MEM_U128_ALIGN_SSE(uSrc, pVCpu->iem.s.iEffSeg, GCPtrEffSrc); 3600 3566 3601 IEM_MC_PREPARE_SSE_USAGE(); 3567 IEM_MC_REF_XREG_U128(pDst, ((bRm >> X86_MODRM_REG_SHIFT) & X86_MODRM_REG_SMASK) | pVCpu->iem.s.uRexReg); 3568 IEM_MC_REF_XREG_U128_CONST(pSrc, (bRm & X86_MODRM_RM_MASK) | pVCpu->iem.s.uRexB); 3569 IEM_MC_CALL_SSE_AIMPL_2(pImpl->pfnU128, pDst, pSrc); 3570 IEM_MC_ADVANCE_RIP(); 3571 IEM_MC_END(); 3572 } 3573 else 3574 { 3575 /* 3576 * Register, memory. 3577 */ 3578 IEM_MC_BEGIN(2, 2); 3579 IEM_MC_ARG(PRTUINT128U, pDst, 0); 3580 IEM_MC_LOCAL(RTUINT128U, uSrc); 3581 IEM_MC_ARG_LOCAL_REF(PCRTUINT128U, pSrc, uSrc, 1); 3582 IEM_MC_LOCAL(RTGCPTR, GCPtrEffSrc); 3583 3584 IEM_MC_CALC_RM_EFF_ADDR(GCPtrEffSrc, bRm, 0); 3585 IEMOP_HLP_DONE_DECODING_NO_LOCK_PREFIX(); 3586 IEM_MC_MAYBE_RAISE_SSE2_RELATED_XCPT(); 3587 IEM_MC_FETCH_MEM_U128_ALIGN_SSE(uSrc, pVCpu->iem.s.iEffSeg, GCPtrEffSrc); /* Most CPUs probably only right high qword */ 3588 3589 IEM_MC_PREPARE_SSE_USAGE(); 3590 IEM_MC_REF_XREG_U128(pDst, ((bRm >> X86_MODRM_REG_SHIFT) & X86_MODRM_REG_SMASK) | pVCpu->iem.s.uRexReg); 3591 IEM_MC_CALL_SSE_AIMPL_2(pImpl->pfnU128, pDst, pSrc); 3592 3593 IEM_MC_ADVANCE_RIP(); 3594 IEM_MC_END(); 3595 } 3596 return VINF_SUCCESS; 3597 } 3598 3599 3600 /** Opcode 0x0f 0x68 - punpckhbw Pq, Qd */ 3601 FNIEMOP_DEF(iemOp_punpckhbw_Pq_Qd) 3602 { 3603 IEMOP_MNEMONIC(punpckhbw, "punpckhbw Pq, Qd"); 3604 return FNIEMOP_CALL_1(iemOpCommonMmx_HighHigh_To_Full, &g_iemAImpl_punpckhbw); 3605 } 3602 IEM_MC_REF_XREG_U128(puDst, IEM_GET_MODRM_REG(pVCpu, bRm)); 3603 IEM_MC_CALL_VOID_AIMPL_2(pfnU128, puDst, puSrc); 3604 3605 IEM_MC_ADVANCE_RIP(); 3606 IEM_MC_END(); 3607 } 3608 return VINF_SUCCESS; 3609 } 3610 3611 3612 /** Opcode 0x0f 0x68 - punpckhbw Pq, Qq 3613 * @note Intel and AMD both uses Qd for the second parameter, however they 3614 * both list it as a mmX/mem64 operand and intel describes it as being 3615 * loaded as a qword, so it should be Qq, shouldn't it? */ 3616 FNIEMOP_DEF(iemOp_punpckhbw_Pq_Qq) 3617 { 3618 IEMOP_MNEMONIC2(RM, PUNPCKHBW, punpckhbw, Pq, Qq, DISOPTYPE_HARMLESS | DISOPTYPE_MMX, 0); 3619 return FNIEMOP_CALL_1(iemOpCommonMmx_HighHigh_To_Full, iemAImpl_punpckhbw_u64); 3620 } 3621 3606 3622 3607 3623 /** Opcode 0x66 0x0f 0x68 - punpckhbw Vx, Wx */ 3608 3624 FNIEMOP_DEF(iemOp_punpckhbw_Vx_Wx) 3609 3625 { 3610 IEMOP_MNEMONIC(vpunpckhbw_Vx_Wx, "vpunpckhbw Vx, Wx"); 3611 return FNIEMOP_CALL_1(iemOpCommonSse_HighHigh_To_Full, &g_iemAImpl_punpckhbw); 3612 } 3626 IEMOP_MNEMONIC2(RM, PUNPCKHBW, punpckhbw, Vx, Wx, DISOPTYPE_HARMLESS | DISOPTYPE_SSE, 0); 3627 return FNIEMOP_CALL_1(iemOpCommonSse2_HighHigh_To_Full, iemAImpl_punpckhbw_u128); 3628 } 3629 3630 3613 3631 /* Opcode 0xf3 0x0f 0x68 - invalid */ 3614 3632 3615 3633 3616 /** Opcode 0x0f 0x69 - punpckhwd Pq, Qd */ 3617 FNIEMOP_DEF(iemOp_punpckhwd_Pq_Qd) 3618 { 3619 IEMOP_MNEMONIC(punpckhwd, "punpckhwd Pq, Qd"); 3620 return FNIEMOP_CALL_1(iemOpCommonMmx_HighHigh_To_Full, &g_iemAImpl_punpckhwd); 3621 } 3634 /** Opcode 0x0f 0x69 - punpckhwd Pq, Qq 3635 * @note Intel and AMD both uses Qd for the second parameter, however they 3636 * both list it as a mmX/mem64 operand and intel describes it as being 3637 * loaded as a qword, so it should be Qq, shouldn't it? */ 3638 FNIEMOP_DEF(iemOp_punpckhwd_Pq_Qq) 3639 { 3640 IEMOP_MNEMONIC2(RM, PUNPCKHWD, punpckhwd, Pq, Qq, DISOPTYPE_HARMLESS | DISOPTYPE_MMX, 0); 3641 return FNIEMOP_CALL_1(iemOpCommonMmx_HighHigh_To_Full, iemAImpl_punpckhwd_u64); 3642 } 3643 3622 3644 3623 3645 /** Opcode 0x66 0x0f 0x69 - punpckhwd Vx, Hx, Wx */ 3624 3646 FNIEMOP_DEF(iemOp_punpckhwd_Vx_Wx) 3625 3647 { 3626 IEMOP_MNEMONIC(punpckhwd_Vx_Wx, "punpckhwd Vx, Wx"); 3627 return FNIEMOP_CALL_1(iemOpCommonSse_HighHigh_To_Full, &g_iemAImpl_punpckhwd); 3628 3629 } 3648 IEMOP_MNEMONIC2(RM, PUNPCKHWD, punpckhwd, Vx, Wx, DISOPTYPE_HARMLESS | DISOPTYPE_SSE, 0); 3649 return FNIEMOP_CALL_1(iemOpCommonSse2_HighHigh_To_Full, iemAImpl_punpckhwd_u128); 3650 3651 } 3652 3653 3630 3654 /* Opcode 0xf3 0x0f 0x69 - invalid */ 3631 3655 3632 3656 3633 /** Opcode 0x0f 0x6a - punpckhdq Pq, Qd */ 3634 FNIEMOP_DEF(iemOp_punpckhdq_Pq_Qd) 3635 { 3636 IEMOP_MNEMONIC(punpckhdq, "punpckhdq Pq, Qd"); 3637 return FNIEMOP_CALL_1(iemOpCommonMmx_HighHigh_To_Full, &g_iemAImpl_punpckhdq); 3638 } 3657 /** Opcode 0x0f 0x6a - punpckhdq Pq, Qq 3658 * @note Intel and AMD both uses Qd for the second parameter, however they 3659 * both list it as a mmX/mem64 operand and intel describes it as being 3660 * loaded as a qword, so it should be Qq, shouldn't it? */ 3661 FNIEMOP_DEF(iemOp_punpckhdq_Pq_Qq) 3662 { 3663 IEMOP_MNEMONIC2(RM, PUNPCKHDQ, punpckhdq, Pq, Qq, DISOPTYPE_HARMLESS | DISOPTYPE_MMX, 0); 3664 return FNIEMOP_CALL_1(iemOpCommonMmx_HighHigh_To_Full, iemAImpl_punpckhdq_u64); 3665 } 3666 3639 3667 3640 3668 /** Opcode 0x66 0x0f 0x6a - punpckhdq Vx, W */ 3641 3669 FNIEMOP_DEF(iemOp_punpckhdq_Vx_W) 3642 3670 { 3643 IEMOP_MNEMONIC(punpckhdq_Vx_W, "punpckhdq Vx, W"); 3644 return FNIEMOP_CALL_1(iemOpCommonSse_HighHigh_To_Full, &g_iemAImpl_punpckhdq); 3645 } 3671 IEMOP_MNEMONIC2(RM, PUNPCKHDQ, punpckhdq, Vx, Wx, DISOPTYPE_HARMLESS | DISOPTYPE_SSE, 0); 3672 return FNIEMOP_CALL_1(iemOpCommonSse2_HighHigh_To_Full, iemAImpl_punpckhdq_u128); 3673 } 3674 3675 3646 3676 /* Opcode 0xf3 0x0f 0x6a - invalid */ 3647 3677 … … 3656 3686 /* Opcode 0x0f 0x6c - invalid */ 3657 3687 3688 3658 3689 /** Opcode 0x66 0x0f 0x6c - punpcklqdq Vx, Wx */ 3659 3690 FNIEMOP_DEF(iemOp_punpcklqdq_Vx_Wx) 3660 3691 { 3661 IEMOP_MNEMONIC(punpcklqdq, "punpcklqdq Vx, Wx"); 3662 return FNIEMOP_CALL_1(iemOpCommonSse_LowLow_To_Full, &g_iemAImpl_punpcklqdq); 3663 } 3692 IEMOP_MNEMONIC2(RM, PUNPCKLQDQ, punpcklqdq, Vx, Wx, DISOPTYPE_HARMLESS | DISOPTYPE_SSE, 0); 3693 return FNIEMOP_CALL_1(iemOpCommonSse2_LowLow_To_Full, iemAImpl_punpcklqdq_u128); 3694 } 3695 3664 3696 3665 3697 /* Opcode 0xf3 0x0f 0x6c - invalid */ … … 3669 3701 /* Opcode 0x0f 0x6d - invalid */ 3670 3702 3703 3671 3704 /** Opcode 0x66 0x0f 0x6d - punpckhqdq Vx, W */ 3672 3705 FNIEMOP_DEF(iemOp_punpckhqdq_Vx_W) 3673 3706 { 3674 IEMOP_MNEMONIC(punpckhqdq_Vx_W, "punpckhqdq Vx,W"); 3675 return FNIEMOP_CALL_1(iemOpCommonSse_HighHigh_To_Full, &g_iemAImpl_punpckhqdq); 3676 } 3707 IEMOP_MNEMONIC2(RM, PUNPCKHQDQ, punpckhqdq, Vx, Wx, DISOPTYPE_HARMLESS | DISOPTYPE_SSE, 0); 3708 return FNIEMOP_CALL_1(iemOpCommonSse2_HighHigh_To_Full, iemAImpl_punpckhqdq_u128); 3709 } 3710 3677 3711 3678 3712 /* Opcode 0xf3 0x0f 0x6d - invalid */ … … 10082 10116 /* 0x66 */ iemOp_pcmpgtd_Pq_Qq, iemOp_pcmpgtd_Vx_Wx, iemOp_InvalidNeedRM, iemOp_InvalidNeedRM, 10083 10117 /* 0x67 */ iemOp_packuswb_Pq_Qq, iemOp_packuswb_Vx_W, iemOp_InvalidNeedRM, iemOp_InvalidNeedRM, 10084 /* 0x68 */ iemOp_punpckhbw_Pq_Q d, iemOp_punpckhbw_Vx_Wx, iemOp_InvalidNeedRM, iemOp_InvalidNeedRM,10085 /* 0x69 */ iemOp_punpckhwd_Pq_Q d, iemOp_punpckhwd_Vx_Wx, iemOp_InvalidNeedRM, iemOp_InvalidNeedRM,10086 /* 0x6a */ iemOp_punpckhdq_Pq_Q d, iemOp_punpckhdq_Vx_W, iemOp_InvalidNeedRM, iemOp_InvalidNeedRM,10118 /* 0x68 */ iemOp_punpckhbw_Pq_Qq, iemOp_punpckhbw_Vx_Wx, iemOp_InvalidNeedRM, iemOp_InvalidNeedRM, 10119 /* 0x69 */ iemOp_punpckhwd_Pq_Qq, iemOp_punpckhwd_Vx_Wx, iemOp_InvalidNeedRM, iemOp_InvalidNeedRM, 10120 /* 0x6a */ iemOp_punpckhdq_Pq_Qq, iemOp_punpckhdq_Vx_W, iemOp_InvalidNeedRM, iemOp_InvalidNeedRM, 10087 10121 /* 0x6b */ iemOp_packssdw_Pq_Qd, iemOp_packssdw_Vx_Wx, iemOp_InvalidNeedRM, iemOp_InvalidNeedRM, 10088 10122 /* 0x6c */ iemOp_InvalidNeedRM, iemOp_punpcklqdq_Vx_Wx, iemOp_InvalidNeedRM, iemOp_InvalidNeedRM, -
trunk/src/VBox/VMM/VMMAll/IEMAllInstructionsVexMap1.cpp.h
r95487 r95509 137 137 138 138 139 /** 140 * Common worker for AVX2 instructions on the forms: 141 * - vpxxx xmm0, xmm1, xmm2/mem128 142 * - vpxxx ymm0, ymm1, ymm2/mem256 143 * 144 * Takes function table for function w/o implicit state parameter. 145 * 146 * Exceptions type 4. AVX cpuid check for 128-bit operation, AVX2 for 256-bit. 147 */ 148 FNIEMOP_DEF_1(iemOpCommonAvxAvx2_Vx_Hx_Wx_Opt, PCIEMOPMEDIAOPTF3, pImpl) 149 { 150 uint8_t bRm; IEM_OPCODE_GET_NEXT_U8(&bRm); 151 if ((bRm & X86_MODRM_MOD_MASK) == (3 << X86_MODRM_MOD_SHIFT)) 152 { 153 /* 154 * Register, register. 155 */ 156 if (pVCpu->iem.s.uVexLength) 157 { 158 IEMOP_HLP_DONE_VEX_DECODING_EX(fAvx2); 159 IEM_MC_BEGIN(3, 3); 160 IEM_MC_LOCAL(RTUINT256U, uDst); 161 IEM_MC_LOCAL(RTUINT256U, uSrc1); 162 IEM_MC_LOCAL(RTUINT256U, uSrc2); 163 IEM_MC_ARG_LOCAL_REF(PRTUINT256U, puDst, uDst, 0); 164 IEM_MC_ARG_LOCAL_REF(PCRTUINT256U, puSrc1, uSrc1, 1); 165 IEM_MC_ARG_LOCAL_REF(PCRTUINT256U, puSrc2, uSrc2, 2); 166 IEM_MC_MAYBE_RAISE_AVX2_RELATED_XCPT(); 167 IEM_MC_PREPARE_AVX_USAGE(); 168 IEM_MC_FETCH_YREG_U256(uSrc1, IEM_GET_EFFECTIVE_VVVV(pVCpu)); 169 IEM_MC_FETCH_YREG_U256(uSrc2, IEM_GET_MODRM_RM(pVCpu, bRm)); 170 IEM_MC_CALL_VOID_AIMPL_3(pImpl->pfnU256, puDst, puSrc1, puSrc2); 171 IEM_MC_STORE_YREG_U256_ZX_VLMAX(IEM_GET_MODRM_REG(pVCpu, bRm), uDst); 172 IEM_MC_ADVANCE_RIP(); 173 IEM_MC_END(); 174 } 175 else 176 { 177 IEMOP_HLP_DONE_VEX_DECODING_EX(fAvx); 178 IEM_MC_BEGIN(3, 0); 179 IEM_MC_ARG(PRTUINT128U, puDst, 0); 180 IEM_MC_ARG(PCRTUINT128U, puSrc1, 1); 181 IEM_MC_ARG(PCRTUINT128U, puSrc2, 2); 182 IEM_MC_MAYBE_RAISE_AVX2_RELATED_XCPT(); 183 IEM_MC_PREPARE_AVX_USAGE(); 184 IEM_MC_REF_XREG_U128(puDst, IEM_GET_MODRM_REG(pVCpu, bRm)); 185 IEM_MC_REF_XREG_U128_CONST(puSrc1, IEM_GET_EFFECTIVE_VVVV(pVCpu)); 186 IEM_MC_REF_XREG_U128_CONST(puSrc2, IEM_GET_MODRM_RM(pVCpu, bRm)); 187 IEM_MC_CALL_VOID_AIMPL_3(pImpl->pfnU128, puDst, puSrc1, puSrc2); 188 IEM_MC_CLEAR_YREG_128_UP( IEM_GET_MODRM_REG(pVCpu, bRm)); 189 IEM_MC_ADVANCE_RIP(); 190 IEM_MC_END(); 191 } 192 } 193 else 194 { 195 /* 196 * Register, memory. 197 */ 198 if (pVCpu->iem.s.uVexLength) 199 { 200 IEM_MC_BEGIN(3, 4); 201 IEM_MC_LOCAL(RTUINT256U, uDst); 202 IEM_MC_LOCAL(RTUINT256U, uSrc1); 203 IEM_MC_LOCAL(RTUINT256U, uSrc2); 204 IEM_MC_LOCAL(RTGCPTR, GCPtrEffSrc); 205 IEM_MC_ARG_LOCAL_REF(PRTUINT256U, puDst, uDst, 0); 206 IEM_MC_ARG_LOCAL_REF(PCRTUINT256U, puSrc1, uSrc1, 1); 207 IEM_MC_ARG_LOCAL_REF(PCRTUINT256U, puSrc2, uSrc2, 2); 208 209 IEM_MC_CALC_RM_EFF_ADDR(GCPtrEffSrc, bRm, 0); 210 IEMOP_HLP_DONE_VEX_DECODING_EX(fAvx2); 211 IEM_MC_MAYBE_RAISE_AVX2_RELATED_XCPT(); 212 IEM_MC_PREPARE_AVX_USAGE(); 213 214 IEM_MC_FETCH_MEM_U256_NO_AC(uSrc2, pVCpu->iem.s.iEffSeg, GCPtrEffSrc); 215 IEM_MC_FETCH_YREG_U256(uSrc1, IEM_GET_EFFECTIVE_VVVV(pVCpu)); 216 IEM_MC_CALL_VOID_AIMPL_3(pImpl->pfnU256, puDst, puSrc1, puSrc2); 217 IEM_MC_STORE_YREG_U256_ZX_VLMAX( IEM_GET_MODRM_REG(pVCpu, bRm), uDst); 218 219 IEM_MC_ADVANCE_RIP(); 220 IEM_MC_END(); 221 } 222 else 223 { 224 IEM_MC_BEGIN(3, 2); 225 IEM_MC_LOCAL(RTUINT128U, uSrc2); 226 IEM_MC_LOCAL(RTGCPTR, GCPtrEffSrc); 227 IEM_MC_ARG(PRTUINT128U, puDst, 0); 228 IEM_MC_ARG(PCRTUINT128U, puSrc1, 1); 229 IEM_MC_ARG_LOCAL_REF(PCRTUINT128U, puSrc2, uSrc2, 2); 230 231 IEM_MC_CALC_RM_EFF_ADDR(GCPtrEffSrc, bRm, 0); 232 IEMOP_HLP_DONE_VEX_DECODING_EX(fAvx); 233 IEM_MC_MAYBE_RAISE_AVX2_RELATED_XCPT(); 234 IEM_MC_PREPARE_AVX_USAGE(); 235 236 IEM_MC_FETCH_MEM_U128_NO_AC(uSrc2, pVCpu->iem.s.iEffSeg, GCPtrEffSrc); 237 IEM_MC_REF_XREG_U128(puDst, IEM_GET_MODRM_REG(pVCpu, bRm)); 238 IEM_MC_REF_XREG_U128_CONST(puSrc1, IEM_GET_EFFECTIVE_VVVV(pVCpu)); 239 IEM_MC_CALL_VOID_AIMPL_3(pImpl->pfnU128, puDst, puSrc1, puSrc2); 240 IEM_MC_CLEAR_YREG_128_UP( IEM_GET_MODRM_REG(pVCpu, bRm)); 241 242 IEM_MC_ADVANCE_RIP(); 243 IEM_MC_END(); 244 } 245 } 246 return VINF_SUCCESS; 247 } 248 249 250 /** 251 * Common worker for AVX2 instructions on the forms: 252 * - vpunpckhxx xmm0, xmm1, xmm2/mem128 253 * - vpunpckhxx ymm0, ymm1, ymm2/mem256 254 * 255 * The 128-bit memory version of this instruction may elect to skip fetching the 256 * lower 64 bits of the operand. We, however, do not. 257 * 258 * Exceptions type 4. AVX cpuid check for 128-bit operation, AVX2 for 256-bit. 259 */ 260 FNIEMOP_DEF_1(iemOpCommonAvxAvx2_Vx_Hx_Wx_HighSrc, PCIEMOPMEDIAOPTF3, pImpl) 261 { 262 return FNIEMOP_CALL_1(iemOpCommonAvxAvx2_Vx_Hx_Wx_Opt, pImpl); 263 } 264 265 266 /** 267 * Common worker for AVX2 instructions on the forms: 268 * - vpunpcklxx xmm0, xmm1, xmm2/mem128 269 * - vpunpcklxx ymm0, ymm1, ymm2/mem256 270 * 271 * The 128-bit memory version of this instruction may elect to skip fetching the 272 * higher 64 bits of the operand. We, however, do not. 273 * 274 * Exceptions type 4. AVX cpuid check for 128-bit operation, AVX2 for 256-bit. 275 */ 276 FNIEMOP_DEF_1(iemOpCommonAvxAvx2_Vx_Hx_Wx_LowSrc, PCIEMOPMEDIAOPTF3, pImpl) 277 { 278 return FNIEMOP_CALL_1(iemOpCommonAvxAvx2_Vx_Hx_Wx_Opt, pImpl); 279 } 280 281 139 282 140 283 /* Opcode VEX.0F 0x00 - invalid */ … … 1958 2101 1959 2102 1960 ///**1961 // * Common worker for SSE2 instructions on the forms:1962 // * pxxxx xmm1, xmm2/mem1281963 // *1964 // * The 2nd operand is the first half of a register, which in the memory case1965 // * means a 32-bit memory access for MMX and 128-bit aligned 64-bit or 128-bit1966 // * memory accessed for MMX.1967 // *1968 // * Exceptions type 4.1969 // */1970 //FNIEMOP_DEF_1(iemOpCommonSse_LowLow_To_Full, PCIEMOPMEDIAF1L1, pImpl)1971 //{1972 // uint8_t bRm; IEM_OPCODE_GET_NEXT_U8(&bRm);1973 // if (!pImpl->pfnU64)1974 // return IEMOP_RAISE_INVALID_OPCODE();1975 // if ((bRm & X86_MODRM_MOD_MASK) == (3 << X86_MODRM_MOD_SHIFT))1976 // {1977 // /*1978 // * Register, register.1979 // */1980 // /** @todo testcase: REX.B / REX.R and MMX register indexing. Ignored? */1981 // /** @todo testcase: REX.B / REX.R and segment register indexing. Ignored? */1982 // IEMOP_HLP_DONE_DECODING_NO_LOCK_PREFIX();1983 // IEM_MC_BEGIN(2, 0);1984 // IEM_MC_ARG(uint64_t *, pDst, 0);1985 // IEM_MC_ARG(uint32_t const *, pSrc, 1);1986 // IEM_MC_MAYBE_RAISE_MMX_RELATED_XCPT();1987 // IEM_MC_PREPARE_FPU_USAGE();1988 // IEM_MC_REF_MREG_U64(pDst, (bRm >> X86_MODRM_REG_SHIFT) & X86_MODRM_REG_SMASK);1989 // IEM_MC_REF_MREG_U32_CONST(pSrc, bRm & X86_MODRM_RM_MASK);1990 // IEM_MC_CALL_MMX_AIMPL_2(pImpl->pfnU64, pDst, pSrc);1991 // IEM_MC_ADVANCE_RIP();1992 // IEM_MC_END();1993 // }1994 // else1995 // {1996 // /*1997 // * Register, memory.1998 // */1999 // IEM_MC_BEGIN(2, 2);2000 // IEM_MC_ARG(uint64_t *, pDst, 0);2001 // IEM_MC_LOCAL(uint32_t, uSrc);2002 // IEM_MC_ARG_LOCAL_REF(uint32_t const *, pSrc, uSrc, 1);2003 // IEM_MC_LOCAL(RTGCPTR, GCPtrEffSrc);2004 //2005 // IEM_MC_CALC_RM_EFF_ADDR(GCPtrEffSrc, bRm, 0);2006 // IEMOP_HLP_DONE_DECODING_NO_LOCK_PREFIX();2007 // IEM_MC_MAYBE_RAISE_MMX_RELATED_XCPT();2008 // IEM_MC_FETCH_MEM_U32(uSrc, pVCpu->iem.s.iEffSeg, GCPtrEffSrc);2009 //2010 // IEM_MC_PREPARE_FPU_USAGE();2011 // IEM_MC_REF_MREG_U64(pDst, (bRm >> X86_MODRM_REG_SHIFT) & X86_MODRM_REG_SMASK);2012 // IEM_MC_CALL_MMX_AIMPL_2(pImpl->pfnU64, pDst, pSrc);2013 //2014 // IEM_MC_ADVANCE_RIP();2015 // IEM_MC_END();2016 // }2017 // return VINF_SUCCESS;2018 //}2019 2020 2021 2103 /* Opcode VEX.0F 0x60 - invalid */ 2022 2104 2023 /** Opcode VEX.66.0F 0x60 - vpunpcklbw Vx, Hx, W */ 2024 FNIEMOP_STUB(iemOp_vpunpcklbw_Vx_Hx_Wx); 2025 //FNIEMOP_DEF(iemOp_vpunpcklbw_Vx_Hx_Wx) 2026 //{ 2027 // IEMOP_MNEMONIC(vpunpcklbw, "vpunpcklbw Vx, Hx, Wx"); 2028 // return FNIEMOP_CALL_1(iemOpCommonSse_LowLow_To_Full, &g_iemAImpl_punpcklbw); 2029 //} 2105 2106 /** Opcode VEX.66.0F 0x60 - vpunpcklbw Vx, Hx, Wx */ 2107 FNIEMOP_DEF(iemOp_vpunpcklbw_Vx_Hx_Wx) 2108 { 2109 IEMOP_MNEMONIC3(VEX_RVM, VPUNPCKLBW, vpunpcklbw, Vx, Hx, Wx, DISOPTYPE_HARMLESS | DISOPTYPE_AVX, 0); 2110 IEMOPMEDIAOPTF3_INIT_VARS(iemAImpl_vpunpcklbw_u128, iemAImpl_vpunpcklbw_u256, 2111 iemAImpl_vpunpcklbw_u128_fallback, iemAImpl_vpunpcklbw_u256_fallback); 2112 return FNIEMOP_CALL_1(iemOpCommonAvxAvx2_Vx_Hx_Wx_LowSrc, IEM_SELECT_HOST_OR_FALLBACK(fAvx2, &s_Host, &s_Fallback)); 2113 } 2114 2030 2115 2031 2116 /* Opcode VEX.F3.0F 0x60 - invalid */ … … 2034 2119 /* Opcode VEX.0F 0x61 - invalid */ 2035 2120 2121 2036 2122 /** Opcode VEX.66.0F 0x61 - vpunpcklwd Vx, Hx, Wx */ 2037 FNIEMOP_STUB(iemOp_vpunpcklwd_Vx_Hx_Wx); 2038 //FNIEMOP_DEF(iemOp_vpunpcklwd_Vx_Hx_Wx) 2039 //{ 2040 // IEMOP_MNEMONIC(vpunpcklwd, "vpunpcklwd Vx, Hx, Wx"); 2041 // return FNIEMOP_CALL_1(iemOpCommonSse_LowLow_To_Full, &g_iemAImpl_punpcklwd); 2042 //} 2123 FNIEMOP_DEF(iemOp_vpunpcklwd_Vx_Hx_Wx) 2124 { 2125 IEMOP_MNEMONIC3(VEX_RVM, VPUNPCKLWD, vpunpcklwd, Vx, Hx, Wx, DISOPTYPE_HARMLESS | DISOPTYPE_AVX, 0); 2126 IEMOPMEDIAOPTF3_INIT_VARS(iemAImpl_vpunpcklwd_u128, iemAImpl_vpunpcklwd_u256, 2127 iemAImpl_vpunpcklwd_u128_fallback, iemAImpl_vpunpcklwd_u256_fallback); 2128 return FNIEMOP_CALL_1(iemOpCommonAvxAvx2_Vx_Hx_Wx_LowSrc, IEM_SELECT_HOST_OR_FALLBACK(fAvx2, &s_Host, &s_Fallback)); 2129 } 2130 2043 2131 2044 2132 /* Opcode VEX.F3.0F 0x61 - invalid */ … … 2048 2136 2049 2137 /** Opcode VEX.66.0F 0x62 - vpunpckldq Vx, Hx, Wx */ 2050 FNIEMOP_STUB(iemOp_vpunpckldq_Vx_Hx_Wx); 2051 //FNIEMOP_DEF(iemOp_vpunpckldq_Vx_Hx_Wx) 2052 //{ 2053 // IEMOP_MNEMONIC(vpunpckldq, "vpunpckldq Vx, Hx, Wx"); 2054 // return FNIEMOP_CALL_1(iemOpCommonSse_LowLow_To_Full, &g_iemAImpl_punpckldq); 2055 //} 2138 FNIEMOP_DEF(iemOp_vpunpckldq_Vx_Hx_Wx) 2139 { 2140 IEMOP_MNEMONIC3(VEX_RVM, VPUNPCKLDQ, vpunpckldq, Vx, Hx, Wx, DISOPTYPE_HARMLESS | DISOPTYPE_AVX, 0); 2141 IEMOPMEDIAOPTF3_INIT_VARS(iemAImpl_vpunpckldq_u128, iemAImpl_vpunpckldq_u256, 2142 iemAImpl_vpunpckldq_u128_fallback, iemAImpl_vpunpckldq_u256_fallback); 2143 return FNIEMOP_CALL_1(iemOpCommonAvxAvx2_Vx_Hx_Wx_LowSrc, IEM_SELECT_HOST_OR_FALLBACK(fAvx2, &s_Host, &s_Fallback)); 2144 } 2145 2056 2146 2057 2147 /* Opcode VEX.F3.0F 0x62 - invalid */ … … 2172 2262 2173 2263 /** Opcode VEX.66.0F 0x68 - vpunpckhbw Vx, Hx, Wx */ 2174 FNIEMOP_STUB(iemOp_vpunpckhbw_Vx_Hx_Wx); 2175 //FNIEMOP_DEF(iemOp_vpunpckhbw_Vx_Hx_Wx) 2176 //{ 2177 // IEMOP_MNEMONIC(vpunpckhbw, "vpunpckhbw Vx, Hx, Wx"); 2178 // return FNIEMOP_CALL_1(iemOpCommonSse_HighHigh_To_Full, &g_iemAImpl_punpckhbw); 2179 //} 2264 FNIEMOP_DEF(iemOp_vpunpckhbw_Vx_Hx_Wx) 2265 { 2266 IEMOP_MNEMONIC3(VEX_RVM, VPUNPCKHBW, vpunpckhbw, Vx, Hx, Wx, DISOPTYPE_HARMLESS | DISOPTYPE_AVX, 0); 2267 IEMOPMEDIAOPTF3_INIT_VARS(iemAImpl_vpunpckhbw_u128, iemAImpl_vpunpckhbw_u256, 2268 iemAImpl_vpunpckhbw_u128_fallback, iemAImpl_vpunpckhbw_u256_fallback); 2269 return FNIEMOP_CALL_1(iemOpCommonAvxAvx2_Vx_Hx_Wx_HighSrc, IEM_SELECT_HOST_OR_FALLBACK(fAvx2, &s_Host, &s_Fallback)); 2270 } 2271 2272 2180 2273 /* Opcode VEX.F3.0F 0x68 - invalid */ 2181 2274 … … 2183 2276 /* Opcode VEX.0F 0x69 - invalid */ 2184 2277 2278 2185 2279 /** Opcode VEX.66.0F 0x69 - vpunpckhwd Vx, Hx, Wx */ 2186 FNIEMOP_STUB(iemOp_vpunpckhwd_Vx_Hx_Wx); 2187 //FNIEMOP_DEF(iemOp_vpunpckhwd_Vx_Hx_Wx) 2188 //{ 2189 // IEMOP_MNEMONIC(vpunpckhwd, "vpunpckhwd Vx, Hx, Wx"); 2190 // return FNIEMOP_CALL_1(iemOpCommonSse_HighHigh_To_Full, &g_iemAImpl_punpckhwd); 2191 // 2192 //} 2280 FNIEMOP_DEF(iemOp_vpunpckhwd_Vx_Hx_Wx) 2281 { 2282 IEMOP_MNEMONIC3(VEX_RVM, VPUNPCKHWD, vpunpckhwd, Vx, Hx, Wx, DISOPTYPE_HARMLESS | DISOPTYPE_AVX, 0); 2283 IEMOPMEDIAOPTF3_INIT_VARS(iemAImpl_vpunpckhwd_u128, iemAImpl_vpunpckhwd_u256, 2284 iemAImpl_vpunpckhwd_u128_fallback, iemAImpl_vpunpckhwd_u256_fallback); 2285 return FNIEMOP_CALL_1(iemOpCommonAvxAvx2_Vx_Hx_Wx_HighSrc, IEM_SELECT_HOST_OR_FALLBACK(fAvx2, &s_Host, &s_Fallback)); 2286 } 2287 2288 2193 2289 /* Opcode VEX.F3.0F 0x69 - invalid */ 2194 2290 … … 2196 2292 /* Opcode VEX.0F 0x6a - invalid */ 2197 2293 2294 2198 2295 /** Opcode VEX.66.0F 0x6a - vpunpckhdq Vx, Hx, W */ 2199 FNIEMOP_STUB(iemOp_vpunpckhdq_Vx_Hx_W); 2200 //FNIEMOP_DEF(iemOp_vpunpckhdq_Vx_Hx_W) 2201 //{ 2202 // IEMOP_MNEMONIC(vpunpckhdq, "vpunpckhdq Vx, Hx, W"); 2203 // return FNIEMOP_CALL_1(iemOpCommonSse_HighHigh_To_Full, &g_iemAImpl_punpckhdq); 2204 //} 2296 FNIEMOP_DEF(iemOp_vpunpckhdq_Vx_Hx_W) 2297 { 2298 IEMOP_MNEMONIC3(VEX_RVM, VPUNPCKHDQ, vpunpckhdq, Vx, Hx, Wx, DISOPTYPE_HARMLESS | DISOPTYPE_AVX, 0); 2299 IEMOPMEDIAOPTF3_INIT_VARS(iemAImpl_vpunpckhdq_u128, iemAImpl_vpunpckhdq_u256, 2300 iemAImpl_vpunpckhdq_u128_fallback, iemAImpl_vpunpckhdq_u256_fallback); 2301 return FNIEMOP_CALL_1(iemOpCommonAvxAvx2_Vx_Hx_Wx_HighSrc, IEM_SELECT_HOST_OR_FALLBACK(fAvx2, &s_Host, &s_Fallback)); 2302 } 2303 2304 2205 2305 /* Opcode VEX.F3.0F 0x6a - invalid */ 2206 2306 … … 2214 2314 /* Opcode VEX.0F 0x6c - invalid */ 2215 2315 2316 2216 2317 /** Opcode VEX.66.0F 0x6c - vpunpcklqdq Vx, Hx, Wx */ 2217 FNIEMOP_STUB(iemOp_vpunpcklqdq_Vx_Hx_Wx); 2218 //FNIEMOP_DEF(iemOp_vpunpcklqdq_Vx_Hx_Wx) 2219 //{ 2220 // IEMOP_MNEMONIC(vpunpcklqdq, "vpunpcklqdq Vx, Hx, Wx"); 2221 // return FNIEMOP_CALL_1(iemOpCommonSse_LowLow_To_Full, &g_iemAImpl_punpcklqdq); 2222 //} 2318 FNIEMOP_DEF(iemOp_vpunpcklqdq_Vx_Hx_Wx) 2319 { 2320 IEMOP_MNEMONIC3(VEX_RVM, VPUNPCKLQDQ, vpunpcklqdq, Vx, Hx, Wx, DISOPTYPE_HARMLESS | DISOPTYPE_AVX, 0); 2321 IEMOPMEDIAOPTF3_INIT_VARS(iemAImpl_vpunpcklqdq_u128, iemAImpl_vpunpcklqdq_u256, 2322 iemAImpl_vpunpcklqdq_u128_fallback, iemAImpl_vpunpcklqdq_u256_fallback); 2323 return FNIEMOP_CALL_1(iemOpCommonAvxAvx2_Vx_Hx_Wx_LowSrc, IEM_SELECT_HOST_OR_FALLBACK(fAvx2, &s_Host, &s_Fallback)); 2324 } 2325 2223 2326 2224 2327 /* Opcode VEX.F3.0F 0x6c - invalid */ … … 2228 2331 /* Opcode VEX.0F 0x6d - invalid */ 2229 2332 2333 2230 2334 /** Opcode VEX.66.0F 0x6d - vpunpckhqdq Vx, Hx, W */ 2231 FNIEMOP_STUB(iemOp_vpunpckhqdq_Vx_Hx_W); 2232 //FNIEMOP_DEF(iemOp_vpunpckhqdq_Vx_Hx_W) 2233 //{ 2234 // IEMOP_MNEMONIC(punpckhqdq, "punpckhqdq"); 2235 // return FNIEMOP_CALL_1(iemOpCommonSse_HighHigh_To_Full, &g_iemAImpl_punpckhqdq); 2236 //} 2335 FNIEMOP_DEF(iemOp_vpunpckhqdq_Vx_Hx_W) 2336 { 2337 IEMOP_MNEMONIC3(VEX_RVM, VPUNPCKHQDQ, vpunpckhqdq, Vx, Hx, Wx, DISOPTYPE_HARMLESS | DISOPTYPE_AVX, 0); 2338 IEMOPMEDIAOPTF3_INIT_VARS(iemAImpl_vpunpckhqdq_u128, iemAImpl_vpunpckhqdq_u256, 2339 iemAImpl_vpunpckhqdq_u128_fallback, iemAImpl_vpunpckhqdq_u256_fallback); 2340 return FNIEMOP_CALL_1(iemOpCommonAvxAvx2_Vx_Hx_Wx_HighSrc, IEM_SELECT_HOST_OR_FALLBACK(fAvx2, &s_Host, &s_Fallback)); 2341 } 2342 2237 2343 2238 2344 /* Opcode VEX.F3.0F 0x6d - invalid */
Note:
See TracChangeset
for help on using the changeset viewer.