Botan 1.10.17
cpuid.h
Go to the documentation of this file.
1/*
2* Runtime CPU detection
3* (C) 2009-2010 Jack Lloyd
4*
5* Distributed under the terms of the Botan license
6*/
7
8#ifndef BOTAN_CPUID_H__
9#define BOTAN_CPUID_H__
10
11#include <botan/types.h>
12
13namespace Botan {
14
15/**
16* A class handling runtime CPU feature detection
17*/
18class BOTAN_DLL CPUID
19 {
20 public:
21 /**
22 * Probe the CPU and see what extensions are supported
23 */
24 static void initialize();
25
26 /**
27 * Return a best guess of the cache line size
28 */
29 static size_t cache_line_size() { return cache_line; }
30
31 /**
32 * Check if the processor supports RDTSC
33 */
34 static bool has_rdtsc()
35 { return x86_processor_flags_has(CPUID_RDTSC_BIT); }
36
37 /**
38 * Check if the processor supports SSE2
39 */
40 static bool has_sse2()
41 { return x86_processor_flags_has(CPUID_SSE2_BIT); }
42
43 /**
44 * Check if the processor supports SSSE3
45 */
46 static bool has_ssse3()
47 { return x86_processor_flags_has(CPUID_SSSE3_BIT); }
48
49 /**
50 * Check if the processor supports SSE4.1
51 */
52 static bool has_sse41()
53 { return x86_processor_flags_has(CPUID_SSE41_BIT); }
54
55 /**
56 * Check if the processor supports SSE4.2
57 */
58 static bool has_sse42()
59 { return x86_processor_flags_has(CPUID_SSE42_BIT); }
60
61 /**
62 * Check if the processor supports extended AVX vector instructions
63 */
64 static bool has_avx()
65 { return x86_processor_flags_has(CPUID_AVX_BIT); }
66
67 /**
68 * Check if the processor supports AES-NI
69 */
70 static bool has_aes_ni()
71 { return x86_processor_flags_has(CPUID_AESNI_BIT); }
72
73 /**
74 * Check if the processor supports PCMULUDQ
75 */
76 static bool has_pcmuludq()
77 { return x86_processor_flags_has(CPUID_PCMUL_BIT); }
78
79 /**
80 * Check if the processor supports MOVBE
81 */
82 static bool has_movbe()
83 { return x86_processor_flags_has(CPUID_MOVBE_BIT); }
84
85 /**
86 * Check if the processor supports RDRAND
87 */
88 static bool has_rdrand()
89 { return x86_processor_flags_has(CPUID_RDRAND_BIT); }
90
91 /**
92 * Check if the processor supports AltiVec/VMX
93 */
94 static bool has_altivec() { return altivec_capable; }
95 private:
96 enum CPUID_bits {
97 CPUID_RDTSC_BIT = 4,
98 CPUID_SSE2_BIT = 26,
99 CPUID_PCMUL_BIT = 33,
100 CPUID_SSSE3_BIT = 41,
101 CPUID_SSE41_BIT = 51,
102 CPUID_SSE42_BIT = 52,
103 CPUID_MOVBE_BIT = 54,
104 CPUID_AESNI_BIT = 57,
105 CPUID_AVX_BIT = 60,
106 CPUID_RDRAND_BIT = 62
107 };
108
109 static bool x86_processor_flags_has(u64bit bit)
110 {
111 return ((x86_processor_flags >> bit) & 1);
112 }
113
114 static u64bit x86_processor_flags;
115 static size_t cache_line;
116 static bool altivec_capable;
117 };
118
119}
120
121#endif
static bool has_aes_ni()
Definition cpuid.h:70
static bool has_ssse3()
Definition cpuid.h:46
static bool has_sse2()
Definition cpuid.h:40
static bool has_avx()
Definition cpuid.h:64
static bool has_sse42()
Definition cpuid.h:58
static size_t cache_line_size()
Definition cpuid.h:29
static bool has_rdtsc()
Definition cpuid.h:34
static bool has_movbe()
Definition cpuid.h:82
static void initialize()
Definition cpuid.cpp:196
static bool has_rdrand()
Definition cpuid.h:88
static bool has_sse41()
Definition cpuid.h:52
static bool has_pcmuludq()
Definition cpuid.h:76
static bool has_altivec()
Definition cpuid.h:94
unsigned long long u64bit
Definition types.h:49