VirtualBox

Changeset 96860 in vbox for trunk


Ignore:
Timestamp:
Sep 26, 2022 10:44:31 AM (2 years ago)
Author:
vboxsync
svn:sync-xref-src-repo-rev:
153766
Message:

IEM: The CMP instruction must not zero out the high half of 64-bit GPRs.

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

Legend:

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

    r96407 r96860  
    10341034                IEM_MC_CALL_VOID_AIMPL_3(pImpl->pfnNormalU32, pu32Dst, u32Src, pEFlags);
    10351035
    1036                 if (pImpl != &g_iemAImpl_test)
     1036                if ((pImpl != &g_iemAImpl_test) && (pImpl != &g_iemAImpl_cmp))
    10371037                    IEM_MC_CLEAR_HIGH_GREG_U64_BY_REF(pu32Dst);
    10381038                IEM_MC_ADVANCE_RIP();
     
    12411241                IEM_MC_CALL_VOID_AIMPL_3(pImpl->pfnNormalU32, pu32Dst, u32Src, pEFlags);
    12421242
    1243                 IEM_MC_CLEAR_HIGH_GREG_U64_BY_REF(pu32Dst);
     1243                if (pImpl != &g_iemAImpl_cmp)   /* Not used with TEST. */
     1244                    IEM_MC_CLEAR_HIGH_GREG_U64_BY_REF(pu32Dst);
    12441245                IEM_MC_ADVANCE_RIP();
    12451246                IEM_MC_END();
     
    13011302                IEM_MC_CALL_VOID_AIMPL_3(pImpl->pfnNormalU32, pu32Dst, u32Src, pEFlags);
    13021303
    1303                 IEM_MC_CLEAR_HIGH_GREG_U64_BY_REF(pu32Dst);
     1304                if (pImpl != &g_iemAImpl_cmp)
     1305                    IEM_MC_CLEAR_HIGH_GREG_U64_BY_REF(pu32Dst);
    13041306                IEM_MC_ADVANCE_RIP();
    13051307                IEM_MC_END();
     
    13981400            IEM_MC_CALL_VOID_AIMPL_3(pImpl->pfnNormalU32, pu32Dst, u32Src, pEFlags);
    13991401
    1400             if (pImpl != &g_iemAImpl_test)
     1402            if ((pImpl != &g_iemAImpl_test) && (pImpl != &g_iemAImpl_cmp))
    14011403                IEM_MC_CLEAR_HIGH_GREG_U64_BY_REF(pu32Dst);
    14021404            IEM_MC_ADVANCE_RIP();
  • trunk/src/VBox/VMM/VMMAll/IEMAllInstructionsOneByte.cpp.h

    r96733 r96860  
    32853285                IEM_MC_REF_EFLAGS(pEFlags);
    32863286                IEM_MC_CALL_VOID_AIMPL_3(pImpl->pfnNormalU32, pu32Dst, u32Src, pEFlags);
    3287                 IEM_MC_CLEAR_HIGH_GREG_U64_BY_REF(pu32Dst);
     3287                if (pImpl != &g_iemAImpl_cmp)   /* Not used with TEST. */
     3288                    IEM_MC_CLEAR_HIGH_GREG_U64_BY_REF(pu32Dst);
    32883289
    32893290                IEM_MC_ADVANCE_RIP();
     
    34543455                IEM_MC_REF_EFLAGS(pEFlags);
    34553456                IEM_MC_CALL_VOID_AIMPL_3(pImpl->pfnNormalU32, pu32Dst, u32Src, pEFlags);
    3456                 IEM_MC_CLEAR_HIGH_GREG_U64_BY_REF(pu32Dst);
     3457                if (pImpl != &g_iemAImpl_cmp)   /* Not used with TEST. */
     3458                    IEM_MC_CLEAR_HIGH_GREG_U64_BY_REF(pu32Dst);
    34573459
    34583460                IEM_MC_ADVANCE_RIP();
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