From fd4c7546b5126b2d288211a805b756d1bdc17afd Mon Sep 17 00:00:00 2001 From: Jeffrey Walton Date: Sat, 29 Jul 2017 15:16:04 -0400 Subject: [PATCH] =?UTF-8?q?Update=20TestScripts/cryptest.sh.=20Rename=20X8?= =?UTF-8?q?6=5FSHA256=5FHashBlocks=20=E2=86=92=20SHA256=5FHashBlocks=5FSSE?= =?UTF-8?q?2?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- TestScripts/cryptest.sh | 214 ++++++++++++++++++++++++++++++++-------- cryptest.sh | 8 +- sha.cpp | 12 +-- x64dll.asm | 4 +- 4 files changed, 185 insertions(+), 53 deletions(-) diff --git a/TestScripts/cryptest.sh b/TestScripts/cryptest.sh index e2a058d6..9fa5b208 100755 --- a/TestScripts/cryptest.sh +++ b/TestScripts/cryptest.sh @@ -1172,12 +1172,12 @@ if [[ ("$HAVE_DISASS" -ne "0" && ("$IS_X86" -ne "0" || "$IS_X64" -ne "0")) ]]; t DISASS_TEXT=$("$DISASS" "${DISASSARGS[@]}" "$OBJFILE" 2>/dev/null) X86_SSE2=$(echo -n "$X86_CPU_FLAGS" | "$GREP" -i -c sse2) - X86_SHA256_HASH_BLOCKS=$(echo -n "$DISASS_TEXT" | "$EGREP" -c 'X86_SHA256_HashBlocks') + X86_SHA256_HASH_BLOCKS=$(echo -n "$DISASS_TEXT" | "$EGREP" -c 'SHA256_HashBlocks_SSE2') if [[ ("$X86_SHA256_HASH_BLOCKS" -ne "0") ]]; then COUNT=$(echo -n "$DISASS_TEXT" | "$EGREP" -i -c '(rol.*0x|ror.*0x)') if [[ ("$COUNT" -le "600") ]]; then FAILED=1 - echo "ERROR: failed to generate rotate immediate instruction (X86_SHA256_HashBlocks)" | tee -a "$TEST_RESULTS" + echo "ERROR: failed to generate rotate immediate instruction (SHA256_HashBlocks_SSE2)" | tee -a "$TEST_RESULTS" fi else COUNT=$(echo -n "$DISASS_TEXT" | "$EGREP" -i -c '(rol.*0x|ror.*0x)') @@ -1188,16 +1188,54 @@ if [[ ("$HAVE_DISASS" -ne "0" && ("$IS_X86" -ne "0" || "$IS_X64" -ne "0")) ]]; t fi if [[ ("$X86_SSE2" -ne "0" && "$X86_SHA256_HASH_BLOCKS" -eq "0") ]]; then - echo "ERROR: failed to use X86_SHA256_HashBlocks" | tee -a "$TEST_RESULTS" + echo "ERROR: failed to use SHA256_HashBlocks_SSE2" | tee -a "$TEST_RESULTS" fi if [[ ("$FAILED" -eq "0" && "$X86_SHA256_HASH_BLOCKS" -ne "0") ]]; then - echo "Verified rotate immediate machine instructions (X86_SHA256_HashBlocks)" | tee -a "$TEST_RESULTS" + echo "Verified rotate immediate machine instructions (SHA256_HashBlocks_SSE2)" | tee -a "$TEST_RESULTS" elif [[ ("$FAILED" -eq "0") ]]; then echo "Verified rotate immediate machine instructions" | tee -a "$TEST_RESULTS" fi fi + ############################################ + # Test CRC-32C code generation + + "$CXX" -DCRYPTOPP_ADHOC_MAIN -msse4.2 adhoc.cpp -o "$TMP/adhoc.exe" > /dev/null 2>&1 + if [[ "$?" -eq "0" ]]; then + X86_CRC32=1 + fi + + if [[ ("$X86_CRC32" -ne "0") ]]; then + echo + echo "************************************" | tee -a "$TEST_RESULTS" + echo "Testing: X86 CRC32 code generation" | tee -a "$TEST_RESULTS" + echo + + OBJFILE=crc-simd.o; rm -f "$OBJFILE" 2>/dev/null + CXX="$CXX" CXXFLAGS="$RELEASE_CXXFLAGS -DDISABLE_NATIVE_ARCH=1" "$MAKE" "${MAKEARGS[@]}" $OBJFILE 2>&1 | tee -a "$TEST_RESULTS" + + COUNT=0 + FAILED=0 + DISASS_TEXT=$("$DISASS" "${DISASSARGS[@]}" "$OBJFILE" 2>/dev/null) + + COUNT=$(echo -n "$DISASS_TEXT" | "$GREP" -i -c crc32b) + if [[ ("$COUNT" -eq "0") ]]; then + FAILED=1 + echo "ERROR: failed to generate crc32b instruction" | tee -a "$TEST_RESULTS" + fi + + COUNT=$(echo -n "$DISASS_TEXT" | "$GREP" -i -c crc32l) + if [[ ("$COUNT" -eq "0") ]]; then + FAILED=1 + echo "ERROR: failed to generate crc32l instruction" | tee -a "$TEST_RESULTS" + fi + + if [[ ("$FAILED" -eq "0") ]]; then + echo "Verified crc32b and crc32l machine instructions" | tee -a "$TEST_RESULTS" + fi + fi + ############################################ # Test AES-NI code generation @@ -1396,7 +1434,7 @@ if [[ ("$HAVE_DISASS" -ne "0" && ("$IS_X86" -ne "0" || "$IS_X64" -ne "0")) ]]; t echo "Testing: X86 SHA code generation" | tee -a "$TEST_RESULTS" echo - OBJFILE=sha.o; rm -f "$OBJFILE" 2>/dev/null + OBJFILE=sha-simd.o; rm -f "$OBJFILE" 2>/dev/null CXX="$CXX" CXXFLAGS="$RELEASE_CXXFLAGS -DDISABLE_NATIVE_ARCH=1 -msse -msse2" "$MAKE" "${MAKEARGS[@]}" $OBJFILE 2>&1 | tee -a "$TEST_RESULTS" COUNT=0 @@ -1512,51 +1550,21 @@ if [[ ("$HAVE_DISASS" -ne "0" && ("$IS_ARM32" -ne "0" || "$IS_ARM64" -ne "0")) ] fi fi - ############################################ - # ARM carryless multiply code generation - - ARM_PMULL=$(echo -n "$ARM_CPU_FLAGS" | "$GREP" -i -c pmull) - if [[ ("$ARM_PMULL" -ne "0" || "$HAVE_ARM_CRYPTO" -ne "0") ]]; then - echo - echo "************************************" | tee -a "$TEST_RESULTS" - echo "Testing: ARM carryless multiply code generation" | tee -a "$TEST_RESULTS" - echo - - OBJFILE=gcm.o; rm -f "$OBJFILE" 2>/dev/null - CXX="$CXX" CXXFLAGS="$RELEASE_CXXFLAGS -DDISABLE_NATIVE_ARCH=1" "$MAKE" "${MAKEARGS[@]}" $OBJFILE 2>&1 | tee -a "$TEST_RESULTS" - - COUNT=0 - FAILED=0 - DISASS_TEXT=$("$DISASS" "${DISASSARGS[@]}" "$OBJFILE" 2>/dev/null) - - COUNT=$(echo -n "$DISASS_TEXT" | "$GREP" -v pmull2 | "$GREP" -i -c pmull) - if [[ ("$COUNT" -eq "0") ]]; then - FAILED=1 - echo "ERROR: failed to generate pmull instruction" | tee -a "$TEST_RESULTS" - fi - - COUNT=$(echo -n "$DISASS_TEXT" | "$GREP" -i -c pmull2) - if [[ ("$COUNT" -eq "0") ]]; then - FAILED=1 - echo "ERROR: failed to generate pmull2 instruction" | tee -a "$TEST_RESULTS" - fi - - if [[ ("$FAILED" -eq "0") ]]; then - echo "Verified pmull and pmull2 machine instructions" | tee -a "$TEST_RESULTS" - fi - fi - ############################################ # ARM CRC32 code generation - ARM_CRC32=$(echo -n "$ARM_CPU_FLAGS" | "$GREP" -i -c crc32) + "$CXX" -DCRYPTOPP_ADHOC_MAIN -march=armv8-a+crc adhoc.cpp -o "$TMP/adhoc.exe" > /dev/null 2>&1 + if [[ "$?" -eq "0" ]]; then + ARM_CRC32=1 + fi + if [[ ("$ARM_CRC32" -ne "0") ]]; then echo echo "************************************" | tee -a "$TEST_RESULTS" echo "Testing: ARM CRC32 code generation" | tee -a "$TEST_RESULTS" echo - OBJFILE=crc.o; rm -f "$OBJFILE" 2>/dev/null + OBJFILE=crc-simd.o; rm -f "$OBJFILE" 2>/dev/null CXX="$CXX" CXXFLAGS="$RELEASE_CXXFLAGS -DDISABLE_NATIVE_ARCH=1" "$MAKE" "${MAKEARGS[@]}" $OBJFILE 2>&1 | tee -a "$TEST_RESULTS" COUNT=0 @@ -1591,6 +1599,130 @@ if [[ ("$HAVE_DISASS" -ne "0" && ("$IS_ARM32" -ne "0" || "$IS_ARM64" -ne "0")) ] echo "Verified crc32cb, crc32cw, crc32b and crc32w machine instructions" | tee -a "$TEST_RESULTS" fi fi + + ############################################ + # ARM carryless multiply code generation + + "$CXX" -DCRYPTOPP_ADHOC_MAIN -march=armv8-a+crypto adhoc.cpp -o "$TMP/adhoc.exe" > /dev/null 2>&1 + if [[ "$?" -eq "0" ]]; then + ARM_PMULL=1 + fi + + if [[ ("$ARM_PMULL" -ne "0" || "$HAVE_ARM_CRYPTO" -ne "0") ]]; then + echo + echo "************************************" | tee -a "$TEST_RESULTS" + echo "Testing: ARM carryless multiply code generation" | tee -a "$TEST_RESULTS" + echo + + OBJFILE=gcm.o; rm -f "$OBJFILE" 2>/dev/null + CXX="$CXX" CXXFLAGS="$RELEASE_CXXFLAGS -DDISABLE_NATIVE_ARCH=1" "$MAKE" "${MAKEARGS[@]}" $OBJFILE 2>&1 | tee -a "$TEST_RESULTS" + + COUNT=0 + FAILED=0 + DISASS_TEXT=$("$DISASS" "${DISASSARGS[@]}" "$OBJFILE" 2>/dev/null) + + COUNT=$(echo -n "$DISASS_TEXT" | "$GREP" -v pmull2 | "$GREP" -i -c pmull) + if [[ ("$COUNT" -eq "0") ]]; then + FAILED=1 + echo "ERROR: failed to generate pmull instruction" | tee -a "$TEST_RESULTS" + fi + + COUNT=$(echo -n "$DISASS_TEXT" | "$GREP" -i -c pmull2) + if [[ ("$COUNT" -eq "0") ]]; then + FAILED=1 + echo "ERROR: failed to generate pmull2 instruction" | tee -a "$TEST_RESULTS" + fi + + if [[ ("$FAILED" -eq "0") ]]; then + echo "Verified pmull and pmull2 machine instructions" | tee -a "$TEST_RESULTS" + fi + fi + + ############################################ + # ARM SHA code generation + + "$CXX" -DCRYPTOPP_ADHOC_MAIN -march=armv8-a+crypto adhoc.cpp -o "$TMP/adhoc.exe" > /dev/null 2>&1 + if [[ "$?" -eq "0" ]]; then + ARM_SHA=1 + fi + + if [[ ("$ARM_SHA" -ne "0" || "$HAVE_ARM_CRYPTO" -ne "0") ]]; then + echo + echo "************************************" | tee -a "$TEST_RESULTS" + echo "Testing: ARM SHA generation" | tee -a "$TEST_RESULTS" + echo + + OBJFILE=sha-simd.o; rm -f "$OBJFILE" 2>/dev/null + CXX="$CXX" CXXFLAGS="$RELEASE_CXXFLAGS -DDISABLE_NATIVE_ARCH=1" "$MAKE" "${MAKEARGS[@]}" $OBJFILE 2>&1 | tee -a "$TEST_RESULTS" + + COUNT=0 + FAILED=0 + DISASS_TEXT=$("$DISASS" "${DISASSARGS[@]}" "$OBJFILE" 2>/dev/null) + + COUNT=$(echo -n "$DISASS_TEXT" | "$GREP" -i -c sha1c) + if [[ ("$COUNT" -eq "0") ]]; then + FAILED=1 + echo "ERROR: failed to generate sha1c instruction" | tee -a "$TEST_RESULTS" + fi + + COUNT=$(echo -n "$DISASS_TEXT" | "$GREP" -i -c sha1m) + if [[ ("$COUNT" -eq "0") ]]; then + FAILED=1 + echo "ERROR: failed to generate sha1m instruction" | tee -a "$TEST_RESULTS" + fi + + COUNT=$(echo -n "$DISASS_TEXT" | "$GREP" -i -c sha1p) + if [[ ("$COUNT" -eq "0") ]]; then + FAILED=1 + echo "ERROR: failed to generate sha1p instruction" | tee -a "$TEST_RESULTS" + fi + + COUNT=$(echo -n "$DISASS_TEXT" | "$GREP" -i -c sha1h) + if [[ ("$COUNT" -eq "0") ]]; then + FAILED=1 + echo "ERROR: failed to generate sha1h instruction" | tee -a "$TEST_RESULTS" + fi + + COUNT=$(echo -n "$DISASS_TEXT" | "$GREP" -i -c sha1su0) + if [[ ("$COUNT" -eq "0") ]]; then + FAILED=1 + echo "ERROR: failed to generate sha1su0 instruction" | tee -a "$TEST_RESULTS" + fi + + COUNT=$(echo -n "$DISASS_TEXT" | "$GREP" -i -c sha1su1) + if [[ ("$COUNT" -eq "0") ]]; then + FAILED=1 + echo "ERROR: failed to generate sha1su1 instruction" | tee -a "$TEST_RESULTS" + fi + + COUNT=$(echo -n "$DISASS_TEXT" | "$GREP" -v sha256h2 | "$GREP" -i -c sha256h) + if [[ ("$COUNT" -eq "0") ]]; then + FAILED=1 + echo "ERROR: failed to generate sha256h instruction" | tee -a "$TEST_RESULTS" + fi + + COUNT=$(echo -n "$DISASS_TEXT" | "$GREP" -i -c sha256h2) + if [[ ("$COUNT" -eq "0") ]]; then + FAILED=1 + echo "ERROR: failed to generate sha256h2 instruction" | tee -a "$TEST_RESULTS" + fi + + COUNT=$(echo -n "$DISASS_TEXT" | "$GREP" -i -c sha256su0) + if [[ ("$COUNT" -eq "0") ]]; then + FAILED=1 + echo "ERROR: failed to generate sha256su0 instruction" | tee -a "$TEST_RESULTS" + fi + + COUNT=$(echo -n "$DISASS_TEXT" | "$GREP" -i -c sha256su1) + if [[ ("$COUNT" -eq "0") ]]; then + FAILED=1 + echo "ERROR: failed to generate sha256su1 instruction" | tee -a "$TEST_RESULTS" + fi + + if [[ ("$FAILED" -eq "0") ]]; then + echo "Verified sha1c, sha1m, sha1p, sha1su0, sha1su1, sha256h, sha256h2, sha256su0, sha256su1 machine instructions" | tee -a "$TEST_RESULTS" + fi + fi fi ############################################ diff --git a/cryptest.sh b/cryptest.sh index 2a83d132..9fa5b208 100755 --- a/cryptest.sh +++ b/cryptest.sh @@ -1172,12 +1172,12 @@ if [[ ("$HAVE_DISASS" -ne "0" && ("$IS_X86" -ne "0" || "$IS_X64" -ne "0")) ]]; t DISASS_TEXT=$("$DISASS" "${DISASSARGS[@]}" "$OBJFILE" 2>/dev/null) X86_SSE2=$(echo -n "$X86_CPU_FLAGS" | "$GREP" -i -c sse2) - X86_SHA256_HASH_BLOCKS=$(echo -n "$DISASS_TEXT" | "$EGREP" -c 'X86_SHA256_HashBlocks') + X86_SHA256_HASH_BLOCKS=$(echo -n "$DISASS_TEXT" | "$EGREP" -c 'SHA256_HashBlocks_SSE2') if [[ ("$X86_SHA256_HASH_BLOCKS" -ne "0") ]]; then COUNT=$(echo -n "$DISASS_TEXT" | "$EGREP" -i -c '(rol.*0x|ror.*0x)') if [[ ("$COUNT" -le "600") ]]; then FAILED=1 - echo "ERROR: failed to generate rotate immediate instruction (X86_SHA256_HashBlocks)" | tee -a "$TEST_RESULTS" + echo "ERROR: failed to generate rotate immediate instruction (SHA256_HashBlocks_SSE2)" | tee -a "$TEST_RESULTS" fi else COUNT=$(echo -n "$DISASS_TEXT" | "$EGREP" -i -c '(rol.*0x|ror.*0x)') @@ -1188,11 +1188,11 @@ if [[ ("$HAVE_DISASS" -ne "0" && ("$IS_X86" -ne "0" || "$IS_X64" -ne "0")) ]]; t fi if [[ ("$X86_SSE2" -ne "0" && "$X86_SHA256_HASH_BLOCKS" -eq "0") ]]; then - echo "ERROR: failed to use X86_SHA256_HashBlocks" | tee -a "$TEST_RESULTS" + echo "ERROR: failed to use SHA256_HashBlocks_SSE2" | tee -a "$TEST_RESULTS" fi if [[ ("$FAILED" -eq "0" && "$X86_SHA256_HASH_BLOCKS" -ne "0") ]]; then - echo "Verified rotate immediate machine instructions (X86_SHA256_HashBlocks)" | tee -a "$TEST_RESULTS" + echo "Verified rotate immediate machine instructions (SHA256_HashBlocks_SSE2)" | tee -a "$TEST_RESULTS" elif [[ ("$FAILED" -eq "0") ]]; then echo "Verified rotate immediate machine instructions" | tee -a "$TEST_RESULTS" fi diff --git a/sha.cpp b/sha.cpp index cea45784..109871b5 100644 --- a/sha.cpp +++ b/sha.cpp @@ -200,7 +200,7 @@ extern const word32 SHA256_K[64] = { #if (defined(CRYPTOPP_X86_ASM_AVAILABLE) || defined(CRYPTOPP_X32_ASM_AVAILABLE) || defined(CRYPTOPP_GENERATE_X64_MASM)) -static void CRYPTOPP_FASTCALL X86_SHA256_HashBlocks(word32 *state, const word32 *data, size_t len) +static void CRYPTOPP_FASTCALL SHA256_HashBlocks_SSE2(word32 *state, const word32 *data, size_t len) { #define LOCALS_SIZE 8*4 + 16*4 + 4*WORD_SZ #define H(i) [BASE+ASM_MOD(1024+7-(i),8)*4] @@ -322,7 +322,7 @@ static void CRYPTOPP_FASTCALL X86_SHA256_HashBlocks(word32 *state, const word32 INTEL_NOPREFIX #elif defined(CRYPTOPP_GENERATE_X64_MASM) ALIGN 8 - X86_SHA256_HashBlocks PROC FRAME + SHA256_HashBlocks_SSE2 PROC FRAME rex_push_reg rsi push_reg rdi push_reg rbx @@ -501,7 +501,7 @@ INTEL_NOPREFIX pop rdi pop rsi ret - X86_SHA256_HashBlocks ENDP + SHA256_HashBlocks_SSE2 ENDP #endif #ifdef __GNUC__ @@ -525,7 +525,7 @@ INTEL_NOPREFIX #ifdef CRYPTOPP_X64_MASM_AVAILABLE extern "C" { -void CRYPTOPP_FASTCALL X86_SHA256_HashBlocks(word32 *state, const word32 *data, size_t len); +void CRYPTOPP_FASTCALL SHA256_HashBlocks_SSE2(word32 *state, const word32 *data, size_t len); } #endif @@ -544,7 +544,7 @@ static pfnSHAHashBlocks InitializeSHA256HashBlocks() else #endif - return &X86_SHA256_HashBlocks; + return &SHA256_HashBlocks_SSE2; } size_t SHA256::HashMultipleBlocks(const word32 *input, size_t length) @@ -696,7 +696,7 @@ static void SHA256_Transform_SSE2(word32 *state, const word32 *data) // this byte reverse is a waste of time, but this function is only called by MDC word32 W[16]; ByteReverse(W, data, SHA256::BLOCKSIZE); - X86_SHA256_HashBlocks(state, W, SHA256::BLOCKSIZE - !HasSSE2()); + SHA256_HashBlocks_SSE2(state, W, SHA256::BLOCKSIZE - !HasSSE2()); } #endif // CRYPTOPP_BOOL_SSE2_ASM_AVAILABLE diff --git a/x64dll.asm b/x64dll.asm index 386f7511..3e4373d4 100644 --- a/x64dll.asm +++ b/x64dll.asm @@ -676,7 +676,7 @@ ret GCM_AuthenticateBlocks_64K ENDP ALIGN 8 -X86_SHA256_HashBlocks PROC FRAME +SHA256_HashBlocks_SSE2 PROC FRAME rex_push_reg rsi push_reg rdi push_reg rbx @@ -1962,7 +1962,7 @@ pop rbx pop rdi pop rsi ret -X86_SHA256_HashBlocks ENDP +SHA256_HashBlocks_SSE2 ENDP _TEXT ENDS END