VirtualBox

Ignore:
Timestamp:
Jul 16, 2024 10:11:56 AM (7 months ago)
Author:
vboxsync
Message:

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

File:
1 edited

Legend:

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

    r105316 r105346  
    37373737
    37383738/** Opcode VEX.66.0F 0x5a - vcvtpd2ps Vps, Wpd */
    3739 FNIEMOP_STUB(iemOp_vcvtpd2ps_Vps_Wpd);
     3739FNIEMOP_DEF(iemOp_vcvtpd2ps_Vps_Wpd)
     3740{
     3741    IEMOP_MNEMONIC2(VEX_RM, VCVTPD2PS, vcvtpd2ps, Vps, Wpd, DISOPTYPE_HARMLESS | DISOPTYPE_X86_AVX, 0);
     3742    uint8_t bRm; IEM_OPCODE_GET_NEXT_U8(&bRm);
     3743    if (IEM_IS_MODRM_REG_MODE(bRm))
     3744    {
     3745        /*
     3746         * Register, register.
     3747         */
     3748        if (pVCpu->iem.s.uVexLength)
     3749        {
     3750            IEM_MC_BEGIN(IEM_MC_F_NOT_286_OR_OLDER, 0);
     3751            IEMOP_HLP_DONE_VEX_DECODING_NO_VVVV_EX(fAvx);
     3752            IEM_MC_MAYBE_RAISE_AVX_RELATED_XCPT();
     3753            IEM_MC_PREPARE_AVX_USAGE();
     3754
     3755            IEM_MC_LOCAL(        X86YMMREG,            uSrc);
     3756            IEM_MC_FETCH_YREG_YMM(uSrc,    IEM_GET_MODRM_RM(pVCpu, bRm));
     3757            IEM_MC_ARG_LOCAL_REF(PCX86YMMREG,   puSrc, uSrc, 1);
     3758            IEM_MC_LOCAL(        X86XMMREG,            uDst);
     3759            IEM_MC_ARG_LOCAL_REF(PX86XMMREG,    puDst, uDst, 0);
     3760            IEM_MC_CALL_AVX_AIMPL_2(IEM_SELECT_HOST_OR_FALLBACK(fAvx,
     3761                                                                iemAImpl_vcvtpd2ps_u128_u256,
     3762                                                                iemAImpl_vcvtpd2ps_u128_u256_fallback),
     3763                                    puDst, puSrc);
     3764            IEM_MC_MAYBE_RAISE_SSE_AVX_SIMD_FP_OR_UD_XCPT();
     3765            IEM_MC_STORE_XREG_XMM(   IEM_GET_MODRM_REG(pVCpu, bRm), uDst);
     3766            IEM_MC_CLEAR_YREG_128_UP(IEM_GET_MODRM_REG(pVCpu, bRm));
     3767            IEM_MC_ADVANCE_RIP_AND_FINISH();
     3768            IEM_MC_END();
     3769        }
     3770        else
     3771        {
     3772            IEM_MC_BEGIN(IEM_MC_F_NOT_286_OR_OLDER, 0);
     3773            IEMOP_HLP_DONE_VEX_DECODING_NO_VVVV_EX(fAvx);
     3774            IEM_MC_MAYBE_RAISE_AVX_RELATED_XCPT();
     3775            IEM_MC_PREPARE_AVX_USAGE();
     3776
     3777            IEM_MC_ARG(          PCX86XMMREG,   puSrc,       1);
     3778            IEM_MC_REF_XREG_XMM_CONST(          puSrc,   IEM_GET_MODRM_RM(pVCpu, bRm));
     3779            IEM_MC_LOCAL(        X86XMMREG,     uDst);
     3780            IEM_MC_ARG_LOCAL_REF(PX86XMMREG,    puDst, uDst, 0);
     3781            IEM_MC_CALL_AVX_AIMPL_2(IEM_SELECT_HOST_OR_FALLBACK(fAvx,
     3782                                                                iemAImpl_vcvtpd2ps_u128_u128,
     3783                                                                iemAImpl_vcvtpd2ps_u128_u128_fallback),
     3784                                    puDst, puSrc);
     3785            IEM_MC_MAYBE_RAISE_SSE_AVX_SIMD_FP_OR_UD_XCPT();
     3786            IEM_MC_STORE_XREG_XMM(   IEM_GET_MODRM_REG(pVCpu, bRm), uDst);
     3787            IEM_MC_CLEAR_YREG_128_UP(IEM_GET_MODRM_REG(pVCpu, bRm));
     3788            IEM_MC_ADVANCE_RIP_AND_FINISH();
     3789            IEM_MC_END();
     3790        }
     3791    }
     3792    else
     3793    {
     3794        /*
     3795         * Register, memory.
     3796         */
     3797        if (pVCpu->iem.s.uVexLength)
     3798        {
     3799            IEM_MC_BEGIN(IEM_MC_F_NOT_286_OR_OLDER, 0);
     3800            IEM_MC_LOCAL(RTGCPTR,               GCPtrEffSrc);
     3801            IEM_MC_CALC_RM_EFF_ADDR(GCPtrEffSrc, bRm, 0);
     3802            IEMOP_HLP_DONE_VEX_DECODING_NO_VVVV_EX(fAvx);
     3803            IEM_MC_MAYBE_RAISE_AVX_RELATED_XCPT();
     3804            IEM_MC_PREPARE_AVX_USAGE();
     3805
     3806            IEM_MC_LOCAL(        X86YMMREG,            uSrc);
     3807            IEM_MC_ARG_LOCAL_REF(PCX86YMMREG,   puSrc, uSrc, 1);
     3808            IEM_MC_FETCH_MEM_YMM_NO_AC(uSrc, pVCpu->iem.s.iEffSeg, GCPtrEffSrc);
     3809            IEM_MC_LOCAL(        X86XMMREG,            uDst);
     3810            IEM_MC_ARG_LOCAL_REF(PX86XMMREG,    puDst, uDst, 0);
     3811            IEM_MC_CALL_AVX_AIMPL_2(IEM_SELECT_HOST_OR_FALLBACK(fAvx,
     3812                                                                iemAImpl_vcvtpd2ps_u128_u256,
     3813                                                                iemAImpl_vcvtpd2ps_u128_u256_fallback),
     3814                                    puDst, puSrc);
     3815            IEM_MC_MAYBE_RAISE_SSE_AVX_SIMD_FP_OR_UD_XCPT();
     3816            IEM_MC_STORE_XREG_XMM(   IEM_GET_MODRM_REG(pVCpu, bRm), uDst);
     3817            IEM_MC_CLEAR_YREG_128_UP(IEM_GET_MODRM_REG(pVCpu, bRm));
     3818            IEM_MC_ADVANCE_RIP_AND_FINISH();
     3819            IEM_MC_END();
     3820        }
     3821        else
     3822        {
     3823            IEM_MC_BEGIN(IEM_MC_F_NOT_286_OR_OLDER, 0);
     3824            IEM_MC_LOCAL(RTGCPTR,                   GCPtrEffSrc);
     3825            IEM_MC_CALC_RM_EFF_ADDR(GCPtrEffSrc, bRm, 0);
     3826            IEMOP_HLP_DONE_VEX_DECODING_NO_VVVV_EX(fAvx);
     3827            IEM_MC_MAYBE_RAISE_AVX_RELATED_XCPT();
     3828            IEM_MC_PREPARE_AVX_USAGE();
     3829
     3830            IEM_MC_LOCAL(X86XMMREG,             uSrc);
     3831            IEM_MC_ARG_LOCAL_REF(PCX86XMMREG,   puSrc, uSrc, 1);
     3832            IEM_MC_FETCH_MEM_XMM_NO_AC(uSrc, pVCpu->iem.s.iEffSeg, GCPtrEffSrc);
     3833            IEM_MC_LOCAL(        X86XMMREG,     uDst);
     3834            IEM_MC_ARG_LOCAL_REF(PX86XMMREG,    puDst, uDst, 0);
     3835            IEM_MC_CALL_AVX_AIMPL_2(IEM_SELECT_HOST_OR_FALLBACK(fAvx,
     3836                                                                iemAImpl_vcvtpd2ps_u128_u128,
     3837                                                                iemAImpl_vcvtpd2ps_u128_u128_fallback),
     3838                                    puDst, puSrc);
     3839            IEM_MC_MAYBE_RAISE_SSE_AVX_SIMD_FP_OR_UD_XCPT();
     3840            IEM_MC_STORE_XREG_XMM(             IEM_GET_MODRM_REG(pVCpu, bRm), uDst);
     3841            IEM_MC_CLEAR_YREG_128_UP(          IEM_GET_MODRM_REG(pVCpu, bRm));
     3842            IEM_MC_ADVANCE_RIP_AND_FINISH();
     3843            IEM_MC_END();
     3844        }
     3845    }
     3846}
     3847
     3848
    37403849/** Opcode VEX.F3.0F 0x5a - vcvtss2sd Vsd, Hx, Wss */
    37413850FNIEMOP_STUB(iemOp_vcvtss2sd_Vsd_Hx_Wss);
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