VirtualBox

Changeset 66412 in vbox for trunk/src/VBox/VMM


Ignore:
Timestamp:
Apr 4, 2017 8:50:54 AM (8 years ago)
Author:
vboxsync
Message:

IEM: Started tackling the first AVX instructions.

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

Legend:

Unmodified
Added
Removed
  • trunk/src/VBox/VMM/VMMAll/IEMAllInstructionsPython.py

    r66404 r66412  
    14221422    'vexgrp13':     InstructionMap('vexgrp13',  sEncoding = 'vex1', asLeadOpcodes = ['0x72',], sSelector = 'mod /r'),
    14231423    'vexgrp14':     InstructionMap('vexgrp14',  sEncoding = 'vex1', asLeadOpcodes = ['0x73',], sSelector = 'mod /r'),
    1424     'vexgrp15':     InstructionMap('vexgrp15',  sEncoding = 'vex1', asLeadOpcodes = ['0xae',], sSelector = 'mod /r'),
     1424    'vexgrp15':     InstructionMap('vexgrp15',  sEncoding = 'vex1', asLeadOpcodes = ['0xae',], sSelector = 'memreg /r'),
    14251425    'vexgrp17':     InstructionMap('vexgrp17',  sEncoding = 'vex1', asLeadOpcodes = ['0xf3',], sSelector = '/r'),
    14261426
  • trunk/src/VBox/VMM/VMMAll/IEMAllInstructionsTwoByte0f.cpp.h

    r66409 r66412  
    58995899
    59005900
     5901/**
     5902 * @opmaps      vexgrp15
     5903 * @opcode      !11/3
     5904 * @oppfx       none
     5905 * @opcpuid     sse
     5906 * @opgroup     og_avx_mxcsrsm
     5907 * @optestign      mxcsr=0      -> op1=0
     5908 * @optestign      mxcsr=0x2083 -> op1=0x2083
     5909 * @optestign      mxcsr=0x2084 cr0|=ts -> value.xcpt=0x7
     5910 * @optestign      mxcsr=0x2085 cr0|=em -> value.xcpt=0x6
     5911 * @optestign      mxcsr=0x2086 cr0|=mp -> op1=0x2086
     5912 * @optestign      mxcsr=0x2087 cr4&~=osfxsr -> value.xcpt=0x6
     5913 * @optestign      mxcsr=0x2088 cr0|=ts,em -> value.xcpt=0x6
     5914 * @optestign      mxcsr=0x2089 cr0|=em cr4&~=osfxsr -> value.xcpt=0x6
     5915 * @optestign      mxcsr=0x208a cr0|=ts,em cr4&~=osfxsr -> value.xcpt=0x6
     5916 * @optestign      mxcsr=0x208b cr0|=ts,em,mp cr4&~=osfxsr -> value.xcpt=0x6
     5917 */
     5918FNIEMOP_DEF_1(iemOp_VGrp15_vstmxcsr,  uint8_t, bRm)
     5919{
     5920    IEMOP_MNEMONIC1(M_MEM, VSTMXCSR, vstmxcsr, MdWO, DISOPTYPE_HARMLESS, IEMOPHINT_IGNORES_OP_SIZE);
     5921    if (!IEM_GET_GUEST_CPU_FEATURES(pVCpu)->fAvx)
     5922        return IEMOP_RAISE_INVALID_OPCODE();
     5923
     5924    IEM_MC_BEGIN(2, 0);
     5925    IEM_MC_ARG(uint8_t,         iEffSeg,                                 0);
     5926    IEM_MC_ARG(RTGCPTR,         GCPtrEff,                                1);
     5927    IEM_MC_CALC_RM_EFF_ADDR(GCPtrEff, bRm, 0);
     5928    IEMOP_HLP_DONE_DECODING_NO_LOCK_PREFIX();
     5929    IEM_MC_ACTUALIZE_SSE_STATE_FOR_READ();
     5930    IEM_MC_ASSIGN(iEffSeg, pVCpu->iem.s.iEffSeg);
     5931    IEM_MC_CALL_CIMPL_2(iemCImpl_stmxcsr, iEffSeg, GCPtrEff);
     5932    IEM_MC_END();
     5933    return VINF_SUCCESS;
     5934}
     5935
     5936
    59015937/** Opcode 0x0f 0xae mem/4. */
    59025938FNIEMOP_UD_STUB_1(iemOp_Grp15_xsave,    uint8_t, bRm);
     
    60786114    return FNIEMOP_CALL_1(g_apfnGroup15MemReg[ ((bRm >> X86_MODRM_REG_SHIFT) & X86_MODRM_REG_SMASK) * 4
    60796115                                              + pVCpu->iem.s.idxPrefix], bRm);
     6116}
     6117
     6118
     6119/**
     6120 * Vex group 15 jump table for register variant.
     6121 * @todo work in progress
     6122 */
     6123IEM_STATIC const PFNIEMOPRM g_apfnVexGroup15RegReg[] =
     6124{   /* pfx:  none,                          066h,                           0f3h,                           0f2h */
     6125    /* /0 */ iemOp_InvalidWithRM,           iemOp_InvalidWithRM,            iemOp_Grp15_rdfsbase,           iemOp_InvalidWithRM,
     6126    /* /1 */ iemOp_InvalidWithRM,           iemOp_InvalidWithRM,            iemOp_Grp15_rdgsbase,           iemOp_InvalidWithRM,
     6127    /* /2 */ iemOp_InvalidWithRM,           iemOp_InvalidWithRM,            iemOp_Grp15_wrfsbase,           iemOp_InvalidWithRM,
     6128    /* /3 */ iemOp_InvalidWithRM,           iemOp_InvalidWithRM,            iemOp_Grp15_wrgsbase,           iemOp_InvalidWithRM,
     6129    /* /4 */ IEMOP_X4(iemOp_InvalidWithRM),
     6130    /* /5 */ iemOp_Grp15_lfence,            iemOp_InvalidWithRM,            iemOp_InvalidWithRM,            iemOp_InvalidWithRM,
     6131    /* /6 */ iemOp_Grp15_mfence,            iemOp_InvalidWithRM,            iemOp_InvalidWithRM,            iemOp_InvalidWithRM,
     6132    /* /7 */ iemOp_Grp15_sfence,            iemOp_InvalidWithRM,            iemOp_InvalidWithRM,            iemOp_InvalidWithRM,
     6133};
     6134AssertCompile(RT_ELEMENTS(g_apfnVexGroup15RegReg) == 8*4);
     6135
     6136
     6137/**
     6138 * Vex group 15 jump table for memory variant.
     6139 * @todo work in progress
     6140 */
     6141IEM_STATIC const PFNIEMOPRM g_apfnVexGroup15MemReg[] =
     6142{   /* pfx:  none,                          066h,                           0f3h,                           0f2h */
     6143    /* /0 */ iemOp_Grp15_fxsave,            iemOp_InvalidWithRM,            iemOp_InvalidWithRM,            iemOp_InvalidWithRM,
     6144    /* /1 */ iemOp_Grp15_fxrstor,           iemOp_InvalidWithRM,            iemOp_InvalidWithRM,            iemOp_InvalidWithRM,
     6145    /* /2 */ iemOp_Grp15_ldmxcsr,           iemOp_InvalidWithRM,            iemOp_InvalidWithRM,            iemOp_InvalidWithRM,
     6146    /* /3 */ iemOp_VGrp15_vstmxcsr,         iemOp_InvalidWithRM,            iemOp_InvalidWithRM,            iemOp_InvalidWithRM,
     6147    /* /4 */ iemOp_Grp15_xsave,             iemOp_InvalidWithRM,            iemOp_InvalidWithRM,            iemOp_InvalidWithRM,
     6148    /* /5 */ iemOp_Grp15_xrstor,            iemOp_InvalidWithRM,            iemOp_InvalidWithRM,            iemOp_InvalidWithRM,
     6149    /* /6 */ iemOp_Grp15_xsaveopt,          iemOp_InvalidWithRM,            iemOp_InvalidWithRM,            iemOp_InvalidWithRM,
     6150    /* /7 */ iemOp_Grp15_clflush,           iemOp_Grp15_clflushopt,         iemOp_InvalidWithRM,            iemOp_InvalidWithRM,
     6151};
     6152AssertCompile(RT_ELEMENTS(g_apfnVexGroup15MemReg) == 8*4);
     6153
     6154
     6155/** Opcode vex. 0xae. */
     6156FNIEMOP_DEF(iemOp_VGrp15)
     6157{
     6158    uint8_t bRm; IEM_OPCODE_GET_NEXT_U8(&bRm);
     6159    if ((bRm & X86_MODRM_MOD_MASK) == (3 << X86_MODRM_MOD_SHIFT))
     6160        /* register, register */
     6161        return FNIEMOP_CALL_1(g_apfnVexGroup15RegReg[ ((bRm >> X86_MODRM_REG_SHIFT) & X86_MODRM_REG_SMASK) * 4
     6162                                                     + pVCpu->iem.s.idxPrefix], bRm);
     6163    /* memory, register */
     6164    return FNIEMOP_CALL_1(g_apfnVexGroup15MemReg[ ((bRm >> X86_MODRM_REG_SHIFT) & X86_MODRM_REG_SMASK) * 4
     6165                                                 + pVCpu->iem.s.idxPrefix], bRm);
    60806166}
    60816167
     
    86638749    /* 0xac */  IEMOP_X4(iemOp_InvalidNeedRM),
    86648750    /* 0xad */  IEMOP_X4(iemOp_InvalidNeedRM),
    8665     /* 0xae */  IEMOP_X4(iemOp_Grp15), /** @todo groups and vex */
     8751    /* 0xae */  IEMOP_X4(iemOp_VGrp15),
    86668752    /* 0xaf */  IEMOP_X4(iemOp_InvalidNeedRM),
    86678753
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