Crypto++
8.3
Free C++ class library of cryptographic schemes
|
Go to the documentation of this file.
30 #ifndef CRYPTOPP_CPU_H
31 #define CRYPTOPP_CPU_H
36 #if CRYPTOPP_GCC_DIAGNOSTIC_AVAILABLE
37 # pragma GCC diagnostic push
38 # pragma GCC diagnostic ignored "-Wconversion"
39 # pragma GCC diagnostic ignored "-Wsign-conversion"
43 #if defined(CRYPTOPP_LLVM_CLANG_VERSION) || defined(CRYPTOPP_APPLE_CLANG_VERSION)
45 #define INTEL_PREFIX ".intel_syntax;"
46 #define INTEL_NOPREFIX ".intel_syntax;"
47 #define ATT_PREFIX ".att_syntax;"
48 #define ATT_NOPREFIX ".att_syntax;"
49 #elif defined(__GNUC__)
51 #define INTEL_PREFIX ".intel_syntax prefix;"
52 #define INTEL_NOPREFIX ".intel_syntax noprefix;"
53 #define ATT_PREFIX ".att_syntax prefix;"
54 #define ATT_NOPREFIX ".att_syntax noprefix;"
58 #define INTEL_NOPREFIX
63 #ifdef CRYPTOPP_GENERATE_X64_MASM
65 #define CRYPTOPP_X86_ASM_AVAILABLE
66 #define CRYPTOPP_BOOL_X64 1
67 #define CRYPTOPP_SSE2_ASM_AVAILABLE 1
76 #if CRYPTOPP_BOOL_X86 || CRYPTOPP_BOOL_X32 || CRYPTOPP_BOOL_X64 || CRYPTOPP_DOXYGEN_PROCESSING
78 #define CRYPTOPP_CPUID_AVAILABLE 1
81 #ifndef CRYPTOPP_DOXYGEN_PROCESSING
83 extern CRYPTOPP_DLL
bool g_x86DetectionDone;
84 extern CRYPTOPP_DLL
bool g_hasSSE2;
85 extern CRYPTOPP_DLL
bool g_hasSSSE3;
86 extern CRYPTOPP_DLL
bool g_hasSSE41;
87 extern CRYPTOPP_DLL
bool g_hasSSE42;
88 extern CRYPTOPP_DLL
bool g_hasMOVBE;
89 extern CRYPTOPP_DLL
bool g_hasAESNI;
90 extern CRYPTOPP_DLL
bool g_hasCLMUL;
91 extern CRYPTOPP_DLL
bool g_hasAVX;
92 extern CRYPTOPP_DLL
bool g_hasAVX2;
93 extern CRYPTOPP_DLL
bool g_hasSHA;
94 extern CRYPTOPP_DLL
bool g_hasADX;
95 extern CRYPTOPP_DLL
bool g_isP4;
96 extern CRYPTOPP_DLL
bool g_hasRDRAND;
97 extern CRYPTOPP_DLL
bool g_hasRDSEED;
98 extern CRYPTOPP_DLL
bool g_hasPadlockRNG;
99 extern CRYPTOPP_DLL
bool g_hasPadlockACE;
100 extern CRYPTOPP_DLL
bool g_hasPadlockACE2;
101 extern CRYPTOPP_DLL
bool g_hasPadlockPHE;
102 extern CRYPTOPP_DLL
bool g_hasPadlockPMM;
103 extern CRYPTOPP_DLL word32 g_cacheLineSize;
105 CRYPTOPP_DLL
void CRYPTOPP_API DetectX86Features();
106 CRYPTOPP_DLL
bool CRYPTOPP_API CpuId(word32 func, word32 subfunc, word32 output[4]);
107 #endif // CRYPTOPP_DOXYGEN_PROCESSING
120 #if (CRYPTOPP_SSE2_ASM_AVAILABLE || CRYPTOPP_SSE2_INTRIN_AVAILABLE)
121 if (!g_x86DetectionDone)
135 #if CRYPTOPP_SSSE3_AVAILABLE
136 if (!g_x86DetectionDone)
150 #if CRYPTOPP_SSE41_AVAILABLE
151 if (!g_x86DetectionDone)
165 #if CRYPTOPP_SSE42_AVAILABLE
166 if (!g_x86DetectionDone)
181 #if CRYPTOPP_SSE42_AVAILABLE
182 if (!g_x86DetectionDone)
197 #if CRYPTOPP_AESNI_AVAILABLE
198 if (!g_x86DetectionDone)
213 #if CRYPTOPP_CLMUL_AVAILABLE
214 if (!g_x86DetectionDone)
229 #if CRYPTOPP_SHANI_AVAILABLE
230 if (!g_x86DetectionDone)
245 #if CRYPTOPP_ADX_AVAILABLE
246 if (!g_x86DetectionDone)
261 #if CRYPTOPP_AVX_AVAILABLE
262 if (!g_x86DetectionDone)
277 #if CRYPTOPP_AVX2_AVAILABLE
278 if (!g_x86DetectionDone)
292 #if CRYPTOPP_RDRAND_AVAILABLE
293 if (!g_x86DetectionDone)
307 #if CRYPTOPP_RDSEED_AVAILABLE
308 if (!g_x86DetectionDone)
322 #if CRYPTOPP_PADLOCK_RNG_AVAILABLE
323 if (!g_x86DetectionDone)
325 return g_hasPadlockRNG;
337 #if CRYPTOPP_PADLOCK_ACE_AVAILABLE
338 if (!g_x86DetectionDone)
340 return g_hasPadlockACE;
352 #if CRYPTOPP_PADLOCK_ACE2_AVAILABLE
353 if (!g_x86DetectionDone)
355 return g_hasPadlockACE2;
367 #if CRYPTOPP_PADLOCK_PHE_AVAILABLE
368 if (!g_x86DetectionDone)
370 return g_hasPadlockPHE;
382 #if CRYPTOPP_PADLOCK_PMM_AVAILABLE
383 if (!g_x86DetectionDone)
385 return g_hasPadlockPMM;
397 if (!g_x86DetectionDone)
412 if (!g_x86DetectionDone)
414 return g_cacheLineSize;
418 #endif // CRYPTOPP_BOOL_X86 || CRYPTOPP_BOOL_X32 || CRYPTOPP_BOOL_X64
422 #if CRYPTOPP_BOOL_ARM32 || CRYPTOPP_BOOL_ARMV8 || CRYPTOPP_DOXYGEN_PROCESSING
425 #ifndef CRYPTOPP_DOXYGEN_PROCESSING
426 extern bool g_ArmDetectionDone;
427 extern bool g_hasARMv7;
428 extern bool g_hasNEON;
429 extern bool g_hasPMULL;
430 extern bool g_hasCRC32;
431 extern bool g_hasAES;
432 extern bool g_hasSHA1;
433 extern bool g_hasSHA2;
434 extern bool g_hasSHA512;
435 extern bool g_hasSHA3;
436 extern bool g_hasSM3;
437 extern bool g_hasSM4;
438 void CRYPTOPP_API DetectArmFeatures();
439 #endif // CRYPTOPP_DOXYGEN_PROCESSING
452 #if defined(__aarch32__) || defined(__aarch64__)
455 if (!g_ArmDetectionDone)
472 #if defined(__aarch32__) || defined(__aarch64__)
475 if (!g_ArmDetectionDone)
492 #if defined(__aarch32__) || defined(__aarch64__)
493 if (!g_ArmDetectionDone)
513 #if defined(__aarch32__) || defined(__aarch64__)
514 if (!g_ArmDetectionDone)
533 #if defined(__aarch32__) || defined(__aarch64__)
534 if (!g_ArmDetectionDone)
553 #if defined(__aarch32__) || defined(__aarch64__)
554 if (!g_ArmDetectionDone)
573 #if defined(__aarch32__) || defined(__aarch64__)
574 if (!g_ArmDetectionDone)
593 #if defined(__aarch32__) || defined(__aarch64__)
594 if (!g_ArmDetectionDone)
613 #if defined(__aarch32__) || defined(__aarch64__)
614 if (!g_ArmDetectionDone)
633 #if defined(__aarch32__) || defined(__aarch64__)
634 if (!g_ArmDetectionDone)
653 #if defined(__aarch32__) || defined(__aarch64__)
654 if (!g_ArmDetectionDone)
664 #endif // CRYPTOPP_BOOL_ARM32 || CRYPTOPP_BOOL_ARMV8
668 #if CRYPTOPP_BOOL_PPC32 || CRYPTOPP_BOOL_PPC64 || CRYPTOPP_DOXYGEN_PROCESSING
671 #ifndef CRYPTOPP_DOXYGEN_PROCESSING
672 extern bool g_PowerpcDetectionDone;
673 extern bool g_hasAltivec;
674 extern bool g_hasPower7;
675 extern bool g_hasPower8;
676 extern bool g_hasPower9;
677 extern bool g_hasAES;
678 extern bool g_hasPMULL;
679 extern bool g_hasSHA256;
680 extern bool g_hasSHA512;
681 extern bool g_hasDARN;
682 extern word32 g_cacheLineSize;
683 void CRYPTOPP_API DetectPowerpcFeatures();
684 #endif // CRYPTOPP_DOXYGEN_PROCESSING
698 #if CRYPTOPP_ALTIVEC_AVAILABLE
699 if (!g_PowerpcDetectionDone)
700 DetectPowerpcFeatures();
715 #if CRYPTOPP_POWER7_AVAILABLE
716 if (!g_PowerpcDetectionDone)
717 DetectPowerpcFeatures();
732 #if CRYPTOPP_POWER8_AVAILABLE
733 if (!g_PowerpcDetectionDone)
734 DetectPowerpcFeatures();
749 #if CRYPTOPP_POWER9_AVAILABLE
750 if (!g_PowerpcDetectionDone)
751 DetectPowerpcFeatures();
767 #if CRYPTOPP_POWER8_AES_AVAILABLE
768 if (!g_PowerpcDetectionDone)
769 DetectPowerpcFeatures();
785 #if CRYPTOPP_POWER8_VMULL_AVAILABLE
786 if (!g_PowerpcDetectionDone)
787 DetectPowerpcFeatures();
803 #if CRYPTOPP_POWER8_SHA_AVAILABLE
804 if (!g_PowerpcDetectionDone)
805 DetectPowerpcFeatures();
821 #if CRYPTOPP_POWER8_SHA_AVAILABLE
822 if (!g_PowerpcDetectionDone)
823 DetectPowerpcFeatures();
838 #if CRYPTOPP_POWER9_AVAILABLE
839 if (!g_PowerpcDetectionDone)
840 DetectPowerpcFeatures();
842 # if defined(__ibmxl__) && defined(__linux__)
862 if (!g_PowerpcDetectionDone)
863 DetectPowerpcFeatures();
864 return g_cacheLineSize;
869 #endif // CRYPTOPP_BOOL_PPC32 || CRYPTOPP_BOOL_PPC64
874 #if !(CRYPTOPP_BOOL_X86 || CRYPTOPP_BOOL_X32 || CRYPTOPP_BOOL_X64 || CRYPTOPP_BOOL_PPC32 || CRYPTOPP_BOOL_PPC64)
885 return CRYPTOPP_L1_CACHE_LINE_SIZE;
887 #endif // Non-Intel systems
889 #endif // CRYPTOPP_GENERATE_X64_MASM
893 #ifndef CRYPTOPP_DOXYGEN_PROCESSING
895 #if CRYPTOPP_BOOL_X86 || CRYPTOPP_BOOL_X32 || CRYPTOPP_BOOL_X64
897 #ifdef CRYPTOPP_GENERATE_X64_MASM
898 #define AS1(x) x*newline*
899 #define AS2(x, y) x, y*newline*
900 #define AS3(x, y, z) x, y, z*newline*
901 #define ASS(x, y, a, b, c, d) x, y, a*64+b*16+c*4+d*newline*
902 #define ASL(x) label##x:*newline*
903 #define ASJ(x, y, z) x label##y*newline*
904 #define ASC(x, y) x label##y*newline*
905 #define AS_HEX(y) 0##y##h
906 #elif defined(_MSC_VER) || defined(__BORLANDC__)
907 #define AS1(x) __asm {x}
908 #define AS2(x, y) __asm {x, y}
909 #define AS3(x, y, z) __asm {x, y, z}
910 #define ASS(x, y, a, b, c, d) __asm {x, y, (a)*64+(b)*16+(c)*4+(d)}
911 #define ASL(x) __asm {label##x:}
912 #define ASJ(x, y, z) __asm {x label##y}
913 #define ASC(x, y) __asm {x label##y}
914 #define CRYPTOPP_NAKED __declspec(naked)
915 #define AS_HEX(y) 0x##y
918 #define GNU_AS1(x) #x ";" NEW_LINE
919 #define GNU_AS2(x, y) #x ", " #y ";" NEW_LINE
920 #define GNU_AS3(x, y, z) #x ", " #y ", " #z ";" NEW_LINE
921 #define GNU_ASL(x) "\n" #x ":" NEW_LINE
923 #if (CRYPTOPP_LLVM_CLANG_VERSION >= 50000) || (CRYPTOPP_APPLE_CLANG_VERSION >= 90000)
924 #define GNU_ASJ(x, y, z) ATT_PREFIX ";" NEW_LINE #x " " #y #z ";" NEW_LINE INTEL_PREFIX ";" NEW_LINE
926 #define GNU_ASJ(x, y, z) #x " " #y #z ";" NEW_LINE
928 #define AS1(x) GNU_AS1(x)
929 #define AS2(x, y) GNU_AS2(x, y)
930 #define AS3(x, y, z) GNU_AS3(x, y, z)
931 #define ASS(x, y, a, b, c, d) #x ", " #y ", " #a "*64+" #b "*16+" #c "*4+" #d ";"
932 #define ASL(x) GNU_ASL(x)
933 #define ASJ(x, y, z) GNU_ASJ(x, y, z)
934 #define ASC(x, y) #x " " #y ";"
935 #define CRYPTOPP_NAKED
936 #define AS_HEX(y) 0x##y
942 #ifdef CRYPTOPP_GENERATE_X64_MASM
943 #define ASM_MOD(x, y) ((x) MOD (y))
944 #define XMMWORD_PTR XMMWORD PTR
947 #define ASM_MOD(x, y) ((x)-((x)/(y))*(y))
952 #if CRYPTOPP_BOOL_X86
960 #define AS_REG_1d ecx
961 #define AS_REG_2d edx
962 #define AS_REG_3d esi
963 #define AS_REG_4d edi
964 #define AS_REG_5d eax
965 #define AS_REG_6d ebx
966 #define AS_REG_7d ebp
968 #define WORD_REG(x) e##x
969 #define WORD_PTR DWORD PTR
970 #define AS_PUSH_IF86(x) AS1(push e##x)
971 #define AS_POP_IF86(x) AS1(pop e##x)
972 #define AS_JCXZ jecxz
973 #elif CRYPTOPP_BOOL_X32
979 #define AS_REG_6 r10d
980 #define AS_REG_7 r11d
981 #define AS_REG_1d ecx
982 #define AS_REG_2d edx
983 #define AS_REG_3d r8d
984 #define AS_REG_4d r9d
985 #define AS_REG_5d eax
986 #define AS_REG_6d r10d
987 #define AS_REG_7d r11d
989 #define WORD_REG(x) e##x
990 #define WORD_PTR DWORD PTR
991 #define AS_PUSH_IF86(x) AS1(push r##x)
992 #define AS_POP_IF86(x) AS1(pop r##x)
993 #define AS_JCXZ jecxz
994 #elif CRYPTOPP_BOOL_X64
995 #ifdef CRYPTOPP_GENERATE_X64_MASM
1000 #define AS_REG_5 rax
1001 #define AS_REG_6 r10
1002 #define AS_REG_7 r11
1003 #define AS_REG_1d ecx
1004 #define AS_REG_2d edx
1005 #define AS_REG_3d r8d
1006 #define AS_REG_4d r9d
1007 #define AS_REG_5d eax
1008 #define AS_REG_6d r10d
1009 #define AS_REG_7d r11d
1011 #define AS_REG_1 rdi
1012 #define AS_REG_2 rsi
1013 #define AS_REG_3 rdx
1014 #define AS_REG_4 rcx
1017 #define AS_REG_7 r10
1018 #define AS_REG_1d edi
1019 #define AS_REG_2d esi
1020 #define AS_REG_3d edx
1021 #define AS_REG_4d ecx
1022 #define AS_REG_5d r8d
1023 #define AS_REG_6d r9d
1024 #define AS_REG_7d r10d
1027 #define WORD_REG(x) r##x
1028 #define WORD_PTR QWORD PTR
1029 #define AS_PUSH_IF86(x)
1030 #define AS_POP_IF86(x)
1031 #define AS_JCXZ jrcxz
1035 #define AS_XMM_OUTPUT4(labelPrefix, inputPtr, outputPtr, x0, x1, x2, x3, t, p0, p1, p2, p3, increment)\
1036 AS2( test inputPtr, inputPtr)\
1037 ASC( jz, labelPrefix##3)\
1038 AS2( test inputPtr, 15)\
1039 ASC( jnz, labelPrefix##7)\
1040 AS2( pxor xmm##x0, [inputPtr+p0*16])\
1041 AS2( pxor xmm##x1, [inputPtr+p1*16])\
1042 AS2( pxor xmm##x2, [inputPtr+p2*16])\
1043 AS2( pxor xmm##x3, [inputPtr+p3*16])\
1044 AS2( add inputPtr, increment*16)\
1045 ASC( jmp, labelPrefix##3)\
1046 ASL(labelPrefix##7)\
1047 AS2( movdqu xmm##t, [inputPtr+p0*16])\
1048 AS2( pxor xmm##x0, xmm##t)\
1049 AS2( movdqu xmm##t, [inputPtr+p1*16])\
1050 AS2( pxor xmm##x1, xmm##t)\
1051 AS2( movdqu xmm##t, [inputPtr+p2*16])\
1052 AS2( pxor xmm##x2, xmm##t)\
1053 AS2( movdqu xmm##t, [inputPtr+p3*16])\
1054 AS2( pxor xmm##x3, xmm##t)\
1055 AS2( add inputPtr, increment*16)\
1056 ASL(labelPrefix##3)\
1057 AS2( test outputPtr, 15)\
1058 ASC( jnz, labelPrefix##8)\
1059 AS2( movdqa [outputPtr+p0*16], xmm##x0)\
1060 AS2( movdqa [outputPtr+p1*16], xmm##x1)\
1061 AS2( movdqa [outputPtr+p2*16], xmm##x2)\
1062 AS2( movdqa [outputPtr+p3*16], xmm##x3)\
1063 ASC( jmp, labelPrefix##9)\
1064 ASL(labelPrefix##8)\
1065 AS2( movdqu [outputPtr+p0*16], xmm##x0)\
1066 AS2( movdqu [outputPtr+p1*16], xmm##x1)\
1067 AS2( movdqu [outputPtr+p2*16], xmm##x2)\
1068 AS2( movdqu [outputPtr+p3*16], xmm##x3)\
1069 ASL(labelPrefix##9)\
1070 AS2( add outputPtr, increment*16)
1072 #endif // CRYPTOPP_BOOL_X86 || CRYPTOPP_BOOL_X32 || CRYPTOPP_BOOL_X64
1074 #endif // Not CRYPTOPP_DOXYGEN_PROCESSING
1079 #if CRYPTOPP_GCC_DIAGNOSTIC_AVAILABLE
1080 # pragma GCC diagnostic pop
1083 #endif // CRYPTOPP_CPU_H
bool HasSHA512()
Determine if an ARM processor has SHA512 available.
bool HasSSE42()
Determine SSE4.2 availability.
bool HasPower9()
Determine if a PowerPC processor has Power9 available.
bool HasPadlockACE()
Determine Padlock ACE availability.
bool HasAVX()
Determine AVX availability.
bool HasSHA()
Determine SHA availability.
bool HasPower8()
Determine if a PowerPC processor has Power8 available.
bool HasAES()
Determine if an ARM processor has AES available.
bool HasARMv7()
Determine if an ARM processor is ARMv7 or above.
bool HasCRC32()
Determine if an ARM processor has CRC32 available.
bool HasNEON()
Determine if an ARM processor has Advanced SIMD available.
bool HasMOVBE()
Determine MOVBE availability.
bool HasAESNI()
Determine AES-NI availability.
bool HasSSSE3()
Determine SSSE3 availability.
bool HasSM4()
Determine if an ARM processor has SM4 available.
bool HasRDSEED()
Determine RDSEED availability.
int GetCacheLineSize()
Provides the cache line size.
bool HasAltivec()
Determine if a PowerPC processor has Altivec available.
bool HasDARN()
Determine if a PowerPC processor has DARN available.
bool HasRDRAND()
Determine RDRAND availability.
bool HasSSE41()
Determine SSE4.1 availability.
bool HasSM3()
Determine if an ARM processor has SM3 available.
bool HasPadlockPMM()
Determine Padlock PMM availability.
bool HasCLMUL()
Determine Carryless Multiply availability.
bool HasSHA2()
Determine if an ARM processor has SHA256 available.
bool HasAVX2()
Determine AVX2 availability.
Crypto++ library namespace.
Library configuration file.
bool HasPadlockPHE()
Determine Padlock PHE availability.
bool HasADX()
Determine ADX availability.
bool HasPMULL()
Determine if an ARM processor provides Polynomial Multiplication.
bool HasPadlockACE2()
Determine Padlock ACE2 availability.
bool HasSHA3()
Determine if an ARM processor has SHA3 available.
bool HasSHA1()
Determine if an ARM processor has SHA1 available.
bool HasPower7()
Determine if a PowerPC processor has Power7 available.
bool HasSHA256()
Determine if a PowerPC processor has SHA256 available.
bool IsP4()
Determine if the CPU is an Intel P4.
bool HasSSE2()
Determine SSE2 availability.
bool HasPadlockRNG()
Determine Padlock RNG availability.