VirtualBox

Changeset 105219 in vbox for trunk/src/VBox/VMM/VMMAll


Ignore:
Timestamp:
Jul 9, 2024 9:01:41 AM (7 months ago)
Author:
vboxsync
Message:

VMM/IEM: Implement vaddsd instruction emulation, bugref:9898

Location:
trunk/src/VBox/VMM/VMMAll
Files:
2 edited

Legend:

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

    r105218 r105219  
    1602316023
    1602416024/**
    16025  * ADDSD
     16025 * [V]ADDSD
    1602616026 */
    1602716027#ifdef IEM_WITHOUT_ASSEMBLY
     
    1603216032}
    1603316033#endif
     16034
     16035
     16036IEM_DECL_IMPL_DEF(uint32_t, iemAImpl_vaddsd_u128_r64_fallback,(uint32_t uMxCsrIn, PX86XMMREG pResult, PCX86XMMREG puSrc1, PCRTFLOAT64U pr64Src2))
     16037{
     16038    pResult->ar64[1] = puSrc1->ar64[1];
     16039    return iemAImpl_addpd_u128_worker(&pResult->ar64[0], uMxCsrIn, &puSrc1->ar64[0], pr64Src2);
     16040}
    1603416041
    1603516042
  • trunk/src/VBox/VMM/VMMAll/IEMAllInstVexMap1.cpp.h

    r105218 r105219  
    148148
    149149/**
    150  * Common worker for scalar AVX/AVX2 instructions on the forms (addss,addsd,etc.):
    151  *     - vxxxs{s,d}    xmm0, xmm1, xmm2/mem32
     150 * Common worker for scalar AVX/AVX2 instructions on the forms (addss,subss,etc.):
     151 *     - vxxxss       xmm0, xmm1, xmm2/mem32
    152152 *
    153153 * Exceptions type 4. AVX cpuid check for 128-bit operation.
     
    203203        IEM_MC_REF_XREG_XMM_CONST(puSrc1,   IEM_GET_EFFECTIVE_VVVV(pVCpu));
    204204        IEM_MC_CALL_AVX_AIMPL_3(pfnU128, puDst, puSrc1, pr32Src2);
     205        IEM_MC_MAYBE_RAISE_SSE_AVX_SIMD_FP_OR_UD_XCPT();
     206        IEM_MC_STORE_XREG_XMM(             IEM_GET_MODRM_REG(pVCpu, bRm), uDst);
     207        IEM_MC_CLEAR_YREG_128_UP(          IEM_GET_MODRM_REG(pVCpu, bRm));
     208        IEM_MC_ADVANCE_RIP_AND_FINISH();
     209        IEM_MC_END();
     210    }
     211}
     212
     213
     214/**
     215 * Common worker for scalar AVX/AVX2 instructions on the forms (addsd,subsd,etc.):
     216 *     - vxxxsd       xmm0, xmm1, xmm2/mem64
     217 *
     218 * Exceptions type 4. AVX cpuid check for 128-bit operation.
     219 * Ignores VEX.L, from SDM:
     220 *     Software should ensure VADDSD is encoded with VEX.L=0.
     221 *     Encoding VADDSD with VEX.L=1 may encounter unpredictable behavior
     222 *     across different processor generations.
     223 */
     224FNIEMOP_DEF_1(iemOpCommonAvx_Vx_Hx_R64, PFNIEMAIMPLFPAVXF3U128R64, pfnU128)
     225{
     226    uint8_t bRm; IEM_OPCODE_GET_NEXT_U8(&bRm);
     227    if (IEM_IS_MODRM_REG_MODE(bRm))
     228    {
     229        /*
     230         * Register, register.
     231         */
     232        IEM_MC_BEGIN(IEM_MC_F_NOT_286_OR_OLDER, 0);
     233        IEMOP_HLP_DONE_VEX_DECODING_EX(fAvx);
     234        IEM_MC_MAYBE_RAISE_AVX_RELATED_XCPT();
     235        IEM_MC_PREPARE_AVX_USAGE();
     236
     237        IEM_MC_LOCAL(X86XMMREG,             uDst);
     238        IEM_MC_ARG_LOCAL_REF(PX86XMMREG,    puDst,  uDst,  0);
     239        IEM_MC_ARG(PCX86XMMREG,             puSrc1,        1);
     240        IEM_MC_REF_XREG_XMM_CONST(puSrc1,   IEM_GET_EFFECTIVE_VVVV(pVCpu));
     241        IEM_MC_ARG(PCRTFLOAT64U,            pr64Src2,      2);
     242        IEM_MC_REF_XREG_R64_CONST(pr64Src2, IEM_GET_MODRM_RM(pVCpu, bRm));
     243        IEM_MC_CALL_AVX_AIMPL_3(pfnU128, puDst, puSrc1, pr64Src2);
     244        IEM_MC_MAYBE_RAISE_SSE_AVX_SIMD_FP_OR_UD_XCPT();
     245        IEM_MC_STORE_XREG_XMM(             IEM_GET_MODRM_REG(pVCpu, bRm), uDst);
     246        IEM_MC_CLEAR_YREG_128_UP(          IEM_GET_MODRM_REG(pVCpu, bRm));
     247        IEM_MC_ADVANCE_RIP_AND_FINISH();
     248        IEM_MC_END();
     249    }
     250    else
     251    {
     252        /*
     253         * Register, memory.
     254         */
     255        IEM_MC_BEGIN(IEM_MC_F_NOT_286_OR_OLDER, 0);
     256        IEM_MC_LOCAL(RTGCPTR,                   GCPtrEffSrc);
     257        IEM_MC_CALC_RM_EFF_ADDR(GCPtrEffSrc, bRm, 0);
     258        IEMOP_HLP_DONE_VEX_DECODING_EX(fAvx);
     259        IEM_MC_MAYBE_RAISE_AVX_RELATED_XCPT();
     260        IEM_MC_PREPARE_AVX_USAGE();
     261
     262        IEM_MC_LOCAL(RTFLOAT64U,            r64Src2);
     263        IEM_MC_ARG_LOCAL_REF(PCRTFLOAT64U,  pr64Src2, r64Src2,  2);
     264        IEM_MC_FETCH_MEM_R64(r64Src2, pVCpu->iem.s.iEffSeg, GCPtrEffSrc);
     265        IEM_MC_LOCAL(X86XMMREG,             uDst);
     266        IEM_MC_ARG_LOCAL_REF(PX86XMMREG,    puDst,    uDst,     0);
     267        IEM_MC_ARG(PCX86XMMREG,             puSrc1,             1);
     268        IEM_MC_REF_XREG_XMM_CONST(puSrc1,   IEM_GET_EFFECTIVE_VVVV(pVCpu));
     269        IEM_MC_CALL_AVX_AIMPL_3(pfnU128, puDst, puSrc1, pr64Src2);
    205270        IEM_MC_MAYBE_RAISE_SSE_AVX_SIMD_FP_OR_UD_XCPT();
    206271        IEM_MC_STORE_XREG_XMM(             IEM_GET_MODRM_REG(pVCpu, bRm), uDst);
     
    29212986
    29222987/** Opcode VEX.F2.0F 0x58 - vaddsd Vsd, Hsd, Wsd */
    2923 FNIEMOP_STUB(iemOp_vaddsd_Vsd_Hsd_Wsd);
     2988FNIEMOP_DEF(iemOp_vaddsd_Vsd_Hsd_Wsd)
     2989{
     2990    IEMOP_MNEMONIC3(VEX_RVM, VADDSD, vaddsd, Vpd, Hpd, Wsd, DISOPTYPE_HARMLESS | DISOPTYPE_X86_AVX, 0);
     2991    return FNIEMOP_CALL_1(iemOpCommonAvx_Vx_Hx_R64,
     2992                          IEM_SELECT_HOST_OR_FALLBACK(fAvx, iemAImpl_vaddsd_u128_r64, iemAImpl_vaddsd_u128_r64_fallback));
     2993}
     2994
    29242995
    29252996/** Opcode VEX.0F 0x59 - vmulps Vps, Hps, Wps */
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