diff --git a/docs/x86/optable.xml b/docs/x86/optable.xml
index 61076e1..16a63cc 100644
--- a/docs/x86/optable.xml
+++ b/docs/x86/optable.xml
@@ -842,7 +842,21 @@
cmpxchg8b
aso rexr rexx rexb
- 0f c7 /reg=1
+ 0f c7 /reg=1 /o=16
+ M
+
+
+ aso rexr rexx rexb
+ 0f c7 /reg=1 /o=32
+ M
+
+
+
+
+ cmpxchg16b
+
+ aso rexr rexx rexb
+ 0f c7 /reg=1 /o=64
M
@@ -5627,7 +5641,7 @@
aso rexx rexr rexb
/sse=66 0f 3a 15
- MwRv V Ib
+ MwRd V Ib
diff --git a/libudis86/decode.h b/libudis86/decode.h
index 85ce376..a7362c8 100644
--- a/libudis86/decode.h
+++ b/libudis86/decode.h
@@ -122,6 +122,7 @@ enum ud_operand_size {
*/
SZ_BD = (SZ_B << 8) | SZ_D,
SZ_BV = (SZ_B << 8) | SZ_V,
+ SZ_WD = (SZ_W << 8) | SZ_D,
SZ_WV = (SZ_W << 8) | SZ_V,
SZ_WY = (SZ_W << 8) | SZ_Y,
SZ_DY = (SZ_D << 8) | SZ_Y,
diff --git a/scripts/ud_itab.py b/scripts/ud_itab.py
index 84ee309..b17fe69 100644
--- a/scripts/ud_itab.py
+++ b/scripts/ud_itab.py
@@ -61,6 +61,7 @@ class UdItabGenerator( ud_opcode.UdOpcodeTables ):
"MbRd" : [ "OP_MR" , "SZ_BD" ],
"MbRv" : [ "OP_MR" , "SZ_BV" ],
"MwRv" : [ "OP_MR" , "SZ_WV" ],
+ "MwRd" : [ "OP_MR" , "SZ_WD" ],
"MwRy" : [ "OP_MR" , "SZ_WY" ],
"MdRy" : [ "OP_MR" , "SZ_DY" ],
"I1" : [ "OP_I1" , "SZ_NA" ],
diff --git a/tests/oprgen.py b/tests/oprgen.py
index aec5cb4..9ab7634 100644
--- a/tests/oprgen.py
+++ b/tests/oprgen.py
@@ -435,6 +435,9 @@ class UdTestGenerator( ud_opcode.UdOpcodeTables ):
def Insn_MwRv(self):
return [self.Opr_MwRv(cast=True)]
+ def Insn_MwRd_V_Ib(self):
+ return [self.Opr_MwRd(cast=False), self.Opr_V(), self.Opr_Ib()]
+
def Insn_S_MwRv(self):
if self.mode == 64:
return [self.Opr_S(), self.Opr_MwRd(cast=False)]