VirtualBox

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


Ignore:
Timestamp:
May 23, 2017 1:44:16 PM (8 years ago)
Author:
vboxsync
svn:sync-xref-src-repo-rev:
115627
Message:

IEM: Implemented (but not tested) vmovntdqa Vx,Mx (VEX.66.0F38 2a mod!=3).

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

Legend:

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

    r67040 r67042  
    1122011220            return iemRaiseMathFault(pVCpu); \
    1122111221    } while (0)
     11222#define IEM_MC_MAYBE_RAISE_AVX2_RELATED_XCPT() \
     11223    do { \
     11224        if (   (IEM_GET_CTX(pVCpu)->aXcr[0] & (XSAVE_C_YMM | XSAVE_C_SSE)) != (XSAVE_C_YMM | XSAVE_C_SSE) \
     11225            || !(IEM_GET_CTX(pVCpu)->cr4 & X86_CR4_OSXSAVE) \
     11226            || !IEM_GET_GUEST_CPU_FEATURES(pVCpu)->fAvx2) \
     11227            return iemRaiseUndefinedOpcode(pVCpu); \
     11228        if (IEM_GET_CTX(pVCpu)->cr0 & X86_CR0_TS) \
     11229            return iemRaiseDeviceNotAvailable(pVCpu); \
     11230    } while (0)
    1122211231#define IEM_MC_MAYBE_RAISE_AVX_RELATED_XCPT() \
    1122311232    do { \
  • trunk/src/VBox/VMM/VMMAll/IEMAllInstructionsPython.py

    r67040 r67042  
    259259    'Mps_WO':       ( 'IDX_UseModRM',       'rm',     '%Mps', 'Mps',     ),
    260260    'Mpd_WO':       ( 'IDX_UseModRM',       'rm',     '%Mpd', 'Mpd',     ),
     261    'Mx':           ( 'IDX_UseModRM',       'rm',     '%Mx',  'Mx',      ),
    261262    'Mx_WO':        ( 'IDX_UseModRM',       'rm',     '%Mx',  'Mx',      ),
    262263    'M_RO':         ( 'IDX_UseModRM',       'rm',     '%M',   'M',       ),
  • trunk/src/VBox/VMM/VMMAll/IEMAllInstructionsVexMap2.cpp.h

    r66480 r67042  
    134134/** Opcode VEX.66.0F38 0x29. */
    135135FNIEMOP_STUB(iemOp_vpcmpeqq_Vx_Hx_Wx);
     136
    136137/** Opcode VEX.66.0F38 0x2a. */
    137 FNIEMOP_STUB(iemOp_vmovntdqa_Vx_Hx_Mx);
     138/*
     139 * @ opcode      0x2a
     140 * @ opcodesub   !11 mr/reg vex.l=0
     141 * @ oppfx       0x66
     142 * @ opcpuid     avx
     143 * @ opgroup     og_avx_cachect
     144 * @ opxcpttype  1
     145 * @ optest      op1=-1 op2=2  -> op1=2
     146 * @ optest      op1=0 op2=-42 -> op1=-42
     147 */
     148FNIEMOP_DEF(iemOp_vmovntdqa_Vx_Mx)
     149{
     150    Assert(pVCpu->iem.s.uVexLength <= 1);
     151    IEMOP_MNEMONIC2(VEX_RM, VMOVNTDQA, vmovntdqa, Vx_WO, Mx, DISOPTYPE_HARMLESS, IEMOPHINT_IGNORES_OP_SIZES);
     152    uint8_t bRm; IEM_OPCODE_GET_NEXT_U8(&bRm);
     153    if ((bRm & X86_MODRM_MOD_MASK) != (3 << X86_MODRM_MOD_SHIFT))
     154    {
     155        if (pVCpu->iem.s.uVexLength == 0)
     156        {
     157            /*
     158             * 128-bit: Memory, register.
     159             */
     160            IEM_MC_BEGIN(0, 2);
     161            IEM_MC_LOCAL(RTUINT128U,                uSrc);
     162            IEM_MC_LOCAL(RTGCPTR,                   GCPtrEffSrc);
     163
     164            IEM_MC_CALC_RM_EFF_ADDR(GCPtrEffSrc, bRm, 0);
     165            IEMOP_HLP_DONE_VEX_DECODING_NO_VVVV();
     166            IEM_MC_MAYBE_RAISE_AVX_RELATED_XCPT();
     167            IEM_MC_ACTUALIZE_AVX_STATE_FOR_CHANGE();
     168
     169            IEM_MC_FETCH_MEM_U128_ALIGN_SSE(uSrc, pVCpu->iem.s.iEffSeg, GCPtrEffSrc);
     170            IEM_MC_STORE_YREG_U128_ZX_VLMAX(((bRm >> X86_MODRM_REG_SHIFT) & X86_MODRM_REG_SMASK) | pVCpu->iem.s.uRexReg, uSrc);
     171
     172            IEM_MC_ADVANCE_RIP();
     173            IEM_MC_END();
     174        }
     175        else
     176        {
     177/*
     178 * @ opdone
     179 * @ opcode      0x2a
     180 * @ opcodesub   !11 mr/reg vex.l=1
     181 * @ oppfx       0x66
     182 * @ opcpuid     avx2
     183 * @ opgroup     og_avx2_cachect
     184 * @ opxcpttype  1
     185 * @ optest      op1=-1 op2=2  -> op1=2
     186 * @ optest      op1=0 op2=-42 -> op1=-42
     187 */
     188            /*
     189             * 256-bit: Memory, register.
     190             */
     191            IEM_MC_BEGIN(0, 2);
     192            IEM_MC_LOCAL(RTUINT256U,                uSrc);
     193            IEM_MC_LOCAL(RTGCPTR,                   GCPtrEffSrc);
     194
     195            IEM_MC_CALC_RM_EFF_ADDR(GCPtrEffSrc, bRm, 0);
     196            IEMOP_HLP_DONE_VEX_DECODING_NO_VVVV();
     197            IEM_MC_MAYBE_RAISE_AVX2_RELATED_XCPT();
     198            IEM_MC_ACTUALIZE_AVX_STATE_FOR_READ();
     199
     200            IEM_MC_FETCH_YREG_U256(uSrc, ((bRm >> X86_MODRM_REG_SHIFT) & X86_MODRM_REG_SMASK) | pVCpu->iem.s.uRexReg);
     201            IEM_MC_STORE_MEM_U256_ALIGN_AVX(pVCpu->iem.s.iEffSeg, GCPtrEffSrc, uSrc);
     202
     203            IEM_MC_ADVANCE_RIP();
     204            IEM_MC_END();
     205        }
     206        return VINF_SUCCESS;
     207    }
     208    /**
     209     * @opdone
     210     * @opmnemonic  udvex660f382areg
     211     * @opcode      0x2a
     212     * @opcodesub   11 mr/reg
     213     * @oppfx       0x66
     214     * @opunused    immediate
     215     * @opcpuid     avx
     216     * @optest      ->
     217     * @oponly
     218     */
     219    return IEMOP_RAISE_INVALID_OPCODE();
     220
     221}
     222
    138223/** Opcode VEX.66.0F38 0x2b. */
    139224FNIEMOP_STUB(iemOp_vpackusdw_Vx_Hx_Wx);
     
    622707    /* 0x28 */  iemOp_InvalidNeedRM,        iemOp_vpmuldq_Vx_Hx_Wx,     iemOp_InvalidNeedRM,        iemOp_InvalidNeedRM,
    623708    /* 0x29 */  iemOp_InvalidNeedRM,        iemOp_vpcmpeqq_Vx_Hx_Wx,    iemOp_InvalidNeedRM,        iemOp_InvalidNeedRM,
    624     /* 0x2a */  iemOp_InvalidNeedRM,        iemOp_vmovntdqa_Vx_Hx_Mx,   iemOp_InvalidNeedRM,        iemOp_InvalidNeedRM,
     709    /* 0x2a */  iemOp_InvalidNeedRM,        iemOp_vmovntdqa_Vx_Mx,      iemOp_InvalidNeedRM,        iemOp_InvalidNeedRM,
    625710    /* 0x2b */  iemOp_InvalidNeedRM,        iemOp_vpackusdw_Vx_Hx_Wx,   iemOp_InvalidNeedRM,        iemOp_InvalidNeedRM,
    626711    /* 0x2c */  iemOp_InvalidNeedRM,        iemOp_vmaskmovps_Vx_Hx_Mx,  iemOp_InvalidNeedRM,        iemOp_InvalidNeedRM,
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