VirtualBox

Changeset 65764 in vbox


Ignore:
Timestamp:
Feb 13, 2017 12:51:38 PM (8 years ago)
Author:
vboxsync
svn:sync-xref-src-repo-rev:
113479
Message:

IEM: XOP updates.

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

Legend:

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

    r65761 r65764  
    12821282FNIEMOP_DEF(iemOp_popa)
    12831283{
    1284     IEMOP_MNEMONIC(popa, "popa");
    1285     IEMOP_HLP_MIN_186();
    1286     IEMOP_HLP_NO_64BIT();
    1287     if (pVCpu->iem.s.enmEffOpSize == IEMMODE_16BIT)
    1288         return IEM_MC_DEFER_TO_CIMPL_0(iemCImpl_popa_16);
    1289     Assert(pVCpu->iem.s.enmEffOpSize == IEMMODE_32BIT);
    1290     return IEM_MC_DEFER_TO_CIMPL_0(iemCImpl_popa_32);
     1284    if (pVCpu->iem.s.enmCpuMode != IEMMODE_64BIT)
     1285    {
     1286        IEMOP_MNEMONIC(popa, "popa");
     1287        IEMOP_HLP_MIN_186();
     1288        IEMOP_HLP_NO_64BIT();
     1289        if (pVCpu->iem.s.enmEffOpSize == IEMMODE_16BIT)
     1290            return IEM_MC_DEFER_TO_CIMPL_0(iemCImpl_popa_16);
     1291        Assert(pVCpu->iem.s.enmEffOpSize == IEMMODE_32BIT);
     1292        return IEM_MC_DEFER_TO_CIMPL_0(iemCImpl_popa_32);
     1293    }
     1294    Log(("mvex is not supported!\n"));
     1295    return IEMOP_RAISE_INVALID_OPCODE();
    12911296}
    12921297
     
    35283533
    35293534/** Opcode 0x8f. */
    3530 FNIEMOP_DEF(iemOp_Grp1A)
    3531 {
     3535FNIEMOP_DEF(iemOp_Grp1A_xop)
     3536{
     3537    /*
     3538     * AMD has defined /1 thru /7 as XOP prefix.  The prefix is similar to the
     3539     * three byte VEX prefix, except that the mmmmm field cannot have the values
     3540     * 0 thru 7, because it would then be confused with pop Ev (modrm.reg == 0).
     3541     */
    35323542    uint8_t bRm; IEM_OPCODE_GET_NEXT_U8(&bRm);
    35333543    if ((bRm & X86_MODRM_REG_MASK) == (0 << X86_MODRM_REG_SHIFT)) /* /0 */
    35343544        return FNIEMOP_CALL_1(iemOp_pop_Ev, bRm);
    35353545
    3536     /* AMD has defined /1 thru /7 as XOP prefix (similar to three byte VEX). */
    3537     /** @todo XOP decoding. */
    3538     IEMOP_MNEMONIC(xop_amd, "3-byte-xop");
     3546    IEMOP_MNEMONIC(xop, "xop");
     3547    if (IEM_GET_GUEST_CPU_FEATURES(pVCpu)->fXop)
     3548    {
     3549        /** @todo Test when exctly the XOP conformance checks kick in during
     3550         * instruction decoding and fetching (using \#PF). */
     3551        uint8_t bXop2;   IEM_OPCODE_GET_NEXT_U8(&bXop2);
     3552        uint8_t bOpcode; IEM_OPCODE_GET_NEXT_U8(&bOpcode);
     3553        if (   (  pVCpu->iem.s.fPrefixes
     3554                & (IEM_OP_PRF_SIZE_OP | IEM_OP_PRF_REPZ | IEM_OP_PRF_REPNZ | IEM_OP_PRF_LOCK | IEM_OP_PRF_REX))
     3555            == 0)
     3556        {
     3557            pVCpu->iem.s.fPrefixes |= IEM_OP_PRF_XOP;
     3558            if (bXop2 & 0x80 /* VEX.W */)
     3559                pVCpu->iem.s.fPrefixes |= IEM_OP_PRF_SIZE_REX_W;
     3560            pVCpu->iem.s.uRexReg    = ~bRm >> (7 - 3);
     3561            pVCpu->iem.s.uRexIndex  = ~bRm >> (6 - 3);
     3562            pVCpu->iem.s.uRexB      = ~bRm >> (5 - 3);
     3563            pVCpu->iem.s.uVex3rdReg = (~bXop2 >> 3) & 0xf;
     3564            pVCpu->iem.s.uVexLength = (bXop2 >> 2) & 1;
     3565            pVCpu->iem.s.idxPrefix  = bXop2 & 0x3;
     3566
     3567            /** @todo VEX: Just use new tables and decoders. */
     3568            switch (bRm & 0x1f)
     3569            {
     3570                case 8: /* xop opcode map 8. */
     3571                    IEMOP_BITCH_ABOUT_STUB();
     3572                    return VERR_IEM_INSTR_NOT_IMPLEMENTED;
     3573
     3574                case 9: /* xop opcode map 9. */
     3575                    IEMOP_BITCH_ABOUT_STUB();
     3576                    return VERR_IEM_INSTR_NOT_IMPLEMENTED;
     3577
     3578                case 10: /* xop opcode map 10. */
     3579                    IEMOP_BITCH_ABOUT_STUB();
     3580                    return VERR_IEM_INSTR_NOT_IMPLEMENTED;
     3581
     3582                default:
     3583                    Log(("XOP: Invalid vvvv value: %#x!\n", bRm & 0x1f));
     3584                    return IEMOP_RAISE_INVALID_OPCODE();
     3585            }
     3586        }
     3587        else
     3588            Log(("XOP: Invalid prefix mix!\n"));
     3589    }
     3590    else
     3591        Log(("XOP: XOP support disabled!\n"));
    35393592    return IEMOP_RAISE_INVALID_OPCODE();
    35403593}
     
    52595312        || (bRm & X86_MODRM_MOD_MASK) == (3 << X86_MODRM_MOD_SHIFT))
    52605313    {
    5261         IEMOP_MNEMONIC(vex2_prefix, "2-byte-vex");
     5314        IEMOP_MNEMONIC(vex2_prefix, "vex2");
    52625315        if (IEM_GET_GUEST_CPU_FEATURES(pVCpu)->fAvx)
    52635316        {
     
    53095362    }
    53105363
    5311     IEMOP_MNEMONIC(vex3_prefix, "3-byte-vex");
     5364    IEMOP_MNEMONIC(vex3_prefix, "vex3");
    53125365    if (IEM_GET_GUEST_CPU_FEATURES(pVCpu)->fAvx)
    53135366    {
     
    53315384
    53325385            /** @todo VEX: Just use new tables and decoders. */
    5333             switch (bRm & 0xf)
     5386            switch (bRm & 0x1f)
    53345387            {
    53355388                case 1: /* 0x0f lead opcode byte. */
     
    53465399
    53475400                default:
    5348                     Log(("VEX3: Invalid vvvv value: %#x!\n", bRm & 0xf));
     5401                    Log(("VEX3: Invalid vvvv value: %#x!\n", bRm & 0x1f));
    53495402                    return IEMOP_RAISE_INVALID_OPCODE();
    53505403            }
     
    1071610769    /* 0x84 */  iemOp_test_Eb_Gb,       iemOp_test_Ev_Gv,       iemOp_xchg_Eb_Gb,       iemOp_xchg_Ev_Gv,
    1071710770    /* 0x88 */  iemOp_mov_Eb_Gb,        iemOp_mov_Ev_Gv,        iemOp_mov_Gb_Eb,        iemOp_mov_Gv_Ev,
    10718     /* 0x8c */  iemOp_mov_Ev_Sw,        iemOp_lea_Gv_M,         iemOp_mov_Sw_Ev,        iemOp_Grp1A,
     10771    /* 0x8c */  iemOp_mov_Ev_Sw,        iemOp_lea_Gv_M,         iemOp_mov_Sw_Ev,        iemOp_Grp1A_xop,
    1071910772    /* 0x90 */  iemOp_nop,              iemOp_xchg_eCX_eAX,     iemOp_xchg_eDX_eAX,     iemOp_xchg_eBX_eAX,
    1072010773    /* 0x94 */  iemOp_xchg_eSP_eAX,     iemOp_xchg_eBP_eAX,     iemOp_xchg_eSI_eAX,     iemOp_xchg_eDI_eAX,
  • trunk/src/VBox/VMM/include/IEMInternal.h

    r65761 r65764  
    516516    /** Prefix index (VEX.pp) for two byte and three byte tables. */
    517517    uint8_t                 idxPrefix;                                                                      /* 0x30, 0x16 */
    518     /** 3rd (E)VEX register. */
     518    /** 3rd VEX/EVEX/XOP register. */
    519519    uint8_t                 uVex3rdReg;                                                                     /* 0x31, 0x17 */
    520     /** The VEX/EVEX length field. */
     520    /** The VEX/EVEX/XOP length field. */
    521521    uint8_t                 uVexLength;                                                                     /* 0x32, 0x18 */
    522522    /** Additional EVEX stuff. */
     
    840840#define IEM_OP_PRF_VEX                  RT_BIT_32(28) /**< Indiciates VEX prefix. */
    841841#define IEM_OP_PRF_EVEX                 RT_BIT_32(29) /**< Indiciates EVEX prefix. */
     842#define IEM_OP_PRF_XOP                  RT_BIT_32(30) /**< Indiciates XOP prefix. */
    842843/** @} */
    843844
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