VirtualBox

Changeset 40266 in vbox


Ignore:
Timestamp:
Feb 27, 2012 10:09:01 PM (13 years ago)
Author:
vboxsync
svn:sync-xref-src-repo-rev:
76486
Message:

Added stubs for most instructions.

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

Legend:

Unmodified
Added
Removed
  • TabularUnified trunk/src/VBox/VMM/VMMAll/IEMAll.cpp

    r40256 r40266  
    25972597        NOREF(a_Name0); \
    25982598        return VERR_IEM_INSTR_NOT_IMPLEMENTED; \
     2599    } \
     2600    typedef int ignore_semicolon
     2601
     2602/** Stubs an opcode which currently should raise \#UD. */
     2603#define FNIEMOP_UD_STUB(a_Name) \
     2604    FNIEMOP_DEF(a_Name) \
     2605    { \
     2606        Log(("Unsupported instruction %Rfn\n", __FUNCTION__)); \
     2607        return IEMOP_RAISE_INVALID_OPCODE(); \
     2608    } \
     2609    typedef int ignore_semicolon
     2610
     2611/** Stubs an opcode which currently should raise \#UD. */
     2612#define FNIEMOP_UD_STUB_1(a_Name, a_Type0, a_Name0) \
     2613    FNIEMOP_DEF_1(a_Name, a_Type0, a_Name0) \
     2614    { \
     2615        NOREF(a_Name0); \
     2616        Log(("Unsupported instruction %Rfn\n", __FUNCTION__)); \
     2617        return IEMOP_RAISE_INVALID_OPCODE(); \
    25992618    } \
    26002619    typedef int ignore_semicolon
  • TabularUnified trunk/src/VBox/VMM/VMMAll/IEMAllInstructions.cpp.h

    r40256 r40266  
    739739
    740740
     741/** Opcode 0x0f 0x01 0xd8. */
     742FNIEMOP_UD_STUB(iemOp_Grp7_Amd_vmrun);
     743
     744/** Opcode 0x0f 0x01 0xd9. */
     745FNIEMOP_UD_STUB(iemOp_Grp7_Amd_vmmcall);
     746
     747/** Opcode 0x0f 0x01 0xda. */
     748FNIEMOP_UD_STUB(iemOp_Grp7_Amd_vmload);
     749
     750/** Opcode 0x0f 0x01 0xdb. */
     751FNIEMOP_UD_STUB(iemOp_Grp7_Amd_vmsave);
     752
     753/** Opcode 0x0f 0x01 0xdc. */
     754FNIEMOP_UD_STUB(iemOp_Grp7_Amd_stgi);
     755
     756/** Opcode 0x0f 0x01 0xdd. */
     757FNIEMOP_UD_STUB(iemOp_Grp7_Amd_clgi);
     758
     759/** Opcode 0x0f 0x01 0xde. */
     760FNIEMOP_UD_STUB(iemOp_Grp7_Amd_skinit);
     761
     762/** Opcode 0x0f 0x01 0xdf. */
     763FNIEMOP_UD_STUB(iemOp_Grp7_Amd_invlpga);
     764
    741765/** Opcode 0x0f 0x01 /4. */
    742766FNIEMOP_DEF_1(iemOp_Grp7_smsw, uint8_t, bRm)
     
    891915            if ((bRm & X86_MODRM_MOD_MASK) != (3 << X86_MODRM_MOD_SHIFT))
    892916                return FNIEMOP_CALL_1(iemOp_Grp7_lidt, bRm);
    893             return IEMOP_RAISE_INVALID_OPCODE();
     917            switch (bRm & X86_MODRM_RM_MASK)
     918            {
     919                case 0: return FNIEMOP_CALL(iemOp_Grp7_Amd_vmrun);
     920                case 1: return FNIEMOP_CALL(iemOp_Grp7_Amd_vmmcall);
     921                case 2: return FNIEMOP_CALL(iemOp_Grp7_Amd_vmload);
     922                case 3: return FNIEMOP_CALL(iemOp_Grp7_Amd_vmsave);
     923                case 4: return FNIEMOP_CALL(iemOp_Grp7_Amd_stgi);
     924                case 5: return FNIEMOP_CALL(iemOp_Grp7_Amd_clgi);
     925                case 6: return FNIEMOP_CALL(iemOp_Grp7_Amd_skinit);
     926                case 7: return FNIEMOP_CALL(iemOp_Grp7_Amd_invlpga);
     927                IEM_NOT_REACHED_DEFAULT_CASE_RET();
     928            }
    894929
    895930        case 4:
     
    9871022/** Opcode 0x0f 0x0e. */
    9881023FNIEMOP_STUB(iemOp_femms);
     1024
     1025
     1026/** Opcode 0x0f 0x0f 0x0c. */
     1027FNIEMOP_STUB(iemOp_3Dnow_pi2fw_Pq_Qq);
     1028
     1029/** Opcode 0x0f 0x0f 0x0d. */
     1030FNIEMOP_STUB(iemOp_3Dnow_pi2fd_Pq_Qq);
     1031
     1032/** Opcode 0x0f 0x0f 0x1c. */
     1033FNIEMOP_STUB(iemOp_3Dnow_pf2fw_Pq_Qq);
     1034
     1035/** Opcode 0x0f 0x0f 0x1d. */
     1036FNIEMOP_STUB(iemOp_3Dnow_pf2fd_Pq_Qq);
     1037
     1038/** Opcode 0x0f 0x0f 0x8a. */
     1039FNIEMOP_STUB(iemOp_3Dnow_pfnacc_Pq_Qq);
     1040
     1041/** Opcode 0x0f 0x0f 0x8e. */
     1042FNIEMOP_STUB(iemOp_3Dnow_pfpnacc_Pq_Qq);
     1043
     1044/** Opcode 0x0f 0x0f 0x90. */
     1045FNIEMOP_STUB(iemOp_3Dnow_pfcmpge_Pq_Qq);
     1046
     1047/** Opcode 0x0f 0x0f 0x94. */
     1048FNIEMOP_STUB(iemOp_3Dnow_pfmin_Pq_Qq);
     1049
     1050/** Opcode 0x0f 0x0f 0x96. */
     1051FNIEMOP_STUB(iemOp_3Dnow_pfrcp_Pq_Qq);
     1052
     1053/** Opcode 0x0f 0x0f 0x97. */
     1054FNIEMOP_STUB(iemOp_3Dnow_pfrsqrt_Pq_Qq);
     1055
     1056/** Opcode 0x0f 0x0f 0x9a. */
     1057FNIEMOP_STUB(iemOp_3Dnow_pfsub_Pq_Qq);
     1058
     1059/** Opcode 0x0f 0x0f 0x9e. */
     1060FNIEMOP_STUB(iemOp_3Dnow_pfadd_PQ_Qq);
     1061
     1062/** Opcode 0x0f 0x0f 0xa0. */
     1063FNIEMOP_STUB(iemOp_3Dnow_pfcmpgt_Pq_Qq);
     1064
     1065/** Opcode 0x0f 0x0f 0xa4. */
     1066FNIEMOP_STUB(iemOp_3Dnow_pfmax_Pq_Qq);
     1067
     1068/** Opcode 0x0f 0x0f 0xa6. */
     1069FNIEMOP_STUB(iemOp_3Dnow_pfrcpit1_Pq_Qq);
     1070
     1071/** Opcode 0x0f 0x0f 0xa7. */
     1072FNIEMOP_STUB(iemOp_3Dnow_pfrsqit1_Pq_Qq);
     1073
     1074/** Opcode 0x0f 0x0f 0xaa. */
     1075FNIEMOP_STUB(iemOp_3Dnow_pfsubr_Pq_Qq);
     1076
     1077/** Opcode 0x0f 0x0f 0xae. */
     1078FNIEMOP_STUB(iemOp_3Dnow_pfacc_PQ_Qq);
     1079
     1080/** Opcode 0x0f 0x0f 0xb0. */
     1081FNIEMOP_STUB(iemOp_3Dnow_pfcmpeq_Pq_Qq);
     1082
     1083/** Opcode 0x0f 0x0f 0xb4. */
     1084FNIEMOP_STUB(iemOp_3Dnow_pfmul_Pq_Qq);
     1085
     1086/** Opcode 0x0f 0x0f 0xb6. */
     1087FNIEMOP_STUB(iemOp_3Dnow_pfrcpit2_Pq_Qq);
     1088
     1089/** Opcode 0x0f 0x0f 0xb7. */
     1090FNIEMOP_STUB(iemOp_3Dnow_pmulhrw_Pq_Qq);
     1091
     1092/** Opcode 0x0f 0x0f 0xbb. */
     1093FNIEMOP_STUB(iemOp_3Dnow_pswapd_Pq_Qq);
     1094
     1095/** Opcode 0x0f 0x0f 0xbf. */
     1096FNIEMOP_STUB(iemOp_3Dnow_pavgusb_PQ_Qq);
     1097
     1098
    9891099/** Opcode 0x0f 0x0f. */
    990 FNIEMOP_STUB(iemOp_3Dnow);
     1100FNIEMOP_DEF(iemOp_3Dnow)
     1101{
     1102    if (!IEM_IS_AMD_CPUID_FEATURE_PRESENT_EDX(X86_CPUID_AMD_FEATURE_EDX_3DNOW))
     1103    {
     1104        IEMOP_MNEMONIC("3Dnow");
     1105        return IEMOP_RAISE_INVALID_OPCODE();
     1106    }
     1107
     1108    /* This is pretty sparse, use switch instead of table. */
     1109    uint8_t b; IEM_OPCODE_GET_NEXT_U8(&b);
     1110    switch (b)
     1111    {
     1112        case 0x0c: return FNIEMOP_CALL(iemOp_3Dnow_pi2fw_Pq_Qq);
     1113        case 0x0d: return FNIEMOP_CALL(iemOp_3Dnow_pi2fd_Pq_Qq);
     1114        case 0x1c: return FNIEMOP_CALL(iemOp_3Dnow_pf2fw_Pq_Qq);
     1115        case 0x1d: return FNIEMOP_CALL(iemOp_3Dnow_pf2fd_Pq_Qq);
     1116        case 0x8a: return FNIEMOP_CALL(iemOp_3Dnow_pfnacc_Pq_Qq);
     1117        case 0x8e: return FNIEMOP_CALL(iemOp_3Dnow_pfpnacc_Pq_Qq);
     1118        case 0x90: return FNIEMOP_CALL(iemOp_3Dnow_pfcmpge_Pq_Qq);
     1119        case 0x94: return FNIEMOP_CALL(iemOp_3Dnow_pfmin_Pq_Qq);
     1120        case 0x96: return FNIEMOP_CALL(iemOp_3Dnow_pfrcp_Pq_Qq);
     1121        case 0x97: return FNIEMOP_CALL(iemOp_3Dnow_pfrsqrt_Pq_Qq);
     1122        case 0x9a: return FNIEMOP_CALL(iemOp_3Dnow_pfsub_Pq_Qq);
     1123        case 0x9e: return FNIEMOP_CALL(iemOp_3Dnow_pfadd_PQ_Qq);
     1124        case 0xa0: return FNIEMOP_CALL(iemOp_3Dnow_pfcmpgt_Pq_Qq);
     1125        case 0xa4: return FNIEMOP_CALL(iemOp_3Dnow_pfmax_Pq_Qq);
     1126        case 0xa6: return FNIEMOP_CALL(iemOp_3Dnow_pfrcpit1_Pq_Qq);
     1127        case 0xa7: return FNIEMOP_CALL(iemOp_3Dnow_pfrsqit1_Pq_Qq);
     1128        case 0xaa: return FNIEMOP_CALL(iemOp_3Dnow_pfsubr_Pq_Qq);
     1129        case 0xae: return FNIEMOP_CALL(iemOp_3Dnow_pfacc_PQ_Qq);
     1130        case 0xb0: return FNIEMOP_CALL(iemOp_3Dnow_pfcmpeq_Pq_Qq);
     1131        case 0xb4: return FNIEMOP_CALL(iemOp_3Dnow_pfmul_Pq_Qq);
     1132        case 0xb6: return FNIEMOP_CALL(iemOp_3Dnow_pfrcpit2_Pq_Qq);
     1133        case 0xb7: return FNIEMOP_CALL(iemOp_3Dnow_pmulhrw_Pq_Qq);
     1134        case 0xbb: return FNIEMOP_CALL(iemOp_3Dnow_pswapd_Pq_Qq);
     1135        case 0xbf: return FNIEMOP_CALL(iemOp_3Dnow_pavgusb_PQ_Qq);
     1136        default:
     1137            return IEMOP_RAISE_INVALID_OPCODE();
     1138    }
     1139}
     1140
     1141
    9911142/** Opcode 0x0f 0x10. */
    9921143FNIEMOP_STUB(iemOp_movups_Vps_Wps__movupd_Vpd_Wpd__movss_Vss_Wss__movsd_Vsd_Wsd);
     
    12211372FNIEMOP_STUB(iemOp_getsec);
    12221373/** Opcode 0x0f 0x38. */
    1223 FNIEMOP_STUB(iemOp_3byte_Esc_A4);
    1224 /** Opcode 0x0f 0x39. */
    1225 FNIEMOP_STUB(iemOp_3byte_Esc_A5);
     1374FNIEMOP_UD_STUB(iemOp_3byte_Esc_A4); /* Here there be dragons... */
     1375/** Opcode 0x0f 0x3a. */
     1376FNIEMOP_UD_STUB(iemOp_3byte_Esc_A5); /* Here there be dragons... */
    12261377/** Opcode 0x0f 0x3c (?). */
    12271378FNIEMOP_STUB(iemOp_movnti_Gv_Ev);
     
    15251676/** Opcode 0x0f 0x70. */
    15261677FNIEMOP_STUB(iemOp_pshufw_Pq_Qq_Ib__pshufd_Vdq_Wdq_Ib__pshufhw_Vdq_Wdq_Ib__pshuflq_Vdq_Wdq_Ib);
     1678
     1679/** Opcode 0x0f 0x71 11/2. */
     1680FNIEMOP_STUB_1(iemOp_Grp12_psrlw_Nq_Ib,  uint8_t, bRm);
     1681
     1682/** Opcode 0x66 0x0f 0x71 11/2. */
     1683FNIEMOP_STUB_1(iemOp_Grp12_psrlw_Udq_Ib, uint8_t, bRm);
     1684
     1685/** Opcode 0x0f 0x71 11/4. */
     1686FNIEMOP_STUB_1(iemOp_Grp12_psraw_Nq_Ib,  uint8_t, bRm);
     1687
     1688/** Opcode 0x66 0x0f 0x71 11/4. */
     1689FNIEMOP_STUB_1(iemOp_Grp12_psraw_Udq_Ib, uint8_t, bRm);
     1690
     1691/** Opcode 0x0f 0x71 11/6. */
     1692FNIEMOP_STUB_1(iemOp_Grp12_psllw_Nq_Ib,  uint8_t, bRm);
     1693
     1694/** Opcode 0x66 0x0f 0x71 11/6. */
     1695FNIEMOP_STUB_1(iemOp_Grp12_psllw_Udq_Ib, uint8_t, bRm);
     1696
     1697
    15271698/** Opcode 0x0f 0x71. */
    1528 FNIEMOP_STUB(iemOp_Grp12);
     1699FNIEMOP_DEF(iemOp_Grp12)
     1700{
     1701    uint8_t bRm; IEM_OPCODE_GET_NEXT_U8(&bRm);
     1702    if ((bRm & X86_MODRM_MOD_MASK) != (3 << X86_MODRM_MOD_SHIFT))
     1703        return IEMOP_RAISE_INVALID_OPCODE();
     1704    switch ((bRm >> X86_MODRM_REG_SHIFT) & X86_MODRM_REG_SMASK)
     1705    {
     1706        case 0: case 1: case 3: case 5: case 7:
     1707            return IEMOP_RAISE_INVALID_OPCODE();
     1708        case 2:
     1709            switch (pIemCpu->fPrefixes & (IEM_OP_PRF_SIZE_OP | IEM_OP_PRF_REPZ | IEM_OP_PRF_REPNZ))
     1710            {
     1711                case 0:                     return FNIEMOP_CALL_1(iemOp_Grp12_psrlw_Nq_Ib, bRm);
     1712                case IEM_OP_PRF_SIZE_OP:    return FNIEMOP_CALL_1(iemOp_Grp12_psrlw_Udq_Ib, bRm);
     1713                default:                    return IEMOP_RAISE_INVALID_OPCODE();
     1714            }
     1715        case 4:
     1716            switch (pIemCpu->fPrefixes & (IEM_OP_PRF_SIZE_OP | IEM_OP_PRF_REPZ | IEM_OP_PRF_REPNZ))
     1717            {
     1718                case 0:                     return FNIEMOP_CALL_1(iemOp_Grp12_psraw_Nq_Ib, bRm);
     1719                case IEM_OP_PRF_SIZE_OP:    return FNIEMOP_CALL_1(iemOp_Grp12_psraw_Udq_Ib, bRm);
     1720                default:                    return IEMOP_RAISE_INVALID_OPCODE();
     1721            }
     1722        case 6:
     1723            switch (pIemCpu->fPrefixes & (IEM_OP_PRF_SIZE_OP | IEM_OP_PRF_REPZ | IEM_OP_PRF_REPNZ))
     1724            {
     1725                case 0:                     return FNIEMOP_CALL_1(iemOp_Grp12_psllw_Nq_Ib, bRm);
     1726                case IEM_OP_PRF_SIZE_OP:    return FNIEMOP_CALL_1(iemOp_Grp12_psllw_Udq_Ib, bRm);
     1727                default:                    return IEMOP_RAISE_INVALID_OPCODE();
     1728            }
     1729        IEM_NOT_REACHED_DEFAULT_CASE_RET();
     1730    }
     1731}
     1732
     1733
     1734/** Opcode 0x0f 0x72 11/2. */
     1735FNIEMOP_STUB_1(iemOp_Grp13_psrld_Nq_Ib,  uint8_t, bRm);
     1736
     1737/** Opcode 0x66 0x0f 0x72 11/2. */
     1738FNIEMOP_STUB_1(iemOp_Grp13_psrld_Udq_Ib, uint8_t, bRm);
     1739
     1740/** Opcode 0x0f 0x72 11/4. */
     1741FNIEMOP_STUB_1(iemOp_Grp13_psrad_Nq_Ib,  uint8_t, bRm);
     1742
     1743/** Opcode 0x66 0x0f 0x72 11/4. */
     1744FNIEMOP_STUB_1(iemOp_Grp13_psrad_Udq_Ib, uint8_t, bRm);
     1745
     1746/** Opcode 0x0f 0x72 11/6. */
     1747FNIEMOP_STUB_1(iemOp_Grp13_pslld_Nq_Ib,  uint8_t, bRm);
     1748
     1749/** Opcode 0x66 0x0f 0x72 11/6. */
     1750FNIEMOP_STUB_1(iemOp_Grp13_pslld_Udq_Ib, uint8_t, bRm);
     1751
     1752
    15291753/** Opcode 0x0f 0x72. */
    1530 FNIEMOP_STUB(iemOp_Grp13);
     1754FNIEMOP_DEF(iemOp_Grp13)
     1755{
     1756    uint8_t bRm; IEM_OPCODE_GET_NEXT_U8(&bRm);
     1757    if ((bRm & X86_MODRM_MOD_MASK) != (3 << X86_MODRM_MOD_SHIFT))
     1758        return IEMOP_RAISE_INVALID_OPCODE();
     1759    switch ((bRm >> X86_MODRM_REG_SHIFT) & X86_MODRM_REG_SMASK)
     1760    {
     1761        case 0: case 1: case 3: case 5: case 7:
     1762            return IEMOP_RAISE_INVALID_OPCODE();
     1763        case 2:
     1764            switch (pIemCpu->fPrefixes & (IEM_OP_PRF_SIZE_OP | IEM_OP_PRF_REPZ | IEM_OP_PRF_REPNZ))
     1765            {
     1766                case 0:                     return FNIEMOP_CALL_1(iemOp_Grp13_psrld_Nq_Ib, bRm);
     1767                case IEM_OP_PRF_SIZE_OP:    return FNIEMOP_CALL_1(iemOp_Grp13_psrld_Udq_Ib, bRm);
     1768                default:                    return IEMOP_RAISE_INVALID_OPCODE();
     1769            }
     1770        case 4:
     1771            switch (pIemCpu->fPrefixes & (IEM_OP_PRF_SIZE_OP | IEM_OP_PRF_REPZ | IEM_OP_PRF_REPNZ))
     1772            {
     1773                case 0:                     return FNIEMOP_CALL_1(iemOp_Grp13_psrad_Nq_Ib, bRm);
     1774                case IEM_OP_PRF_SIZE_OP:    return FNIEMOP_CALL_1(iemOp_Grp13_psrad_Udq_Ib, bRm);
     1775                default:                    return IEMOP_RAISE_INVALID_OPCODE();
     1776            }
     1777        case 6:
     1778            switch (pIemCpu->fPrefixes & (IEM_OP_PRF_SIZE_OP | IEM_OP_PRF_REPZ | IEM_OP_PRF_REPNZ))
     1779            {
     1780                case 0:                     return FNIEMOP_CALL_1(iemOp_Grp13_pslld_Nq_Ib, bRm);
     1781                case IEM_OP_PRF_SIZE_OP:    return FNIEMOP_CALL_1(iemOp_Grp13_pslld_Udq_Ib, bRm);
     1782                default:                    return IEMOP_RAISE_INVALID_OPCODE();
     1783            }
     1784        IEM_NOT_REACHED_DEFAULT_CASE_RET();
     1785    }
     1786}
     1787
     1788
     1789/** Opcode 0x0f 0x73 11/2. */
     1790FNIEMOP_STUB_1(iemOp_Grp14_psrlq_Nq_Ib,   uint8_t, bRm);
     1791
     1792/** Opcode 0x66 0x0f 0x73 11/2. */
     1793FNIEMOP_STUB_1(iemOp_Grp14_psrlq_Udq_Ib,  uint8_t, bRm);
     1794
     1795/** Opcode 0x66 0x0f 0x73 11/3. */
     1796FNIEMOP_STUB_1(iemOp_Grp14_psrldq_Udq_Ib, uint8_t, bRm);
     1797
     1798/** Opcode 0x0f 0x73 11/6. */
     1799FNIEMOP_STUB_1(iemOp_Grp14_psllq_Nq_Ib,   uint8_t, bRm);
     1800
     1801/** Opcode 0x66 0x0f 0x73 11/6. */
     1802FNIEMOP_STUB_1(iemOp_Grp14_psllq_Udq_Ib,  uint8_t, bRm);
     1803
     1804/** Opcode 0x66 0x0f 0x73 11/7. */
     1805FNIEMOP_STUB_1(iemOp_Grp14_pslldq_Udq_Ib, uint8_t, bRm);
     1806
     1807
    15311808/** Opcode 0x0f 0x73. */
    1532 FNIEMOP_STUB(iemOp_Grp14);
     1809FNIEMOP_DEF(iemOp_Grp14)
     1810{
     1811    uint8_t bRm; IEM_OPCODE_GET_NEXT_U8(&bRm);
     1812    if ((bRm & X86_MODRM_MOD_MASK) != (3 << X86_MODRM_MOD_SHIFT))
     1813        return IEMOP_RAISE_INVALID_OPCODE();
     1814    switch ((bRm >> X86_MODRM_REG_SHIFT) & X86_MODRM_REG_SMASK)
     1815    {
     1816        case 0: case 1: case 4: case 5:
     1817            return IEMOP_RAISE_INVALID_OPCODE();
     1818        case 2:
     1819            switch (pIemCpu->fPrefixes & (IEM_OP_PRF_SIZE_OP | IEM_OP_PRF_REPZ | IEM_OP_PRF_REPNZ))
     1820            {
     1821                case 0:                     return FNIEMOP_CALL_1(iemOp_Grp14_psrlq_Nq_Ib, bRm);
     1822                case IEM_OP_PRF_SIZE_OP:    return FNIEMOP_CALL_1(iemOp_Grp14_psrlq_Udq_Ib, bRm);
     1823                default:                    return IEMOP_RAISE_INVALID_OPCODE();
     1824            }
     1825        case 3:
     1826            switch (pIemCpu->fPrefixes & (IEM_OP_PRF_SIZE_OP | IEM_OP_PRF_REPZ | IEM_OP_PRF_REPNZ))
     1827            {
     1828                case IEM_OP_PRF_SIZE_OP:    return FNIEMOP_CALL_1(iemOp_Grp14_psrldq_Udq_Ib, bRm);
     1829                default:                    return IEMOP_RAISE_INVALID_OPCODE();
     1830            }
     1831        case 6:
     1832            switch (pIemCpu->fPrefixes & (IEM_OP_PRF_SIZE_OP | IEM_OP_PRF_REPZ | IEM_OP_PRF_REPNZ))
     1833            {
     1834                case 0:                     return FNIEMOP_CALL_1(iemOp_Grp14_psllq_Nq_Ib, bRm);
     1835                case IEM_OP_PRF_SIZE_OP:    return FNIEMOP_CALL_1(iemOp_Grp14_psllq_Udq_Ib, bRm);
     1836                default:                    return IEMOP_RAISE_INVALID_OPCODE();
     1837            }
     1838        case 7:
     1839            switch (pIemCpu->fPrefixes & (IEM_OP_PRF_SIZE_OP | IEM_OP_PRF_REPZ | IEM_OP_PRF_REPNZ))
     1840            {
     1841                case IEM_OP_PRF_SIZE_OP:    return FNIEMOP_CALL_1(iemOp_Grp14_pslldq_Udq_Ib, bRm);
     1842                default:                    return IEMOP_RAISE_INVALID_OPCODE();
     1843            }
     1844        IEM_NOT_REACHED_DEFAULT_CASE_RET();
     1845    }
     1846}
     1847
     1848
    15331849/** Opcode 0x0f 0x74. */
    15341850FNIEMOP_STUB(iemOp_pcmpeqb_Pq_Qq__pcmpeqb_Vdq_Wdq);
     
    15401856FNIEMOP_STUB(iemOp_emms);
    15411857/** Opcode 0x0f 0x78. */
    1542 FNIEMOP_STUB(iemOp_vmread);
     1858FNIEMOP_UD_STUB(iemOp_vmread_AmdGrp17);
    15431859/** Opcode 0x0f 0x79. */
    1544 FNIEMOP_STUB(iemOp_vmwrite);
     1860FNIEMOP_UD_STUB(iemOp_vmwrite);
    15451861/** Opcode 0x0f 0x7c. */
    15461862FNIEMOP_STUB(iemOp_haddpd_Vdp_Wpd__haddps_Vps_Wps);
     
    34043720
    34053721/** Opcode 0x0f 0xae mem/4. */
    3406 FNIEMOP_STUB_1(iemOp_Grp15_xsave,    uint8_t, bRm);
     3722FNIEMOP_UD_STUB_1(iemOp_Grp15_xsave,    uint8_t, bRm);
    34073723
    34083724/** Opcode 0x0f 0xae mem/5. */
    3409 FNIEMOP_STUB_1(iemOp_Grp15_xrstor,   uint8_t, bRm);
     3725FNIEMOP_UD_STUB_1(iemOp_Grp15_xrstor,   uint8_t, bRm);
    34103726
    34113727/** Opcode 0x0f 0xae mem/6. */
    3412 FNIEMOP_STUB_1(iemOp_Grp15_xsaveopt, uint8_t, bRm);
     3728FNIEMOP_UD_STUB_1(iemOp_Grp15_xsaveopt, uint8_t, bRm);
    34133729
    34143730/** Opcode 0x0f 0xae mem/7. */
     
    34253741
    34263742/** Opcode 0xf3 0x0f 0xae 11b/0. */
    3427 FNIEMOP_STUB_1(iemOp_Grp15_rdfsbase, uint8_t, bRm);
     3743FNIEMOP_UD_STUB_1(iemOp_Grp15_rdfsbase, uint8_t, bRm);
    34283744
    34293745/** Opcode 0xf3 0x0f 0xae 11b/1. */
    3430 FNIEMOP_STUB_1(iemOp_Grp15_rdgsbase, uint8_t, bRm);
     3746FNIEMOP_UD_STUB_1(iemOp_Grp15_rdgsbase, uint8_t, bRm);
    34313747
    34323748/** Opcode 0xf3 0x0f 0xae 11b/2. */
    3433 FNIEMOP_STUB_1(iemOp_Grp15_wrfsbase, uint8_t, bRm);
     3749FNIEMOP_UD_STUB_1(iemOp_Grp15_wrfsbase, uint8_t, bRm);
    34343750
    34353751/** Opcode 0xf3 0x0f 0xae 11b/3. */
    3436 FNIEMOP_STUB_1(iemOp_Grp15_wrgsbase, uint8_t, bRm);
     3752FNIEMOP_UD_STUB_1(iemOp_Grp15_wrgsbase, uint8_t, bRm);
    34373753
    34383754
     
    37664082/** Opcode 0x0f 0xb8. */
    37674083FNIEMOP_STUB(iemOp_popcnt_Gv_Ev_jmpe);
     4084
     4085
    37684086/** Opcode 0x0f 0xb9. */
    3769 FNIEMOP_STUB(iemOp_Grp10);
     4087FNIEMOP_DEF(iemOp_Grp10)
     4088{
     4089    Log(("iemOp_Grp10 -> #UD\n"));
     4090    return IEMOP_RAISE_INVALID_OPCODE();
     4091}
    37704092
    37714093
     
    43274649/** Opcode 0x0f 0xc2. */
    43284650FNIEMOP_STUB(iemOp_cmpps_Vps_Wps_Ib__cmppd_Vpd_Wpd_Ib__cmpss_Vss_Wss_Ib__cmpsd_Vsd_Wsd_Ib);
     4651
    43294652/** Opcode 0x0f 0xc3. */
    43304653FNIEMOP_STUB(iemOp_movnti_My_Gy);
     4654
    43314655/** Opcode 0x0f 0xc4. */
    43324656FNIEMOP_STUB(iemOp_pinsrw_Pq_Ry_Mw_Ib__pinsrw_Vdq_Ry_Mw_Ib);
     4657
    43334658/** Opcode 0x0f 0xc5. */
    43344659FNIEMOP_STUB(iemOp_pextrw_Gd_Nq_Ib__pextrw_Gd_Udq_Ib);
     4660
    43354661/** Opcode 0x0f 0xc6. */
    43364662FNIEMOP_STUB(iemOp_shufps_Vps_Wps_Ib__shufdp_Vpd_Wpd_Ib);
     4663
     4664/** Opcode 0x0f 0xc7 !11/1. */
     4665FNIEMOP_STUB_1(iemOp_Grp9_cmpxchg8b_Mq, uint8_t, bRm);
     4666
     4667/** Opcode REX.W 0x0f 0xc7 !11/1. */
     4668FNIEMOP_UD_STUB_1(iemOp_Grp9_cmpxchg16b_Mdq, uint8_t, bRm);
     4669
     4670/** Opcode 0x0f 0xc7 11/6. */
     4671FNIEMOP_UD_STUB_1(iemOp_Grp9_rdrand_Rv, uint8_t, bRm);
     4672
     4673/** Opcode 0x0f 0xc7 !11/6. */
     4674FNIEMOP_UD_STUB_1(iemOp_Grp9_vmptrld_Mq, uint8_t, bRm);
     4675
     4676/** Opcode 0x66 0x0f 0xc7 !11/6. */
     4677FNIEMOP_UD_STUB_1(iemOp_Grp9_vmclear_Mq, uint8_t, bRm);
     4678
     4679/** Opcode 0xf3 0x0f 0xc7 !11/6. */
     4680FNIEMOP_UD_STUB_1(iemOp_Grp9_vmxon_Mq, uint8_t, bRm);
     4681
     4682/** Opcode [0xf3] 0x0f 0xc7 !11/7. */
     4683FNIEMOP_UD_STUB_1(iemOp_Grp9_vmptrst_Mq, uint8_t, bRm);
     4684
     4685
    43374686/** Opcode 0x0f 0xc7. */
    4338 FNIEMOP_STUB(iemOp_Grp9);
     4687FNIEMOP_DEF(iemOp_Grp9)
     4688{
     4689    /** @todo Testcase: Check mixing 0x66 and 0xf3. Check the effect of 0xf2. */
     4690    uint8_t bRm; IEM_OPCODE_GET_NEXT_U8(&bRm);
     4691    switch ((bRm >> X86_MODRM_REG_SHIFT) & X86_MODRM_REG_SMASK)
     4692    {
     4693        case 0: case 2: case 3: case 4: case 5:
     4694            return IEMOP_RAISE_INVALID_OPCODE();
     4695        case 1:
     4696            /** @todo Testcase: Check prefix effects on cmpxchg8b/16b. */
     4697            if (   (bRm & X86_MODRM_MOD_MASK) == (3 << X86_MODRM_MOD_SHIFT)
     4698                || (pIemCpu->fPrefixes & (IEM_OP_PRF_SIZE_OP | IEM_OP_PRF_REPZ))) /** @todo Testcase: AMD seems to express a different idea here wrt prefixes. */
     4699                return IEMOP_RAISE_INVALID_OPCODE();
     4700            if (bRm & IEM_OP_PRF_SIZE_REX_W)
     4701                return FNIEMOP_CALL_1(iemOp_Grp9_cmpxchg16b_Mdq, bRm);
     4702            return FNIEMOP_CALL_1(iemOp_Grp9_cmpxchg8b_Mq, bRm);
     4703        case 6:
     4704            if ((bRm & X86_MODRM_MOD_MASK) == (3 << X86_MODRM_MOD_SHIFT))
     4705                return FNIEMOP_CALL_1(iemOp_Grp9_rdrand_Rv, bRm);
     4706            switch (pIemCpu->fPrefixes & (IEM_OP_PRF_SIZE_OP | IEM_OP_PRF_REPZ))
     4707            {
     4708                case 0:
     4709                    return FNIEMOP_CALL_1(iemOp_Grp9_vmptrld_Mq, bRm);
     4710                case IEM_OP_PRF_SIZE_OP:
     4711                    return FNIEMOP_CALL_1(iemOp_Grp9_vmclear_Mq, bRm);
     4712                case IEM_OP_PRF_REPZ:
     4713                    return FNIEMOP_CALL_1(iemOp_Grp9_vmxon_Mq, bRm);
     4714                default:
     4715                    return IEMOP_RAISE_INVALID_OPCODE();
     4716            }
     4717        case 7:
     4718            switch (pIemCpu->fPrefixes & (IEM_OP_PRF_SIZE_OP | IEM_OP_PRF_REPZ))
     4719            {
     4720                case 0:
     4721                case IEM_OP_PRF_REPZ:
     4722                    return FNIEMOP_CALL_1(iemOp_Grp9_vmptrst_Mq, bRm);
     4723                default:
     4724                    return IEMOP_RAISE_INVALID_OPCODE();
     4725            }
     4726        IEM_NOT_REACHED_DEFAULT_CASE_RET();
     4727    }
     4728}
    43394729
    43404730
     
    45434933const PFNIEMOP g_apfnTwoByteMap[256] =
    45444934{
    4545     /* 0x00 */  iemOp_Grp6,             iemOp_Grp7,             iemOp_lar_Gv_Ew,        iemOp_lsl_Gv_Ew,
    4546     /* 0x04 */  iemOp_Invalid,          iemOp_syscall,          iemOp_clts,             iemOp_sysret,
    4547     /* 0x08 */  iemOp_invd,             iemOp_wbinvd,           iemOp_Invalid,          iemOp_ud2,
    4548     /* 0x0c */  iemOp_Invalid,          iemOp_nop_Ev_GrpP,      iemOp_femms,            iemOp_3Dnow,
     4935    /* 0x00 */  iemOp_Grp6,
     4936    /* 0x01 */  iemOp_Grp7,
     4937    /* 0x02 */  iemOp_lar_Gv_Ew,
     4938    /* 0x03 */  iemOp_lsl_Gv_Ew,
     4939    /* 0x04 */  iemOp_Invalid,
     4940    /* 0x05 */  iemOp_syscall,
     4941    /* 0x06 */  iemOp_clts,
     4942    /* 0x07 */  iemOp_sysret,
     4943    /* 0x08 */  iemOp_invd,
     4944    /* 0x09 */  iemOp_wbinvd,
     4945    /* 0x0a */  iemOp_Invalid,
     4946    /* 0x0b */  iemOp_ud2,
     4947    /* 0x0c */  iemOp_Invalid,
     4948    /* 0x0d */  iemOp_nop_Ev_GrpP,
     4949    /* 0x0e */  iemOp_femms,
     4950    /* 0x0f */  iemOp_3Dnow,
    45494951    /* 0x10 */  iemOp_movups_Vps_Wps__movupd_Vpd_Wpd__movss_Vss_Wss__movsd_Vsd_Wsd,
    45504952    /* 0x11 */  iemOp_movups_Wps_Vps__movupd_Wpd_Vpd__movss_Wss_Vss__movsd_Vsd_Wsd,
     
    45554957    /* 0x16 */  iemOp_movhps_Vq_Mq__movlhps_Vq_Uq__movhpd_Vq_Mq__movshdup_Vq_Wq,
    45564958    /* 0x17 */  iemOp_movhps_Mq_Vq__movhpd_Mq_Vq,
    4557     /* 0x18 */  iemOp_prefetch_Grp16,   iemOp_nop_Ev,           iemOp_nop_Ev,           iemOp_nop_Ev,
    4558     /* 0x1c */  iemOp_nop_Ev,           iemOp_nop_Ev,           iemOp_nop_Ev,           iemOp_nop_Ev,
    4559     /* 0x20 */  iemOp_mov_Rd_Cd,        iemOp_mov_Rd_Dd,        iemOp_mov_Cd_Rd,        iemOp_mov_Dd_Rd,
    4560     /* 0x24 */  iemOp_mov_Rd_Td,        iemOp_Invalid,          iemOp_mov_Td_Rd,        iemOp_Invalid,
     4959    /* 0x18 */  iemOp_prefetch_Grp16,
     4960    /* 0x19 */  iemOp_nop_Ev,
     4961    /* 0x1a */  iemOp_nop_Ev,
     4962    /* 0x1b */  iemOp_nop_Ev,
     4963    /* 0x1c */  iemOp_nop_Ev,
     4964    /* 0x1d */  iemOp_nop_Ev,
     4965    /* 0x1e */  iemOp_nop_Ev,
     4966    /* 0x1f */  iemOp_nop_Ev,
     4967    /* 0x20 */  iemOp_mov_Rd_Cd,
     4968    /* 0x21 */  iemOp_mov_Rd_Dd,
     4969    /* 0x22 */  iemOp_mov_Cd_Rd,
     4970    /* 0x23 */  iemOp_mov_Dd_Rd,
     4971    /* 0x24 */  iemOp_mov_Rd_Td,
     4972    /* 0x25 */  iemOp_Invalid,
     4973    /* 0x26 */  iemOp_mov_Td_Rd,
     4974    /* 0x27 */  iemOp_Invalid,
    45614975    /* 0x28 */  iemOp_movaps_Vps_Wps__movapd_Vpd_Wpd,
    45624976    /* 0x29 */  iemOp_movaps_Wps_Vps__movapd_Wpd_Vpd,
     
    45674981    /* 0x2e */  iemOp_ucomiss_Vss_Wss__ucomisd_Vsd_Wsd,
    45684982    /* 0x2f */  iemOp_comiss_Vss_Wss__comisd_Vsd_Wsd,
    4569     /* 0x30 */  iemOp_wrmsr,            iemOp_rdtsc,            iemOp_rdmsr,            iemOp_rdpmc,
    4570     /* 0x34 */  iemOp_sysenter,         iemOp_sysexit,          iemOp_Invalid,          iemOp_getsec,
    4571     /* 0x38 */  iemOp_3byte_Esc_A4,     iemOp_Invalid,          iemOp_3byte_Esc_A5,     iemOp_Invalid,
    4572     /* 0x3c */  iemOp_movnti_Gv_Ev/*?*/,iemOp_Invalid,          iemOp_Invalid,          iemOp_Invalid,
    4573     /* 0x40 */  iemOp_cmovo_Gv_Ev,      iemOp_cmovno_Gv_Ev,     iemOp_cmovc_Gv_Ev,      iemOp_cmovnc_Gv_Ev,
    4574     /* 0x44 */  iemOp_cmove_Gv_Ev,      iemOp_cmovne_Gv_Ev,     iemOp_cmovbe_Gv_Ev,     iemOp_cmovnbe_Gv_Ev,
    4575     /* 0x48 */  iemOp_cmovs_Gv_Ev,      iemOp_cmovns_Gv_Ev,     iemOp_cmovp_Gv_Ev,      iemOp_cmovnp_Gv_Ev,
    4576     /* 0x4c */  iemOp_cmovl_Gv_Ev,      iemOp_cmovnl_Gv_Ev,     iemOp_cmovle_Gv_Ev,     iemOp_cmovnle_Gv_Ev,
     4983    /* 0x30 */  iemOp_wrmsr,
     4984    /* 0x31 */  iemOp_rdtsc,
     4985    /* 0x32 */  iemOp_rdmsr,
     4986    /* 0x33 */  iemOp_rdpmc,
     4987    /* 0x34 */  iemOp_sysenter,
     4988    /* 0x35 */  iemOp_sysexit,
     4989    /* 0x36 */  iemOp_Invalid,
     4990    /* 0x37 */  iemOp_getsec,
     4991    /* 0x38 */  iemOp_3byte_Esc_A4,
     4992    /* 0x39 */  iemOp_Invalid,
     4993    /* 0x3a */  iemOp_3byte_Esc_A5,
     4994    /* 0x3b */  iemOp_Invalid,
     4995    /* 0x3c */  iemOp_movnti_Gv_Ev/*??*/,
     4996    /* 0x3d */  iemOp_Invalid,
     4997    /* 0x3e */  iemOp_Invalid,
     4998    /* 0x3f */  iemOp_Invalid,
     4999    /* 0x40 */  iemOp_cmovo_Gv_Ev,
     5000    /* 0x41 */  iemOp_cmovno_Gv_Ev,
     5001    /* 0x42 */  iemOp_cmovc_Gv_Ev,
     5002    /* 0x43 */  iemOp_cmovnc_Gv_Ev,
     5003    /* 0x44 */  iemOp_cmove_Gv_Ev,
     5004    /* 0x45 */  iemOp_cmovne_Gv_Ev,
     5005    /* 0x46 */  iemOp_cmovbe_Gv_Ev,
     5006    /* 0x47 */  iemOp_cmovnbe_Gv_Ev,
     5007    /* 0x48 */  iemOp_cmovs_Gv_Ev,
     5008    /* 0x49 */  iemOp_cmovns_Gv_Ev,
     5009    /* 0x4a */  iemOp_cmovp_Gv_Ev,
     5010    /* 0x4b */  iemOp_cmovnp_Gv_Ev,
     5011    /* 0x4c */  iemOp_cmovl_Gv_Ev,
     5012    /* 0x4d */  iemOp_cmovnl_Gv_Ev,
     5013    /* 0x4e */  iemOp_cmovle_Gv_Ev,
     5014    /* 0x4f */  iemOp_cmovnle_Gv_Ev,
    45775015    /* 0x50 */  iemOp_movmskps_Gy_Ups__movmskpd_Gy_Upd,
    45785016    /* 0x51 */  iemOp_sqrtps_Wps_Vps__sqrtpd_Wpd_Vpd__sqrtss_Vss_Wss__sqrtsd_Vsd_Wsd,
     
    46155053    /* 0x76 */  iemOp_pcmped_Pq_Qq__pcmpeqd_Vdq_Wdq,
    46165054    /* 0x77 */  iemOp_emms,
    4617     /* 0x78 */  iemOp_vmread,           iemOp_vmwrite,          iemOp_Invalid,          iemOp_Invalid,
     5055    /* 0x78 */  iemOp_vmread_AmdGrp17,
     5056    /* 0x79 */  iemOp_vmwrite,
     5057    /* 0x7a */  iemOp_Invalid,
     5058    /* 0x7b */  iemOp_Invalid,
    46185059    /* 0x7c */  iemOp_haddpd_Vdp_Wpd__haddps_Vps_Wps,
    46195060    /* 0x7d */  iemOp_hsubpd_Vpd_Wpd__hsubps_Vps_Wps,
    46205061    /* 0x7e */  iemOp_movd_q_Ey_Pd__movd_q_Ey_Vy__movq_Vq_Wq,
    46215062    /* 0x7f */  iemOp_movq_Qq_Pq__movq_movdqa_Wdq_Vdq__movdqu_Wdq_Vdq,
    4622     /* 0x80 */  iemOp_jo_Jv,            iemOp_jno_Jv,           iemOp_jc_Jv,            iemOp_jnc_Jv,
    4623     /* 0x84 */  iemOp_je_Jv,            iemOp_jne_Jv,           iemOp_jbe_Jv,           iemOp_jnbe_Jv,
    4624     /* 0x88 */  iemOp_js_Jv,            iemOp_jns_Jv,           iemOp_jp_Jv,            iemOp_jnp_Jv,
    4625     /* 0x8c */  iemOp_jl_Jv,            iemOp_jnl_Jv,           iemOp_jle_Jv,           iemOp_jnle_Jv,
    4626     /* 0x90 */  iemOp_seto_Eb,          iemOp_setno_Eb,         iemOp_setc_Eb,          iemOp_setnc_Eb,
    4627     /* 0x94 */  iemOp_sete_Eb,          iemOp_setne_Eb,         iemOp_setbe_Eb,         iemOp_setnbe_Eb,
    4628     /* 0x98 */  iemOp_sets_Eb,          iemOp_setns_Eb,         iemOp_setp_Eb,          iemOp_setnp_Eb,
    4629     /* 0x9c */  iemOp_setl_Eb,          iemOp_setnl_Eb,         iemOp_setle_Eb,         iemOp_setnle_Eb,
    4630     /* 0xa0 */  iemOp_push_fs,          iemOp_pop_fs,           iemOp_cpuid,            iemOp_bt_Ev_Gv,
    4631     /* 0xa4 */  iemOp_shld_Ev_Gv_Ib,    iemOp_shld_Ev_Gv_CL,    iemOp_Invalid,          iemOp_Invalid,
    4632     /* 0xa8 */  iemOp_push_gs,          iemOp_pop_gs,           iemOp_rsm,              iemOp_bts_Ev_Gv,
    4633     /* 0xac */  iemOp_shrd_Ev_Gv_Ib,    iemOp_shrd_Ev_Gv_CL,    iemOp_Grp15,            iemOp_imul_Gv_Ev,
    4634     /* 0xb0 */  iemOp_cmpxchg_Eb_Gb,    iemOp_cmpxchg_Ev_Gv,    iemOp_lss_Gv_Mp,        iemOp_btr_Ev_Gv,
    4635     /* 0xb4 */  iemOp_lfs_Gv_Mp,        iemOp_lgs_Gv_Mp,        iemOp_movzx_Gv_Eb,      iemOp_movzx_Gv_Ew,
    4636     /* 0xb8 */  iemOp_popcnt_Gv_Ev_jmpe,iemOp_Grp10,            iemOp_Grp8,             iemOp_btc_Ev_Gv,
    4637     /* 0xbc */  iemOp_bsf_Gv_Ev,        iemOp_bsr_Gv_Ev,        iemOp_movsx_Gv_Eb,      iemOp_movsx_Gv_Ew,
     5063    /* 0x80 */  iemOp_jo_Jv,
     5064    /* 0x81 */  iemOp_jno_Jv,
     5065    /* 0x82 */  iemOp_jc_Jv,
     5066    /* 0x83 */  iemOp_jnc_Jv,
     5067    /* 0x84 */  iemOp_je_Jv,
     5068    /* 0x85 */  iemOp_jne_Jv,
     5069    /* 0x86 */  iemOp_jbe_Jv,
     5070    /* 0x87 */  iemOp_jnbe_Jv,
     5071    /* 0x88 */  iemOp_js_Jv,
     5072    /* 0x89 */  iemOp_jns_Jv,
     5073    /* 0x8a */  iemOp_jp_Jv,
     5074    /* 0x8b */  iemOp_jnp_Jv,
     5075    /* 0x8c */  iemOp_jl_Jv,
     5076    /* 0x8d */  iemOp_jnl_Jv,
     5077    /* 0x8e */  iemOp_jle_Jv,
     5078    /* 0x8f */  iemOp_jnle_Jv,
     5079    /* 0x90 */  iemOp_seto_Eb,
     5080    /* 0x91 */  iemOp_setno_Eb,
     5081    /* 0x92 */  iemOp_setc_Eb,
     5082    /* 0x93 */  iemOp_setnc_Eb,
     5083    /* 0x94 */  iemOp_sete_Eb,
     5084    /* 0x95 */  iemOp_setne_Eb,
     5085    /* 0x96 */  iemOp_setbe_Eb,
     5086    /* 0x97 */  iemOp_setnbe_Eb,
     5087    /* 0x98 */  iemOp_sets_Eb,
     5088    /* 0x99 */  iemOp_setns_Eb,
     5089    /* 0x9a */  iemOp_setp_Eb,
     5090    /* 0x9b */  iemOp_setnp_Eb,
     5091    /* 0x9c */  iemOp_setl_Eb,
     5092    /* 0x9d */  iemOp_setnl_Eb,
     5093    /* 0x9e */  iemOp_setle_Eb,
     5094    /* 0x9f */  iemOp_setnle_Eb,
     5095    /* 0xa0 */  iemOp_push_fs,
     5096    /* 0xa1 */  iemOp_pop_fs,
     5097    /* 0xa2 */  iemOp_cpuid,
     5098    /* 0xa3 */  iemOp_bt_Ev_Gv,
     5099    /* 0xa4 */  iemOp_shld_Ev_Gv_Ib,
     5100    /* 0xa5 */  iemOp_shld_Ev_Gv_CL,
     5101    /* 0xa6 */  iemOp_Invalid,
     5102    /* 0xa7 */  iemOp_Invalid,
     5103    /* 0xa8 */  iemOp_push_gs,
     5104    /* 0xa9 */  iemOp_pop_gs,
     5105    /* 0xaa */  iemOp_rsm,
     5106    /* 0xab */  iemOp_bts_Ev_Gv,
     5107    /* 0xac */  iemOp_shrd_Ev_Gv_Ib,
     5108    /* 0xad */  iemOp_shrd_Ev_Gv_CL,
     5109    /* 0xae */  iemOp_Grp15,
     5110    /* 0xaf */  iemOp_imul_Gv_Ev,
     5111    /* 0xb0 */  iemOp_cmpxchg_Eb_Gb,
     5112    /* 0xb1 */  iemOp_cmpxchg_Ev_Gv,
     5113    /* 0xb2 */  iemOp_lss_Gv_Mp,
     5114    /* 0xb3 */  iemOp_btr_Ev_Gv,
     5115    /* 0xb4 */  iemOp_lfs_Gv_Mp,
     5116    /* 0xb5 */  iemOp_lgs_Gv_Mp,
     5117    /* 0xb6 */  iemOp_movzx_Gv_Eb,
     5118    /* 0xb7 */  iemOp_movzx_Gv_Ew,
     5119    /* 0xb8 */  iemOp_popcnt_Gv_Ev_jmpe,
     5120    /* 0xb9 */  iemOp_Grp10,
     5121    /* 0xba */  iemOp_Grp8,
     5122    /* 0xbd */  iemOp_btc_Ev_Gv,
     5123    /* 0xbc */  iemOp_bsf_Gv_Ev,
     5124    /* 0xbd */  iemOp_bsr_Gv_Ev,
     5125    /* 0xbe */  iemOp_movsx_Gv_Eb,
     5126    /* 0xbf */  iemOp_movsx_Gv_Ew,
    46385127    /* 0xc0 */  iemOp_xadd_Eb_Gb,
    46395128    /* 0xc1 */  iemOp_xadd_Ev_Gv,
     
    46445133    /* 0xc6 */  iemOp_shufps_Vps_Wps_Ib__shufdp_Vpd_Wpd_Ib,
    46455134    /* 0xc7 */  iemOp_Grp9,
    4646     /* 0xc8 */  iemOp_bswap_rAX_r8,     iemOp_bswap_rCX_r9,     iemOp_bswap_rDX_r10,    iemOp_bswap_rBX_r11,
    4647     /* 0xcc */  iemOp_bswap_rSP_r12,    iemOp_bswap_rBP_r13,    iemOp_bswap_rSI_r14,    iemOp_bswap_rDI_r15,
     5135    /* 0xc8 */  iemOp_bswap_rAX_r8,
     5136    /* 0xc9 */  iemOp_bswap_rCX_r9,
     5137    /* 0xca */  iemOp_bswap_rDX_r10,
     5138    /* 0xcb */  iemOp_bswap_rBX_r11,
     5139    /* 0xcc */  iemOp_bswap_rSP_r12,
     5140    /* 0xcd */  iemOp_bswap_rBP_r13,
     5141    /* 0xce */  iemOp_bswap_rSI_r14,
     5142    /* 0xcf */  iemOp_bswap_rDI_r15,
    46485143    /* 0xd0 */  iemOp_addsubpd_Vpd_Wpd__addsubps_Vps_Wps,
    46495144    /* 0xd1 */  iemOp_psrlw_Pp_Qp__psrlw_Vdp_Wdq,
     
    70017496
    70027497/** Opcode 0x82. */
    7003     FNIEMOP_DEF(iemOp_Grp1_Eb_Ib_82)
     7498FNIEMOP_DEF(iemOp_Grp1_Eb_Ib_82)
    70047499{
    70057500    IEMOP_HLP_NO_64BIT(); /** @todo do we need to decode the whole instruction or is this ok? */
     
    77918286
    77928287
    7793 /** Opcode 0x8f. */
    7794 FNIEMOP_DEF(iemOp_pop_Ev)
     8288/** Opcode 0x8f /0. */
     8289FNIEMOP_DEF_1(iemOp_pop_Ev, uint8_t, bRm)
    77958290{
    77968291    /* This bugger is rather annoying as it requires rSP to be updated before
     
    78058300     *        now until tests show it's checked.. */
    78068301    IEMOP_MNEMONIC("pop Ev");
    7807     uint8_t bRm; IEM_OPCODE_GET_NEXT_U8(&bRm);
    78088302    IEMOP_HLP_NO_LOCK_PREFIX(); /** @todo should probably not be raised until we've fetched all the opcode bytes? */
    78098303
     
    78178311     * Intel says that RSP is incremented before it's used in any effective
    78188312     * address calcuations.  This means some serious extra annoyance here since
    7819      * we decode and caclulate the effective address in one step and like to
     8313     * we decode and calculate the effective address in one step and like to
    78208314     * delay committing registers till everything is done.
    78218315     *
     
    78928386    return VERR_IEM_IPE_2;
    78938387#endif
     8388}
     8389
     8390
     8391/** Opcode 0x8f. */
     8392FNIEMOP_DEF(iemOp_Grp1A)
     8393{
     8394    uint8_t bRm; IEM_OPCODE_GET_NEXT_U8(&bRm);
     8395    if ((bRm & X86_MODRM_REG_MASK) != (0 << X86_MODRM_REG_SHIFT)) /* only pop Ev in this group. */
     8396        return IEMOP_RAISE_INVALID_OPCODE();
     8397    return FNIEMOP_CALL_1(iemOp_pop_Ev, bRm);
    78948398}
    78958399
     
    961710121    IEMOP_HLP_NO_LOCK_PREFIX(); /** @todo should probably not be raised until we've fetched all the opcode bytes? */
    961810122    if ((bRm & X86_MODRM_REG_MASK) != (0 << X86_MODRM_REG_SHIFT)) /* only mov Eb,Ib in this group. */
    9619         return IEMOP_RAISE_INVALID_LOCK_PREFIX();
     10123        return IEMOP_RAISE_INVALID_OPCODE();
    962010124    IEMOP_MNEMONIC("mov Eb,Ib");
    962110125
     
    965010154    IEMOP_HLP_NO_LOCK_PREFIX(); /** @todo should probably not be raised until we've fetched all the opcode bytes? */
    965110155    if ((bRm & X86_MODRM_REG_MASK) != (0 << X86_MODRM_REG_SHIFT)) /* only mov Eb,Ib in this group. */
    9652         return IEMOP_RAISE_INVALID_LOCK_PREFIX();
     10156        return IEMOP_RAISE_INVALID_OPCODE();
    965310157    IEMOP_MNEMONIC("mov Ev,Iz");
    965410158
     
    1414314647            return FNIEMOP_CALL_1(iemOp_grp3_test_Eb, bRm);
    1414414648        case 1:
    14145             return IEMOP_RAISE_INVALID_LOCK_PREFIX();
     14649            return IEMOP_RAISE_INVALID_OPCODE();
    1414614650        case 2:
    1414714651            IEMOP_MNEMONIC("not Eb");
     
    1418014684            return FNIEMOP_CALL_1(iemOp_grp3_test_Ev, bRm);
    1418114685        case 1:
    14182             return IEMOP_RAISE_INVALID_LOCK_PREFIX();
     14686            return IEMOP_RAISE_INVALID_OPCODE();
    1418314687        case 2:
    1418414688            IEMOP_MNEMONIC("not Ev");
     
    1466515169    /* 0x84 */  iemOp_test_Eb_Gb,       iemOp_test_Ev_Gv,       iemOp_xchg_Eb_Gb,       iemOp_xchg_Ev_Gv,
    1466615170    /* 0x88 */  iemOp_mov_Eb_Gb,        iemOp_mov_Ev_Gv,        iemOp_mov_Gb_Eb,        iemOp_mov_Gv_Ev,
    14667     /* 0x8c */  iemOp_mov_Ev_Sw,        iemOp_lea_Gv_M,         iemOp_mov_Sw_Ev,        iemOp_pop_Ev,
     15171    /* 0x8c */  iemOp_mov_Ev_Sw,        iemOp_lea_Gv_M,         iemOp_mov_Sw_Ev,        iemOp_Grp1A,
    1466815172    /* 0x90 */  iemOp_nop,              iemOp_xchg_eCX_eAX,     iemOp_xchg_eDX_eAX,     iemOp_xchg_eBX_eAX,
    1466915173    /* 0x94 */  iemOp_xchg_eSP_eAX,     iemOp_xchg_eBP_eAX,     iemOp_xchg_eSI_eAX,     iemOp_xchg_eDI_eAX,
  • TabularUnified trunk/src/VBox/VMM/testcase/tstIEMCheckMc.cpp

    r40256 r40266  
    2525#include <VBox/types.h>
    2626#include <VBox/err.h>
     27#include <VBox/log.h>
    2728#include "../include/IEMInternal.h"
    2829
     
    103104#define FNIEMOP_STUB_1(a_Name, a_Type0, a_Name0) \
    104105    FNIEMOP_DEF_1(a_Name, a_Type0, a_Name0) { return VERR_NOT_IMPLEMENTED; } \
     106    typedef int ignore_semicolon
     107
     108#define FNIEMOP_UD_STUB(a_Name) \
     109    FNIEMOP_DEF(a_Name) { return IEMOP_RAISE_INVALID_OPCODE(); } \
     110    typedef int ignore_semicolon
     111#define FNIEMOP_UD_STUB_1(a_Name, a_Type0, a_Name0) \
     112    FNIEMOP_DEF_1(a_Name, a_Type0, a_Name0) { return IEMOP_RAISE_INVALID_OPCODE(); } \
    105113    typedef int ignore_semicolon
    106114
Note: See TracChangeset for help on using the changeset viewer.

© 2025 Oracle Support Privacy / Do Not Sell My Info Terms of Use Trademark Policy Automated Access Etiquette