2019-02-08 15:23:48 +01:00
|
|
|
//@ run-pass
|
2019-02-08 19:56:38 +01:00
|
|
|
//@ ignore-emscripten
|
2019-02-08 15:23:48 +01:00
|
|
|
|
2020-11-08 20:21:28 +10:00
|
|
|
#![allow(non_camel_case_types)]
|
2025-02-24 17:26:56 +01:00
|
|
|
#![feature(repr_simd, core_intrinsics)]
|
|
|
|
|
|
2025-07-12 02:33:42 -07:00
|
|
|
#[path = "../../../auxiliary/minisimd.rs"]
|
|
|
|
|
mod minisimd;
|
|
|
|
|
use minisimd::*;
|
2019-02-08 15:23:48 +01:00
|
|
|
|
2025-07-12 02:33:42 -07:00
|
|
|
use std::intrinsics::simd::{simd_saturating_add, simd_saturating_sub};
|
2019-02-08 15:23:48 +01:00
|
|
|
|
2025-07-12 02:33:42 -07:00
|
|
|
type I32<const N: usize> = Simd<i32, N>;
|
2019-02-08 15:23:48 +01:00
|
|
|
|
|
|
|
|
fn main() {
|
|
|
|
|
// unsigned
|
|
|
|
|
{
|
2020-06-02 07:59:11 +00:00
|
|
|
const M: u32 = u32::MAX;
|
2019-02-08 15:23:48 +01:00
|
|
|
|
2025-07-12 02:33:42 -07:00
|
|
|
let a = u32x4::from_array([1, 2, 3, 4]);
|
|
|
|
|
let b = u32x4::from_array([2, 4, 6, 8]);
|
|
|
|
|
let m = u32x4::from_array([M, M, M, M]);
|
|
|
|
|
let m1 = u32x4::from_array([M - 1, M - 1, M - 1, M - 1]);
|
|
|
|
|
let z = u32x4::from_array([0, 0, 0, 0]);
|
2019-02-08 15:23:48 +01:00
|
|
|
|
|
|
|
|
unsafe {
|
|
|
|
|
assert_eq!(simd_saturating_add(z, z), z);
|
|
|
|
|
assert_eq!(simd_saturating_add(z, a), a);
|
|
|
|
|
assert_eq!(simd_saturating_add(b, z), b);
|
|
|
|
|
assert_eq!(simd_saturating_add(a, a), b);
|
|
|
|
|
assert_eq!(simd_saturating_add(a, m), m);
|
|
|
|
|
assert_eq!(simd_saturating_add(m, b), m);
|
|
|
|
|
assert_eq!(simd_saturating_add(m1, a), m);
|
|
|
|
|
|
|
|
|
|
assert_eq!(simd_saturating_sub(b, z), b);
|
|
|
|
|
assert_eq!(simd_saturating_sub(b, a), a);
|
|
|
|
|
assert_eq!(simd_saturating_sub(a, a), z);
|
|
|
|
|
assert_eq!(simd_saturating_sub(a, b), z);
|
|
|
|
|
assert_eq!(simd_saturating_sub(a, m1), z);
|
|
|
|
|
assert_eq!(simd_saturating_sub(b, m1), z);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// signed
|
|
|
|
|
{
|
2020-06-02 07:59:11 +00:00
|
|
|
const MIN: i32 = i32::MIN;
|
|
|
|
|
const MAX: i32 = i32::MAX;
|
2019-02-08 15:23:48 +01:00
|
|
|
|
2025-07-12 02:33:42 -07:00
|
|
|
let a = I32::<4>::from_array([1, 2, 3, 4]);
|
|
|
|
|
let b = I32::<4>::from_array([2, 4, 6, 8]);
|
|
|
|
|
let c = I32::<4>::from_array([-1, -2, -3, -4]);
|
|
|
|
|
let d = I32::<4>::from_array([-2, -4, -6, -8]);
|
2019-02-08 15:23:48 +01:00
|
|
|
|
2025-07-12 02:33:42 -07:00
|
|
|
let max = I32::<4>::from_array([MAX, MAX, MAX, MAX]);
|
|
|
|
|
let max1 = I32::<4>::from_array([MAX - 1, MAX - 1, MAX - 1, MAX - 1]);
|
|
|
|
|
let min = I32::<4>::from_array([MIN, MIN, MIN, MIN]);
|
|
|
|
|
let min1 = I32::<4>::from_array([MIN + 1, MIN + 1, MIN + 1, MIN + 1]);
|
2019-02-08 15:23:48 +01:00
|
|
|
|
2025-07-12 02:33:42 -07:00
|
|
|
let z = I32::<4>::from_array([0, 0, 0, 0]);
|
2019-02-08 15:23:48 +01:00
|
|
|
|
|
|
|
|
unsafe {
|
2025-07-12 02:33:42 -07:00
|
|
|
assert_eq!(simd_saturating_add(z, z), z);
|
|
|
|
|
assert_eq!(simd_saturating_add(z, a), a);
|
|
|
|
|
assert_eq!(simd_saturating_add(b, z), b);
|
|
|
|
|
assert_eq!(simd_saturating_add(a, a), b);
|
|
|
|
|
assert_eq!(simd_saturating_add(a, max), max);
|
|
|
|
|
assert_eq!(simd_saturating_add(max, b), max);
|
|
|
|
|
assert_eq!(simd_saturating_add(max1, a), max);
|
|
|
|
|
assert_eq!(simd_saturating_add(min1, z), min1);
|
|
|
|
|
assert_eq!(simd_saturating_add(min, z), min);
|
|
|
|
|
assert_eq!(simd_saturating_add(min1, c), min);
|
|
|
|
|
assert_eq!(simd_saturating_add(min, c), min);
|
|
|
|
|
assert_eq!(simd_saturating_add(min1, d), min);
|
|
|
|
|
assert_eq!(simd_saturating_add(min, d), min);
|
2019-02-08 15:23:48 +01:00
|
|
|
|
2025-07-12 02:33:42 -07:00
|
|
|
assert_eq!(simd_saturating_sub(b, z), b);
|
|
|
|
|
assert_eq!(simd_saturating_sub(b, a), a);
|
|
|
|
|
assert_eq!(simd_saturating_sub(a, a), z);
|
|
|
|
|
assert_eq!(simd_saturating_sub(a, b), c);
|
|
|
|
|
assert_eq!(simd_saturating_sub(z, max), min1);
|
|
|
|
|
assert_eq!(simd_saturating_sub(min1, z), min1);
|
|
|
|
|
assert_eq!(simd_saturating_sub(min1, a), min);
|
|
|
|
|
assert_eq!(simd_saturating_sub(min1, b), min);
|
2019-02-08 15:23:48 +01:00
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|