VirtualBox

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


Ignore:
Timestamp:
Oct 29, 2014 2:45:01 PM (10 years ago)
Author:
vboxsync
Message:

DIS: #6249: Added missing 660F38h instructions. Small bug fixes. Unit test updated.

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

Legend:

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

    r53155 r53164  
    14091409};
    14101410
    1411 /** @todo remainder missing (too lazy now) */
     1411/** Three byte opcode map (0x66 0x0F 0x38 0x2x) */
     1412const DISOPCODE g_aThreeByteMapX86_660F38_2[16] =
     1413{
     1414    /* 2 */
     1415    OP("pmovsxbw %Vdq,%Wq",         IDX_ParseModRM,    IDX_UseModRM,    0,          OP_PMOVSX,      OP_PARM_Vdq,          OP_PARM_Wq,      OP_PARM_NONE,   DISOPTYPE_HARMLESS),
     1416    OP("pmovsxbd %Vdq,%Wd",         IDX_ParseModRM,    IDX_UseModRM,    0,          OP_PMOVSX,      OP_PARM_Vdq,          OP_PARM_Wd,      OP_PARM_NONE,   DISOPTYPE_HARMLESS),
     1417    OP("pmovsxbq %Vdq,%Ww",         IDX_ParseModRM,    IDX_UseModRM,    0,          OP_PMOVSX,      OP_PARM_Vdq,          OP_PARM_Ww,      OP_PARM_NONE,   DISOPTYPE_HARMLESS),
     1418    OP("pmovsxwd %Vdq,%Wq",         IDX_ParseModRM,    IDX_UseModRM,    0,          OP_PMOVSX,      OP_PARM_Vdq,          OP_PARM_Wq,      OP_PARM_NONE,   DISOPTYPE_HARMLESS),
     1419    OP("pmovsxwq %Vdq,%Wd",         IDX_ParseModRM,    IDX_UseModRM,    0,          OP_PMOVSX,      OP_PARM_Vdq,          OP_PARM_Wd,      OP_PARM_NONE,   DISOPTYPE_HARMLESS),
     1420    OP("pmovsxdq %Vdq,%Wq",         IDX_ParseModRM,    IDX_UseModRM,    0,          OP_PMOVSX,      OP_PARM_Vdq,          OP_PARM_Wq,      OP_PARM_NONE,   DISOPTYPE_HARMLESS),
     1421    INVALID_OPCODE,
     1422    INVALID_OPCODE,
     1423    OP("pmuldq %Vdq,%Wdq",          IDX_ParseModRM,    IDX_UseModRM,    0,          OP_PMULDQ,      OP_PARM_Vdq,          OP_PARM_Wdq,     OP_PARM_NONE,   DISOPTYPE_HARMLESS),
     1424    OP("pcmpeqq %Vdq,%Wdq",         IDX_ParseModRM,    IDX_UseModRM,    0,          OP_PCMPEQQ,     OP_PARM_Vdq,          OP_PARM_Wdq,     OP_PARM_NONE,   DISOPTYPE_HARMLESS),
     1425    OP("movntdqa %Vdq,%Wdq",        IDX_ParseModRM,    IDX_UseModRM,    0,          OP_MOVNTDQA,    OP_PARM_Vdq,          OP_PARM_Wdq,     OP_PARM_NONE,   DISOPTYPE_HARMLESS),
     1426    OP("packusdw %Vdq,%Wdq",        IDX_ParseModRM,    IDX_UseModRM,    0,          OP_PACKUSDW,    OP_PARM_Vdq,          OP_PARM_Wdq,     OP_PARM_NONE,   DISOPTYPE_HARMLESS),
     1427    INVALID_OPCODE,
     1428    INVALID_OPCODE,
     1429    INVALID_OPCODE,
     1430    INVALID_OPCODE,
     1431};
     1432
     1433/** Three byte opcode map (0x66 0x0F 0x38 0x3x) */
     1434const DISOPCODE g_aThreeByteMapX86_660F38_3[16] =
     1435{
     1436    /* 3 */
     1437    OP("pmovzxbw %Vdq,%Wq",         IDX_ParseModRM,    IDX_UseModRM,     0,          OP_PMOVZX,     OP_PARM_Vdq,          OP_PARM_Wq,      OP_PARM_NONE,   DISOPTYPE_HARMLESS),
     1438    OP("pmovzxbd %Vdq,%Wd",         IDX_ParseModRM,    IDX_UseModRM,     0,          OP_PMOVZX,     OP_PARM_Vdq,          OP_PARM_Wd,      OP_PARM_NONE,   DISOPTYPE_HARMLESS),
     1439    OP("pmovzxbq %Vdq,%Ww",         IDX_ParseModRM,    IDX_UseModRM,     0,          OP_PMOVZX,     OP_PARM_Vdq,          OP_PARM_Ww,      OP_PARM_NONE,   DISOPTYPE_HARMLESS),
     1440    OP("pmovzxwd %Vdq,%Wq",         IDX_ParseModRM,    IDX_UseModRM,     0,          OP_PMOVZX,     OP_PARM_Vdq,          OP_PARM_Wq,      OP_PARM_NONE,   DISOPTYPE_HARMLESS),
     1441    OP("pmovzxwq %Vdq,%Wd",         IDX_ParseModRM,    IDX_UseModRM,     0,          OP_PMOVZX,     OP_PARM_Vdq,          OP_PARM_Wd,      OP_PARM_NONE,   DISOPTYPE_HARMLESS),
     1442    OP("pmovzxdq %Vdq,%Wq",         IDX_ParseModRM,    IDX_UseModRM,     0,          OP_PMOVZX,     OP_PARM_Vdq,          OP_PARM_Wq,      OP_PARM_NONE,   DISOPTYPE_HARMLESS),
     1443    INVALID_OPCODE,
     1444    OP("pcmpgtq %Vdq,%Wdq",         IDX_ParseModRM,    IDX_UseModRM,     0,          OP_PCMPGTQ,    OP_PARM_Vdq,          OP_PARM_Wdq,     OP_PARM_NONE,   DISOPTYPE_HARMLESS),
     1445    OP("pminsb %Vdq,%Wdq",          IDX_ParseModRM,    IDX_UseModRM,     0,          OP_PMINSB,     OP_PARM_Vdq,          OP_PARM_Wdq,     OP_PARM_NONE,   DISOPTYPE_HARMLESS),
     1446    OP("pminsd %Vdq,%Wdq",          IDX_ParseModRM,    IDX_UseModRM,     0,          OP_PMINSB,     OP_PARM_Vdq,          OP_PARM_Wdq,     OP_PARM_NONE,   DISOPTYPE_HARMLESS),
     1447    OP("pminuw %Vdq,%Wdq",          IDX_ParseModRM,    IDX_UseModRM,     0,          OP_PMINUW,     OP_PARM_Vdq,          OP_PARM_Wdq,     OP_PARM_NONE,   DISOPTYPE_HARMLESS),
     1448    OP("pminud %Vdq,%Wdq",          IDX_ParseModRM,    IDX_UseModRM,     0,          OP_PMINUD,     OP_PARM_Vdq,          OP_PARM_Wdq,     OP_PARM_NONE,   DISOPTYPE_HARMLESS),
     1449    OP("pmaxsb %Vdq,%Wdq",          IDX_ParseModRM,    IDX_UseModRM,     0,          OP_PMAXSB,     OP_PARM_Vdq,          OP_PARM_Wdq,     OP_PARM_NONE,   DISOPTYPE_HARMLESS),
     1450    OP("pmaxsd %Vdq,%Wdq",          IDX_ParseModRM,    IDX_UseModRM,     0,          OP_PMAXSD,     OP_PARM_Vdq,          OP_PARM_Wdq,     OP_PARM_NONE,   DISOPTYPE_HARMLESS),
     1451    OP("pmaxuw %Vdq,%Wdq",          IDX_ParseModRM,    IDX_UseModRM,     0,          OP_PMAXUW,     OP_PARM_Vdq,          OP_PARM_Wdq,     OP_PARM_NONE,   DISOPTYPE_HARMLESS),
     1452    OP("pmaxud %Vdq,%Wdq",          IDX_ParseModRM,    IDX_UseModRM,     0,          OP_PMAXUD,     OP_PARM_Vdq,          OP_PARM_Wdq,     OP_PARM_NONE,   DISOPTYPE_HARMLESS),
     1453};
     1454
     1455/** Three byte opcode map (0x66 0x0F 0x38 0x4x) */
     1456const DISOPCODE g_aThreeByteMapX86_660F38_4[16] =
     1457{
     1458    /* 4 */
     1459    OP("pmulld %Vdq,%Wdq",          IDX_ParseModRM,    IDX_UseModRM,     0,          OP_PMULLD,     OP_PARM_Vdq,          OP_PARM_Wdq,     OP_PARM_NONE,   DISOPTYPE_HARMLESS),
     1460    OP("phminposuw %Vdq,%Wdq",      IDX_ParseModRM,    IDX_UseModRM,     0,          OP_PHMINPOSUW, OP_PARM_Vdq,          OP_PARM_Wdq,     OP_PARM_NONE,   DISOPTYPE_HARMLESS),
     1461    INVALID_OPCODE,
     1462    INVALID_OPCODE,
     1463    INVALID_OPCODE,
     1464    INVALID_OPCODE,
     1465    INVALID_OPCODE,
     1466    INVALID_OPCODE,
     1467    INVALID_OPCODE,
     1468    INVALID_OPCODE,
     1469    INVALID_OPCODE,
     1470    INVALID_OPCODE,
     1471    INVALID_OPCODE,
     1472    INVALID_OPCODE,
     1473    INVALID_OPCODE,
     1474    INVALID_OPCODE,
     1475};
    14121476
    14131477/** Three byte opcode map (0x66 0x0F 0x38 0x8x) */
     
    14151479{
    14161480    /* 8 */
    1417     OP("invept %Gd,%Mdq",       IDX_ParseModRM,     IDX_UseModRM,   0,          OP_INVEPT,      OP_PARM_Gd,          OP_PARM_Mdq,     OP_PARM_NONE,   DISOPTYPE_HARMLESS),
    1418     OP("invvpid %Gd,%Mdq",      IDX_ParseModRM,     IDX_UseModRM,   0,          OP_INVEPT,      OP_PARM_Gd,          OP_PARM_Mdq,     OP_PARM_NONE,   DISOPTYPE_HARMLESS),
    1419     INVALID_OPCODE,
    1420     INVALID_OPCODE,
    1421     INVALID_OPCODE,
    1422     INVALID_OPCODE,
    1423     INVALID_OPCODE,
    1424     INVALID_OPCODE,
    1425     INVALID_OPCODE,
    1426     INVALID_OPCODE,
    1427     INVALID_OPCODE,
    1428     INVALID_OPCODE,
    1429     INVALID_OPCODE,
    1430     INVALID_OPCODE,
    1431     INVALID_OPCODE,
    1432     INVALID_OPCODE,
     1481    OP("invept %Gy,%Mdq",       IDX_ParseModRM,     IDX_UseModRM,   0,          OP_INVEPT,      OP_PARM_Gy,          OP_PARM_Mdq,     OP_PARM_NONE,   DISOPTYPE_HARMLESS | DISOPTYPE_FORCED_64_OP_SIZE),
     1482    OP("invvpid %Gy,%Mdq",      IDX_ParseModRM,     IDX_UseModRM,   0,          OP_INVVPID,     OP_PARM_Gy,          OP_PARM_Mdq,     OP_PARM_NONE,   DISOPTYPE_HARMLESS | DISOPTYPE_FORCED_64_OP_SIZE),
     1483    OP("invpcid %Gy,%Mdq",      IDX_ParseModRM,     IDX_UseModRM,   0,          OP_INVPCID,     OP_PARM_Gy,          OP_PARM_Mdq,     OP_PARM_NONE,   DISOPTYPE_HARMLESS | DISOPTYPE_FORCED_64_OP_SIZE),
     1484    INVALID_OPCODE,
     1485    INVALID_OPCODE,
     1486    INVALID_OPCODE,
     1487    INVALID_OPCODE,
     1488    INVALID_OPCODE,
     1489    INVALID_OPCODE,
     1490    INVALID_OPCODE,
     1491    INVALID_OPCODE,
     1492    INVALID_OPCODE,
     1493    INVALID_OPCODE,
     1494    INVALID_OPCODE,
     1495    INVALID_OPCODE,
     1496    INVALID_OPCODE,
     1497};
     1498
     1499/** Three byte opcode map (0x66 0x0F 0x38 0xDx) */
     1500const DISOPCODE g_aThreeByteMapX86_660F38_D[16] =
     1501{
     1502    /* D */
     1503    INVALID_OPCODE,
     1504    INVALID_OPCODE,
     1505    INVALID_OPCODE,
     1506    INVALID_OPCODE,
     1507    INVALID_OPCODE,
     1508    INVALID_OPCODE,
     1509    INVALID_OPCODE,
     1510    INVALID_OPCODE,
     1511    INVALID_OPCODE,
     1512    INVALID_OPCODE,
     1513    INVALID_OPCODE,
     1514    OP("aesimc %Vdq,%Wdq",         IDX_ParseModRM,    IDX_UseModRM,       0,      OP_AESIMC,     OP_PARM_Vdq,  OP_PARM_Wdq,  OP_PARM_NONE, DISOPTYPE_HARMLESS),
     1515    OP("aesenc %Vdq,%Hdq,%Wdq",    IDX_ParseModRM,    IDX_UseModRM,       0,      OP_AESENC,     OP_PARM_Vdq,  OP_PARM_Wdq,  OP_PARM_NONE, DISOPTYPE_HARMLESS),
     1516    OP("aesenclast %Vdq,%Wdq",     IDX_ParseModRM,    IDX_UseModRM,       0,      OP_AESENCLAST, OP_PARM_Vdq,  OP_PARM_Wdq,  OP_PARM_NONE, DISOPTYPE_HARMLESS),
     1517    OP("aesdec %Vdq,%Wdq",         IDX_ParseModRM,    IDX_UseModRM,       0,      OP_AESDEC,     OP_PARM_Vdq,  OP_PARM_Wdq,  OP_PARM_NONE, DISOPTYPE_HARMLESS),
     1518    OP("aesdeclast %Vdq,%Wdq",     IDX_ParseModRM,    IDX_UseModRM,       0,      OP_AESDECLAST, OP_PARM_Vdq,  OP_PARM_Wdq,  OP_PARM_NONE, DISOPTYPE_HARMLESS),
    14331519};
    14341520
    14351521const DISOPCODE g_aThreeByteMapX86_660F38_F[16] =
    14361522{
    1437     /* 8 */
     1523    /* F */
    14381524    OP("movbe %Gw,%Mw",       IDX_ParseModRM,     IDX_UseModRM,   0,          OP_MOVBEGM,      OP_PARM_Gw,          OP_PARM_Mw,     OP_PARM_NONE,   DISOPTYPE_HARMLESS),
    14391525    OP("movbe %Mw,%Gw",       IDX_ParseModRM,     IDX_UseModRM,   0,          OP_MOVBEMG,      OP_PARM_Mw,          OP_PARM_Gw,     OP_PARM_NONE,   DISOPTYPE_HARMLESS),
     
    14621548    &g_aThreeByteMapX86_660F38_1[0],
    14631549    /* 2 */
    1464     NULL,
     1550    &g_aThreeByteMapX86_660F38_2[0],
    14651551    /* 3 */
    1466     NULL,
     1552    &g_aThreeByteMapX86_660F38_3[0],
    14671553    /* 4 */
    1468     NULL,
     1554    &g_aThreeByteMapX86_660F38_4[0],
    14691555    /* 5 */
    14701556    NULL,
     
    14841570    NULL,
    14851571    /* d */
    1486     NULL,
     1572    &g_aThreeByteMapX86_660F38_D[0],
    14871573    /* e */
    14881574    NULL,
  • trunk/src/VBox/Disassembler/testcase/tstDisasm-1A.asm

    r53155 r53164  
    163163        tzcnt      eax, [edi + 1000h]
    164164        vpmovsxbw  ymm0, xmm1
     165        vpmovzxbq  ymm1, [100h]
    165166%endif
    166167
     
    216217        vblendvps xmm0, xmm1, xmm2, xmm3
    217218        vblendvps ymm0, ymm1, ymm2, ymm3
     219
     220        aesimc xmm0, xmm1
     221
     222        pmovzxbq xmm0, xmm1
     223        pmovzxbq xmm1, [100h]
    218224
    219225ENDPROC   TestProc32
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