blob: fae9f7000e470d1c0a8f300fcc14960fc194b002 [file] [log] [blame]
Guillaume Chatelet439d3712018-02-01 10:03:09 +01001// Copyright 2017 Google Inc.
2//
3// Licensed under the Apache License, Version 2.0 (the "License");
4// you may not use this file except in compliance with the License.
5// You may obtain a copy of the License at
6//
7// http://www.apache.org/licenses/LICENSE-2.0
8//
9// Unless required by applicable law or agreed to in writing, software
10// distributed under the License is distributed on an "AS IS" BASIS,
11// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12// See the License for the specific language governing permissions and
13// limitations under the License.
14
Guillaume Chatelet8e58ef02018-02-01 10:38:48 +010015#ifndef CPU_FEATURES_INCLUDE_CPU_FEATURES_MACROS_H_
16#define CPU_FEATURES_INCLUDE_CPU_FEATURES_MACROS_H_
Guillaume Chatelet439d3712018-02-01 10:03:09 +010017
18////////////////////////////////////////////////////////////////////////////////
19// Architectures
20////////////////////////////////////////////////////////////////////////////////
21
Guillaume Chateletd8645852019-01-16 14:02:24 +010022#if defined(__pnacl__) || defined(__CLR_VER)
23#define CPU_FEATURES_ARCH_VM
24#endif
25
26#if (defined(_M_IX86) || defined(__i386__)) && !defined(CPU_FEATURES_ARCH_VM)
27#define CPU_FEATURES_ARCH_X86_32
28#endif
29
30#if (defined(_M_X64) || defined(__x86_64__)) && !defined(CPU_FEATURES_ARCH_VM)
31#define CPU_FEATURES_ARCH_X86_64
32#endif
33
34#if defined(CPU_FEATURES_ARCH_X86_32) || defined(CPU_FEATURES_ARCH_X86_64)
Guillaume Chatelet439d3712018-02-01 10:03:09 +010035#define CPU_FEATURES_ARCH_X86
36#endif
37
38#if (defined(__arm__) || defined(_M_ARM))
39#define CPU_FEATURES_ARCH_ARM
40#endif
41
42#if defined(__aarch64__)
43#define CPU_FEATURES_ARCH_AARCH64
44#endif
45
46#if (defined(CPU_FEATURES_ARCH_AARCH64) || defined(CPU_FEATURES_ARCH_ARM))
47#define CPU_FEATURES_ARCH_ANY_ARM
48#endif
49
Guillaume Chateletd8645852019-01-16 14:02:24 +010050#if defined(__mips64)
51#define CPU_FEATURES_ARCH_MIPS64
52#endif
53
54#if defined(__mips__) && !defined(__mips64) // mips64 also declares __mips__
Guillaume Chateletfc7efb42019-01-16 14:26:18 +010055#define CPU_FEATURES_ARCH_MIPS32
56#endif
57
58#if defined(CPU_FEATURES_ARCH_MIPS32) || defined(CPU_FEATURES_ARCH_MIPS64)
Guillaume Chatelet439d3712018-02-01 10:03:09 +010059#define CPU_FEATURES_ARCH_MIPS
60#endif
61
Rashmica Gupta3adafbf2018-04-23 10:46:47 +100062#if defined(__powerpc__)
63#define CPU_FEATURES_ARCH_PPC
64#endif
65
Guillaume Chatelet439d3712018-02-01 10:03:09 +010066////////////////////////////////////////////////////////////////////////////////
67// Os
68////////////////////////////////////////////////////////////////////////////////
69
70#if defined(__linux__)
71#define CPU_FEATURES_OS_LINUX_OR_ANDROID
72#endif
73
74#if defined(__ANDROID__)
75#define CPU_FEATURES_OS_ANDROID
76#endif
77
78#if (defined(_WIN64) || defined(_WIN32))
79#define CPU_FEATURES_OS_WINDOWS
80#endif
81
82////////////////////////////////////////////////////////////////////////////////
83// Compilers
84////////////////////////////////////////////////////////////////////////////////
85
86#if defined(__clang__)
87#define CPU_FEATURES_COMPILER_CLANG
88#endif
89
90#if defined(__GNUC__) && !defined(__clang__)
91#define CPU_FEATURES_COMPILER_GCC
92#endif
93
94#if defined(_MSC_VER)
95#define CPU_FEATURES_COMPILER_MSC
96#endif
97
98////////////////////////////////////////////////////////////////////////////////
99// Cpp
100////////////////////////////////////////////////////////////////////////////////
101
102#if defined(__cplusplus)
Guillaume Chatelete4195732018-02-12 16:15:15 +0100103#define CPU_FEATURES_START_CPP_NAMESPACE \
Guillaume Chateletd8645852019-01-16 14:02:24 +0100104 namespace cpu_features { \
Guillaume Chatelet439d3712018-02-01 10:03:09 +0100105 extern "C" {
Guillaume Chatelete4195732018-02-12 16:15:15 +0100106#define CPU_FEATURES_END_CPP_NAMESPACE \
Guillaume Chateletd8645852019-01-16 14:02:24 +0100107 } \
Guillaume Chatelet439d3712018-02-01 10:03:09 +0100108 }
109#else
Guillaume Chatelete4195732018-02-12 16:15:15 +0100110#define CPU_FEATURES_START_CPP_NAMESPACE
111#define CPU_FEATURES_END_CPP_NAMESPACE
Guillaume Chatelet439d3712018-02-01 10:03:09 +0100112#endif
113
114////////////////////////////////////////////////////////////////////////////////
115// Compiler flags
116////////////////////////////////////////////////////////////////////////////////
117
Guillaume Chateletd8645852019-01-16 14:02:24 +0100118// Use the following to check if a feature is known to be available at
119// compile time. See README.md for an example.
Guillaume Chatelet439d3712018-02-01 10:03:09 +0100120#if defined(CPU_FEATURES_ARCH_X86)
Guillaume Chateleta6d219b2020-01-28 20:36:57 +0100121
122#if defined(__AES__)
123#define CPU_FEATURES_COMPILED_X86_AES 1
124#else
125#define CPU_FEATURES_COMPILED_X86_AES 0
126#endif // defined(__AES__)
127
128#if defined(__F16C__)
129#define CPU_FEATURES_COMPILED_X86_F16C 1
130#else
131#define CPU_FEATURES_COMPILED_X86_F16C 0
132#endif // defined(__F16C__)
133
134#if defined(__BMI__)
135#define CPU_FEATURES_COMPILED_X86_BMI 1
136#else
137#define CPU_FEATURES_COMPILED_X86_BMI 0
138#endif // defined(__BMI__)
139
140#if defined(__BMI2__)
141#define CPU_FEATURES_COMPILED_X86_BMI2 1
142#else
143#define CPU_FEATURES_COMPILED_X86_BMI2 0
144#endif // defined(__BMI2__)
145
146#if (defined(__SSE__) || (_M_IX86_FP >= 1))
147#define CPU_FEATURES_COMPILED_X86_SSE 1
148#else
149#define CPU_FEATURES_COMPILED_X86_SSE 0
Guillaume Chatelet439d3712018-02-01 10:03:09 +0100150#endif
151
Guillaume Chateleta6d219b2020-01-28 20:36:57 +0100152#if (defined(__SSE2__) || (_M_IX86_FP >= 2))
153#define CPU_FEATURES_COMPILED_X86_SSE2 1
154#else
155#define CPU_FEATURES_COMPILED_X86_SSE2 0
156#endif
157
158#if defined(__SSE3__)
159#define CPU_FEATURES_COMPILED_X86_SSE3 1
160#else
161#define CPU_FEATURES_COMPILED_X86_SSE3 0
162#endif // defined(__SSE3__)
163
164#if defined(__SSSE3__)
165#define CPU_FEATURES_COMPILED_X86_SSSE3 1
166#else
167#define CPU_FEATURES_COMPILED_X86_SSSE3 0
168#endif // defined(__SSSE3__)
169
170#if defined(__SSE4_1__)
171#define CPU_FEATURES_COMPILED_X86_SSE4_1 1
172#else
173#define CPU_FEATURES_COMPILED_X86_SSE4_1 0
174#endif // defined(__SSE4_1__)
175
176#if defined(__SSE4_2__)
177#define CPU_FEATURES_COMPILED_X86_SSE4_2 1
178#else
179#define CPU_FEATURES_COMPILED_X86_SSE4_2 0
180#endif // defined(__SSE4_2__)
181
182#if defined(__AVX__)
183#define CPU_FEATURES_COMPILED_X86_AVX 1
184#else
185#define CPU_FEATURES_COMPILED_X86_AVX 0
186#endif // defined(__AVX__)
187
188#if defined(__AVX2__)
Corentin Le Molgatec6354f2020-01-29 08:11:59 +0100189#define CPU_FEATURES_COMPILED_X86_AVX2 1
Guillaume Chateleta6d219b2020-01-28 20:36:57 +0100190#else
Corentin Le Molgatec6354f2020-01-29 08:11:59 +0100191#define CPU_FEATURES_COMPILED_X86_AVX2 0
Guillaume Chateleta6d219b2020-01-28 20:36:57 +0100192#endif // defined(__AVX2__)
193
194#endif // defined(CPU_FEATURES_ARCH_X86)
195
Guillaume Chatelet439d3712018-02-01 10:03:09 +0100196#if defined(CPU_FEATURES_ARCH_ANY_ARM)
Guillaume Chateleta6d219b2020-01-28 20:36:57 +0100197#if defined(__ARM_NEON__)
198#define CPU_FEATURES_COMPILED_ANY_ARM_NEON 1
199#else
200#define CPU_FEATURES_COMPILED_ANY_ARM_NEON 0
201#endif // defined(__ARM_NEON__)
202#endif // defined(CPU_FEATURES_ARCH_ANY_ARM)
Guillaume Chatelet439d3712018-02-01 10:03:09 +0100203
204#if defined(CPU_FEATURES_ARCH_MIPS)
Guillaume Chateleta6d219b2020-01-28 20:36:57 +0100205#if defined(__mips_msa)
206#define CPU_FEATURES_COMPILED_MIPS_MSA 1
207#else
208#define CPU_FEATURES_COMPILED_MIPS_MSA 0
209#endif // defined(__mips_msa)
210#endif // defined(CPU_FEATURES_ARCH_MIPS)
Guillaume Chatelet439d3712018-02-01 10:03:09 +0100211
Guillaume Chatelet8e58ef02018-02-01 10:38:48 +0100212#endif // CPU_FEATURES_INCLUDE_CPU_FEATURES_MACROS_H_