1 // config_asm.h - written and placed in public domain by Jeffrey Walton 2 // the bits that make up this source file are from the 3 // library's monolithic config.h. 4 5 /// \file config_asm.h 6 /// \brief Library configuration file 7 /// \details <tt>config_asm.h</tt> provides defines for instruction set 8 /// architectures 9 /// and inline assembly. 10 /// \details <tt>config.h</tt> was split into components in May 2019 to better 11 /// integrate with Autoconf and its feature tests. The splitting occurred so 12 /// users could continue to include <tt>config.h</tt> while allowing Autoconf 13 /// to write new <tt>config_asm.h</tt> and new <tt>config_cxx.h</tt> using 14 /// its feature tests. 15 /// \note You should include <tt>config.h</tt> rather than <tt>config_asm.h</tt> 16 /// directly. 17 /// \sa <A HREF="https://github.com/weidai11/cryptopp/issues/835">Issue 835, 18 /// Make config.h more autoconf friendly</A>, 19 /// <A HREF="https://www.cryptopp.com/wiki/Configure.sh">Configure.sh script</A> 20 /// on the Crypto++ wiki 21 /// \since Crypto++ 8.3 22 23 #ifndef CRYPTOPP_CONFIG_ASM_H 24 #define CRYPTOPP_CONFIG_ASM_H 25 26 #include "config_os.h" 27 #include "config_cpu.h" 28 #include "config_ver.h" 29 30 // Define this to disable ASM, intrinsics and built-ins. The library will be 31 // compiled using C++ only. The library code will not include SSE2 (and 32 // above), NEON, Aarch32, Aarch64, or Altivec (and above). Note the compiler 33 // may use higher ISAs depending on compiler options, but the library will not 34 // explicitly use the ISAs. When disabling ASM, it is best to do it from 35 // config.h to ensure the library and all programs share the setting. 36 // #define CRYPTOPP_DISABLE_ASM 1 37 38 // https://github.com/weidai11/cryptopp/issues/719 39 #if defined(__native_client__) 40 # undef CRYPTOPP_DISABLE_ASM 41 # define CRYPTOPP_DISABLE_ASM 1 42 #endif 43 44 // Some Clang and SunCC cannot handle mixed asm with positional arguments, 45 // where the body is Intel style with no prefix and the templates are 46 // AT&T style. Define this if the Makefile misdetects the configuration. 47 // Also see https://bugs.llvm.org/show_bug.cgi?id=39895 . 48 // #define CRYPTOPP_DISABLE_MIXED_ASM 1 49 50 #if defined(__clang__) || (defined(__APPLE__) && defined(__GNUC__)) || defined(__SUNPRO_CC) 51 # undef CRYPTOPP_DISABLE_MIXED_ASM 52 # define CRYPTOPP_DISABLE_MIXED_ASM 1 53 #endif 54 55 // CRYPTOPP_ALLOW_UNALIGNED_DATA_ACCESS is no longer honored. It 56 // was removed at https://github.com/weidai11/cryptopp/issues/682 57 // #define CRYPTOPP_ALLOW_UNALIGNED_DATA_ACCESS 1 58 59 // ***************** IA32 CPU features ******************** 60 61 #if (CRYPTOPP_BOOL_X86 || CRYPTOPP_BOOL_X32 || CRYPTOPP_BOOL_X64) 62 63 // Apple Clang prior to 5.0 cannot handle SSE2 64 #if defined(CRYPTOPP_APPLE_CLANG_VERSION) && (CRYPTOPP_APPLE_CLANG_VERSION < 50000) 65 # define CRYPTOPP_DISABLE_ASM 1 66 #endif 67 68 // Sun Studio 12.1 provides GCC inline assembly 69 // http://blogs.oracle.com/x86be/entry/gcc_style_asm_inlining_support 70 #if defined(__SUNPRO_CC) && (__SUNPRO_CC < 0x5100) 71 # define CRYPTOPP_DISABLE_ASM 1 72 #endif 73 74 // Guard everything in CRYPTOPP_DISABLE_ASM 75 #if !defined(CRYPTOPP_DISABLE_ASM) 76 77 #if (defined(_MSC_VER) && defined(_M_IX86)) || ((defined(__GNUC__) && (defined(__i386__)) || defined(__x86_64__))) 78 // C++Builder 2010 does not allow "call label" where label is defined within inline assembly 79 #define CRYPTOPP_X86_ASM_AVAILABLE 1 80 81 #if !defined(CRYPTOPP_DISABLE_SSE2) && (defined(_MSC_VER) || CRYPTOPP_GCC_VERSION >= 30300 || defined(__SSE2__)) 82 #define CRYPTOPP_SSE2_ASM_AVAILABLE 1 83 #endif 84 85 #if !defined(CRYPTOPP_DISABLE_SSSE3) && (_MSC_VER >= 1500 || CRYPTOPP_GCC_VERSION >= 40300 || defined(__SSSE3__)) 86 #define CRYPTOPP_SSSE3_ASM_AVAILABLE 1 87 #endif 88 #endif 89 90 #if defined(_MSC_VER) && defined(_M_X64) 91 #define CRYPTOPP_X64_MASM_AVAILABLE 1 92 #endif 93 94 #if defined(__GNUC__) && defined(__x86_64__) 95 #define CRYPTOPP_X64_ASM_AVAILABLE 1 96 #endif 97 98 // 32-bit SunCC does not enable SSE2 by default. 99 #if !defined(CRYPTOPP_DISABLE_SSE2) && (defined(_MSC_VER) || CRYPTOPP_GCC_VERSION >= 30300 || defined(__SSE2__) || (__SUNPRO_CC >= 0x5100)) 100 #define CRYPTOPP_SSE2_INTRIN_AVAILABLE 1 101 #endif 102 103 #if !defined(CRYPTOPP_DISABLE_SSSE3) 104 # if defined(__SSSE3__) || (_MSC_VER >= 1500) || \ 105 (CRYPTOPP_GCC_VERSION >= 40300) || (__INTEL_COMPILER >= 1000) || (__SUNPRO_CC >= 0x5110) || \ 106 (CRYPTOPP_LLVM_CLANG_VERSION >= 20300) || (CRYPTOPP_APPLE_CLANG_VERSION >= 40000) 107 #define CRYPTOPP_SSSE3_AVAILABLE 1 108 # endif 109 #endif 110 111 // Intrinsics available in GCC 4.3 (http://gcc.gnu.org/gcc-4.3/changes.html) and 112 // MSVC 2008 (http://msdn.microsoft.com/en-us/library/bb892950%28v=vs.90%29.aspx) 113 // SunCC could generate SSE4 at 12.1, but the intrinsics are missing until 12.4. 114 #if !defined(CRYPTOPP_DISABLE_SSE4) && defined(CRYPTOPP_SSSE3_AVAILABLE) && \ 115 (defined(__SSE4_1__) || (CRYPTOPP_MSC_VERSION >= 1500) || \ 116 (CRYPTOPP_GCC_VERSION >= 40300) || (__INTEL_COMPILER >= 1000) || (__SUNPRO_CC >= 0x5110) || \ 117 (CRYPTOPP_LLVM_CLANG_VERSION >= 20300) || (CRYPTOPP_APPLE_CLANG_VERSION >= 40000)) 118 #define CRYPTOPP_SSE41_AVAILABLE 1 119 #endif 120 121 #if !defined(CRYPTOPP_DISABLE_SSE4) && defined(CRYPTOPP_SSSE3_AVAILABLE) && \ 122 (defined(__SSE4_2__) || (CRYPTOPP_MSC_VERSION >= 1500) || (__SUNPRO_CC >= 0x5110) || \ 123 (CRYPTOPP_GCC_VERSION >= 40300) || (__INTEL_COMPILER >= 1000) || \ 124 (CRYPTOPP_LLVM_CLANG_VERSION >= 20300) || (CRYPTOPP_APPLE_CLANG_VERSION >= 40000)) 125 #define CRYPTOPP_SSE42_AVAILABLE 1 126 #endif 127 128 // Couple to CRYPTOPP_DISABLE_AESNI, but use CRYPTOPP_CLMUL_AVAILABLE so we can selectively 129 // disable for misbehaving platofrms and compilers, like Solaris or some Clang. 130 #if defined(CRYPTOPP_DISABLE_AESNI) 131 #define CRYPTOPP_DISABLE_CLMUL 1 132 #endif 133 134 // Requires Sun Studio 12.3 (SunCC 0x5120) in theory. 135 #if !defined(CRYPTOPP_DISABLE_CLMUL) && defined(CRYPTOPP_SSE42_AVAILABLE) && \ 136 (defined(__PCLMUL__) || (_MSC_FULL_VER >= 150030729) || (__SUNPRO_CC >= 0x5120) || \ 137 (CRYPTOPP_GCC_VERSION >= 40300) || (__INTEL_COMPILER >= 1110) || \ 138 (CRYPTOPP_LLVM_CLANG_VERSION >= 30200) || (CRYPTOPP_APPLE_CLANG_VERSION >= 40300)) 139 #define CRYPTOPP_CLMUL_AVAILABLE 1 140 #endif 141 142 // Requires Sun Studio 12.3 (SunCC 0x5120) 143 #if !defined(CRYPTOPP_DISABLE_AESNI) && defined(CRYPTOPP_SSE42_AVAILABLE) && \ 144 (defined(__AES__) || (_MSC_FULL_VER >= 150030729) || (__SUNPRO_CC >= 0x5120) || \ 145 (CRYPTOPP_GCC_VERSION >= 40300) || (__INTEL_COMPILER >= 1110) || \ 146 (CRYPTOPP_LLVM_CLANG_VERSION >= 30200) || (CRYPTOPP_APPLE_CLANG_VERSION >= 40300)) 147 #define CRYPTOPP_AESNI_AVAILABLE 1 148 #endif 149 150 // Requires Binutils 2.24 151 #if !defined(CRYPTOPP_DISABLE_AVX) && defined(CRYPTOPP_SSE42_AVAILABLE) && \ 152 (defined(__AVX2__) || (CRYPTOPP_MSC_VERSION >= 1800) || (__SUNPRO_CC >= 0x5130) || \ 153 (CRYPTOPP_GCC_VERSION >= 40700) || (__INTEL_COMPILER >= 1400) || \ 154 (CRYPTOPP_LLVM_CLANG_VERSION >= 30100) || (CRYPTOPP_APPLE_CLANG_VERSION >= 40600)) 155 #define CRYPTOPP_AVX_AVAILABLE 1 156 #endif 157 158 // Requires Binutils 2.24 159 #if !defined(CRYPTOPP_DISABLE_AVX2) && defined(CRYPTOPP_AVX_AVAILABLE) && \ 160 (defined(__AVX2__) || (CRYPTOPP_MSC_VERSION >= 1800) || (__SUNPRO_CC >= 0x5130) || \ 161 (CRYPTOPP_GCC_VERSION >= 40900) || (__INTEL_COMPILER >= 1400) || \ 162 (CRYPTOPP_LLVM_CLANG_VERSION >= 30100) || (CRYPTOPP_APPLE_CLANG_VERSION >= 40600)) 163 #define CRYPTOPP_AVX2_AVAILABLE 1 164 #endif 165 166 // Guessing at SHA for SunCC. Its not in Sun Studio 12.6. Also see 167 // http://stackoverflow.com/questions/45872180/which-xarch-for-sha-extensions-on-solaris 168 #if !defined(CRYPTOPP_DISABLE_SHANI) && defined(CRYPTOPP_SSE42_AVAILABLE) && \ 169 (defined(__SHA__) || (CRYPTOPP_MSC_VERSION >= 1900) || (__SUNPRO_CC >= 0x5160) || \ 170 (CRYPTOPP_GCC_VERSION >= 40900) || (__INTEL_COMPILER >= 1300) || \ 171 (CRYPTOPP_LLVM_CLANG_VERSION >= 30400) || (CRYPTOPP_APPLE_CLANG_VERSION >= 50100)) 172 #define CRYPTOPP_SHANI_AVAILABLE 1 173 #endif 174 175 // RDRAND uses byte codes. All we need is x86 ASM for it. 176 // However tie it to AES-NI since SecureKey was available with it. 177 #if !defined(CRYPTOPP_DISABLE_RDRAND) && defined(CRYPTOPP_AESNI_AVAILABLE) 178 #define CRYPTOPP_RDRAND_AVAILABLE 1 179 #endif 180 181 // RDSEED uses byte codes. All we need is x86 ASM for it. 182 // However tie it to AES-NI since SecureKey was available with it. 183 #if !defined(CRYPTOPP_DISABLE_RDSEED) && defined(CRYPTOPP_AESNI_AVAILABLE) 184 #define CRYPTOPP_RDSEED_AVAILABLE 1 185 #endif 186 187 // PadlockRNG uses byte codes. All we need is x86 ASM for it. 188 #if !defined(CRYPTOPP_DISABLE_PADLOCK) && \ 189 !(defined(__ANDROID__) || defined(ANDROID) || defined(__APPLE__)) && \ 190 defined(CRYPTOPP_X86_ASM_AVAILABLE) 191 #define CRYPTOPP_PADLOCK_AVAILABLE 1 192 #define CRYPTOPP_PADLOCK_RNG_AVAILABLE 1 193 #define CRYPTOPP_PADLOCK_ACE_AVAILABLE 1 194 #define CRYPTOPP_PADLOCK_ACE2_AVAILABLE 1 195 #define CRYPTOPP_PADLOCK_PHE_AVAILABLE 1 196 #define CRYPTOPP_PADLOCK_PMM_AVAILABLE 1 197 #endif 198 199 // Fixup Android and SSE, Crypto. It may be enabled based on compiler version. 200 // Also see https://developer.android.com/ndk/guides/abis 201 #if defined(__ANDROID__) || defined(ANDROID) 202 # if (CRYPTOPP_BOOL_X86) 203 # undef CRYPTOPP_SSE41_AVAILABLE 204 # undef CRYPTOPP_SSE42_AVAILABLE 205 # undef CRYPTOPP_CLMUL_AVAILABLE 206 # undef CRYPTOPP_AESNI_AVAILABLE 207 # undef CRYPTOPP_SHANI_AVAILABLE 208 # undef CRYPTOPP_RDRAND_AVAILABLE 209 # undef CRYPTOPP_RDSEED_AVAILABLE 210 # undef CRYPTOPP_AVX_AVAILABLE 211 # undef CRYPTOPP_AVX2_AVAILABLE 212 # endif 213 # if (CRYPTOPP_BOOL_X64) 214 # undef CRYPTOPP_CLMUL_AVAILABLE 215 # undef CRYPTOPP_AESNI_AVAILABLE 216 # undef CRYPTOPP_SHANI_AVAILABLE 217 # undef CRYPTOPP_RDRAND_AVAILABLE 218 # undef CRYPTOPP_RDSEED_AVAILABLE 219 # undef CRYPTOPP_AVX_AVAILABLE 220 # undef CRYPTOPP_AVX2_AVAILABLE 221 # endif 222 #endif 223 224 // Fixup for SunCC 12.1-12.4. Bad code generation in AES_Encrypt and friends. 225 #if defined(__SUNPRO_CC) && (__SUNPRO_CC <= 0x5130) 226 # undef CRYPTOPP_AESNI_AVAILABLE 227 #endif 228 229 // Fixup for SunCC 12.1-12.6. Compiler crash on GCM_Reduce_CLMUL. 230 // http://github.com/weidai11/cryptopp/issues/226 231 #if defined(__SUNPRO_CC) && (__SUNPRO_CC <= 0x5150) 232 # undef CRYPTOPP_CLMUL_AVAILABLE 233 #endif 234 235 #endif // CRYPTOPP_DISABLE_ASM 236 237 #endif // X86, X32, X64 238 239 // ***************** ARM CPU features ******************** 240 241 #if (CRYPTOPP_BOOL_ARM32 || CRYPTOPP_BOOL_ARMV8) 242 243 // We don't have an ARM big endian test rig. Disable 244 // ARM-BE ASM and instrinsics until we can test it. 245 #if (CRYPTOPP_BIG_ENDIAN) 246 # define CRYPTOPP_DISABLE_ASM 1 247 #endif 248 249 // Guard everything in CRYPTOPP_DISABLE_ASM 250 #if !defined(CRYPTOPP_DISABLE_ASM) 251 252 // Requires ACLE 1.0. -mfpu=neon or above must be present 253 // Requires GCC 4.3, Clang 2.8 or Visual Studio 2012 254 // Do not use APPLE_CLANG_VERSION; use __ARM_FEATURE_XXX instead. 255 #if !defined(CRYPTOPP_ARM_NEON_AVAILABLE) && !defined(CRYPTOPP_DISABLE_ARM_NEON) 256 # if defined(__arm__) || defined(__ARM_NEON) || defined(__ARM_FEATURE_NEON) || defined(_M_ARM) 257 # if (CRYPTOPP_GCC_VERSION >= 40300) || (CRYPTOPP_LLVM_CLANG_VERSION >= 20800) || \ 258 (CRYPTOPP_MSC_VERSION >= 1700) 259 # define CRYPTOPP_ARM_NEON_AVAILABLE 1 260 # endif // Compilers 261 # endif // Platforms 262 #endif 263 264 // ARMv8 and ASIMD. -march=armv8-a or above must be present 265 // Requires GCC 4.8, Clang 3.3 or Visual Studio 2017 266 // Do not use APPLE_CLANG_VERSION; use __ARM_FEATURE_XXX instead. 267 #if !defined(CRYPTOPP_ARM_ASIMD_AVAILABLE) && !defined(CRYPTOPP_DISABLE_ARM_ASIMD) 268 # if defined(__aarch32__) || defined(__aarch64__) || defined(_M_ARM64) 269 # if defined(__ARM_NEON) || defined(__ARM_FEATURE_NEON) || defined(__ARM_FEATURE_ASIMD) || \ 270 (CRYPTOPP_GCC_VERSION >= 40800) || (CRYPTOPP_LLVM_CLANG_VERSION >= 30300) || \ 271 (CRYPTOPP_MSC_VERSION >= 1916) 272 # define CRYPTOPP_ARM_NEON_AVAILABLE 1 273 # define CRYPTOPP_ARM_ASIMD_AVAILABLE 1 274 # endif // Compilers 275 # endif // Platforms 276 #endif 277 278 // ARMv8 and ASIMD. -march=armv8-a+crc or above must be present 279 // Requires GCC 4.8, Clang 3.3 or Visual Studio 2017 280 // Do not use APPLE_CLANG_VERSION; use __ARM_FEATURE_XXX instead. 281 #if !defined(CRYPTOPP_ARM_CRC32_AVAILABLE) && !defined(CRYPTOPP_DISABLE_ARM_CRC32) 282 # if defined(__aarch32__) || defined(__aarch64__) || defined(_M_ARM64) 283 # if defined(__ARM_FEATURE_CRC32) || (CRYPTOPP_GCC_VERSION >= 40800) || \ 284 (CRYPTOPP_LLVM_CLANG_VERSION >= 30300) || (CRYPTOPP_MSC_VERSION >= 1916) 285 # define CRYPTOPP_ARM_CRC32_AVAILABLE 1 286 # endif // Compilers 287 # endif // Platforms 288 #endif 289 290 // ARMv8 and AES. -march=armv8-a+crypto or above must be present 291 // Requires GCC 4.8, Clang 3.3 or Visual Studio 2017 292 // Do not use APPLE_CLANG_VERSION; use __ARM_FEATURE_XXX instead. 293 #if !defined(CRYPTOPP_ARM_AES_AVAILABLE) && !defined(CRYPTOPP_DISABLE_ARM_AES) 294 # if defined(__aarch32__) || defined(__aarch64__) || defined(_M_ARM64) 295 # if defined(__ARM_FEATURE_CRYPTO) || (CRYPTOPP_GCC_VERSION >= 40800) || \ 296 (CRYPTOPP_LLVM_CLANG_VERSION >= 30300) || (CRYPTOPP_MSC_VERSION >= 1916) 297 # define CRYPTOPP_ARM_AES_AVAILABLE 1 298 # endif // Compilers 299 # endif // Platforms 300 #endif 301 302 // ARMv8 and PMULL. -march=armv8-a+crypto or above must be present 303 // Requires GCC 4.8, Clang 3.3 or Visual Studio 2017 304 // Do not use APPLE_CLANG_VERSION; use __ARM_FEATURE_XXX instead. 305 #if !defined(CRYPTOPP_ARM_PMULL_AVAILABLE) && !defined(CRYPTOPP_DISABLE_ARM_PMULL) 306 # if defined(__aarch32__) || defined(__aarch64__) || defined(_M_ARM64) 307 # if defined(__ARM_FEATURE_CRYPTO) || (CRYPTOPP_GCC_VERSION >= 40800) || \ 308 (CRYPTOPP_LLVM_CLANG_VERSION >= 30300) || (CRYPTOPP_MSC_VERSION >= 1916) 309 # define CRYPTOPP_ARM_PMULL_AVAILABLE 1 310 # endif // Compilers 311 # endif // Platforms 312 #endif 313 314 // ARMv8 and SHA-1, SHA-256. -march=armv8-a+crypto or above must be present 315 // Requires GCC 4.8, Clang 3.3 or Visual Studio 2017 316 // Do not use APPLE_CLANG_VERSION; use __ARM_FEATURE_XXX instead. 317 #if !defined(CRYPTOPP_ARM_SHA_AVAILABLE) && !defined(CRYPTOPP_DISABLE_ARM_SHA) 318 # if defined(__aarch32__) || defined(__aarch64__) || defined(_M_ARM64) 319 # if defined(__ARM_FEATURE_CRYPTO) || (CRYPTOPP_GCC_VERSION >= 40800) || \ 320 (CRYPTOPP_LLVM_CLANG_VERSION >= 30300) || (CRYPTOPP_MSC_VERSION >= 1916) 321 # define CRYPTOPP_ARM_SHA1_AVAILABLE 1 322 # define CRYPTOPP_ARM_SHA2_AVAILABLE 1 323 # endif // Compilers 324 # endif // Platforms 325 #endif 326 327 // ARMv8 and SHA-512, SHA-3. -march=armv8.2-a+crypto or above must be present 328 // Requires GCC 8.0, Clang ??? or Visual Studio 20?? 329 // Do not use APPLE_CLANG_VERSION; use __ARM_FEATURE_XXX instead. 330 #if !defined(CRYPTOPP_ARM_SHA3_AVAILABLE) && !defined(CRYPTOPP_DISABLE_ARM_SHA) 331 # if defined(__aarch32__) || defined(__aarch64__) || defined(_M_ARM64) 332 # if defined(__ARM_FEATURE_SHA3) || (CRYPTOPP_GCC_VERSION >= 80000) || (CRYPTOPP_APPLE_CLANG_VERSION >= 120000) || (CRYPTOPP_LLVM_CLANG_VERSION >= 110000) 333 # define CRYPTOPP_ARM_SHA512_AVAILABLE 1 334 # define CRYPTOPP_ARM_SHA3_AVAILABLE 1 335 # endif // Compilers 336 # endif // Platforms 337 #endif 338 339 // ARMv8 and SM3, SM4. -march=armv8.2-a+crypto or above must be present 340 // Requires GCC 8.0, Clang ??? or Visual Studio 20?? 341 // Do not use APPLE_CLANG_VERSION; use __ARM_FEATURE_XXX instead. 342 #if !defined(CRYPTOPP_ARM_SM3_AVAILABLE) && !defined(CRYPTOPP_DISABLE_ARM_SM3) 343 # if defined(__aarch32__) || defined(__aarch64__) || defined(_M_ARM64) 344 # if defined(__ARM_FEATURE_SM3) || (CRYPTOPP_GCC_VERSION >= 80000) 345 # define CRYPTOPP_ARM_SM3_AVAILABLE 1 346 # define CRYPTOPP_ARM_SM4_AVAILABLE 1 347 # endif // Compilers 348 # endif // Platforms 349 #endif 350 351 // Limit the <arm_neon.h> include. 352 #if !defined(CRYPTOPP_ARM_NEON_HEADER) 353 # if defined(CRYPTOPP_ARM_NEON_AVAILABLE) || defined (CRYPTOPP_ARM_ASIMD_AVAILABLE) 354 # if !defined(_M_ARM64) 355 # define CRYPTOPP_ARM_NEON_HEADER 1 356 # endif 357 # endif 358 #endif 359 360 // Limit the <arm_acle.h> include. 361 #if !defined(CRYPTOPP_ARM_ACLE_HEADER) 362 # if defined(__aarch32__) || defined(__aarch64__) || (__ARM_ARCH >= 8) || defined(__ARM_ACLE) 363 # define CRYPTOPP_ARM_ACLE_HEADER 1 364 # endif 365 #endif 366 367 // Apple M1 hack. Xcode cross-compiles for iOS lack 368 // arm_acle.h. Apple M1 needs arm_acle.h. The problem 369 // in practice is, we can't get CRYPTOPP_ARM_ACLE_HEADER 370 // quite right based on ARM preprocessor macros. 371 #if defined(__APPLE__) && !defined(__ARM_FEATURE_CRC32) 372 # undef CRYPTOPP_ARM_ACLE_HEADER 373 #endif 374 375 // Android hack. TODO: look at this in more detail 376 // now that Android has switched over to Clang. 377 #if defined(__ANDROID__) || defined(ANDROID) 378 # undef CRYPTOPP_ARM_ACLE_HEADER 379 #endif 380 381 // Disable for Android. Android only offers the base Aarch64 architecture. 382 // Also see https://developer.android.com/ndk/guides/abis 383 #if defined(__ANDROID__) || defined(ANDROID) 384 # undef CRYPTOPP_ARM_CRC32_AVAILABLE 385 # undef CRYPTOPP_ARM_PMULL_AVAILABLE 386 # undef CRYPTOPP_ARM_AES_AVAILABLE 387 # undef CRYPTOPP_ARM_SHA1_AVAILABLE 388 # undef CRYPTOPP_ARM_SHA2_AVAILABLE 389 # undef CRYPTOPP_ARM_SHA3_AVAILABLE 390 # undef CRYPTOPP_ARM_SHA512_AVAILABLE 391 # undef CRYPTOPP_ARM_SM3_AVAILABLE 392 # undef CRYPTOPP_ARM_SM4_AVAILABLE 393 #endif 394 395 // Cryptogams offers an ARM asm implementations for AES and SHA. Crypto++ does 396 // not provide an asm implementation. The Cryptogams AES implementation is 397 // about 50% faster than C/C++, and SHA implementation is about 30% faster 398 // than C/C++. Define this to use the Cryptogams AES and SHA implementations 399 // on GNU Linux systems. When defined, Crypto++ will use aes_armv4.S, 400 // sha1_armv4.S and sha256_armv4.S. https://www.cryptopp.com/wiki/Cryptogams. 401 #if defined(__arm__) && defined(__linux__) 402 # if defined(__GNUC__) || defined(__clang__) 403 # define CRYPTOGAMS_ARM_AES 1 404 # define CRYPTOGAMS_ARM_SHA1 1 405 # define CRYPTOGAMS_ARM_SHA256 1 406 # define CRYPTOGAMS_ARM_SHA512 1 407 # endif 408 #endif 409 410 #endif // CRYPTOPP_DISABLE_ASM 411 412 #endif // ARM32, ARM64 413 414 // ***************** AltiVec and Power8 ******************** 415 416 #if (CRYPTOPP_BOOL_PPC32 || CRYPTOPP_BOOL_PPC64) 417 418 // Guard everything in CRYPTOPP_DISABLE_ASM 419 #if !defined(CRYPTOPP_DISABLE_ASM) && !defined(CRYPTOPP_DISABLE_ALTIVEC) 420 421 // An old Apple G5 with GCC 4.01 has AltiVec, but its only Power4 or so. 422 #if !defined(CRYPTOPP_ALTIVEC_AVAILABLE) 423 # if defined(_ARCH_PWR4) || defined(__ALTIVEC__) || \ 424 (CRYPTOPP_XLC_VERSION >= 100000) || (CRYPTOPP_GCC_VERSION >= 40001) || \ 425 (CRYPTOPP_LLVM_CLANG_VERSION >= 20900) 426 # define CRYPTOPP_ALTIVEC_AVAILABLE 1 427 # endif 428 #endif 429 430 #if defined(CRYPTOPP_ALTIVEC_AVAILABLE) 431 432 // We need Power7 for unaligned loads and stores 433 #if !defined(CRYPTOPP_POWER7_AVAILABLE) && !defined(CRYPTOPP_DISABLE_POWER7) 434 # if defined(_ARCH_PWR7) || (CRYPTOPP_XLC_VERSION >= 100000) || \ 435 (CRYPTOPP_GCC_VERSION >= 40100) || (CRYPTOPP_LLVM_CLANG_VERSION >= 30100) 436 # define CRYPTOPP_POWER7_AVAILABLE 1 437 # endif 438 #endif 439 440 #if defined(CRYPTOPP_POWER7_AVAILABLE) 441 442 // We need Power8 for in-core crypto and 64-bit vector types 443 #if !defined(CRYPTOPP_POWER8_AVAILABLE) && !defined(CRYPTOPP_DISABLE_POWER8) 444 # if defined(_ARCH_PWR8) || (CRYPTOPP_XLC_VERSION >= 130000) || \ 445 (CRYPTOPP_GCC_VERSION >= 40800) || (CRYPTOPP_LLVM_CLANG_VERSION >= 70000) 446 # define CRYPTOPP_POWER8_AVAILABLE 1 447 # endif 448 #endif 449 450 #if !defined(CRYPTOPP_POWER8_AES_AVAILABLE) && !defined(CRYPTOPP_DISABLE_POWER8_AES) && defined(CRYPTOPP_POWER8_AVAILABLE) 451 # if defined(__CRYPTO__) || defined(_ARCH_PWR8) || (CRYPTOPP_XLC_VERSION >= 130000) || \ 452 (CRYPTOPP_GCC_VERSION >= 40800) || (CRYPTOPP_LLVM_CLANG_VERSION >= 70000) 453 //# define CRYPTOPP_POWER8_CRC_AVAILABLE 1 454 # define CRYPTOPP_POWER8_AES_AVAILABLE 1 455 # define CRYPTOPP_POWER8_VMULL_AVAILABLE 1 456 # define CRYPTOPP_POWER8_SHA_AVAILABLE 1 457 # endif 458 #endif 459 460 #if defined(CRYPTOPP_POWER8_AVAILABLE) 461 462 // Power9 for random numbers 463 #if !defined(CRYPTOPP_POWER9_AVAILABLE) && !defined(CRYPTOPP_DISABLE_POWER9) 464 # if defined(_ARCH_PWR9) || (CRYPTOPP_XLC_VERSION >= 130200) || \ 465 (CRYPTOPP_GCC_VERSION >= 70000) || (CRYPTOPP_LLVM_CLANG_VERSION >= 80000) 466 # define CRYPTOPP_POWER9_AVAILABLE 1 467 # endif 468 #endif 469 470 #endif // CRYPTOPP_POWER8_AVAILABLE 471 #endif // CRYPTOPP_POWER7_AVAILABLE 472 #endif // CRYPTOPP_ALTIVEC_AVAILABLE 473 #endif // CRYPTOPP_DISABLE_ASM 474 #endif // PPC32, PPC64 475 476 #endif // CRYPTOPP_CONFIG_ASM_H 477