add vmovdqa32, vmovdqa64
diff --git a/gen/gen_avx512.cpp b/gen/gen_avx512.cpp
index 8ab0cc2..cdadbca 100644
--- a/gen/gen_avx512.cpp
+++ b/gen/gen_avx512.cpp
@@ -114,10 +114,47 @@
}
}
+// XM_X
+void putX_XM()
+{
+ const struct Tbl {
+ uint8 code;
+ const char *name;
+ int type;
+ } tbl[] = {
+ { 0x6F, "vmovdqa32", T_66 | T_0F | T_EVEX | T_MUST_EVEX | T_YMM | T_EW0 | T_ER_X | T_ER_Y | T_ER_Z },
+ { 0x6F, "vmovdqa64", T_66 | T_0F | T_EVEX | T_MUST_EVEX | T_YMM | T_EW1 | T_ER_X | T_ER_Y | T_ER_Z },
+ };
+ for (size_t i = 0; i < NUM_OF_ARRAY(tbl); i++) {
+ const Tbl *p = &tbl[i];
+ std::string type = type2String(p->type);
+ printf("void %s(const Xmm& x, const Operand& op) { opAVX_X_XM_IMM(x, op, %s, 0x%02X); }\n", p->name, type.c_str(), p->code);
+ }
+}
+
+void putM_X()
+{
+ const struct Tbl {
+ uint8 code;
+ const char *name;
+ int type;
+ } tbl[] = {
+ { 0x7F, "vmovdqa32", T_66 | T_0F | T_EVEX | T_MUST_EVEX | T_YMM | T_EW0 | T_ER_X | T_ER_Y | T_ER_Z },
+ { 0x7F, "vmovdqa64", T_66 | T_0F | T_EVEX | T_MUST_EVEX | T_YMM | T_EW1 | T_ER_X | T_ER_Y | T_ER_Z },
+ };
+ for (size_t i = 0; i < NUM_OF_ARRAY(tbl); i++) {
+ const Tbl *p = &tbl[i];
+ std::string type = type2String(p->type);
+ printf("void %s(const Address& addr, const Xmm& x) { opAVX_X_XM_IMM(x, addr, %s, 0x%02X); }\n", p->name, type.c_str(), p->code);
+ }
+}
+
int main()
{
- puts("#ifdef XBYAK_AVX512");
+ puts("#ifndef XBYAK_DISABLE_AVX512");
putOpmask();
putVcmp();
+ putX_XM();
+ putM_X();
puts("#endif");
}
diff --git a/test/make_nm.cpp b/test/make_nm.cpp
index 22575d9..29256d5 100644
--- a/test/make_nm.cpp
+++ b/test/make_nm.cpp
@@ -2618,6 +2618,8 @@
{
const char *tbl[] = {
"vmovddup",
+ "vmovdqa32",
+ "vmovdqa64",
};
for (size_t i = 0; i < NUM_OF_ARRAY(tbl); i++) {
const char *name = tbl[i];
diff --git a/xbyak/xbyak.h b/xbyak/xbyak.h
index e85c3f7..299d9db 100644
--- a/xbyak/xbyak.h
+++ b/xbyak/xbyak.h
@@ -24,7 +24,7 @@
#include <iostream>
#endif
-// #define XBYAK_AVX512
+// #define XBYAK_DISABLE_AVX512
//#define XBYAK_USE_MMAP_ALLOCATOR
#if !defined(__GNUC__) || defined(__MINGW32__)
@@ -2424,10 +2424,10 @@
nop();
}
}
-#endif
-#ifdef XBYAK_AVX512
+#ifndef XBYAK_DISABLE_AVX512
#include "xbyak_avx512.h"
#endif
+#endif
};
namespace util {
diff --git a/xbyak/xbyak_avx512.h b/xbyak/xbyak_avx512.h
index b0b06e7..3ecd81a 100644
--- a/xbyak/xbyak_avx512.h
+++ b/xbyak/xbyak_avx512.h
@@ -1,4 +1,4 @@
-#ifdef XBYAK_AVX512
+#ifndef XBYAK_DISABLE_AVX512
void kaddw(const Opmask& r1, const Opmask& r2, const Opmask& r3) { opVex(r1, &r2, r3, T_L1 | T_0F | T_W0, 0x4A); }
void kaddq(const Opmask& r1, const Opmask& r2, const Opmask& r3) { opVex(r1, &r2, r3, T_L1 | T_0F | T_W1, 0x4A); }
void kaddb(const Opmask& r1, const Opmask& r2, const Opmask& r3) { opVex(r1, &r2, r3, T_L1 | T_0F | T_66 | T_W0, 0x4A); }
@@ -68,4 +68,8 @@
void vcmpps(const Opmask& k, const Xmm& x, const Operand& op, uint8 imm) { opAVX_K_X_XM(k, x, op, T_0F | T_EW0 | T_YMM | T_EVEX | T_SAE_Z | T_MUST_EVEX, 0xC2, imm); }
void vcmpsd(const Opmask& k, const Xmm& x, const Operand& op, uint8 imm) { opAVX_K_X_XM(k, x, op, T_0F | T_F2 | T_EW1 | T_EVEX | T_SAE_Z | T_MUST_EVEX, 0xC2, imm); }
void vcmpss(const Opmask& k, const Xmm& x, const Operand& op, uint8 imm) { opAVX_K_X_XM(k, x, op, T_0F | T_F3 | T_EW0 | T_EVEX | T_SAE_Z | T_MUST_EVEX, 0xC2, imm); }
+void vmovdqa32(const Xmm& x, const Operand& op) { opAVX_X_XM_IMM(x, op, T_0F | T_66 | T_EW0 | T_YMM | T_EVEX | T_ER_X | T_ER_Y | T_ER_Z | T_MUST_EVEX, 0x6F); }
+void vmovdqa64(const Xmm& x, const Operand& op) { opAVX_X_XM_IMM(x, op, T_0F | T_66 | T_EW1 | T_YMM | T_EVEX | T_ER_X | T_ER_Y | T_ER_Z | T_MUST_EVEX, 0x6F); }
+void vmovdqa32(const Address& addr, const Xmm& x) { opAVX_X_XM_IMM(x, addr, T_0F | T_66 | T_EW0 | T_YMM | T_EVEX | T_ER_X | T_ER_Y | T_ER_Z | T_MUST_EVEX, 0x7F); }
+void vmovdqa64(const Address& addr, const Xmm& x) { opAVX_X_XM_IMM(x, addr, T_0F | T_66 | T_EW1 | T_YMM | T_EVEX | T_ER_X | T_ER_Y | T_ER_Z | T_MUST_EVEX, 0x7F); }
#endif