VirtualBox

Changeset 95953 in vbox


Ignore:
Timestamp:
Jul 29, 2022 4:16:57 PM (3 years ago)
Author:
vboxsync
svn:sync-xref-src-repo-rev:
152709
Message:

IEM: MMX forms of PMAXUB/PMINUB require SSE (not MMX, not SSE2).

File:
1 edited

Legend:

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

    r95952 r95953  
    133133        IEM_MC_REF_MREG_U64(pDst, IEM_GET_MODRM_REG_8(bRm));
    134134        IEM_MC_CALL_VOID_AIMPL_2(pfnU64, pDst, pSrc);
     135        IEM_MC_MODIFIED_MREG_BY_REF(pDst);
     136        IEM_MC_FPU_TO_MMX_MODE();
     137
     138        IEM_MC_ADVANCE_RIP();
     139        IEM_MC_END();
     140    }
     141    return VINF_SUCCESS;
     142}
     143
     144
     145/**
     146 * Common worker for MMX instructions on the form:
     147 *      pxxx    mm1, mm2/mem64
     148 * for instructions introduced with SSE.
     149 */
     150FNIEMOP_DEF_1(iemOpCommonMmxSse_FullFull_To_Full, PFNIEMAIMPLMEDIAF2U64, pfnU64)
     151{
     152    uint8_t bRm; IEM_OPCODE_GET_NEXT_U8(&bRm);
     153    if (IEM_IS_MODRM_REG_MODE(bRm))
     154    {
     155        /*
     156         * Register, register.
     157         */
     158        /** @todo testcase: REX.B / REX.R and MMX register indexing. Ignored? */
     159        /** @todo testcase: REX.B / REX.R and segment register indexing. Ignored? */
     160        IEMOP_HLP_DONE_DECODING_NO_LOCK_PREFIX();
     161        IEM_MC_BEGIN(2, 0);
     162        IEM_MC_ARG(uint64_t *,          pDst, 0);
     163        IEM_MC_ARG(uint64_t const *,    pSrc, 1);
     164        IEM_MC_MAYBE_RAISE_MMX_RELATED_XCPT_CHECK_SSE_OR_MMXEXT();
     165        IEM_MC_PREPARE_FPU_USAGE();
     166        IEM_MC_REF_MREG_U64(pDst, IEM_GET_MODRM_REG_8(bRm));
     167        IEM_MC_REF_MREG_U64_CONST(pSrc, IEM_GET_MODRM_RM_8(bRm));
     168        IEM_MC_CALL_MMX_AIMPL_2(pfnU64, pDst, pSrc);
     169        IEM_MC_MODIFIED_MREG_BY_REF(pDst);
     170        IEM_MC_FPU_TO_MMX_MODE();
     171        IEM_MC_ADVANCE_RIP();
     172        IEM_MC_END();
     173    }
     174    else
     175    {
     176        /*
     177         * Register, memory.
     178         */
     179        IEM_MC_BEGIN(2, 2);
     180        IEM_MC_ARG(uint64_t *,                  pDst,       0);
     181        IEM_MC_LOCAL(uint64_t,                  uSrc);
     182        IEM_MC_ARG_LOCAL_REF(uint64_t const *,  pSrc, uSrc, 1);
     183        IEM_MC_LOCAL(RTGCPTR,                   GCPtrEffSrc);
     184
     185        IEM_MC_CALC_RM_EFF_ADDR(GCPtrEffSrc, bRm, 0);
     186        IEMOP_HLP_DONE_DECODING_NO_LOCK_PREFIX();
     187        IEM_MC_MAYBE_RAISE_MMX_RELATED_XCPT_CHECK_SSE_OR_MMXEXT();
     188        IEM_MC_FETCH_MEM_U64(uSrc, pVCpu->iem.s.iEffSeg, GCPtrEffSrc);
     189
     190        IEM_MC_PREPARE_FPU_USAGE();
     191        IEM_MC_REF_MREG_U64(pDst, IEM_GET_MODRM_REG_8(bRm));
     192        IEM_MC_CALL_MMX_AIMPL_2(pfnU64, pDst, pSrc);
    135193        IEM_MC_MODIFIED_MREG_BY_REF(pDst);
    136194        IEM_MC_FPU_TO_MMX_MODE();
     
    99009958{
    99019959    IEMOP_MNEMONIC2(RM, PMINUB, pminub, Pq, Qq, DISOPTYPE_HARMLESS | DISOPTYPE_MMX, IEMOPHINT_IGNORES_OP_SIZES);
    9902     return FNIEMOP_CALL_1(iemOpCommonMmx_FullFull_To_Full, iemAImpl_pminub_u64);
     9960    return FNIEMOP_CALL_1(iemOpCommonMmxSse_FullFull_To_Full, iemAImpl_pminub_u64);
    99039961}
    99049962
     
    997510033{
    997610034    IEMOP_MNEMONIC2(RM, PMAXUB, pmaxub, Pq, Qq, DISOPTYPE_HARMLESS, IEMOPHINT_IGNORES_OP_SIZES);
    9977     return FNIEMOP_CALL_1(iemOpCommonMmx_FullFull_To_Full, iemAImpl_pmaxub_u64);
     10035    return FNIEMOP_CALL_1(iemOpCommonMmxSse_FullFull_To_Full, iemAImpl_pmaxub_u64);
    997810036}
    997910037
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