1 // Copyright 2017 Google LLC 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 15 #ifndef CPU_FEATURES_INCLUDE_CPU_FEATURES_MACROS_H_ 16 #define CPU_FEATURES_INCLUDE_CPU_FEATURES_MACROS_H_ 17 18 //////////////////////////////////////////////////////////////////////////////// 19 // Architectures 20 //////////////////////////////////////////////////////////////////////////////// 21 22 #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) 35 #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 50 #if defined(__mips64) 51 #define CPU_FEATURES_ARCH_MIPS64 52 #endif 53 54 #if defined(__mips__) && !defined(__mips64) // mips64 also declares __mips__ 55 #define CPU_FEATURES_ARCH_MIPS32 56 #endif 57 58 #if defined(CPU_FEATURES_ARCH_MIPS32) || defined(CPU_FEATURES_ARCH_MIPS64) 59 #define CPU_FEATURES_ARCH_MIPS 60 #endif 61 62 #if defined(__powerpc__) 63 #define CPU_FEATURES_ARCH_PPC 64 #endif 65 66 //////////////////////////////////////////////////////////////////////////////// 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 #if (defined(__apple__) || defined(__APPLE__) || defined(__MACH__)) 83 #define CPU_FEATURES_OS_DARWIN 84 #endif 85 86 //////////////////////////////////////////////////////////////////////////////// 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) 107 #define CPU_FEATURES_START_CPP_NAMESPACE \ 108 namespace cpu_features { \ 109 extern "C" { 110 #define CPU_FEATURES_END_CPP_NAMESPACE \ 111 } \ 112 } 113 #else 114 #define CPU_FEATURES_START_CPP_NAMESPACE 115 #define CPU_FEATURES_END_CPP_NAMESPACE 116 #endif 117 118 //////////////////////////////////////////////////////////////////////////////// 119 // Compiler flags 120 //////////////////////////////////////////////////////////////////////////////// 121 122 // Use the following to check if a feature is known to be available at 123 // compile time. See README.md for an example. 124 #if defined(CPU_FEATURES_ARCH_X86) 125 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 154 #endif 155 156 #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__) 193 #define CPU_FEATURES_COMPILED_X86_AVX2 1 194 #else 195 #define CPU_FEATURES_COMPILED_X86_AVX2 0 196 #endif // defined(__AVX2__) 197 198 #endif // defined(CPU_FEATURES_ARCH_X86) 199 200 #if defined(CPU_FEATURES_ARCH_ANY_ARM) 201 #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) 207 208 #if defined(CPU_FEATURES_ARCH_MIPS) 209 #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) 215 216 #endif // CPU_FEATURES_INCLUDE_CPU_FEATURES_MACROS_H_ 217