fix check avx use xgetbv problem

This commit is contained in:
chaser-ch
2024-04-30 08:28:31 +00:00
committed by ob-robot
parent b119e2ccda
commit 037155cd19

View File

@ -41,12 +41,24 @@ inline uint64_t our_xgetbv(uint32_t xcr) noexcept
return (static_cast<uint64_t>(edx) << 32) | eax; return (static_cast<uint64_t>(edx) << 32) | eax;
} }
#endif #endif
inline bool haveOSXSAVE();
inline bool have_sse42(); inline bool have_sse42();
inline bool have_avx(); inline bool have_avx();
inline bool have_avx2(); inline bool have_avx2();
inline bool have_avxf(); inline bool have_avxf();
inline bool have_avx512bw(); inline bool have_avx512bw();
inline bool haveOSXSAVE()
{
#if defined(__x86_64__)
int regs[4];
get_cpuid(regs, 0x1);
return (regs[2] >> 27) & 1u;
#else
return false;
#endif
}
inline bool have_sse42() inline bool have_sse42()
{ {
#if defined(__x86_64__) #if defined(__x86_64__)
@ -62,7 +74,7 @@ inline bool have_avx()
#if defined(__x86_64__) #if defined(__x86_64__)
int regs[4]; int regs[4];
get_cpuid(regs, 0x1); get_cpuid(regs, 0x1);
return ((our_xgetbv(0) & 6u) == 6u) && (regs[2] >> 28 & 1); return haveOSXSAVE() && ((our_xgetbv(0) & 6u) == 6u) && (regs[2] >> 28 & 1);
#else #else
return false; return false;
#endif #endif