VirtualBox

Changeset 96087 in vbox


Ignore:
Timestamp:
Aug 6, 2022 7:41:19 PM (3 years ago)
Author:
vboxsync
svn:sync-xref-src-repo-rev:
152886
Message:

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

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

Legend:

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

    r96064 r96087  
    36593659IEMIMPL_MEDIA_F2 phsubsw, 1
    36603660IEMIMPL_MEDIA_F2 pmaddubsw, 1
     3661IEMIMPL_MEDIA_F2 pmulhrsw,  1
    36613662
    36623663
     
    42054206IEMIMPL_MEDIA_OPT_F3 vphsubsw
    42064207IEMIMPL_MEDIA_OPT_F3 vpmaddubsw
     4208IEMIMPL_MEDIA_OPT_F3 vpmulhrsw
    42074209
    42084210
  • trunk/src/VBox/VMM/VMMAll/IEMAllAImplC.cpp

    r96064 r96087  
    1294612946
    1294712947/*
     12948 * PMULHRSW / VPMULHRSW
     12949 */
     12950#define DO_PMULHRSW(a_Src1, a_Src2) \
     12951    (uint16_t)(((((int32_t)(a_Src1) * (a_Src2)) >> 14 ) + 1) >> 1)
     12952
     12953IEM_DECL_IMPL_DEF(void, iemAImpl_pmulhrsw_u64_fallback,(PCX86FXSTATE pFpuState, uint64_t *puDst, uint64_t const *puSrc))
     12954{
     12955    RTUINT64U uSrc1 = { *puDst };
     12956    RTUINT64U uSrc2 = { *puSrc };
     12957    RTUINT64U uDst;
     12958
     12959    uDst.au16[0] = DO_PMULHRSW(uSrc1.ai16[0], uSrc2.ai16[0]);
     12960    uDst.au16[1] = DO_PMULHRSW(uSrc1.ai16[1], uSrc2.ai16[1]);
     12961    uDst.au16[2] = DO_PMULHRSW(uSrc1.ai16[2], uSrc2.ai16[2]);
     12962    uDst.au16[3] = DO_PMULHRSW(uSrc1.ai16[3], uSrc2.ai16[3]);
     12963    *puDst = uDst.u;
     12964    RT_NOREF(pFpuState);
     12965}
     12966
     12967
     12968IEM_DECL_IMPL_DEF(void, iemAImpl_pmulhrsw_u128_fallback,(PCX86FXSTATE pFpuState, PRTUINT128U puDst, PCRTUINT128U puSrc))
     12969{
     12970    RTUINT128U uSrc1 = *puDst;
     12971
     12972    puDst->ai16[0] = DO_PMULHRSW(uSrc1.ai16[0], puSrc->ai16[0]);
     12973    puDst->ai16[1] = DO_PMULHRSW(uSrc1.ai16[1], puSrc->ai16[1]);
     12974    puDst->ai16[2] = DO_PMULHRSW(uSrc1.ai16[2], puSrc->ai16[2]);
     12975    puDst->ai16[3] = DO_PMULHRSW(uSrc1.ai16[3], puSrc->ai16[3]);
     12976    puDst->ai16[4] = DO_PMULHRSW(uSrc1.ai16[4], puSrc->ai16[4]);
     12977    puDst->ai16[5] = DO_PMULHRSW(uSrc1.ai16[5], puSrc->ai16[5]);
     12978    puDst->ai16[6] = DO_PMULHRSW(uSrc1.ai16[6], puSrc->ai16[6]);
     12979    puDst->ai16[7] = DO_PMULHRSW(uSrc1.ai16[7], puSrc->ai16[7]);
     12980    RT_NOREF(pFpuState);
     12981}
     12982
     12983
     12984IEM_DECL_IMPL_DEF(void, iemAImpl_vpmulhrsw_u128_fallback,(PRTUINT128U puDst, PCRTUINT128U puSrc1, PCRTUINT128U puSrc2))
     12985{
     12986    RTUINT128U uDst; /* puDst can be the same as one of the source operands. */
     12987
     12988    uDst.ai16[0] = DO_PMULHRSW(puSrc1->ai16[0], puSrc2->ai16[0]);
     12989    uDst.ai16[1] = DO_PMULHRSW(puSrc1->ai16[1], puSrc2->ai16[1]);
     12990    uDst.ai16[2] = DO_PMULHRSW(puSrc1->ai16[2], puSrc2->ai16[2]);
     12991    uDst.ai16[3] = DO_PMULHRSW(puSrc1->ai16[3], puSrc2->ai16[3]);
     12992    uDst.ai16[4] = DO_PMULHRSW(puSrc1->ai16[4], puSrc2->ai16[4]);
     12993    uDst.ai16[5] = DO_PMULHRSW(puSrc1->ai16[5], puSrc2->ai16[5]);
     12994    uDst.ai16[6] = DO_PMULHRSW(puSrc1->ai16[6], puSrc2->ai16[6]);
     12995    uDst.ai16[7] = DO_PMULHRSW(puSrc1->ai16[7], puSrc2->ai16[7]);
     12996
     12997    puDst->au64[0] = uDst.au64[0];
     12998    puDst->au64[1] = uDst.au64[1];
     12999}
     13000
     13001
     13002IEM_DECL_IMPL_DEF(void, iemAImpl_vpmulhrsw_u256_fallback,(PRTUINT256U puDst, PCRTUINT256U puSrc1, PCRTUINT256U puSrc2))
     13003{
     13004    RTUINT256U uDst; /* puDst can be the same as one of the source operands. */
     13005
     13006    uDst.ai16[ 0] = DO_PMULHRSW(puSrc1->ai16[ 0], puSrc2->ai16[ 0]);
     13007    uDst.ai16[ 1] = DO_PMULHRSW(puSrc1->ai16[ 1], puSrc2->ai16[ 1]);
     13008    uDst.ai16[ 2] = DO_PMULHRSW(puSrc1->ai16[ 2], puSrc2->ai16[ 2]);
     13009    uDst.ai16[ 3] = DO_PMULHRSW(puSrc1->ai16[ 3], puSrc2->ai16[ 3]);
     13010    uDst.ai16[ 4] = DO_PMULHRSW(puSrc1->ai16[ 4], puSrc2->ai16[ 4]);
     13011    uDst.ai16[ 5] = DO_PMULHRSW(puSrc1->ai16[ 5], puSrc2->ai16[ 5]);
     13012    uDst.ai16[ 6] = DO_PMULHRSW(puSrc1->ai16[ 6], puSrc2->ai16[ 6]);
     13013    uDst.ai16[ 7] = DO_PMULHRSW(puSrc1->ai16[ 7], puSrc2->ai16[ 7]);
     13014    uDst.ai16[ 8] = DO_PMULHRSW(puSrc1->ai16[ 8], puSrc2->ai16[ 8]);
     13015    uDst.ai16[ 9] = DO_PMULHRSW(puSrc1->ai16[ 9], puSrc2->ai16[ 9]);
     13016    uDst.ai16[10] = DO_PMULHRSW(puSrc1->ai16[10], puSrc2->ai16[10]);
     13017    uDst.ai16[11] = DO_PMULHRSW(puSrc1->ai16[11], puSrc2->ai16[11]);
     13018    uDst.ai16[12] = DO_PMULHRSW(puSrc1->ai16[12], puSrc2->ai16[12]);
     13019    uDst.ai16[13] = DO_PMULHRSW(puSrc1->ai16[13], puSrc2->ai16[13]);
     13020    uDst.ai16[14] = DO_PMULHRSW(puSrc1->ai16[14], puSrc2->ai16[14]);
     13021    uDst.ai16[15] = DO_PMULHRSW(puSrc1->ai16[15], puSrc2->ai16[15]);
     13022
     13023    puDst->au64[0] = uDst.au64[0];
     13024    puDst->au64[1] = uDst.au64[1];
     13025    puDst->au64[2] = uDst.au64[2];
     13026    puDst->au64[3] = uDst.au64[3];
     13027}
     13028
     13029
     13030/*
    1294813031 * CRC32 (SEE 4.2).
    1294913032 */
  • trunk/src/VBox/VMM/VMMAll/IEMAllInstructionsThree0f38.cpp.h

    r96064 r96087  
    479479
    480480/** Opcode      0x0f 0x38 0x0b. */
    481 FNIEMOP_STUB(iemOp_pmulhrsw_Pq_Qq);
     481FNIEMOP_DEF(iemOp_pmulhrsw_Pq_Qq)
     482{
     483    IEMOP_MNEMONIC2(RM, PMULHRSW, pmulhrsw, Pq, Qq, DISOPTYPE_HARMLESS, IEMOPHINT_IGNORES_OP_SIZES);
     484    return FNIEMOP_CALL_2(iemOpCommonMmx_FullFull_To_Full_Ex,
     485                          IEM_SELECT_HOST_OR_FALLBACK(fSsse3, iemAImpl_pmulhrsw_u64, &iemAImpl_pmulhrsw_u64_fallback),
     486                          IEM_GET_GUEST_CPU_FEATURES(pVCpu)->fSsse3);
     487}
     488
     489
    482490/** Opcode 0x66 0x0f 0x38 0x0b. */
    483 FNIEMOP_STUB(iemOp_pmulhrsw_Vx_Wx);
     491FNIEMOP_DEF(iemOp_pmulhrsw_Vx_Wx)
     492{
     493    IEMOP_MNEMONIC2(RM, PMULHRSW, pmulhrsw, Vx, Wx, DISOPTYPE_HARMLESS, IEMOPHINT_IGNORES_OP_SIZES);
     494    return FNIEMOP_CALL_1(iemOpCommonSsse3_FullFull_To_Full,
     495                          IEM_SELECT_HOST_OR_FALLBACK(fSsse3, iemAImpl_pmulhrsw_u128, iemAImpl_pmulhrsw_u128_fallback));
     496
     497}
     498
     499
    484500/*  Opcode      0x0f 0x38 0x0c - invalid. */
    485501/*  Opcode 0x66 0x0f 0x38 0x0c - invalid (vex only). */
  • trunk/src/VBox/VMM/VMMAll/IEMAllInstructionsVexMap2.cpp.h

    r96064 r96087  
    157157
    158158/*  Opcode VEX.0F38 0x0b - invalid. */
     159
     160
    159161/** Opcode VEX.66.0F38 0x0b. */
    160 FNIEMOP_STUB(iemOp_vpmulhrsw_Vx_Hx_Wx);
     162FNIEMOP_DEF(iemOp_vpmulhrsw_Vx_Hx_Wx)
     163{
     164    IEMOP_MNEMONIC3(VEX_RVM, VPMULHRSW, vpmulhrsw, Vx, Hx, Wx, DISOPTYPE_HARMLESS, 0);
     165    IEMOPMEDIAOPTF3_INIT_VARS(vpmulhrsw);
     166    return FNIEMOP_CALL_1(iemOpCommonAvxAvx2_Vx_Hx_Wx_Opt, IEM_SELECT_HOST_OR_FALLBACK(fAvx2, &s_Host, &s_Fallback));
     167}
     168
     169
    161170/*  Opcode VEX.0F38 0x0c - invalid. */
    162171/**  Opcode VEX.66.0F38 0x0c. */
  • trunk/src/VBox/VMM/include/IEMInternal.h

    r96064 r96087  
    17941794FNIEMAIMPLMEDIAF2U64     iemAImpl_phsubsw_u64, iemAImpl_phsubsw_u64_fallback;
    17951795FNIEMAIMPLMEDIAF2U64     iemAImpl_pmaddubsw_u64, iemAImpl_pmaddubsw_u64_fallback;
     1796FNIEMAIMPLMEDIAF2U64     iemAImpl_pmulhrsw_u64, iemAImpl_pmulhrsw_u64_fallback;
    17961797FNIEMAIMPLMEDIAOPTF2U64  iemAImpl_psllw_u64, iemAImpl_psrlw_u64, iemAImpl_psraw_u64;
    17971798FNIEMAIMPLMEDIAOPTF2U64  iemAImpl_pslld_u64, iemAImpl_psrld_u64, iemAImpl_psrad_u64;
     
    18451846FNIEMAIMPLMEDIAF2U128    iemAImpl_phsubsw_u128, iemAImpl_phsubsw_u128_fallback;
    18461847FNIEMAIMPLMEDIAF2U128    iemAImpl_pmaddubsw_u128, iemAImpl_pmaddubsw_u128_fallback;
     1848FNIEMAIMPLMEDIAF2U128    iemAImpl_pmulhrsw_u128, iemAImpl_pmulhrsw_u128_fallback;
    18471849FNIEMAIMPLMEDIAOPTF2U128 iemAImpl_packsswb_u128, iemAImpl_packuswb_u128;
    18481850FNIEMAIMPLMEDIAOPTF2U128 iemAImpl_packssdw_u128, iemAImpl_packusdw_u128;
     
    19061908FNIEMAIMPLMEDIAOPTF3U128 iemAImpl_vphsubsw_u128,   iemAImpl_vphsubsw_u128_fallback;
    19071909FNIEMAIMPLMEDIAOPTF3U128 iemAImpl_vpmaddubsw_u128, iemAImpl_vpmaddubsw_u128_fallback;
     1910FNIEMAIMPLMEDIAOPTF3U128 iemAImpl_vpmulhrsw_u128,  iemAImpl_vpmulhrsw_u128_fallback;
    19081911
    19091912FNIEMAIMPLMEDIAOPTF2U128 iemAImpl_vpabsb_u128,     iemAImpl_vpabsb_u128_fallback;
     
    19641967FNIEMAIMPLMEDIAOPTF3U256 iemAImpl_vphsubsw_u256,   iemAImpl_vphsubsw_u256_fallback;
    19651968FNIEMAIMPLMEDIAOPTF3U256 iemAImpl_vpmaddubsw_u256, iemAImpl_vpmaddubsw_u256_fallback;
     1969FNIEMAIMPLMEDIAOPTF3U256 iemAImpl_vpmulhrsw_u256,  iemAImpl_vpmulhrsw_u256_fallback;
    19661970
    19671971FNIEMAIMPLMEDIAOPTF2U256 iemAImpl_vpabsb_u256,     iemAImpl_vpabsb_u256_fallback;
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