|
13 | 13 | #define XSIMD_CPUID_HPP |
14 | 14 |
|
15 | 15 | #include "../types/xsimd_all_registers.hpp" |
| 16 | +#include "./xsimd_cpu_features_arm.hpp" |
16 | 17 | #include "./xsimd_cpu_features_x86.hpp" |
17 | 18 | #include "xsimd_inline.hpp" |
18 | 19 |
|
19 | | -#if defined(__linux__) && (defined(__ARM_NEON) || defined(_M_ARM) || defined(__riscv_vector)) |
| 20 | +#if XSIMD_WITH_LINUX_GETAUXVAL |
20 | 21 | #include <asm/hwcap.h> |
21 | 22 | #include <sys/auxv.h> |
22 | | - |
23 | | -#ifndef HWCAP2_I8MM |
24 | | -#define HWCAP2_I8MM (1 << 13) |
25 | 23 | #endif |
26 | 24 |
|
27 | 25 | #endif |
@@ -92,29 +90,24 @@ namespace xsimd |
92 | 90 | vsx = 1; |
93 | 91 | #endif |
94 | 92 |
|
95 | | -#if defined(__aarch64__) || defined(_M_ARM64) |
96 | | - neon = 1; |
97 | | - neon64 = 1; |
98 | | -#if defined(__linux__) && (!defined(__ANDROID_API__) || __ANDROID_API__ >= 18) |
99 | | - i8mm_neon64 = bool(getauxval(AT_HWCAP2) & HWCAP2_I8MM); |
100 | | - sve = bool(getauxval(AT_HWCAP) & HWCAP_SVE); |
101 | | -#endif |
102 | | - |
103 | | -#elif defined(__ARM_NEON) || defined(_M_ARM) |
104 | | - |
105 | | -#if defined(__linux__) && (!defined(__ANDROID_API__) || __ANDROID_API__ >= 18) |
106 | | - neon = bool(getauxval(AT_HWCAP) & HWCAP_NEON); |
107 | | -#endif |
| 93 | +#if XSIMD_WITH_LINUX_GETAUXVAL |
| 94 | +#if defined(__riscv_vector) && defined(__riscv_v_fixed_vlen) && __riscv_v_fixed_vlen > 0 |
108 | 95 |
|
109 | | -#elif defined(__riscv_vector) && defined(__riscv_v_fixed_vlen) && __riscv_v_fixed_vlen > 0 |
110 | | - |
111 | | -#if defined(__linux__) && (!defined(__ANDROID_API__) || __ANDROID_API__ >= 18) |
112 | 96 | #ifndef HWCAP_V |
113 | 97 | #define HWCAP_V (1 << ('V' - 'A')) |
114 | 98 | #endif |
115 | 99 | rvv = bool(getauxval(AT_HWCAP) & HWCAP_V); |
116 | 100 | #endif |
117 | 101 | #endif |
| 102 | + |
| 103 | + // Safe on all platforms, it will be all false if non arm. |
| 104 | + const auto arm_cpu = xsimd::arm_cpu_features(); |
| 105 | + |
| 106 | + neon = arm_cpu.neon(); |
| 107 | + neon64 = arm_cpu.neon64(); |
| 108 | + i8mm_neon64 = arm_cpu.neon64() && arm_cpu.i8mm(); |
| 109 | + sve = arm_cpu.sve(); |
| 110 | + |
118 | 111 | // Safe on all platforms, it will be all false if non x86. |
119 | 112 | const auto x86_cpu = xsimd::x86_cpu_features(); |
120 | 113 |
|
|
0 commit comments