]> git.lizzy.rs Git - rust.git/commitdiff
[intrinsics] add div and rem vector tests
authorgnzlbg <gonzalobg88@gmail.com>
Mon, 6 Nov 2017 12:37:26 +0000 (13:37 +0100)
committergnzlbg <gonzalobg88@gmail.com>
Mon, 6 Nov 2017 14:57:25 +0000 (15:57 +0100)
src/librustc_typeck/check/intrinsic.rs
src/test/compile-fail/simd-intrinsic-generic-arithmetic.rs
src/test/run-pass/simd-intrinsic-generic-arithmetic.rs

index 3861a358b23e0bace364eff331501ac590090dc7..6ef0c37a31583e4b96a8d05ac98e7bd50feec30f 100644 (file)
@@ -348,7 +348,7 @@ pub fn check_platform_intrinsic_type<'a, 'tcx>(tcx: TyCtxt<'a, 'tcx, 'tcx>,
         "simd_eq" | "simd_ne" | "simd_lt" | "simd_le" | "simd_gt" | "simd_ge" => {
             (2, vec![param(0), param(0)], param(1))
         }
-        "simd_add" | "simd_sub" | "simd_mul" |
+        "simd_add" | "simd_sub" | "simd_mul" | "simd_rem" |
         "simd_div" | "simd_shl" | "simd_shr" |
         "simd_and" | "simd_or" | "simd_xor" => {
             (1, vec![param(0), param(0)], param(0))
index 35c368f4cbedb5bb399156b590bbc7ad1f43dfdd..ee08ca05e803fca35452eef49dd4c0affdc46edb 100644 (file)
@@ -27,6 +27,7 @@
     fn simd_sub<T>(x: T, y: T) -> T;
     fn simd_mul<T>(x: T, y: T) -> T;
     fn simd_div<T>(x: T, y: T) -> T;
+    fn simd_rem<T>(x: T, y: T) -> T;
     fn simd_shl<T>(x: T, y: T) -> T;
     fn simd_shr<T>(x: T, y: T) -> T;
     fn simd_and<T>(x: T, y: T) -> T;
@@ -49,8 +50,12 @@ fn main() {
         simd_mul(x, x);
         simd_mul(y, y);
         simd_mul(z, z);
-
+        simd_div(x, x);
+        simd_div(y, y);
         simd_div(z, z);
+        simd_rem(x, x);
+        simd_rem(y, y);
+        simd_rem(z, z);
 
         simd_shl(x, x);
         simd_shl(y, y);
@@ -84,10 +89,6 @@ fn main() {
         //~^ ERROR expected SIMD input type, found non-SIMD `i32`
 
 
-        simd_div(x, x);
-//~^ ERROR unsupported operation on `i32x4` with element `i32`
-        simd_div(y, y);
-//~^ ERROR unsupported operation on `u32x4` with element `u32`
         simd_shl(z, z);
 //~^ ERROR unsupported operation on `f32x4` with element `f32`
         simd_shr(z, z);
index 5d4ecbb5f81722a4f32f24f50905cd56056c00ef..1894cd0084bcb167a4c4d8e50da6efaf6390fb92 100644 (file)
@@ -35,6 +35,7 @@ macro_rules! all_eq {
     fn simd_sub<T>(x: T, y: T) -> T;
     fn simd_mul<T>(x: T, y: T) -> T;
     fn simd_div<T>(x: T, y: T) -> T;
+    fn simd_rem<T>(x: T, y: T) -> T;
     fn simd_shl<T>(x: T, y: T) -> T;
     fn simd_shr<T>(x: T, y: T) -> T;
     fn simd_and<T>(x: T, y: T) -> T;
@@ -72,9 +73,22 @@ fn main() {
         all_eq!(simd_sub(z2, z1), f32x4(1.0, 1.0, 1.0, 1.0));
         all_eq!(simd_sub(z1, z2), f32x4(-1.0, -1.0, -1.0, -1.0));
 
+        all_eq!(simd_div(x1, x1), i32x4(1, 1, 1, 1));
+        all_eq!(simd_div(i32x4(2, 4, 6, 8), i32x4(2, 2, 2, 2)), x1);
+        all_eq!(simd_div(y1, y1), u32x4(1, 1, 1, 1));
+        all_eq!(simd_div(u32x4(2, 4, 6, 8), u32x4(2, 2, 2, 2)), y1);
+        all_eq!(simd_div(z1, z1), f32x4(1.0, 1.0, 1.0, 1.0));
         all_eq!(simd_div(z1, z2), f32x4(1.0/2.0, 2.0/3.0, 3.0/4.0, 4.0/5.0));
         all_eq!(simd_div(z2, z1), f32x4(2.0/1.0, 3.0/2.0, 4.0/3.0, 5.0/4.0));
 
+        all_eq!(simd_rem(x1, x1), i32x4(0, 0, 0, 0));
+        all_eq!(simd_rem(x2, x1), i32x4(0, 1, 1, 1));
+        all_eq!(simd_rem(y1, y1), u32x4(0, 0, 0, 0));
+        all_eq!(simd_rem(y2, y1), u32x4(0, 1, 1, 1));
+        all_eq!(simd_rem(z1, z1), f32x4(0.0, 0.0, 0.0, 0.0));
+        all_eq!(simd_rem(z1, z2), z1);
+        all_eq!(simd_rem(z2, z1), f32x4(0.0, 1.0, 1.0, 1.0));
+
         all_eq!(simd_shl(x1, x2), i32x4(1 << 2, 2 << 3, 3 << 4, 4 << 5));
         all_eq!(simd_shl(x2, x1), i32x4(2 << 1, 3 << 2, 4 << 3, 5 << 4));
         all_eq!(simd_shl(y1, y2), u32x4(1 << 2, 2 << 3, 3 << 4, 4 << 5));