summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorweidai <weidai@57ff6487-cd31-0410-9ec3-f628ee90f5f0>2010-07-07 22:46:18 +0000
committerweidai <weidai@57ff6487-cd31-0410-9ec3-f628ee90f5f0>2010-07-07 22:46:18 +0000
commit83f195aa17878ca7d4c8c03b2b871df7bfbe5fb0 (patch)
treed56925f3aa0a89a54957762199893dfc84d62d78
parent987106e079fcc3d30f32122eb33df59fe9dd86dd (diff)
downloadcryptopp-83f195aa17878ca7d4c8c03b2b871df7bfbe5fb0.tar.gz
add AESNI and CLMUL detection
git-svn-id: svn://svn.code.sf.net/p/cryptopp/code/trunk/c5@503 57ff6487-cd31-0410-9ec3-f628ee90f5f0
-rwxr-xr-xcpu.cpp4
-rwxr-xr-xcpu.h16
-rw-r--r--validat1.cpp2
3 files changed, 20 insertions, 2 deletions
diff --git a/cpu.cpp b/cpu.cpp
index 3e46804..11c27b8 100755
--- a/cpu.cpp
+++ b/cpu.cpp
@@ -145,7 +145,7 @@ static bool TrySSE2()
}
bool g_x86DetectionDone = false;
-bool g_hasISSE = false, g_hasSSE2 = false, g_hasSSSE3 = false, g_hasMMX = false, g_isP4 = false;
+bool g_hasISSE = false, g_hasSSE2 = false, g_hasSSSE3 = false, g_hasMMX = false, g_hasAESNI = false, g_hasCLMUL = false, g_isP4 = false;
word32 g_cacheLineSize = CRYPTOPP_L1_CACHE_LINE_SIZE;
void DetectX86Features()
@@ -160,6 +160,8 @@ void DetectX86Features()
if ((cpuid1[3] & (1 << 26)) != 0)
g_hasSSE2 = TrySSE2();
g_hasSSSE3 = g_hasSSE2 && (cpuid1[2] & (1<<9));
+ g_hasAESNI = (cpuid1[2] & (1<<25)) != 0;
+ g_hasCLMUL = (cpuid1[2] & (1<<1)) != 0;
if ((cpuid1[3] & (1 << 25)) != 0)
g_hasISSE = true;
diff --git a/cpu.h b/cpu.h
index 7f01dad..79e5ea8 100755
--- a/cpu.h
+++ b/cpu.h
@@ -28,6 +28,8 @@ extern CRYPTOPP_DLL bool g_hasSSE2;
extern CRYPTOPP_DLL bool g_hasISSE;
extern CRYPTOPP_DLL bool g_hasMMX;
extern CRYPTOPP_DLL bool g_hasSSSE3;
+extern CRYPTOPP_DLL bool g_hasAESNI;
+extern CRYPTOPP_DLL bool g_hasCLMUL;
extern CRYPTOPP_DLL bool g_isP4;
extern CRYPTOPP_DLL word32 g_cacheLineSize;
CRYPTOPP_DLL void CRYPTOPP_API DetectX86Features();
@@ -70,6 +72,20 @@ inline bool HasSSSE3()
return g_hasSSSE3;
}
+inline bool HasAESNI()
+{
+ if (!g_x86DetectionDone)
+ DetectX86Features();
+ return g_hasAESNI;
+}
+
+inline bool HasCLMUL()
+{
+ if (!g_x86DetectionDone)
+ DetectX86Features();
+ return g_hasCLMUL;
+}
+
inline bool IsP4()
{
if (!g_x86DetectionDone)
diff --git a/validat1.cpp b/validat1.cpp
index 680314c..dafeb52 100644
--- a/validat1.cpp
+++ b/validat1.cpp
@@ -251,7 +251,7 @@ bool TestSettings()
else
cout << "passed: ";
- cout << "hasMMX == " << hasMMX << ", hasISSE == " << hasISSE << ", hasSSE2 == " << hasSSE2 << ", hasSSSE3 == " << hasSSSE3 << ", isP4 == " << isP4 << ", cacheLineSize == " << cacheLineSize;
+ cout << "hasMMX == " << hasMMX << ", hasISSE == " << hasISSE << ", hasSSE2 == " << hasSSE2 << ", hasSSSE3 == " << hasSSSE3 << ", hasAESNI == " << HasAESNI() << ", hasCLMUL == " << HasCLMUL() << ", isP4 == " << isP4 << ", cacheLineSize == " << cacheLineSize;
if (!pass)
{