| // Compiler: | |
| // | |
| // Run-time: | |
| // status: 0 | |
| #![feature(portable_simd)] | |
| use std::hint::black_box; | |
| use std::simd::prelude::*; | |
| fn test_saturating_add() { | |
| let values = i32x4::from_array([i32::MIN, -2, 3, i32::MAX]); | |
| let ones = i32x4::splat(1); | |
| assert_eq!( | |
| black_box(values).saturating_add(black_box(ones)).to_array(), | |
| [i32::MIN + 1, -1, 4, i32::MAX] | |
| ); | |
| let values = u32x4::from_array([0, 2, 3, u32::MAX]); | |
| let ones = u32x4::splat(1); | |
| assert_eq!(black_box(values).saturating_add(black_box(ones)).to_array(), [1, 3, 4, u32::MAX]); | |
| } | |
| fn test_saturating_sub() { | |
| let values = i32x4::from_array([i32::MIN, -2, 3, i32::MAX]); | |
| let zero = i32x4::splat(0); | |
| assert_eq!( | |
| black_box(zero).saturating_sub(black_box(values)).to_array(), | |
| [i32::MAX, 2, -3, i32::MIN + 1] | |
| ); | |
| assert_eq!(black_box(values).saturating_neg().to_array(), [i32::MAX, 2, -3, i32::MIN + 1]); | |
| assert_eq!(black_box(values).saturating_abs().to_array(), [i32::MAX, 2, 3, i32::MAX]); | |
| let values = i32x4::from_array([i32::MIN, -2, 3, i32::MAX]); | |
| let ones = i32x4::splat(1); | |
| assert_eq!( | |
| black_box(values).saturating_sub(black_box(ones)).to_array(), | |
| [i32::MIN, -3, 2, i32::MAX - 1] | |
| ); | |
| let values = u32x4::from_array([0, 2, 3, u32::MAX]); | |
| let ones = u32x4::splat(1); | |
| assert_eq!( | |
| black_box(values).saturating_sub(black_box(ones)).to_array(), | |
| [0, 1, 2, u32::MAX - 1] | |
| ); | |
| } | |
| fn test_float_cast() { | |
| let floats = f32x4::from_array([1.9, -4.5, f32::INFINITY, f32::NAN]); | |
| assert_eq!(black_box(floats).cast::<i32>().to_array(), [1, -4, i32::MAX, 0]); | |
| let floats = f32x4::from_array([f32::NEG_INFINITY, 1e20, -1e20, -0.0]); | |
| assert_eq!(black_box(floats).cast::<i32>().to_array(), [i32::MIN, i32::MAX, i32::MIN, 0]); | |
| let floats = f32x4::from_array([-1.0, 3.7, f32::NAN, 1e20]); | |
| assert_eq!(black_box(floats).cast::<u32>().to_array(), [0, 3, 0, u32::MAX]); | |
| let floats = f64x4::from_array([-1.5, 2.5, f64::NAN, f64::INFINITY]); | |
| assert_eq!(black_box(floats).cast::<i64>().to_array(), [-1, 2, 0, i64::MAX]); | |
| } | |
| fn test_arith_offset() { | |
| let values = [10i32, 11, 12, 13, 14, 15, 16, 17]; | |
| let indices = usizex4::from_array([7, 5, 3, 1]); | |
| assert_eq!( | |
| i32x4::gather_or_default(black_box(&values), black_box(indices)).to_array(), | |
| [17, 15, 13, 11] | |
| ); | |
| let mut destination = [0i32; 8]; | |
| i32x4::from_array([1, 2, 3, 4]).scatter(black_box(&mut destination), black_box(indices)); | |
| assert_eq!(destination, [0, 4, 0, 3, 0, 2, 0, 1]); | |
| } | |
| fn main() { | |
| test_saturating_add(); | |
| test_saturating_sub(); | |
| test_float_cast(); | |
| test_arith_offset(); | |
| } |