VirtualBox

Changeset 53094 in vbox for trunk/src/VBox/Disassembler


Ignore:
Timestamp:
Oct 20, 2014 4:04:09 PM (10 years ago)
Author:
vboxsync
Message:

DIS: #6251: AVX / VEX instructions support (two byte instructions only) and some fixes to the other tables.

Location:
trunk/src/VBox/Disassembler
Files:
6 edited

Legend:

Unmodified
Added
Removed
  • trunk/src/VBox/Disassembler/DisasmCore.cpp

    r53032 r53094  
    101101static FNDISPARSE ParseModFence;
    102102static FNDISPARSE ParseNopPause;
     103static FNDISPARSE ParseVex2b;
     104static FNDISPARSE ParseVex3b;
     105static FNDISPARSE ParseVexDest;
    103106
    104107static FNDISPARSE ParseYv;
     
    159162    ParseThreeByteEsc5,
    160163    ParseImmAddrF,
    161     ParseInvOpModRm
     164    ParseInvOpModRm,
     165    ParseVex2b,
     166    ParseVex3b,
     167    ParseVexDest
    162168};
    163169
     
    206212    ParseThreeByteEsc5,
    207213    ParseImmAddrF_SizeOnly,
    208     ParseInvOpModRm
     214    ParseInvOpModRm,
     215    ParseVex2b,
     216    ParseVex3b,
     217    ParseVexDest
    209218};
    210219
     
    577586    pDis->Param2.fParam = pOp->fParam2;
    578587    pDis->Param3.fParam = pOp->fParam3;
     588    pDis->Param4.fParam = pOp->fParam4;
    579589
    580590    /* Correct the operand size if the instruction is marked as forced or default 64 bits */
     
    612622        offInstr = pDis->pfnDisasmFnTable[pOp->idxParse3](offInstr, pOp, pDis, &pDis->Param3);
    613623        if (fFiltered == false) pDis->Param3.cb = DISGetParamSize(pDis, &pDis->Param3);
     624    }
     625
     626    if (pOp->idxParse4 != IDX_ParseNop)
     627    {
     628        offInstr = pDis->pfnDisasmFnTable[pOp->idxParse4](offInstr, pOp, pDis, &pDis->Param4);
     629        if (fFiltered == false) pDis->Param4.cb = DISGetParamSize(pDis, &pDis->Param4);
    614630    }
    615631    // else simple one byte instruction
     
    974990                if (mod != 3)
    975991                    break;  /* memory operand */
     992            case OP_PARM_U: // XMM/YMM register
    976993                reg = rm; /* the RM field specifies the xmm register */
    977994                /* else no break */
    978995
    979996            case OP_PARM_V: //XMM register
    980                 pParam->fUse |= DISUSE_REG_XMM;
    981                 pParam->Base.idxXmmReg = reg;
     997                if (VEXREG_IS256B(pDis->bVexDestReg))
     998                {
     999                    // Use YMM register if VEX.L is set.
     1000                    pParam->fUse |= DISUSE_REG_YMM;
     1001                    pParam->Base.idxYmmReg = reg;
     1002                }
     1003                else
     1004                {
     1005                    pParam->fUse |= DISUSE_REG_XMM;
     1006                    pParam->Base.idxXmmReg = reg;
     1007                }
    9821008                return offInstr;
    9831009            }
     
    18911917//*****************************************************************************
    18921918//*****************************************************************************
     1919static size_t ParseVexDest(size_t offInstr, PCDISOPCODE pOp, PDISSTATE pDis, PDISOPPARAM pParam)
     1920{
     1921    NOREF(pOp);
     1922
     1923    unsigned type = OP_PARM_VTYPE(pParam->fParam);
     1924
     1925    switch (type)
     1926    {
     1927        case OP_PARM_H: //XMM or YMM register
     1928        if (VEXREG_IS256B(pDis->bVexDestReg))
     1929        {
     1930            pParam->fUse |= DISUSE_REG_YMM;
     1931            pParam->Base.idxYmmReg = (pDis->bVexDestReg >> 1) ^ 0xf;
     1932        }
     1933        else
     1934        {
     1935            pParam->fUse |= DISUSE_REG_XMM;
     1936            pParam->Base.idxXmmReg = (pDis->bVexDestReg >> 1) ^ 0xf;
     1937        }
     1938        break;
     1939        case OP_PARM_B: // Always OP_PARM_By. Change if it is not so.
     1940            if ((pDis->fPrefix & DISPREFIX_REX) && (pDis->fRexPrefix & DISPREFIX_REX_FLAGS_W))
     1941                pParam->fUse |= DISUSE_REG_GEN64;
     1942            else
     1943                pParam->fUse |= DISUSE_REG_GEN32;
     1944            // TODO: Check if the register number is correct
     1945            pParam->Base.idxGenReg = (pDis->bVexDestReg >> 1) ^ 0xf;
     1946        break;
     1947    }
     1948
     1949    return offInstr;
     1950}
     1951//*****************************************************************************
     1952//*****************************************************************************
    18931953static size_t ParseTwoByteEsc(size_t offInstr, PCDISOPCODE pOp, PDISSTATE pDis, PDISOPPARAM pParam)
    18941954{
     
    23802440    return disParseInstruction(offInstr, pOp, pDis);
    23812441}
    2382 
     2442//*****************************************************************************
     2443//*****************************************************************************
     2444static size_t ParseVex2b(size_t offInstr, PCDISOPCODE pOp, PDISSTATE pDis, PDISOPPARAM pParam)
     2445{
     2446    NOREF(pOp); NOREF(pParam);
     2447
     2448    PCDISOPCODE pOpCode = &g_InvalidOpcode[0];
     2449
     2450    uint8_t byte = disReadByte(pDis, offInstr++);
     2451    pDis->bOpCode = disReadByte(pDis, offInstr++);
     2452
     2453    pDis->bVexDestReg = VEX_2B2INT(byte);
     2454
     2455    // VEX.R (equivalent to REX.R)
     2456    if (!(byte & 0x80) && pDis->uCpuMode == DISCPUMODE_64BIT)
     2457    {
     2458        /* REX prefix byte */
     2459        pDis->fPrefix   |= DISPREFIX_REX;
     2460        pDis->fRexPrefix = DISPREFIX_REX_FLAGS_R;
     2461    }
     2462
     2463    switch(byte & 3)
     2464    {
     2465        case 0:
     2466            pOpCode = g_aVexOpcodesMap[0] + pDis->bOpCode;
     2467        break;
     2468        // OPSIZE 0x66 prefix
     2469        case 1:
     2470            pOpCode = g_aVexOpcodesMap_66H[0] + pDis->bOpCode;
     2471
     2472            /* TODO: Check if we need to set this prefix */
     2473            pDis->fPrefix |= DISPREFIX_OPSIZE;
     2474            if (pDis->uCpuMode == DISCPUMODE_16BIT)
     2475                pDis->uOpMode = DISCPUMODE_32BIT;
     2476            else
     2477                pDis->uOpMode = DISCPUMODE_16BIT;  /* for 32 and 64 bits mode (there is no 32 bits operand size override prefix) */
     2478        break;
     2479
     2480        // REPE 0xF3 prefix
     2481        case 2:
     2482            pOpCode = g_aVexOpcodesMap_F3H[0] + pDis->bOpCode;
     2483        break;
     2484
     2485        // REPNE 0xF2 prefix
     2486        case 3:
     2487            pOpCode = g_aVexOpcodesMap_F2H[0] + pDis->bOpCode;
     2488        break;
     2489        default:
     2490        break;
     2491    }
     2492
     2493    return disParseInstruction(offInstr, pOpCode, pDis);
     2494}
     2495//*****************************************************************************
     2496//*****************************************************************************
     2497static size_t ParseVex3b(size_t offInstr, PCDISOPCODE pOp, PDISSTATE pDis, PDISOPPARAM pParam)
     2498{
     2499    NOREF(pOp); NOREF(pParam);
     2500
     2501    PCDISOPCODE pOpCode = &g_InvalidOpcode[0];
     2502
     2503    uint8_t byte1 = disReadByte(pDis, offInstr++);
     2504    uint8_t byte2 = disReadByte(pDis, offInstr++);
     2505    pDis->bOpCode = disReadByte(pDis, offInstr++);
     2506
     2507    pDis->bVexDestReg = VEX_2B2INT(byte2);
     2508    uint8_t implOpcode = (byte1 & 0x1f);
     2509
     2510    // REX.RXB
     2511    if (~(byte1 & 0xe0))
     2512    {
     2513        Assert(pDis->uCpuMode == DISCPUMODE_64BIT);
     2514        pDis->fPrefix |= DISPREFIX_REX;
     2515        pDis->fRexPrefix = ~(byte1 >> 5);
     2516    }
     2517
     2518    // REX.W
     2519    if (!(byte2 & 0x80))
     2520    {
     2521        Assert(pDis->uCpuMode == DISCPUMODE_64BIT);
     2522        pDis->fPrefix   |= DISPREFIX_REX;
     2523        pDis->fRexPrefix |= DISPREFIX_REX_FLAGS_W;
     2524    }
     2525
     2526    switch(byte2 & 3)
     2527    {
     2528        case 0:
     2529            if (implOpcode >= 1 && implOpcode <= 3) // Other values are #UD.
     2530            {
     2531                pOpCode = g_aVexOpcodesMap[implOpcode - 1];
     2532                if (pOpCode != NULL)
     2533                    pOpCode = &pOpCode[pDis->bOpCode];
     2534                else pOpCode = &g_InvalidOpcode[0];
     2535            }
     2536        break;
     2537        // OPSIZE 0x66 prefix
     2538        case 1:
     2539            if (implOpcode >= 1 && implOpcode <= 3) // Other values are #UD.
     2540            {
     2541                pOpCode = g_aVexOpcodesMap_66H[implOpcode - 1];
     2542                if (pOpCode != NULL)
     2543                    pOpCode = &pOpCode[pDis->bOpCode];
     2544                else pOpCode = &g_InvalidOpcode[0];
     2545
     2546                /* TODO: check if we need to set this prefix */
     2547                pDis->fPrefix |= DISPREFIX_OPSIZE;
     2548                if (pDis->uCpuMode == DISCPUMODE_16BIT)
     2549                    pDis->uOpMode = DISCPUMODE_32BIT;
     2550                else
     2551                    pDis->uOpMode = DISCPUMODE_16BIT;  /* for 32 and 64 bits mode (there is no 32 bits operand size override prefix) */
     2552            }
     2553        break;
     2554
     2555        // REPE 0xF3 prefix
     2556        case 2:
     2557            if (implOpcode >= 1 && implOpcode <= 3) // Other values are #UD.
     2558            {
     2559                pOpCode = g_aVexOpcodesMap_F3H[implOpcode - 1];
     2560                if (pOpCode != NULL)
     2561                    pOpCode = &pOpCode[pDis->bOpCode];
     2562                else pOpCode = &g_InvalidOpcode[0];
     2563            }
     2564        break;
     2565
     2566        // REPNE 0xF2 prefix
     2567        case 3:
     2568            if (implOpcode >= 1 && implOpcode <= 3) // Other values are #UD.
     2569            {
     2570                pOpCode = g_aVexOpcodesMap_F2H[implOpcode - 1];
     2571                if (pOpCode != NULL)
     2572                    pOpCode = &pOpCode[pDis->bOpCode];
     2573                else pOpCode = &g_InvalidOpcode[0];
     2574            }
     2575        break;
     2576
     2577        default:
     2578        break;
     2579    }
     2580
     2581    return disParseInstruction(offInstr, pOpCode, pDis);
     2582}
    23832583
    23842584
     
    24642664}
    24652665
    2466 
    24672666/**
    24682667 * Internal worker for DISInstrEx and DISInstrWithPrefetchedBytes.
     
    25582757                    pDis->uOpMode = DISCPUMODE_64BIT;  /* overrides size prefix byte */
    25592758                continue;   //fetch the next byte
     2759            default:
     2760                break;
    25602761            }
     2762        }
     2763
     2764        /* Check if this is a VEX prefix. Not for 32-bit mode. */
     2765        if ((opcode == OP_LES || opcode == OP_LDS)
     2766            && (disReadByte(pDis, offInstr) & 0xc0) == 0xc0
     2767            && (opcode != OP_LES || pDis->uCpuMode == DISCPUMODE_64BIT || !(disReadByte(pDis, offInstr + 1) & 0x80)))
     2768        {
     2769            paOneByteMap = g_aOneByteMapX64;
    25612770        }
    25622771
     
    25642773        pDis->bOpCode  = codebyte;
    25652774        pDis->cbPrefix = (uint8_t)offInstr - 1;
     2775
    25662776        offInstr = disParseInstruction(offInstr, &paOneByteMap[pDis->bOpCode], pDis);
    25672777        break;
  • trunk/src/VBox/Disassembler/DisasmFormatYasm.cpp

    r53007 r53094  
    6868    "xmm0\0", "xmm1\0", "xmm2\0", "xmm3\0", "xmm4\0", "xmm5\0", "xmm6\0", "xmm7\0", "xmm8\0", "xmm9\0", "xmm10", "xmm11", "xmm12", "xmm13", "xmm14", "xmm15"
    6969};
     70static const char g_aszYasmRegYMM[16][6] =
     71{
     72    "ymm0\0", "ymm1\0", "ymm2\0", "ymm3\0", "ymm4\0", "ymm5\0", "ymm6\0", "ymm7\0", "ymm8\0", "ymm9\0", "ymm10", "ymm11", "ymm12", "ymm13", "ymm14", "ymm15"
     73};
    7074static const char g_aszYasmRegCRx[16][5] =
    7175{
     
    9498{
    9599    switch (pParam->fUse & (  DISUSE_REG_GEN8 | DISUSE_REG_GEN16 | DISUSE_REG_GEN32 | DISUSE_REG_GEN64
    96                             | DISUSE_REG_FP   | DISUSE_REG_MMX   | DISUSE_REG_XMM   | DISUSE_REG_CR
    97                             | DISUSE_REG_DBG  | DISUSE_REG_SEG   | DISUSE_REG_TEST))
     100                            | DISUSE_REG_FP   | DISUSE_REG_MMX   | DISUSE_REG_XMM   | DISUSE_REG_YMM
     101                            | DISUSE_REG_CR   | DISUSE_REG_DBG   | DISUSE_REG_SEG   | DISUSE_REG_TEST))
    98102
    99103    {
     
    149153        {
    150154            Assert(pParam->Base.idxXmmReg < RT_ELEMENTS(g_aszYasmRegXMM));
    151             const char *psz = g_aszYasmRegXMM[pParam->Base.idxMmxReg];
     155            const char *psz = g_aszYasmRegXMM[pParam->Base.idxXmmReg];
     156            *pcchReg = 4 + !!psz[4];
     157            return psz;
     158        }
     159
     160        case DISUSE_REG_YMM:
     161        {
     162            Assert(pParam->Base.idxYmmReg < RT_ELEMENTS(g_aszYasmRegYMM));
     163            const char *psz = g_aszYasmRegYMM[pParam->Base.idxYmmReg];
    152164            *pcchReg = 4 + !!psz[4];
    153165            return psz;
     
    616628                    case OP_PARM_d: PUT_SZ("dword "); break; \
    617629                    case OP_PARM_q: PUT_SZ("qword "); break; \
    618                     case OP_PARM_dq: \
    619                         if (OP_PARM_VTYPE(pParam->fParam) != OP_PARM_W) /* these are 128 bit, pray they are all unambiguous.. */ \
    620                             PUT_SZ("dqword "); \
    621                         break; \
     630                    case OP_PARM_ps: \
     631                    case OP_PARM_pd: \
     632                    case OP_PARM_x: if (VEXREG_IS256B(pDis->bVexDestReg)) { PUT_SZ("yword"); break; } \
     633                    case OP_PARM_ss: \
     634                    case OP_PARM_sd: \
     635                    case OP_PARM_dq: PUT_SZ("oword "); break; \
    622636                    case OP_PARM_p: break; /* see PUT_FAR */ \
    623637                    case OP_PARM_s: if (pParam->fUse & DISUSE_REG_FP) PUT_SZ("tword "); break; /* ?? */ \
     
    675689                    case 'V': /* ModRM byte selects an XMM/SSE register (ParseModRM / UseModRM). */
    676690                    case 'P': /* ModRM byte selects MMX register (ParseModRM / UseModRM). */
     691                    case 'H': /* The VEX.vvvv field of the VEX prefix selects a XMM/YMM register. */
    677692                    {
    678693                        pszFmt += RT_C_IS_ALPHA(pszFmt[0]) ? RT_C_IS_ALPHA(pszFmt[1]) ? 2 : 1 : 0;
     
    738753                                                   | DISUSE_REG_MMX
    739754                                                   | DISUSE_REG_XMM
     755                                                   | DISUSE_REG_YMM
    740756                                                   | DISUSE_REG_CR
    741757                                                   | DISUSE_REG_DBG
     
    11231139                        case 2: pParam = &pDis->Param2; break;
    11241140                        case 3: pParam = &pDis->Param3; break;
     1141                        case 4: pParam = &pDis->Param4; break;
    11251142                        default: pParam = NULL; break;
    11261143                    }
  • trunk/src/VBox/Disassembler/DisasmInternal.h

    r53032 r53094  
    7474  IDX_ParseImmAddrF,
    7575  IDX_ParseInvOpModRM,
     76  IDX_ParseVex2b,
     77  IDX_ParseVex3b,
     78  IDX_ParseVexDest,
    7679  IDX_ParseMax
    7780};
     
    113116/** Three byte opcode map with prefixes 0x66 0xF2 (0xF 0x38) */
    114117extern PCDISOPCODE const g_apThreeByteMapX86_66F20F38[16];
     118
     119/** VEX opcodes table defined by [VEX.m-mmmm - 1].
     120  * 0Fh, 0F38h, 0F3Ah correspondingly, VEX.pp = 00b */
     121extern PCDISOPCODE const g_aVexOpcodesMap[3];
     122
     123/** VEX opcodes table defined by [VEX.m-mmmm - 1].
     124  * 0Fh, 0F38h, 0F3Ah correspondingly, VEX.pp = 01b (66h) */
     125extern PCDISOPCODE const g_aVexOpcodesMap_66H[3];
     126
     127/** 0Fh, 0F38h, 0F3Ah correspondingly, VEX.pp = 10b (F3h) */
     128extern PCDISOPCODE const g_aVexOpcodesMap_F3H[3];
     129
     130/** 0Fh, 0F38h, 0F3Ah correspondingly, VEX.pp = 11b (F2h) */
     131extern PCDISOPCODE const g_aVexOpcodesMap_F2H[3];
    115132/** @} */
    116133
     
    174191#ifndef DIS_CORE_ONLY
    175192# define OP(pszOpcode, idxParse1, idxParse2, idxParse3, opcode, param1, param2, param3, optype) \
    176     { pszOpcode, idxParse1, idxParse2, idxParse3, 0, opcode, param1, param2, param3, optype }
     193    { pszOpcode, idxParse1, idxParse2, idxParse3, 0, opcode, param1, param2, param3, 0, 0, optype }
     194# define OPVEX(pszOpcode, idxParse1, idxParse2, idxParse3, idxParse4, opcode, param1, param2, param3, param4, optype) \
     195    { pszOpcode, idxParse1, idxParse2, idxParse3, idxParse4, opcode, param1, param2, param3, param4, 0, optype }
    177196#else
    178197# define OP(pszOpcode, idxParse1, idxParse2, idxParse3, opcode, param1, param2, param3, optype) \
    179     { idxParse1, idxParse2, idxParse3, 0, opcode, param1, param2, param3, optype }
     198    { idxParse1, idxParse2, idxParse3, 0, opcode, param1, param2, param3, 0, 0, optype }
     199# define OPVEX(pszOpcode, idxParse1, idxParse2, idxParse3, idxParse4, opcode, param1, param2, param3, param4, optype) \
     200    { idxParse1, idxParse2, idxParse3, idxParse4, opcode, param1, param2, param3, param4, 0, optype }
    180201#endif
    181202
  • trunk/src/VBox/Disassembler/DisasmTables.cpp

    r53052 r53094  
    648648
    649649    /* e */
    650     OP("pavgn %Pq,%Qq",      IDX_ParseModRM,     IDX_UseModRM,   0,          OP_PAVGN,   OP_PARM_Pq,         OP_PARM_Qq,     OP_PARM_NONE,   DISOPTYPE_HARMLESS),
     650    OP("pavgb %Pq,%Qq",      IDX_ParseModRM,     IDX_UseModRM,   0,          OP_PAVGB,   OP_PARM_Pq,         OP_PARM_Qq,     OP_PARM_NONE,   DISOPTYPE_HARMLESS),
    651651    OP("psraw %Pq,%Qq",      IDX_ParseModRM,     IDX_UseModRM,   0,          OP_PSRAW,   OP_PARM_Pq,         OP_PARM_Qq,     OP_PARM_NONE,   DISOPTYPE_HARMLESS),
    652652    OP("psrad %Pq,%Qq",      IDX_ParseModRM,     IDX_UseModRM,   0,          OP_PSRAD,   OP_PARM_Pq,         OP_PARM_Qq,     OP_PARM_NONE,   DISOPTYPE_HARMLESS),
     
    654654    OP("pmulhuw %Pq,%Qq",    IDX_ParseModRM,     IDX_UseModRM,   0,          OP_PMULHUW, OP_PARM_Pq,         OP_PARM_Qq,     OP_PARM_NONE,   DISOPTYPE_HARMLESS),
    655655    OP("pmulhw %Pq,%Qq",     IDX_ParseModRM,     IDX_UseModRM,   0,          OP_PMULHW,  OP_PARM_Pq,         OP_PARM_Qq,     OP_PARM_NONE,   DISOPTYPE_HARMLESS),
    656     INVALID_OPCODE, /** @todo 0x0f 0xe6 cvtpd2dq// */
     656    INVALID_OPCODE,
    657657    OP("movntq %Wq,%Vq",     IDX_ParseModRM,     IDX_UseModRM,   0,          OP_MOVNTQ,  OP_PARM_Wq,         OP_PARM_Vq,     OP_PARM_NONE,   DISOPTYPE_HARMLESS),
    658658    OP("psubsb %Pq,%Qq",     IDX_ParseModRM,     IDX_UseModRM,   0,          OP_PSUBSB,  OP_PARM_Pq,         OP_PARM_Qq,     OP_PARM_NONE,   DISOPTYPE_HARMLESS),
     
    666666
    667667    /* f */
    668     INVALID_OPCODE, /** @todo 0x0f 0xf0 lddqu */
     668    INVALID_OPCODE,
    669669    OP("psllw %Pq,%Qq",      IDX_ParseModRM,     IDX_UseModRM,   0,          OP_PSLLW,   OP_PARM_Pq,         OP_PARM_Qq,     OP_PARM_NONE,   DISOPTYPE_HARMLESS),
    670670    OP("pslld %Pq,%Qq",      IDX_ParseModRM,     IDX_UseModRM,   0,          OP_PSLLD,   OP_PARM_Pq,         OP_PARM_Qq,     OP_PARM_NONE,   DISOPTYPE_HARMLESS),
    671671    OP("psllq %Pq,%Qq",      IDX_ParseModRM,     IDX_UseModRM,   0,          OP_PSSQ,    OP_PARM_Pq,         OP_PARM_Qq,     OP_PARM_NONE,   DISOPTYPE_HARMLESS),
    672672    OP("pmuludq %Pq,%Qq",    IDX_ParseModRM,     IDX_UseModRM,   0,          OP_PMULUDQ, OP_PARM_Pq,         OP_PARM_Qq,     OP_PARM_NONE,   DISOPTYPE_HARMLESS),
    673     OP("paddwd %Pq,%Qq",     IDX_ParseModRM,     IDX_UseModRM,   0,          OP_PADDWD, OP_PARM_Pq,         OP_PARM_Qq,     OP_PARM_NONE,   DISOPTYPE_HARMLESS),
    674     OP("psadbw %Pq,%Qq",     IDX_ParseModRM,     IDX_UseModRM,   0,          OP_PADBW,   OP_PARM_Pq,         OP_PARM_Qq,     OP_PARM_NONE,   DISOPTYPE_HARMLESS),
    675     OP("maskmovq %Ppi,%Qpi", IDX_ParseModRM,     IDX_UseModRM,   0,          OP_PMASKMOVQ, OP_PARM_Ppi,      OP_PARM_Qpi,    OP_PARM_NONE,   DISOPTYPE_HARMLESS),
     673    OP("pmaddwd %Pq,%Qq",    IDX_ParseModRM,     IDX_UseModRM,   0,          OP_PMADDWD, OP_PARM_Pq,         OP_PARM_Qq,     OP_PARM_NONE,   DISOPTYPE_HARMLESS),
     674    OP("psadbw %Pq,%Qq",     IDX_ParseModRM,     IDX_UseModRM,   0,          OP_PSADBW,  OP_PARM_Pq,         OP_PARM_Qq,     OP_PARM_NONE,   DISOPTYPE_HARMLESS),
     675    OP("maskmovq %Ppi,%Qpi", IDX_ParseModRM,     IDX_UseModRM,   0,          OP_MASKMOVQ,OP_PARM_Ppi,        OP_PARM_Qpi,    OP_PARM_NONE,   DISOPTYPE_HARMLESS),
    676676    OP("psubb %Pq,%Qq",      IDX_ParseModRM,     IDX_UseModRM,   0,          OP_PSUBB,   OP_PARM_Pq,         OP_PARM_Qq,     OP_PARM_NONE,   DISOPTYPE_HARMLESS),
    677677    OP("psubw %Pq,%Qq",      IDX_ParseModRM,     IDX_UseModRM,   0,          OP_PSUBW,   OP_PARM_Pq,         OP_PARM_Qq,     OP_PARM_NONE,   DISOPTYPE_HARMLESS),
    678678    OP("psubd %Pq,%Qq",      IDX_ParseModRM,     IDX_UseModRM,   0,          OP_PSUBD,   OP_PARM_Pq,         OP_PARM_Qq,     OP_PARM_NONE,   DISOPTYPE_HARMLESS),
    679     OP("psubq %Pq,%Qq",      IDX_ParseModRM,     IDX_UseModRM,   0,          OP_PSUBD,   OP_PARM_Pq,         OP_PARM_Qq,     OP_PARM_NONE,   DISOPTYPE_HARMLESS),
     679    OP("psubq %Pq,%Qq",      IDX_ParseModRM,     IDX_UseModRM,   0,          OP_PSUBQ,   OP_PARM_Pq,         OP_PARM_Qq,     OP_PARM_NONE,   DISOPTYPE_HARMLESS),
    680680    OP("paddb %Pq,%Qq",      IDX_ParseModRM,     IDX_UseModRM,   0,          OP_PADDB,   OP_PARM_Pq,         OP_PARM_Qq,     OP_PARM_NONE,   DISOPTYPE_HARMLESS),
    681681    OP("paddw %Pq,%Qq",      IDX_ParseModRM,     IDX_UseModRM,   0,          OP_PADDW,   OP_PARM_Pq,         OP_PARM_Qq,     OP_PARM_NONE,   DISOPTYPE_HARMLESS),
     
    779779    OP("packssdw %Pdq,%Qdq", IDX_ParseModRM,     IDX_UseModRM,   0,          OP_PACKSSDW,OP_PARM_Pdq,        OP_PARM_Qdq,    OP_PARM_NONE,   DISOPTYPE_HARMLESS),
    780780    OP("punpcklqdq %Vdq,%Wdq",IDX_ParseModRM,    IDX_UseModRM,   0,          OP_PUNPCKLQDQ,OP_PARM_Vdq,      OP_PARM_Wdq,    OP_PARM_NONE,   DISOPTYPE_HARMLESS),
    781     OP("punpckhqd %Vdq,%Wdq",IDX_ParseModRM,     IDX_UseModRM,   0,          OP_PUNPCKHQD, OP_PARM_Vdq,      OP_PARM_Wdq,    OP_PARM_NONE,   DISOPTYPE_HARMLESS),
     781    OP("punpckhqdq %Vdq,%Wdq",IDX_ParseModRM,    IDX_UseModRM,   0,          OP_PUNPCKHQDQ,OP_PARM_Vdq,      OP_PARM_Wdq,    OP_PARM_NONE,   DISOPTYPE_HARMLESS),
    782782    OP("movd %Vdq,%Ed",      IDX_ParseModRM,     IDX_UseModRM,   0,          OP_MOVD,    OP_PARM_Vdq,        OP_PARM_Ed,     OP_PARM_NONE,   DISOPTYPE_HARMLESS),
    783783    OP("movdqa %Vdq,%Wdq",   IDX_ParseModRM,     IDX_UseModRM,   0,          OP_MOVDQA,  OP_PARM_Vdq,        OP_PARM_Wdq,    OP_PARM_NONE,   DISOPTYPE_HARMLESS),
     
    850850
    851851    /* e */
    852     OP("pavgn %Vdq,%Wdq",    IDX_ParseModRM,     IDX_UseModRM,   0,          OP_PAVGN,   OP_PARM_Vdq,        OP_PARM_Wdq,    OP_PARM_NONE,   DISOPTYPE_HARMLESS),
     852    OP("pavgb %Vdq,%Wdq",    IDX_ParseModRM,     IDX_UseModRM,   0,          OP_PAVGB,   OP_PARM_Vdq,        OP_PARM_Wdq,    OP_PARM_NONE,   DISOPTYPE_HARMLESS),
    853853    OP("psraw %Vdq,%Wdq",    IDX_ParseModRM,     IDX_UseModRM,   0,          OP_PSRAW,   OP_PARM_Vdq,        OP_PARM_Wdq,    OP_PARM_NONE,   DISOPTYPE_HARMLESS),
    854854    OP("psrad %Vdq,%Wdq",    IDX_ParseModRM,     IDX_UseModRM,   0,          OP_PSRAD,   OP_PARM_Vdq,        OP_PARM_Wdq,    OP_PARM_NONE,   DISOPTYPE_HARMLESS),
     
    873873    OP("psllq %Vdq,%Wdq",    IDX_ParseModRM,     IDX_UseModRM,   0,          OP_PSSQ,    OP_PARM_Vdq,        OP_PARM_Wdq,    OP_PARM_NONE,   DISOPTYPE_HARMLESS),
    874874    OP("pmuludq %Vdq,%Wdq",  IDX_ParseModRM,     IDX_UseModRM,   0,          OP_PMULUDQ, OP_PARM_Vdq,        OP_PARM_Wdq,    OP_PARM_NONE,   DISOPTYPE_HARMLESS),
    875     OP("paddwd %Vdq,%Wdq",   IDX_ParseModRM,     IDX_UseModRM,   0,          OP_PADDWD, OP_PARM_Vdq,        OP_PARM_Wdq,    OP_PARM_NONE,   DISOPTYPE_HARMLESS),
    876     OP("psadbw %Vdq,%Wdq",   IDX_ParseModRM,     IDX_UseModRM,   0,          OP_PADBW,   OP_PARM_Vdq,        OP_PARM_Wdq,    OP_PARM_NONE,   DISOPTYPE_HARMLESS),
    877     OP("maskmovdqu %Vdq,%Wdq",IDX_ParseModRM,    IDX_UseModRM,   0,          OP_PMASKMOVDQU, OP_PARM_Vdq,    OP_PARM_Wdq,    OP_PARM_NONE,   DISOPTYPE_HARMLESS),
     875    OP("pmaddwd %Vdq,%Wdq",  IDX_ParseModRM,     IDX_UseModRM,   0,          OP_PMADDWD, OP_PARM_Vdq,        OP_PARM_Wdq,    OP_PARM_NONE,   DISOPTYPE_HARMLESS),
     876    OP("psadbw %Vdq,%Wdq",   IDX_ParseModRM,     IDX_UseModRM,   0,          OP_PSADBW,  OP_PARM_Vdq,        OP_PARM_Wdq,    OP_PARM_NONE,   DISOPTYPE_HARMLESS),
     877    OP("maskmovdqu %Vdq,%Wdq",IDX_ParseModRM,    IDX_UseModRM,   0,          OP_MASKMOVDQU, OP_PARM_Vdq,    OP_PARM_Wdq,    OP_PARM_NONE,   DISOPTYPE_HARMLESS),
    878878    OP("psubb %Vdq,%Wdq",    IDX_ParseModRM,     IDX_UseModRM,   0,          OP_PSUBB,   OP_PARM_Vdq,        OP_PARM_Wdq,    OP_PARM_NONE,   DISOPTYPE_HARMLESS),
    879879    OP("psubw %Vdq,%Wdq",    IDX_ParseModRM,     IDX_UseModRM,   0,          OP_PSUBW,   OP_PARM_Vdq,        OP_PARM_Wdq,    OP_PARM_NONE,   DISOPTYPE_HARMLESS),
     
    10551055
    10561056    /* f */
    1057     INVALID_OPCODE_BLOCK
     1057    OP("lddqu %Vdq,%Mdq",    IDX_ParseModRM,     IDX_UseModRM,   0,          OP_LDDQU,   OP_PARM_Vdq,         OP_PARM_Mdq,     OP_PARM_NONE,   DISOPTYPE_HARMLESS),
     1058    INVALID_OPCODE,
     1059    INVALID_OPCODE,
     1060    INVALID_OPCODE,
     1061    INVALID_OPCODE,
     1062    INVALID_OPCODE,
     1063    INVALID_OPCODE,
     1064    INVALID_OPCODE,
     1065    INVALID_OPCODE,
     1066    INVALID_OPCODE,
     1067    INVALID_OPCODE,
     1068    INVALID_OPCODE,
     1069    INVALID_OPCODE,
     1070    INVALID_OPCODE,
     1071    INVALID_OPCODE,
     1072    INVALID_OPCODE
    10581073};
    10591074
     
    29242939};
    29252940
     2941/* Vex codes for two bytes opcodes starting with 0Fh */
     2942const DISOPCODE g_aMapTwoBytesVex[256] =
     2943{
     2944    /* 0 */
     2945    INVALID_OPCODE_BLOCK
     2946
     2947    /* 1 */
     2948    OPVEX("vmovups %Vps,%Wps",       IDX_ParseModRM,     IDX_UseModRM,       0,              0,          OP_MOVUPS,      OP_PARM_Vps,    OP_PARM_Wps,    OP_PARM_NONE,   OP_PARM_NONE,   DISOPTYPE_HARMLESS),
     2949    OPVEX("vmovups %Wps,%Vps",       IDX_ParseModRM,     IDX_UseModRM,       0,              0,          OP_MOVUPS,      OP_PARM_Wps,    OP_PARM_Vps,    OP_PARM_NONE,   OP_PARM_NONE,   DISOPTYPE_HARMLESS),
     2950    // vmovhlps Vq,Hq,Uq ???
     2951    OPVEX("vmovlps %Vq,%Hq,%Mq",     IDX_ParseModRM,     IDX_ParseVexDest,   IDX_UseModRM,   0,          OP_MOVLPS,      OP_PARM_Vq,     OP_PARM_Hq,     OP_PARM_Mq,     OP_PARM_NONE,   DISOPTYPE_HARMLESS),
     2952    OPVEX("vmovlps %Mq,%Vq",         IDX_ParseModRM,     IDX_UseModRM,       0,              0,          OP_MOVLPS,      OP_PARM_Mq,     OP_PARM_Vq,     OP_PARM_NONE,   OP_PARM_NONE,   DISOPTYPE_HARMLESS),
     2953    OPVEX("vunpcklps %Vx,%Hx,%Wx",   IDX_ParseModRM,     IDX_ParseVexDest,   IDX_UseModRM,   0,          OP_UNPCKLPS,    OP_PARM_Vx,     OP_PARM_Hx,     OP_PARM_Wx,     OP_PARM_NONE,   DISOPTYPE_HARMLESS),
     2954    OPVEX("vunpckhps %Vx,%Hx,%Wx",   IDX_ParseModRM,     IDX_ParseVexDest,   IDX_UseModRM,   0,          OP_UNPCKHPS,    OP_PARM_Vx,     OP_PARM_Hx,     OP_PARM_Wx,     OP_PARM_NONE,   DISOPTYPE_HARMLESS),
     2955    // vmovlhps Vdq,Hq,Uq ???
     2956    OPVEX("vmovhps %Vdq,%Hq,%Mq",    IDX_ParseModRM,     IDX_ParseVexDest,   IDX_UseModRM,   0,          OP_MOVHPS,      OP_PARM_Vdq,    OP_PARM_Hq,     OP_PARM_Mq,     OP_PARM_NONE,   DISOPTYPE_HARMLESS),
     2957    OPVEX("vmovhps %Mq,%Vq",         IDX_ParseModRM,     IDX_UseModRM,       0,              0,          OP_MOVHPS,      OP_PARM_Mq,     OP_PARM_Vq,     OP_PARM_NONE,   OP_PARM_NONE,   DISOPTYPE_HARMLESS),
     2958    INVALID_OPCODE,
     2959    INVALID_OPCODE,
     2960    INVALID_OPCODE,
     2961    INVALID_OPCODE,
     2962    INVALID_OPCODE,
     2963    INVALID_OPCODE,
     2964    INVALID_OPCODE,
     2965    INVALID_OPCODE,
     2966
     2967    /* 2 */
     2968    INVALID_OPCODE,
     2969    INVALID_OPCODE,
     2970    INVALID_OPCODE,
     2971    INVALID_OPCODE,
     2972    INVALID_OPCODE,
     2973    INVALID_OPCODE,
     2974    INVALID_OPCODE,
     2975    INVALID_OPCODE,
     2976    OPVEX("vmovaps %Vps,%Wps",       IDX_ParseModRM,     IDX_UseModRM,       0,              0,          OP_MOVAPS,      OP_PARM_Vps,    OP_PARM_Wps,    OP_PARM_NONE,   OP_PARM_NONE,   DISOPTYPE_HARMLESS),
     2977    OPVEX("vmovaps %Wps,%Vps",       IDX_ParseModRM,     IDX_UseModRM,       0,              0,          OP_MOVAPS,      OP_PARM_Wps,    OP_PARM_Vps,    OP_PARM_NONE,   OP_PARM_NONE,   DISOPTYPE_HARMLESS),
     2978    INVALID_OPCODE,
     2979    OPVEX("vmovntps %Mps,%Vps",      IDX_ParseModRM,     IDX_UseModRM,       0,              0,          OP_MOVNTPS,     OP_PARM_Mps,    OP_PARM_Vps,    OP_PARM_NONE,   OP_PARM_NONE,   DISOPTYPE_HARMLESS),
     2980    INVALID_OPCODE,
     2981    INVALID_OPCODE,
     2982    OPVEX("vucomiss %Vss,%Wss",      IDX_ParseModRM,     IDX_UseModRM,       0,              0,          OP_UCOMISS,     OP_PARM_Vss,    OP_PARM_Wss,    OP_PARM_NONE,   OP_PARM_NONE,   DISOPTYPE_HARMLESS),
     2983    OPVEX("vcomiss %Vss,%Wss",       IDX_ParseModRM,     IDX_UseModRM,       0,              0,          OP_COMISS,      OP_PARM_Vss,    OP_PARM_Wss,    OP_PARM_NONE,   OP_PARM_NONE,   DISOPTYPE_HARMLESS),
     2984
     2985    /* 3 */
     2986    INVALID_OPCODE_BLOCK
     2987
     2988    /* 4 */
     2989    INVALID_OPCODE_BLOCK
     2990
     2991    /* 5 */
     2992    OPVEX("vmovmskps %Gy,%Ups",      IDX_ParseModRM,     IDX_UseModRM,       0,              0,         OP_MOVMSKPS,    OP_PARM_Gy,      OP_PARM_Ups,    OP_PARM_NONE,   OP_PARM_NONE,   DISOPTYPE_HARMLESS),
     2993    OPVEX("vsqrtps %Vps,%Wps",       IDX_ParseModRM,     IDX_UseModRM,       0,              0,         OP_SQRTPS,      OP_PARM_Vps,     OP_PARM_Wps,    OP_PARM_NONE,   OP_PARM_NONE,   DISOPTYPE_HARMLESS),
     2994    OPVEX("vrsqrtps %Vps,%Wps",      IDX_ParseModRM,     IDX_UseModRM,       0,              0,         OP_RSQRTPS,     OP_PARM_Vps,     OP_PARM_Wps,    OP_PARM_NONE,   OP_PARM_NONE,   DISOPTYPE_HARMLESS),
     2995    OPVEX("vrcpps %Vps,%Wps",        IDX_ParseModRM,     IDX_UseModRM,       0,              0,         OP_RCPPS,       OP_PARM_Vps,     OP_PARM_Wps,    OP_PARM_NONE,   OP_PARM_NONE,   DISOPTYPE_HARMLESS),
     2996    OPVEX("vandps %Vps,%Hps,%Wps",   IDX_ParseModRM,     IDX_ParseVexDest,   IDX_UseModRM,   0,         OP_ANDPS,       OP_PARM_Vps,     OP_PARM_Hps,    OP_PARM_Wps,    OP_PARM_NONE,   DISOPTYPE_HARMLESS),
     2997    OPVEX("vandnps %Vps,%Hps,%Wps",  IDX_ParseModRM,     IDX_ParseVexDest,   IDX_UseModRM,   0,         OP_ANDNPS,      OP_PARM_Vps,     OP_PARM_Hps,    OP_PARM_Wps,    OP_PARM_NONE,   DISOPTYPE_HARMLESS),
     2998    OPVEX("vorps %Vps,%Hps,%Wps",    IDX_ParseModRM,     IDX_ParseVexDest,   IDX_UseModRM,   0,         OP_ORPS,        OP_PARM_Vps,     OP_PARM_Hps,    OP_PARM_Wps,    OP_PARM_NONE,   DISOPTYPE_HARMLESS),
     2999    OPVEX("vxorps %Vps,%Hps,%Wps",   IDX_ParseModRM,     IDX_ParseVexDest,   IDX_UseModRM,   0,         OP_XORPS,       OP_PARM_Vps,     OP_PARM_Hps,    OP_PARM_Wps,    OP_PARM_NONE,   DISOPTYPE_HARMLESS),
     3000    OPVEX("vaddps %Vps,%Hps,%Wps",   IDX_ParseModRM,     IDX_ParseVexDest,   IDX_UseModRM,   0,         OP_ADDPS,       OP_PARM_Vps,     OP_PARM_Hps,    OP_PARM_Wps,    OP_PARM_NONE,   DISOPTYPE_HARMLESS),
     3001    OPVEX("vmulps %Vps,%Hps,%Wps",   IDX_ParseModRM,     IDX_ParseVexDest,   IDX_UseModRM,   0,         OP_MULPS,       OP_PARM_Vps,     OP_PARM_Hps,    OP_PARM_Wps,    OP_PARM_NONE,   DISOPTYPE_HARMLESS),
     3002    OPVEX("vcvtps2pd %Vpd,%Wps",     IDX_ParseModRM,     IDX_UseModRM,       0,              0,         OP_CVTPS2PD,    OP_PARM_Vpd,     OP_PARM_Wps,    OP_PARM_NONE,   OP_PARM_NONE,   DISOPTYPE_HARMLESS),
     3003    OPVEX("vcvtdq2ps %Vps,%Wdq",     IDX_ParseModRM,     IDX_UseModRM,       0,              0,         OP_CVTDQ2PS,    OP_PARM_Vps,     OP_PARM_Wdq,    OP_PARM_NONE,   OP_PARM_NONE,   DISOPTYPE_HARMLESS),
     3004    OPVEX("vsubps %Vps,%Hps,%Wps",   IDX_ParseModRM,     IDX_ParseVexDest,   IDX_UseModRM,   0,         OP_SUBPS,       OP_PARM_Vps,     OP_PARM_Hps,    OP_PARM_Wps,    OP_PARM_NONE,   DISOPTYPE_HARMLESS),
     3005    OPVEX("vminps %Vps,%Hps,%Wps",   IDX_ParseModRM,     IDX_ParseVexDest,   IDX_UseModRM,   0,         OP_MINPS,       OP_PARM_Vps,     OP_PARM_Hps,    OP_PARM_Wps,    OP_PARM_NONE,   DISOPTYPE_HARMLESS),
     3006    OPVEX("vdivps %Vps,%Hps,%Wps",   IDX_ParseModRM,     IDX_ParseVexDest,   IDX_UseModRM,   0,         OP_DIVPS,       OP_PARM_Vps,     OP_PARM_Hps,    OP_PARM_Wps,    OP_PARM_NONE,   DISOPTYPE_HARMLESS),
     3007    OPVEX("vmaxps %Vps,%Hps,%Wps",   IDX_ParseModRM,     IDX_ParseVexDest,   IDX_UseModRM,   0,         OP_MAXPS,       OP_PARM_Vps,     OP_PARM_Hps,    OP_PARM_Wps,    OP_PARM_NONE,   DISOPTYPE_HARMLESS),
     3008
     3009    /* 6 */
     3010    INVALID_OPCODE_BLOCK
     3011
     3012    /* 7 */
     3013    INVALID_OPCODE,
     3014    INVALID_OPCODE,
     3015    INVALID_OPCODE,
     3016    INVALID_OPCODE,
     3017    INVALID_OPCODE,
     3018    INVALID_OPCODE,
     3019    INVALID_OPCODE,
     3020    // vzeroall ???
     3021    OPVEX("vzeroupper",     0,                  0,                  0,              0,         OP_EMMS,        OP_PARM_NONE,    OP_PARM_NONE,   OP_PARM_NONE,   OP_PARM_NONE,   DISOPTYPE_HARMLESS),
     3022    INVALID_OPCODE,
     3023    INVALID_OPCODE,
     3024    INVALID_OPCODE,
     3025    INVALID_OPCODE,
     3026    INVALID_OPCODE,
     3027    INVALID_OPCODE,
     3028    INVALID_OPCODE,
     3029    INVALID_OPCODE,
     3030
     3031    /* 8 */
     3032    INVALID_OPCODE_BLOCK
     3033
     3034    /* 9 */
     3035    INVALID_OPCODE_BLOCK
     3036
     3037    /* a */
     3038    INVALID_OPCODE_BLOCK
     3039
     3040    /* b */
     3041    INVALID_OPCODE_BLOCK
     3042
     3043    /* c */
     3044    INVALID_OPCODE,
     3045    INVALID_OPCODE,
     3046    OPVEX("vcmpss %Vps,%Hps,%Wps,%Ib",   IDX_ParseModRM,    IDX_ParseVexDest,   IDX_UseModRM,   IDX_ParseImmByte,  OP_CMPSS,   OP_PARM_Vps,  OP_PARM_Hps,  OP_PARM_Wps,   OP_PARM_Ib,     DISOPTYPE_HARMLESS),
     3047    INVALID_OPCODE,
     3048    INVALID_OPCODE,
     3049    INVALID_OPCODE,
     3050    OPVEX("vshufps %Vps,%Hps,%Wps,%Ib",  IDX_ParseModRM,    IDX_ParseVexDest,   IDX_UseModRM,   IDX_ParseImmByte,  OP_SHUFPS,   OP_PARM_Vps,  OP_PARM_Hps,  OP_PARM_Wps,   OP_PARM_Ib,     DISOPTYPE_HARMLESS),
     3051    INVALID_OPCODE,
     3052    INVALID_OPCODE,
     3053    INVALID_OPCODE,
     3054    INVALID_OPCODE,
     3055    INVALID_OPCODE,
     3056    INVALID_OPCODE,
     3057    INVALID_OPCODE,
     3058    INVALID_OPCODE,
     3059    INVALID_OPCODE,
     3060
     3061    /* d */
     3062    INVALID_OPCODE_BLOCK
     3063
     3064    /* e */
     3065    INVALID_OPCODE_BLOCK
     3066
     3067    /* f */
     3068    INVALID_OPCODE_BLOCK
     3069};
     3070
     3071/* Vex codes for two bytes opcodes starting with 0Fh with prefix 66H*/
     3072const DISOPCODE g_aMapTwoBytesVex_66H[256] =
     3073{
     3074    /* 0 */
     3075    INVALID_OPCODE_BLOCK
     3076
     3077    /* 1 */
     3078    OPVEX("vmovupd %Vpd,%Wpd",       IDX_ParseModRM,     IDX_UseModRM,       0,              0,          OP_MOVUPD,      OP_PARM_Vpd,    OP_PARM_Wpd,    OP_PARM_NONE,   OP_PARM_NONE,   DISOPTYPE_HARMLESS),
     3079    OPVEX("vmovupd %Wpd,%Vpd",       IDX_ParseModRM,     IDX_UseModRM,       0,              0,          OP_MOVUPD,      OP_PARM_Wpd,    OP_PARM_Vpd,    OP_PARM_NONE,   OP_PARM_NONE,   DISOPTYPE_HARMLESS),
     3080    OPVEX("vmovlpd %Vq,%Hq,%Mq",     IDX_ParseModRM,     IDX_ParseVexDest,   IDX_UseModRM,   0,          OP_MOVLPD,      OP_PARM_Vq,     OP_PARM_Hq,     OP_PARM_Mq,     OP_PARM_NONE,   DISOPTYPE_HARMLESS),
     3081    OPVEX("vmovlpd %Mq,%Vq",         IDX_ParseModRM,     IDX_UseModRM,       0,              0,          OP_MOVLPD,      OP_PARM_Mq,     OP_PARM_Vq,     OP_PARM_NONE,   OP_PARM_NONE,   DISOPTYPE_HARMLESS),
     3082    OPVEX("vunpcklpd %Vx,%Hx,%Wx",   IDX_ParseModRM,     IDX_ParseVexDest,   IDX_UseModRM,   0,          OP_UNPCKLPD,    OP_PARM_Vx,     OP_PARM_Hx,     OP_PARM_Wx,     OP_PARM_NONE,   DISOPTYPE_HARMLESS),
     3083    OPVEX("vunpckhpd %Vx,%Hx,%Wx",   IDX_ParseModRM,     IDX_ParseVexDest,   IDX_UseModRM,   0,          OP_UNPCKHPD,    OP_PARM_Vx,     OP_PARM_Hx,     OP_PARM_Wx,     OP_PARM_NONE,   DISOPTYPE_HARMLESS),
     3084    OPVEX("vmovhpd %Vdq,%Hq,%Mq",    IDX_ParseModRM,     IDX_ParseVexDest,   IDX_UseModRM,   0,          OP_MOVHPD,      OP_PARM_Vdq,    OP_PARM_Hq,     OP_PARM_Mq,     OP_PARM_NONE,   DISOPTYPE_HARMLESS),
     3085    OPVEX("vmovhpd %Mq,%Vq",         IDX_ParseModRM,     IDX_UseModRM,       0,              0,          OP_MOVHPD,      OP_PARM_Mq,     OP_PARM_Vq,     OP_PARM_NONE,   OP_PARM_NONE,   DISOPTYPE_HARMLESS),
     3086    INVALID_OPCODE,
     3087    INVALID_OPCODE,
     3088    INVALID_OPCODE,
     3089    INVALID_OPCODE,
     3090    INVALID_OPCODE,
     3091    INVALID_OPCODE,
     3092    INVALID_OPCODE,
     3093    INVALID_OPCODE,
     3094
     3095    /* 2 */
     3096    INVALID_OPCODE,
     3097    INVALID_OPCODE,
     3098    INVALID_OPCODE,
     3099    INVALID_OPCODE,
     3100    INVALID_OPCODE,
     3101    INVALID_OPCODE,
     3102    INVALID_OPCODE,
     3103    INVALID_OPCODE,
     3104    OPVEX("vmovapd %Vpd,%Wpd",       IDX_ParseModRM,     IDX_UseModRM,       0,              0,          OP_MOVAPD,      OP_PARM_Vpd,    OP_PARM_Wpd,    OP_PARM_NONE,   OP_PARM_NONE,   DISOPTYPE_HARMLESS),
     3105    OPVEX("vmovapd %Wpd,%Vpd",       IDX_ParseModRM,     IDX_UseModRM,       0,              0,          OP_MOVAPD,      OP_PARM_Wpd,    OP_PARM_Vpd,    OP_PARM_NONE,   OP_PARM_NONE,   DISOPTYPE_HARMLESS),
     3106    INVALID_OPCODE,
     3107    OPVEX("vmovntpd %Mpd,%Vpd",      IDX_ParseModRM,     IDX_UseModRM,       0,              0,          OP_MOVNTPD,     OP_PARM_Mpd,    OP_PARM_Vpd,    OP_PARM_NONE,   OP_PARM_NONE,   DISOPTYPE_HARMLESS),
     3108    INVALID_OPCODE,
     3109    INVALID_OPCODE,
     3110    OPVEX("vucomisd %Vsd,%Wsd",      IDX_ParseModRM,     IDX_UseModRM,       0,              0,          OP_UCOMISD,     OP_PARM_Vsd,    OP_PARM_Wsd,    OP_PARM_NONE,   OP_PARM_NONE,   DISOPTYPE_HARMLESS),
     3111    OPVEX("vcomisd %Vsd,%Wsd",       IDX_ParseModRM,     IDX_UseModRM,       0,              0,          OP_COMISD,      OP_PARM_Vsd,    OP_PARM_Wsd,    OP_PARM_NONE,   OP_PARM_NONE,   DISOPTYPE_HARMLESS),
     3112
     3113    /* 3 */
     3114    INVALID_OPCODE_BLOCK
     3115
     3116    /* 4 */
     3117    INVALID_OPCODE_BLOCK
     3118
     3119    /* 5 */
     3120    OPVEX("vmovmskpd %Gy,%Upd",      IDX_ParseModRM,     IDX_UseModRM,       0,              0,         OP_MOVMSKPD,    OP_PARM_Gy,      OP_PARM_Upd,    OP_PARM_NONE,   OP_PARM_NONE,   DISOPTYPE_HARMLESS),
     3121    OPVEX("vsqrtpd %Vpd,%Wpd",       IDX_ParseModRM,     IDX_UseModRM,       0,              0,         OP_SQRTPD,      OP_PARM_Vpd,     OP_PARM_Wpd,    OP_PARM_NONE,   OP_PARM_NONE,   DISOPTYPE_HARMLESS),
     3122    INVALID_OPCODE,
     3123    INVALID_OPCODE,
     3124    OPVEX("vandpd %Vpd,%Hpd,%Wpd",   IDX_ParseModRM,     IDX_ParseVexDest,   IDX_UseModRM,   0,         OP_ANDPD,       OP_PARM_Vpd,     OP_PARM_Hpd,    OP_PARM_Wpd,    OP_PARM_NONE,   DISOPTYPE_HARMLESS),
     3125    OPVEX("vandnpd %Vpd,%Hpd,%Wpd",  IDX_ParseModRM,     IDX_ParseVexDest,   IDX_UseModRM,   0,         OP_ANDNPD,      OP_PARM_Vpd,     OP_PARM_Hpd,    OP_PARM_Wpd,    OP_PARM_NONE,   DISOPTYPE_HARMLESS),
     3126    OPVEX("vorpd %Vpd,%Hpd,%Wpd",    IDX_ParseModRM,     IDX_ParseVexDest,   IDX_UseModRM,   0,         OP_ORPD,        OP_PARM_Vpd,     OP_PARM_Hpd,    OP_PARM_Wpd,    OP_PARM_NONE,   DISOPTYPE_HARMLESS),
     3127    OPVEX("vxorpd %Vpd,%Hpd,%Wpd",   IDX_ParseModRM,     IDX_ParseVexDest,   IDX_UseModRM,   0,         OP_XORPD,       OP_PARM_Vpd,     OP_PARM_Hpd,    OP_PARM_Wpd,    OP_PARM_NONE,   DISOPTYPE_HARMLESS),
     3128    OPVEX("vaddpd %Vpd,%Hpd,%Wpd",   IDX_ParseModRM,     IDX_ParseVexDest,   IDX_UseModRM,   0,         OP_ADDPD,       OP_PARM_Vpd,     OP_PARM_Hpd,    OP_PARM_Wpd,    OP_PARM_NONE,   DISOPTYPE_HARMLESS),
     3129    OPVEX("vmulpd %Vpd,%Hpd,%Wpd",   IDX_ParseModRM,     IDX_ParseVexDest,   IDX_UseModRM,   0,         OP_MULPD,       OP_PARM_Vpd,     OP_PARM_Hpd,    OP_PARM_Wpd,    OP_PARM_NONE,   DISOPTYPE_HARMLESS),
     3130    OPVEX("vcvtpd2ps %Vps,%Wpd",     IDX_ParseModRM,     IDX_UseModRM,       0,              0,         OP_CVTPD2PS,    OP_PARM_Vps,     OP_PARM_Wpd,    OP_PARM_NONE,   OP_PARM_NONE,   DISOPTYPE_HARMLESS),
     3131    OPVEX("vcvtps2dq %Vdq,%Wps",     IDX_ParseModRM,     IDX_UseModRM,       0,              0,         OP_CVTPS2DQ,    OP_PARM_Vdq,     OP_PARM_Wps,    OP_PARM_NONE,   OP_PARM_NONE,   DISOPTYPE_HARMLESS),
     3132    OPVEX("vsubpd %Vpd,%Hpd,%Wpd",   IDX_ParseModRM,     IDX_ParseVexDest,   IDX_UseModRM,   0,         OP_SUBPD,       OP_PARM_Vpd,     OP_PARM_Hpd,    OP_PARM_Wpd,    OP_PARM_NONE,   DISOPTYPE_HARMLESS),
     3133    OPVEX("vminpd %Vpd,%Hpd,%Wpd",   IDX_ParseModRM,     IDX_ParseVexDest,   IDX_UseModRM,   0,         OP_MINPD,       OP_PARM_Vpd,     OP_PARM_Hpd,    OP_PARM_Wpd,    OP_PARM_NONE,   DISOPTYPE_HARMLESS),
     3134    OPVEX("vdivpd %Vpd,%Hpd,%Wpd",   IDX_ParseModRM,     IDX_ParseVexDest,   IDX_UseModRM,   0,         OP_DIVPD,       OP_PARM_Vpd,     OP_PARM_Hpd,    OP_PARM_Wpd,    OP_PARM_NONE,   DISOPTYPE_HARMLESS),
     3135    OPVEX("vmaxpd %Vpd,%Hpd,%Wpd",   IDX_ParseModRM,     IDX_ParseVexDest,   IDX_UseModRM,   0,         OP_MAXPD,       OP_PARM_Vpd,     OP_PARM_Hpd,    OP_PARM_Wpd,    OP_PARM_NONE,   DISOPTYPE_HARMLESS),
     3136
     3137
     3138    /* 6 */
     3139    OPVEX("vpunpcklbw %Vx,%Hx,%Wx",  IDX_ParseModRM,     IDX_ParseVexDest,   IDX_UseModRM,   0,         OP_PUNPCKLBW,   OP_PARM_Vx,      OP_PARM_Hx,     OP_PARM_Wx,     OP_PARM_NONE,   DISOPTYPE_HARMLESS),
     3140    OPVEX("vpunpcklwd %Vx,%Hx,%Wx",  IDX_ParseModRM,     IDX_ParseVexDest,   IDX_UseModRM,   0,         OP_PUNPCKLWD,   OP_PARM_Vx,      OP_PARM_Hx,     OP_PARM_Wx,     OP_PARM_NONE,   DISOPTYPE_HARMLESS),
     3141    OPVEX("vpunpckldq %Vx,%Hx,%Wx",  IDX_ParseModRM,     IDX_ParseVexDest,   IDX_UseModRM,   0,         OP_PUNPCKLDQ,   OP_PARM_Vx,      OP_PARM_Hx,     OP_PARM_Wx,     OP_PARM_NONE,   DISOPTYPE_HARMLESS),
     3142    OPVEX("vpacksswb %Vx,%Hx,%Wx",   IDX_ParseModRM,     IDX_ParseVexDest,   IDX_UseModRM,   0,         OP_PACKSSWB,    OP_PARM_Vx,      OP_PARM_Hx,     OP_PARM_Wx,     OP_PARM_NONE,   DISOPTYPE_HARMLESS),
     3143    OPVEX("vpcmpgtb %Vx,%Hx,%Wx",    IDX_ParseModRM,     IDX_ParseVexDest,   IDX_UseModRM,   0,         OP_PCMPGTB,     OP_PARM_Vx,      OP_PARM_Hx,     OP_PARM_Wx,     OP_PARM_NONE,   DISOPTYPE_HARMLESS),
     3144    OPVEX("vpcmpgtw %Vx,%Hx,%Wx",    IDX_ParseModRM,     IDX_ParseVexDest,   IDX_UseModRM,   0,         OP_PCMPGTW,     OP_PARM_Vx,      OP_PARM_Hx,     OP_PARM_Wx,     OP_PARM_NONE,   DISOPTYPE_HARMLESS),
     3145    OPVEX("vpcmpgtd %Vx,%Hx,%Wx",    IDX_ParseModRM,     IDX_ParseVexDest,   IDX_UseModRM,   0,         OP_PCMPGTD,     OP_PARM_Vx,      OP_PARM_Hx,     OP_PARM_Wx,     OP_PARM_NONE,   DISOPTYPE_HARMLESS),
     3146    OPVEX("vpackuswb %Vx,%Hx,%Wx",   IDX_ParseModRM,     IDX_ParseVexDest,   IDX_UseModRM,   0,         OP_PACKUSWB,    OP_PARM_Vx,      OP_PARM_Hx,     OP_PARM_Wx,     OP_PARM_NONE,   DISOPTYPE_HARMLESS),
     3147    OPVEX("vpunpckhbw %Vx,%Hx,%Wx",  IDX_ParseModRM,     IDX_ParseVexDest,   IDX_UseModRM,   0,         OP_PUNPCKHBW,   OP_PARM_Vx,      OP_PARM_Hx,     OP_PARM_Wx,     OP_PARM_NONE,   DISOPTYPE_HARMLESS),
     3148    OPVEX("vpunpckhwd %Vx,%Hx,%Wx",  IDX_ParseModRM,     IDX_ParseVexDest,   IDX_UseModRM,   0,         OP_PUNPCKHWD,   OP_PARM_Vx,      OP_PARM_Hx,     OP_PARM_Wx,     OP_PARM_NONE,   DISOPTYPE_HARMLESS),
     3149    OPVEX("vpunpckhdq %Vx,%Hx,%Wx",  IDX_ParseModRM,     IDX_ParseVexDest,   IDX_UseModRM,   0,         OP_PUNPCKHDQ,   OP_PARM_Vx,      OP_PARM_Hx,     OP_PARM_Wx,     OP_PARM_NONE,   DISOPTYPE_HARMLESS),
     3150    OPVEX("vpackssdw %Vx,%Hx,%Wx",   IDX_ParseModRM,     IDX_ParseVexDest,   IDX_UseModRM,   0,         OP_PACKSSDW,    OP_PARM_Vx,      OP_PARM_Hx,     OP_PARM_Wx,     OP_PARM_NONE,   DISOPTYPE_HARMLESS),
     3151    OPVEX("vpunpcklqdq %Vx,%Hx,%Wx", IDX_ParseModRM,     IDX_ParseVexDest,   IDX_UseModRM,   0,         OP_PUNPCKLQDQ,  OP_PARM_Vx,      OP_PARM_Hx,     OP_PARM_Wx,     OP_PARM_NONE,   DISOPTYPE_HARMLESS),
     3152    OPVEX("vpunpckhqdq %Vx,%Hx,%Wx", IDX_ParseModRM,     IDX_ParseVexDest,   IDX_UseModRM,   0,         OP_PUNPCKHQDQ,  OP_PARM_Vx,      OP_PARM_Hx,     OP_PARM_Wx,     OP_PARM_NONE,   DISOPTYPE_HARMLESS),
     3153    OPVEX("vmovd/vmovq %Vy,%Ey",     IDX_ParseModRM,     IDX_UseModRM,       0,              0,         OP_MOVD,        OP_PARM_Vy,      OP_PARM_Ey,     OP_PARM_NONE,   OP_PARM_NONE,   DISOPTYPE_HARMLESS),
     3154    OPVEX("vmovdqa %Vx,%Wx",         IDX_ParseModRM,     IDX_UseModRM,       0,              0,         OP_MOVDQA,      OP_PARM_Vx,      OP_PARM_Wx,     OP_PARM_NONE,   OP_PARM_NONE,   DISOPTYPE_HARMLESS),
     3155
     3156    /* 7 */
     3157    OPVEX("vpshufd %Vx,%Wx,%Ib",     IDX_ParseModRM,     IDX_UseModRM,    IDX_ParseImmByte,  0,         OP_PSHUFD,      OP_PARM_Vx,      OP_PARM_Wx,     OP_PARM_Ib,     OP_PARM_NONE,   DISOPTYPE_HARMLESS),
     3158    INVALID_OPCODE,
     3159    INVALID_OPCODE,
     3160    INVALID_OPCODE,
     3161    OPVEX("vpcmpeqb %Vx,%Hx,%Wx",    IDX_ParseModRM,     IDX_ParseVexDest,   IDX_UseModRM,   0,         OP_PCMPEQB,     OP_PARM_Vx,      OP_PARM_Hx,     OP_PARM_Wx,     OP_PARM_NONE,   DISOPTYPE_HARMLESS),
     3162    OPVEX("vpcmpeqw %Vx,%Hx,%Wx",    IDX_ParseModRM,     IDX_ParseVexDest,   IDX_UseModRM,   0,         OP_PCMPEQW,     OP_PARM_Vx,      OP_PARM_Hx,     OP_PARM_Wx,     OP_PARM_NONE,   DISOPTYPE_HARMLESS),
     3163    OPVEX("vpcmpeqd %Vx,%Hx,%Wx",    IDX_ParseModRM,     IDX_ParseVexDest,   IDX_UseModRM,   0,         OP_PCMPEQD,     OP_PARM_Vx,      OP_PARM_Hx,     OP_PARM_Wx,     OP_PARM_NONE,   DISOPTYPE_HARMLESS),
     3164    INVALID_OPCODE,
     3165    INVALID_OPCODE,
     3166    INVALID_OPCODE,
     3167    INVALID_OPCODE,
     3168    INVALID_OPCODE,
     3169    OPVEX("vhaddpd %Vpd,%Hpd,%Wpd",  IDX_ParseModRM,     IDX_ParseVexDest,   IDX_UseModRM,   0,         OP_HADDPD,      OP_PARM_Vpd,     OP_PARM_Hpd,    OP_PARM_Wpd,    OP_PARM_NONE,   DISOPTYPE_HARMLESS),
     3170    OPVEX("vhsubpd %Vpd,%Hpd,%Wpd",  IDX_ParseModRM,     IDX_ParseVexDest,   IDX_UseModRM,   0,         OP_HSUBPD,      OP_PARM_Vpd,     OP_PARM_Hpd,    OP_PARM_Wpd,    OP_PARM_NONE,   DISOPTYPE_HARMLESS),
     3171    OPVEX("vmovd/vmovq %Ey,%Vy",     IDX_ParseModRM,     IDX_UseModRM,       0,              0,         OP_MOVD,        OP_PARM_Ey,      OP_PARM_Vy,     OP_PARM_NONE,   OP_PARM_NONE,   DISOPTYPE_HARMLESS),
     3172    OPVEX("vmovdqa %Wx,%Vx",         IDX_ParseModRM,     IDX_UseModRM,       0,              0,         OP_MOVDQA,      OP_PARM_Wx,      OP_PARM_Vx,     OP_PARM_NONE,   OP_PARM_NONE,   DISOPTYPE_HARMLESS),
     3173
     3174    /* 8 */
     3175    INVALID_OPCODE_BLOCK
     3176
     3177    /* 9 */
     3178    INVALID_OPCODE_BLOCK
     3179
     3180    /* a */
     3181    INVALID_OPCODE_BLOCK
     3182
     3183    /* b */
     3184    INVALID_OPCODE_BLOCK
     3185
     3186    /* c */
     3187    INVALID_OPCODE,
     3188    INVALID_OPCODE,
     3189    OPVEX("vcmpps %Vpd,%Hpd,%Wpd,%Ib", IDX_ParseModRM,    IDX_ParseVexDest,   IDX_UseModRM,   IDX_ParseImmByte,  OP_CMPSS,   OP_PARM_Vpd,  OP_PARM_Hpd,  OP_PARM_Wpd,  OP_PARM_Ib,   DISOPTYPE_HARMLESS),
     3190    INVALID_OPCODE,
     3191    // vpinsrw Vdq,Hdq,Ry/Mw,Ib
     3192    OPVEX("vpinsrw %Vdq,%Hdq,%Ry,%Ib", IDX_ParseModRM,    IDX_ParseVexDest,   IDX_UseModRM,   IDX_ParseImmByte,  OP_PINSRW,  OP_PARM_Vdq,  OP_PARM_Hdq,  OP_PARM_Ry,   OP_PARM_Ib,   DISOPTYPE_HARMLESS),
     3193    OPVEX("vpextrw %Gd,%Udq,%Ib",      IDX_ParseModRM,    IDX_UseModRM,       IDX_ParseImmByte,              0,  OP_PEXTRW,  OP_PARM_Gd,   OP_PARM_Udq,  OP_PARM_Ib,   OP_PARM_NONE, DISOPTYPE_HARMLESS),
     3194    OPVEX("vshufpd %Vpd,%Hpd,%Wpd,%Ib",IDX_ParseModRM,    IDX_ParseVexDest,   IDX_UseModRM,   IDX_ParseImmByte,  OP_SHUFPD,  OP_PARM_Vpd,  OP_PARM_Hpd,  OP_PARM_Wpd,  OP_PARM_Ib,   DISOPTYPE_HARMLESS),
     3195    INVALID_OPCODE,
     3196    INVALID_OPCODE,
     3197    INVALID_OPCODE,
     3198    INVALID_OPCODE,
     3199    INVALID_OPCODE,
     3200    INVALID_OPCODE,
     3201    INVALID_OPCODE,
     3202    INVALID_OPCODE,
     3203    INVALID_OPCODE,
     3204
     3205    /* d */
     3206    OPVEX("vaddsubpd %Vpd,%Hpd,%Wpd", IDX_ParseModRM,    IDX_ParseVexDest,   IDX_UseModRM,                0,  OP_ADDSUBPD,  OP_PARM_Vpd,  OP_PARM_Hpd,  OP_PARM_Wpd,  OP_PARM_NONE, DISOPTYPE_HARMLESS),
     3207    OPVEX("vpsrlw %Vx,%Hx,%Wx",       IDX_ParseModRM,    IDX_ParseVexDest,   IDX_UseModRM,                0,  OP_PSRLW,     OP_PARM_Vx,   OP_PARM_Hx,   OP_PARM_Wx,   OP_PARM_NONE, DISOPTYPE_HARMLESS),
     3208    OPVEX("vpsrld %Vx,%Hx,%Wx",       IDX_ParseModRM,    IDX_ParseVexDest,   IDX_UseModRM,                0,  OP_PSRLD,     OP_PARM_Vx,   OP_PARM_Hx,   OP_PARM_Wx,   OP_PARM_NONE, DISOPTYPE_HARMLESS),
     3209    OPVEX("vpsrlq %Vx,%Hx,%Wx",       IDX_ParseModRM,    IDX_ParseVexDest,   IDX_UseModRM,                0,  OP_PSRLQ,     OP_PARM_Vx,   OP_PARM_Hx,   OP_PARM_Wx,   OP_PARM_NONE, DISOPTYPE_HARMLESS),
     3210    OPVEX("vpaddq %Vx,%Hx,%Wx",       IDX_ParseModRM,    IDX_ParseVexDest,   IDX_UseModRM,                0,  OP_PADDQ,     OP_PARM_Vx,   OP_PARM_Hx,   OP_PARM_Wx,   OP_PARM_NONE, DISOPTYPE_HARMLESS),
     3211    OPVEX("vpmullw %Vx,%Hx,%Wx",      IDX_ParseModRM,    IDX_ParseVexDest,   IDX_UseModRM,                0,  OP_PMULLW,    OP_PARM_Vx,   OP_PARM_Hx,   OP_PARM_Wx,   OP_PARM_NONE, DISOPTYPE_HARMLESS),
     3212    OPVEX("vmovq %Wq,%Vq",            IDX_ParseModRM,    IDX_UseModRM,                  0,                0,  OP_MOVQ,      OP_PARM_Wq,   OP_PARM_Vq,   OP_PARM_NONE, OP_PARM_NONE, DISOPTYPE_HARMLESS),
     3213    OPVEX("vpmovmskb %Gd,%Ux",        IDX_ParseModRM,    IDX_UseModRM,                  0,                0,  OP_PMOVMSKB,  OP_PARM_Gd,   OP_PARM_Ux,   OP_PARM_NONE, OP_PARM_NONE, DISOPTYPE_HARMLESS),
     3214    OPVEX("vpsubusb %Vx,%Hx,%Wx",     IDX_ParseModRM,    IDX_ParseVexDest,   IDX_UseModRM,                0,  OP_PSUBUSB,   OP_PARM_Vx,   OP_PARM_Hx,   OP_PARM_Wx,   OP_PARM_NONE, DISOPTYPE_HARMLESS),
     3215    OPVEX("vpsubusw %Vx,%Hx,%Wx",     IDX_ParseModRM,    IDX_ParseVexDest,   IDX_UseModRM,                0,  OP_PSUBUSW,   OP_PARM_Vx,   OP_PARM_Hx,   OP_PARM_Wx,   OP_PARM_NONE, DISOPTYPE_HARMLESS),
     3216    OPVEX("vpminub %Vx,%Hx,%Wx",      IDX_ParseModRM,    IDX_ParseVexDest,   IDX_UseModRM,                0,  OP_PMINUB,    OP_PARM_Vx,   OP_PARM_Hx,   OP_PARM_Wx,   OP_PARM_NONE, DISOPTYPE_HARMLESS),
     3217    OPVEX("vpand %Vx,%Hx,%Wx",        IDX_ParseModRM,    IDX_ParseVexDest,   IDX_UseModRM,                0,  OP_PAND,      OP_PARM_Vx,   OP_PARM_Hx,   OP_PARM_Wx,   OP_PARM_NONE, DISOPTYPE_HARMLESS),
     3218    OPVEX("vpaddusb %Vx,%Hx,%Wx",     IDX_ParseModRM,    IDX_ParseVexDest,   IDX_UseModRM,                0,  OP_PADDUSB,   OP_PARM_Vx,   OP_PARM_Hx,   OP_PARM_Wx,   OP_PARM_NONE, DISOPTYPE_HARMLESS),
     3219    OPVEX("vpaddusw %Vx,%Hx,%Wx",     IDX_ParseModRM,    IDX_ParseVexDest,   IDX_UseModRM,                0,  OP_PADDUSW,   OP_PARM_Vx,   OP_PARM_Hx,   OP_PARM_Wx,   OP_PARM_NONE, DISOPTYPE_HARMLESS),
     3220    OPVEX("vpmaxub %Vx,%Hx,%Wx",      IDX_ParseModRM,    IDX_ParseVexDest,   IDX_UseModRM,                0,  OP_PMAXUB,    OP_PARM_Vx,   OP_PARM_Hx,   OP_PARM_Wx,   OP_PARM_NONE, DISOPTYPE_HARMLESS),
     3221    OPVEX("vpandn %Vx,%Hx,%Wx",       IDX_ParseModRM,    IDX_ParseVexDest,   IDX_UseModRM,                0,  OP_PANDN,     OP_PARM_Vx,   OP_PARM_Hx,   OP_PARM_Wx,   OP_PARM_NONE, DISOPTYPE_HARMLESS),
     3222
     3223    /* e */
     3224    OPVEX("vpavgb %Vx,%Hx,%Wx",       IDX_ParseModRM,    IDX_ParseVexDest,   IDX_UseModRM,                0,  OP_PAVGB,     OP_PARM_Vx,   OP_PARM_Hx,   OP_PARM_Wx,   OP_PARM_NONE, DISOPTYPE_HARMLESS),
     3225    OPVEX("vpsraw %Vx,%Hx,%Wx",       IDX_ParseModRM,    IDX_ParseVexDest,   IDX_UseModRM,                0,  OP_PSRAW,     OP_PARM_Vx,   OP_PARM_Hx,   OP_PARM_Wx,   OP_PARM_NONE, DISOPTYPE_HARMLESS),
     3226    OPVEX("vpsrad %Vx,%Hx,%Wx",       IDX_ParseModRM,    IDX_ParseVexDest,   IDX_UseModRM,                0,  OP_PSRAD,     OP_PARM_Vx,   OP_PARM_Hx,   OP_PARM_Wx,   OP_PARM_NONE, DISOPTYPE_HARMLESS),
     3227    OPVEX("vpavgw %Vx,%Hx,%Wx",       IDX_ParseModRM,    IDX_ParseVexDest,   IDX_UseModRM,                0,  OP_PAVGW,     OP_PARM_Vx,   OP_PARM_Hx,   OP_PARM_Wx,   OP_PARM_NONE, DISOPTYPE_HARMLESS),
     3228    OPVEX("vpmulhuw %Vx,%Hx,%Wx",     IDX_ParseModRM,    IDX_ParseVexDest,   IDX_UseModRM,                0,  OP_PMULHUW,   OP_PARM_Vx,   OP_PARM_Hx,   OP_PARM_Wx,   OP_PARM_NONE, DISOPTYPE_HARMLESS),
     3229    OPVEX("vpmulhw %Vx,%Hx,%Wx",      IDX_ParseModRM,    IDX_ParseVexDest,   IDX_UseModRM,                0,  OP_PMULHW,    OP_PARM_Vx,   OP_PARM_Hx,   OP_PARM_Wx,   OP_PARM_NONE, DISOPTYPE_HARMLESS),
     3230    OPVEX("vcvttpd2dq %Vx,%Wpd",      IDX_ParseModRM,    IDX_UseModRM,                  0,                0,  OP_CVTTPD2DQ, OP_PARM_Vx,   OP_PARM_Wpd,  OP_PARM_NONE, OP_PARM_NONE, DISOPTYPE_HARMLESS),
     3231    OPVEX("vmovntdq %Mx,%Vx",         IDX_ParseModRM,    IDX_UseModRM,                  0,                0,  OP_MOVNTDQ,   OP_PARM_Mx,   OP_PARM_Vx,   OP_PARM_NONE, OP_PARM_NONE, DISOPTYPE_HARMLESS),
     3232    OPVEX("vpsubsb %Vx,%Hx,%Wx",      IDX_ParseModRM,    IDX_ParseVexDest,   IDX_UseModRM,                0,  OP_PSUBSB,    OP_PARM_Vx,   OP_PARM_Hx,   OP_PARM_Wx,   OP_PARM_NONE, DISOPTYPE_HARMLESS),
     3233    OPVEX("vpsubsw %Vx,%Hx,%Wx",      IDX_ParseModRM,    IDX_ParseVexDest,   IDX_UseModRM,                0,  OP_PSUBSW,    OP_PARM_Vx,   OP_PARM_Hx,   OP_PARM_Wx,   OP_PARM_NONE, DISOPTYPE_HARMLESS),
     3234    OPVEX("vpminsw %Vx,%Hx,%Wx",      IDX_ParseModRM,    IDX_ParseVexDest,   IDX_UseModRM,                0,  OP_PMINSW,    OP_PARM_Vx,   OP_PARM_Hx,   OP_PARM_Wx,   OP_PARM_NONE, DISOPTYPE_HARMLESS),
     3235    OPVEX("vpor %Vx,%Hx,%Wx",         IDX_ParseModRM,    IDX_ParseVexDest,   IDX_UseModRM,                0,  OP_POR,       OP_PARM_Vx,   OP_PARM_Hx,   OP_PARM_Wx,   OP_PARM_NONE, DISOPTYPE_HARMLESS),
     3236    OPVEX("vpaddsb %Vx,%Hx,%Wx",      IDX_ParseModRM,    IDX_ParseVexDest,   IDX_UseModRM,                0,  OP_PADDSB,    OP_PARM_Vx,   OP_PARM_Hx,   OP_PARM_Wx,   OP_PARM_NONE, DISOPTYPE_HARMLESS),
     3237    OPVEX("vpaddsw %Vx,%Hx,%Wx",      IDX_ParseModRM,    IDX_ParseVexDest,   IDX_UseModRM,                0,  OP_PADDSW,    OP_PARM_Vx,   OP_PARM_Hx,   OP_PARM_Wx,   OP_PARM_NONE, DISOPTYPE_HARMLESS),
     3238    OPVEX("vpmaxsw %Vx,%Hx,%Wx",      IDX_ParseModRM,    IDX_ParseVexDest,   IDX_UseModRM,                0,  OP_PMAXSW,    OP_PARM_Vx,   OP_PARM_Hx,   OP_PARM_Wx,   OP_PARM_NONE, DISOPTYPE_HARMLESS),
     3239    OPVEX("vpxor %Vx,%Hx,%Wx",        IDX_ParseModRM,    IDX_ParseVexDest,   IDX_UseModRM,                0,  OP_PXOR,      OP_PARM_Vx,   OP_PARM_Hx,   OP_PARM_Wx,   OP_PARM_NONE, DISOPTYPE_HARMLESS),
     3240
     3241    /* f */
     3242    INVALID_OPCODE,
     3243    OPVEX("vpsllw %Vx,%Hx,%Wx",       IDX_ParseModRM,    IDX_ParseVexDest,   IDX_UseModRM,                0,  OP_PSLLW,     OP_PARM_Vx,   OP_PARM_Hx,   OP_PARM_Wx,   OP_PARM_NONE, DISOPTYPE_HARMLESS),
     3244    OPVEX("vpslld %Vx,%Hx,%Wx",       IDX_ParseModRM,    IDX_ParseVexDest,   IDX_UseModRM,                0,  OP_PSLLD,     OP_PARM_Vx,   OP_PARM_Hx,   OP_PARM_Wx,   OP_PARM_NONE, DISOPTYPE_HARMLESS),
     3245    OPVEX("vpsllq %Vx,%Hx,%Wx",       IDX_ParseModRM,    IDX_ParseVexDest,   IDX_UseModRM,                0,  OP_PSLLQ,     OP_PARM_Vx,   OP_PARM_Hx,   OP_PARM_Wx,   OP_PARM_NONE, DISOPTYPE_HARMLESS),
     3246    OPVEX("vpmuludq %Vx,%Hx,%Wx",     IDX_ParseModRM,    IDX_ParseVexDest,   IDX_UseModRM,                0,  OP_PMULUDQ,   OP_PARM_Vx,   OP_PARM_Hx,   OP_PARM_Wx,   OP_PARM_NONE, DISOPTYPE_HARMLESS),
     3247    OPVEX("vpmaddwd %Vx,%Hx,%Wx",     IDX_ParseModRM,    IDX_ParseVexDest,   IDX_UseModRM,                0,  OP_PMADDWD,   OP_PARM_Vx,   OP_PARM_Hx,   OP_PARM_Wx,   OP_PARM_NONE, DISOPTYPE_HARMLESS),
     3248    OPVEX("vpsadbw %Vx,%Hx,%Wx",      IDX_ParseModRM,    IDX_ParseVexDest,   IDX_UseModRM,                0,  OP_PSADBW,    OP_PARM_Vx,   OP_PARM_Hx,   OP_PARM_Wx,   OP_PARM_NONE, DISOPTYPE_HARMLESS),
     3249    OPVEX("vmaskmovdqu %Vdq,%Udq",    IDX_ParseModRM,    IDX_UseModRM,                  0,                0,  OP_MASKMOVDQU,OP_PARM_Vdq,  OP_PARM_Udq,  OP_PARM_NONE, OP_PARM_NONE, DISOPTYPE_HARMLESS),
     3250    OPVEX("vpsubb %Vx,%Hx,%Wx",       IDX_ParseModRM,    IDX_ParseVexDest,   IDX_UseModRM,                0,  OP_PSUBB,     OP_PARM_Vx,   OP_PARM_Hx,   OP_PARM_Wx,   OP_PARM_NONE, DISOPTYPE_HARMLESS),
     3251    OPVEX("vpsubw %Vx,%Hx,%Wx",       IDX_ParseModRM,    IDX_ParseVexDest,   IDX_UseModRM,                0,  OP_PSUBW,     OP_PARM_Vx,   OP_PARM_Hx,   OP_PARM_Wx,   OP_PARM_NONE, DISOPTYPE_HARMLESS),
     3252    OPVEX("vpsubd %Vx,%Hx,%Wx",       IDX_ParseModRM,    IDX_ParseVexDest,   IDX_UseModRM,                0,  OP_PSUBD,     OP_PARM_Vx,   OP_PARM_Hx,   OP_PARM_Wx,   OP_PARM_NONE, DISOPTYPE_HARMLESS),
     3253    OPVEX("vpsubq %Vx,%Hx,%Wx",       IDX_ParseModRM,    IDX_ParseVexDest,   IDX_UseModRM,                0,  OP_PSUBQ,     OP_PARM_Vx,   OP_PARM_Hx,   OP_PARM_Wx,   OP_PARM_NONE, DISOPTYPE_HARMLESS),
     3254    OPVEX("vpaddb %Vx,%Hx,%Wx",       IDX_ParseModRM,    IDX_ParseVexDest,   IDX_UseModRM,                0,  OP_PADDB,     OP_PARM_Vx,   OP_PARM_Hx,   OP_PARM_Wx,   OP_PARM_NONE, DISOPTYPE_HARMLESS),
     3255    OPVEX("vpaddw %Vx,%Hx,%Wx",       IDX_ParseModRM,    IDX_ParseVexDest,   IDX_UseModRM,                0,  OP_PADDW,     OP_PARM_Vx,   OP_PARM_Hx,   OP_PARM_Wx,   OP_PARM_NONE, DISOPTYPE_HARMLESS),
     3256    OPVEX("vpaddd %Vx,%Hx,%Wx",       IDX_ParseModRM,    IDX_ParseVexDest,   IDX_UseModRM,                0,  OP_PADDD,     OP_PARM_Vx,   OP_PARM_Hx,   OP_PARM_Wx,   OP_PARM_NONE, DISOPTYPE_HARMLESS),
     3257    INVALID_OPCODE,
     3258};
     3259
     3260const DISOPCODE g_aMapTwoBytesVex_F2H[256] =
     3261{
     3262    /* 0 */
     3263    INVALID_OPCODE_BLOCK
     3264
     3265    /* 1 */
     3266    OPVEX("vmovsd %Vx,%Hx,%Wsd",      IDX_ParseModRM,    IDX_ParseVexDest,   IDX_UseModRM,                0,  OP_MOVSD,     OP_PARM_Vx,   OP_PARM_Hx,   OP_PARM_Wsd,   OP_PARM_NONE, DISOPTYPE_HARMLESS),
     3267    OPVEX("vmovsd %Wsd,%Hx,%Vsd",     IDX_ParseModRM,    IDX_ParseVexDest,   IDX_UseModRM,                0,  OP_MOVSD,     OP_PARM_Wsd,  OP_PARM_Hx,   OP_PARM_Vsd,   OP_PARM_NONE, DISOPTYPE_HARMLESS),
     3268    OPVEX("vmovddup %Vx,%Wx",         IDX_ParseModRM,    IDX_UseModRM,                  0,                0,  OP_MOVDDUP,   OP_PARM_Vx,   OP_PARM_Wx,   OP_PARM_NONE,  OP_PARM_NONE, DISOPTYPE_HARMLESS),
     3269    INVALID_OPCODE,
     3270    INVALID_OPCODE,
     3271    INVALID_OPCODE,
     3272    INVALID_OPCODE,
     3273    INVALID_OPCODE,
     3274    INVALID_OPCODE,
     3275    INVALID_OPCODE,
     3276    INVALID_OPCODE,
     3277    INVALID_OPCODE,
     3278    INVALID_OPCODE,
     3279    INVALID_OPCODE,
     3280    INVALID_OPCODE,
     3281    INVALID_OPCODE,
     3282
     3283    /* 2 */
     3284    INVALID_OPCODE_BLOCK
     3285
     3286    /* 3 */
     3287    INVALID_OPCODE_BLOCK
     3288
     3289    /* 4 */
     3290    INVALID_OPCODE_BLOCK
     3291
     3292    /* 5 */
     3293    INVALID_OPCODE,
     3294    OPVEX("vsqrtsd %Vsd,%Hsd,%Wsd",   IDX_ParseModRM,    IDX_ParseVexDest,   IDX_UseModRM,                0,  OP_SQRTSD,   OP_PARM_Vsd,   OP_PARM_Hsd,   OP_PARM_Wsd,   OP_PARM_NONE, DISOPTYPE_HARMLESS),
     3295    INVALID_OPCODE,
     3296    INVALID_OPCODE,
     3297    INVALID_OPCODE,
     3298    INVALID_OPCODE,
     3299    INVALID_OPCODE,
     3300    INVALID_OPCODE,
     3301    OPVEX("vaddsd %Vsd,%Hsd,%Wsd",    IDX_ParseModRM,    IDX_ParseVexDest,   IDX_UseModRM,                0,  OP_ADDSD,    OP_PARM_Vsd,   OP_PARM_Hsd,   OP_PARM_Wsd,   OP_PARM_NONE, DISOPTYPE_HARMLESS),
     3302    OPVEX("vmulsd %Vsd,%Hsd,%Wsd",    IDX_ParseModRM,    IDX_ParseVexDest,   IDX_UseModRM,                0,  OP_MULSD,    OP_PARM_Vsd,   OP_PARM_Hsd,   OP_PARM_Wsd,   OP_PARM_NONE, DISOPTYPE_HARMLESS),
     3303    OPVEX("vcvtsd2ss %Vss,%Hx,%Wsd",  IDX_ParseModRM,    IDX_ParseVexDest,   IDX_UseModRM,                0,  OP_CVTSD2SS, OP_PARM_Vss,   OP_PARM_Hx,    OP_PARM_Wsd,   OP_PARM_NONE, DISOPTYPE_HARMLESS),
     3304    INVALID_OPCODE,
     3305    OPVEX("vsubsd %Vsd,%Hsd,%Wsd",    IDX_ParseModRM,    IDX_ParseVexDest,   IDX_UseModRM,                0,  OP_SUBSD,    OP_PARM_Vsd,   OP_PARM_Hsd,   OP_PARM_Wsd,   OP_PARM_NONE, DISOPTYPE_HARMLESS),
     3306    OPVEX("vminsd %Vsd,%Hsd,%Wsd",    IDX_ParseModRM,    IDX_ParseVexDest,   IDX_UseModRM,                0,  OP_MINSD,    OP_PARM_Vsd,   OP_PARM_Hsd,   OP_PARM_Wsd,   OP_PARM_NONE, DISOPTYPE_HARMLESS),
     3307    OPVEX("vdivsd %Vsd,%Hsd,%Wsd",    IDX_ParseModRM,    IDX_ParseVexDest,   IDX_UseModRM,                0,  OP_DIVSD,    OP_PARM_Vsd,   OP_PARM_Hsd,   OP_PARM_Wsd,   OP_PARM_NONE, DISOPTYPE_HARMLESS),
     3308    OPVEX("vmaxsd %Vsd,%Hsd,%Wsd",    IDX_ParseModRM,    IDX_ParseVexDest,   IDX_UseModRM,                0,  OP_MAXSD,    OP_PARM_Vsd,   OP_PARM_Hsd,   OP_PARM_Wsd,   OP_PARM_NONE, DISOPTYPE_HARMLESS),
     3309
     3310    /* 6 */
     3311    INVALID_OPCODE_BLOCK
     3312
     3313    /* 7 */
     3314    OPVEX("vpshuflw %Vx,%Wx,%Ib",     IDX_ParseModRM,    IDX_UseModRM,       IDX_ParseImmByte,            0,  OP_PSHUFLW,  OP_PARM_Vx,    OP_PARM_Wx,   OP_PARM_Ib,   OP_PARM_NONE, DISOPTYPE_HARMLESS),
     3315    INVALID_OPCODE,
     3316    INVALID_OPCODE,
     3317    INVALID_OPCODE,
     3318    INVALID_OPCODE,
     3319    INVALID_OPCODE,
     3320    INVALID_OPCODE,
     3321    INVALID_OPCODE,
     3322    INVALID_OPCODE,
     3323    INVALID_OPCODE,
     3324    INVALID_OPCODE,
     3325    INVALID_OPCODE,
     3326    OPVEX("vhaddps %Vps,%Hps,%Wps",   IDX_ParseModRM,    IDX_ParseVexDest,   IDX_UseModRM,                0,  OP_HADDPS,   OP_PARM_Vps,   OP_PARM_Hps,   OP_PARM_Wps,   OP_PARM_NONE, DISOPTYPE_HARMLESS),
     3327    OPVEX("vhsubps %Vps,%Hps,%Wps",   IDX_ParseModRM,    IDX_ParseVexDest,   IDX_UseModRM,                0,  OP_HSUBPS,   OP_PARM_Vps,   OP_PARM_Hps,   OP_PARM_Wps,   OP_PARM_NONE, DISOPTYPE_HARMLESS),
     3328    INVALID_OPCODE,
     3329    INVALID_OPCODE,
     3330
     3331    /* 8 */
     3332    INVALID_OPCODE_BLOCK
     3333
     3334    /* 9 */
     3335    INVALID_OPCODE_BLOCK
     3336
     3337    /* a */
     3338    INVALID_OPCODE_BLOCK
     3339
     3340    /* b */
     3341    INVALID_OPCODE_BLOCK
     3342
     3343    /* c */
     3344    INVALID_OPCODE,
     3345    INVALID_OPCODE,
     3346    OPVEX("vcmpsd %Vsd,%Hsd,%Wsd,%Ib", IDX_ParseModRM,    IDX_ParseVexDest,   IDX_UseModRM,   IDX_ParseImmByte,  OP_CMPSD, OP_PARM_Vsd,  OP_PARM_Hsd,  OP_PARM_Wsd,  OP_PARM_Ib,    DISOPTYPE_HARMLESS),
     3347    INVALID_OPCODE,
     3348    INVALID_OPCODE,
     3349    INVALID_OPCODE,
     3350    INVALID_OPCODE,
     3351    INVALID_OPCODE,
     3352    INVALID_OPCODE,
     3353    INVALID_OPCODE,
     3354    INVALID_OPCODE,
     3355    INVALID_OPCODE,
     3356    INVALID_OPCODE,
     3357    INVALID_OPCODE,
     3358    INVALID_OPCODE,
     3359    INVALID_OPCODE,
     3360
     3361    /* d */
     3362    OPVEX("vaddsubps %Vps,%Hps,%Wps",  IDX_ParseModRM,    IDX_ParseVexDest,   IDX_UseModRM,                0,  OP_ADDSUBPS,   OP_PARM_Vps,   OP_PARM_Hps,   OP_PARM_Wps,   OP_PARM_NONE, DISOPTYPE_HARMLESS),
     3363    INVALID_OPCODE,
     3364    INVALID_OPCODE,
     3365    INVALID_OPCODE,
     3366    INVALID_OPCODE,
     3367    INVALID_OPCODE,
     3368    INVALID_OPCODE,
     3369    INVALID_OPCODE,
     3370    INVALID_OPCODE,
     3371    INVALID_OPCODE,
     3372    INVALID_OPCODE,
     3373    INVALID_OPCODE,
     3374    INVALID_OPCODE,
     3375    INVALID_OPCODE,
     3376    INVALID_OPCODE,
     3377    INVALID_OPCODE,
     3378
     3379    /* e */
     3380    INVALID_OPCODE,
     3381    INVALID_OPCODE,
     3382    INVALID_OPCODE,
     3383    INVALID_OPCODE,
     3384    INVALID_OPCODE,
     3385    INVALID_OPCODE,
     3386    OPVEX("vcvtpd2dq %Vx,%Wpd",     IDX_ParseModRM,    IDX_UseModRM,       0,                           0,  OP_CVTPD2DQ,  OP_PARM_Vx,   OP_PARM_Wpd,   OP_PARM_NONE, OP_PARM_NONE, DISOPTYPE_HARMLESS),
     3387    INVALID_OPCODE,
     3388    INVALID_OPCODE,
     3389    INVALID_OPCODE,
     3390    INVALID_OPCODE,
     3391    INVALID_OPCODE,
     3392    INVALID_OPCODE,
     3393    INVALID_OPCODE,
     3394    INVALID_OPCODE,
     3395    INVALID_OPCODE,
     3396
     3397    /* f */
     3398    OPVEX("vlddqu %Vx,%Mx",         IDX_ParseModRM,    IDX_UseModRM,       0,                           0,  OP_LDDQU,  OP_PARM_Vx,   OP_PARM_Mx,   OP_PARM_NONE, OP_PARM_NONE, DISOPTYPE_HARMLESS),
     3399    INVALID_OPCODE,
     3400    INVALID_OPCODE,
     3401    INVALID_OPCODE,
     3402    INVALID_OPCODE,
     3403    INVALID_OPCODE,
     3404    INVALID_OPCODE,
     3405    INVALID_OPCODE,
     3406    INVALID_OPCODE,
     3407    INVALID_OPCODE,
     3408    INVALID_OPCODE,
     3409    INVALID_OPCODE,
     3410    INVALID_OPCODE,
     3411    INVALID_OPCODE,
     3412    INVALID_OPCODE,
     3413    INVALID_OPCODE,
     3414};
     3415
     3416/* Vex codes for two bytes opcodes starting with 0Fh with prefix F3H*/
     3417const DISOPCODE g_aMapTwoBytesVex_F3H[256] =
     3418{
     3419
     3420    /* 0 */
     3421    INVALID_OPCODE_BLOCK
     3422
     3423    /* 1 */
     3424    OPVEX("vmovss %Vx,%Hx,%Wss",       IDX_ParseModRM,    IDX_ParseVexDest,   IDX_UseModRM,                0,  OP_MOVSS,     OP_PARM_Vx,   OP_PARM_Hx,   OP_PARM_Wss,   OP_PARM_NONE, DISOPTYPE_HARMLESS),
     3425    OPVEX("vmovss %Wss,%Hx,%Vss",      IDX_ParseModRM,    IDX_ParseVexDest,   IDX_UseModRM,                0,  OP_MOVSS,     OP_PARM_Wss,  OP_PARM_Hx,   OP_PARM_Vss,   OP_PARM_NONE, DISOPTYPE_HARMLESS),
     3426    OPVEX("vmovsldup %Vx,%Wx",         IDX_ParseModRM,    IDX_UseModRM,       0,                           0,  OP_MOVSLDUP,  OP_PARM_Vx,   OP_PARM_Wx,   OP_PARM_NONE,  OP_PARM_NONE, DISOPTYPE_HARMLESS),
     3427    INVALID_OPCODE,
     3428    INVALID_OPCODE,
     3429    INVALID_OPCODE,
     3430    OPVEX("vmovshdup %Vx,%Wx",         IDX_ParseModRM,    IDX_UseModRM,       0,                           0,  OP_MOVSHDUP,  OP_PARM_Vx,   OP_PARM_Wx,   OP_PARM_NONE,  OP_PARM_NONE, DISOPTYPE_HARMLESS),
     3431    INVALID_OPCODE,
     3432    INVALID_OPCODE,
     3433    INVALID_OPCODE,
     3434    INVALID_OPCODE,
     3435    INVALID_OPCODE,
     3436    INVALID_OPCODE,
     3437    INVALID_OPCODE,
     3438    INVALID_OPCODE,
     3439    INVALID_OPCODE,
     3440
     3441    /* 2 */
     3442    INVALID_OPCODE,
     3443    INVALID_OPCODE,
     3444    INVALID_OPCODE,
     3445    INVALID_OPCODE,
     3446    INVALID_OPCODE,
     3447    INVALID_OPCODE,
     3448    INVALID_OPCODE,
     3449    INVALID_OPCODE,
     3450    INVALID_OPCODE,
     3451    INVALID_OPCODE,
     3452    OPVEX("vcvtsi2ss %Vss,%Hss,%Ey",   IDX_ParseModRM,    IDX_ParseVexDest,   IDX_UseModRM,                0,  OP_CVTSI2SS,  OP_PARM_Vss,   OP_PARM_Hss,   OP_PARM_Ey,   OP_PARM_NONE, DISOPTYPE_HARMLESS),
     3453    INVALID_OPCODE,
     3454    OPVEX("vcvttss2si %Gy,%Wss",       IDX_ParseModRM,    IDX_UseModRM,       0,                           0,  OP_CVTTSS2SI, OP_PARM_Gy,    OP_PARM_Wss,   OP_PARM_NONE, OP_PARM_NONE, DISOPTYPE_HARMLESS),
     3455    OPVEX("vcvtss2si %Gy,%Wss",        IDX_ParseModRM,    IDX_UseModRM,       0,                           0,  OP_CVTSS2SI,  OP_PARM_Gy,    OP_PARM_Wss,   OP_PARM_NONE, OP_PARM_NONE, DISOPTYPE_HARMLESS),
     3456    INVALID_OPCODE,
     3457    INVALID_OPCODE,
     3458
     3459    /* 3 */
     3460    INVALID_OPCODE_BLOCK
     3461
     3462    /* 4 */
     3463    INVALID_OPCODE_BLOCK
     3464
     3465    /* 5 */
     3466    INVALID_OPCODE,
     3467    OPVEX("vsqrtss %Vss,%Hss,%Wss",   IDX_ParseModRM,    IDX_ParseVexDest,   IDX_UseModRM,                0,  OP_SQRTSS,     OP_PARM_Vss,   OP_PARM_Hss,   OP_PARM_Wss,  OP_PARM_NONE, DISOPTYPE_HARMLESS),
     3468    OPVEX("vrsqrtss %Vss,%Hss,%Wss",  IDX_ParseModRM,    IDX_ParseVexDest,   IDX_UseModRM,                0,  OP_RSQRTSS,    OP_PARM_Vss,   OP_PARM_Hss,   OP_PARM_Wss,  OP_PARM_NONE, DISOPTYPE_HARMLESS),
     3469    OPVEX("vrcpss %Vss,%Hss,%Wss",    IDX_ParseModRM,    IDX_ParseVexDest,   IDX_UseModRM,                0,  OP_RCPSS,      OP_PARM_Vss,   OP_PARM_Hss,   OP_PARM_Wss,  OP_PARM_NONE, DISOPTYPE_HARMLESS),
     3470    INVALID_OPCODE,
     3471    INVALID_OPCODE,
     3472    INVALID_OPCODE,
     3473    INVALID_OPCODE,
     3474    OPVEX("vaddss %Vss,%Hss,%Wss",    IDX_ParseModRM,    IDX_ParseVexDest,   IDX_UseModRM,                0,  OP_ADDSS,      OP_PARM_Vss,   OP_PARM_Hss,   OP_PARM_Wss,  OP_PARM_NONE, DISOPTYPE_HARMLESS),
     3475    OPVEX("vmulss %Vss,%Hss,%Wss",    IDX_ParseModRM,    IDX_ParseVexDest,   IDX_UseModRM,                0,  OP_MULSS,      OP_PARM_Vss,   OP_PARM_Hss,   OP_PARM_Wss,  OP_PARM_NONE, DISOPTYPE_HARMLESS),
     3476    OPVEX("vcvtss2sd %Vsd,%Hx,%Wss",  IDX_ParseModRM,    IDX_ParseVexDest,   IDX_UseModRM,                0,  OP_CVTSS2SD,   OP_PARM_Vss,   OP_PARM_Hss,   OP_PARM_Wss,  OP_PARM_NONE, DISOPTYPE_HARMLESS),
     3477    OPVEX("vcvttps2dq %Vdq,%Wps",     IDX_ParseModRM,    IDX_UseModRM,       0,                           0,  OP_CVTTPS2DQ,  OP_PARM_Vdq,   OP_PARM_Wps,   OP_PARM_NONE, OP_PARM_NONE, DISOPTYPE_HARMLESS),
     3478    OPVEX("vsubss %Vss,%Hss,%Wss",    IDX_ParseModRM,    IDX_ParseVexDest,   IDX_UseModRM,                0,  OP_SUBSS,      OP_PARM_Vss,   OP_PARM_Hss,   OP_PARM_Wss,  OP_PARM_NONE, DISOPTYPE_HARMLESS),
     3479    OPVEX("vminss %Vss,%Hss,%Wss",    IDX_ParseModRM,    IDX_ParseVexDest,   IDX_UseModRM,                0,  OP_MINSS,      OP_PARM_Vss,   OP_PARM_Hss,   OP_PARM_Wss,  OP_PARM_NONE, DISOPTYPE_HARMLESS),
     3480    OPVEX("vdivss %Vss,%Hss,%Wss",    IDX_ParseModRM,    IDX_ParseVexDest,   IDX_UseModRM,                0,  OP_DIVSS,      OP_PARM_Vss,   OP_PARM_Hss,   OP_PARM_Wss,  OP_PARM_NONE, DISOPTYPE_HARMLESS),
     3481    OPVEX("vmaxss %Vss,%Hss,%Wss",    IDX_ParseModRM,    IDX_ParseVexDest,   IDX_UseModRM,                0,  OP_MAXSS,      OP_PARM_Vss,   OP_PARM_Hss,   OP_PARM_Wss,  OP_PARM_NONE, DISOPTYPE_HARMLESS),
     3482
     3483    /* 6 */
     3484    INVALID_OPCODE,
     3485    INVALID_OPCODE,
     3486    INVALID_OPCODE,
     3487    INVALID_OPCODE,
     3488    INVALID_OPCODE,
     3489    INVALID_OPCODE,
     3490    INVALID_OPCODE,
     3491    INVALID_OPCODE,
     3492    INVALID_OPCODE,
     3493    INVALID_OPCODE,
     3494    INVALID_OPCODE,
     3495    INVALID_OPCODE,
     3496    INVALID_OPCODE,
     3497    INVALID_OPCODE,
     3498    INVALID_OPCODE,
     3499    OPVEX("vmovdqu %Vx,%Wx",          IDX_ParseModRM,    IDX_UseModRM,       0,                           0,  OP_MOVDQU,  OP_PARM_Vx,    OP_PARM_Wx,   OP_PARM_NONE, OP_PARM_NONE, DISOPTYPE_HARMLESS),
     3500
     3501    /* 7 */
     3502    OPVEX("vpshufhw %Vx,%Wx,%Ib",     IDX_ParseModRM,    IDX_UseModRM,        IDX_ParseImmByte,           0,  OP_PSHUFHW, OP_PARM_Vx,    OP_PARM_Wx,   OP_PARM_Ib,   OP_PARM_NONE, DISOPTYPE_HARMLESS),
     3503    INVALID_OPCODE,
     3504    INVALID_OPCODE,
     3505    INVALID_OPCODE,
     3506    INVALID_OPCODE,
     3507    INVALID_OPCODE,
     3508    INVALID_OPCODE,
     3509    INVALID_OPCODE,
     3510    INVALID_OPCODE,
     3511    INVALID_OPCODE,
     3512    INVALID_OPCODE,
     3513    INVALID_OPCODE,
     3514    INVALID_OPCODE,
     3515    INVALID_OPCODE,
     3516    OPVEX("vmovq %Vq,%Wq",            IDX_ParseModRM,    IDX_UseModRM,       0,                           0,  OP_MOVQ,    OP_PARM_Vq,    OP_PARM_Wq,   OP_PARM_NONE, OP_PARM_NONE, DISOPTYPE_HARMLESS),
     3517    OPVEX("vmovdqu %Wx,%Vx",          IDX_ParseModRM,    IDX_UseModRM,       0,                           0,  OP_MOVDQU,  OP_PARM_Wx,    OP_PARM_Vx,   OP_PARM_NONE, OP_PARM_NONE, DISOPTYPE_HARMLESS),
     3518
     3519    /* 8 */
     3520    INVALID_OPCODE_BLOCK
     3521
     3522    /* 9 */
     3523    INVALID_OPCODE_BLOCK
     3524
     3525    /* a */
     3526    INVALID_OPCODE_BLOCK
     3527
     3528    /* b */
     3529    INVALID_OPCODE_BLOCK
     3530
     3531    /* c */
     3532    INVALID_OPCODE,
     3533    INVALID_OPCODE,
     3534    OPVEX("vcmpps %Vss,%Hss,%Wss,%Ib", IDX_ParseModRM,    IDX_ParseVexDest,   IDX_UseModRM,   IDX_ParseImmByte,  OP_CMPSS, OP_PARM_Vss,  OP_PARM_Hss,  OP_PARM_Wss,  OP_PARM_Ib,    DISOPTYPE_HARMLESS),
     3535    INVALID_OPCODE,
     3536    INVALID_OPCODE,
     3537    INVALID_OPCODE,
     3538    INVALID_OPCODE,
     3539    INVALID_OPCODE,
     3540    INVALID_OPCODE,
     3541    INVALID_OPCODE,
     3542    INVALID_OPCODE,
     3543    INVALID_OPCODE,
     3544    INVALID_OPCODE,
     3545    INVALID_OPCODE,
     3546    INVALID_OPCODE,
     3547    INVALID_OPCODE,
     3548
     3549    /* d */
     3550    INVALID_OPCODE_BLOCK
     3551
     3552    /* e */
     3553    INVALID_OPCODE,
     3554    INVALID_OPCODE,
     3555    INVALID_OPCODE,
     3556    INVALID_OPCODE,
     3557    INVALID_OPCODE,
     3558    INVALID_OPCODE,
     3559    OPVEX("vcvtdq2pd %Vx,%Wpd",     IDX_ParseModRM,    IDX_UseModRM,       0,                           0,  OP_CVTDQ2PD,  OP_PARM_Vx,   OP_PARM_Wpd,   OP_PARM_NONE, OP_PARM_NONE, DISOPTYPE_HARMLESS),
     3560    INVALID_OPCODE,
     3561    INVALID_OPCODE,
     3562    INVALID_OPCODE,
     3563    INVALID_OPCODE,
     3564    INVALID_OPCODE,
     3565    INVALID_OPCODE,
     3566    INVALID_OPCODE,
     3567    INVALID_OPCODE,
     3568    INVALID_OPCODE,
     3569
     3570    /* f */
     3571    INVALID_OPCODE_BLOCK
     3572};
     3573
     3574PCDISOPCODE const g_aVexOpcodesMap[3] =
     3575{
     3576    &g_aMapTwoBytesVex[0], // 0fh 2-byte opcodes
     3577    NULL,                  // 0f38h 3-byte opcodes
     3578    NULL,                  // 0f3ah 3-byte opcodes
     3579};
     3580
     3581PCDISOPCODE const g_aVexOpcodesMap_66H[3] =
     3582{
     3583    &g_aMapTwoBytesVex_66H[0], // 0fh 2-byte opcodes
     3584    NULL,                      // 0f38h 3-byte opcodes
     3585    NULL,                      // 0f3ah 3-byte opcodes
     3586};
     3587
     3588PCDISOPCODE const g_aVexOpcodesMap_F2H[3] =
     3589{
     3590    &g_aMapTwoBytesVex_F2H[0], // 0fh 2-byte opcodes
     3591    NULL,                      // 0f38h 3-byte opcodes
     3592    NULL,                      // 0f3ah 3-byte opcodes
     3593};
     3594
     3595PCDISOPCODE const g_aVexOpcodesMap_F3H[3] =
     3596{
     3597    &g_aMapTwoBytesVex_F3H[0], // 0fh 2-byte opcodes
     3598    NULL,                      // 0f38h 3-byte opcodes
     3599    NULL,                      // 0f3ah 3-byte opcodes
     3600};
  • trunk/src/VBox/Disassembler/DisasmTablesX64.cpp

    r46949 r53094  
    285285    OP("retn %Iw",           IDX_ParseImmUshort, 0,                 0,          OP_RETN,        OP_PARM_Iw,      OP_PARM_NONE,   OP_PARM_NONE,   DISOPTYPE_CONTROLFLOW | DISOPTYPE_UNCOND_CONTROLFLOW | DISOPTYPE_FORCED_64_OP_SIZE),
    286286    OP("retn",               0,                  0,                 0,          OP_RETN,        OP_PARM_NONE,    OP_PARM_NONE,   OP_PARM_NONE,   DISOPTYPE_CONTROLFLOW | DISOPTYPE_UNCOND_CONTROLFLOW | DISOPTYPE_FORCED_64_OP_SIZE),
    287     INVALID_OPCODE,
    288     INVALID_OPCODE,
     287    OP("VEX 3-byte",         IDX_ParseVex3b,     0,                 0,          OP_VEX3B,       OP_PARM_NONE,    OP_PARM_NONE,   OP_PARM_NONE,   DISOPTYPE_HARMLESS),
     288    OP("VEX 2-byte",         IDX_ParseVex2b,     0,                 0,          OP_VEX2B,       OP_PARM_NONE,    OP_PARM_NONE,   OP_PARM_NONE,   DISOPTYPE_HARMLESS),
    289289    /* @todo these two are actually group11 */
    290290    OP("mov %Eb,%Ib",        IDX_ParseModRM,     IDX_ParseImmByte,  0,          OP_MOV,         OP_PARM_Eb,      OP_PARM_Ib,     OP_PARM_NONE,   DISOPTYPE_HARMLESS),
  • trunk/src/VBox/Disassembler/testcase/tstDisasm-1A.asm

    r53032 r53094  
    190190        vmread     eax, ebx
    191191        vmwrite    eax, ebx
     192
     193        movd       mm0, [edi]
     194        movq       mm0, [edi]
     195        movq       mm0, mm1
     196
     197        vmovups    xmm0, xmm1
     198        vmovaps    ymm0, ymm1
     199        vunpcklps  xmm0, xmm1, xmm2
     200        vunpcklps  ymm0, ymm1, ymm2
     201
     202        lddqu      xmm1, [ds:ebp+edi*8+00f000001h]
     203        vlddqu     xmm1, [ds:ebp+edi*8+00f000001h]
     204        vlddqu      ymm1, [ds:ebp+edi*8+00f000001h]
    192205
    193206ENDPROC   TestProc32
     
    314327        tzcnt      eax, [edi]
    315328        tzcnt      eax, [edi + 1000h]
     329
     330        vpunpcklbw ymm1, ymm2, ymm3
    316331%endif
    317332
     
    338353        vmwrite    rax, rbx
    339354
     355        getsec
     356
     357        movd       mm0, [rdi]
     358        movq       mm0, [edi]
     359        movq       mm0, mm1
     360
     361        vmovups    xmm0, xmm1
     362        vmovaps    ymm0, ymm1
     363        vunpcklps  xmm0, xmm1, xmm2
     364        vunpcklps  ymm0, ymm1, ymm2
     365        vunpcklps  ymm0, ymm10, ymm2
     366
     367        vmovups    xmm5, xmm9
     368
     369        vcmpps     xmm1, xmm2, xmm3, 12
     370
     371        lddqu      xmm1, [ebp+edi*8+00f000001h]
     372        vlddqu     xmm1, [rbp+rdi*8+00f000001h]
     373        vlddqu     ymm1, [rbp+rdi*8+00f000001h]
     374
    340375        ret
    341376ENDPROC   TestProc64
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