Skip to content

Commit 268400d

Browse files
committed
[Refactor] CPU feature detection logic for SHA256
1 parent b1dc39d commit 268400d

File tree

1 file changed

+34
-16
lines changed

1 file changed

+34
-16
lines changed

src/crypto/sha256.cpp

Lines changed: 34 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -552,32 +552,50 @@ std::string SHA256AutoDetect()
552552
{
553553
std::string ret = "standard";
554554
#if defined(USE_ASM) && (defined(__x86_64__) || defined(__amd64__) || defined(__i386__))
555-
(void)AVXEnabled; // Silence unused warning (in case ENABLE_AVX2 is not defined)
555+
bool have_sse4 = false;
556+
bool have_xsave = false;
557+
bool have_avx = false;
558+
bool have_avx2 = false;
559+
bool enabled_avx = false;
560+
561+
(void)AVXEnabled;
562+
(void)have_sse4;
563+
(void)have_avx;
564+
(void)have_xsave;
565+
(void)have_avx2;
566+
(void)enabled_avx;
567+
556568
uint32_t eax, ebx, ecx, edx;
557569
cpuid(1, 0, eax, ebx, ecx, edx);
558-
if ((ecx >> 19) & 1) {
570+
have_sse4 = (ecx >> 19) & 1;
571+
have_xsave = (ecx >> 27) & 1;
572+
have_avx = (ecx >> 28) & 1;
573+
if (have_xsave && have_avx) {
574+
enabled_avx = AVXEnabled();
575+
}
576+
if (have_sse4) {
577+
cpuid(7, 0, eax, ebx, ecx, edx);
578+
have_avx2 = (ebx >> 5) & 1;
579+
}
580+
581+
if (have_sse4) {
559582
#if defined(__x86_64__) || defined(__amd64__)
560583
Transform = sha256_sse4::Transform;
561584
TransformD64 = TransformD64Wrapper<sha256_sse4::Transform>;
585+
ret = "sse4(1way)";
562586
#endif
563587
#if defined(ENABLE_SSE41) && !defined(BUILD_BITCOIN_INTERNAL)
564588
TransformD64_4way = sha256d64_sse41::Transform_4way;
565-
ret = "sse4(1way+4way)";
566-
#if defined(ENABLE_AVX2) && !defined(BUILD_BITCOIN_INTERNAL)
567-
if (((ecx >> 27) & 1) && ((ecx >> 28) & 1)) { // XSAVE and AVX
568-
cpuid(7, 0, eax, ebx, ecx, edx);
569-
if ((ebx >> 5) & 1) { // AVX2 flag
570-
if (AVXEnabled()) { // OS has enabled AVX registers
571-
TransformD64_8way = sha256d64_avx2::Transform_8way;
572-
ret += ",avx2(8way)";
573-
}
574-
}
575-
}
576-
#endif
577-
#else
578-
ret = "sse4";
589+
ret += ",sse41(4way)";
579590
#endif
580591
}
592+
593+
#if defined(ENABLE_AVX2) && !defined(BUILD_BITCOIN_INTERNAL)
594+
if (have_avx2 && have_avx && enabled_avx) {
595+
TransformD64_8way = sha256d64_avx2::Transform_8way;
596+
ret += ",avx2(8way)";
597+
}
598+
#endif
581599
#endif
582600

583601
assert(SelfTest());

0 commit comments

Comments
 (0)