VirtualBox

Changeset 95509 in vbox


Ignore:
Timestamp:
Jul 4, 2022 10:53:58 PM (3 years ago)
Author:
vboxsync
svn:sync-xref-src-repo-rev:
152128
Message:

VMM/IEM: Implemented vpunpcklbw, vpunpcklwd, vpunpckldq, vpunpcklqdq, vpunpckhbw, vpunpckhwd, vpunpckhdq, vpunpckhqdq and fixed the corresponding SSE and MMX instruction. bugref:9898

Location:
trunk/src/VBox/VMM/VMMAll
Files:
6 edited

Legend:

Unmodified
Added
Removed
  • trunk/src/VBox/VMM/VMMAll/IEMAllAImpl.asm

    r95499 r95509  
    36293629; @param    2       1 if MMX is included, 0 if not.
    36303630;
    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).
    36343633;
    36353634%macro IEMIMPL_MEDIA_F1L1 2
    36363635 %if %2 != 0
    3637 BEGINPROC_FASTCALL iemAImpl_ %+ %1 %+ _u64, 12
    3638         PROLOGUE_3_ARGS
     3636BEGINPROC_FASTCALL iemAImpl_ %+ %1 %+ _u64, 8
     3637        PROLOGUE_2_ARGS
    36393638        IEMIMPL_MMX_PROLOGUE
    36403639
    3641         movq    mm0, [A1]
    3642         movd    mm1, [A2]
     3640        movq    mm0, [A0]
     3641        movq    mm1, [A1]
    36433642        %1      mm0, mm1
    3644         movq    [A1], mm0
     3643        movq    [A0], mm0
    36453644
    36463645        IEMIMPL_MMX_EPILOGUE
    3647         EPILOGUE_3_ARGS
     3646        EPILOGUE_2_ARGS
    36483647ENDPROC iemAImpl_ %+ %1 %+ _u64
    36493648 %endif
    36503649
    3651 BEGINPROC_FASTCALL iemAImpl_ %+ %1 %+ _u128, 12
    3652         PROLOGUE_3_ARGS
     3650BEGINPROC_FASTCALL iemAImpl_ %+ %1 %+ _u128, 8
     3651        PROLOGUE_2_ARGS
    36533652        IEMIMPL_SSE_PROLOGUE
    36543653
    3655         movdqu   xmm0, [A1]
    3656         movq     xmm1, [A2]
     3654        movdqu   xmm0, [A0]
     3655        movdqu   xmm1, [A1]
    36573656        %1       xmm0, xmm1
    3658         movdqu   [A1], xmm0
     3657        movdqu   [A0], xmm0
    36593658
    36603659        IEMIMPL_SSE_EPILOGUE
    3661         EPILOGUE_3_ARGS
     3660        EPILOGUE_2_ARGS
    36623661ENDPROC iemAImpl_ %+ %1 %+ _u128
    36633662%endmacro
     
    36703669
    36713670;;
     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
     3683BEGINPROC_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
     3694ENDPROC iemAImpl_ %+ %1 %+ _u128
     3695
     3696BEGINPROC_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
     3707ENDPROC iemAImpl_ %+ %1 %+ _u256
     3708%endmacro
     3709
     3710IEMIMPL_MEDIA_F1L1L1 vpunpcklbw
     3711IEMIMPL_MEDIA_F1L1L1 vpunpcklwd
     3712IEMIMPL_MEDIA_F1L1L1 vpunpckldq
     3713IEMIMPL_MEDIA_F1L1L1 vpunpcklqdq
     3714
     3715
     3716;;
    36723717; Media instruction working on one full sized and one half sized register (high half).
    36733718;
     
    36753720; @param    2       1 if MMX is included, 0 if not.
    36763721;
    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.
    36813725;
    36823726%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
     3727IEMIMPL_MEDIA_F1L1 %1, %2
    37103728%endmacro
    37113729
     
    37143732IEMIMPL_MEDIA_F1L1 punpckhdq,  1
    37153733IEMIMPL_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
     3749IEMIMPL_MEDIA_F1L1L1 %1
     3750%endmacro
     3751
     3752IEMIMPL_MEDIA_F1H1H1 vpunpckhbw
     3753IEMIMPL_MEDIA_F1H1H1 vpunpckhwd
     3754IEMIMPL_MEDIA_F1H1H1 vpunpckhdq
     3755IEMIMPL_MEDIA_F1H1H1 vpunpckhqdq
    37163756
    37173757
  • trunk/src/VBox/VMM/VMMAll/IEMAllAImplC.cpp

    r95499 r95509  
    85488548
    85498549
     8550/*
     8551 * PUNPCKHBW - high bytes -> words
     8552 */
    85508553#ifdef IEM_WITHOUT_ASSEMBLY
    85518554
    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 */
     8555IEM_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
     8573IEM_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
     8600IEM_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
     8626IEM_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
     8674IEM_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
     8688IEM_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
     8707IEM_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
     8725IEM_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
     8757IEM_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
     8769IEM_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
     8784IEM_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
     8798IEM_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
     8821IEM_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
     8834IEM_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
     8846IEM_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
     8866IEM_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
     8884IEM_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
     8911IEM_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
     8937IEM_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
     8985IEM_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
     8999IEM_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
     9018IEM_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
     9036IEM_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
     9068IEM_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
     9080IEM_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
     9095IEM_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
     9109IEM_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
     9132IEM_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
     9145IEM_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
     9157IEM_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}
    86539170
    86549171
  • trunk/src/VBox/VMM/VMMAll/IEMAllInstructionsInterpretOnly.cpp

    r95499 r95509  
    891891};
    892892
    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 };
    911893
    912894# ifndef IEM_WITHOUT_ASSEMBLY
  • trunk/src/VBox/VMM/VMMAll/IEMAllInstructionsPython.py

    r95487 r95509  
    223223    'Ev':           ( 'IDX_UseModRM',       'rm',     '%Ev',  'Ev',      'RM',    ),
    224224    'Ey':           ( 'IDX_UseModRM',       'rm',     '%Ey',  'Ey',      'RM',    ),
     225    'Qd':           ( 'IDX_UseModRM',       'rm',     '%Qd',  'Qd',      'RM',    ),
    225226    'Qq':           ( 'IDX_UseModRM',       'rm',     '%Qq',  'Qq',      'RM',    ),
    226227    'Qq_WO':        ( 'IDX_UseModRM',       'rm',     '%Qq',  'Qq',      'RM',    ),
  • trunk/src/VBox/VMM/VMMAll/IEMAllInstructionsTwoByte0f.cpp.h

    r95489 r95509  
    32463246 *
    32473247 * 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.
    32523249 */
    3253 FNIEMOP_DEF_1(iemOpCommonMmx_LowLow_To_Full, PCIEMOPMEDIAF1L1, pImpl)
     3250FNIEMOP_DEF_1(iemOpCommonMmx_LowLow_To_Full, FNIEMAIMPLMEDIAOPTF2U64, pfnU64)
    32543251{
    32553252    uint8_t bRm; IEM_OPCODE_GET_NEXT_U8(&bRm);
     
    32613258        IEMOP_HLP_DONE_DECODING_NO_LOCK_PREFIX();
    32623259        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();
    32703269        IEM_MC_ADVANCE_RIP();
    32713270        IEM_MC_END();
     
    32773276         */
    32783277        IEM_MC_BEGIN(2, 2);
    3279         IEM_MC_ARG(PRTUINT128U,                 pDst,       0);
     3278        IEM_MC_ARG(uint64_t *,                  puDst,       0);
    32803279        IEM_MC_LOCAL(uint64_t,                  uSrc);
    3281         IEM_MC_ARG_LOCAL_REF(uint64_t const *,  pSrc, uSrc, 1);
     3280        IEM_MC_ARG_LOCAL_REF(uint64_t const *,  puSrc, uSrc, 1);
    32823281        IEM_MC_LOCAL(RTGCPTR,                   GCPtrEffSrc);
    32833282
    32843283        IEM_MC_CALC_RM_EFF_ADDR(GCPtrEffSrc, bRm, 0);
    32853284        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();
    32923293
    32933294        IEM_MC_ADVANCE_RIP();
     
    33033304 *
    33043305 * 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.
    33073307 *
    33083308 * Exceptions type 4.
    33093309 */
    3310 FNIEMOP_DEF_1(iemOpCommonSse_LowLow_To_Full, PCIEMOPMEDIAF1L1, pImpl)
     3310FNIEMOP_DEF_1(iemOpCommonSse2_LowLow_To_Full, PFNIEMAIMPLMEDIAOPTF2U128, pfnU128)
    33113311{
    33123312    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 */
     3363FNIEMOP_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 */
     3371FNIEMOP_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 */
     3382FNIEMOP_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 */
     3391FNIEMOP_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 */
     3402FNIEMOP_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 */
     3410FNIEMOP_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 */
     3422FNIEMOP_STUB(iemOp_packsswb_Pq_Qq);
     3423/** Opcode 0x66 0x0f 0x63 - packsswb Vx, Wx */
     3424FNIEMOP_STUB(iemOp_packsswb_Vx_Wx);
     3425/*  Opcode 0xf3 0x0f 0x63 - invalid */
     3426
     3427
     3428/** Opcode      0x0f 0x64 - pcmpgtb Pq, Qq */
     3429FNIEMOP_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 */
     3437FNIEMOP_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 */
     3448FNIEMOP_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 */
     3456FNIEMOP_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 */
     3467FNIEMOP_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 */
     3475FNIEMOP_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 */
     3485FNIEMOP_STUB(iemOp_packuswb_Pq_Qq);
     3486/** Opcode 0x66 0x0f 0x67 - packuswb Vx, W */
     3487FNIEMOP_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 */
     3498FNIEMOP_DEF_1(iemOpCommonMmx_HighHigh_To_Full, PFNIEMAIMPLMEDIAOPTF2U64, pfnU64)
     3499{
     3500    uint8_t bRm; IEM_OPCODE_GET_NEXT_U8(&bRm);
    33153501    if ((bRm & X86_MODRM_MOD_MASK) == (3 << X86_MODRM_MOD_SHIFT))
    33163502    {
     
    33223508        IEMOP_HLP_DONE_DECODING_NO_LOCK_PREFIX();
    33233509        IEM_MC_BEGIN(2, 0);
    3324         IEM_MC_ARG(uint64_t *,          pDst, 0);
    3325         IEM_MC_ARG(uint32_t const *,    pSrc, 1);
     3510        IEM_MC_ARG(uint64_t *,              puDst, 0);
     3511        IEM_MC_ARG(uint64_t const *,        puSrc, 1);
    33263512        IEM_MC_MAYBE_RAISE_MMX_RELATED_XCPT();
    33273513        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();
    33313519        IEM_MC_ADVANCE_RIP();
    33323520        IEM_MC_END();
     
    33383526         */
    33393527        IEM_MC_BEGIN(2, 2);
    3340         IEM_MC_ARG(uint64_t *,                  pDst,       0);
    3341         IEM_MC_LOCAL(uint32_t,                  uSrc);
    3342         IEM_MC_ARG_LOCAL_REF(uint32_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);
    33433531        IEM_MC_LOCAL(RTGCPTR,                   GCPtrEffSrc);
    33443532
     
    33463534        IEMOP_HLP_DONE_DECODING_NO_LOCK_PREFIX();
    33473535        IEM_MC_MAYBE_RAISE_MMX_RELATED_XCPT();
    3348         IEM_MC_FETCH_MEM_U32(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 */
    33493537
    33503538        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}
    34813549
    34823550
    34833551/**
    3484  * Common worker for MMX instructions on the form:
    3485  *      pxxxx mm1, mm2/mem64
     3552 * Common worker for SSE2 instructions on the form:
     3553 *      pxxxx xmm1, xmm2/mem128
    34863554 *
    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.
    34903557 *
    34913558 * Exceptions type 4.
    34923559 */
    3493 FNIEMOP_DEF_1(iemOpCommonMmx_HighHigh_To_Full, PCIEMOPMEDIAF1H1, pImpl)
     3560FNIEMOP_DEF_1(iemOpCommonSse2_HighHigh_To_Full, PFNIEMAIMPLMEDIAOPTF2U128, pfnU128)
    34943561{
    34953562    uint8_t bRm; IEM_OPCODE_GET_NEXT_U8(&bRm);
    3496     AssertReturn(pImpl->pfnU64, IEMOP_RAISE_INVALID_OPCODE());
    34973563    if ((bRm & X86_MODRM_MOD_MASK) == (3 << X86_MODRM_MOD_SHIFT))
    34983564    {
     
    35003566         * Register, register.
    35013567         */
    3502         /** @todo testcase: REX.B / REX.R and MMX register indexing. Ignored? */
    3503         /** @todo testcase: REX.B / REX.R and segment register indexing. Ignored? */
    35043568        IEMOP_HLP_DONE_DECODING_NO_LOCK_PREFIX();
    35053569        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);
    35133577        IEM_MC_ADVANCE_RIP();
    35143578        IEM_MC_END();
     
    35203584         */
    35213585        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);
    35253589        IEM_MC_LOCAL(RTGCPTR,                   GCPtrEffSrc);
    35263590
    35273591        IEM_MC_CALC_RM_EFF_ADDR(GCPtrEffSrc, bRm, 0);
    35283592        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/mem128
    3546  *
    3547  * The 2nd operand is the second half of a register, which in the memory case
    3548  * means a 64-bit memory access for MMX, and for SSE a 128-bit aligned access
    3549  * 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);
    35653593        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
    35663601        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? */
     3616FNIEMOP_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
    36063622
    36073623/** Opcode 0x66 0x0f 0x68 - punpckhbw Vx, Wx */
    36083624FNIEMOP_DEF(iemOp_punpckhbw_Vx_Wx)
    36093625{
    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
    36133631/*  Opcode 0xf3 0x0f 0x68 - invalid */
    36143632
    36153633
    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? */
     3638FNIEMOP_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
    36223644
    36233645/** Opcode 0x66 0x0f 0x69 - punpckhwd Vx, Hx, Wx */
    36243646FNIEMOP_DEF(iemOp_punpckhwd_Vx_Wx)
    36253647{
    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
    36303654/*  Opcode 0xf3 0x0f 0x69 - invalid */
    36313655
    36323656
    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? */
     3661FNIEMOP_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
    36393667
    36403668/** Opcode 0x66 0x0f 0x6a - punpckhdq Vx, W */
    36413669FNIEMOP_DEF(iemOp_punpckhdq_Vx_W)
    36423670{
    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
    36463676/*  Opcode 0xf3 0x0f 0x6a - invalid */
    36473677
     
    36563686/*  Opcode      0x0f 0x6c - invalid */
    36573687
     3688
    36583689/** Opcode 0x66 0x0f 0x6c - punpcklqdq Vx, Wx */
    36593690FNIEMOP_DEF(iemOp_punpcklqdq_Vx_Wx)
    36603691{
    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
    36643696
    36653697/*  Opcode 0xf3 0x0f 0x6c - invalid */
     
    36693701/*  Opcode      0x0f 0x6d - invalid */
    36703702
     3703
    36713704/** Opcode 0x66 0x0f 0x6d - punpckhqdq Vx, W */
    36723705FNIEMOP_DEF(iemOp_punpckhqdq_Vx_W)
    36733706{
    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
    36773711
    36783712/*  Opcode 0xf3 0x0f 0x6d - invalid */
     
    1008210116    /* 0x66 */  iemOp_pcmpgtd_Pq_Qq,        iemOp_pcmpgtd_Vx_Wx,        iemOp_InvalidNeedRM,        iemOp_InvalidNeedRM,
    1008310117    /* 0x67 */  iemOp_packuswb_Pq_Qq,       iemOp_packuswb_Vx_W,        iemOp_InvalidNeedRM,        iemOp_InvalidNeedRM,
    10084     /* 0x68 */  iemOp_punpckhbw_Pq_Qd,      iemOp_punpckhbw_Vx_Wx,      iemOp_InvalidNeedRM,        iemOp_InvalidNeedRM,
    10085     /* 0x69 */  iemOp_punpckhwd_Pq_Qd,      iemOp_punpckhwd_Vx_Wx,      iemOp_InvalidNeedRM,        iemOp_InvalidNeedRM,
    10086     /* 0x6a */  iemOp_punpckhdq_Pq_Qd,      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,
    1008710121    /* 0x6b */  iemOp_packssdw_Pq_Qd,       iemOp_packssdw_Vx_Wx,       iemOp_InvalidNeedRM,        iemOp_InvalidNeedRM,
    1008810122    /* 0x6c */  iemOp_InvalidNeedRM,        iemOp_punpcklqdq_Vx_Wx,     iemOp_InvalidNeedRM,        iemOp_InvalidNeedRM,
  • trunk/src/VBox/VMM/VMMAll/IEMAllInstructionsVexMap1.cpp.h

    r95487 r95509  
    137137
    138138
     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 */
     148FNIEMOP_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 */
     260FNIEMOP_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 */
     276FNIEMOP_DEF_1(iemOpCommonAvxAvx2_Vx_Hx_Wx_LowSrc, PCIEMOPMEDIAOPTF3, pImpl)
     277{
     278    return FNIEMOP_CALL_1(iemOpCommonAvxAvx2_Vx_Hx_Wx_Opt, pImpl);
     279}
     280
     281
    139282
    140283/*  Opcode VEX.0F 0x00 - invalid */
     
    19582101
    19592102
    1960 ///**
    1961 // * Common worker for SSE2 instructions on the forms:
    1962 // *      pxxxx xmm1, xmm2/mem128
    1963 // *
    1964 // * The 2nd operand is the first half of a register, which in the memory case
    1965 // * means a 32-bit memory access for MMX and 128-bit aligned 64-bit or 128-bit
    1966 // * 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 //    else
    1995 //    {
    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 
    20212103/*  Opcode VEX.0F 0x60 - invalid */
    20222104
    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 */
     2107FNIEMOP_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
    20302115
    20312116/*  Opcode VEX.F3.0F 0x60 - invalid */
     
    20342119/*  Opcode VEX.0F 0x61 - invalid */
    20352120
     2121
    20362122/** 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 //}
     2123FNIEMOP_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
    20432131
    20442132/*  Opcode VEX.F3.0F 0x61 - invalid */
     
    20482136
    20492137/** 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 //}
     2138FNIEMOP_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
    20562146
    20572147/*  Opcode VEX.F3.0F 0x62 - invalid */
     
    21722262
    21732263/** 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 //}
     2264FNIEMOP_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
    21802273/*  Opcode VEX.F3.0F 0x68 - invalid */
    21812274
     
    21832276/*  Opcode VEX.0F 0x69 - invalid */
    21842277
     2278
    21852279/** 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 //}
     2280FNIEMOP_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
    21932289/*  Opcode VEX.F3.0F 0x69 - invalid */
    21942290
     
    21962292/*  Opcode VEX.0F 0x6a - invalid */
    21972293
     2294
    21982295/** 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 //}
     2296FNIEMOP_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
    22052305/*  Opcode VEX.F3.0F 0x6a - invalid */
    22062306
     
    22142314/*  Opcode VEX.0F 0x6c - invalid */
    22152315
     2316
    22162317/** 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 //}
     2318FNIEMOP_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
    22232326
    22242327/*  Opcode VEX.F3.0F 0x6c - invalid */
     
    22282331/*  Opcode VEX.0F 0x6d - invalid */
    22292332
     2333
    22302334/** 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 //}
     2335FNIEMOP_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
    22372343
    22382344/*  Opcode VEX.F3.0F 0x6d - invalid */
Note: See TracChangeset for help on using the changeset viewer.

© 2024 Oracle Support Privacy / Do Not Sell My Info Terms of Use Trademark Policy Automated Access Etiquette