VirtualBox

Changeset 96020 in vbox


Ignore:
Timestamp:
Aug 4, 2022 8:54:09 AM (3 years ago)
Author:
vboxsync
svn:sync-xref-src-repo-rev:
152815
Message:

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

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

Legend:

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

    r96010 r96020  
    36313631IEMIMPL_MEDIA_F2 psubusw, 1
    36323632IEMIMPL_MEDIA_F2 pmullw,  1
     3633IEMIMPL_MEDIA_F2 pmulld,  0
    36333634IEMIMPL_MEDIA_F2 pmulhw,  1
    36343635IEMIMPL_MEDIA_F2 pmaddwd, 1
     
    41714172IEMIMPL_MEDIA_OPT_F3 vpackuswb
    41724173IEMIMPL_MEDIA_OPT_F3 vpackusdw
     4174IEMIMPL_MEDIA_OPT_F3 vpmullw
     4175IEMIMPL_MEDIA_OPT_F3 vpmulld
    41734176
    41744177
  • trunk/src/VBox/VMM/VMMAll/IEMAllAImplC.cpp

    r96010 r96020  
    86758675
    86768676/*
    8677  * PMULLW / VPMULLW
     8677 * PMULLW / VPMULLW / PMULLD / VPMULLD
    86788678 */
    86798679#ifdef IEM_WITHOUT_ASSEMBLY
     
    87088708
    87098709#endif
     8710
     8711IEM_DECL_IMPL_DEF(void, iemAImpl_pmulld_u128_fallback,(PCX86FXSTATE pFpuState, PRTUINT128U puDst, PCRTUINT128U puSrc))
     8712{
     8713    RTUINT128U uSrc1 = *puDst;
     8714
     8715    puDst->ai32[0] = uSrc1.ai32[0] * puSrc->ai32[0];
     8716    puDst->ai32[1] = uSrc1.ai32[1] * puSrc->ai32[1];
     8717    puDst->ai32[2] = uSrc1.ai32[2] * puSrc->ai32[2];
     8718    puDst->ai32[3] = uSrc1.ai32[3] * puSrc->ai32[3];
     8719    RT_NOREF(pFpuState);
     8720}
     8721
     8722
     8723IEM_DECL_IMPL_DEF(void, iemAImpl_vpmullw_u128_fallback,(PRTUINT128U puDst, PCRTUINT128U puSrc1, PCRTUINT128U puSrc2))
     8724{
     8725    puDst->ai16[0] = puSrc1->ai16[0] * puSrc2->ai16[0];
     8726    puDst->ai16[1] = puSrc1->ai16[1] * puSrc2->ai16[1];
     8727    puDst->ai16[2] = puSrc1->ai16[2] * puSrc2->ai16[2];
     8728    puDst->ai16[3] = puSrc1->ai16[3] * puSrc2->ai16[3];
     8729    puDst->ai16[4] = puSrc1->ai16[4] * puSrc2->ai16[4];
     8730    puDst->ai16[5] = puSrc1->ai16[5] * puSrc2->ai16[5];
     8731    puDst->ai16[6] = puSrc1->ai16[6] * puSrc2->ai16[6];
     8732    puDst->ai16[7] = puSrc1->ai16[7] * puSrc2->ai16[7];
     8733}
     8734
     8735
     8736IEM_DECL_IMPL_DEF(void, iemAImpl_vpmullw_u256_fallback,(PRTUINT256U puDst, PCRTUINT256U puSrc1, PCRTUINT256U puSrc2))
     8737{
     8738    puDst->ai16[ 0] = puSrc1->ai16[ 0] * puSrc2->ai16[ 0];
     8739    puDst->ai16[ 1] = puSrc1->ai16[ 1] * puSrc2->ai16[ 1];
     8740    puDst->ai16[ 2] = puSrc1->ai16[ 2] * puSrc2->ai16[ 2];
     8741    puDst->ai16[ 3] = puSrc1->ai16[ 3] * puSrc2->ai16[ 3];
     8742    puDst->ai16[ 4] = puSrc1->ai16[ 4] * puSrc2->ai16[ 4];
     8743    puDst->ai16[ 5] = puSrc1->ai16[ 5] * puSrc2->ai16[ 5];
     8744    puDst->ai16[ 6] = puSrc1->ai16[ 6] * puSrc2->ai16[ 6];
     8745    puDst->ai16[ 7] = puSrc1->ai16[ 7] * puSrc2->ai16[ 7];
     8746    puDst->ai16[ 8] = puSrc1->ai16[ 8] * puSrc2->ai16[ 8];
     8747    puDst->ai16[ 9] = puSrc1->ai16[ 9] * puSrc2->ai16[ 9];
     8748    puDst->ai16[10] = puSrc1->ai16[10] * puSrc2->ai16[10];
     8749    puDst->ai16[11] = puSrc1->ai16[11] * puSrc2->ai16[11];
     8750    puDst->ai16[12] = puSrc1->ai16[12] * puSrc2->ai16[12];
     8751    puDst->ai16[13] = puSrc1->ai16[13] * puSrc2->ai16[13];
     8752    puDst->ai16[14] = puSrc1->ai16[14] * puSrc2->ai16[14];
     8753    puDst->ai16[15] = puSrc1->ai16[15] * puSrc2->ai16[15];
     8754}
     8755
     8756
     8757IEM_DECL_IMPL_DEF(void, iemAImpl_vpmulld_u128_fallback,(PRTUINT128U puDst, PCRTUINT128U puSrc1, PCRTUINT128U puSrc2))
     8758{
     8759    puDst->ai32[0] = puSrc1->ai32[0] * puSrc2->ai32[0];
     8760    puDst->ai32[1] = puSrc1->ai32[1] * puSrc2->ai32[1];
     8761    puDst->ai32[2] = puSrc1->ai32[2] * puSrc2->ai32[2];
     8762    puDst->ai32[3] = puSrc1->ai32[3] * puSrc2->ai32[3];
     8763}
     8764
     8765
     8766IEM_DECL_IMPL_DEF(void, iemAImpl_vpmulld_u256_fallback,(PRTUINT256U puDst, PCRTUINT256U puSrc1, PCRTUINT256U puSrc2))
     8767{
     8768    puDst->ai32[0] = puSrc1->ai32[0] * puSrc2->ai32[0];
     8769    puDst->ai32[1] = puSrc1->ai32[1] * puSrc2->ai32[1];
     8770    puDst->ai32[2] = puSrc1->ai32[2] * puSrc2->ai32[2];
     8771    puDst->ai32[3] = puSrc1->ai32[3] * puSrc2->ai32[3];
     8772    puDst->ai32[4] = puSrc1->ai32[4] * puSrc2->ai32[4];
     8773    puDst->ai32[5] = puSrc1->ai32[5] * puSrc2->ai32[5];
     8774    puDst->ai32[6] = puSrc1->ai32[6] * puSrc2->ai32[6];
     8775    puDst->ai32[7] = puSrc1->ai32[7] * puSrc2->ai32[7];
     8776}
    87108777
    87118778
  • trunk/src/VBox/VMM/VMMAll/IEMAllInstructionsThree0f38.cpp.h

    r96010 r96020  
    613613
    614614/** Opcode 0x66 0x0f 0x38 0x40. */
    615 FNIEMOP_STUB(iemOp_pmulld_Vx_Wx);
     615FNIEMOP_DEF(iemOp_pmulld_Vx_Wx)
     616{
     617    IEMOP_MNEMONIC2(RM, PMULLD, pmulld, Vx, Wx, DISOPTYPE_HARMLESS | DISOPTYPE_SSE, IEMOPHINT_IGNORES_OP_SIZES);
     618    return FNIEMOP_CALL_1(iemOpCommonSse41_FullFull_To_Full,
     619                          IEM_SELECT_HOST_OR_FALLBACK(fSse41, iemAImpl_pmulld_u128, iemAImpl_pmulld_u128_fallback));
     620}
     621
     622
    616623/** Opcode 0x66 0x0f 0x38 0x41. */
    617624FNIEMOP_STUB(iemOp_phminposuw_Vdq_Wdq);
  • trunk/src/VBox/VMM/VMMAll/IEMAllInstructionsVexMap1.cpp.h

    r96010 r96020  
    39033903
    39043904/*  Opcode VEX.0F 0xd5 - invalid */
     3905
     3906
    39053907/** Opcode VEX.66.0F 0xd5 - vpmullw Vx, Hx, Wx */
    3906 FNIEMOP_STUB(iemOp_vpmullw_Vx_Hx_Wx);
     3908FNIEMOP_DEF(iemOp_vpmullw_Vx_Hx_Wx)
     3909{
     3910    IEMOP_MNEMONIC3(VEX_RVM, VPMULLW, vpmullw, Vx, Hx, Wx, DISOPTYPE_HARMLESS, 0);
     3911    IEMOPMEDIAOPTF3_INIT_VARS(vpmullw);
     3912    return FNIEMOP_CALL_1(iemOpCommonAvxAvx2_Vx_Hx_Wx_Opt, IEM_SELECT_HOST_OR_FALLBACK(fAvx2, &s_Host, &s_Fallback));
     3913}
     3914
     3915
    39073916/*  Opcode VEX.F3.0F 0xd5 - invalid */
    39083917/*  Opcode VEX.F2.0F 0xd5 - invalid */
  • trunk/src/VBox/VMM/VMMAll/IEMAllInstructionsVexMap2.cpp.h

    r96010 r96020  
    454454
    455455/** Opcode VEX.66.0F38 0x40. */
    456 FNIEMOP_STUB(iemOp_vpmulld_Vx_Hx_Wx);
     456FNIEMOP_DEF(iemOp_vpmulld_Vx_Hx_Wx)
     457{
     458    IEMOP_MNEMONIC3(VEX_RVM, VPMULLD, vpmulld, Vx, Hx, Wx, DISOPTYPE_HARMLESS, 0);
     459    IEMOPMEDIAOPTF3_INIT_VARS(vpmulld);
     460    return FNIEMOP_CALL_1(iemOpCommonAvxAvx2_Vx_Hx_Wx_Opt, IEM_SELECT_HOST_OR_FALLBACK(fAvx2, &s_Host, &s_Fallback));
     461}
     462
     463
    457464/** Opcode VEX.66.0F38 0x41. */
    458465FNIEMOP_STUB(iemOp_vphminposuw_Vdq_Wdq);
  • trunk/src/VBox/VMM/include/IEMInternal.h

    r96010 r96020  
    17991799FNIEMAIMPLMEDIAF2U128    iemAImpl_psubd_u128;
    18001800FNIEMAIMPLMEDIAF2U128    iemAImpl_psubq_u128;
    1801 FNIEMAIMPLMEDIAF2U128    iemAImpl_pmullw_u128, iemAImpl_pmulhw_u128;
     1801FNIEMAIMPLMEDIAF2U128    iemAImpl_pmullw_u128, iemAImpl_pmullw_u128_fallback;
     1802FNIEMAIMPLMEDIAF2U128    iemAImpl_pmulhw_u128;
     1803FNIEMAIMPLMEDIAF2U128    iemAImpl_pmulld_u128, iemAImpl_pmulld_u128_fallback;
    18021804FNIEMAIMPLMEDIAF2U128    iemAImpl_pmaddwd_u128;
    18031805FNIEMAIMPLMEDIAF2U128    iemAImpl_pminub_u128;
     
    18561858FNIEMAIMPLMEDIAOPTF3U128 iemAImpl_vpackuswb_u128,  iemAImpl_vpackuswb_u128_fallback;
    18571859FNIEMAIMPLMEDIAOPTF3U128 iemAImpl_vpackusdw_u128,  iemAImpl_vpackusdw_u128_fallback;
     1860FNIEMAIMPLMEDIAOPTF3U128 iemAImpl_vpmullw_u128,    iemAImpl_vpmullw_u128_fallback;
     1861FNIEMAIMPLMEDIAOPTF3U128 iemAImpl_vpmulld_u128,    iemAImpl_vpmulld_u128_fallback;
    18581862
    18591863FNIEMAIMPLMEDIAF3U256    iemAImpl_vpshufb_u256,    iemAImpl_vpshufb_u256_fallback;
     
    18941898FNIEMAIMPLMEDIAOPTF3U256 iemAImpl_vpackuswb_u256,  iemAImpl_vpackuswb_u256_fallback;
    18951899FNIEMAIMPLMEDIAOPTF3U256 iemAImpl_vpackusdw_u256,  iemAImpl_vpackusdw_u256_fallback;
     1900FNIEMAIMPLMEDIAOPTF3U256 iemAImpl_vpmullw_u256,    iemAImpl_vpmullw_u256_fallback;
     1901FNIEMAIMPLMEDIAOPTF3U256 iemAImpl_vpmulld_u256,    iemAImpl_vpmulld_u256_fallback;
    18961902/** @} */
    18971903
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