VirtualBox

Changeset 96046 in vbox


Ignore:
Timestamp:
Aug 5, 2022 9:47:28 AM (3 years ago)
Author:
vboxsync
svn:sync-xref-src-repo-rev:
152845
Message:

VMM/IEM: Implement [v]phadd{w,d} instructions, bugref:9898

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

Legend:

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

    r96034 r96046  
    36523652IEMIMPL_MEDIA_F2 psignw,  1
    36533653IEMIMPL_MEDIA_F2 psignd,  1
     3654IEMIMPL_MEDIA_F2 phaddw,  1
     3655IEMIMPL_MEDIA_F2 phaddd,  1
     3656
    36543657
    36553658;;
     
    41904193IEMIMPL_MEDIA_OPT_F3 vpsignw
    41914194IEMIMPL_MEDIA_OPT_F3 vpsignd
     4195IEMIMPL_MEDIA_OPT_F3 vphaddw
     4196IEMIMPL_MEDIA_OPT_F3 vphaddd
    41924197
    41934198
  • trunk/src/VBox/VMM/VMMAll/IEMAllAImplC.cpp

    r96036 r96046  
    1241012410
    1241112411/*
     12412 * PHADDW / VPHADDW / PHADDD / VPHADDD
     12413 */
     12414IEM_DECL_IMPL_DEF(void, iemAImpl_phaddw_u64_fallback,(PCX86FXSTATE pFpuState, uint64_t *puDst, uint64_t const *puSrc))
     12415{
     12416    RTUINT64U uSrc1 = { *puDst };
     12417    RTUINT64U uSrc2 = { *puSrc };
     12418    RTUINT64U uDst = { 0 }; /* Shut up MSVC. */
     12419
     12420    uDst.ai16[0] = uSrc1.ai16[0] + uSrc1.ai16[1];
     12421    uDst.ai16[1] = uSrc1.ai16[2] + uSrc1.ai16[3];
     12422    uDst.ai16[2] = uSrc2.ai16[0] + uSrc2.ai16[1];
     12423    uDst.ai16[3] = uSrc2.ai16[2] + uSrc2.ai16[3];
     12424    *puDst = uDst.u;
     12425    RT_NOREF(pFpuState);
     12426}
     12427
     12428
     12429IEM_DECL_IMPL_DEF(void, iemAImpl_phaddw_u128_fallback,(PCX86FXSTATE pFpuState, PRTUINT128U puDst, PCRTUINT128U puSrc))
     12430{
     12431    RTUINT128U uSrc1 = *puDst;
     12432
     12433    puDst->ai16[0] = uSrc1.ai16[0] + uSrc1.ai16[1];
     12434    puDst->ai16[1] = uSrc1.ai16[2] + uSrc1.ai16[3];
     12435    puDst->ai16[2] = uSrc1.ai16[4] + uSrc1.ai16[5];
     12436    puDst->ai16[3] = uSrc1.ai16[6] + uSrc1.ai16[7];
     12437
     12438    puDst->ai16[4] = puSrc->ai16[0] + puSrc->ai16[1];
     12439    puDst->ai16[5] = puSrc->ai16[2] + puSrc->ai16[3];
     12440    puDst->ai16[6] = puSrc->ai16[4] + puSrc->ai16[5];
     12441    puDst->ai16[7] = puSrc->ai16[6] + puSrc->ai16[7];
     12442    RT_NOREF(pFpuState);
     12443}
     12444
     12445
     12446IEM_DECL_IMPL_DEF(void, iemAImpl_phaddd_u64_fallback,(PCX86FXSTATE pFpuState, uint64_t *puDst, uint64_t const *puSrc))
     12447{
     12448    RTUINT64U uSrc1 = { *puDst };
     12449    RTUINT64U uSrc2 = { *puSrc };
     12450    RTUINT64U uDst = { 0 }; /* Shut up MSVC. */
     12451
     12452    uDst.ai32[0] = uSrc1.ai32[0] + uSrc1.ai32[1];
     12453    uDst.ai32[1] = uSrc2.ai32[0] + uSrc2.ai32[1];
     12454    *puDst = uDst.u;
     12455    RT_NOREF(pFpuState);
     12456}
     12457
     12458
     12459IEM_DECL_IMPL_DEF(void, iemAImpl_phaddd_u128_fallback,(PCX86FXSTATE pFpuState, PRTUINT128U puDst, PCRTUINT128U puSrc))
     12460{
     12461    RTUINT128U uSrc1 = *puDst;
     12462
     12463    puDst->ai32[0] = uSrc1.ai32[0] + uSrc1.ai32[1];
     12464    puDst->ai32[1] = uSrc1.ai32[2] + uSrc1.ai32[3];
     12465
     12466    puDst->ai32[2] = puSrc->ai32[0] + puSrc->ai32[1];
     12467    puDst->ai32[3] = puSrc->ai32[2] + puSrc->ai32[3];
     12468    RT_NOREF(pFpuState);
     12469}
     12470
     12471
     12472IEM_DECL_IMPL_DEF(void, iemAImpl_vphaddw_u128_fallback,(PRTUINT128U puDst, PCRTUINT128U puSrc1, PCRTUINT128U puSrc2))
     12473{
     12474    RTUINT128U uDst = { 0 }; /* Shut up MSVC. */ /* puDst can be the same as one of the source operands. */
     12475
     12476    uDst.ai16[0] = puSrc1->ai16[0] + puSrc1->ai16[1];
     12477    uDst.ai16[1] = puSrc1->ai16[2] + puSrc1->ai16[3];
     12478    uDst.ai16[2] = puSrc1->ai16[4] + puSrc1->ai16[5];
     12479    uDst.ai16[3] = puSrc1->ai16[6] + puSrc1->ai16[7];
     12480
     12481    uDst.ai16[4] = puSrc2->ai16[0] + puSrc2->ai16[1];
     12482    uDst.ai16[5] = puSrc2->ai16[2] + puSrc2->ai16[3];
     12483    uDst.ai16[6] = puSrc2->ai16[4] + puSrc2->ai16[5];
     12484    uDst.ai16[7] = puSrc2->ai16[6] + puSrc2->ai16[7];
     12485
     12486    puDst->au64[0] = uDst.au64[0];
     12487    puDst->au64[1] = uDst.au64[1];
     12488}
     12489
     12490
     12491IEM_DECL_IMPL_DEF(void, iemAImpl_vphaddw_u256_fallback,(PRTUINT256U puDst, PCRTUINT256U puSrc1, PCRTUINT256U puSrc2))
     12492{
     12493    RTUINT256U uDst = { 0 }; /* Shut up MSVC. */ /* puDst can be the same as one of the source operands. */
     12494
     12495    uDst.ai16[ 0] = puSrc1->ai16[ 0] + puSrc1->ai16[ 1];
     12496    uDst.ai16[ 1] = puSrc1->ai16[ 2] + puSrc1->ai16[ 3];
     12497    uDst.ai16[ 2] = puSrc1->ai16[ 4] + puSrc1->ai16[ 5];
     12498    uDst.ai16[ 3] = puSrc1->ai16[ 6] + puSrc1->ai16[ 7];
     12499    uDst.ai16[ 4] = puSrc2->ai16[ 0] + puSrc2->ai16[ 1];
     12500    uDst.ai16[ 5] = puSrc2->ai16[ 2] + puSrc2->ai16[ 3];
     12501    uDst.ai16[ 6] = puSrc2->ai16[ 4] + puSrc2->ai16[ 5];
     12502    uDst.ai16[ 7] = puSrc2->ai16[ 6] + puSrc2->ai16[ 7];
     12503
     12504    uDst.ai16[ 8] = puSrc1->ai16[ 8] + puSrc1->ai16[ 9];
     12505    uDst.ai16[ 9] = puSrc1->ai16[10] + puSrc1->ai16[11];
     12506    uDst.ai16[10] = puSrc1->ai16[12] + puSrc1->ai16[13];
     12507    uDst.ai16[11] = puSrc1->ai16[14] + puSrc1->ai16[15];
     12508    uDst.ai16[12] = puSrc2->ai16[ 8] + puSrc2->ai16[ 9];
     12509    uDst.ai16[13] = puSrc2->ai16[10] + puSrc2->ai16[11];
     12510    uDst.ai16[14] = puSrc2->ai16[12] + puSrc2->ai16[13];
     12511    uDst.ai16[15] = puSrc2->ai16[14] + puSrc2->ai16[15];
     12512
     12513    puDst->au64[0] = uDst.au64[0];
     12514    puDst->au64[1] = uDst.au64[1];
     12515    puDst->au64[2] = uDst.au64[2];
     12516    puDst->au64[3] = uDst.au64[3];
     12517}
     12518
     12519
     12520IEM_DECL_IMPL_DEF(void, iemAImpl_vphaddd_u128_fallback,(PRTUINT128U puDst, PCRTUINT128U puSrc1, PCRTUINT128U puSrc2))
     12521{
     12522    RTUINT128U uDst = { 0 }; /* Shut up MSVC. */ /* puDst can be the same as one of the source operands. */
     12523
     12524    uDst.ai32[0] = puSrc1->ai32[0] + puSrc1->ai32[1];
     12525    uDst.ai32[1] = puSrc1->ai32[2] + puSrc1->ai32[3];
     12526
     12527    uDst.ai32[2] = puSrc2->ai32[0] + puSrc2->ai32[1];
     12528    uDst.ai32[3] = puSrc2->ai32[2] + puSrc2->ai32[3];
     12529
     12530    puDst->au64[0] = uDst.au64[0];
     12531    puDst->au64[1] = uDst.au64[1];
     12532}
     12533
     12534
     12535IEM_DECL_IMPL_DEF(void, iemAImpl_vphaddd_u256_fallback,(PRTUINT256U puDst, PCRTUINT256U puSrc1, PCRTUINT256U puSrc2))
     12536{
     12537    RTUINT256U uDst = { 0 }; /* Shut up MSVC. */ /* puDst can be the same as one of the source operands. */
     12538
     12539    uDst.ai32[0] = puSrc1->ai32[ 0] + puSrc1->ai32[ 1];
     12540    uDst.ai32[1] = puSrc1->ai32[ 2] + puSrc1->ai32[ 3];
     12541    uDst.ai32[2] = puSrc2->ai32[ 0] + puSrc2->ai32[ 1];
     12542    uDst.ai32[3] = puSrc2->ai32[ 2] + puSrc2->ai32[ 3];
     12543
     12544    uDst.ai32[4] = puSrc1->ai32[ 4] + puSrc1->ai32[ 5];
     12545    uDst.ai32[5] = puSrc1->ai32[ 6] + puSrc1->ai32[ 7];
     12546    uDst.ai32[6] = puSrc2->ai32[ 4] + puSrc2->ai32[ 5];
     12547    uDst.ai32[7] = puSrc2->ai32[ 6] + puSrc2->ai32[ 7];
     12548
     12549    puDst->au64[0] = uDst.au64[0];
     12550    puDst->au64[1] = uDst.au64[1];
     12551    puDst->au64[2] = uDst.au64[2];
     12552    puDst->au64[3] = uDst.au64[3];
     12553}
     12554
     12555
     12556/*
    1241212557 * CRC32 (SEE 4.2).
    1241312558 */
  • trunk/src/VBox/VMM/VMMAll/IEMAllInstructionsThree0f38.cpp.h

    r96034 r96046  
    278278
    279279/*  Opcode      0x0f 0x38 0x01. */
    280 FNIEMOP_STUB(iemOp_phaddw_Pq_Qq);
     280FNIEMOP_DEF(iemOp_phaddw_Pq_Qq)
     281{
     282    IEMOP_MNEMONIC2(RM, PHADDW, phaddw, Pq, Qq, DISOPTYPE_HARMLESS, IEMOPHINT_IGNORES_OP_SIZES);
     283    return FNIEMOP_CALL_2(iemOpCommonMmx_FullFull_To_Full_Ex,
     284                          IEM_SELECT_HOST_OR_FALLBACK(fSsse3, iemAImpl_phaddw_u64,&iemAImpl_phaddw_u64_fallback),
     285                          IEM_GET_GUEST_CPU_FEATURES(pVCpu)->fSsse3);
     286}
     287
     288
    281289/** Opcode 0x66 0x0f 0x38 0x01. */
    282 FNIEMOP_STUB(iemOp_phaddw_Vx_Wx);
     290FNIEMOP_DEF(iemOp_phaddw_Vx_Wx)
     291{
     292    IEMOP_MNEMONIC2(RM, PHADDW, phaddw, Vx, Wx, DISOPTYPE_HARMLESS, IEMOPHINT_IGNORES_OP_SIZES);
     293    return FNIEMOP_CALL_1(iemOpCommonSsse3_FullFull_To_Full,
     294                          IEM_SELECT_HOST_OR_FALLBACK(fSsse3, iemAImpl_phaddw_u128, iemAImpl_phaddw_u128_fallback));
     295
     296}
     297
     298
    283299/** Opcode      0x0f 0x38 0x02. */
    284 FNIEMOP_STUB(iemOp_phaddd_Pq_Qq);
     300FNIEMOP_DEF(iemOp_phaddd_Pq_Qq)
     301{
     302    IEMOP_MNEMONIC2(RM, PHADDD, phaddd, Pq, Qq, DISOPTYPE_HARMLESS, IEMOPHINT_IGNORES_OP_SIZES);
     303    return FNIEMOP_CALL_2(iemOpCommonMmx_FullFull_To_Full_Ex,
     304                          IEM_SELECT_HOST_OR_FALLBACK(fSsse3, iemAImpl_phaddd_u64,&iemAImpl_phaddd_u64_fallback),
     305                          IEM_GET_GUEST_CPU_FEATURES(pVCpu)->fSsse3);
     306}
     307
     308
    285309/** Opcode 0x66 0x0f 0x38 0x02. */
    286 FNIEMOP_STUB(iemOp_phaddd_Vx_Wx);
     310FNIEMOP_DEF(iemOp_phaddd_Vx_Wx)
     311{
     312    IEMOP_MNEMONIC2(RM, PHADDD, phaddd, Vx, Wx, DISOPTYPE_HARMLESS, IEMOPHINT_IGNORES_OP_SIZES);
     313    return FNIEMOP_CALL_1(iemOpCommonSsse3_FullFull_To_Full,
     314                          IEM_SELECT_HOST_OR_FALLBACK(fSsse3, iemAImpl_phaddd_u128, iemAImpl_phaddd_u128_fallback));
     315
     316}
     317
     318
    287319/** Opcode      0x0f 0x38 0x03. */
    288320FNIEMOP_STUB(iemOp_phaddsw_Pq_Qq);
  • trunk/src/VBox/VMM/VMMAll/IEMAllInstructionsVexMap2.cpp.h

    r96034 r96046  
    3737
    3838/*  Opcode VEX.0F38 0x01 - invalid. */
     39
     40
    3941/** Opcode VEX.66.0F38 0x01. */
    40 FNIEMOP_STUB(iemOp_vphaddw_Vx_Hx_Wx);
     42FNIEMOP_DEF(iemOp_vphaddw_Vx_Hx_Wx)
     43{
     44    IEMOP_MNEMONIC3(VEX_RVM, VPHADDW, vphaddw, Vx, Hx, Wx, DISOPTYPE_HARMLESS, 0);
     45    IEMOPMEDIAOPTF3_INIT_VARS(vphaddw);
     46    return FNIEMOP_CALL_1(iemOpCommonAvxAvx2_Vx_Hx_Wx_Opt, IEM_SELECT_HOST_OR_FALLBACK(fAvx2, &s_Host, &s_Fallback));
     47}
     48
     49
    4150/*  Opcode VEX.0F38 0x02 - invalid. */
     51
     52
    4253/** Opcode VEX.66.0F38 0x02. */
    43 FNIEMOP_STUB(iemOp_vphaddd_Vx_Hx_Wx);
     54FNIEMOP_DEF(iemOp_vphaddd_Vx_Hx_Wx)
     55{
     56    IEMOP_MNEMONIC3(VEX_RVM, VPHADDD, vphaddd, Vx, Hx, Wx, DISOPTYPE_HARMLESS, 0);
     57    IEMOPMEDIAOPTF3_INIT_VARS(vphaddd);
     58    return FNIEMOP_CALL_1(iemOpCommonAvxAvx2_Vx_Hx_Wx_Opt, IEM_SELECT_HOST_OR_FALLBACK(fAvx2, &s_Host, &s_Fallback));
     59}
     60
     61
    4462/*  Opcode VEX.0F38 0x03 - invalid. */
    4563/** Opcode VEX.66.0F38 0x03. */
  • trunk/src/VBox/VMM/include/IEMInternal.h

    r96034 r96046  
    17871787FNIEMAIMPLMEDIAF2U64     iemAImpl_psignw_u64, iemAImpl_psignw_u64_fallback;
    17881788FNIEMAIMPLMEDIAF2U64     iemAImpl_psignd_u64, iemAImpl_psignd_u64_fallback;
     1789FNIEMAIMPLMEDIAF2U64     iemAImpl_phaddw_u64, iemAImpl_phaddw_u64_fallback;
     1790FNIEMAIMPLMEDIAF2U64     iemAImpl_phaddd_u64, iemAImpl_phaddd_u64_fallback;
    17891791FNIEMAIMPLMEDIAOPTF2U64  iemAImpl_psllw_u64, iemAImpl_psrlw_u64, iemAImpl_psraw_u64;
    17901792FNIEMAIMPLMEDIAOPTF2U64  iemAImpl_pslld_u64, iemAImpl_psrld_u64, iemAImpl_psrad_u64;
     
    18311833FNIEMAIMPLMEDIAF2U128    iemAImpl_psignw_u128, iemAImpl_psignw_u128_fallback;
    18321834FNIEMAIMPLMEDIAF2U128    iemAImpl_psignd_u128, iemAImpl_psignd_u128_fallback;
     1835FNIEMAIMPLMEDIAF2U128    iemAImpl_phaddw_u128, iemAImpl_phaddw_u128_fallback;
     1836FNIEMAIMPLMEDIAF2U128    iemAImpl_phaddd_u128, iemAImpl_phaddd_u128_fallback;
    18331837FNIEMAIMPLMEDIAOPTF2U128 iemAImpl_packsswb_u128, iemAImpl_packuswb_u128;
    18341838FNIEMAIMPLMEDIAOPTF2U128 iemAImpl_packssdw_u128, iemAImpl_packusdw_u128;
     
    18851889FNIEMAIMPLMEDIAOPTF3U128 iemAImpl_vpsignw_u128,    iemAImpl_vpsignw_u128_fallback;
    18861890FNIEMAIMPLMEDIAOPTF3U128 iemAImpl_vpsignd_u128,    iemAImpl_vpsignd_u128_fallback;
     1891FNIEMAIMPLMEDIAOPTF3U128 iemAImpl_vphaddw_u128,    iemAImpl_vphaddw_u128_fallback;
     1892FNIEMAIMPLMEDIAOPTF3U128 iemAImpl_vphaddd_u128,    iemAImpl_vphaddd_u128_fallback;
    18871893
    18881894FNIEMAIMPLMEDIAOPTF2U128 iemAImpl_vpabsb_u128,     iemAImpl_vpabsb_u128_fallback;
     
    19361942FNIEMAIMPLMEDIAOPTF3U256 iemAImpl_vpsignw_u256,    iemAImpl_vpsignw_u256_fallback;
    19371943FNIEMAIMPLMEDIAOPTF3U256 iemAImpl_vpsignd_u256,    iemAImpl_vpsignd_u256_fallback;
     1944FNIEMAIMPLMEDIAOPTF3U256 iemAImpl_vphaddw_u256,    iemAImpl_vphaddw_u256_fallback;
     1945FNIEMAIMPLMEDIAOPTF3U256 iemAImpl_vphaddd_u256,    iemAImpl_vphaddd_u256_fallback;
    19381946
    19391947FNIEMAIMPLMEDIAOPTF2U256 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