Index: /trunk/src/VBox/Disassembler/DisasmCore.cpp
===================================================================
--- /trunk/src/VBox/Disassembler/DisasmCore.cpp	(revision 41795)
+++ /trunk/src/VBox/Disassembler/DisasmCore.cpp	(revision 41796)
@@ -77,4 +77,5 @@
 static FNDISPARSE ParseImmQword;
 static FNDISPARSE ParseImmQword_SizeOnly;
+static FNDISPARSE ParseInvOpModRm;
 
 static FNDISPARSE ParseTwoByteEsc;
@@ -156,5 +157,6 @@
     ParseThreeByteEsc4,
     ParseThreeByteEsc5,
-    ParseImmAddrF
+    ParseImmAddrF,
+    ParseInvOpModRm
 };
 
@@ -202,5 +204,6 @@
     ParseThreeByteEsc4,
     ParseThreeByteEsc5,
-    ParseImmAddrF_SizeOnly
+    ParseImmAddrF_SizeOnly,
+    ParseInvOpModRm
 };
 
@@ -1282,8 +1285,7 @@
 static size_t ParseModFence(size_t offInstr, PCDISOPCODE pOp, PDISSTATE pDis, PDISOPPARAM pParam)
 {
-    ////AssertMsgFailed(("??\n"));
-    //nothing to do apparently
     NOREF(pOp); NOREF(pParam); NOREF(pDis);
-    return offInstr;
+    /* Note! Only used in group 15, so we must account for the mod/rm byte. */
+    return offInstr + 1;
 }
 //*****************************************************************************
@@ -1843,4 +1845,12 @@
 //*****************************************************************************
 //*****************************************************************************
+static size_t ParseInvOpModRm(size_t offInstr, PCDISOPCODE pOp, PDISSTATE pDis, PDISOPPARAM pParam)
+{
+    /* This is used to avoid a bunch of special hacks to get the ModRM byte
+       included when encountering invalid opcodes in groups. */
+    return offInstr + 1;
+}
+//*****************************************************************************
+//*****************************************************************************
 static size_t ParseTwoByteEsc(size_t offInstr, PCDISOPCODE pOp, PDISSTATE pDis, PDISOPPARAM pParam)
 {
@@ -2019,7 +2029,4 @@
 
     pOp = &g_aMapX86_Group1[idx+reg];
-    //little hack to make sure the ModRM byte is included in the returned size
-    if (pOp->idxParse1 != IDX_ParseModRM && pOp->idxParse2 != IDX_ParseModRM)
-        offInstr++;
 
     return disParseInstruction(offInstr, pOp, pDis);
@@ -2057,8 +2064,4 @@
     pOp = &g_aMapX86_Group2[idx+reg];
 
-    //little hack to make sure the ModRM byte is included in the returned size
-    if (pOp->idxParse1 != IDX_ParseModRM && pOp->idxParse2 != IDX_ParseModRM)
-        offInstr++;
-
     return disParseInstruction(offInstr, pOp, pDis);
 }
@@ -2075,8 +2078,4 @@
     pOp = &g_aMapX86_Group3[idx+reg];
 
-    //little hack to make sure the ModRM byte is included in the returned size
-    if (pOp->idxParse1 != IDX_ParseModRM && pOp->idxParse2 != IDX_ParseModRM)
-        offInstr++;
-
     return disParseInstruction(offInstr, pOp, pDis);
 }
@@ -2092,8 +2091,4 @@
     pOp = &g_aMapX86_Group4[reg];
 
-    //little hack to make sure the ModRM byte is included in the returned size
-    if (pOp->idxParse1 != IDX_ParseModRM && pOp->idxParse2 != IDX_ParseModRM)
-        offInstr++;
-
     return disParseInstruction(offInstr, pOp, pDis);
 }
@@ -2108,8 +2103,4 @@
 
     pOp = &g_aMapX86_Group5[reg];
-
-    //little hack to make sure the ModRM byte is included in the returned size
-    if (pOp->idxParse1 != IDX_ParseModRM && pOp->idxParse2 != IDX_ParseModRM)
-        offInstr++;
 
     return disParseInstruction(offInstr, pOp, pDis);
@@ -2123,8 +2114,5 @@
 static size_t Parse3DNow(size_t offInstr, PCDISOPCODE pOp, PDISSTATE pDis, PDISOPPARAM pParam)
 {
-#ifdef DEBUG_Sander
-    //needs testing
-    AssertMsgFailed(("Test me\n"));
-#endif
+    /** @todo This code needs testing! */
 
     uint8_t ModRM = disReadByte(pDis, offInstr);
@@ -2139,8 +2127,4 @@
     pOp = &g_aTwoByteMapX86_3DNow[opcode];
 
-    //little hack to make sure the ModRM byte is included in the returned size
-    if (pOp->idxParse1 != IDX_ParseModRM && pOp->idxParse2 != IDX_ParseModRM)
-        offInstr++;                 /* for illegal opcodes */
-
     size_t offStrict = disParseInstruction(offInstr, pOp, pDis);
     Assert(offStrict == offRet - 1);  NOREF(offStrict);   /* the imm8_opcode */
@@ -2157,8 +2141,4 @@
 
     pOp = &g_aMapX86_Group6[reg];
-
-    //little hack to make sure the ModRM byte is included in the returned size
-    if (pOp->idxParse1 != IDX_ParseModRM && pOp->idxParse2 != IDX_ParseModRM)
-        offInstr++;
 
     return disParseInstruction(offInstr, pOp, pDis);
@@ -2183,4 +2163,5 @@
         pOp = &g_aMapX86_Group7_mem[reg];
 
+    /* Cannot easily skip this hack because of monitor and vmcall! */
     //little hack to make sure the ModRM byte is included in the returned size
     if (pOp->idxParse1 != IDX_ParseModRM && pOp->idxParse2 != IDX_ParseModRM)
@@ -2200,8 +2181,4 @@
     pOp = &g_aMapX86_Group8[reg];
 
-    //little hack to make sure the ModRM byte is included in the returned size
-    if (pOp->idxParse1 != IDX_ParseModRM && pOp->idxParse2 != IDX_ParseModRM)
-        offInstr++;
-
     return disParseInstruction(offInstr, pOp, pDis);
 }
@@ -2217,8 +2194,4 @@
     pOp = &g_aMapX86_Group9[reg];
 
-    //little hack to make sure the ModRM byte is included in the returned size
-    if (pOp->idxParse1 != IDX_ParseModRM && pOp->idxParse2 != IDX_ParseModRM)
-        offInstr++;
-
     return disParseInstruction(offInstr, pOp, pDis);
 }
@@ -2234,8 +2207,4 @@
     pOp = &g_aMapX86_Group10[reg];
 
-    //little hack to make sure the ModRM byte is included in the returned size
-    if (pOp->idxParse1 != IDX_ParseModRM && pOp->idxParse2 != IDX_ParseModRM)
-        offInstr++;
-
     return disParseInstruction(offInstr, pOp, pDis);
 }
@@ -2250,11 +2219,7 @@
 
     if (pDis->fPrefix & DISPREFIX_OPSIZE)
-        reg += 8;   //2nd table
+        reg += 8;   /* 2nd table */
 
     pOp = &g_aMapX86_Group12[reg];
-
-    //little hack to make sure the ModRM byte is included in the returned size
-    if (pOp->idxParse1 != IDX_ParseModRM && pOp->idxParse2 != IDX_ParseModRM)
-        offInstr++;
 
     return disParseInstruction(offInstr, pOp, pDis);
@@ -2269,11 +2234,7 @@
     uint8_t reg   = MODRM_REG(modrm);
     if (pDis->fPrefix & DISPREFIX_OPSIZE)
-        reg += 8;   //2nd table
+        reg += 8;   /* 2nd table */
 
     pOp = &g_aMapX86_Group13[reg];
-
-    //little hack to make sure the ModRM byte is included in the returned size
-    if (pOp->idxParse1 != IDX_ParseModRM && pOp->idxParse2 != IDX_ParseModRM)
-        offInstr++;
 
     return disParseInstruction(offInstr, pOp, pDis);
@@ -2288,12 +2249,7 @@
     uint8_t reg   = MODRM_REG(modrm);
     if (pDis->fPrefix & DISPREFIX_OPSIZE)
-        reg += 8;   //2nd table
+        reg += 8;   /* 2nd table */
 
     pOp = &g_aMapX86_Group14[reg];
-
-    //little hack to make sure the ModRM byte is included in the returned size
-    size_t size = 0;
-    if (pOp->idxParse1 != IDX_ParseModRM && pOp->idxParse2 != IDX_ParseModRM)
-        offInstr++;
 
     return disParseInstruction(offInstr, pOp, pDis);
@@ -2315,9 +2271,4 @@
         pOp = &g_aMapX86_Group15_mem[reg];
 
-    //little hack to make sure the ModRM byte is included in the returned size
-    size_t size = 0;
-    if (pOp->idxParse1 != IDX_ParseModRM && pOp->idxParse2 != IDX_ParseModRM)
-        offInstr++;
-
     return disParseInstruction(offInstr, pOp, pDis);
 }
@@ -2330,8 +2281,4 @@
     uint8_t modrm = disReadByte(pDis, offInstr);
     pOp = &g_aMapX86_Group16[MODRM_REG(modrm)];
-
-    //little hack to make sure the ModRM byte is included in the returned size
-    if (pOp->idxParse1 != IDX_ParseModRM && pOp->idxParse2 != IDX_ParseModRM)
-        offInstr++;
 
     return disParseInstruction(offInstr, pOp, pDis);
Index: /trunk/src/VBox/Disassembler/DisasmInternal.h
===================================================================
--- /trunk/src/VBox/Disassembler/DisasmInternal.h	(revision 41795)
+++ /trunk/src/VBox/Disassembler/DisasmInternal.h	(revision 41796)
@@ -71,5 +71,6 @@
 #define IDX_ParseThreeByteEsc5      39
 #define IDX_ParseImmAddrF           40
-#define IDX_ParseMax                (IDX_ParseImmAddrF+1)
+#define IDX_ParseInvOpModRM         41
+#define IDX_ParseMax                (IDX_ParseInvOpModRM+1)
 /** @}  */
 
Index: /trunk/src/VBox/Disassembler/DisasmTables.cpp
===================================================================
--- /trunk/src/VBox/Disassembler/DisasmTables.cpp	(revision 41795)
+++ /trunk/src/VBox/Disassembler/DisasmTables.cpp	(revision 41796)
@@ -37,5 +37,4 @@
 #define INVALID_OPCODE  \
     OP(SZINVALID_OPCODE,     0,              0,          0,          OP_INVALID, OP_PARM_NONE,       OP_PARM_NONE,   OP_PARM_NONE,   DISOPTYPE_INVALID)
-
 #define INVALID_OPCODE_BLOCK \
     INVALID_OPCODE,\
@@ -55,4 +54,24 @@
     INVALID_OPCODE,\
     INVALID_OPCODE,
+
+#define INVALID_OPCODE_MOD_RM \
+    OP(SZINVALID_OPCODE,     IDX_ParseInvOpModRM, 0,     0,          OP_INVALID, OP_PARM_NONE,       OP_PARM_NONE,   OP_PARM_NONE,   DISOPTYPE_INVALID)
+#define INVALID_OPCODE_BLOCK_MOD_RM \
+    INVALID_OPCODE_MOD_RM,\
+    INVALID_OPCODE_MOD_RM,\
+    INVALID_OPCODE_MOD_RM,\
+    INVALID_OPCODE_MOD_RM,\
+    INVALID_OPCODE_MOD_RM,\
+    INVALID_OPCODE_MOD_RM,\
+    INVALID_OPCODE_MOD_RM,\
+    INVALID_OPCODE_MOD_RM,\
+    INVALID_OPCODE_MOD_RM,\
+    INVALID_OPCODE_MOD_RM,\
+    INVALID_OPCODE_MOD_RM,\
+    INVALID_OPCODE_MOD_RM,\
+    INVALID_OPCODE_MOD_RM,\
+    INVALID_OPCODE_MOD_RM,\
+    INVALID_OPCODE_MOD_RM,\
+    INVALID_OPCODE_MOD_RM,
 
 /* Invalid opcode */
@@ -1478,138 +1497,138 @@
 {
     /* 0 */
-    INVALID_OPCODE,
-    INVALID_OPCODE,
-    INVALID_OPCODE,
-    INVALID_OPCODE,
-    INVALID_OPCODE,
-    INVALID_OPCODE,
-    INVALID_OPCODE,
-    INVALID_OPCODE,
-    INVALID_OPCODE,
-    INVALID_OPCODE,
-    INVALID_OPCODE,
+    INVALID_OPCODE_MOD_RM,
+    INVALID_OPCODE_MOD_RM,
+    INVALID_OPCODE_MOD_RM,
+    INVALID_OPCODE_MOD_RM,
+    INVALID_OPCODE_MOD_RM,
+    INVALID_OPCODE_MOD_RM,
+    INVALID_OPCODE_MOD_RM,
+    INVALID_OPCODE_MOD_RM,
+    INVALID_OPCODE_MOD_RM,
+    INVALID_OPCODE_MOD_RM,
+    INVALID_OPCODE_MOD_RM,
     OP("pi2fw %Pq,%Qq",      IDX_ParseModRM,     IDX_UseModRM,   0,          OP_PI2FW,   OP_PARM_Pq,         OP_PARM_Qq,     OP_PARM_NONE,   DISOPTYPE_HARMLESS),
     OP("pi2fd %Pq,%Qq",      IDX_ParseModRM,     IDX_UseModRM,   0,          OP_PI2FD,   OP_PARM_Pq,         OP_PARM_Qq,     OP_PARM_NONE,   DISOPTYPE_HARMLESS),
-    INVALID_OPCODE,
-    INVALID_OPCODE,
+    INVALID_OPCODE_MOD_RM,
+    INVALID_OPCODE_MOD_RM,
 
     /* 1 */
-    INVALID_OPCODE,
-    INVALID_OPCODE,
-    INVALID_OPCODE,
-    INVALID_OPCODE,
-    INVALID_OPCODE,
-    INVALID_OPCODE,
-    INVALID_OPCODE,
-    INVALID_OPCODE,
-    INVALID_OPCODE,
-    INVALID_OPCODE,
-    INVALID_OPCODE,
+    INVALID_OPCODE_MOD_RM,
+    INVALID_OPCODE_MOD_RM,
+    INVALID_OPCODE_MOD_RM,
+    INVALID_OPCODE_MOD_RM,
+    INVALID_OPCODE_MOD_RM,
+    INVALID_OPCODE_MOD_RM,
+    INVALID_OPCODE_MOD_RM,
+    INVALID_OPCODE_MOD_RM,
+    INVALID_OPCODE_MOD_RM,
+    INVALID_OPCODE_MOD_RM,
+    INVALID_OPCODE_MOD_RM,
     OP("pf2iw %Pq,%Qq",      IDX_ParseModRM,     IDX_UseModRM,   0,          OP_PF2IW,   OP_PARM_Pq,         OP_PARM_Qq,     OP_PARM_NONE,   DISOPTYPE_HARMLESS),
     OP("pf2id %Pq,%Qq",      IDX_ParseModRM,     IDX_UseModRM,   0,          OP_PF2ID,   OP_PARM_Pq,         OP_PARM_Qq,     OP_PARM_NONE,   DISOPTYPE_HARMLESS),
-    INVALID_OPCODE,
-    INVALID_OPCODE,
+    INVALID_OPCODE_MOD_RM,
+    INVALID_OPCODE_MOD_RM,
 
     /* 2 */
-    INVALID_OPCODE_BLOCK
+    INVALID_OPCODE_BLOCK_MOD_RM
 
     /* 3 */
-    INVALID_OPCODE_BLOCK
+    INVALID_OPCODE_BLOCK_MOD_RM
 
     /* 4 */
-    INVALID_OPCODE_BLOCK
+    INVALID_OPCODE_BLOCK_MOD_RM
 
     /* 5 */
-    INVALID_OPCODE_BLOCK
+    INVALID_OPCODE_BLOCK_MOD_RM
 
     /* 6 */
-    INVALID_OPCODE_BLOCK
+    INVALID_OPCODE_BLOCK_MOD_RM
 
     /* 7 */
-    INVALID_OPCODE_BLOCK
+    INVALID_OPCODE_BLOCK_MOD_RM
 
     /* 8 */
-    INVALID_OPCODE,
-    INVALID_OPCODE,
-    INVALID_OPCODE,
-    INVALID_OPCODE,
-    INVALID_OPCODE,
-    INVALID_OPCODE,
-    INVALID_OPCODE,
-    INVALID_OPCODE,
-    INVALID_OPCODE,
-    INVALID_OPCODE,
+    INVALID_OPCODE_MOD_RM,
+    INVALID_OPCODE_MOD_RM,
+    INVALID_OPCODE_MOD_RM,
+    INVALID_OPCODE_MOD_RM,
+    INVALID_OPCODE_MOD_RM,
+    INVALID_OPCODE_MOD_RM,
+    INVALID_OPCODE_MOD_RM,
+    INVALID_OPCODE_MOD_RM,
+    INVALID_OPCODE_MOD_RM,
+    INVALID_OPCODE_MOD_RM,
     OP("pfnacc %Pq,%Qq",     IDX_ParseModRM,     IDX_UseModRM,   0,          OP_PFNACC,  OP_PARM_Pq,         OP_PARM_Qq,     OP_PARM_NONE,   DISOPTYPE_HARMLESS),
-    INVALID_OPCODE,
-    INVALID_OPCODE,
-    INVALID_OPCODE,
+    INVALID_OPCODE_MOD_RM,
+    INVALID_OPCODE_MOD_RM,
+    INVALID_OPCODE_MOD_RM,
     OP("pfpnacc %Pq,%Qq",    IDX_ParseModRM,     IDX_UseModRM,   0,          OP_PFPNACC, OP_PARM_Pq,         OP_PARM_Qq,     OP_PARM_NONE,   DISOPTYPE_HARMLESS),
-    INVALID_OPCODE,
+    INVALID_OPCODE_MOD_RM,
 
     /* 9 */
     OP("pfcmpge %Pq,%Qq",    IDX_ParseModRM,     IDX_UseModRM,   0,          OP_PFCMPGE, OP_PARM_Pq,         OP_PARM_Qq,     OP_PARM_NONE,   DISOPTYPE_HARMLESS),
-    INVALID_OPCODE,
-    INVALID_OPCODE,
-    INVALID_OPCODE,
+    INVALID_OPCODE_MOD_RM,
+    INVALID_OPCODE_MOD_RM,
+    INVALID_OPCODE_MOD_RM,
     OP("pfmin %Pq,%Qq",      IDX_ParseModRM,     IDX_UseModRM,   0,          OP_PFMIN,   OP_PARM_Pq,         OP_PARM_Qq,     OP_PARM_NONE,   DISOPTYPE_HARMLESS),
-    INVALID_OPCODE,
+    INVALID_OPCODE_MOD_RM,
     OP("pfrcp %Pq,%Qq",      IDX_ParseModRM,     IDX_UseModRM,   0,          OP_PFRCP,   OP_PARM_Pq,         OP_PARM_Qq,     OP_PARM_NONE,   DISOPTYPE_HARMLESS),
     OP("pfrsqrt %Pq,%Qq",    IDX_ParseModRM,     IDX_UseModRM,   0,          OP_PFRSQRT, OP_PARM_Pq,         OP_PARM_Qq,     OP_PARM_NONE,   DISOPTYPE_HARMLESS),
-    INVALID_OPCODE,
-    INVALID_OPCODE,
+    INVALID_OPCODE_MOD_RM,
+    INVALID_OPCODE_MOD_RM,
     OP("pfsub %Pq,%Qq",      IDX_ParseModRM,     IDX_UseModRM,   0,          OP_PFSUB,   OP_PARM_Pq,         OP_PARM_Qq,     OP_PARM_NONE,   DISOPTYPE_HARMLESS),
-    INVALID_OPCODE,
-    INVALID_OPCODE,
-    INVALID_OPCODE,
+    INVALID_OPCODE_MOD_RM,
+    INVALID_OPCODE_MOD_RM,
+    INVALID_OPCODE_MOD_RM,
     OP("pfadd %Pq,%Qq",      IDX_ParseModRM,     IDX_UseModRM,   0,          OP_PFADD,   OP_PARM_Pq,         OP_PARM_Qq,     OP_PARM_NONE,   DISOPTYPE_HARMLESS),
-    INVALID_OPCODE,
+    INVALID_OPCODE_MOD_RM,
 
     /* a */
     OP("pfcmpgt %Pq,%Qq",    IDX_ParseModRM,     IDX_UseModRM,   0,          OP_PFCMPGT, OP_PARM_Pq,         OP_PARM_Qq,     OP_PARM_NONE,   DISOPTYPE_HARMLESS),
-    INVALID_OPCODE,
-    INVALID_OPCODE,
-    INVALID_OPCODE,
+    INVALID_OPCODE_MOD_RM,
+    INVALID_OPCODE_MOD_RM,
+    INVALID_OPCODE_MOD_RM,
     OP("pfmax %Pq,%Qq",      IDX_ParseModRM,     IDX_UseModRM,   0,          OP_PFMAX,   OP_PARM_Pq,         OP_PARM_Qq,     OP_PARM_NONE,   DISOPTYPE_HARMLESS),
-    INVALID_OPCODE,
+    INVALID_OPCODE_MOD_RM,
     OP("pfrcpit1 %Pq,%Qq",   IDX_ParseModRM,     IDX_UseModRM,   0,          OP_PFRCPIT1,OP_PARM_Pq,         OP_PARM_Qq,     OP_PARM_NONE,   DISOPTYPE_HARMLESS),
     OP("pfrsqrtit1 %Pq,%Qq", IDX_ParseModRM,     IDX_UseModRM,   0,          OP_PFRSQRTIT1,  OP_PARM_Pq,         OP_PARM_Qq,     OP_PARM_NONE,   DISOPTYPE_HARMLESS),
-    INVALID_OPCODE,
-    INVALID_OPCODE,
+    INVALID_OPCODE_MOD_RM,
+    INVALID_OPCODE_MOD_RM,
     OP("pfsubr %Pq,%Qq",     IDX_ParseModRM,     IDX_UseModRM,   0,          OP_PFSUBR,  OP_PARM_Pq,         OP_PARM_Qq,     OP_PARM_NONE,   DISOPTYPE_HARMLESS),
-    INVALID_OPCODE,
-    INVALID_OPCODE,
-    INVALID_OPCODE,
+    INVALID_OPCODE_MOD_RM,
+    INVALID_OPCODE_MOD_RM,
+    INVALID_OPCODE_MOD_RM,
     OP("pfacc %Pq,%Qq",      IDX_ParseModRM,     IDX_UseModRM,   0,          OP_PFACC,   OP_PARM_Pq,         OP_PARM_Qq,     OP_PARM_NONE,   DISOPTYPE_HARMLESS),
-    INVALID_OPCODE,
+    INVALID_OPCODE_MOD_RM,
 
     /* b */
     OP("pfcmpeq %Pq,%Qq",    IDX_ParseModRM,     IDX_UseModRM,   0,          OP_PFCMPEQ, OP_PARM_Pq,         OP_PARM_Qq,     OP_PARM_NONE,   DISOPTYPE_HARMLESS),
-    INVALID_OPCODE,
-    INVALID_OPCODE,
-    INVALID_OPCODE,
+    INVALID_OPCODE_MOD_RM,
+    INVALID_OPCODE_MOD_RM,
+    INVALID_OPCODE_MOD_RM,
     OP("pfmul %Pq,%Qq",      IDX_ParseModRM,     IDX_UseModRM,   0,          OP_PFMUL,   OP_PARM_Pq,         OP_PARM_Qq,     OP_PARM_NONE,   DISOPTYPE_HARMLESS),
-    INVALID_OPCODE,
+    INVALID_OPCODE_MOD_RM,
     OP("pfrcpit2 %Pq,%Qq",   IDX_ParseModRM,     IDX_UseModRM,   0,          OP_PFRCPIT2,OP_PARM_Pq,         OP_PARM_Qq,     OP_PARM_NONE,   DISOPTYPE_HARMLESS),
     OP("pfmulhrw %Pq,%Qq",   IDX_ParseModRM,     IDX_UseModRM,   0,          OP_PFMULHRW,OP_PARM_Pq,         OP_PARM_Qq,     OP_PARM_NONE,   DISOPTYPE_HARMLESS),
-    INVALID_OPCODE,
-    INVALID_OPCODE,
-    INVALID_OPCODE,
+    INVALID_OPCODE_MOD_RM,
+    INVALID_OPCODE_MOD_RM,
+    INVALID_OPCODE_MOD_RM,
     OP("pswapd %Pq,%Qq",     IDX_ParseModRM,     IDX_UseModRM,   0,          OP_PFSWAPD, OP_PARM_Pq,         OP_PARM_Qq,     OP_PARM_NONE,   DISOPTYPE_HARMLESS),
-    INVALID_OPCODE,
-    INVALID_OPCODE,
-    INVALID_OPCODE,
+    INVALID_OPCODE_MOD_RM,
+    INVALID_OPCODE_MOD_RM,
+    INVALID_OPCODE_MOD_RM,
     OP("pavgusb %Pq,%Qq",    IDX_ParseModRM,     IDX_UseModRM,   0,          OP_PAVGUSB, OP_PARM_Pq,         OP_PARM_Qq,     OP_PARM_NONE,   DISOPTYPE_HARMLESS),
 
     /* c */
-    INVALID_OPCODE_BLOCK
+    INVALID_OPCODE_BLOCK_MOD_RM
 
     /* d */
-    INVALID_OPCODE_BLOCK
+    INVALID_OPCODE_BLOCK_MOD_RM
 
     /* e */
-    INVALID_OPCODE_BLOCK
+    INVALID_OPCODE_BLOCK_MOD_RM
 
     /* f */
-    INVALID_OPCODE_BLOCK
+    INVALID_OPCODE_BLOCK_MOD_RM
 };
 
@@ -2421,5 +2440,5 @@
     OP("test %Eb,%Ib",       IDX_ParseModRM,     IDX_ParseImmByte,0,          OP_TEST,   OP_PARM_Eb,         OP_PARM_Ib ,    OP_PARM_NONE,   DISOPTYPE_HARMLESS),
     //AMD manual claims test??
-    INVALID_OPCODE,
+    INVALID_OPCODE_MOD_RM,
     OP("not %Eb",            IDX_ParseModRM,     0,          0,          OP_NOT,     OP_PARM_Eb,         OP_PARM_NONE,   OP_PARM_NONE,   DISOPTYPE_HARMLESS),
     OP("neg %Eb",            IDX_ParseModRM,     0,          0,          OP_NEG,     OP_PARM_Eb,         OP_PARM_NONE,   OP_PARM_NONE,   DISOPTYPE_HARMLESS),
@@ -2432,5 +2451,5 @@
     OP("test %Ev,%Iz",       IDX_ParseModRM,     IDX_ParseImmZ,  0,          OP_TEST,    OP_PARM_Ev,         OP_PARM_Iz ,    OP_PARM_NONE,   DISOPTYPE_HARMLESS),
     //AMD manual claims test??
-    INVALID_OPCODE,
+    INVALID_OPCODE_MOD_RM,
     OP("not %Ev",            IDX_ParseModRM,     0,          0,          OP_NOT,     OP_PARM_Ev,         OP_PARM_NONE,   OP_PARM_NONE,   DISOPTYPE_HARMLESS),
     OP("neg %Ev",            IDX_ParseModRM,     0,          0,          OP_NEG,     OP_PARM_Ev,         OP_PARM_NONE,   OP_PARM_NONE,   DISOPTYPE_HARMLESS),
@@ -2446,10 +2465,10 @@
     OP("inc %Eb",            IDX_ParseModRM,     0,          0,          OP_INC,     OP_PARM_Eb,         OP_PARM_NONE,   OP_PARM_NONE,   DISOPTYPE_HARMLESS),
     OP("dec %Eb",            IDX_ParseModRM,     0,          0,          OP_DEC,     OP_PARM_Eb,         OP_PARM_NONE,   OP_PARM_NONE,   DISOPTYPE_HARMLESS),
-    INVALID_OPCODE,
-    INVALID_OPCODE,
-    INVALID_OPCODE,
-    INVALID_OPCODE,
-    INVALID_OPCODE,
-    INVALID_OPCODE,
+    INVALID_OPCODE_MOD_RM,
+    INVALID_OPCODE_MOD_RM,
+    INVALID_OPCODE_MOD_RM,
+    INVALID_OPCODE_MOD_RM,
+    INVALID_OPCODE_MOD_RM,
+    INVALID_OPCODE_MOD_RM,
 };
 
@@ -2464,5 +2483,5 @@
     OP("jmp %Ep",            IDX_ParseModRM,     0,          0,          OP_JMP,     OP_PARM_Ep,         OP_PARM_NONE,   OP_PARM_NONE,   DISOPTYPE_CONTROLFLOW | DISOPTYPE_UNCOND_CONTROLFLOW),
     OP("push %Ev",           IDX_ParseModRM,     0,          0,          OP_PUSH,    OP_PARM_Ev,         OP_PARM_NONE,   OP_PARM_NONE,   DISOPTYPE_HARMLESS | DISOPTYPE_DEFAULT_64_OP_SIZE),
-    INVALID_OPCODE,
+    INVALID_OPCODE_MOD_RM,
 };
 
@@ -2477,8 +2496,9 @@
     OP("verr %Ew",           IDX_ParseModRM,     0,          0,          OP_VERR,    OP_PARM_Ew,         OP_PARM_NONE,   OP_PARM_NONE,   DISOPTYPE_DANGEROUS | DISOPTYPE_PRIVILEGED_NOTRAP),
     OP("verw %Ew",           IDX_ParseModRM,     0,          0,          OP_VERW,    OP_PARM_Ew,         OP_PARM_NONE,   OP_PARM_NONE,   DISOPTYPE_DANGEROUS | DISOPTYPE_PRIVILEGED_NOTRAP),
-    INVALID_OPCODE,
-    INVALID_OPCODE,
-};
-
+    INVALID_OPCODE_MOD_RM,
+    INVALID_OPCODE_MOD_RM,
+};
+
+/* Note!! Group 7 is NOT using the INVALID_OPCODE_MOD_RM because of monitor and vmcall. */
 const DISOPCODE g_aMapX86_Group7_mem[8] =
 {
@@ -2494,4 +2514,5 @@
 };
 
+/* Note!! Group 7 is NOT using the INVALID_OPCODE_MOD_RM because of monitor and vmcall. */
 const DISOPCODE g_aMapX86_Group7_mod11_rm000[8] =
 {
@@ -2507,4 +2528,5 @@
 };
 
+/* Note!! Group 7 is NOT using the INVALID_OPCODE_MOD_RM because of monitor and vmcall. */
 const DISOPCODE g_aMapX86_Group7_mod11_rm001[8] =
 {
@@ -2523,8 +2545,8 @@
 {
     /* 0F BA */
-    INVALID_OPCODE,
-    INVALID_OPCODE,
-    INVALID_OPCODE,
-    INVALID_OPCODE,
+    INVALID_OPCODE_MOD_RM,
+    INVALID_OPCODE_MOD_RM,
+    INVALID_OPCODE_MOD_RM,
+    INVALID_OPCODE_MOD_RM,
     OP("bt %Ev,%Ib",         IDX_ParseModRM,     IDX_ParseImmByte,       0,          OP_BT,      OP_PARM_Ev,         OP_PARM_Ib ,    OP_PARM_NONE,   DISOPTYPE_HARMLESS),
     OP("bts %Ev,%Ib",        IDX_ParseModRM,     IDX_ParseImmByte,       0,          OP_BTS,     OP_PARM_Ev,         OP_PARM_Ib ,    OP_PARM_NONE,   DISOPTYPE_HARMLESS),
@@ -2536,12 +2558,12 @@
 {
     /* 0F C7 */
-    INVALID_OPCODE,
+    INVALID_OPCODE_MOD_RM,
     OP("cmpxchg8b %Mq",      IDX_ParseModRM,     0,          0,          OP_CMPXCHG8B, OP_PARM_Mq,       OP_PARM_NONE,   OP_PARM_NONE,   DISOPTYPE_HARMLESS),
-    INVALID_OPCODE,
-    INVALID_OPCODE,
-    INVALID_OPCODE,
-    INVALID_OPCODE,
-    INVALID_OPCODE,
-    INVALID_OPCODE,
+    INVALID_OPCODE_MOD_RM,
+    INVALID_OPCODE_MOD_RM,
+    INVALID_OPCODE_MOD_RM,
+    INVALID_OPCODE_MOD_RM,
+    INVALID_OPCODE_MOD_RM,
+    INVALID_OPCODE_MOD_RM,
 };
 
@@ -2549,12 +2571,12 @@
 {
     /* 0F B9 */
-    INVALID_OPCODE,
-    INVALID_OPCODE,
-    INVALID_OPCODE,
-    INVALID_OPCODE,
-    INVALID_OPCODE,
-    INVALID_OPCODE,
-    INVALID_OPCODE,
-    INVALID_OPCODE,
+    INVALID_OPCODE_MOD_RM,
+    INVALID_OPCODE_MOD_RM,
+    INVALID_OPCODE_MOD_RM,
+    INVALID_OPCODE_MOD_RM,
+    INVALID_OPCODE_MOD_RM,
+    INVALID_OPCODE_MOD_RM,
+    INVALID_OPCODE_MOD_RM,
+    INVALID_OPCODE_MOD_RM,
 };
 
@@ -2586,22 +2608,22 @@
 const DISOPCODE g_aMapX86_Group12[8*2] =
 {
-    INVALID_OPCODE,
-    INVALID_OPCODE,
+    INVALID_OPCODE_MOD_RM,
+    INVALID_OPCODE_MOD_RM,
     OP("psrlw %Pq,%Ib",      IDX_ParseModRM,     IDX_ParseImmByte,0,          OP_PSRLW,  OP_PARM_Pq,         OP_PARM_Ib,     OP_PARM_NONE,   DISOPTYPE_HARMLESS),
-    INVALID_OPCODE,
+    INVALID_OPCODE_MOD_RM,
     OP("psraw %Pq,%Ib",      IDX_ParseModRM,     IDX_ParseImmByte,0,          OP_PSRAW,  OP_PARM_Pq,         OP_PARM_Ib,     OP_PARM_NONE,   DISOPTYPE_HARMLESS),
-    INVALID_OPCODE,
+    INVALID_OPCODE_MOD_RM,
     OP("psllw %Pq,%Ib",      IDX_ParseModRM,     IDX_ParseImmByte,0,          OP_PSLLW,  OP_PARM_Pq,         OP_PARM_Ib,     OP_PARM_NONE,   DISOPTYPE_HARMLESS),
-    INVALID_OPCODE,
+    INVALID_OPCODE_MOD_RM,
 
     /* Group 12 with prefix 0x66 */
-    INVALID_OPCODE,
-    INVALID_OPCODE,
+    INVALID_OPCODE_MOD_RM,
+    INVALID_OPCODE_MOD_RM,
     OP("psrlw %Pdq,%Ib",     IDX_ParseModRM,     IDX_ParseImmByte,0,          OP_PSRLW,  OP_PARM_Pdq,        OP_PARM_Ib,     OP_PARM_NONE,   DISOPTYPE_HARMLESS),
-    INVALID_OPCODE,
+    INVALID_OPCODE_MOD_RM,
     OP("psraw %Pdq,%Ib",     IDX_ParseModRM,     IDX_ParseImmByte,0,          OP_PSRAW,  OP_PARM_Pdq,        OP_PARM_Ib,     OP_PARM_NONE,   DISOPTYPE_HARMLESS),
-    INVALID_OPCODE,
+    INVALID_OPCODE_MOD_RM,
     OP("psllw %Pdq,%Ib",     IDX_ParseModRM,     IDX_ParseImmByte,0,          OP_PSLLW,  OP_PARM_Pdq,        OP_PARM_Ib,     OP_PARM_NONE,   DISOPTYPE_HARMLESS),
-    INVALID_OPCODE,
+    INVALID_OPCODE_MOD_RM,
 };
 
@@ -2609,22 +2631,22 @@
 const DISOPCODE g_aMapX86_Group13[8*2] =
 {
-    INVALID_OPCODE,
-    INVALID_OPCODE,
+    INVALID_OPCODE_MOD_RM,
+    INVALID_OPCODE_MOD_RM,
     OP("psrld %Pq,%Ib",      IDX_ParseModRM,     IDX_ParseImmByte,0,          OP_PSRLD,  OP_PARM_Pq,         OP_PARM_Ib,     OP_PARM_NONE,   DISOPTYPE_HARMLESS),
-    INVALID_OPCODE,
+    INVALID_OPCODE_MOD_RM,
     OP("psrad %Pq,%Ib",      IDX_ParseModRM,     IDX_ParseImmByte,0,          OP_PSRAD,  OP_PARM_Pq,         OP_PARM_Ib,     OP_PARM_NONE,   DISOPTYPE_HARMLESS),
-    INVALID_OPCODE,
+    INVALID_OPCODE_MOD_RM,
     OP("pslld %Pq,%Ib",      IDX_ParseModRM,     IDX_ParseImmByte,0,          OP_PSLLD,  OP_PARM_Pq,         OP_PARM_Ib,     OP_PARM_NONE,   DISOPTYPE_HARMLESS),
-    INVALID_OPCODE,
+    INVALID_OPCODE_MOD_RM,
 
     /* Group 13 with prefix 0x66 */
-    INVALID_OPCODE,
-    INVALID_OPCODE,
+    INVALID_OPCODE_MOD_RM,
+    INVALID_OPCODE_MOD_RM,
     OP("psrld %Wdq,%Ib",     IDX_ParseModRM,     IDX_ParseImmByte,0,          OP_PSRLD,  OP_PARM_Wdq,        OP_PARM_Ib,     OP_PARM_NONE,   DISOPTYPE_HARMLESS),
-    INVALID_OPCODE,
+    INVALID_OPCODE_MOD_RM,
     OP("psrad %Wdq,%Ib",     IDX_ParseModRM,     IDX_ParseImmByte,0,          OP_PSRAD,  OP_PARM_Wdq,        OP_PARM_Ib,     OP_PARM_NONE,   DISOPTYPE_HARMLESS),
-    INVALID_OPCODE,
+    INVALID_OPCODE_MOD_RM,
     OP("pslld %Wdq,%Ib",     IDX_ParseModRM,     IDX_ParseImmByte,0,          OP_PSLLD,  OP_PARM_Wdq,        OP_PARM_Ib,     OP_PARM_NONE,   DISOPTYPE_HARMLESS),
-    INVALID_OPCODE,
+    INVALID_OPCODE_MOD_RM,
 };
 
@@ -2632,20 +2654,20 @@
 const DISOPCODE g_aMapX86_Group14[8*2] =
 {
-    INVALID_OPCODE,
-    INVALID_OPCODE,
+    INVALID_OPCODE_MOD_RM,
+    INVALID_OPCODE_MOD_RM,
     OP("psrlq %Pq,%Ib",      IDX_ParseModRM,     IDX_ParseImmByte,0,          OP_PSRLQ,  OP_PARM_Pq,         OP_PARM_Ib,     OP_PARM_NONE,   DISOPTYPE_HARMLESS),
-    INVALID_OPCODE,
-    INVALID_OPCODE,
-    INVALID_OPCODE,
+    INVALID_OPCODE_MOD_RM,
+    INVALID_OPCODE_MOD_RM,
+    INVALID_OPCODE_MOD_RM,
     OP("psllq %Pq,%Ib",      IDX_ParseModRM,     IDX_ParseImmByte,0,          OP_PSLLQ,  OP_PARM_Pq,         OP_PARM_Ib,     OP_PARM_NONE,   DISOPTYPE_HARMLESS),
-    INVALID_OPCODE,
+    INVALID_OPCODE_MOD_RM,
 
     /* Group 14 with prefix 0x66 */
-    INVALID_OPCODE,
-    INVALID_OPCODE,
+    INVALID_OPCODE_MOD_RM,
+    INVALID_OPCODE_MOD_RM,
     OP("psrlq %Wdq,%Ib",     IDX_ParseModRM,     IDX_ParseImmByte,0,          OP_PSRLD,  OP_PARM_Wdq,        OP_PARM_Ib,     OP_PARM_NONE,   DISOPTYPE_HARMLESS),
     OP("psrldq %Wdq,%Ib",    IDX_ParseModRM,     IDX_ParseImmByte,0,          OP_PSRLDQ, OP_PARM_Wdq,        OP_PARM_Ib,     OP_PARM_NONE,   DISOPTYPE_HARMLESS),
-    INVALID_OPCODE,
-    INVALID_OPCODE,
+    INVALID_OPCODE_MOD_RM,
+    INVALID_OPCODE_MOD_RM,
     OP("psllq %Wdq,%Ib",     IDX_ParseModRM,     IDX_ParseImmByte,0,          OP_PSLLD,  OP_PARM_Wdq,        OP_PARM_Ib,     OP_PARM_NONE,   DISOPTYPE_HARMLESS),
     OP("pslldq %Wdq,%Ib",    IDX_ParseModRM,     IDX_ParseImmByte,0,          OP_PSLLDQ, OP_PARM_Wdq,        OP_PARM_Ib,     OP_PARM_NONE,   DISOPTYPE_HARMLESS),
@@ -2660,7 +2682,7 @@
     OP("ldmxcsr %M",         IDX_ParseModRM,     0,          0,          OP_LDMXCSR, OP_PARM_M,          OP_PARM_NONE,   OP_PARM_NONE,   DISOPTYPE_HARMLESS),
     OP("stmxcsr %M",         IDX_ParseModRM,     0,          0,          OP_STMXCSR, OP_PARM_M,          OP_PARM_NONE,   OP_PARM_NONE,   DISOPTYPE_HARMLESS),
-    INVALID_OPCODE,
-    INVALID_OPCODE,
-    INVALID_OPCODE,
+    INVALID_OPCODE_MOD_RM,
+    INVALID_OPCODE_MOD_RM,
+    INVALID_OPCODE_MOD_RM,
     OP("clflush %Mb",        IDX_ParseModRM,     0,          0,          OP_CLFLUSH, OP_PARM_Mb,         OP_PARM_NONE,   OP_PARM_NONE,   DISOPTYPE_HARMLESS),
 };
@@ -2669,9 +2691,9 @@
 const DISOPCODE g_aMapX86_Group15_mod11_rm000[8] =
 {
-    INVALID_OPCODE,
-    INVALID_OPCODE,
-    INVALID_OPCODE,
-    INVALID_OPCODE,
-    INVALID_OPCODE,
+    INVALID_OPCODE_MOD_RM,
+    INVALID_OPCODE_MOD_RM,
+    INVALID_OPCODE_MOD_RM,
+    INVALID_OPCODE_MOD_RM,
+    INVALID_OPCODE_MOD_RM,
     OP("lfence",             IDX_ParseModFence,  0,          0,          OP_LFENCE,  OP_PARM_NONE,       OP_PARM_NONE,   OP_PARM_NONE,   DISOPTYPE_HARMLESS),
     OP("mfence",             IDX_ParseModFence,  0,          0,          OP_MFENCE,  OP_PARM_NONE,       OP_PARM_NONE,   OP_PARM_NONE,   DISOPTYPE_HARMLESS),
@@ -2686,8 +2708,8 @@
     OP("prefetcht1 %Mb",   IDX_ParseModRM, 0,          0,          OP_PREFETCH,OP_PARM_Mb,        OP_PARM_NONE,   OP_PARM_NONE,   DISOPTYPE_HARMLESS),
     OP("prefetcht2 %Mb",   IDX_ParseModRM, 0,          0,          OP_PREFETCH,OP_PARM_Mb,        OP_PARM_NONE,   OP_PARM_NONE,   DISOPTYPE_HARMLESS),
-    INVALID_OPCODE,
-    INVALID_OPCODE,
-    INVALID_OPCODE,
-    INVALID_OPCODE,
+    INVALID_OPCODE_MOD_RM,
+    INVALID_OPCODE_MOD_RM,
+    INVALID_OPCODE_MOD_RM,
+    INVALID_OPCODE_MOD_RM,
 };
 
