Skip to content
Open
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
26 changes: 14 additions & 12 deletions ext/digest/blake3/extconf.rb
Original file line number Diff line number Diff line change
Expand Up @@ -27,7 +27,7 @@
# Probe used to confirm the compiler both accepts +flag+ and can compile the
# intrinsics the backend relies on.
def blake3_have_isa?(name, flag, snippet)
checking_for("#{name} intrinsics (#{flag})") do
checking_for("#{name} intrinsics" + (flag ? " (#{flag})" : "")) do
try_compile(snippet, flag)
end
end
Expand All @@ -36,27 +36,29 @@ def blake3_have_isa?(name, flag, snippet)
when /\A(x86_64|amd64|x64)\z/i
# Try to detect which SIMD features this x86 machine and compiler has
x86_backends = [
["blake3_sse2", "SSE2", "-msse2",
["blake3_sse2", "SSE2", ["-msse2", "-arch:SSE2"],
"#include <immintrin.h>\nint main(void){ volatile __m128i x = _mm_setzero_si128(); (void)x; return 0; }\n",
"BLAKE3_NO_SSE2"],
["blake3_sse41", "SSE4.1", "-msse4.1",
["blake3_sse41", "SSE4.1", ["-msse4.1", "-arch:AVX"],
"#include <immintrin.h>\nint main(void){ volatile __m128i x = _mm_setzero_si128(); return _mm_testz_si128(x, x); }\n",
"BLAKE3_NO_SSE41"],
["blake3_avx2", "AVX2", "-mavx2",
["blake3_avx2", "AVX2", ["-mavx2", "-arch:AVX2"],
"#include <immintrin.h>\nint main(void){ volatile __m256i x = _mm256_setzero_si256(); (void)x; return 0; }\n",
"BLAKE3_NO_AVX2"],
["blake3_avx512", "AVX-512", "-mavx512f -mavx512vl",
["blake3_avx512", "AVX-512", ["-mavx512f -mavx512vl", "-arch:AVX512"],
"#include <immintrin.h>\nint main(void){ volatile __m512i x = _mm512_setzero_si512(); (void)x; return 0; }\n",
"BLAKE3_NO_AVX512"],
]

x86_backends.each do |obj, name, flag, snippet, no_macro|
if blake3_have_isa?(name, flag, snippet)
objs << obj
simd_cflags[obj] = flag
else
x86_backends.each do |obj, name, flags, snippet, no_macro|
[nil, *flags].any? do |flag|
if blake3_have_isa?(name, flag, snippet)
objs << obj
simd_cflags[obj] = flag
true
end
end or
$defs << "-D#{no_macro}"
end
end
when /\A(aarch64|arm64)\z/i
# NEON is part of the AArch64 baseline, so no runtime detection or special
Expand Down Expand Up @@ -112,7 +114,7 @@ def blake3_have_isa?(name, flag, snippet)
simd_cflags.each do |obj, flag|
target = "#{obj}.#{$OBJEXT}"
mf.puts "#{target}: $(srcdir)/#{obj}.c"
mf.puts "\t$(ECHO) compiling $(<)"
mf.puts "\t$(ECHO) compiling #{obj}.c"
mf.puts "\t$(Q) $(CC) $(INCFLAGS) $(CPPFLAGS) $(CFLAGS) #{flag} $(COUTFLAG)$@ -c $(CSRCFLAG)$(srcdir)/#{obj}.c"
end
end
Expand Down