a5789d17bf
Now that we are thoroughly embedded in libcore, we don't need these on by default. Indeed, their presence may provide confusing results during integration attempts.
86 lines
3.3 KiB
Rust
86 lines
3.3 KiB
Rust
#![feature(portable_simd)]
|
|
|
|
macro_rules! float_rounding_test {
|
|
{ $scalar:tt, $int_scalar:tt } => {
|
|
mod $scalar {
|
|
use std_float::StdFloat;
|
|
|
|
type Vector<const LANES: usize> = core_simd::Simd<$scalar, LANES>;
|
|
type Scalar = $scalar;
|
|
type IntScalar = $int_scalar;
|
|
|
|
test_helpers::test_lanes! {
|
|
fn ceil<const LANES: usize>() {
|
|
test_helpers::test_unary_elementwise(
|
|
&Vector::<LANES>::ceil,
|
|
&Scalar::ceil,
|
|
&|_| true,
|
|
)
|
|
}
|
|
|
|
fn floor<const LANES: usize>() {
|
|
test_helpers::test_unary_elementwise(
|
|
&Vector::<LANES>::floor,
|
|
&Scalar::floor,
|
|
&|_| true,
|
|
)
|
|
}
|
|
|
|
fn round<const LANES: usize>() {
|
|
test_helpers::test_unary_elementwise(
|
|
&Vector::<LANES>::round,
|
|
&Scalar::round,
|
|
&|_| true,
|
|
)
|
|
}
|
|
|
|
fn trunc<const LANES: usize>() {
|
|
test_helpers::test_unary_elementwise(
|
|
&Vector::<LANES>::trunc,
|
|
&Scalar::trunc,
|
|
&|_| true,
|
|
)
|
|
}
|
|
|
|
fn fract<const LANES: usize>() {
|
|
test_helpers::test_unary_elementwise(
|
|
&Vector::<LANES>::fract,
|
|
&Scalar::fract,
|
|
&|_| true,
|
|
)
|
|
}
|
|
}
|
|
|
|
test_helpers::test_lanes! {
|
|
fn to_int_unchecked<const LANES: usize>() {
|
|
// 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);
|
|
const MAX_REPRESENTABLE_VALUE: Scalar =
|
|
(ALL_MANTISSA_BITS << (core::mem::size_of::<Scalar>() * 8 - <Scalar>::MANTISSA_DIGITS as usize - 1)) as Scalar;
|
|
|
|
let mut runner = proptest::test_runner::TestRunner::default();
|
|
runner.run(
|
|
&test_helpers::array::UniformArrayStrategy::new(-MAX_REPRESENTABLE_VALUE..MAX_REPRESENTABLE_VALUE),
|
|
|x| {
|
|
let result_1 = unsafe { Vector::from_array(x).to_int_unchecked::<IntScalar>().to_array() };
|
|
let result_2 = {
|
|
let mut result: [IntScalar; LANES] = [0; LANES];
|
|
for (i, o) in x.iter().zip(result.iter_mut()) {
|
|
*o = unsafe { i.to_int_unchecked::<IntScalar>() };
|
|
}
|
|
result
|
|
};
|
|
test_helpers::prop_assert_biteq!(result_1, result_2);
|
|
Ok(())
|
|
},
|
|
).unwrap();
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
float_rounding_test! { f32, i32 }
|
|
float_rounding_test! { f64, i64 }
|