add detection of AVX512_4VNNIW and AVX512_4FMAPS
diff --git a/readme.md b/readme.md
index e56285a..75db5ec 100644
--- a/readme.md
+++ b/readme.md
@@ -1,5 +1,5 @@
 
-Xbyak 5.11 ; JIT assembler for x86(IA32), x64(AMD64, x86-64) by C++
+Xbyak 5.20 ; JIT assembler for x86(IA32), x64(AMD64, x86-64) by C++
 =============
 
 Abstract
@@ -323,6 +323,7 @@
 
 History
 -------------
+* 2016/Nov/26 ver 5.20 add detection of AVX512_4VNNI and AVX512_4FMAPS(thanks to rsdubtso)
 * 2016/Nov/20 ver 5.11 lost vptest for ymm(thanks to gregory38)
 * 2016/Nov/20 ver 5.10 add addressing [rip+&var]
 * 2016/Sep/29 ver 5.03 fix detection ERR_INVALID_OPMASK_WITH_MEMORY(thanks to PVS-Studio)
diff --git a/readme.txt b/readme.txt
index eced1e9..f5e0279 100644
--- a/readme.txt
+++ b/readme.txt
@@ -1,5 +1,5 @@
 

-    C++用x86(IA-32), x64(AMD64, x86-64) JITアセンブラ Xbyak 5.11

+    C++用x86(IA-32), x64(AMD64, x86-64) JITアセンブラ Xbyak 5.20

 

 -----------------------------------------------------------------------------

 ◎概要

@@ -333,6 +333,7 @@
 -----------------------------------------------------------------------------

 ◎履歴

 

+2016/11/26 ver 5.20 AVX512_4VNNIとAVX512_4FMAPSの判定追加(thanks to rsdubtso)

 2016/11/20 ver 5.11 何故か消えていたvptest for ymm追加(thanks to gregory38)

 2016/11/20 ver 5.10 [rip+&var]の形のアドレッシング追加

 2016/09/29 ver 5.03 ERR_INVALID_OPMASK_WITH_MEMORYの判定ミス修正(thanks to PVS-Studio)

diff --git a/sample/test_util.cpp b/sample/test_util.cpp
index 7d5af42..dd19b52 100644
--- a/sample/test_util.cpp
+++ b/sample/test_util.cpp
@@ -64,6 +64,8 @@
 		{ Cpu::tAVX512BW, "avx512bw" },
 		{ Cpu::tAVX512VL, "avx512vl" },
 		{ Cpu::tAVX512VBMI, "avx512vbmi" },
+		{ Cpu::tAVX512_4VNNI, "avx512_4vnni" },
+		{ Cpu::tAVX512_4FMAPS, "avx512_4fmaps" },
 	};
 	for (size_t i = 0; i < NUM_OF_ARRAY(tbl); i++) {
 		if (cpu.has(tbl[i].type)) printf(" %s", tbl[i].str);
diff --git a/xbyak/xbyak.h b/xbyak/xbyak.h
index 0df7bad..e7dc2e6 100644
--- a/xbyak/xbyak.h
+++ b/xbyak/xbyak.h
@@ -105,7 +105,7 @@
 
 enum {
 	DEFAULT_MAX_CODE_SIZE = 4096,
-	VERSION = 0x5110 /* 0xABCD = A.BC(D) */
+	VERSION = 0x5200 /* 0xABCD = A.BC(D) */
 };
 
 #ifndef MIE_INTEGER_TYPE_DEFINED
diff --git a/xbyak/xbyak_mnemonic.h b/xbyak/xbyak_mnemonic.h
index e782477..2e609b4 100644
--- a/xbyak/xbyak_mnemonic.h
+++ b/xbyak/xbyak_mnemonic.h
@@ -1,4 +1,4 @@
-const char *getVersionString() const { return "5.11"; }
+const char *getVersionString() const { return "5.20"; }
 void adc(const Operand& op, uint32 imm) { opRM_I(op, imm, 0x10, 2); }
 void adc(const Operand& op1, const Operand& op2) { opRM_RM(op1, op2, 0x10); }
 void adcx(const Reg32e& reg, const Operand& op) { opGen(reg, op, 0xF6, 0x66, isREG32_REG32orMEM, NONE, 0x38); }
diff --git a/xbyak/xbyak_util.h b/xbyak/xbyak_util.h
index 90e1781..30aece1 100644
--- a/xbyak/xbyak_util.h
+++ b/xbyak/xbyak_util.h
@@ -176,6 +176,8 @@
 	static const Type tAVX512BW = uint64(1) << 41;
 	static const Type tAVX512VL = uint64(1) << 42;
 	static const Type tAVX512VBMI = uint64(1) << 43;
+	static const Type tAVX512_4VNNI = uint64(1) << 44;
+	static const Type tAVX512_4FMAPS = uint64(1) << 45;
 
 	Cpu()
 		: type_(NONE)
@@ -236,6 +238,8 @@
 						if (data[1] & (1U << 30)) type_ |= tAVX512BW;
 						if (data[1] & (1U << 31)) type_ |= tAVX512VL;
 						if (data[2] & (1U << 1)) type_ |= tAVX512VBMI;
+						if (data[3] & (1U << 2)) type_ |= tAVX512_4VNNI;
+						if (data[3] & (1U << 3)) type_ |= tAVX512_4FMAPS;
 					}
 				}
 			}