28#if defined(INFIX_ARCH_X64)
31#elif defined(__GNUC__) || defined(__clang__)
35#if defined(INFIX_ARCH_AARCH64) && defined(__has_include)
36#if __has_include(<sys/auxv.h>) && defined(__linux__)
39#define HWCAP_SVE (1 << 22)
41#elif __has_include(<sys/sysctl.h>) && defined(__APPLE__)
42#include <sys/sysctl.h>
46#if defined(INFIX_ARCH_X64)
47bool infix_cpu_has_avx2(
void) {
50 __cpuidex(cpuInfo, 7, 0);
51 return (cpuInfo[1] & (1 << 5)) != 0;
52#elif defined(__GNUC__) || defined(__clang__)
53 unsigned int eax, ebx, ecx, edx;
54 if (__get_cpuid_max(0, NULL) >= 7) {
55 __cpuid_count(7, 0, eax, ebx, ecx, edx);
56 return (ebx & (1 << 5)) != 0;
64bool infix_cpu_has_avx512f(
void) {
67 __cpuidex(cpuInfo, 7, 0);
68 return (cpuInfo[1] & (1 << 16)) != 0;
69#elif defined(__GNUC__) || defined(__clang__)
70 unsigned int eax, ebx, ecx, edx;
71 if (__get_cpuid_max(0, NULL) >= 7) {
72 __cpuid_count(7, 0, eax, ebx, ecx, edx);
73 return (ebx & (1 << 16)) != 0;
82#if defined(INFIX_ARCH_AARCH64)
83bool infix_cpu_has_sve(
void) {
84#if defined(__linux__) && defined(HWCAP_SVE)
85 return (getauxval(AT_HWCAP) & HWCAP_SVE) != 0;
86#elif defined(__APPLE__)
88 size_t size =
sizeof(sve_present);
89 if (sysctlbyname(
"hw.optional.arm.FEAT_SVE", &sve_present, &size, NULL, 0) == 0)
90 return sve_present == 1;