VirtualBox

Changeset 105235 in vbox


Ignore:
Timestamp:
Jul 9, 2024 12:30:38 PM (9 months ago)
Author:
vboxsync
svn:sync-xref-src-repo-rev:
163881
Message:

VMM/IEM: Implement vsqrtps,vsqrtpd instruction emulations, bugref:9898

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

Legend:

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

    r105234 r105235  
    1697916979
    1698016980/**
    16981  * SQRTPS
    16982  */
    16983 #ifdef IEM_WITHOUT_ASSEMBLY
     16981 * [V]SQRTPS
     16982 */
    1698416983static uint32_t iemAImpl_sqrtps_u128_worker(PRTFLOAT32U pr32Res, uint32_t fMxcsr, PCRTFLOAT32U pr32Val)
    1698516984{
     
    1700617005
    1700717006
     17007#ifdef IEM_WITHOUT_ASSEMBLY
    1700817008IEM_DECL_IMPL_DEF(uint32_t, iemAImpl_sqrtps_u128,(uint32_t uMxCsrIn, PX86XMMREG pResult, PCX86XMMREG puSrc1, PCX86XMMREG puSrc2))
    1700917009{
     
    1701817018
    1701917019
     17020IEM_DECL_IMPL_DEF(uint32_t, iemAImpl_vsqrtps_u128_fallback,(uint32_t uMxCsrIn, PX86XMMREG pResult, PCX86XMMREG puSrc))
     17021{
     17022    return   iemAImpl_sqrtps_u128_worker(&pResult->ar32[0], uMxCsrIn, &puSrc->ar32[0])
     17023           | iemAImpl_sqrtps_u128_worker(&pResult->ar32[1], uMxCsrIn, &puSrc->ar32[1])
     17024           | iemAImpl_sqrtps_u128_worker(&pResult->ar32[2], uMxCsrIn, &puSrc->ar32[2])
     17025           | iemAImpl_sqrtps_u128_worker(&pResult->ar32[3], uMxCsrIn, &puSrc->ar32[3]);
     17026}
     17027
     17028
     17029IEM_DECL_IMPL_DEF(uint32_t, iemAImpl_vsqrtps_u256_fallback,(uint32_t uMxCsrIn, PX86YMMREG pResult, PCX86YMMREG puSrc))
     17030{
     17031    return   iemAImpl_sqrtps_u128_worker(&pResult->ar32[0], uMxCsrIn, &puSrc->ar32[0])
     17032           | iemAImpl_sqrtps_u128_worker(&pResult->ar32[1], uMxCsrIn, &puSrc->ar32[1])
     17033           | iemAImpl_sqrtps_u128_worker(&pResult->ar32[2], uMxCsrIn, &puSrc->ar32[2])
     17034           | iemAImpl_sqrtps_u128_worker(&pResult->ar32[3], uMxCsrIn, &puSrc->ar32[3])
     17035           | iemAImpl_sqrtps_u128_worker(&pResult->ar32[4], uMxCsrIn, &puSrc->ar32[4])
     17036           | iemAImpl_sqrtps_u128_worker(&pResult->ar32[5], uMxCsrIn, &puSrc->ar32[5])
     17037           | iemAImpl_sqrtps_u128_worker(&pResult->ar32[6], uMxCsrIn, &puSrc->ar32[6])
     17038           | iemAImpl_sqrtps_u128_worker(&pResult->ar32[7], uMxCsrIn, &puSrc->ar32[7]);
     17039}
     17040
     17041
    1702017042/**
    1702117043 * SQRTSS
     
    1703317055
    1703417056/**
    17035  * SQRTPD
    17036  */
    17037 #ifdef IEM_WITHOUT_ASSEMBLY
     17057 * [V]SQRTPD
     17058 */
    1703817059static uint32_t iemAImpl_sqrtpd_u128_worker(PRTFLOAT64U pr64Res, uint32_t fMxcsr, PCRTFLOAT64U pr64Val)
    1703917060{
     
    1706017081
    1706117082
     17083#ifdef IEM_WITHOUT_ASSEMBLY
    1706217084IEM_DECL_IMPL_DEF(uint32_t, iemAImpl_sqrtpd_u128,(uint32_t uMxCsrIn, PX86XMMREG pResult, PCX86XMMREG puSrc1, PCX86XMMREG puSrc2))
    1706317085{
     
    1706817090}
    1706917091#endif
     17092
     17093
     17094IEM_DECL_IMPL_DEF(uint32_t, iemAImpl_vsqrtpd_u128_fallback,(uint32_t uMxCsrIn, PX86XMMREG pResult, PCX86XMMREG puSrc))
     17095{
     17096    return   iemAImpl_sqrtpd_u128_worker(&pResult->ar64[0], uMxCsrIn, &puSrc->ar64[0])
     17097           | iemAImpl_sqrtpd_u128_worker(&pResult->ar64[1], uMxCsrIn, &puSrc->ar64[1]);
     17098}
     17099
     17100
     17101IEM_DECL_IMPL_DEF(uint32_t, iemAImpl_vsqrtpd_u256_fallback,(uint32_t uMxCsrIn, PX86YMMREG pResult, PCX86YMMREG puSrc))
     17102{
     17103    return   iemAImpl_sqrtpd_u128_worker(&pResult->ar64[0], uMxCsrIn, &puSrc->ar64[0])
     17104           | iemAImpl_sqrtpd_u128_worker(&pResult->ar64[1], uMxCsrIn, &puSrc->ar64[1])
     17105           | iemAImpl_sqrtpd_u128_worker(&pResult->ar64[2], uMxCsrIn, &puSrc->ar64[2])
     17106           | iemAImpl_sqrtpd_u128_worker(&pResult->ar64[3], uMxCsrIn, &puSrc->ar64[3]);
     17107}
    1707017108
    1707117109
  • trunk/src/VBox/VMM/VMMAll/IEMAllInstVexMap1.cpp.h

    r105234 r105235  
    519519
    520520
     521/**
     522 * Common worker for AVX/AVX2 instructions on the forms:
     523 *     - vpxxx    xmm0, xmm1/mem128
     524 *     - vpxxx    ymm0, ymm1/mem256
     525 *
     526 * Exceptions type 4. AVX cpuid check for 128-bit operation, AVX2 for 256-bit.
     527 */
     528FNIEMOP_DEF_1(iemOpCommonAvxAvx2_Vx_Wx, PCIEMOPMEDIAF2, pImpl)
     529{
     530    uint8_t bRm; IEM_OPCODE_GET_NEXT_U8(&bRm);
     531    if (IEM_IS_MODRM_REG_MODE(bRm))
     532    {
     533        /*
     534         * Register, register.
     535         */
     536        if (pVCpu->iem.s.uVexLength)
     537        {
     538            IEM_MC_BEGIN(IEM_MC_F_NOT_286_OR_OLDER, 0);
     539            IEMOP_HLP_DONE_VEX_DECODING_NO_VVVV_EX(fAvx2);
     540            IEM_MC_MAYBE_RAISE_AVX_RELATED_XCPT();
     541            IEM_MC_PREPARE_AVX_USAGE();
     542
     543            IEM_MC_LOCAL(X86YMMREG,             uSrc);
     544            IEM_MC_ARG_LOCAL_REF(PCX86YMMREG,   puSrc, uSrc,  1);
     545            IEM_MC_FETCH_YREG_YMM(uSrc,    IEM_GET_MODRM_RM(pVCpu, bRm));
     546            IEM_MC_LOCAL(X86YMMREG,             uDst);
     547            IEM_MC_ARG_LOCAL_REF(PX86YMMREG,    puDst,  uDst, 0);
     548            IEM_MC_CALL_AVX_AIMPL_2(pImpl->pfnU256, puDst, puSrc);
     549            IEM_MC_MAYBE_RAISE_SSE_AVX_SIMD_FP_OR_UD_XCPT();
     550            IEM_MC_STORE_YREG_YMM_ZX_VLMAX( IEM_GET_MODRM_REG(pVCpu, bRm), uDst);
     551            IEM_MC_ADVANCE_RIP_AND_FINISH();
     552            IEM_MC_END();
     553        }
     554        else
     555        {
     556            IEM_MC_BEGIN(IEM_MC_F_NOT_286_OR_OLDER, 0);
     557            IEMOP_HLP_DONE_VEX_DECODING_NO_VVVV_EX(fAvx);
     558            IEM_MC_MAYBE_RAISE_AVX_RELATED_XCPT();
     559            IEM_MC_PREPARE_AVX_USAGE();
     560
     561            IEM_MC_LOCAL(X86XMMREG,             uDst);
     562            IEM_MC_ARG_LOCAL_REF(PX86XMMREG,    puDst,  uDst,  0);
     563            IEM_MC_ARG(PCX86XMMREG,             puSrc,         1);
     564            IEM_MC_REF_XREG_XMM_CONST(puSrc,   IEM_GET_MODRM_RM(pVCpu, bRm));
     565            IEM_MC_CALL_AVX_AIMPL_2(pImpl->pfnU128, puDst, puSrc);
     566            IEM_MC_MAYBE_RAISE_SSE_AVX_SIMD_FP_OR_UD_XCPT();
     567            IEM_MC_STORE_XREG_XMM(             IEM_GET_MODRM_REG(pVCpu, bRm), uDst);
     568            IEM_MC_CLEAR_YREG_128_UP(          IEM_GET_MODRM_REG(pVCpu, bRm));
     569            IEM_MC_ADVANCE_RIP_AND_FINISH();
     570            IEM_MC_END();
     571        }
     572    }
     573    else
     574    {
     575        /*
     576         * Register, memory.
     577         */
     578        if (pVCpu->iem.s.uVexLength)
     579        {
     580            IEM_MC_BEGIN(IEM_MC_F_NOT_286_OR_OLDER, 0);
     581            IEM_MC_LOCAL(RTGCPTR,               GCPtrEffSrc);
     582            IEM_MC_CALC_RM_EFF_ADDR(GCPtrEffSrc, bRm, 0);
     583            IEMOP_HLP_DONE_VEX_DECODING_NO_VVVV_EX(fAvx2);
     584            IEM_MC_MAYBE_RAISE_AVX_RELATED_XCPT();
     585            IEM_MC_PREPARE_AVX_USAGE();
     586
     587            IEM_MC_LOCAL(X86YMMREG,             uSrc);
     588            IEM_MC_ARG_LOCAL_REF(PCX86YMMREG,   puSrc, uSrc,  1);
     589            IEM_MC_FETCH_MEM_YMM_NO_AC(uSrc, pVCpu->iem.s.iEffSeg, GCPtrEffSrc);
     590            IEM_MC_LOCAL(X86YMMREG,             uDst);
     591            IEM_MC_ARG_LOCAL_REF(PX86YMMREG,    puDst,  uDst, 0);
     592            IEM_MC_CALL_AVX_AIMPL_2(pImpl->pfnU256, puDst, puSrc);
     593            IEM_MC_MAYBE_RAISE_SSE_AVX_SIMD_FP_OR_UD_XCPT();
     594            IEM_MC_STORE_YREG_YMM_ZX_VLMAX(    IEM_GET_MODRM_REG(pVCpu, bRm), uDst);
     595            IEM_MC_ADVANCE_RIP_AND_FINISH();
     596            IEM_MC_END();
     597        }
     598        else
     599        {
     600            IEM_MC_BEGIN(IEM_MC_F_NOT_286_OR_OLDER, 0);
     601            IEM_MC_LOCAL(RTGCPTR,                   GCPtrEffSrc);
     602            IEM_MC_CALC_RM_EFF_ADDR(GCPtrEffSrc, bRm, 0);
     603            IEMOP_HLP_DONE_VEX_DECODING_NO_VVVV_EX(fAvx);
     604            IEM_MC_MAYBE_RAISE_AVX_RELATED_XCPT();
     605            IEM_MC_PREPARE_AVX_USAGE();
     606
     607            IEM_MC_LOCAL(X86XMMREG,             uDst);
     608            IEM_MC_ARG_LOCAL_REF(PX86XMMREG,    puDst,  uDst, 0);
     609            IEM_MC_LOCAL(X86XMMREG,             uSrc);
     610            IEM_MC_ARG_LOCAL_REF(PCX86XMMREG,   puSrc, uSrc, 1);
     611            IEM_MC_FETCH_MEM_XMM_NO_AC(uSrc, pVCpu->iem.s.iEffSeg, GCPtrEffSrc);
     612            IEM_MC_CALL_AVX_AIMPL_2(pImpl->pfnU128, puDst, puSrc);
     613            IEM_MC_MAYBE_RAISE_SSE_AVX_SIMD_FP_OR_UD_XCPT();
     614            IEM_MC_STORE_XREG_XMM(             IEM_GET_MODRM_REG(pVCpu, bRm), uDst);
     615            IEM_MC_CLEAR_YREG_128_UP(          IEM_GET_MODRM_REG(pVCpu, bRm));
     616            IEM_MC_ADVANCE_RIP_AND_FINISH();
     617            IEM_MC_END();
     618        }
     619    }
     620}
     621
     622
     623
    521624/*  Opcode VEX.0F 0x00 - invalid */
    522625/*  Opcode VEX.0F 0x01 - invalid */
     
    28482951
    28492952/** Opcode VEX.0F 0x51 - vsqrtps Vps, Wps */
    2850 FNIEMOP_STUB(iemOp_vsqrtps_Vps_Wps);
     2953FNIEMOP_DEF(iemOp_vsqrtps_Vps_Wps)
     2954{
     2955    IEMOP_MNEMONIC2(VEX_RM, VSQRTPS, vsqrtps, Vps, Wps, DISOPTYPE_HARMLESS | DISOPTYPE_X86_AVX, 0);
     2956    IEMOPMEDIAF2_INIT_VARS(          vsqrtps);
     2957    return FNIEMOP_CALL_1(iemOpCommonAvxAvx2_Vx_Wx, IEM_SELECT_HOST_OR_FALLBACK(fAvx, &s_Host, &s_Fallback));
     2958}
     2959
     2960
    28512961/** Opcode VEX.66.0F 0x51 - vsqrtpd Vpd, Wpd */
    2852 FNIEMOP_STUB(iemOp_vsqrtpd_Vpd_Wpd);
     2962FNIEMOP_DEF(iemOp_vsqrtpd_Vpd_Wpd)
     2963{
     2964    IEMOP_MNEMONIC2(VEX_RM, VSQRTPD, vsqrtpd, Vpd, Wpd, DISOPTYPE_HARMLESS | DISOPTYPE_X86_AVX, 0);
     2965    IEMOPMEDIAF2_INIT_VARS(          vsqrtpd);
     2966    return FNIEMOP_CALL_1(iemOpCommonAvxAvx2_Vx_Wx, IEM_SELECT_HOST_OR_FALLBACK(fAvx, &s_Host, &s_Fallback));
     2967}
     2968
     2969
    28532970/** Opcode VEX.F3.0F 0x51 - vsqrtss Vss, Hss, Wss */
    28542971FNIEMOP_STUB(iemOp_vsqrtss_Vss_Hss_Wss);
  • trunk/src/VBox/VMM/VMMAll/IEMAllThrdPython.py

    r105183 r105235  
    779779            if sBaseType == 'PCIEMOPSHIFTDBLSIZES':     return 'PFNIEMAIMPLSHIFTDBLU'   + sMember[offBits:];
    780780            if sBaseType == 'PCIEMOPMULDIVSIZES':       return 'PFNIEMAIMPLMULDIVU'     + sMember[offBits:];
     781            if sBaseType == 'PCIEMOPMEDIAF2':           return 'PFNIEMAIMPLMEDIAF2U'    + sMember[offBits:];
    781782            if sBaseType == 'PCIEMOPMEDIAF3':           return 'PFNIEMAIMPLMEDIAF3U'    + sMember[offBits:];
    782783            if sBaseType == 'PCIEMOPMEDIAOPTF2':        return 'PFNIEMAIMPLMEDIAOPTF2U' + sMember[offBits:];
  • trunk/src/VBox/VMM/include/IEMInternal.h

    r105234 r105235  
    34343434typedef IEM_DECL_IMPL_TYPE(void, FNIEMAIMPLMEDIAF2U64,(PCX86FXSTATE pFpuState, uint64_t *puDst, uint64_t const *puSrc));
    34353435typedef FNIEMAIMPLMEDIAF2U64   *PFNIEMAIMPLMEDIAF2U64;
    3436 typedef IEM_DECL_IMPL_TYPE(void, FNIEMAIMPLMEDIAF2U128,(PCX86FXSTATE pFpuState, PRTUINT128U puDst, PCRTUINT128U puSrc));
     3436typedef IEM_DECL_IMPL_TYPE(uint32_t, FNIEMAIMPLMEDIAF2U128,(uint32_t uMxCsrIn, PX86XMMREG puDst, PCX86XMMREG puSrc));
    34373437typedef FNIEMAIMPLMEDIAF2U128  *PFNIEMAIMPLMEDIAF2U128;
     3438typedef IEM_DECL_IMPL_TYPE(uint32_t, FNIEMAIMPLMEDIAF2U256,(uint32_t uMxCsrIn, PX86YMMREG puDst, PCX86YMMREG puSrc));
     3439typedef FNIEMAIMPLMEDIAF2U256  *PFNIEMAIMPLMEDIAF2U256;
    34383440typedef IEM_DECL_IMPL_TYPE(uint32_t, FNIEMAIMPLMEDIAF3U128,(uint32_t uMxCsrIn, PX86XMMREG puDst, PCX86XMMREG puSrc1, PCX86XMMREG puSrc2));
    34393441typedef FNIEMAIMPLMEDIAF3U128  *PFNIEMAIMPLMEDIAF3U128;
     
    43014303                              RT_CONCAT3(iemAImpl_,a_InstrNm,_u128_fallback),  RT_CONCAT3(iemAImpl_,a_InstrNm,_u256_fallback))
    43024304
     4305
     4306/**
     4307 * Function table for media instruction taking one full sized media source
     4308 * registers and one full sized destination register (AVX).
     4309 */
     4310typedef struct IEMOPMEDIAF2
     4311{
     4312    PFNIEMAIMPLMEDIAF2U128 pfnU128;
     4313    PFNIEMAIMPLMEDIAF2U256 pfnU256;
     4314} IEMOPMEDIAF2;
     4315/** Pointer to a media operation function table for 2 full sized ops (AVX). */
     4316typedef IEMOPMEDIAF2 const *PCIEMOPMEDIAF2;
     4317
     4318/** @def IEMOPMEDIAF2_INIT_VARS_EX
     4319 * Declares a s_Host (x86 & amd64 only) and a s_Fallback variable with the
     4320 * given functions as initializers.  For use in AVX functions where a pair of
     4321 * functions are only used once and the function table need not be public. */
     4322#ifndef TST_IEM_CHECK_MC
     4323# if (defined(RT_ARCH_X86) || defined(RT_ARCH_AMD64)) && !defined(IEM_WITHOUT_ASSEMBLY)
     4324#  define IEMOPMEDIAF2_INIT_VARS_EX(a_pfnHostU128, a_pfnHostU256, a_pfnFallbackU128, a_pfnFallbackU256) \
     4325    static IEMOPMEDIAF2 const s_Host     = { a_pfnHostU128,     a_pfnHostU256 }; \
     4326    static IEMOPMEDIAF2 const s_Fallback = { a_pfnFallbackU128, a_pfnFallbackU256 }
     4327# else
     4328#  define IEMOPMEDIAF2_INIT_VARS_EX(a_pfnU128, a_pfnU256, a_pfnFallbackU128, a_pfnFallbackU256) \
     4329    static IEMOPMEDIAF2 const s_Fallback = { a_pfnFallbackU128, a_pfnFallbackU256 }
     4330# endif
     4331#else
     4332# define IEMOPMEDIAF2_INIT_VARS_EX(a_pfnU128, a_pfnU256, a_pfnFallbackU128, a_pfnFallbackU256) (void)0
     4333#endif
     4334/** @def IEMOPMEDIAF2_INIT_VARS
     4335 * Generate AVX function tables for the @a a_InstrNm instruction.
     4336 * @sa IEMOPMEDIAF2_INIT_VARS_EX */
     4337#define IEMOPMEDIAF2_INIT_VARS(a_InstrNm) \
     4338    IEMOPMEDIAF2_INIT_VARS_EX(RT_CONCAT3(iemAImpl_,a_InstrNm,_u128),           RT_CONCAT3(iemAImpl_,a_InstrNm,_u256),\
     4339                              RT_CONCAT3(iemAImpl_,a_InstrNm,_u128_fallback),  RT_CONCAT3(iemAImpl_,a_InstrNm,_u256_fallback))
     4340
     4341
    43034342/**
    43044343 * Function table for media instruction taking two full sized media source
     
    45714610FNIEMAIMPLMEDIAF3U128 iemAImpl_vhsubps_u128, iemAImpl_vhsubps_u128_fallback;
    45724611FNIEMAIMPLMEDIAF3U128 iemAImpl_vhsubpd_u128, iemAImpl_vhsubpd_u128_fallback;
    4573 FNIEMAIMPLFPAVXF3U128 iemAImpl_vsqrtps_u128, iemAImpl_vsqrtps_u128_fallback;
    4574 FNIEMAIMPLFPAVXF3U128 iemAImpl_vsqrtpd_u128, iemAImpl_vsqrtpd_u128_fallback;
     4612FNIEMAIMPLMEDIAF2U128 iemAImpl_vsqrtps_u128, iemAImpl_vsqrtps_u128_fallback;
     4613FNIEMAIMPLMEDIAF2U128 iemAImpl_vsqrtpd_u128, iemAImpl_vsqrtpd_u128_fallback;
    45754614FNIEMAIMPLMEDIAF3U128 iemAImpl_vaddsubps_u128, iemAImpl_vaddsubps_u128_fallback;
    45764615FNIEMAIMPLMEDIAF3U128 iemAImpl_vaddsubpd_u128, iemAImpl_vaddsubpd_u128_fallback;
     
    46134652FNIEMAIMPLFPAVXF3U256 iemAImpl_vcvtpd2ps_u256, iemAImpl_vcvtpd2ps_u256_fallback;
    46144653FNIEMAIMPLFPAVXF3U256 iemAImpl_vcvtps2pd_u256, iemAImpl_vcvtps2pd_u256_fallback;
     4654FNIEMAIMPLMEDIAF2U256 iemAImpl_vsqrtps_u256, iemAImpl_vsqrtps_u256_fallback;
     4655FNIEMAIMPLMEDIAF2U256 iemAImpl_vsqrtpd_u256, iemAImpl_vsqrtpd_u256_fallback;
    46154656/** @} */
    46164657
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