VirtualBox

Ignore:
Timestamp:
Apr 4, 2024 8:54:42 AM (8 months ago)
Author:
vboxsync
Message:

VMM/IEM: Rework the [v][u]comis[sd] instruction emulations to work by value instead by reference and drop the IEM_MC_FETCH_MEM_XMM_U32/IEM_MC_FETCH_XMM_U64 microcode statements, enables recompilation of those instructions, bugref:10614

File:
1 edited

Legend:

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

    r104129 r104150  
    46544654        IEM_MC_LOCAL(uint32_t, fEFlags);
    46554655        IEM_MC_ARG_LOCAL_REF(uint32_t *,        pEFlags, fEFlags,   0);
    4656         IEM_MC_ARG(PCX86XMMREG,                 puSrc1,             1);
    4657         IEM_MC_ARG(PCX86XMMREG,                 puSrc2,             2);
     4656        IEM_MC_ARG(RTFLOAT32U,                  uSrc1,              1);
     4657        IEM_MC_ARG(RTFLOAT32U,                  uSrc2,              2);
    46584658        IEM_MC_MAYBE_RAISE_SSE_RELATED_XCPT();
    46594659        IEM_MC_PREPARE_SSE_USAGE();
    46604660        IEM_MC_FETCH_EFLAGS(fEFlags);
    4661         IEM_MC_REF_XREG_XMM_CONST(puSrc1,      IEM_GET_MODRM_REG(pVCpu, bRm));
    4662         IEM_MC_REF_XREG_XMM_CONST(puSrc2,      IEM_GET_MODRM_RM(pVCpu, bRm));
    4663         IEM_MC_CALL_SSE_AIMPL_3(iemAImpl_ucomiss_u128, pEFlags, puSrc1, puSrc2);
     4661        IEM_MC_FETCH_XREG_R32(uSrc1, IEM_GET_MODRM_REG(pVCpu, bRm), 0 /*a_iDWord*/);
     4662        IEM_MC_FETCH_XREG_R32(uSrc2, IEM_GET_MODRM_RM(pVCpu, bRm), 0 /*a_iDWord*/);
     4663        IEM_MC_CALL_SSE_AIMPL_3(iemAImpl_ucomiss_u128, pEFlags, uSrc1, uSrc2);
    46644664        IEM_MC_IF_MXCSR_XCPT_PENDING() {
    46654665            IEM_MC_RAISE_SSE_AVX_SIMD_FP_OR_UD_XCPT();
     
    46794679        IEM_MC_LOCAL(uint32_t, fEFlags);
    46804680        IEM_MC_ARG_LOCAL_REF(uint32_t *,        pEFlags, fEFlags,   0);
    4681         IEM_MC_ARG(PCX86XMMREG,                 puSrc1,             1);
    4682         IEM_MC_LOCAL(X86XMMREG,                 uSrc2);
    4683         IEM_MC_ARG_LOCAL_REF(PCX86XMMREG,       puSrc2, uSrc2,      2);
     4681        IEM_MC_ARG(RTFLOAT32U,                  uSrc1,              1);
     4682        IEM_MC_ARG(RTFLOAT32U,                  uSrc2,              2);
    46844683        IEM_MC_LOCAL(RTGCPTR,                   GCPtrEffSrc);
    46854684
     
    46874686        IEMOP_HLP_DONE_DECODING_NO_LOCK_PREFIX_EX(fSse);
    46884687        IEM_MC_MAYBE_RAISE_SSE_RELATED_XCPT();
    4689         IEM_MC_FETCH_MEM_XMM_U32(uSrc2, 0 /*a_DWord*/, pVCpu->iem.s.iEffSeg, GCPtrEffSrc);
     4688        IEM_MC_FETCH_MEM_R32(uSrc2, pVCpu->iem.s.iEffSeg, GCPtrEffSrc);
    46904689
    46914690        IEM_MC_PREPARE_SSE_USAGE();
    46924691        IEM_MC_FETCH_EFLAGS(fEFlags);
    4693         IEM_MC_REF_XREG_XMM_CONST(puSrc1,       IEM_GET_MODRM_REG(pVCpu, bRm));
    4694         IEM_MC_CALL_SSE_AIMPL_3(iemAImpl_ucomiss_u128, pEFlags, puSrc1, puSrc2);
     4692        IEM_MC_FETCH_XREG_R32(uSrc1, IEM_GET_MODRM_REG(pVCpu, bRm), 0 /*a_iDWord*/);
     4693        IEM_MC_CALL_SSE_AIMPL_3(iemAImpl_ucomiss_u128, pEFlags, uSrc1, uSrc2);
    46954694        IEM_MC_IF_MXCSR_XCPT_PENDING() {
    46964695            IEM_MC_RAISE_SSE_AVX_SIMD_FP_OR_UD_XCPT();
     
    47244723        IEM_MC_LOCAL(uint32_t, fEFlags);
    47254724        IEM_MC_ARG_LOCAL_REF(uint32_t *,        pEFlags, fEFlags,   0);
    4726         IEM_MC_ARG(PCX86XMMREG,                 puSrc1,             1);
    4727         IEM_MC_ARG(PCX86XMMREG,                 puSrc2,             2);
     4725        IEM_MC_ARG(RTFLOAT64U,                  uSrc1,             1);
     4726        IEM_MC_ARG(RTFLOAT64U,                  uSrc2,              2);
    47284727        IEM_MC_MAYBE_RAISE_SSE_RELATED_XCPT();
    47294728        IEM_MC_PREPARE_SSE_USAGE();
    47304729        IEM_MC_FETCH_EFLAGS(fEFlags);
    4731         IEM_MC_REF_XREG_XMM_CONST(puSrc1,      IEM_GET_MODRM_REG(pVCpu, bRm));
    4732         IEM_MC_REF_XREG_XMM_CONST(puSrc2,      IEM_GET_MODRM_RM(pVCpu, bRm));
    4733         IEM_MC_CALL_SSE_AIMPL_3(iemAImpl_ucomisd_u128, pEFlags, puSrc1, puSrc2);
     4730        IEM_MC_FETCH_XREG_R64(uSrc1, IEM_GET_MODRM_REG(pVCpu, bRm), 0 /*a_iQWord*/);
     4731        IEM_MC_FETCH_XREG_R64(uSrc2, IEM_GET_MODRM_RM(pVCpu, bRm),  0 /*a_iQWord*/);
     4732        IEM_MC_CALL_SSE_AIMPL_3(iemAImpl_ucomisd_u128, pEFlags, uSrc1, uSrc2);
    47344733        IEM_MC_IF_MXCSR_XCPT_PENDING() {
    47354734            IEM_MC_RAISE_SSE_AVX_SIMD_FP_OR_UD_XCPT();
     
    47494748        IEM_MC_LOCAL(uint32_t, fEFlags);
    47504749        IEM_MC_ARG_LOCAL_REF(uint32_t *,        pEFlags, fEFlags,   0);
    4751         IEM_MC_ARG(PCX86XMMREG,                 puSrc1,             1);
    4752         IEM_MC_LOCAL(X86XMMREG,                 uSrc2);
    4753         IEM_MC_ARG_LOCAL_REF(PCX86XMMREG,       puSrc2, uSrc2,      2);
     4750        IEM_MC_ARG(RTFLOAT64U,                  uSrc1,              1);
     4751        IEM_MC_ARG(RTFLOAT64U,                  uSrc2,              2);
    47544752        IEM_MC_LOCAL(RTGCPTR,                   GCPtrEffSrc);
    47554753
     
    47574755        IEMOP_HLP_DONE_DECODING_NO_LOCK_PREFIX_EX(fSse2);
    47584756        IEM_MC_MAYBE_RAISE_SSE_RELATED_XCPT();
    4759         IEM_MC_FETCH_MEM_XMM_U64(uSrc2, 0 /*a_QWord*/, pVCpu->iem.s.iEffSeg, GCPtrEffSrc);
     4757        IEM_MC_FETCH_MEM_R64(uSrc2, pVCpu->iem.s.iEffSeg, GCPtrEffSrc);
    47604758
    47614759        IEM_MC_PREPARE_SSE_USAGE();
    47624760        IEM_MC_FETCH_EFLAGS(fEFlags);
    4763         IEM_MC_REF_XREG_XMM_CONST(puSrc1,       IEM_GET_MODRM_REG(pVCpu, bRm));
    4764         IEM_MC_CALL_SSE_AIMPL_3(iemAImpl_ucomisd_u128, pEFlags, puSrc1, puSrc2);
     4761        IEM_MC_FETCH_XREG_R64(uSrc1, IEM_GET_MODRM_REG(pVCpu, bRm), 0 /*a_iQWord*/);
     4762        IEM_MC_CALL_SSE_AIMPL_3(iemAImpl_ucomisd_u128, pEFlags, uSrc1, uSrc2);
    47654763        IEM_MC_IF_MXCSR_XCPT_PENDING() {
    47664764            IEM_MC_RAISE_SSE_AVX_SIMD_FP_OR_UD_XCPT();
     
    47984796        IEM_MC_LOCAL(uint32_t, fEFlags);
    47994797        IEM_MC_ARG_LOCAL_REF(uint32_t *,        pEFlags, fEFlags,   0);
    4800         IEM_MC_ARG(PCX86XMMREG,                 puSrc1,             1);
    4801         IEM_MC_ARG(PCX86XMMREG,                 puSrc2,             2);
     4798        IEM_MC_ARG(RTFLOAT32U,                  uSrc1,              1);
     4799        IEM_MC_ARG(RTFLOAT32U,                  uSrc2,              2);
    48024800        IEM_MC_MAYBE_RAISE_SSE_RELATED_XCPT();
    48034801        IEM_MC_PREPARE_SSE_USAGE();
    48044802        IEM_MC_FETCH_EFLAGS(fEFlags);
    4805         IEM_MC_REF_XREG_XMM_CONST(puSrc1,      IEM_GET_MODRM_REG(pVCpu, bRm));
    4806         IEM_MC_REF_XREG_XMM_CONST(puSrc2,      IEM_GET_MODRM_RM(pVCpu, bRm));
    4807         IEM_MC_CALL_SSE_AIMPL_3(iemAImpl_comiss_u128, pEFlags, puSrc1, puSrc2);
     4803        IEM_MC_FETCH_XREG_R32(uSrc1, IEM_GET_MODRM_REG(pVCpu, bRm), 0 /*a_iDWord*/);
     4804        IEM_MC_FETCH_XREG_R32(uSrc2, IEM_GET_MODRM_RM(pVCpu, bRm),  0 /*a_iDWord*/);
     4805        IEM_MC_CALL_SSE_AIMPL_3(iemAImpl_comiss_u128, pEFlags, uSrc1, uSrc2);
    48084806        IEM_MC_IF_MXCSR_XCPT_PENDING() {
    48094807            IEM_MC_RAISE_SSE_AVX_SIMD_FP_OR_UD_XCPT();
     
    48234821        IEM_MC_LOCAL(uint32_t, fEFlags);
    48244822        IEM_MC_ARG_LOCAL_REF(uint32_t *,        pEFlags, fEFlags,   0);
    4825         IEM_MC_ARG(PCX86XMMREG,                 puSrc1,             1);
    4826         IEM_MC_LOCAL(X86XMMREG,                 uSrc2);
    4827         IEM_MC_ARG_LOCAL_REF(PCX86XMMREG,       puSrc2, uSrc2,      2);
     4823        IEM_MC_ARG(RTFLOAT32U,                  uSrc1,              1);
     4824        IEM_MC_ARG(RTFLOAT32U,                  uSrc2,              2);
    48284825        IEM_MC_LOCAL(RTGCPTR,                   GCPtrEffSrc);
    48294826
     
    48314828        IEMOP_HLP_DONE_DECODING_NO_LOCK_PREFIX_EX(fSse);
    48324829        IEM_MC_MAYBE_RAISE_SSE_RELATED_XCPT();
    4833         IEM_MC_FETCH_MEM_XMM_U32(uSrc2, 0 /*a_DWord*/, pVCpu->iem.s.iEffSeg, GCPtrEffSrc);
     4830        IEM_MC_FETCH_MEM_R32(uSrc2, pVCpu->iem.s.iEffSeg, GCPtrEffSrc);
    48344831
    48354832        IEM_MC_PREPARE_SSE_USAGE();
    48364833        IEM_MC_FETCH_EFLAGS(fEFlags);
    4837         IEM_MC_REF_XREG_XMM_CONST(puSrc1,       IEM_GET_MODRM_REG(pVCpu, bRm));
    4838         IEM_MC_CALL_SSE_AIMPL_3(iemAImpl_comiss_u128, pEFlags, puSrc1, puSrc2);
     4834        IEM_MC_FETCH_XREG_R32(uSrc1, IEM_GET_MODRM_REG(pVCpu, bRm), 0 /*a_iDWord*/);
     4835        IEM_MC_CALL_SSE_AIMPL_3(iemAImpl_comiss_u128, pEFlags, uSrc1, uSrc2);
    48394836        IEM_MC_IF_MXCSR_XCPT_PENDING() {
    48404837            IEM_MC_RAISE_SSE_AVX_SIMD_FP_OR_UD_XCPT();
     
    48684865        IEM_MC_LOCAL(uint32_t, fEFlags);
    48694866        IEM_MC_ARG_LOCAL_REF(uint32_t *,        pEFlags, fEFlags,   0);
    4870         IEM_MC_ARG(PCX86XMMREG,                 puSrc1,             1);
    4871         IEM_MC_ARG(PCX86XMMREG,                 puSrc2,             2);
     4867        IEM_MC_ARG(RTFLOAT64U,                  uSrc1,              1);
     4868        IEM_MC_ARG(RTFLOAT64U,                  uSrc2,              2);
    48724869        IEM_MC_MAYBE_RAISE_SSE_RELATED_XCPT();
    48734870        IEM_MC_PREPARE_SSE_USAGE();
    48744871        IEM_MC_FETCH_EFLAGS(fEFlags);
    4875         IEM_MC_REF_XREG_XMM_CONST(puSrc1,      IEM_GET_MODRM_REG(pVCpu, bRm));
    4876         IEM_MC_REF_XREG_XMM_CONST(puSrc2,      IEM_GET_MODRM_RM(pVCpu, bRm));
    4877         IEM_MC_CALL_SSE_AIMPL_3(iemAImpl_comisd_u128, pEFlags, puSrc1, puSrc2);
     4872        IEM_MC_FETCH_XREG_R64(uSrc1, IEM_GET_MODRM_REG(pVCpu, bRm), 0 /*a_iQWord*/);
     4873        IEM_MC_FETCH_XREG_R64(uSrc2, IEM_GET_MODRM_RM(pVCpu, bRm),  0 /*a_iQWord*/);
     4874        IEM_MC_CALL_SSE_AIMPL_3(iemAImpl_comisd_u128, pEFlags, uSrc1, uSrc2);
    48784875        IEM_MC_IF_MXCSR_XCPT_PENDING() {
    48794876            IEM_MC_RAISE_SSE_AVX_SIMD_FP_OR_UD_XCPT();
     
    48934890        IEM_MC_LOCAL(uint32_t, fEFlags);
    48944891        IEM_MC_ARG_LOCAL_REF(uint32_t *,        pEFlags, fEFlags,   0);
    4895         IEM_MC_ARG(PCX86XMMREG,                 puSrc1,             1);
    4896         IEM_MC_LOCAL(X86XMMREG,                 uSrc2);
    4897         IEM_MC_ARG_LOCAL_REF(PCX86XMMREG,       puSrc2, uSrc2,      2);
     4892        IEM_MC_ARG(RTFLOAT64U,                  uSrc1,              1);
     4893        IEM_MC_ARG(RTFLOAT64U,                  uSrc2,              2);
    48984894        IEM_MC_LOCAL(RTGCPTR,                   GCPtrEffSrc);
    48994895
     
    49014897        IEMOP_HLP_DONE_DECODING_NO_LOCK_PREFIX_EX(fSse2);
    49024898        IEM_MC_MAYBE_RAISE_SSE_RELATED_XCPT();
    4903         IEM_MC_FETCH_MEM_XMM_U64(uSrc2, 0 /*a_QWord*/, pVCpu->iem.s.iEffSeg, GCPtrEffSrc);
     4899        IEM_MC_FETCH_MEM_R64(uSrc2, pVCpu->iem.s.iEffSeg, GCPtrEffSrc);
    49044900
    49054901        IEM_MC_PREPARE_SSE_USAGE();
    49064902        IEM_MC_FETCH_EFLAGS(fEFlags);
    4907         IEM_MC_REF_XREG_XMM_CONST(puSrc1,       IEM_GET_MODRM_REG(pVCpu, bRm));
    4908         IEM_MC_CALL_SSE_AIMPL_3(iemAImpl_comisd_u128, pEFlags, puSrc1, puSrc2);
     4903        IEM_MC_FETCH_XREG_R64(uSrc1, IEM_GET_MODRM_REG(pVCpu, bRm), 0 /*a_iQWord*/);
     4904        IEM_MC_CALL_SSE_AIMPL_3(iemAImpl_comisd_u128, pEFlags, uSrc1, uSrc2);
    49094905        IEM_MC_IF_MXCSR_XCPT_PENDING() {
    49104906            IEM_MC_RAISE_SSE_AVX_SIMD_FP_OR_UD_XCPT();
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