VirtualBox

Changeset 66810 in vbox for trunk/src/VBox/VMM/VMMAll


Ignore:
Timestamp:
May 5, 2017 2:36:10 PM (8 years ago)
Author:
vboxsync
svn:sync-xref-src-repo-rev:
115231
Message:

IEM: Implemented movq2dq Vdq,Nq (f3 0f d6)

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

Legend:

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

    r66785 r66810  
    1113811138#define IEM_MC_CLEAR_FSW_EX()   do { (pVCpu)->iem.s.CTX_SUFF(pCtx)->CTX_SUFF(pXState)->x87.FSW &= X86_FSW_C_MASK | X86_FSW_TOP_MASK; } while (0)
    1113911139
     11140/** Switches the FPU state to MMX mode (FSW.TOS=0, FTW=0) if necessary. */
     11141#define IEM_MC_FPU_TO_MMX_MODE() do { \
     11142        IEM_GET_CTX(pVCpu)->CTX_SUFF(pXState)->x87.FSW &= ~X86_FSW_TOP_MASK; \
     11143        IEM_GET_CTX(pVCpu)->CTX_SUFF(pXState)->x87.FTW  = 0xff; \
     11144    } while (0)
    1114011145
    1114111146#define IEM_MC_FETCH_MREG_U64(a_u64Value, a_iMReg) \
  • trunk/src/VBox/VMM/VMMAll/IEMAllInstructions.cpp.h

    r66479 r66810  
    549549
    550550
     551/** Invalid with RM byte where intel decodes any additional address encoding
     552 *  bytes. */
     553FNIEMOPRM_DEF(iemOp_InvalidWithRMNeedDecode)
     554{
     555    IEMOP_MNEMONIC(InvalidWithRMNeedDecode, "InvalidWithRMNeedDecode");
     556    if (pVCpu->iem.s.enmCpuVendor == CPUMCPUVENDOR_INTEL)
     557    {
     558#ifndef TST_IEM_CHECK_MC
     559        if ((bRm & X86_MODRM_MOD_MASK) != (3 << X86_MODRM_MOD_SHIFT))
     560        {
     561            RTGCPTR      GCPtrEff;
     562            VBOXSTRICTRC rcStrict = iemOpHlpCalcRmEffAddr(pVCpu, bRm, 0, &GCPtrEff);
     563            if (rcStrict != VINF_SUCCESS)
     564                return rcStrict;
     565        }
     566#endif
     567    }
     568    IEMOP_HLP_DONE_DECODING();
     569    return IEMOP_RAISE_INVALID_OPCODE();
     570}
     571
     572
    551573/** Invalid with RM byte where both AMD and Intel decodes any additional
    552574 *  address encoding bytes. */
  • trunk/src/VBox/VMM/VMMAll/IEMAllInstructionsPython.py

    r66808 r66810  
    227227    'Uq':   ( 'IDX_UseModRM',       'rm',     '%Uq',  'Uq',      ),
    228228    'UqHi': ( 'IDX_UseModRM',       'rm',     '%Uq',  'UqHi',    ),
     229    'Nq':   ( 'IDX_UseModRM',       'rm',     '%Qq',  'Nq',      ),
    229230
    230231    # ModR/M.rm - memory only.
     
    235236    'Mq':   ( 'IDX_UseModRM',       'rm',     '%Mq',  'Mq',      ),
    236237    'MqWO': ( 'IDX_UseModRM',       'rm',     '%Mq',  'Mq',      ),
    237     'MRO':  ( 'IDX_UseModRM',       'rm',     '%M',   'M',      ),
    238     'MRW':  ( 'IDX_UseModRM',       'rm',     '%M',   'M',      ),
     238    'MRO':  ( 'IDX_UseModRM',       'rm',     '%M',   'M',       ),
     239    'MRW':  ( 'IDX_UseModRM',       'rm',     '%M',   'M',       ),
    239240
    240241    # ModR/M.reg
  • trunk/src/VBox/VMM/VMMAll/IEMAllInstructionsTwoByte0f.cpp.h

    r66808 r66810  
    43224322 * @optest      op1=1 op2=2 -> op1=2
    43234323 * @optest      op1=0 op2=-42 -> op1=-42
    4324  * @oponly
    43254324 */
    43264325FNIEMOP_DEF(iemOp_movq_Vq_Wq)
     
    83868385
    83878386
    8388 /** Opcode 0xf3 0x0f 0xd6 - movq2dq Vdq, Nq */
    8389 FNIEMOP_STUB(iemOp_movq2dq_Vdq_Nq);
     8387/**
     8388 * @opcode      0xd6
     8389 * @opcodesub   11 mr/reg
     8390 * @oppfx       f3
     8391 * @opcpuid     sse2
     8392 * @opgroup     og_sse2_simdint_datamove
     8393 * @optest      op1=1 op2=2   -> op1=2   ftw=0xff
     8394 * @optest      op1=0 op2=-42 -> op1=-42 ftw=0xff
     8395 */
     8396FNIEMOP_DEF(iemOp_movq2dq_Vdq_Nq)
     8397{
     8398    uint8_t bRm; IEM_OPCODE_GET_NEXT_U8(&bRm);
     8399    if ((bRm & X86_MODRM_MOD_MASK) == (3 << X86_MODRM_MOD_SHIFT))
     8400    {
     8401        /*
     8402         * Register, register.
     8403         */
     8404        IEMOP_MNEMONIC2(RM_REG, MOVQ2DQ, movq2dq, VqZxReg, Nq, DISOPTYPE_HARMLESS, IEMOPHINT_IGNORES_OP_SIZE);
     8405        IEMOP_HLP_DONE_DECODING_NO_LOCK_PREFIX();
     8406        IEM_MC_BEGIN(0, 2);
     8407        IEM_MC_LOCAL(uint64_t,                  uSrc);
     8408
     8409        IEM_MC_MAYBE_RAISE_SSE2_RELATED_XCPT();
     8410        IEM_MC_ACTUALIZE_FPU_STATE_FOR_CHANGE();
     8411
     8412        IEM_MC_FETCH_MREG_U64(uSrc, (bRm & X86_MODRM_RM_MASK) | pVCpu->iem.s.uRexB);
     8413        IEM_MC_STORE_XREG_U64_ZX_U128(((bRm >> X86_MODRM_REG_SHIFT) & X86_MODRM_REG_SMASK) | pVCpu->iem.s.uRexReg, uSrc);
     8414        IEM_MC_FPU_TO_MMX_MODE();
     8415
     8416        IEM_MC_ADVANCE_RIP();
     8417        IEM_MC_END();
     8418        return VINF_SUCCESS;
     8419    }
     8420
     8421    /**
     8422     * @opdone
     8423     * @opmnemonic  udf30fd6mem
     8424     * @opcode      0xd6
     8425     * @opcodesub   !11 mr/reg
     8426     * @oppfx       f3
     8427     * @opunused    intel-modrm
     8428     * @opcpuid     sse
     8429     * @optest      ->
     8430     */
     8431    return FNIEMOP_CALL_1(iemOp_InvalidWithRMNeedDecode, bRm);
     8432}
     8433
    83908434/** Opcode 0xf2 0x0f 0xd6 - movdq2q Pq, Uq */
    83918435FNIEMOP_STUB(iemOp_movdq2q_Pq_Uq);
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