diff --git a/src/librustc_trans/intrinsic.rs b/src/librustc_trans/intrinsic.rs index e80239175681e..2f1a95038eae5 100644 --- a/src/librustc_trans/intrinsic.rs +++ b/src/librustc_trans/intrinsic.rs @@ -1203,7 +1203,8 @@ fn generic_simd_intrinsic<'a, 'tcx>( simd_add: TyUint, TyInt => add, TyFloat => fadd; simd_sub: TyUint, TyInt => sub, TyFloat => fsub; simd_mul: TyUint, TyInt => mul, TyFloat => fmul; - simd_div: TyFloat => fdiv; + simd_div: TyUint => udiv, TyInt => sdiv, TyFloat => fdiv; + simd_rem: TyUint => urem, TyInt => srem, TyFloat => frem; simd_shl: TyUint, TyInt => shl; simd_shr: TyUint => lshr, TyInt => ashr; simd_and: TyUint, TyInt => and; diff --git a/src/librustc_typeck/check/intrinsic.rs b/src/librustc_typeck/check/intrinsic.rs index 3861a358b23e0..6ef0c37a31583 100644 --- a/src/librustc_typeck/check/intrinsic.rs +++ b/src/librustc_typeck/check/intrinsic.rs @@ -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)) diff --git a/src/test/compile-fail/simd-intrinsic-generic-arithmetic.rs b/src/test/compile-fail/simd-intrinsic-generic-arithmetic.rs index 35c368f4cbedb..ee08ca05e803f 100644 --- a/src/test/compile-fail/simd-intrinsic-generic-arithmetic.rs +++ b/src/test/compile-fail/simd-intrinsic-generic-arithmetic.rs @@ -27,6 +27,7 @@ extern "platform-intrinsic" { 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); diff --git a/src/test/run-pass/simd-intrinsic-generic-arithmetic.rs b/src/test/run-pass/simd-intrinsic-generic-arithmetic.rs index 5d4ecbb5f8172..1894cd0084bcb 100644 --- a/src/test/run-pass/simd-intrinsic-generic-arithmetic.rs +++ b/src/test/run-pass/simd-intrinsic-generic-arithmetic.rs @@ -35,6 +35,7 @@ extern "platform-intrinsic" { 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));