aboutsummaryrefslogtreecommitdiffhomepage
diff options
context:
space:
mode:
authorWunkolo <[email protected]>2023-03-22 12:54:30 -0700
committerWunkolo <[email protected]>2023-03-22 17:40:34 -0700
commitd700f6c3573e0a2fda1511c36b60e86245278735 (patch)
tree5b20886455e0529ca322697d54018d419545bc19
parent740dff2e866f3ae1a70dd42d6e8836847ed95cc2 (diff)
downloadxbyak-d700f6c3573e0a2fda1511c36b60e86245278735.tar.gz
xbyak-d700f6c3573e0a2fda1511c36b60e86245278735.zip
add detection of xsave
The XSAVE cpuid flag determines if the processor supports the XSAVE instructions(`xsave`, `xrestor`, `xsetbv`, `xgetbv`). The OSXSAVE cpuid flag determines if the _operating system_ has XSAVE **enabled**. Userland code has to use OSXSAVE for features such as AVX and AVX512 but it still matters to know if the processor itself supports it but not the operating system such as some virtual-machine contexts.
-rw-r--r--sample/test_util.cpp3
-rw-r--r--xbyak/xbyak_util.h2
2 files changed, 4 insertions, 1 deletions
diff --git a/sample/test_util.cpp b/sample/test_util.cpp
index 4a8dbc7..3405905 100644
--- a/sample/test_util.cpp
+++ b/sample/test_util.cpp
@@ -36,7 +36,8 @@ void putCPUinfo(bool onlyCpuidFeature)
{ Cpu::tE3DN, "e3dn" },
{ Cpu::tAESNI, "aesni" },
{ Cpu::tRDTSCP, "rdtscp" },
- { Cpu::tOSXSAVE, "osxsave(xgetvb)" },
+ { Cpu::tXSAVE, "xsave(xgetvb)" },
+ { Cpu::tOSXSAVE, "osxsave" },
{ Cpu::tPCLMULQDQ, "pclmulqdq" },
{ Cpu::tAVX, "avx" },
{ Cpu::tFMA, "fma" },
diff --git a/xbyak/xbyak_util.h b/xbyak/xbyak_util.h
index c57e8ea..74db8e8 100644
--- a/xbyak/xbyak_util.h
+++ b/xbyak/xbyak_util.h
@@ -458,6 +458,7 @@ public:
XBYAK_DEFINE_TYPE(74, tPREFETCHITI);
XBYAK_DEFINE_TYPE(75, tSERIALIZE);
XBYAK_DEFINE_TYPE(76, tUINTR);
+ XBYAK_DEFINE_TYPE(77, tXSAVE);
#undef XBYAK_SPLIT_ID
#undef XBYAK_DEFINE_TYPE
@@ -526,6 +527,7 @@ public:
if (ECX & (1U << 23)) type_ |= tPOPCNT;
if (ECX & (1U << 25)) type_ |= tAESNI;
if (ECX & (1U << 1)) type_ |= tPCLMULQDQ;
+ if (ECX & (1U << 26)) type_ |= tXSAVE;
if (ECX & (1U << 27)) type_ |= tOSXSAVE;
if (ECX & (1U << 30)) type_ |= tRDRAND;
if (ECX & (1U << 29)) type_ |= tF16C;