VirtualBox

Changeset 103597 in vbox


Ignore:
Timestamp:
Feb 28, 2024 3:02:00 PM (9 months ago)
Author:
vboxsync
Message:

VMM/IEM: Fix multiple issues in the pcmpXstrX instructions microcode, the high 32-bit of RCX seem to get cleared and some variants were calling he wrong helpers, bugref:9898

File:
1 edited

Legend:

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

    r103212 r103597  
    11641164             */
    11651165            IEM_MC_BEGIN(4, 3, IEM_MC_F_64BIT, 0);
    1166             IEM_MC_ARG(uint32_t *,                  pu32Ecx,             0);
     1166            IEM_MC_ARG(PRTUINT128U,                 puDst,               0);
    11671167            IEM_MC_ARG(uint32_t *,                  pEFlags,             1);
    11681168            IEM_MC_LOCAL(IEMPCMPESTRXSRC,           Src);
     
    11791179            IEM_MC_FETCH_MEM_U128_AND_XREG_U128_AND_RAX_RDX_U64(Src, IEM_GET_MODRM_REG(pVCpu, bRm),
    11801180                                                                pVCpu->iem.s.iEffSeg, GCPtrEffSrc);
    1181             IEM_MC_REF_GREG_U32(pu32Ecx, X86_GREG_xCX);
     1181            IEM_MC_REF_XREG_U128(puDst, 0 /*xmm0*/);
    11821182            IEM_MC_REF_EFLAGS(pEFlags);
    11831183            IEM_MC_CALL_VOID_AIMPL_4(IEM_SELECT_HOST_OR_FALLBACK(fSse42,
    1184                                                                  iemAImpl_pcmpestri_u128,
    1185                                                                  iemAImpl_pcmpestri_u128_fallback),
    1186                                      pu32Ecx, pEFlags, pSrc, bImmArg);
     1184                                                                 iemAImpl_pcmpestrm_u128,
     1185                                                                 iemAImpl_pcmpestrm_u128_fallback),
     1186                                     puDst, pEFlags, pSrc, bImmArg);
    11871187            IEM_MC_ADVANCE_RIP_AND_FINISH();
    11881188            IEM_MC_END();
     
    12221222             */
    12231223            IEM_MC_BEGIN(4, 3, IEM_MC_F_NOT_286_OR_OLDER, 0);
    1224             IEM_MC_ARG(uint32_t *,                  pu32Ecx,             0);
     1224            IEM_MC_ARG(PRTUINT128U,                 puDst,             0);
    12251225            IEM_MC_ARG(uint32_t *,                  pEFlags,             1);
    12261226            IEM_MC_LOCAL(IEMPCMPESTRXSRC,           Src);
     
    12371237            IEM_MC_FETCH_MEM_U128_AND_XREG_U128_AND_EAX_EDX_U32_SX_U64(Src, IEM_GET_MODRM_REG(pVCpu, bRm),
    12381238                                                                       pVCpu->iem.s.iEffSeg, GCPtrEffSrc);
    1239             IEM_MC_REF_GREG_U32(pu32Ecx, X86_GREG_xCX);
     1239            IEM_MC_REF_XREG_U128(puDst, 0 /*xmm0*/);
    12401240            IEM_MC_REF_EFLAGS(pEFlags);
    12411241            IEM_MC_CALL_VOID_AIMPL_4(IEM_SELECT_HOST_OR_FALLBACK(fSse42,
    1242                                                                  iemAImpl_pcmpestri_u128,
    1243                                                                  iemAImpl_pcmpestri_u128_fallback),
    1244                                      pu32Ecx, pEFlags, pSrc, bImmArg);
     1242                                                                 iemAImpl_pcmpestrm_u128,
     1243                                                                 iemAImpl_pcmpestrm_u128_fallback),
     1244                                     puDst, pEFlags, pSrc, bImmArg);
    12451245            IEM_MC_ADVANCE_RIP_AND_FINISH();
    12461246            IEM_MC_END();
     
    12801280            IEM_MC_FETCH_XREG_PAIR_U128_AND_RAX_RDX_U64(Src, IEM_GET_MODRM_REG(pVCpu, bRm), IEM_GET_MODRM_RM(pVCpu, bRm));
    12811281            IEM_MC_REF_GREG_U32(pu32Ecx, X86_GREG_xCX);
     1282            IEM_MC_CLEAR_HIGH_GREG_U64(X86_GREG_xCX);
    12821283            IEM_MC_REF_EFLAGS(pEFlags);
    12831284            IEM_MC_CALL_VOID_AIMPL_4(IEM_SELECT_HOST_OR_FALLBACK(fSse42,
     
    13111312                                                                pVCpu->iem.s.iEffSeg, GCPtrEffSrc);
    13121313            IEM_MC_REF_GREG_U32(pu32Ecx, X86_GREG_xCX);
     1314            IEM_MC_CLEAR_HIGH_GREG_U64(X86_GREG_xCX);
    13131315            IEM_MC_REF_EFLAGS(pEFlags);
    13141316            IEM_MC_CALL_VOID_AIMPL_4(IEM_SELECT_HOST_OR_FALLBACK(fSse42,
     
    13401342            IEM_MC_FETCH_XREG_PAIR_U128_AND_EAX_EDX_U32_SX_U64(Src, IEM_GET_MODRM_REG(pVCpu, bRm), IEM_GET_MODRM_RM(pVCpu, bRm));
    13411343            IEM_MC_REF_GREG_U32(pu32Ecx, X86_GREG_xCX);
     1344            IEM_MC_CLEAR_HIGH_GREG_U64(X86_GREG_xCX);
    13421345            IEM_MC_REF_EFLAGS(pEFlags);
    13431346            IEM_MC_CALL_VOID_AIMPL_4(IEM_SELECT_HOST_OR_FALLBACK(fSse42,
     
    13711374                                                                       pVCpu->iem.s.iEffSeg, GCPtrEffSrc);
    13721375            IEM_MC_REF_GREG_U32(pu32Ecx, X86_GREG_xCX);
     1376            IEM_MC_CLEAR_HIGH_GREG_U64(X86_GREG_xCX);
    13731377            IEM_MC_REF_EFLAGS(pEFlags);
    13741378            IEM_MC_CALL_VOID_AIMPL_4(IEM_SELECT_HOST_OR_FALLBACK(fSse42,
     
    14261430         */
    14271431        IEM_MC_BEGIN(4, 3, IEM_MC_F_NOT_286_OR_OLDER, 0);
    1428         IEM_MC_ARG(uint32_t *,                  pu32Ecx,             0);
     1432        IEM_MC_ARG(PRTUINT128U,                 puDst,               0);
    14291433        IEM_MC_ARG(uint32_t *,                  pEFlags,             1);
    14301434        IEM_MC_LOCAL(IEMPCMPISTRXSRC,           Src);
     
    14401444
    14411445        IEM_MC_FETCH_MEM_U128_AND_XREG_U128(Src, IEM_GET_MODRM_REG(pVCpu, bRm), pVCpu->iem.s.iEffSeg, GCPtrEffSrc);
    1442         IEM_MC_REF_GREG_U32(pu32Ecx, X86_GREG_xCX);
     1446        IEM_MC_REF_XREG_U128(puDst, 0 /*xmm0*/);
    14431447        IEM_MC_REF_EFLAGS(pEFlags);
    14441448        IEM_MC_CALL_VOID_AIMPL_4(IEM_SELECT_HOST_OR_FALLBACK(fSse42,
    1445                                                              iemAImpl_pcmpistri_u128,
    1446                                                              iemAImpl_pcmpistri_u128_fallback),
    1447                                  pu32Ecx, pEFlags, pSrc, bImmArg);
     1449                                                             iemAImpl_pcmpistrm_u128,
     1450                                                             iemAImpl_pcmpistrm_u128_fallback),
     1451                                 puDst, pEFlags, pSrc, bImmArg);
    14481452        IEM_MC_ADVANCE_RIP_AND_FINISH();
    14491453        IEM_MC_END();
     
    14801484        IEM_MC_FETCH_XREG_PAIR_U128(Src, IEM_GET_MODRM_REG(pVCpu, bRm), IEM_GET_MODRM_RM(pVCpu, bRm));
    14811485        IEM_MC_REF_GREG_U32(pu32Ecx, X86_GREG_xCX);
     1486        IEM_MC_CLEAR_HIGH_GREG_U64(X86_GREG_xCX);
    14821487        IEM_MC_REF_EFLAGS(pEFlags);
    14831488        IEM_MC_CALL_VOID_AIMPL_4(IEM_SELECT_HOST_OR_FALLBACK(fSse42,
     
    15101515        IEM_MC_FETCH_MEM_U128_AND_XREG_U128(Src, IEM_GET_MODRM_REG(pVCpu, bRm), pVCpu->iem.s.iEffSeg, GCPtrEffSrc);
    15111516        IEM_MC_REF_GREG_U32(pu32Ecx, X86_GREG_xCX);
     1517        IEM_MC_CLEAR_HIGH_GREG_U64(X86_GREG_xCX);
    15121518        IEM_MC_REF_EFLAGS(pEFlags);
    15131519        IEM_MC_CALL_VOID_AIMPL_4(IEM_SELECT_HOST_OR_FALLBACK(fSse42,
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