aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorPieter Wuille <pieter.wuille@gmail.com>2017-07-18 01:06:11 -0700
committerPieter Wuille <pieter.wuille@gmail.com>2017-07-20 09:03:53 -0700
commit6b8d872e5e2dd68a5229ec55f5261dae34ff9bdb (patch)
tree3ac15ca0584417ab467071a4c28132630093a922
parentfa9be909c945c3689591590ac19504aa53154c2f (diff)
downloadbitcoin-6b8d872e5e2dd68a5229ec55f5261dae34ff9bdb.tar.xz
Protect SSE4 code behind a compile-time flag
-rw-r--r--configure.ac11
-rw-r--r--src/Makefile.am5
-rw-r--r--src/crypto/sha256.cpp4
3 files changed, 18 insertions, 2 deletions
diff --git a/configure.ac b/configure.ac
index 835dcdbf57..aea5d7160c 100644
--- a/configure.ac
+++ b/configure.ac
@@ -177,6 +177,16 @@ AC_ARG_ENABLE([glibc-back-compat],
[use_glibc_compat=$enableval],
[use_glibc_compat=no])
+AC_ARG_ENABLE([experimental-asm],
+ [AS_HELP_STRING([--enable-experimental-asm],
+ [Enable experimental assembly routines (default is no)])],
+ [experimental_asm=$enableval],
+ [experimental_asm=no])
+
+if test "x$experimental_asm" = xyes; then
+ AC_DEFINE(EXPERIMENTAL_ASM, 1, [Define this symbol to build in experimental assembly routines])
+fi
+
AC_ARG_WITH([system-univalue],
[AS_HELP_STRING([--with-system-univalue],
[Build with system UniValue (default is no)])],
@@ -1162,6 +1172,7 @@ AM_CONDITIONAL([USE_LCOV],[test x$use_lcov = xyes])
AM_CONDITIONAL([GLIBC_BACK_COMPAT],[test x$use_glibc_compat = xyes])
AM_CONDITIONAL([HARDEN],[test x$use_hardening = xyes])
AM_CONDITIONAL([ENABLE_HWCRC32],[test x$enable_hwcrc32 = xyes])
+AM_CONDITIONAL([EXPERIMENTAL_ASM],[test x$experimental_asm = xyes])
AC_DEFINE(CLIENT_VERSION_MAJOR, _CLIENT_VERSION_MAJOR, [Major version])
AC_DEFINE(CLIENT_VERSION_MINOR, _CLIENT_VERSION_MINOR, [Minor version])
diff --git a/src/Makefile.am b/src/Makefile.am
index 35bfeb466c..f7abab482e 100644
--- a/src/Makefile.am
+++ b/src/Makefile.am
@@ -263,11 +263,14 @@ crypto_libbitcoin_crypto_a_SOURCES = \
crypto/sha1.cpp \
crypto/sha1.h \
crypto/sha256.cpp \
- crypto/sha256_sse4.cpp \
crypto/sha256.h \
crypto/sha512.cpp \
crypto/sha512.h
+if EXPERIMENTAL_ASM
+crypto_libbitcoin_crypto_a_SOURCES += crypto/sha256_sse4.cpp
+endif
+
# consensus: shared between all executables that validate any consensus rules.
libbitcoin_consensus_a_CPPFLAGS = $(AM_CPPFLAGS) $(BITCOIN_INCLUDES)
libbitcoin_consensus_a_CXXFLAGS = $(AM_CXXFLAGS) $(PIE_FLAGS)
diff --git a/src/crypto/sha256.cpp b/src/crypto/sha256.cpp
index 25f4eabd4c..15d6db90c2 100644
--- a/src/crypto/sha256.cpp
+++ b/src/crypto/sha256.cpp
@@ -10,12 +10,14 @@
#include <atomic>
#if defined(__x86_64__) || defined(__amd64__)
+#if defined(EXPERIMENTAL_ASM)
#include <cpuid.h>
namespace sha256_sse4
{
void Transform(uint32_t* s, const unsigned char* chunk, size_t blocks);
}
#endif
+#endif
// Internal implementation code.
namespace
@@ -176,7 +178,7 @@ TransformType Transform = sha256::Transform;
std::string SHA256AutoDetect()
{
-#if defined(__x86_64__) || defined(__amd64__)
+#if defined(EXPERIMENTAL_ASM) && (defined(__x86_64__) || defined(__amd64__))
uint32_t eax, ebx, ecx, edx;
if (__get_cpuid(1, &eax, &ebx, &ecx, &edx) && (ecx >> 19) & 1) {
Transform = sha256_sse4::Transform;