aboutsummaryrefslogtreecommitdiff
path: root/build.rs
diff options
context:
space:
mode:
authorMatthew Krupcale <[email protected]>2020-08-14 18:02:06 -0400
committerMatthew Krupcale <[email protected]>2020-08-24 00:54:46 -0400
commitd91f20dd29e491b70d0fb900ff3445f53add50a3 (patch)
tree02ddbc3bd3281617bcb282be0b825b01df5427f7 /build.rs
parentadbf07d67a1f08c40e1c7ff60845519f81e0254f (diff)
Start SSE2 implementation based on SSE4.1 version
Wire up basic functions and features for SSE2 support using the SSE4.1 version as a basis without implementing the SSE2 instructions yet. * Cargo.toml: add no_sse2 feature * benches/bench.rs: wire SSE2 benchmarks * build.rs: add SSE2 rust intrinsics and assembly builds * c/Makefile.testing: add SSE2 C and assembly targets * c/README.md: add SSE2 to C build instructions * c/blake3_c_rust_bindings/build.rs: add SSE2 C rust binding builds * c/blake3_c_rust_bindings/src/lib.rs: add SSE2 C rust bindings * c/blake3_dispatch.c: add SSE2 C dispatch * c/blake3_impl.h: add SSE2 C function prototypes * c/blake3_sse2.c: add SSE2 C intrinsic file starting with SSE4.1 version * c/blake3_sse2_x86-64_{unix.S,windows_gnu.S,windows_msvc.asm}: add SSE2 assembly files starting with SSE4.1 version * src/ffi_sse2.rs: add rust implementation using SSE2 C rust bindings * src/lib.rs: add SSE2 rust intrinsics and SSE2 C rust binding rust SSE2 module configurations * src/platform.rs: add SSE2 rust platform detection and dispatch * src/rust_sse2.rs: add SSE2 rust intrinsic file starting with SSE4.1 version * tools/instruction_set_support/src/main.rs: add SSE2 feature detection
Diffstat (limited to 'build.rs')
-rw-r--r--build.rs20
1 files changed, 13 insertions, 7 deletions
diff --git a/build.rs b/build.rs
index 38fc722..ea657d8 100644
--- a/build.rs
+++ b/build.rs
@@ -118,34 +118,40 @@ fn c_compiler_support() -> CCompilerSupport {
}
}
-fn build_sse41_avx2_rust_intrinsics() {
- // No C code to compile here. Set the cfg flags that enable the Rust SSE4.1
- // and AVX2 intrinsics modules. The regular Cargo build will compile them.
+fn build_sse2_sse41_avx2_rust_intrinsics() {
+ // No C code to compile here. Set the cfg flags that enable the Rust SSE2,
+ // SSE4.1, and AVX2 intrinsics modules. The regular Cargo build will compile
+ // them.
+ println!("cargo:rustc-cfg=blake3_sse2_rust");
println!("cargo:rustc-cfg=blake3_sse41_rust");
println!("cargo:rustc-cfg=blake3_avx2_rust");
}
-fn build_sse41_avx2_assembly() {
+fn build_sse2_sse41_avx2_assembly() {
// Build the assembly implementations for SSE4.1 and AVX2. This is
// preferred, but it only supports x86_64.
assert!(is_x86_64());
+ println!("cargo:rustc-cfg=blake3_sse2_ffi");
println!("cargo:rustc-cfg=blake3_sse41_ffi");
println!("cargo:rustc-cfg=blake3_avx2_ffi");
let mut build = new_build();
if is_windows_msvc() {
+ build.file("c/blake3_sse2_x86-64_windows_msvc.asm");
build.file("c/blake3_sse41_x86-64_windows_msvc.asm");
build.file("c/blake3_avx2_x86-64_windows_msvc.asm");
} else if is_windows_gnu() {
+ build.file("c/blake3_sse2_x86-64_windows_gnu.S");
build.file("c/blake3_sse41_x86-64_windows_gnu.S");
build.file("c/blake3_avx2_x86-64_windows_gnu.S");
} else {
// All non-Windows implementations are assumed to support
// Linux-style assembly. These files do contain a small
// explicit workaround for macOS also.
+ build.file("c/blake3_sse2_x86-64_unix.S");
build.file("c/blake3_sse41_x86-64_unix.S");
build.file("c/blake3_avx2_x86-64_unix.S");
}
- build.compile("blake3_sse41_avx2_assembly");
+ build.compile("blake3_sse2_sse41_avx2_assembly");
}
fn build_avx512_c_intrinsics() {
@@ -215,11 +221,11 @@ fn main() -> Result<(), Box<dyn std::error::Error>> {
if is_x86_64() || is_x86_32() {
let support = c_compiler_support();
if is_x86_32() || should_prefer_intrinsics() || is_pure() || support == NoCompiler {
- build_sse41_avx2_rust_intrinsics();
+ build_sse2_sse41_avx2_rust_intrinsics();
} else {
// We assume that all C compilers can assemble SSE4.1 and AVX2. We
// don't explicitly check for support.
- build_sse41_avx2_assembly();
+ build_sse2_sse41_avx2_assembly();
}
if is_pure() || support == NoCompiler || support == NoAVX512 {