VirtualBox

Changeset 65774 in vbox


Ignore:
Timestamp:
Feb 13, 2017 3:45:53 PM (8 years ago)
Author:
vboxsync
Message:

IEM: Use prefix indexed tables for group 13.

File:
1 edited

Legend:

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

    r65773 r65774  
    29592959    uint8_t bRm; IEM_OPCODE_GET_NEXT_U8(&bRm);
    29602960    if ((bRm & X86_MODRM_MOD_MASK) == (3 << X86_MODRM_MOD_SHIFT))
    2961     {
    29622961        /* register, register */
    2963         return FNIEMOP_CALL_1(g_apfnGroup12RegReg[((bRm >> X86_MODRM_REG_SHIFT) & X86_MODRM_REG_SMASK) * 4 + pVCpu->iem.s.idxPrefix], bRm);
    2964     }
    2965 
    2966     /** @todo decode SIB, disp?   */
     2962        return FNIEMOP_CALL_1(g_apfnGroup12RegReg[  ((bRm >> X86_MODRM_REG_SHIFT) & X86_MODRM_REG_SMASK) * 4
     2963                                                  + pVCpu->iem.s.idxPrefix], bRm);
     2964    /** @todo decode SIB, disp, Ib? */
    29672965    return IEMOP_RAISE_INVALID_OPCODE();
    29682966}
     
    29732971
    29742972/** Opcode 0x66 0x0f 0x72 11/2. */
    2975 FNIEMOP_STUB_1(iemOp_Grp13_psrld_Udq_Ib, uint8_t, bRm);
     2973FNIEMOP_STUB_1(iemOp_Grp13_vpsrld_Hx_Ux_Ib, uint8_t, bRm);
    29762974
    29772975/** Opcode 0x0f 0x72 11/4. */
     
    29792977
    29802978/** Opcode 0x66 0x0f 0x72 11/4. */
    2981 FNIEMOP_STUB_1(iemOp_Grp13_psrad_Udq_Ib, uint8_t, bRm);
     2979FNIEMOP_STUB_1(iemOp_Grp13_vpsrad_Hx_Ux_Ib, uint8_t, bRm);
    29822980
    29832981/** Opcode 0x0f 0x72 11/6. */
     
    29852983
    29862984/** Opcode 0x66 0x0f 0x72 11/6. */
    2987 FNIEMOP_STUB_1(iemOp_Grp13_pslld_Udq_Ib, uint8_t, bRm);
    2988 
     2985FNIEMOP_STUB_1(iemOp_Grp13_vpslld_Hx_Ux_Ib, uint8_t, bRm);
     2986
     2987
     2988/**
     2989 * Group 13 jump table for register variant.
     2990 */
     2991IEM_STATIC const PFNIEMOPRM g_apfnGroup13RegReg[8*4] =
     2992{
     2993    /** @todo decode imm8? */
     2994    /* /0 */ IEMOP_X4(iemOp_InvalidWithRM),
     2995    /* /1 */ IEMOP_X4(iemOp_InvalidWithRM),
     2996    /* /2 */ iemOp_Grp13_psrld_Nq_Ib,           iemOp_Grp13_vpsrld_Hx_Ux_Ib,    iemOp_InvalidWithRM, iemOp_InvalidWithRM,
     2997    /* /3 */ IEMOP_X4(iemOp_InvalidWithRM),
     2998    /* /4 */ iemOp_Grp13_psrad_Nq_Ib,           iemOp_Grp13_vpsrad_Hx_Ux_Ib,    iemOp_InvalidWithRM, iemOp_InvalidWithRM,
     2999    /* /5 */ IEMOP_X4(iemOp_InvalidWithRM),
     3000    /* /6 */ iemOp_Grp13_pslld_Nq_Ib,           iemOp_Grp13_vpslld_Hx_Ux_Ib,    iemOp_InvalidWithRM, iemOp_InvalidWithRM,
     3001    /* /7 */ IEMOP_X4(iemOp_InvalidWithRM)
     3002};
    29893003
    29903004/** Opcode 0x0f 0x72. */
     
    29923006{
    29933007    uint8_t bRm; IEM_OPCODE_GET_NEXT_U8(&bRm);
    2994     if ((bRm & X86_MODRM_MOD_MASK) != (3 << X86_MODRM_MOD_SHIFT))
    2995         return IEMOP_RAISE_INVALID_OPCODE();
    2996     switch ((bRm >> X86_MODRM_REG_SHIFT) & X86_MODRM_REG_SMASK)
    2997     {
    2998         case 0: case 1: case 3: case 5: case 7:
    2999             return IEMOP_RAISE_INVALID_OPCODE();
    3000         case 2:
    3001             switch (pVCpu->iem.s.fPrefixes & (IEM_OP_PRF_SIZE_OP | IEM_OP_PRF_REPZ | IEM_OP_PRF_REPNZ))
    3002             {
    3003                 case 0:                     return FNIEMOP_CALL_1(iemOp_Grp13_psrld_Nq_Ib, bRm);
    3004                 case IEM_OP_PRF_SIZE_OP:    return FNIEMOP_CALL_1(iemOp_Grp13_psrld_Udq_Ib, bRm);
    3005                 default:                    return IEMOP_RAISE_INVALID_OPCODE();
    3006             }
    3007         case 4:
    3008             switch (pVCpu->iem.s.fPrefixes & (IEM_OP_PRF_SIZE_OP | IEM_OP_PRF_REPZ | IEM_OP_PRF_REPNZ))
    3009             {
    3010                 case 0:                     return FNIEMOP_CALL_1(iemOp_Grp13_psrad_Nq_Ib, bRm);
    3011                 case IEM_OP_PRF_SIZE_OP:    return FNIEMOP_CALL_1(iemOp_Grp13_psrad_Udq_Ib, bRm);
    3012                 default:                    return IEMOP_RAISE_INVALID_OPCODE();
    3013             }
    3014         case 6:
    3015             switch (pVCpu->iem.s.fPrefixes & (IEM_OP_PRF_SIZE_OP | IEM_OP_PRF_REPZ | IEM_OP_PRF_REPNZ))
    3016             {
    3017                 case 0:                     return FNIEMOP_CALL_1(iemOp_Grp13_pslld_Nq_Ib, bRm);
    3018                 case IEM_OP_PRF_SIZE_OP:    return FNIEMOP_CALL_1(iemOp_Grp13_pslld_Udq_Ib, bRm);
    3019                 default:                    return IEMOP_RAISE_INVALID_OPCODE();
    3020             }
    3021         IEM_NOT_REACHED_DEFAULT_CASE_RET();
    3022     }
     3008    if ((bRm & X86_MODRM_MOD_MASK) == (3 << X86_MODRM_MOD_SHIFT))
     3009        /* register, register */
     3010        return FNIEMOP_CALL_1(g_apfnGroup13RegReg[ ((bRm >> X86_MODRM_REG_SHIFT) & X86_MODRM_REG_SMASK) * 4
     3011                                                  + pVCpu->iem.s.idxPrefix], bRm);
     3012    /** @todo decode SIB, disp, Ib? */
     3013    return IEMOP_RAISE_INVALID_OPCODE();
    30233014}
    30243015
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