Skip to content

Commit 90ae46b

Browse files
committed
Fix SIMD cflags detection for Visual C
Architechture option is not standardized. As of Visual Studio 18, it does not have `-m` option.
1 parent 0f7d7c9 commit 90ae46b

1 file changed

Lines changed: 13 additions & 11 deletions

File tree

‎ext/digest/blake3/extconf.rb‎

Lines changed: 13 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -31,7 +31,7 @@ def blake3_disable(macro)
3131
# Probe used to confirm the compiler both accepts +flag+ and can compile the
3232
# intrinsics the backend relies on.
3333
def blake3_have_isa?(name, flag, snippet)
34-
checking_for("#{name} intrinsics (#{flag})") do
34+
checking_for("#{name} intrinsics" + (flag ? " (#{flag})" : "")) do
3535
try_compile(snippet, flag)
3636
end
3737
end
@@ -40,27 +40,29 @@ def blake3_have_isa?(name, flag, snippet)
4040
when /\A(x86_64|amd64|x64)\z/i
4141
# Try to detect which SIMD features this x86 machine and compiler has
4242
x86_backends = [
43-
["blake3_sse2", "SSE2", "-msse2",
43+
["blake3_sse2", "SSE2", ["-msse2", "-arch:SSE2"],
4444
"#include <immintrin.h>\nint main(void){ volatile __m128i x = _mm_setzero_si128(); (void)x; return 0; }\n",
4545
"BLAKE3_NO_SSE2"],
46-
["blake3_sse41", "SSE4.1", "-msse4.1",
46+
["blake3_sse41", "SSE4.1", ["-msse4.1", "-arch:AVX"],
4747
"#include <immintrin.h>\nint main(void){ volatile __m128i x = _mm_setzero_si128(); return _mm_testz_si128(x, x); }\n",
4848
"BLAKE3_NO_SSE41"],
49-
["blake3_avx2", "AVX2", "-mavx2",
49+
["blake3_avx2", "AVX2", ["-mavx2", "-arch:AVX2"],
5050
"#include <immintrin.h>\nint main(void){ volatile __m256i x = _mm256_setzero_si256(); (void)x; return 0; }\n",
5151
"BLAKE3_NO_AVX2"],
52-
["blake3_avx512", "AVX-512", "-mavx512f -mavx512vl",
52+
["blake3_avx512", "AVX-512", ["-mavx512f -mavx512vl", "-arch:AVX512"],
5353
"#include <immintrin.h>\nint main(void){ volatile __m512i x = _mm512_setzero_si512(); (void)x; return 0; }\n",
5454
"BLAKE3_NO_AVX512"],
5555
]
5656

57-
x86_backends.each do |obj, name, flag, snippet, no_macro|
58-
if blake3_have_isa?(name, flag, snippet)
59-
objs << obj
60-
simd_cflags[obj] = flag
61-
else
57+
x86_backends.each do |obj, name, flags, snippet, no_macro|
58+
[nil, *flags].any? do |flag|
59+
if blake3_have_isa?(name, flag, snippet)
60+
objs << obj
61+
simd_cflags[obj] = flag
62+
true
63+
end
64+
end or
6265
blake3_disable(no_macro)
63-
end
6466
end
6567
when /\A(aarch64|arm64)\z/i
6668
# NEON is part of the AArch64 baseline, so no runtime detection or special

0 commit comments

Comments
 (0)