VirtualBox

Changeset 96326 in vbox


Ignore:
Timestamp:
Aug 19, 2022 8:51:02 AM (2 years ago)
Author:
vboxsync
Message:

VMM/IEM: addpd, mulpd and subpd are available wih SSE2+ only, bugref:9898

File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/src/VBox/VMM/VMMAll/IEMAllInstructionsTwoByte0f.cpp.h

    r96294 r96326  
    738738/**
    739739 * Common worker for SSE instructions on the forms:
    740  *      pxx{s,d}    xmm1, xmm2/mem128
     740 *      pxxs       xmm1, xmm2/mem128
    741741 *
    742742 * Proper alignment of the 128-bit operand is enforced.
     
    786786        IEMOP_HLP_DONE_DECODING_NO_LOCK_PREFIX();
    787787        IEM_MC_MAYBE_RAISE_SSE_RELATED_XCPT();
     788        IEM_MC_FETCH_MEM_XMM_ALIGN_SSE(uSrc2, pVCpu->iem.s.iEffSeg, GCPtrEffSrc);
     789
     790        IEM_MC_PREPARE_SSE_USAGE();
     791        IEM_MC_REF_XREG_XMM_CONST(pSrc1, IEM_GET_MODRM_REG(pVCpu, bRm));
     792        IEM_MC_CALL_SSE_AIMPL_3(pfnU128, pSseRes, pSrc1, pSrc2);
     793        IEM_MC_STORE_SSE_RESULT(SseRes, IEM_GET_MODRM_REG(pVCpu, bRm));
     794        IEM_MC_MAYBE_RAISE_SSE_AVX_SIMD_FP_OR_UD_XCPT();
     795
     796        IEM_MC_ADVANCE_RIP();
     797        IEM_MC_END();
     798    }
     799    return VINF_SUCCESS;
     800}
     801
     802
     803/**
     804 * Common worker for SSE2 instructions on the forms:
     805 *      pxxd       xmm1, xmm2/mem128
     806 *
     807 * Proper alignment of the 128-bit operand is enforced.
     808 * Exceptions type 2. SSE cpuid checks.
     809 *
     810 * @sa iemOpCommonSseFp_FullFull_To_Full
     811 */
     812FNIEMOP_DEF_1(iemOpCommonSse2Fp_FullFull_To_Full, PFNIEMAIMPLFPSSEF2U128, pfnU128)
     813{
     814    uint8_t bRm; IEM_OPCODE_GET_NEXT_U8(&bRm);
     815    if (IEM_IS_MODRM_REG_MODE(bRm))
     816    {
     817        /*
     818         * Register, register.
     819         */
     820        IEMOP_HLP_DONE_DECODING_NO_LOCK_PREFIX();
     821        IEM_MC_BEGIN(3, 1);
     822        IEM_MC_LOCAL(IEMSSERESULT,          SseRes);
     823        IEM_MC_ARG_LOCAL_REF(PIEMSSERESULT, pSseRes,        SseRes,     0);
     824        IEM_MC_ARG(PCX86XMMREG,             pSrc1,                      1);
     825        IEM_MC_ARG(PCX86XMMREG,             pSrc2,                      2);
     826        IEM_MC_MAYBE_RAISE_SSE2_RELATED_XCPT();
     827        IEM_MC_PREPARE_SSE_USAGE();
     828        IEM_MC_REF_XREG_XMM_CONST(pSrc1, IEM_GET_MODRM_REG(pVCpu, bRm));
     829        IEM_MC_REF_XREG_XMM_CONST(pSrc2, IEM_GET_MODRM_RM(pVCpu, bRm));
     830        IEM_MC_CALL_SSE_AIMPL_3(pfnU128, pSseRes, pSrc1, pSrc2);
     831        IEM_MC_STORE_SSE_RESULT(SseRes, IEM_GET_MODRM_REG(pVCpu, bRm));
     832        IEM_MC_MAYBE_RAISE_SSE_AVX_SIMD_FP_OR_UD_XCPT();
     833
     834        IEM_MC_ADVANCE_RIP();
     835        IEM_MC_END();
     836    }
     837    else
     838    {
     839        /*
     840         * Register, memory.
     841         */
     842        IEM_MC_BEGIN(3, 2);
     843        IEM_MC_LOCAL(IEMSSERESULT,          SseRes);
     844        IEM_MC_LOCAL(X86XMMREG,             uSrc2);
     845        IEM_MC_ARG_LOCAL_REF(PIEMSSERESULT, pSseRes,        SseRes,     0);
     846        IEM_MC_ARG(PCX86XMMREG,             pSrc1,                      1);
     847        IEM_MC_ARG_LOCAL_REF(PCX86XMMREG,   pSrc2, uSrc2,               2);
     848        IEM_MC_LOCAL(RTGCPTR, GCPtrEffSrc);
     849
     850        IEM_MC_CALC_RM_EFF_ADDR(GCPtrEffSrc, bRm, 0);
     851        IEMOP_HLP_DONE_DECODING_NO_LOCK_PREFIX();
     852        IEM_MC_MAYBE_RAISE_SSE2_RELATED_XCPT();
    788853        IEM_MC_FETCH_MEM_XMM_ALIGN_SSE(uSrc2, pVCpu->iem.s.iEffSeg, GCPtrEffSrc);
    789854
     
    38703935{
    38713936    IEMOP_MNEMONIC2(RM, ADDPD, addpd, Vpd, Wpd, DISOPTYPE_HARMLESS, 0);
    3872     return FNIEMOP_CALL_1(iemOpCommonSseFp_FullFull_To_Full, iemAImpl_addpd_u128);
     3937    return FNIEMOP_CALL_1(iemOpCommonSse2Fp_FullFull_To_Full, iemAImpl_addpd_u128);
    38733938}
    38743939
     
    38923957{
    38933958    IEMOP_MNEMONIC2(RM, MULPD, mulpd, Vpd, Wpd, DISOPTYPE_HARMLESS, 0);
    3894     return FNIEMOP_CALL_1(iemOpCommonSseFp_FullFull_To_Full, iemAImpl_mulpd_u128);
     3959    return FNIEMOP_CALL_1(iemOpCommonSse2Fp_FullFull_To_Full, iemAImpl_mulpd_u128);
    38953960}
    38963961
     
    39313996{
    39323997    IEMOP_MNEMONIC2(RM, SUBPD, subpd, Vpd, Wpd, DISOPTYPE_HARMLESS, 0);
    3933     return FNIEMOP_CALL_1(iemOpCommonSseFp_FullFull_To_Full, iemAImpl_subpd_u128);
     3998    return FNIEMOP_CALL_1(iemOpCommonSse2Fp_FullFull_To_Full, iemAImpl_subpd_u128);
    39343999}
    39354000
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