6 #ifndef EXCEPTION_EXECUTE_HANDLER 7 # define EXCEPTION_EXECUTE_HANDLER 1 10 #ifndef CRYPTOPP_IMPORTS 17 # include <sys/systemcfg.h> 26 #if (((__GLIBC__ * 100) + __GLIBC_MINOR__) >= 216) 27 # define CRYPTOPP_GETAUXV_AVAILABLE 1 30 #if CRYPTOPP_GETAUXV_AVAILABLE 31 # include <sys/auxv.h> 39 unsigned long int getauxval(
unsigned long int) {
return 0; }
42 #if defined(__APPLE__) && (defined(__aarch64__) || defined(__POWERPC__)) 43 # include <sys/utsname.h> 48 #if defined(__ANDROID__) 49 # include "cpu-features.h" 52 #ifdef CRYPTOPP_GNU_STYLE_INLINE_ASSEMBLY 59 #ifndef CRYPTOPP_MS_STYLE_INLINE_ASSEMBLY 61 typedef void (*SigHandler)(int);
66 static jmp_buf s_jmpNoCPUID;
67 static void SigIllHandlerCPUID(
int unused)
69 CRYPTOPP_UNUSED(unused);
70 longjmp(s_jmpNoCPUID, 1);
73 #endif // Not CRYPTOPP_MS_STYLE_INLINE_ASSEMBLY 77 #if (CRYPTOPP_BOOL_X86 || CRYPTOPP_BOOL_X32 || CRYPTOPP_BOOL_X64) 79 extern bool CPU_ProbeSSE2();
83 inline bool CpuId(word32 func, word32 subfunc, word32 output[4])
85 __cpuidex((
int *)output, func, subfunc);
89 #elif _MSC_VER >= 1400 && CRYPTOPP_BOOL_X64 91 inline bool CpuId(word32 func, word32 subfunc, word32 output[4])
96 __cpuid((
int *)output, func);
104 bool CpuId(word32 func, word32 subfunc, word32 output[4])
106 #if defined(CRYPTOPP_MS_STYLE_INLINE_ASSEMBLY) || defined(__BORLANDC__) 128 __except (EXCEPTION_EXECUTE_HANDLER)
137 return output[0] != 0;
143 volatile bool result =
true;
145 volatile SigHandler oldHandler = signal(SIGILL, SigIllHandlerCPUID);
146 if (oldHandler == SIG_ERR)
150 volatile sigset_t oldMask;
151 if (sigprocmask(0, NULLPTR, (sigset_t*)&oldMask) != 0)
155 if (setjmp(s_jmpNoCPUID))
163 # if CRYPTOPP_BOOL_X32 || CRYPTOPP_BOOL_X64 164 "pushq %%rbx; cpuid; mov %%ebx, %%edi; popq %%rbx" 166 "push %%ebx; cpuid; mov %%ebx, %%edi; pop %%ebx" 168 :
"=a" (output[0]),
"=D" (output[1]),
"=c" (output[2]),
"=d" (output[3])
169 :
"a" (func),
"c" (subfunc)
175 sigprocmask(SIG_SETMASK, (sigset_t*)&oldMask, NULLPTR);
178 signal(SIGILL, oldHandler);
185 bool CRYPTOPP_SECTION_INIT g_x86DetectionDone =
false;
186 bool CRYPTOPP_SECTION_INIT g_hasSSE2 =
false;
187 bool CRYPTOPP_SECTION_INIT g_hasSSSE3 =
false;
188 bool CRYPTOPP_SECTION_INIT g_hasSSE41 =
false;
189 bool CRYPTOPP_SECTION_INIT g_hasSSE42 =
false;
190 bool CRYPTOPP_SECTION_INIT g_hasAESNI =
false;
191 bool CRYPTOPP_SECTION_INIT g_hasCLMUL =
false;
192 bool CRYPTOPP_SECTION_INIT g_hasADX =
false;
193 bool CRYPTOPP_SECTION_INIT g_hasSHA =
false;
194 bool CRYPTOPP_SECTION_INIT g_hasRDRAND =
false;
195 bool CRYPTOPP_SECTION_INIT g_hasRDSEED =
false;
196 bool CRYPTOPP_SECTION_INIT g_isP4 =
false;
197 bool CRYPTOPP_SECTION_INIT g_hasPadlockRNG =
false;
198 bool CRYPTOPP_SECTION_INIT g_hasPadlockACE =
false;
199 bool CRYPTOPP_SECTION_INIT g_hasPadlockACE2 =
false;
200 bool CRYPTOPP_SECTION_INIT g_hasPadlockPHE =
false;
201 bool CRYPTOPP_SECTION_INIT g_hasPadlockPMM =
false;
202 word32 CRYPTOPP_SECTION_INIT g_cacheLineSize = CRYPTOPP_L1_CACHE_LINE_SIZE;
204 static inline bool IsIntel(
const word32 output[4])
207 return (output[1] == 0x756e6547) &&
208 (output[2] == 0x6c65746e) &&
209 (output[3] == 0x49656e69);
212 static inline bool IsAMD(
const word32 output[4])
215 return (output[1] == 0x68747541) &&
216 (output[2] == 0x444D4163) &&
217 (output[3] == 0x69746E65);
220 static inline bool IsVIA(
const word32 output[4])
223 return (output[1] == 0x746e6543) &&
224 (output[2] == 0x736c7561) &&
225 (output[3] == 0x48727561);
228 void DetectX86Features()
231 word32 cpuid0[4]={0}, cpuid1[4]={0}, cpuid2[4]={0};
232 if (!CpuId(0, 0, cpuid0))
234 if (!CpuId(1, 0, cpuid1))
239 if ((cpuid1[3] & (1 << 26)) != 0)
240 g_hasSSE2 = ((cpuid1[2] & (1 << 27)) != 0) || CPU_ProbeSSE2();
242 g_hasSSSE3 = g_hasSSE2 && ((cpuid1[2] & (1<< 9)) != 0);
243 g_hasSSE41 = g_hasSSE2 && ((cpuid1[2] & (1<<19)) != 0);
244 g_hasSSE42 = g_hasSSE2 && ((cpuid1[2] & (1<<20)) != 0);
245 g_hasAESNI = g_hasSSE2 && ((cpuid1[2] & (1<<25)) != 0);
246 g_hasCLMUL = g_hasSSE2 && ((cpuid1[2] & (1<< 1)) != 0);
250 CRYPTOPP_CONSTANT(RDRAND_FLAG = (1 << 30))
251 CRYPTOPP_CONSTANT(RDSEED_FLAG = (1 << 18))
252 CRYPTOPP_CONSTANT( ADX_FLAG = (1 << 19))
253 CRYPTOPP_CONSTANT( SHA_FLAG = (1 << 29))
255 g_isP4 = ((cpuid1[0] >> 8) & 0xf) == 0xf;
256 g_cacheLineSize = 8 * GETBYTE(cpuid1[1], 1);
257 g_hasRDRAND = (cpuid1[2] & RDRAND_FLAG) != 0;
261 if (CpuId(7, 0, cpuid2))
263 g_hasRDSEED = (cpuid2[1] & RDSEED_FLAG) != 0;
264 g_hasADX = (cpuid2[1] & ADX_FLAG) != 0;
265 g_hasSHA = (cpuid2[1] & SHA_FLAG) != 0;
269 else if (IsAMD(cpuid0))
271 CRYPTOPP_CONSTANT(RDRAND_FLAG = (1 << 30))
272 CRYPTOPP_CONSTANT(RDSEED_FLAG = (1 << 18))
273 CRYPTOPP_CONSTANT( ADX_FLAG = (1 << 19))
274 CRYPTOPP_CONSTANT( SHA_FLAG = (1 << 29))
276 CpuId(0x80000005, 0, cpuid2);
277 g_cacheLineSize = GETBYTE(cpuid2[2], 0);
278 g_hasRDRAND = (cpuid1[2] & RDRAND_FLAG) != 0;
282 if (CpuId(7, 0, cpuid2))
284 g_hasRDSEED = (cpuid2[1] & RDSEED_FLAG) != 0;
285 g_hasADX = (cpuid2[1] & ADX_FLAG) != 0;
286 g_hasSHA = (cpuid2[1] & SHA_FLAG) != 0;
290 else if (IsVIA(cpuid0))
292 CRYPTOPP_CONSTANT( RNG_FLAGS = (0x3 << 2))
293 CRYPTOPP_CONSTANT( ACE_FLAGS = (0x3 << 6))
294 CRYPTOPP_CONSTANT(ACE2_FLAGS = (0x3 << 8))
295 CRYPTOPP_CONSTANT( PHE_FLAGS = (0x3 << 10))
296 CRYPTOPP_CONSTANT( PMM_FLAGS = (0x3 << 12))
298 CpuId(0xC0000000, 0, cpuid2);
299 if (cpuid2[0] >= 0xC0000001)
302 CpuId(0xC0000001, 0, cpuid2);
303 g_hasPadlockRNG = (cpuid2[3] & RNG_FLAGS) != 0;
304 g_hasPadlockACE = (cpuid2[3] & ACE_FLAGS) != 0;
305 g_hasPadlockACE2 = (cpuid2[3] & ACE2_FLAGS) != 0;
306 g_hasPadlockPHE = (cpuid2[3] & PHE_FLAGS) != 0;
307 g_hasPadlockPMM = (cpuid2[3] & PMM_FLAGS) != 0;
311 if (g_cacheLineSize == 0)
312 g_cacheLineSize = CRYPTOPP_L1_CACHE_LINE_SIZE;
314 *const_cast<volatile bool*>(&g_x86DetectionDone) =
true;
319 #elif (CRYPTOPP_BOOL_ARM32 || CRYPTOPP_BOOL_ARM64) 321 bool CRYPTOPP_SECTION_INIT g_ArmDetectionDone =
false;
322 bool CRYPTOPP_SECTION_INIT g_hasNEON =
false;
323 bool CRYPTOPP_SECTION_INIT g_hasPMULL =
false;
324 bool CRYPTOPP_SECTION_INIT g_hasCRC32 =
false;
325 bool CRYPTOPP_SECTION_INIT g_hasAES =
false;
326 bool CRYPTOPP_SECTION_INIT g_hasSHA1 =
false;
327 bool CRYPTOPP_SECTION_INIT g_hasSHA2 =
false;
328 word32 CRYPTOPP_SECTION_INIT g_cacheLineSize = CRYPTOPP_L1_CACHE_LINE_SIZE;
343 extern bool CPU_ProbeNEON();
344 extern bool CPU_ProbeCRC32();
345 extern bool CPU_ProbeAES();
346 extern bool CPU_ProbeSHA1();
347 extern bool CPU_ProbeSHA2();
348 extern bool CPU_ProbePMULL();
351 # define HWCAP_ASIMD (1 << 1) 353 #ifndef HWCAP_ARM_NEON 354 # define HWCAP_ARM_NEON 4096 357 # define HWCAP_CRC32 (1 << 7) 360 # define HWCAP2_CRC32 (1 << 4) 363 # define HWCAP_PMULL (1 << 4) 366 # define HWCAP2_PMULL (1 << 1) 369 # define HWCAP_AES (1 << 3) 372 # define HWCAP2_AES (1 << 0) 375 # define HWCAP_SHA1 (1 << 5) 378 # define HWCAP_SHA2 (1 << 6) 381 # define HWCAP2_SHA1 (1 << 2) 384 # define HWCAP2_SHA2 (1 << 3) 387 inline bool CPU_QueryNEON()
389 #if defined(__ANDROID__) && defined(__aarch64__) 390 if (((android_getCpuFamily() & ANDROID_CPU_FAMILY_ARM64) != 0) &&
391 ((android_getCpuFeatures() & ANDROID_CPU_ARM64_FEATURE_ASIMD) != 0))
393 #elif defined(__ANDROID__) && defined(__arm__) 394 if (((android_getCpuFamily() & ANDROID_CPU_FAMILY_ARM) != 0) &&
395 ((android_getCpuFeatures() & ANDROID_CPU_ARM_FEATURE_NEON) != 0))
397 #elif defined(__linux__) && defined(__aarch64__) 398 if ((getauxval(AT_HWCAP) & HWCAP_ASIMD) != 0)
400 #elif defined(__linux__) && defined(__aarch32__) 401 if ((getauxval(AT_HWCAP2) & HWCAP2_ASIMD) != 0)
403 #elif defined(__linux__) && defined(__arm__) 404 if ((getauxval(AT_HWCAP) & HWCAP_ARM_NEON) != 0)
406 #elif defined(__APPLE__) && defined(__aarch64__) 413 inline bool CPU_QueryCRC32()
415 #if defined(__ANDROID__) && defined(__aarch64__) 416 if (((android_getCpuFamily() & ANDROID_CPU_FAMILY_ARM64) != 0) &&
417 ((android_getCpuFeatures() & ANDROID_CPU_ARM64_FEATURE_CRC32) != 0))
419 #elif defined(__ANDROID__) && defined(__aarch32__) 420 if (((android_getCpuFamily() & ANDROID_CPU_FAMILY_ARM) != 0) &&
421 ((android_getCpuFeatures() & ANDROID_CPU_ARM_FEATURE_CRC32) != 0))
423 #elif defined(__linux__) && defined(__aarch64__) 424 if ((getauxval(AT_HWCAP) & HWCAP_CRC32) != 0)
426 #elif defined(__linux__) && defined(__aarch32__) 427 if ((getauxval(AT_HWCAP2) & HWCAP2_CRC32) != 0)
429 #elif defined(__APPLE__) && defined(__aarch64__) 436 inline bool CPU_QueryPMULL()
438 #if defined(__ANDROID__) && defined(__aarch64__) 439 if (((android_getCpuFamily() & ANDROID_CPU_FAMILY_ARM64) != 0) &&
440 ((android_getCpuFeatures() & ANDROID_CPU_ARM64_FEATURE_PMULL) != 0))
442 #elif defined(__ANDROID__) && defined(__aarch32__) 443 if (((android_getCpuFamily() & ANDROID_CPU_FAMILY_ARM) != 0) &&
444 ((android_getCpuFeatures() & ANDROID_CPU_ARM_FEATURE_PMULL) != 0))
446 #elif defined(__linux__) && defined(__aarch64__) 447 if ((getauxval(AT_HWCAP) & HWCAP_PMULL) != 0)
449 #elif defined(__linux__) && defined(__aarch32__) 450 if ((getauxval(AT_HWCAP2) & HWCAP2_PMULL) != 0)
452 #elif defined(__APPLE__) && defined(__aarch64__) 459 inline bool CPU_QueryAES()
461 #if defined(__ANDROID__) && defined(__aarch64__) 462 if (((android_getCpuFamily() & ANDROID_CPU_FAMILY_ARM64) != 0) &&
463 ((android_getCpuFeatures() & ANDROID_CPU_ARM64_FEATURE_AES) != 0))
465 #elif defined(__ANDROID__) && defined(__aarch32__) 466 if (((android_getCpuFamily() & ANDROID_CPU_FAMILY_ARM) != 0) &&
467 ((android_getCpuFeatures() & ANDROID_CPU_ARM_FEATURE_AES) != 0))
469 #elif defined(__linux__) && defined(__aarch64__) 470 if ((getauxval(AT_HWCAP) & HWCAP_AES) != 0)
472 #elif defined(__linux__) && defined(__aarch32__) 473 if ((getauxval(AT_HWCAP2) & HWCAP2_AES) != 0)
475 #elif defined(__APPLE__) && defined(__aarch64__) 477 struct utsname systemInfo;
478 systemInfo.machine[0] =
'\0';
482 std::string machine(systemInfo.machine);
483 if (machine.substr(0, 7) ==
"iPhone6" || machine.substr(0, 7) ==
"iPhone7" ||
484 machine.substr(0, 7) ==
"iPhone8" || machine.substr(0, 7) ==
"iPhone9" ||
485 machine.substr(0, 5) ==
"iPad4" || machine.substr(0, 5) ==
"iPad5" ||
486 machine.substr(0, 5) ==
"iPad6" || machine.substr(0, 5) ==
"iPad7")
494 inline bool CPU_QuerySHA1()
496 #if defined(__ANDROID__) && defined(__aarch64__) 497 if (((android_getCpuFamily() & ANDROID_CPU_FAMILY_ARM64) != 0) &&
498 ((android_getCpuFeatures() & ANDROID_CPU_ARM64_FEATURE_SHA1) != 0))
500 #elif defined(__ANDROID__) && defined(__aarch32__) 501 if (((android_getCpuFamily() & ANDROID_CPU_FAMILY_ARM) != 0) &&
502 ((android_getCpuFeatures() & ANDROID_CPU_ARM_FEATURE_SHA1) != 0))
504 #elif defined(__linux__) && defined(__aarch64__) 505 if ((getauxval(AT_HWCAP) & HWCAP_SHA1) != 0)
507 #elif defined(__linux__) && defined(__aarch32__) 508 if ((getauxval(AT_HWCAP2) & HWCAP2_SHA1) != 0)
510 #elif defined(__APPLE__) && defined(__aarch64__) 512 struct utsname systemInfo;
513 systemInfo.machine[0] =
'\0';
517 std::string machine(systemInfo.machine);
518 if (machine.substr(0, 7) ==
"iPhone6" || machine.substr(0, 7) ==
"iPhone7" ||
519 machine.substr(0, 7) ==
"iPhone8" || machine.substr(0, 7) ==
"iPhone9" ||
520 machine.substr(0, 5) ==
"iPad4" || machine.substr(0, 5) ==
"iPad5" ||
521 machine.substr(0, 5) ==
"iPad6" || machine.substr(0, 5) ==
"iPad7")
529 inline bool CPU_QuerySHA2()
531 #if defined(__ANDROID__) && defined(__aarch64__) 532 if (((android_getCpuFamily() & ANDROID_CPU_FAMILY_ARM64) != 0) &&
533 ((android_getCpuFeatures() & ANDROID_CPU_ARM64_FEATURE_SHA2) != 0))
535 #elif defined(__ANDROID__) && defined(__aarch32__) 536 if (((android_getCpuFamily() & ANDROID_CPU_FAMILY_ARM) != 0) &&
537 ((android_getCpuFeatures() & ANDROID_CPU_ARM_FEATURE_SHA2) != 0))
539 #elif defined(__linux__) && defined(__aarch64__) 540 if ((getauxval(AT_HWCAP) & HWCAP_SHA2) != 0)
542 #elif defined(__linux__) && defined(__aarch32__) 543 if ((getauxval(AT_HWCAP2) & HWCAP2_SHA2) != 0)
545 #elif defined(__APPLE__) && defined(__aarch64__) 547 struct utsname systemInfo;
548 systemInfo.machine[0] =
'\0';
552 std::string machine(systemInfo.machine);
553 if (machine.substr(0, 7) ==
"iPhone6" || machine.substr(0, 7) ==
"iPhone7" ||
554 machine.substr(0, 7) ==
"iPhone8" || machine.substr(0, 7) ==
"iPhone9" ||
555 machine.substr(0, 5) ==
"iPad4" || machine.substr(0, 5) ==
"iPad5" ||
556 machine.substr(0, 5) ==
"iPad6" || machine.substr(0, 5) ==
"iPad7")
564 void DetectArmFeatures()
568 g_hasNEON = CPU_QueryNEON() || CPU_ProbeNEON();
569 g_hasCRC32 = CPU_QueryCRC32() || CPU_ProbeCRC32();
570 g_hasPMULL = CPU_QueryPMULL() || CPU_ProbePMULL();
571 g_hasAES = CPU_QueryAES() || CPU_ProbeAES();
572 g_hasSHA1 = CPU_QuerySHA1() || CPU_ProbeSHA1();
573 g_hasSHA2 = CPU_QuerySHA2() || CPU_ProbeSHA2();
575 #if defined(__linux__) && defined(_SC_LEVEL1_DCACHE_LINESIZE) 578 int cacheLineSize = sysconf(_SC_LEVEL1_DCACHE_LINESIZE);
579 if (cacheLineSize > 0)
580 g_cacheLineSize = cacheLineSize;
583 *const_cast<volatile bool*>(&g_ArmDetectionDone) =
true;
588 #elif (CRYPTOPP_BOOL_PPC32 || CRYPTOPP_BOOL_PPC64) 590 bool CRYPTOPP_SECTION_INIT g_PowerpcDetectionDone =
false;
591 bool CRYPTOPP_SECTION_INIT g_hasAltivec =
false;
592 bool CRYPTOPP_SECTION_INIT g_hasPower7 =
false;
593 bool CRYPTOPP_SECTION_INIT g_hasPower8 =
false;
594 bool CRYPTOPP_SECTION_INIT g_hasAES =
false;
595 bool CRYPTOPP_SECTION_INIT g_hasSHA256 =
false;
596 bool CRYPTOPP_SECTION_INIT g_hasSHA512 =
false;
597 word32 CRYPTOPP_SECTION_INIT g_cacheLineSize = CRYPTOPP_L1_CACHE_LINE_SIZE;
599 extern bool CPU_ProbeAltivec();
600 extern bool CPU_ProbePower7();
601 extern bool CPU_ProbePower8();
602 extern bool CPU_ProbeAES();
603 extern bool CPU_ProbeSHA256();
604 extern bool CPU_ProbeSHA512();
606 #ifndef PPC_FEATURE_HAS_ALTIVEC 607 # define PPC_FEATURE_HAS_ALTIVEC 0x10000000 609 #ifndef PPC_FEATURE_ARCH_2_06 610 # define PPC_FEATURE_ARCH_2_06 0x00000100 612 #ifndef PPC_FEATURE2_ARCH_2_07 613 # define PPC_FEATURE2_ARCH_2_07 0x80000000 615 #ifndef PPC_FEATURE2_VEC_CRYPTO 616 # define PPC_FEATURE2_VEC_CRYPTO 0x02000000 619 inline bool CPU_QueryAltivec()
621 #if defined(__linux__) 622 if ((getauxval(AT_HWCAP) & PPC_FEATURE_HAS_ALTIVEC) != 0)
625 if (__power_vmx() != 0)
627 #elif defined(__APPLE__) && defined(__POWERPC__) 629 struct utsname systemInfo;
630 systemInfo.machine[0] =
'\0';
634 std::string machine(systemInfo.machine);
635 if (machine.substr(0, 15) ==
"Power Macintosh")
643 inline bool CPU_QueryPower7()
646 #if defined(__linux__) 647 if ((getauxval(AT_HWCAP) & PPC_FEATURE_ARCH_2_06) != 0)
650 if (__power_7_andup() != 0)
656 inline bool CPU_QueryPower8()
659 #if defined(__linux__) 660 if ((getauxval(AT_HWCAP2) & PPC_FEATURE2_ARCH_2_07) != 0)
663 if (__power_8_andup() != 0)
669 inline bool CPU_QueryAES()
673 #if defined(__linux__) 674 if ((getauxval(AT_HWCAP2) & PPC_FEATURE2_VEC_CRYPTO) != 0)
677 if (__power_8_andup() != 0)
683 inline bool CPU_QuerySHA256()
687 #if defined(__linux__) 688 if ((getauxval(AT_HWCAP2) & PPC_FEATURE2_VEC_CRYPTO) != 0)
691 if (__power_8_andup() != 0)
696 inline bool CPU_QuerySHA512()
700 #if defined(__linux__) 701 if ((getauxval(AT_HWCAP2) & PPC_FEATURE2_VEC_CRYPTO) != 0)
704 if (__power_8_andup() != 0)
710 void DetectPowerpcFeatures()
714 g_hasAltivec = CPU_QueryAltivec() || CPU_ProbeAltivec();
715 g_hasPower7 = CPU_QueryPower7() || CPU_ProbePower7();
716 g_hasPower8 = CPU_QueryPower8() || CPU_ProbePower8();
718 g_hasAES = CPU_QueryAES() || CPU_ProbeAES();
719 g_hasSHA256 = CPU_QuerySHA256() || CPU_ProbeSHA256();
720 g_hasSHA512 = CPU_QuerySHA512() || CPU_ProbeSHA512();
722 #if defined(_AIX) && defined(SC_L1C_DLS) 724 int cacheLineSize = getsystemcfg(SC_L1C_DLS);
725 if (cacheLineSize > 0)
726 g_cacheLineSize = cacheLineSize;
727 #elif defined(__linux__) && defined(_SC_LEVEL1_DCACHE_LINESIZE) 730 int cacheLineSize = sysconf(_SC_LEVEL1_DCACHE_LINESIZE);
731 if (cacheLineSize > 0)
732 g_cacheLineSize = cacheLineSize;
735 *const_cast<volatile bool*>(&g_PowerpcDetectionDone) =
true;
743 ANONYMOUS_NAMESPACE_BEGIN
750 #if CRYPTOPP_BOOL_X86 || CRYPTOPP_BOOL_X32 || CRYPTOPP_BOOL_X64 751 CryptoPP::DetectX86Features();
752 #elif CRYPTOPP_BOOL_ARM32 || CRYPTOPP_BOOL_ARM64 753 CryptoPP::DetectArmFeatures();
754 #elif CRYPTOPP_BOOL_PPC32 || CRYPTOPP_BOOL_PPC64 755 CryptoPP::DetectPowerpcFeatures();
764 #if HAVE_GCC_INIT_PRIORITY 765 const InitCpu s_init __attribute__ ((init_priority (CRYPTOPP_INIT_PRIORITY + 10))) = InitCpu();
766 #elif HAVE_MSC_INIT_PRIORITY 767 #pragma warning(disable: 4075) 768 #pragma init_seg(".CRT$XCU") 769 const InitCpu s_init;
770 #pragma warning(default: 4075) 772 const InitCpu s_init;
775 ANONYMOUS_NAMESPACE_END
777 #endif // CRYPTOPP_IMPORTS Utility functions for the Crypto++ library.
Library configuration file.
Functions for CPU features and intrinsics.
Crypto++ library namespace.