blob: 2227160367aa0f991c30e54d8fe5d53ce194ba0d [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)
121#define CPU_FEATURES_COMPILED_X86_AES defined(__AES__)
122#define CPU_FEATURES_COMPILED_X86_F16C defined(__F16C__)
123#define CPU_FEATURES_COMPILED_X86_BMI defined(__BMI__)
124#define CPU_FEATURES_COMPILED_X86_BMI2 defined(__BMI2__)
125#define CPU_FEATURES_COMPILED_X86_SSE (defined(__SSE__) || (_M_IX86_FP >= 1))
126#define CPU_FEATURES_COMPILED_X86_SSE2 (defined(__SSE2__) || (_M_IX86_FP >= 2))
127#define CPU_FEATURES_COMPILED_X86_SSE3 defined(__SSE3__)
128#define CPU_FEATURES_COMPILED_X86_SSSE3 defined(__SSSE3__)
129#define CPU_FEATURES_COMPILED_X86_SSE4_1 defined(__SSE4_1__)
130#define CPU_FEATURES_COMPILED_X86_SSE4_2 defined(__SSE4_2__)
131#define CPU_FEATURES_COMPILED_X86_AVX defined(__AVX__)
132#define CPU_FEATURES_COMPILED_x86_AVX2 defined(__AVX2__)
133#endif
134
135#if defined(CPU_FEATURES_ARCH_ANY_ARM)
136#define CPU_FEATURES_COMPILED_ANY_ARM_NEON defined(__ARM_NEON__)
137#endif
138
139#if defined(CPU_FEATURES_ARCH_MIPS)
140#define CPU_FEATURES_COMPILED_MIPS_MSA defined(__mips_msa)
141#endif
142
Guillaume Chatelet8e58ef02018-02-01 10:38:48 +0100143#endif // CPU_FEATURES_INCLUDE_CPU_FEATURES_MACROS_H_