VirtualBox

Changeset 67040 in vbox for trunk/src/VBox


Ignore:
Timestamp:
May 23, 2017 11:51:12 AM (8 years ago)
Author:
vboxsync
Message:

IEM: Implemented movntdqa Vdq,Mdq (0x66 0x0f 0x38 0x2a mod!=3).

Location:
trunk/src/VBox
Files:
8 edited

Legend:

Unmodified
Added
Removed
  • trunk/src/VBox/VMM/Makefile.kmk

    r66641 r67040  
    355355                $(PATH_SUB_CURRENT)/VMMAll/IEMAllInstructionsOneByte.cpp.h \
    356356                $(PATH_SUB_CURRENT)/VMMAll/IEMAllInstructionsTwoByte0f.cpp.h \
    357                 $(PATH_SUB_CURRENT)/VMMAll/IEMAllInstructionsVexMap1.cpp.h
     357                $(PATH_SUB_CURRENT)/VMMAll/IEMAllInstructionsThree0f38.cpp.h \
     358                $(PATH_SUB_CURRENT)/VMMAll/IEMAllInstructionsThree0f3a.cpp.h \
     359                $(PATH_SUB_CURRENT)/VMMAll/IEMAllInstructionsVexMap1.cpp.h \
     360                $(PATH_SUB_CURRENT)/VMMAll/IEMAllInstructionsVexMap2.cpp.h \
     361                $(PATH_SUB_CURRENT)/VMMAll/IEMAllInstructionsVexMap3.cpp.h \
     362                $(PATH_SUB_CURRENT)/VMMAll/IEMAllInstructions3DNow.cpp.h
    358363        $(QUIET)$(call MSG_GENERATE,VBoxVMM,$@,VMMAll/IEMAllInstructions*.cpp.h)
    359364        $(QUIET)$(RM) -f -- "[email protected]" "[email protected]" "[email protected]"
  • trunk/src/VBox/VMM/VMMAll/IEMAll.cpp

    r67029 r67040  
    1122911229            return iemRaiseDeviceNotAvailable(pVCpu); \
    1123011230    } while (0)
     11231#define IEM_MC_MAYBE_RAISE_SSE41_RELATED_XCPT() \
     11232    do { \
     11233        if (   (IEM_GET_CTX(pVCpu)->cr0 & X86_CR0_EM) \
     11234            || !(IEM_GET_CTX(pVCpu)->cr4 & X86_CR4_OSFXSR) \
     11235            || !IEM_GET_GUEST_CPU_FEATURES(pVCpu)->fSse41) \
     11236            return iemRaiseUndefinedOpcode(pVCpu); \
     11237        if (IEM_GET_CTX(pVCpu)->cr0 & X86_CR0_TS) \
     11238            return iemRaiseDeviceNotAvailable(pVCpu); \
     11239    } while (0)
    1123111240#define IEM_MC_MAYBE_RAISE_SSE3_RELATED_XCPT() \
    1123211241    do { \
  • trunk/src/VBox/VMM/VMMAll/IEMAllInstructionsPython.py

    r67037 r67040  
    253253    'Md_RO':        ( 'IDX_UseModRM',       'rm',     '%Md',  'Md',      ),
    254254    'Md_WO':        ( 'IDX_UseModRM',       'rm',     '%Md',  'Md',      ),
     255    'Mdq':          ( 'IDX_UseModRM',       'rm',     '%Mdq', 'Mdq',     ),
    255256    'Mdq_WO':       ( 'IDX_UseModRM',       'rm',     '%Mdq', 'Mdq',     ),
    256257    'Mq':           ( 'IDX_UseModRM',       'rm',     '%Mq',  'Mq',      ),
     
    454455    'cx16':         'X86_CPUID_FEATURE_ECX_CX16',
    455456    'pcid':         'X86_CPUID_FEATURE_ECX_PCID',
    456     'sse41':        'X86_CPUID_FEATURE_ECX_SSE4_1',
    457     'sse42':        'X86_CPUID_FEATURE_ECX_SSE4_2',
     457    'sse4.1':       'X86_CPUID_FEATURE_ECX_SSE4_1',
     458    'sse4.2':       'X86_CPUID_FEATURE_ECX_SSE4_2',
    458459    'movbe':        'X86_CPUID_FEATURE_ECX_MOVBE',
    459460    'popcnt':       'X86_CPUID_FEATURE_ECX_POPCNT',
  • trunk/src/VBox/VMM/VMMAll/IEMAllInstructionsThree0f38.cpp.h

    r66479 r67040  
    144144/** Opcode 0x66 0x0f 0x38 0x29. */
    145145FNIEMOP_STUB(iemOp_pcmpeqq_Vx_Wx);
    146 /** Opcode 0x66 0x0f 0x38 0x2a. */
    147 FNIEMOP_STUB(iemOp_movntdqa_Vx_Mx);
     146
     147/**
     148 * @opcode      0x2a
     149 * @opcodesub   !11 mr/reg
     150 * @oppfx       0x66
     151 * @opcpuid     sse4.1
     152 * @opgroup     og_sse41_cachect
     153 * @opxcpttype  1
     154 * @optest      op1=-1 op2=2  -> op1=2
     155 * @optest      op1=0 op2=-42 -> op1=-42
     156 * @oponly
     157 */
     158FNIEMOP_DEF(iemOp_movntdqa_Vdq_Mdq)
     159{
     160    IEMOP_MNEMONIC2(RM_MEM, MOVNTDQA, movntdqa, Vdq_WO, Mdq, DISOPTYPE_HARMLESS, IEMOPHINT_IGNORES_OP_SIZES);
     161    uint8_t bRm; IEM_OPCODE_GET_NEXT_U8(&bRm);
     162    if ((bRm & X86_MODRM_MOD_MASK) != (3 << X86_MODRM_MOD_SHIFT))
     163    {
     164        /* Register, memory. */
     165        IEM_MC_BEGIN(0, 2);
     166        IEM_MC_LOCAL(RTUINT128U,                uSrc);
     167        IEM_MC_LOCAL(RTGCPTR,                   GCPtrEffSrc);
     168
     169        IEM_MC_CALC_RM_EFF_ADDR(GCPtrEffSrc, bRm, 0);
     170        IEMOP_HLP_DONE_DECODING_NO_LOCK_PREFIX();
     171        IEM_MC_MAYBE_RAISE_SSE41_RELATED_XCPT();
     172        IEM_MC_ACTUALIZE_SSE_STATE_FOR_CHANGE();
     173
     174        IEM_MC_FETCH_MEM_U128_ALIGN_SSE(uSrc, pVCpu->iem.s.iEffSeg, GCPtrEffSrc);
     175        IEM_MC_STORE_XREG_U128(((bRm >> X86_MODRM_REG_SHIFT) & X86_MODRM_REG_SMASK) | pVCpu->iem.s.uRexReg, uSrc);
     176
     177        IEM_MC_ADVANCE_RIP();
     178        IEM_MC_END();
     179        return VINF_SUCCESS;
     180    }
     181
     182    /**
     183     * @opdone
     184     * @opmnemonic  ud660f382areg
     185     * @opcode      0x2a
     186     * @opcodesub   11 mr/reg
     187     * @oppfx       0x66
     188     * @opunused    immediate
     189     * @opcpuid     sse
     190     * @optest      ->
     191    * @oponly
     192     */
     193    return IEMOP_RAISE_INVALID_OPCODE();
     194}
     195
    148196/** Opcode 0x66 0x0f 0x38 0x2b. */
    149197FNIEMOP_STUB(iemOp_packusdw_Vx_Wx);
     
    546594    /* 0x28 */  iemOp_InvalidNeedRM,        iemOp_pmuldq_Vx_Wx,         iemOp_InvalidNeedRM,        iemOp_InvalidNeedRM,
    547595    /* 0x29 */  iemOp_InvalidNeedRM,        iemOp_pcmpeqq_Vx_Wx,        iemOp_InvalidNeedRM,        iemOp_InvalidNeedRM,
    548     /* 0x2a */  iemOp_InvalidNeedRM,        iemOp_movntdqa_Vx_Mx,       iemOp_InvalidNeedRM,        iemOp_InvalidNeedRM,
     596    /* 0x2a */  iemOp_InvalidNeedRM,        iemOp_movntdqa_Vdq_Mdq,     iemOp_InvalidNeedRM,        iemOp_InvalidNeedRM,
    549597    /* 0x2b */  iemOp_InvalidNeedRM,        iemOp_packusdw_Vx_Wx,       iemOp_InvalidNeedRM,        iemOp_InvalidNeedRM,
    550598    /* 0x2c */  IEMOP_X4(iemOp_InvalidNeedRM),
  • trunk/src/VBox/VMM/testcase/tstIEMCheckMc.cpp

    r67029 r67040  
    356356#define IEM_MC_MAYBE_RAISE_SSE2_RELATED_XCPT()          do {} while (0)
    357357#define IEM_MC_MAYBE_RAISE_SSE3_RELATED_XCPT()          do {} while (0)
     358#define IEM_MC_MAYBE_RAISE_SSE41_RELATED_XCPT()         do {} while (0)
    358359#define IEM_MC_MAYBE_RAISE_AVX_RELATED_XCPT()           do {} while (0)
    359360#define IEM_MC_RAISE_GP0_IF_CPL_NOT_ZERO()              do {} while (0)
  • trunk/src/VBox/ValidationKit/bootsectors/bs3-cpu-generated-1-data.py

    r67003 r67040  
    352352        assert len(oInstr.asCpuIds) in [0, 1], str(oInstr);
    353353        if oInstr.asCpuIds:
    354             self.sCpu += oInstr.asCpuIds[0].upper();
     354            self.sCpu += oInstr.asCpuIds[0].upper().replace('.', '_');
    355355        elif oInstr.sMinCpu:
    356356            self.sCpu += 'GE_' + oInstr.sMinCpu;
  • trunk/src/VBox/ValidationKit/bootsectors/bs3-cpu-generated-1-template.c

    r67037 r67040  
    24112411
    24122412
    2413 static unsigned BS3_NEAR_CODE Bs3Cg1EncodeNext_MODRM_MsomethingWO_Vsomething(PBS3CG1STATE pThis, unsigned iEncoding)
     2413static unsigned BS3_NEAR_CODE Bs3Cg1EncodeNext_MODRM_MsomethingWO_Vsomething_OR_ViceVersa(PBS3CG1STATE pThis, unsigned iEncoding)
    24142414{
    24152415    unsigned off;
     
    41884188        case BS3CG1ENC_MODRM_VqHi_WO_Mq:
    41894189            return Bs3Cg1EncodeNext_MODRM_VqHi_WO_Mq(pThis, iEncoding);
    4190         case BS3CG1ENC_MODRM_Vdq_WO_Wdq:
    4191             return Bs3Cg1EncodeNext_MODRM_Vdq_WO_Wdq(pThis, iEncoding);
    41924190        case BS3CG1ENC_MODRM_Vpd_WO_Wpd:
    41934191        case BS3CG1ENC_MODRM_Vps_WO_Wps:
     
    44084406            break;
    44094407
     4408        case BS3CG1ENC_MODRM_Vdq_WO_Mdq:
     4409            pThis->pfnEncoder        = Bs3Cg1EncodeNext_MODRM_MsomethingWO_Vsomething_OR_ViceVersa;
     4410            pThis->iRegOp            = 0;
     4411            pThis->iRmOp             = 1;
     4412            pThis->aOperands[0].cbOp = 16;
     4413            pThis->aOperands[1].cbOp = 16;
     4414            pThis->aOperands[0].enmLocation  = BS3CG1OPLOC_CTX;
     4415            pThis->aOperands[1].enmLocation  = BS3CG1OPLOC_MEM;
     4416            pThis->aOperands[0].idxFieldBase = BS3CG1DST_XMM0;
     4417            break;
     4418
    44104419        case BS3CG1ENC_MODRM_Vdq_WO_Wdq:
     4420            pThis->pfnEncoder        = Bs3Cg1EncodeNext_MODRM_Vdq_WO_Wdq;
    44114421            pThis->iRmOp             = 1;
    44124422            pThis->iRegOp            = 0;
     
    45664576
    45674577        case BS3CG1ENC_MODRM_Mdq_WO_Vdq:
    4568             pThis->pfnEncoder        = Bs3Cg1EncodeNext_MODRM_MsomethingWO_Vsomething;
     4578            pThis->pfnEncoder        = Bs3Cg1EncodeNext_MODRM_MsomethingWO_Vsomething_OR_ViceVersa;
    45694579            pThis->iRmOp             = 0;
    45704580            pThis->iRegOp            = 1;
     
    45994609        case BS3CG1ENC_MODRM_Mps_WO_Vps:
    46004610        case BS3CG1ENC_MODRM_Mpd_WO_Vpd:
    4601             pThis->pfnEncoder        = Bs3Cg1EncodeNext_MODRM_MsomethingWO_Vsomething;
     4611            pThis->pfnEncoder        = Bs3Cg1EncodeNext_MODRM_MsomethingWO_Vsomething_OR_ViceVersa;
    46024612            pThis->iRmOp             = 0;
    46034613            pThis->iRegOp            = 1;
     
    50795089        case BS3CG1CPU_SSE2:
    50805090        case BS3CG1CPU_SSE3:
     5091        case BS3CG1CPU_SSE4_1:
    50815092        case BS3CG1CPU_AVX:
    50825093        case BS3CG1CPU_AVX2:
     
    51585169        case BS3CG1CPU_SSE2:
    51595170        case BS3CG1CPU_SSE3:
     5171        case BS3CG1CPU_SSE4_1:
    51605172        case BS3CG1CPU_AVX:
    51615173            if (g_uBs3CpuDetected & BS3CPU_F_CPUID)
     
    51745186                    case BS3CG1CPU_SSE3:
    51755187                        if (fEcx & X86_CPUID_FEATURE_ECX_SSE3)
     5188                            return Bs3Cg3SetupSseAndAvx(pThis);
     5189                        return false;
     5190                    case BS3CG1CPU_SSE4_1:
     5191                        if (fEcx & X86_CPUID_FEATURE_ECX_SSE4_1)
    51765192                            return Bs3Cg3SetupSseAndAvx(pThis);
    51775193                        return false;
  • trunk/src/VBox/ValidationKit/bootsectors/bs3-cpu-generated-1.h

    r67037 r67040  
    117117    BS3CG1OP_Md_RO,
    118118    BS3CG1OP_Md_WO,
     119    BS3CG1OP_Mdq,
    119120    BS3CG1OP_Mdq_WO,
    120121    BS3CG1OP_Mq,
     
    165166    BS3CG1ENC_MODRM_VqHi_WO_Mq,
    166167    BS3CG1ENC_MODRM_VqZx_WO_Eq_WNZ,
     168    BS3CG1ENC_MODRM_Vdq_WO_Mdq,
    167169    BS3CG1ENC_MODRM_Vdq_WO_Wdq,
    168170    BS3CG1ENC_MODRM_Vpd_WO_Wpd,
     
    262264    BS3CG1CPU_SSE2,
    263265    BS3CG1CPU_SSE3,
     266    BS3CG1CPU_SSE4_1,
    264267    BS3CG1CPU_AVX,
    265268    BS3CG1CPU_AVX2,
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