VirtualBox

Changeset 96025 in vbox


Ignore:
Timestamp:
Aug 4, 2022 9:39:20 AM (3 years ago)
Author:
vboxsync
svn:sync-xref-src-repo-rev:
152820
Message:

VMM/IEM: Implement [v]pmulhuw instructions, bugref:9898

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

Legend:

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

    r96022 r96025  
    36983698IEMIMPL_MEDIA_OPT_F2 psraw,    1
    36993699IEMIMPL_MEDIA_OPT_F2 psrad,    1
     3700IEMIMPL_MEDIA_OPT_F2 pmulhuw,  1
    37003701
    37013702
     
    41754176IEMIMPL_MEDIA_OPT_F3 vpmulld
    41764177IEMIMPL_MEDIA_OPT_F3 vpmulhw
     4178IEMIMPL_MEDIA_OPT_F3 vpmulhuw
    41774179
    41784180
  • trunk/src/VBox/VMM/VMMAll/IEMAllAImplC.cpp

    r96022 r96025  
    88478847
    88488848/*
     8849 * PMULHUW / VPMULHUW
     8850 */
     8851#ifdef IEM_WITHOUT_ASSEMBLY
     8852
     8853IEM_DECL_IMPL_DEF(void, iemAImpl_pmulhuw_u64,(uint64_t *puDst, uint64_t const *puSrc))
     8854{
     8855    RTUINT64U uSrc1 = { *puDst };
     8856    RTUINT64U uSrc2 = { *puSrc };
     8857    RTUINT64U uDst;
     8858    uDst.au16[0] = RT_HIWORD(uSrc1.au16[0] * uSrc2.au16[0]);
     8859    uDst.au16[1] = RT_HIWORD(uSrc1.au16[1] * uSrc2.au16[1]);
     8860    uDst.au16[2] = RT_HIWORD(uSrc1.au16[2] * uSrc2.au16[2]);
     8861    uDst.au16[3] = RT_HIWORD(uSrc1.au16[3] * uSrc2.au16[3]);
     8862    *puDst = uDst.u;
     8863}
     8864
     8865
     8866IEM_DECL_IMPL_DEF(void, iemAImpl_pmulhuw_u128,(PRTUINT128U puDst, PCRTUINT128U puSrc))
     8867{
     8868    RTUINT128U uSrc1 = *puDst;
     8869    puDst->au16[0] = RT_HIWORD(uSrc1.au16[0] * puSrc->au16[0]);
     8870    puDst->au16[1] = RT_HIWORD(uSrc1.au16[1] * puSrc->au16[1]);
     8871    puDst->au16[2] = RT_HIWORD(uSrc1.au16[2] * puSrc->au16[2]);
     8872    puDst->au16[3] = RT_HIWORD(uSrc1.au16[3] * puSrc->au16[3]);
     8873    puDst->au16[4] = RT_HIWORD(uSrc1.au16[4] * puSrc->au16[4]);
     8874    puDst->au16[5] = RT_HIWORD(uSrc1.au16[5] * puSrc->au16[5]);
     8875    puDst->au16[6] = RT_HIWORD(uSrc1.au16[6] * puSrc->au16[6]);
     8876    puDst->au16[7] = RT_HIWORD(uSrc1.au16[7] * puSrc->au16[7]);
     8877}
     8878
     8879#endif
     8880
     8881IEM_DECL_IMPL_DEF(void, iemAImpl_vpmulhuw_u128_fallback,(PRTUINT128U puDst, PCRTUINT128U puSrc1, PCRTUINT128U puSrc2))
     8882{
     8883    puDst->au16[0] = RT_HIWORD(puSrc1->au16[0] * puSrc2->au16[0]);
     8884    puDst->au16[1] = RT_HIWORD(puSrc1->au16[1] * puSrc2->au16[1]);
     8885    puDst->au16[2] = RT_HIWORD(puSrc1->au16[2] * puSrc2->au16[2]);
     8886    puDst->au16[3] = RT_HIWORD(puSrc1->au16[3] * puSrc2->au16[3]);
     8887    puDst->au16[4] = RT_HIWORD(puSrc1->au16[4] * puSrc2->au16[4]);
     8888    puDst->au16[5] = RT_HIWORD(puSrc1->au16[5] * puSrc2->au16[5]);
     8889    puDst->au16[6] = RT_HIWORD(puSrc1->au16[6] * puSrc2->au16[6]);
     8890    puDst->au16[7] = RT_HIWORD(puSrc1->au16[7] * puSrc2->au16[7]);
     8891}
     8892
     8893
     8894IEM_DECL_IMPL_DEF(void, iemAImpl_vpmulhuw_u256_fallback,(PRTUINT256U puDst, PCRTUINT256U puSrc1, PCRTUINT256U puSrc2))
     8895{
     8896    puDst->au16[ 0] = RT_HIWORD(puSrc1->au16[ 0] * puSrc2->au16[ 0]);
     8897    puDst->au16[ 1] = RT_HIWORD(puSrc1->au16[ 1] * puSrc2->au16[ 1]);
     8898    puDst->au16[ 2] = RT_HIWORD(puSrc1->au16[ 2] * puSrc2->au16[ 2]);
     8899    puDst->au16[ 3] = RT_HIWORD(puSrc1->au16[ 3] * puSrc2->au16[ 3]);
     8900    puDst->au16[ 4] = RT_HIWORD(puSrc1->au16[ 4] * puSrc2->au16[ 4]);
     8901    puDst->au16[ 5] = RT_HIWORD(puSrc1->au16[ 5] * puSrc2->au16[ 5]);
     8902    puDst->au16[ 6] = RT_HIWORD(puSrc1->au16[ 6] * puSrc2->au16[ 6]);
     8903    puDst->au16[ 7] = RT_HIWORD(puSrc1->au16[ 7] * puSrc2->au16[ 7]);
     8904    puDst->au16[ 8] = RT_HIWORD(puSrc1->au16[ 8] * puSrc2->au16[ 8]);
     8905    puDst->au16[ 9] = RT_HIWORD(puSrc1->au16[ 9] * puSrc2->au16[ 9]);
     8906    puDst->au16[10] = RT_HIWORD(puSrc1->au16[10] * puSrc2->au16[10]);
     8907    puDst->au16[11] = RT_HIWORD(puSrc1->au16[11] * puSrc2->au16[11]);
     8908    puDst->au16[12] = RT_HIWORD(puSrc1->au16[12] * puSrc2->au16[12]);
     8909    puDst->au16[13] = RT_HIWORD(puSrc1->au16[13] * puSrc2->au16[13]);
     8910    puDst->au16[14] = RT_HIWORD(puSrc1->au16[14] * puSrc2->au16[14]);
     8911    puDst->au16[15] = RT_HIWORD(puSrc1->au16[15] * puSrc2->au16[15]);
     8912}
     8913
     8914
     8915/*
    88498916 * PSRLW / VPSRLW
    88508917 */
  • trunk/src/VBox/VMM/VMMAll/IEMAllInstructionsTwoByte0f.cpp.h

    r96010 r96025  
    191191        IEM_MC_REF_MREG_U64(pDst, IEM_GET_MODRM_REG_8(bRm));
    192192        IEM_MC_CALL_MMX_AIMPL_2(pfnU64, pDst, pSrc);
     193        IEM_MC_MODIFIED_MREG_BY_REF(pDst);
     194        IEM_MC_FPU_TO_MMX_MODE();
     195
     196        IEM_MC_ADVANCE_RIP();
     197        IEM_MC_END();
     198    }
     199    return VINF_SUCCESS;
     200}
     201
     202
     203/**
     204 * Common worker for MMX instructions on the form:
     205 *      pxxx    mm1, mm2/mem64
     206 * for instructions introduced with SSE.
     207 *
     208 * Unlike iemOpCommonMmxSse_FullFull_To_Full, the @a pfnU64 worker function takes
     209 * no FXSAVE state, just the operands.
     210 */
     211FNIEMOP_DEF_1(iemOpCommonMmxSseOpt_FullFull_To_Full, PFNIEMAIMPLMEDIAOPTF2U64, pfnU64)
     212{
     213    uint8_t bRm; IEM_OPCODE_GET_NEXT_U8(&bRm);
     214    if (IEM_IS_MODRM_REG_MODE(bRm))
     215    {
     216        /*
     217         * Register, register.
     218         */
     219        /** @todo testcase: REX.B / REX.R and MMX register indexing. Ignored? */
     220        /** @todo testcase: REX.B / REX.R and segment register indexing. Ignored? */
     221        IEMOP_HLP_DONE_DECODING_NO_LOCK_PREFIX();
     222        IEM_MC_BEGIN(2, 0);
     223        IEM_MC_ARG(uint64_t *,          pDst, 0);
     224        IEM_MC_ARG(uint64_t const *,    pSrc, 1);
     225        IEM_MC_MAYBE_RAISE_MMX_RELATED_XCPT_CHECK_SSE_OR_MMXEXT();
     226        IEM_MC_PREPARE_FPU_USAGE();
     227        IEM_MC_REF_MREG_U64(pDst, IEM_GET_MODRM_REG_8(bRm));
     228        IEM_MC_REF_MREG_U64_CONST(pSrc, IEM_GET_MODRM_RM_8(bRm));
     229        IEM_MC_CALL_VOID_AIMPL_2(pfnU64, pDst, pSrc);
     230        IEM_MC_MODIFIED_MREG_BY_REF(pDst);
     231        IEM_MC_FPU_TO_MMX_MODE();
     232        IEM_MC_ADVANCE_RIP();
     233        IEM_MC_END();
     234    }
     235    else
     236    {
     237        /*
     238         * Register, memory.
     239         */
     240        IEM_MC_BEGIN(2, 2);
     241        IEM_MC_ARG(uint64_t *,                  pDst,       0);
     242        IEM_MC_LOCAL(uint64_t,                  uSrc);
     243        IEM_MC_ARG_LOCAL_REF(uint64_t const *,  pSrc, uSrc, 1);
     244        IEM_MC_LOCAL(RTGCPTR,                   GCPtrEffSrc);
     245
     246        IEM_MC_CALC_RM_EFF_ADDR(GCPtrEffSrc, bRm, 0);
     247        IEMOP_HLP_DONE_DECODING_NO_LOCK_PREFIX();
     248        IEM_MC_MAYBE_RAISE_MMX_RELATED_XCPT_CHECK_SSE_OR_MMXEXT();
     249        IEM_MC_FETCH_MEM_U64(uSrc, pVCpu->iem.s.iEffSeg, GCPtrEffSrc);
     250
     251        IEM_MC_PREPARE_FPU_USAGE();
     252        IEM_MC_REF_MREG_U64(pDst, IEM_GET_MODRM_REG_8(bRm));
     253        IEM_MC_CALL_VOID_AIMPL_2(pfnU64, pDst, pSrc);
    193254        IEM_MC_MODIFIED_MREG_BY_REF(pDst);
    194255        IEM_MC_FPU_TO_MMX_MODE();
     
    1011810179
    1011910180/** Opcode      0x0f 0xe4 - pmulhuw Pq, Qq */
    10120 FNIEMOP_STUB(iemOp_pmulhuw_Pq_Qq);
     10181FNIEMOP_DEF(iemOp_pmulhuw_Pq_Qq)
     10182{
     10183    IEMOP_MNEMONIC2(RM, PMULHUW, pmulhuw, Pq, Qq, DISOPTYPE_HARMLESS, IEMOPHINT_IGNORES_OP_SIZES);
     10184    return FNIEMOP_CALL_1(iemOpCommonMmxSseOpt_FullFull_To_Full, iemAImpl_pmulhuw_u64);
     10185}
     10186
     10187
    1012110188/** Opcode 0x66 0x0f 0xe4 - pmulhuw Vx, Wx */
    10122 FNIEMOP_STUB(iemOp_pmulhuw_Vx_Wx);
     10189FNIEMOP_DEF(iemOp_pmulhuw_Vx_Wx)
     10190{
     10191    IEMOP_MNEMONIC2(RM, PMULHUW, pmulhuw, Vx, Wx, DISOPTYPE_HARMLESS, IEMOPHINT_IGNORES_OP_SIZES);
     10192    return FNIEMOP_CALL_1(iemOpCommonSse2Opt_FullFull_To_Full, iemAImpl_pmulhuw_u128);
     10193}
     10194
     10195
    1012310196/*  Opcode 0xf3 0x0f 0xe4 - invalid */
    1012410197/*  Opcode 0xf2 0x0f 0xe4 - invalid */
  • trunk/src/VBox/VMM/VMMAll/IEMAllInstructionsVexMap1.cpp.h

    r96022 r96025  
    41344134
    41354135/*  Opcode VEX.0F 0xe4 - invalid */
    4136 /** Opcode VEX.66.0F 0xe4 - vpmulhuw Vx, Hx, W */
    4137 FNIEMOP_STUB(iemOp_vpmulhuw_Vx_Hx_W);
     4136
     4137
     4138/** Opcode VEX.66.0F 0xe4 - vpmulhuw Vx, Hx, Wx */
     4139FNIEMOP_DEF(iemOp_vpmulhuw_Vx_Hx_Wx)
     4140{
     4141    IEMOP_MNEMONIC3(VEX_RVM, VPMULHUW, vpmulhuw, Vx, Hx, Wx, DISOPTYPE_HARMLESS | DISOPTYPE_AVX, 0);
     4142    IEMOPMEDIAOPTF3_INIT_VARS(vpmulhuw);
     4143    return FNIEMOP_CALL_1(iemOpCommonAvxAvx2_Vx_Hx_Wx_Opt, IEM_SELECT_HOST_OR_FALLBACK(fAvx2, &s_Host, &s_Fallback));
     4144}
     4145
     4146
    41384147/*  Opcode VEX.F3.0F 0xe4 - invalid */
    41394148/*  Opcode VEX.F2.0F 0xe4 - invalid */
     
    47364745    /* 0xe2 */  iemOp_InvalidNeedRM,        iemOp_vpsrad_Vx_Hx_Wx,      iemOp_InvalidNeedRM,        iemOp_InvalidNeedRM,
    47374746    /* 0xe3 */  iemOp_InvalidNeedRM,        iemOp_vpavgw_Vx_Hx_Wx,      iemOp_InvalidNeedRM,        iemOp_InvalidNeedRM,
    4738     /* 0xe4 */  iemOp_InvalidNeedRM,        iemOp_vpmulhuw_Vx_Hx_W,     iemOp_InvalidNeedRM,        iemOp_InvalidNeedRM,
     4747    /* 0xe4 */  iemOp_InvalidNeedRM,        iemOp_vpmulhuw_Vx_Hx_Wx,    iemOp_InvalidNeedRM,        iemOp_InvalidNeedRM,
    47394748    /* 0xe5 */  iemOp_InvalidNeedRM,        iemOp_vpmulhw_Vx_Hx_Wx,     iemOp_InvalidNeedRM,        iemOp_InvalidNeedRM,
    47404749    /* 0xe6 */  iemOp_InvalidNeedRM,        iemOp_vcvttpd2dq_Vx_Wpd,    iemOp_vcvtdq2pd_Vx_Wpd,     iemOp_vcvtpd2dq_Vx_Wpd,
  • trunk/src/VBox/VMM/include/IEMInternal.h

    r96022 r96025  
    17841784FNIEMAIMPLMEDIAOPTF2U64  iemAImpl_packsswb_u64, iemAImpl_packuswb_u64;
    17851785FNIEMAIMPLMEDIAOPTF2U64  iemAImpl_packssdw_u64;
     1786FNIEMAIMPLMEDIAOPTF2U64  iemAImpl_pmulhuw_u64;
    17861787
    17871788FNIEMAIMPLMEDIAF2U128    iemAImpl_pshufb_u128, iemAImpl_pshufb_u128_fallback;
     
    18201821FNIEMAIMPLMEDIAOPTF2U128 iemAImpl_pslld_u128, iemAImpl_psrld_u128, iemAImpl_psrad_u128;
    18211822FNIEMAIMPLMEDIAOPTF2U128 iemAImpl_psllq_u128, iemAImpl_psrlq_u128;
     1823FNIEMAIMPLMEDIAOPTF2U128 iemAImpl_pmulhuw_u128;
    18221824
    18231825FNIEMAIMPLMEDIAF3U128    iemAImpl_vpshufb_u128,    iemAImpl_vpshufb_u128_fallback;
     
    18611863FNIEMAIMPLMEDIAOPTF3U128 iemAImpl_vpmulld_u128,    iemAImpl_vpmulld_u128_fallback;
    18621864FNIEMAIMPLMEDIAOPTF3U128 iemAImpl_vpmulhw_u128,    iemAImpl_vpmulhw_u128_fallback;
     1865FNIEMAIMPLMEDIAOPTF3U128 iemAImpl_vpmulhuw_u128,   iemAImpl_vpmulhuw_u128_fallback;
    18631866
    18641867FNIEMAIMPLMEDIAF3U256    iemAImpl_vpshufb_u256,    iemAImpl_vpshufb_u256_fallback;
     
    19021905FNIEMAIMPLMEDIAOPTF3U256 iemAImpl_vpmulld_u256,    iemAImpl_vpmulld_u256_fallback;
    19031906FNIEMAIMPLMEDIAOPTF3U256 iemAImpl_vpmulhw_u256,    iemAImpl_vpmulhw_u256_fallback;
     1907FNIEMAIMPLMEDIAOPTF3U256 iemAImpl_vpmulhuw_u256,   iemAImpl_vpmulhuw_u256_fallback;
    19041908/** @} */
    19051909
  • trunk/src/VBox/VMM/testcase/tstIEMCheckMc.cpp

    r96010 r96025  
    432432#define iemAImpl_pmullw_u64             NULL
    433433#define iemAImpl_pmulhw_u64             NULL
     434#define iemAImpl_pmulhuw_u64            NULL
    434435#define iemAImpl_pmaddwd_u64            NULL
    435436
    436437#define iemAImpl_pmullw_u128            NULL
    437438#define iemAImpl_pmulhw_u128            NULL
     439#define iemAImpl_pmulhuw_u128           NULL
    438440#define iemAImpl_pmaddwd_u128           NULL
    439441
Note: See TracChangeset for help on using the changeset viewer.

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