Enable double-SHA256-for-64-byte code on 32-bit x86

This commit is contained in:
Pieter Wuille 2018-06-04 11:30:34 -07:00
parent 0de7cc848e
commit 57ba401abc

View file

@ -478,7 +478,7 @@ TransformD64Type TransformD64 = sha256::TransformD64;
TransformD64Type TransformD64_4way = nullptr; TransformD64Type TransformD64_4way = nullptr;
TransformD64Type TransformD64_8way = nullptr; TransformD64Type TransformD64_8way = nullptr;
#if defined(USE_ASM) && (defined(__x86_64__) || defined(__amd64__)) #if defined(USE_ASM) && (defined(__x86_64__) || defined(__amd64__) || defined(__i386__))
// We can't use cpuid.h's __get_cpuid as it does not support subleafs. // We can't use cpuid.h's __get_cpuid as it does not support subleafs.
void inline cpuid(uint32_t leaf, uint32_t subleaf, uint32_t& a, uint32_t& b, uint32_t& c, uint32_t& d) void inline cpuid(uint32_t leaf, uint32_t subleaf, uint32_t& a, uint32_t& b, uint32_t& c, uint32_t& d)
{ {
@ -491,12 +491,14 @@ void inline cpuid(uint32_t leaf, uint32_t subleaf, uint32_t& a, uint32_t& b, uin
std::string SHA256AutoDetect() std::string SHA256AutoDetect()
{ {
std::string ret = "standard"; std::string ret = "standard";
#if defined(USE_ASM) && (defined(__x86_64__) || defined(__amd64__)) #if defined(USE_ASM) && (defined(__x86_64__) || defined(__amd64__) || defined(__i386__))
uint32_t eax, ebx, ecx, edx; uint32_t eax, ebx, ecx, edx;
cpuid(1, 0, eax, ebx, ecx, edx); cpuid(1, 0, eax, ebx, ecx, edx);
if ((ecx >> 19) & 1) { if ((ecx >> 19) & 1) {
#if defined(__x86_64__) || defined(__amd64__)
Transform = sha256_sse4::Transform; Transform = sha256_sse4::Transform;
TransformD64 = TransformD64Wrapper<sha256_sse4::Transform>; TransformD64 = TransformD64Wrapper<sha256_sse4::Transform>;
#endif
#if defined(ENABLE_SSE41) && !defined(BUILD_BITCOIN_INTERNAL) #if defined(ENABLE_SSE41) && !defined(BUILD_BITCOIN_INTERNAL)
TransformD64_4way = sha256d64_sse41::Transform_4way; TransformD64_4way = sha256d64_sse41::Transform_4way;
ret = "sse4(1way+4way)"; ret = "sse4(1way+4way)";