8 #ifndef BOTAN_CPUID_H__
9 #define BOTAN_CPUID_H__
11 #include <botan/types.h>
41 static void initialize();
43 static bool has_simd_32();
50 static void print(std::ostream& o);
67 if(g_processor_features == 0)
71 return g_cache_line_size;
76 if(g_processor_features == 0)
80 return g_little_endian;
89 return is_little_endian() ==
false;
93 #if defined(BOTAN_TARGET_CPU_IS_X86_FAMILY)
97 CPUID_SSE2_BIT = (1ULL << 0),
98 CPUID_SSSE3_BIT = (1ULL << 1),
99 CPUID_SSE41_BIT = (1ULL << 2),
100 CPUID_SSE42_BIT = (1ULL << 3),
101 CPUID_AVX2_BIT = (1ULL << 4),
102 CPUID_AVX512F_BIT = (1ULL << 5),
105 CPUID_RDTSC_BIT = (1ULL << 10),
106 CPUID_BMI2_BIT = (1ULL << 11),
107 CPUID_ADX_BIT = (1ULL << 12),
110 CPUID_AESNI_BIT = (1ULL << 16),
111 CPUID_CLMUL_BIT = (1ULL << 17),
112 CPUID_RDRAND_BIT = (1ULL << 18),
113 CPUID_RDSEED_BIT = (1ULL << 19),
114 CPUID_SHA_BIT = (1ULL << 20),
117 #if defined(BOTAN_TARGET_CPU_IS_PPC_FAMILY)
118 CPUID_ALTIVEC_BIT = (1ULL << 0),
121 #
if defined(BOTAN_TARGET_CPU_IS_ARM_FAMILY)
122 CPUID_ARM_NEON_BIT = (1ULL << 0),
123 CPUID_ARM_AES_BIT = (1ULL << 16),
124 CPUID_ARM_PMULL_BIT = (1ULL << 17),
125 CPUID_ARM_SHA1_BIT = (1ULL << 18),
126 CPUID_ARM_SHA2_BIT = (1ULL << 19),
129 CPUID_INITIALIZED_BIT = (1ULL << 63)
132 #if defined(BOTAN_TARGET_CPU_IS_PPC_FAMILY)
136 static bool has_altivec()
137 {
return has_cpuid_bit(CPUID_ALTIVEC_BIT); }
140 #if defined(BOTAN_TARGET_CPU_IS_ARM_FAMILY)
144 static bool has_neon()
145 {
return has_cpuid_bit(CPUID_ARM_NEON_BIT); }
150 static bool has_arm_sha1()
151 {
return has_cpuid_bit(CPUID_ARM_SHA1_BIT); }
156 static bool has_arm_sha2()
157 {
return has_cpuid_bit(CPUID_ARM_SHA2_BIT); }
162 static bool has_arm_aes()
163 {
return has_cpuid_bit(CPUID_ARM_AES_BIT); }
168 static bool has_arm_pmull()
169 {
return has_cpuid_bit(CPUID_ARM_PMULL_BIT); }
172 #if defined(BOTAN_TARGET_CPU_IS_X86_FAMILY)
177 static bool has_rdtsc()
178 {
return has_cpuid_bit(CPUID_RDTSC_BIT); }
183 static bool has_sse2()
184 {
return has_cpuid_bit(CPUID_SSE2_BIT); }
189 static bool has_ssse3()
190 {
return has_cpuid_bit(CPUID_SSSE3_BIT); }
195 static bool has_sse41()
196 {
return has_cpuid_bit(CPUID_SSE41_BIT); }
201 static bool has_sse42()
202 {
return has_cpuid_bit(CPUID_SSE42_BIT); }
207 static bool has_avx2()
208 {
return has_cpuid_bit(CPUID_AVX2_BIT); }
213 static bool has_avx512f()
214 {
return has_cpuid_bit(CPUID_AVX512F_BIT); }
219 static bool has_bmi2()
220 {
return has_cpuid_bit(CPUID_BMI2_BIT); }
225 static bool has_aes_ni()
226 {
return has_cpuid_bit(CPUID_AESNI_BIT); }
231 static bool has_clmul()
232 {
return has_cpuid_bit(CPUID_CLMUL_BIT); }
237 static bool has_intel_sha()
238 {
return has_cpuid_bit(CPUID_SHA_BIT); }
243 static bool has_adx()
244 {
return has_cpuid_bit(CPUID_ADX_BIT); }
249 static bool has_rdrand()
250 {
return has_cpuid_bit(CPUID_RDRAND_BIT); }
255 static bool has_rdseed()
256 {
return has_cpuid_bit(CPUID_RDSEED_BIT); }
268 const uint64_t mask = ~(
static_cast<uint64_t
>(bit));
269 g_processor_features &= mask;
278 if(g_processor_features == 0)
280 return ((g_processor_features & static_cast<uint64_t>(elem)) != 0);
284 static bool g_little_endian;
285 static size_t g_cache_line_size;
286 static uint64_t g_processor_features;
static size_t cache_line_size()
class BOTAN_DLL BOTAN_DEPRECATED("LibraryInitializer is no longer required") LibraryInitializer
static bool is_little_endian()
std::string to_string(const secure_vector< uint8_t > &bytes)
static void clear_cpuid_bit(CPUID_bits bit)
static bool has_cpuid_bit(CPUID_bits elem)
static bool is_big_endian()