about summary refs log tree commit diff
diff options
context:
space:
mode:
-rw-r--r--.gitignore1
-rwxr-xr-xclean_all.sh2
-rw-r--r--crate_patches/0001-rand-Enable-c2-chacha-simd-feature.patch23
-rw-r--r--crate_patches/0002-rand-Disable-failing-test.patch33
-rwxr-xr-xprepare.sh7
-rw-r--r--src/intrinsics/llvm.rs25
-rwxr-xr-xtest.sh5
7 files changed, 95 insertions, 1 deletions
diff --git a/.gitignore b/.gitignore
index 7b21bbb6492..0da9927b479 100644
--- a/.gitignore
+++ b/.gitignore
@@ -9,5 +9,6 @@ perf.data.old
 /build_sysroot/sysroot
 /build_sysroot/sysroot_src
 /rust
+/rand
 /regex
 /simple-raytracer
diff --git a/clean_all.sh b/clean_all.sh
index b64399bb7c8..3003a0ea2d1 100755
--- a/clean_all.sh
+++ b/clean_all.sh
@@ -2,4 +2,4 @@
 set -e
 
 rm -rf target/ build_sysroot/{sysroot/,sysroot_src/,target/} perf.data{,.old}
-rm -rf regex/ simple-raytracer/
+rm -rf rand/ regex/ simple-raytracer/
diff --git a/crate_patches/0001-rand-Enable-c2-chacha-simd-feature.patch b/crate_patches/0001-rand-Enable-c2-chacha-simd-feature.patch
new file mode 100644
index 00000000000..01dc0fcc537
--- /dev/null
+++ b/crate_patches/0001-rand-Enable-c2-chacha-simd-feature.patch
@@ -0,0 +1,23 @@
+From 9c5663e36391fa20becf84f3af2e82afa5bb720b Mon Sep 17 00:00:00 2001
+From: bjorn3 <bjorn3@users.noreply.github.com>
+Date: Sat, 15 Aug 2020 19:56:03 +0200
+Subject: [PATCH] [rand] Enable c2-chacha simd feature
+
+---
+ rand_chacha/Cargo.toml | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+diff --git a/rand_chacha/Cargo.toml b/rand_chacha/Cargo.toml
+index 9190b7f..872cca2 100644
+--- a/rand_chacha/Cargo.toml
++++ b/rand_chacha/Cargo.toml
+@@ -24,5 +24,5 @@ ppv-lite86 = { version = "0.2.8", default-features = false }
+ 
+ [features]
+ default = ["std"]
+-std = ["ppv-lite86/std"]
++std = ["ppv-lite86/std", "ppv-lite86/simd"]
+ simd = [] # deprecated
+-- 
+2.20.1
+
diff --git a/crate_patches/0002-rand-Disable-failing-test.patch b/crate_patches/0002-rand-Disable-failing-test.patch
new file mode 100644
index 00000000000..19fd20d7269
--- /dev/null
+++ b/crate_patches/0002-rand-Disable-failing-test.patch
@@ -0,0 +1,33 @@
+From a8fb97120d71252538b6b026695df40d02696bdb Mon Sep 17 00:00:00 2001
+From: bjorn3 <bjorn3@users.noreply.github.com>
+Date: Sat, 15 Aug 2020 20:04:38 +0200
+Subject: [PATCH] [rand] Disable failing test
+
+---
+ src/distributions/uniform.rs | 3 ++-
+ 1 file changed, 2 insertions(+), 1 deletion(-)
+
+diff --git a/src/distributions/uniform.rs b/src/distributions/uniform.rs
+index 480b859..c80bb6f 100644
+--- a/src/distributions/uniform.rs
++++ b/src/distributions/uniform.rs
+@@ -1085,7 +1085,7 @@ mod tests {
+             _ => panic!("`UniformDurationMode` was not serialized/deserialized correctly")
+         }
+     }
+-    
++
+     #[test]
+     #[cfg(feature = "serde1")]
+     fn test_uniform_serialization() {
+@@ -1314,6 +1314,7 @@ mod tests {
+         not(target_arch = "wasm32"),
+         not(target_arch = "asmjs")
+     ))]
++    #[ignore] // FIXME
+     fn test_float_assertions() {
+         use super::SampleUniform;
+         use std::panic::catch_unwind;
+-- 
+2.20.1
+
diff --git a/prepare.sh b/prepare.sh
index 8d57e77018e..87f96f5dcf4 100755
--- a/prepare.sh
+++ b/prepare.sh
@@ -5,6 +5,13 @@ rustup component add rust-src rustc-dev llvm-tools-preview
 ./build_sysroot/prepare_sysroot_src.sh
 cargo install hyperfine || echo "Skipping hyperfine install"
 
+git clone https://github.com/rust-random/rand.git || echo "rust-random/rand has already been cloned"
+pushd rand
+git checkout -- .
+git checkout 0f933f9c7176e53b2a3c7952ded484e1783f0bf1
+git am ../crate_patches/*-rand-*.patch
+popd
+
 git clone https://github.com/rust-lang/regex.git || echo "rust-lang/regex has already been cloned"
 pushd regex
 git checkout -- .
diff --git a/src/intrinsics/llvm.rs b/src/intrinsics/llvm.rs
index b99a3dffa11..c85daaa0e2e 100644
--- a/src/intrinsics/llvm.rs
+++ b/src/intrinsics/llvm.rs
@@ -94,6 +94,31 @@ pub(crate) fn codegen_llvm_intrinsic_call<'tcx>(
                 bool_to_zero_or_max_uint(fx, res_lane_layout, res_lane)
             });
         };
+        llvm.x86.sse2.psrli.d, (c a, o imm8) {
+            let imm8 = crate::constant::mir_operand_get_const_val(fx, imm8).expect("llvm.x86.sse2.psrli.d imm8 not const");
+            simd_for_each_lane(fx, a, ret, |fx, _lane_layout, res_lane_layout, lane| {
+                let res_lane = match imm8.val.try_to_bits(Size::from_bytes(4)).expect(&format!("imm8 not scalar: {:?}", imm8)) {
+                    imm8 if imm8 < 32 => fx.bcx.ins().ushr_imm(lane, i64::from(imm8 as u8)),
+                    _ => fx.bcx.ins().iconst(types::I32, 0),
+                };
+                CValue::by_val(res_lane, res_lane_layout)
+            });
+        };
+        llvm.x86.sse2.pslli.d, (c a, o imm8) {
+            let imm8 = crate::constant::mir_operand_get_const_val(fx, imm8).expect("llvm.x86.sse2.psrli.d imm8 not const");
+            simd_for_each_lane(fx, a, ret, |fx, _lane_layout, res_lane_layout, lane| {
+                let res_lane = match imm8.val.try_to_bits(Size::from_bytes(4)).expect(&format!("imm8 not scalar: {:?}", imm8)) {
+                    imm8 if imm8 < 32 => fx.bcx.ins().ishl_imm(lane, i64::from(imm8 as u8)),
+                    _ => fx.bcx.ins().iconst(types::I32, 0),
+                };
+                CValue::by_val(res_lane, res_lane_layout)
+            });
+        };
+        llvm.x86.sse2.storeu.dq, (v mem_addr, c a) {
+            // FIXME correctly handle the unalignment
+            let dest = CPlace::for_ptr(Pointer::new(mem_addr), a.layout());
+            dest.write_cvalue(fx, a);
+        };
     }
 
     if let Some((_, dest)) = destination {
diff --git a/test.sh b/test.sh
index 38d9d87138b..95c6c6a582f 100755
--- a/test.sh
+++ b/test.sh
@@ -71,6 +71,11 @@ $RUN_WRAPPER ./target/out/track-caller-attribute
 echo "[BUILD] mod_bench"
 $RUSTC example/mod_bench.rs --crate-type bin --target $TARGET_TRIPLE
 
+pushd rand
+rm -r ./target || true
+../cargo.sh test --workspace
+popd
+
 pushd simple-raytracer
 if [[ "$HOST_TRIPLE" = "$TARGET_TRIPLE" ]]; then
     echo "[BENCH COMPILE] ebobby/simple-raytracer"