summaryrefslogtreecommitdiffstats
path: root/library/portable-simd/crates/core_simd/tests
diff options
context:
space:
mode:
authorDaniel Baumann <daniel.baumann@progress-linux.org>2024-06-19 09:26:03 +0000
committerDaniel Baumann <daniel.baumann@progress-linux.org>2024-06-19 09:26:03 +0000
commit9918693037dce8aa4bb6f08741b6812923486c18 (patch)
tree21d2b40bec7e6a7ea664acee056eb3d08e15a1cf /library/portable-simd/crates/core_simd/tests
parentReleasing progress-linux version 1.75.0+dfsg1-5~progress7.99u1. (diff)
downloadrustc-9918693037dce8aa4bb6f08741b6812923486c18.tar.xz
rustc-9918693037dce8aa4bb6f08741b6812923486c18.zip
Merging upstream version 1.76.0+dfsg1.
Signed-off-by: Daniel Baumann <daniel.baumann@progress-linux.org>
Diffstat (limited to 'library/portable-simd/crates/core_simd/tests')
-rw-r--r--library/portable-simd/crates/core_simd/tests/cast.rs2
-rw-r--r--library/portable-simd/crates/core_simd/tests/masks.rs14
-rw-r--r--library/portable-simd/crates/core_simd/tests/ops_macros.rs135
-rw-r--r--library/portable-simd/crates/core_simd/tests/pointers.rs7
-rw-r--r--library/portable-simd/crates/core_simd/tests/round.rs4
-rw-r--r--library/portable-simd/crates/core_simd/tests/swizzle.rs28
-rw-r--r--library/portable-simd/crates/core_simd/tests/swizzle_dyn.rs1
-rw-r--r--library/portable-simd/crates/core_simd/tests/to_bytes.rs22
8 files changed, 164 insertions, 49 deletions
diff --git a/library/portable-simd/crates/core_simd/tests/cast.rs b/library/portable-simd/crates/core_simd/tests/cast.rs
index 00545936e..185e1945f 100644
--- a/library/portable-simd/crates/core_simd/tests/cast.rs
+++ b/library/portable-simd/crates/core_simd/tests/cast.rs
@@ -3,7 +3,7 @@ macro_rules! cast_types {
($start:ident, $($target:ident),*) => {
mod $start {
#[allow(unused)]
- use core_simd::simd::{Simd, SimdInt, SimdUint, SimdFloat};
+ use core_simd::simd::prelude::*;
type Vector<const N: usize> = Simd<$start, N>;
$(
mod $target {
diff --git a/library/portable-simd/crates/core_simd/tests/masks.rs b/library/portable-simd/crates/core_simd/tests/masks.rs
index 9f8bad1c3..00fc2a24e 100644
--- a/library/portable-simd/crates/core_simd/tests/masks.rs
+++ b/library/portable-simd/crates/core_simd/tests/masks.rs
@@ -72,7 +72,6 @@ macro_rules! test_mask_api {
#[test]
fn roundtrip_bitmask_conversion() {
- use core_simd::simd::ToBitMask;
let values = [
true, false, false, true, false, false, true, false,
true, true, false, false, false, false, false, true,
@@ -85,8 +84,6 @@ macro_rules! test_mask_api {
#[test]
fn roundtrip_bitmask_conversion_short() {
- use core_simd::simd::ToBitMask;
-
let values = [
false, false, false, true,
];
@@ -125,18 +122,17 @@ macro_rules! test_mask_api {
cast_impl::<isize>();
}
- #[cfg(feature = "generic_const_exprs")]
#[test]
- fn roundtrip_bitmask_array_conversion() {
- use core_simd::simd::ToBitMaskArray;
+ fn roundtrip_bitmask_vector_conversion() {
+ use core_simd::simd::ToBytes;
let values = [
true, false, false, true, false, false, true, false,
true, true, false, false, false, false, false, true,
];
let mask = Mask::<$type, 16>::from_array(values);
- let bitmask = mask.to_bitmask_array();
- assert_eq!(bitmask, [0b01001001, 0b10000011]);
- assert_eq!(Mask::<$type, 16>::from_bitmask_array(bitmask), mask);
+ let bitmask = mask.to_bitmask_vector();
+ assert_eq!(bitmask.resize::<2>(0).to_ne_bytes()[..2], [0b01001001, 0b10000011]);
+ assert_eq!(Mask::<$type, 16>::from_bitmask_vector(bitmask), mask);
}
}
}
diff --git a/library/portable-simd/crates/core_simd/tests/ops_macros.rs b/library/portable-simd/crates/core_simd/tests/ops_macros.rs
index 3a02f3f01..aa565a137 100644
--- a/library/portable-simd/crates/core_simd/tests/ops_macros.rs
+++ b/library/portable-simd/crates/core_simd/tests/ops_macros.rs
@@ -6,7 +6,7 @@ macro_rules! impl_unary_op_test {
{ $scalar:ty, $trait:ident :: $fn:ident, $scalar_fn:expr } => {
test_helpers::test_lanes! {
fn $fn<const LANES: usize>() {
- test_helpers::test_unary_elementwise(
+ test_helpers::test_unary_elementwise_flush_subnormals(
&<core_simd::simd::Simd<$scalar, LANES> as core::ops::$trait>::$fn,
&$scalar_fn,
&|_| true,
@@ -31,7 +31,7 @@ macro_rules! impl_binary_op_test {
test_helpers::test_lanes! {
fn normal<const LANES: usize>() {
- test_helpers::test_binary_elementwise(
+ test_helpers::test_binary_elementwise_flush_subnormals(
&<Simd<$scalar, LANES> as core::ops::$trait>::$fn,
&$scalar_fn,
&|_, _| true,
@@ -39,7 +39,7 @@ macro_rules! impl_binary_op_test {
}
fn assign<const LANES: usize>() {
- test_helpers::test_binary_elementwise(
+ test_helpers::test_binary_elementwise_flush_subnormals(
&|mut a, b| { <Simd<$scalar, LANES> as core::ops::$trait_assign>::$fn_assign(&mut a, b); a },
&$scalar_fn,
&|_, _| true,
@@ -68,6 +68,7 @@ macro_rules! impl_binary_checked_op_test {
test_helpers::test_lanes! {
fn normal<const LANES: usize>() {
+ #![allow(clippy::redundant_closure_call)]
test_helpers::test_binary_elementwise(
&<Simd<$scalar, LANES> as core::ops::$trait>::$fn,
&$scalar_fn,
@@ -76,6 +77,7 @@ macro_rules! impl_binary_checked_op_test {
}
fn assign<const LANES: usize>() {
+ #![allow(clippy::redundant_closure_call)]
test_helpers::test_binary_elementwise(
&|mut a, b| { <Simd<$scalar, LANES> as core::ops::$trait_assign>::$fn_assign(&mut a, b); a },
&$scalar_fn,
@@ -94,11 +96,43 @@ macro_rules! impl_binary_checked_op_test {
macro_rules! impl_common_integer_tests {
{ $vector:ident, $scalar:ident } => {
test_helpers::test_lanes! {
+ fn shr<const LANES: usize>() {
+ use core::ops::Shr;
+ let shr = |x: $scalar, y: $scalar| x.wrapping_shr(y as _);
+ test_helpers::test_binary_elementwise(
+ &<$vector::<LANES> as Shr<$vector::<LANES>>>::shr,
+ &shr,
+ &|_, _| true,
+ );
+ test_helpers::test_binary_scalar_rhs_elementwise(
+ &<$vector::<LANES> as Shr<$scalar>>::shr,
+ &shr,
+ &|_, _| true,
+ );
+ }
+
+ fn shl<const LANES: usize>() {
+ use core::ops::Shl;
+ let shl = |x: $scalar, y: $scalar| x.wrapping_shl(y as _);
+ test_helpers::test_binary_elementwise(
+ &<$vector::<LANES> as Shl<$vector::<LANES>>>::shl,
+ &shl,
+ &|_, _| true,
+ );
+ test_helpers::test_binary_scalar_rhs_elementwise(
+ &<$vector::<LANES> as Shl<$scalar>>::shl,
+ &shl,
+ &|_, _| true,
+ );
+ }
+
fn reduce_sum<const LANES: usize>() {
test_helpers::test_1(&|x| {
+ use test_helpers::subnormals::{flush, flush_in};
test_helpers::prop_assert_biteq! (
$vector::<LANES>::from_array(x).reduce_sum(),
x.iter().copied().fold(0 as $scalar, $scalar::wrapping_add),
+ flush(x.iter().copied().map(flush_in).fold(0 as $scalar, $scalar::wrapping_add)),
);
Ok(())
});
@@ -106,9 +140,11 @@ macro_rules! impl_common_integer_tests {
fn reduce_product<const LANES: usize>() {
test_helpers::test_1(&|x| {
+ use test_helpers::subnormals::{flush, flush_in};
test_helpers::prop_assert_biteq! (
$vector::<LANES>::from_array(x).reduce_product(),
x.iter().copied().fold(1 as $scalar, $scalar::wrapping_mul),
+ flush(x.iter().copied().map(flush_in).fold(1 as $scalar, $scalar::wrapping_mul)),
);
Ok(())
});
@@ -163,6 +199,54 @@ macro_rules! impl_common_integer_tests {
Ok(())
});
}
+
+ fn swap_bytes<const LANES: usize>() {
+ test_helpers::test_unary_elementwise(
+ &$vector::<LANES>::swap_bytes,
+ &$scalar::swap_bytes,
+ &|_| true,
+ )
+ }
+
+ fn reverse_bits<const LANES: usize>() {
+ test_helpers::test_unary_elementwise(
+ &$vector::<LANES>::reverse_bits,
+ &$scalar::reverse_bits,
+ &|_| true,
+ )
+ }
+
+ fn leading_zeros<const LANES: usize>() {
+ test_helpers::test_unary_elementwise(
+ &$vector::<LANES>::leading_zeros,
+ &|x| x.leading_zeros() as _,
+ &|_| true,
+ )
+ }
+
+ fn trailing_zeros<const LANES: usize>() {
+ test_helpers::test_unary_elementwise(
+ &$vector::<LANES>::trailing_zeros,
+ &|x| x.trailing_zeros() as _,
+ &|_| true,
+ )
+ }
+
+ fn leading_ones<const LANES: usize>() {
+ test_helpers::test_unary_elementwise(
+ &$vector::<LANES>::leading_ones,
+ &|x| x.leading_ones() as _,
+ &|_| true,
+ )
+ }
+
+ fn trailing_ones<const LANES: usize>() {
+ test_helpers::test_unary_elementwise(
+ &$vector::<LANES>::trailing_ones,
+ &|x| x.trailing_ones() as _,
+ &|_| true,
+ )
+ }
}
}
}
@@ -172,7 +256,7 @@ macro_rules! impl_common_integer_tests {
macro_rules! impl_signed_tests {
{ $scalar:tt } => {
mod $scalar {
- use core_simd::simd::SimdInt;
+ use core_simd::simd::num::SimdInt;
type Vector<const LANES: usize> = core_simd::simd::Simd<Scalar, LANES>;
type Scalar = $scalar;
@@ -224,7 +308,7 @@ macro_rules! impl_signed_tests {
}
fn simd_min<const LANES: usize>() {
- use core_simd::simd::SimdOrd;
+ use core_simd::simd::cmp::SimdOrd;
let a = Vector::<LANES>::splat(Scalar::MIN);
let b = Vector::<LANES>::splat(0);
assert_eq!(a.simd_min(b), a);
@@ -234,7 +318,7 @@ macro_rules! impl_signed_tests {
}
fn simd_max<const LANES: usize>() {
- use core_simd::simd::SimdOrd;
+ use core_simd::simd::cmp::SimdOrd;
let a = Vector::<LANES>::splat(Scalar::MIN);
let b = Vector::<LANES>::splat(0);
assert_eq!(a.simd_max(b), b);
@@ -244,7 +328,7 @@ macro_rules! impl_signed_tests {
}
fn simd_clamp<const LANES: usize>() {
- use core_simd::simd::SimdOrd;
+ use core_simd::simd::cmp::SimdOrd;
let min = Vector::<LANES>::splat(Scalar::MIN);
let max = Vector::<LANES>::splat(Scalar::MAX);
let zero = Vector::<LANES>::splat(0);
@@ -313,7 +397,7 @@ macro_rules! impl_signed_tests {
macro_rules! impl_unsigned_tests {
{ $scalar:tt } => {
mod $scalar {
- use core_simd::simd::SimdUint;
+ use core_simd::simd::num::SimdUint;
type Vector<const LANES: usize> = core_simd::simd::Simd<Scalar, LANES>;
type Scalar = $scalar;
@@ -327,6 +411,16 @@ macro_rules! impl_unsigned_tests {
}
}
+ test_helpers::test_lanes! {
+ fn wrapping_neg<const LANES: usize>() {
+ test_helpers::test_unary_elementwise(
+ &Vector::<LANES>::wrapping_neg,
+ &Scalar::wrapping_neg,
+ &|_| true,
+ );
+ }
+ }
+
impl_binary_op_test!(Scalar, Add::add, AddAssign::add_assign, Scalar::wrapping_add);
impl_binary_op_test!(Scalar, Sub::sub, SubAssign::sub_assign, Scalar::wrapping_sub);
impl_binary_op_test!(Scalar, Mul::mul, MulAssign::mul_assign, Scalar::wrapping_mul);
@@ -348,7 +442,7 @@ macro_rules! impl_unsigned_tests {
macro_rules! impl_float_tests {
{ $scalar:tt, $int_scalar:tt } => {
mod $scalar {
- use core_simd::simd::SimdFloat;
+ use core_simd::simd::num::SimdFloat;
type Vector<const LANES: usize> = core_simd::simd::Simd<Scalar, LANES>;
type Scalar = $scalar;
@@ -433,7 +527,7 @@ macro_rules! impl_float_tests {
}
fn to_degrees<const LANES: usize>() {
- test_helpers::test_unary_elementwise(
+ test_helpers::test_unary_elementwise_flush_subnormals(
&Vector::<LANES>::to_degrees,
&Scalar::to_degrees,
&|_| true,
@@ -441,7 +535,7 @@ macro_rules! impl_float_tests {
}
fn to_radians<const LANES: usize>() {
- test_helpers::test_unary_elementwise(
+ test_helpers::test_unary_elementwise_flush_subnormals(
&Vector::<LANES>::to_radians,
&Scalar::to_radians,
&|_| true,
@@ -511,7 +605,12 @@ macro_rules! impl_float_tests {
}
fn simd_clamp<const LANES: usize>() {
+ if cfg!(all(target_arch = "powerpc64", target_feature = "vsx")) {
+ // https://gitlab.com/qemu-project/qemu/-/issues/1780
+ return;
+ }
test_helpers::test_3(&|value: [Scalar; LANES], mut min: [Scalar; LANES], mut max: [Scalar; LANES]| {
+ use test_helpers::subnormals::flush_in;
for (min, max) in min.iter_mut().zip(max.iter_mut()) {
if max < min {
core::mem::swap(min, max);
@@ -528,8 +627,20 @@ macro_rules! impl_float_tests {
for i in 0..LANES {
result_scalar[i] = value[i].clamp(min[i], max[i]);
}
+ let mut result_scalar_flush = [Scalar::default(); LANES];
+ for i in 0..LANES {
+ // Comparisons flush-to-zero, but return value selection is _not_ flushed.
+ let mut value = value[i];
+ if flush_in(value) < flush_in(min[i]) {
+ value = min[i];
+ }
+ if flush_in(value) > flush_in(max[i]) {
+ value = max[i];
+ }
+ result_scalar_flush[i] = value
+ }
let result_vector = Vector::from_array(value).simd_clamp(min.into(), max.into()).to_array();
- test_helpers::prop_assert_biteq!(result_scalar, result_vector);
+ test_helpers::prop_assert_biteq!(result_vector, result_scalar, result_scalar_flush);
Ok(())
})
}
diff --git a/library/portable-simd/crates/core_simd/tests/pointers.rs b/library/portable-simd/crates/core_simd/tests/pointers.rs
index 0ae8f83b8..b9f32d16e 100644
--- a/library/portable-simd/crates/core_simd/tests/pointers.rs
+++ b/library/portable-simd/crates/core_simd/tests/pointers.rs
@@ -1,6 +1,9 @@
-#![feature(portable_simd, strict_provenance)]
+#![feature(portable_simd, strict_provenance, exposed_provenance)]
-use core_simd::simd::{Simd, SimdConstPtr, SimdMutPtr};
+use core_simd::simd::{
+ ptr::{SimdConstPtr, SimdMutPtr},
+ Simd,
+};
macro_rules! common_tests {
{ $constness:ident } => {
diff --git a/library/portable-simd/crates/core_simd/tests/round.rs b/library/portable-simd/crates/core_simd/tests/round.rs
index aacf7bd3b..847766ec4 100644
--- a/library/portable-simd/crates/core_simd/tests/round.rs
+++ b/library/portable-simd/crates/core_simd/tests/round.rs
@@ -43,7 +43,7 @@ macro_rules! float_rounding_test {
}
fn fract<const LANES: usize>() {
- test_helpers::test_unary_elementwise(
+ test_helpers::test_unary_elementwise_flush_subnormals(
&Vector::<LANES>::fract,
&Scalar::fract,
&|_| true,
@@ -53,7 +53,7 @@ macro_rules! float_rounding_test {
test_helpers::test_lanes! {
fn to_int_unchecked<const LANES: usize>() {
- use core_simd::simd::SimdFloat;
+ use core_simd::simd::num::SimdFloat;
// The maximum integer that can be represented by the equivalently sized float has
// all of the mantissa digits set to 1, pushed up to the MSB.
const ALL_MANTISSA_BITS: IntScalar = ((1 << <Scalar>::MANTISSA_DIGITS) - 1);
diff --git a/library/portable-simd/crates/core_simd/tests/swizzle.rs b/library/portable-simd/crates/core_simd/tests/swizzle.rs
index 8cd7c33e8..522d71439 100644
--- a/library/portable-simd/crates/core_simd/tests/swizzle.rs
+++ b/library/portable-simd/crates/core_simd/tests/swizzle.rs
@@ -11,10 +11,10 @@ wasm_bindgen_test_configure!(run_in_browser);
#[cfg_attr(target_arch = "wasm32", wasm_bindgen_test)]
fn swizzle() {
struct Index;
- impl Swizzle<4, 4> for Index {
+ impl Swizzle<4> for Index {
const INDEX: [usize; 4] = [2, 1, 3, 0];
}
- impl Swizzle<4, 2> for Index {
+ impl Swizzle<2> for Index {
const INDEX: [usize; 2] = [1, 1];
}
@@ -34,18 +34,18 @@ fn reverse() {
#[cfg_attr(target_arch = "wasm32", wasm_bindgen_test)]
fn rotate() {
let a = Simd::from_array([1, 2, 3, 4]);
- assert_eq!(a.rotate_lanes_left::<0>().to_array(), [1, 2, 3, 4]);
- assert_eq!(a.rotate_lanes_left::<1>().to_array(), [2, 3, 4, 1]);
- assert_eq!(a.rotate_lanes_left::<2>().to_array(), [3, 4, 1, 2]);
- assert_eq!(a.rotate_lanes_left::<3>().to_array(), [4, 1, 2, 3]);
- assert_eq!(a.rotate_lanes_left::<4>().to_array(), [1, 2, 3, 4]);
- assert_eq!(a.rotate_lanes_left::<5>().to_array(), [2, 3, 4, 1]);
- assert_eq!(a.rotate_lanes_right::<0>().to_array(), [1, 2, 3, 4]);
- assert_eq!(a.rotate_lanes_right::<1>().to_array(), [4, 1, 2, 3]);
- assert_eq!(a.rotate_lanes_right::<2>().to_array(), [3, 4, 1, 2]);
- assert_eq!(a.rotate_lanes_right::<3>().to_array(), [2, 3, 4, 1]);
- assert_eq!(a.rotate_lanes_right::<4>().to_array(), [1, 2, 3, 4]);
- assert_eq!(a.rotate_lanes_right::<5>().to_array(), [4, 1, 2, 3]);
+ assert_eq!(a.rotate_elements_left::<0>().to_array(), [1, 2, 3, 4]);
+ assert_eq!(a.rotate_elements_left::<1>().to_array(), [2, 3, 4, 1]);
+ assert_eq!(a.rotate_elements_left::<2>().to_array(), [3, 4, 1, 2]);
+ assert_eq!(a.rotate_elements_left::<3>().to_array(), [4, 1, 2, 3]);
+ assert_eq!(a.rotate_elements_left::<4>().to_array(), [1, 2, 3, 4]);
+ assert_eq!(a.rotate_elements_left::<5>().to_array(), [2, 3, 4, 1]);
+ assert_eq!(a.rotate_elements_right::<0>().to_array(), [1, 2, 3, 4]);
+ assert_eq!(a.rotate_elements_right::<1>().to_array(), [4, 1, 2, 3]);
+ assert_eq!(a.rotate_elements_right::<2>().to_array(), [3, 4, 1, 2]);
+ assert_eq!(a.rotate_elements_right::<3>().to_array(), [2, 3, 4, 1]);
+ assert_eq!(a.rotate_elements_right::<4>().to_array(), [1, 2, 3, 4]);
+ assert_eq!(a.rotate_elements_right::<5>().to_array(), [4, 1, 2, 3]);
}
#[test]
diff --git a/library/portable-simd/crates/core_simd/tests/swizzle_dyn.rs b/library/portable-simd/crates/core_simd/tests/swizzle_dyn.rs
index 646cd5f33..f21a937f0 100644
--- a/library/portable-simd/crates/core_simd/tests/swizzle_dyn.rs
+++ b/library/portable-simd/crates/core_simd/tests/swizzle_dyn.rs
@@ -1,6 +1,5 @@
#![feature(portable_simd)]
use core::{fmt, ops::RangeInclusive};
-use proptest;
use test_helpers::{self, biteq, make_runner, prop_assert_biteq};
fn swizzle_dyn_scalar_ver<const N: usize>(values: [u8; N], idxs: [u8; N]) -> [u8; N] {
diff --git a/library/portable-simd/crates/core_simd/tests/to_bytes.rs b/library/portable-simd/crates/core_simd/tests/to_bytes.rs
index be0ee4349..66a7981cd 100644
--- a/library/portable-simd/crates/core_simd/tests/to_bytes.rs
+++ b/library/portable-simd/crates/core_simd/tests/to_bytes.rs
@@ -1,14 +1,20 @@
-#![feature(portable_simd, generic_const_exprs, adt_const_params)]
-#![allow(incomplete_features)]
-#![cfg(feature = "generic_const_exprs")]
+#![feature(portable_simd)]
-use core_simd::simd::Simd;
+use core_simd::simd::{Simd, ToBytes};
#[test]
fn byte_convert() {
let int = Simd::<u32, 2>::from_array([0xdeadbeef, 0x8badf00d]);
- let bytes = int.to_ne_bytes();
- assert_eq!(int[0].to_ne_bytes(), bytes[..4]);
- assert_eq!(int[1].to_ne_bytes(), bytes[4..]);
- assert_eq!(Simd::<u32, 2>::from_ne_bytes(bytes), int);
+ let ne_bytes = int.to_ne_bytes();
+ let be_bytes = int.to_be_bytes();
+ let le_bytes = int.to_le_bytes();
+ assert_eq!(int[0].to_ne_bytes(), ne_bytes[..4]);
+ assert_eq!(int[1].to_ne_bytes(), ne_bytes[4..]);
+ assert_eq!(int[0].to_be_bytes(), be_bytes[..4]);
+ assert_eq!(int[1].to_be_bytes(), be_bytes[4..]);
+ assert_eq!(int[0].to_le_bytes(), le_bytes[..4]);
+ assert_eq!(int[1].to_le_bytes(), le_bytes[4..]);
+ assert_eq!(Simd::<u32, 2>::from_ne_bytes(ne_bytes), int);
+ assert_eq!(Simd::<u32, 2>::from_be_bytes(be_bytes), int);
+ assert_eq!(Simd::<u32, 2>::from_le_bytes(le_bytes), int);
}