blob: 4b231a185e1cfa6a55c9bc7e3d692564f9c86bb5 [file] [log] [blame]
Guillaume Chatelet3cc8f312020-10-12 08:55:20 +00001// Copyright 2017 Google LLC
Guillaume Chatelet439d3712018-02-01 10:03:09 +01002//
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
Guillaume Chatelet47953732020-10-09 17:20:25 +020082#if (defined(__apple__) || defined(__APPLE__) || defined(__MACH__))
83#define CPU_FEATURES_OS_DARWIN
84#endif
85
Guillaume Chatelet439d3712018-02-01 10:03:09 +010086////////////////////////////////////////////////////////////////////////////////
87// Compilers
88////////////////////////////////////////////////////////////////////////////////
89
90#if defined(__clang__)
91#define CPU_FEATURES_COMPILER_CLANG
92#endif
93
94#if defined(__GNUC__) && !defined(__clang__)
95#define CPU_FEATURES_COMPILER_GCC
96#endif
97
98#if defined(_MSC_VER)
99#define CPU_FEATURES_COMPILER_MSC
100#endif
101
102////////////////////////////////////////////////////////////////////////////////
103// Cpp
104////////////////////////////////////////////////////////////////////////////////
105
106#if defined(__cplusplus)
Guillaume Chatelete4195732018-02-12 16:15:15 +0100107#define CPU_FEATURES_START_CPP_NAMESPACE \
Guillaume Chateletd8645852019-01-16 14:02:24 +0100108 namespace cpu_features { \
Guillaume Chatelet439d3712018-02-01 10:03:09 +0100109 extern "C" {
Guillaume Chatelete4195732018-02-12 16:15:15 +0100110#define CPU_FEATURES_END_CPP_NAMESPACE \
Guillaume Chateletd8645852019-01-16 14:02:24 +0100111 } \
Guillaume Chatelet439d3712018-02-01 10:03:09 +0100112 }
113#else
Guillaume Chatelete4195732018-02-12 16:15:15 +0100114#define CPU_FEATURES_START_CPP_NAMESPACE
115#define CPU_FEATURES_END_CPP_NAMESPACE
Guillaume Chatelet439d3712018-02-01 10:03:09 +0100116#endif
117
118////////////////////////////////////////////////////////////////////////////////
119// Compiler flags
120////////////////////////////////////////////////////////////////////////////////
121
Guillaume Chateletd8645852019-01-16 14:02:24 +0100122// Use the following to check if a feature is known to be available at
123// compile time. See README.md for an example.
Guillaume Chatelet439d3712018-02-01 10:03:09 +0100124#if defined(CPU_FEATURES_ARCH_X86)
Guillaume Chateleta6d219b2020-01-28 20:36:57 +0100125
126#if defined(__AES__)
127#define CPU_FEATURES_COMPILED_X86_AES 1
128#else
129#define CPU_FEATURES_COMPILED_X86_AES 0
130#endif // defined(__AES__)
131
132#if defined(__F16C__)
133#define CPU_FEATURES_COMPILED_X86_F16C 1
134#else
135#define CPU_FEATURES_COMPILED_X86_F16C 0
136#endif // defined(__F16C__)
137
138#if defined(__BMI__)
139#define CPU_FEATURES_COMPILED_X86_BMI 1
140#else
141#define CPU_FEATURES_COMPILED_X86_BMI 0
142#endif // defined(__BMI__)
143
144#if defined(__BMI2__)
145#define CPU_FEATURES_COMPILED_X86_BMI2 1
146#else
147#define CPU_FEATURES_COMPILED_X86_BMI2 0
148#endif // defined(__BMI2__)
149
150#if (defined(__SSE__) || (_M_IX86_FP >= 1))
151#define CPU_FEATURES_COMPILED_X86_SSE 1
152#else
153#define CPU_FEATURES_COMPILED_X86_SSE 0
Guillaume Chatelet439d3712018-02-01 10:03:09 +0100154#endif
155
Guillaume Chateleta6d219b2020-01-28 20:36:57 +0100156#if (defined(__SSE2__) || (_M_IX86_FP >= 2))
157#define CPU_FEATURES_COMPILED_X86_SSE2 1
158#else
159#define CPU_FEATURES_COMPILED_X86_SSE2 0
160#endif
161
162#if defined(__SSE3__)
163#define CPU_FEATURES_COMPILED_X86_SSE3 1
164#else
165#define CPU_FEATURES_COMPILED_X86_SSE3 0
166#endif // defined(__SSE3__)
167
168#if defined(__SSSE3__)
169#define CPU_FEATURES_COMPILED_X86_SSSE3 1
170#else
171#define CPU_FEATURES_COMPILED_X86_SSSE3 0
172#endif // defined(__SSSE3__)
173
174#if defined(__SSE4_1__)
175#define CPU_FEATURES_COMPILED_X86_SSE4_1 1
176#else
177#define CPU_FEATURES_COMPILED_X86_SSE4_1 0
178#endif // defined(__SSE4_1__)
179
180#if defined(__SSE4_2__)
181#define CPU_FEATURES_COMPILED_X86_SSE4_2 1
182#else
183#define CPU_FEATURES_COMPILED_X86_SSE4_2 0
184#endif // defined(__SSE4_2__)
185
186#if defined(__AVX__)
187#define CPU_FEATURES_COMPILED_X86_AVX 1
188#else
189#define CPU_FEATURES_COMPILED_X86_AVX 0
190#endif // defined(__AVX__)
191
192#if defined(__AVX2__)
Corentin Le Molgatec6354f2020-01-29 08:11:59 +0100193#define CPU_FEATURES_COMPILED_X86_AVX2 1
Guillaume Chateleta6d219b2020-01-28 20:36:57 +0100194#else
Corentin Le Molgatec6354f2020-01-29 08:11:59 +0100195#define CPU_FEATURES_COMPILED_X86_AVX2 0
Guillaume Chateleta6d219b2020-01-28 20:36:57 +0100196#endif // defined(__AVX2__)
197
198#endif // defined(CPU_FEATURES_ARCH_X86)
199
Guillaume Chatelet439d3712018-02-01 10:03:09 +0100200#if defined(CPU_FEATURES_ARCH_ANY_ARM)
Guillaume Chateleta6d219b2020-01-28 20:36:57 +0100201#if defined(__ARM_NEON__)
202#define CPU_FEATURES_COMPILED_ANY_ARM_NEON 1
203#else
204#define CPU_FEATURES_COMPILED_ANY_ARM_NEON 0
205#endif // defined(__ARM_NEON__)
206#endif // defined(CPU_FEATURES_ARCH_ANY_ARM)
Guillaume Chatelet439d3712018-02-01 10:03:09 +0100207
208#if defined(CPU_FEATURES_ARCH_MIPS)
Guillaume Chateleta6d219b2020-01-28 20:36:57 +0100209#if defined(__mips_msa)
210#define CPU_FEATURES_COMPILED_MIPS_MSA 1
211#else
212#define CPU_FEATURES_COMPILED_MIPS_MSA 0
213#endif // defined(__mips_msa)
214#endif // defined(CPU_FEATURES_ARCH_MIPS)
Guillaume Chatelet439d3712018-02-01 10:03:09 +0100215
Guillaume Chatelet8e58ef02018-02-01 10:38:48 +0100216#endif // CPU_FEATURES_INCLUDE_CPU_FEATURES_MACROS_H_