mirror of
https://github.com/rust-lang/rust.git
synced 2026-04-27 18:57:42 +03:00
Merge pull request #2041 from ArunTamil21/add-alias-tests
Add missing runtime tests for SSE alias intrinsics
This commit is contained in:
@@ -2997,66 +2997,87 @@ fn test_mm_ucomineq_ss() {
|
||||
}
|
||||
}
|
||||
|
||||
macro_rules! test_mm_cvtss_si32_impl {
|
||||
($alias:ident) => {
|
||||
let inputs = &[42.0f32, -3.1, 4.0e10, 4.0e-20, NAN, 2147483500.1];
|
||||
let result = &[42i32, -3, i32::MIN, 0, i32::MIN, 2147483520];
|
||||
for i in 0..inputs.len() {
|
||||
let x = _mm_setr_ps(inputs[i], 1.0, 3.0, 4.0);
|
||||
let e = result[i];
|
||||
let r = $alias(x);
|
||||
assert_eq!(e, r, "TestCase #{} f({:?}) = {}, expected: {}", i, x, r, e);
|
||||
}
|
||||
};
|
||||
}
|
||||
|
||||
#[simd_test(enable = "sse")]
|
||||
fn test_mm_cvtss_si32() {
|
||||
let inputs = &[42.0f32, -3.1, 4.0e10, 4.0e-20, NAN, 2147483500.1];
|
||||
let result = &[42i32, -3, i32::MIN, 0, i32::MIN, 2147483520];
|
||||
for i in 0..inputs.len() {
|
||||
let x = _mm_setr_ps(inputs[i], 1.0, 3.0, 4.0);
|
||||
let e = result[i];
|
||||
let r = _mm_cvtss_si32(x);
|
||||
assert_eq!(
|
||||
e, r,
|
||||
"TestCase #{} _mm_cvtss_si32({:?}) = {}, expected: {}",
|
||||
i, x, r, e
|
||||
);
|
||||
}
|
||||
test_mm_cvtss_si32_impl!(_mm_cvtss_si32);
|
||||
}
|
||||
|
||||
#[simd_test(enable = "sse")]
|
||||
fn test_mm_cvt_ss2si() {
|
||||
test_mm_cvtss_si32_impl!(_mm_cvt_ss2si);
|
||||
}
|
||||
|
||||
macro_rules! test_cvttss_si32_impl {
|
||||
($alias:ident) => {
|
||||
let inputs = &[
|
||||
(42.0f32, 42i32),
|
||||
(-31.4, -31),
|
||||
(-33.5, -33),
|
||||
(-34.5, -34),
|
||||
(10.999, 10),
|
||||
(-5.99, -5),
|
||||
(4.0e10, i32::MIN),
|
||||
(4.0e-10, 0),
|
||||
(NAN, i32::MIN),
|
||||
(2147483500.1, 2147483520),
|
||||
];
|
||||
for (i, &(xi, e)) in inputs.iter().enumerate() {
|
||||
let x = _mm_setr_ps(xi, 1.0, 3.0, 4.0);
|
||||
let r = $alias(x);
|
||||
assert_eq!(e, r, "TestCase #{} f({:?}) = {}, expected: {}", i, x, r, e);
|
||||
}
|
||||
};
|
||||
}
|
||||
|
||||
#[simd_test(enable = "sse")]
|
||||
fn test_mm_cvttss_si32() {
|
||||
let inputs = &[
|
||||
(42.0f32, 42i32),
|
||||
(-31.4, -31),
|
||||
(-33.5, -33),
|
||||
(-34.5, -34),
|
||||
(10.999, 10),
|
||||
(-5.99, -5),
|
||||
(4.0e10, i32::MIN),
|
||||
(4.0e-10, 0),
|
||||
(NAN, i32::MIN),
|
||||
(2147483500.1, 2147483520),
|
||||
];
|
||||
for (i, &(xi, e)) in inputs.iter().enumerate() {
|
||||
let x = _mm_setr_ps(xi, 1.0, 3.0, 4.0);
|
||||
let r = _mm_cvttss_si32(x);
|
||||
assert_eq!(
|
||||
e, r,
|
||||
"TestCase #{} _mm_cvttss_si32({:?}) = {}, expected: {}",
|
||||
i, x, r, e
|
||||
);
|
||||
}
|
||||
test_cvttss_si32_impl!(_mm_cvttss_si32);
|
||||
}
|
||||
|
||||
#[simd_test(enable = "sse")]
|
||||
fn test_mm_cvtt_ss2si() {
|
||||
test_cvttss_si32_impl!(_mm_cvtt_ss2si);
|
||||
}
|
||||
|
||||
macro_rules! test_mm_cvtsi32_ss_impl {
|
||||
($alias:ident) => {
|
||||
let a = _mm_setr_ps(5.0, 6.0, 7.0, 8.0);
|
||||
|
||||
let r = $alias(a, 4555);
|
||||
assert_eq_m128(_mm_setr_ps(4555.0, 6.0, 7.0, 8.0), r);
|
||||
|
||||
let r = $alias(a, 322223333);
|
||||
assert_eq_m128(_mm_setr_ps(322223333.0, 6.0, 7.0, 8.0), r);
|
||||
|
||||
let r = $alias(a, -432);
|
||||
assert_eq_m128(_mm_setr_ps(-432.0, 6.0, 7.0, 8.0), r);
|
||||
|
||||
let r = $alias(a, -322223333);
|
||||
assert_eq_m128(_mm_setr_ps(-322223333.0, 6.0, 7.0, 8.0), r);
|
||||
};
|
||||
}
|
||||
|
||||
#[simd_test(enable = "sse")]
|
||||
const fn test_mm_cvtsi32_ss() {
|
||||
let a = _mm_setr_ps(5.0, 6.0, 7.0, 8.0);
|
||||
test_mm_cvtsi32_ss_impl!(_mm_cvtsi32_ss);
|
||||
}
|
||||
|
||||
let r = _mm_cvtsi32_ss(a, 4555);
|
||||
let e = _mm_setr_ps(4555.0, 6.0, 7.0, 8.0);
|
||||
assert_eq_m128(e, r);
|
||||
|
||||
let r = _mm_cvtsi32_ss(a, 322223333);
|
||||
let e = _mm_setr_ps(322223333.0, 6.0, 7.0, 8.0);
|
||||
assert_eq_m128(e, r);
|
||||
|
||||
let r = _mm_cvtsi32_ss(a, -432);
|
||||
let e = _mm_setr_ps(-432.0, 6.0, 7.0, 8.0);
|
||||
assert_eq_m128(e, r);
|
||||
|
||||
let r = _mm_cvtsi32_ss(a, -322223333);
|
||||
let e = _mm_setr_ps(-322223333.0, 6.0, 7.0, 8.0);
|
||||
assert_eq_m128(e, r);
|
||||
#[simd_test(enable = "sse")]
|
||||
fn test_mm_cvt_si2ss() {
|
||||
test_mm_cvtsi32_ss_impl!(_mm_cvt_si2ss);
|
||||
}
|
||||
|
||||
#[simd_test(enable = "sse")]
|
||||
@@ -3071,18 +3092,24 @@ const fn test_mm_set_ss() {
|
||||
assert_eq_m128(r, _mm_setr_ps(4.25, 0.0, 0.0, 0.0));
|
||||
}
|
||||
|
||||
macro_rules! test_mm_set1_ps_impl {
|
||||
($alias:ident) => {
|
||||
let r = $alias(black_box(4.25));
|
||||
assert_eq!(get_m128(r, 0), 4.25);
|
||||
assert_eq!(get_m128(r, 1), 4.25);
|
||||
assert_eq!(get_m128(r, 2), 4.25);
|
||||
assert_eq!(get_m128(r, 3), 4.25);
|
||||
};
|
||||
}
|
||||
|
||||
#[simd_test(enable = "sse")]
|
||||
const fn test_mm_set1_ps() {
|
||||
let r1 = _mm_set1_ps(black_box(4.25));
|
||||
let r2 = _mm_set_ps1(black_box(4.25));
|
||||
assert_eq!(get_m128(r1, 0), 4.25);
|
||||
assert_eq!(get_m128(r1, 1), 4.25);
|
||||
assert_eq!(get_m128(r1, 2), 4.25);
|
||||
assert_eq!(get_m128(r1, 3), 4.25);
|
||||
assert_eq!(get_m128(r2, 0), 4.25);
|
||||
assert_eq!(get_m128(r2, 1), 4.25);
|
||||
assert_eq!(get_m128(r2, 2), 4.25);
|
||||
assert_eq!(get_m128(r2, 3), 4.25);
|
||||
test_mm_set1_ps_impl!(_mm_set1_ps);
|
||||
}
|
||||
|
||||
#[simd_test(enable = "sse")]
|
||||
const fn test_mm_set_ps1() {
|
||||
test_mm_set1_ps_impl!(_mm_set_ps1);
|
||||
}
|
||||
|
||||
#[simd_test(enable = "sse")]
|
||||
@@ -3171,11 +3198,22 @@ const fn test_mm_load_ss() {
|
||||
assert_eq_m128(r, _mm_setr_ps(42.0, 0.0, 0.0, 0.0));
|
||||
}
|
||||
|
||||
macro_rules! test_mm_load1_ps_impl {
|
||||
($alias:ident) => {
|
||||
let a = 42.0f32;
|
||||
let r = unsafe { $alias(ptr::addr_of!(a)) };
|
||||
assert_eq_m128(r, _mm_setr_ps(42.0, 42.0, 42.0, 42.0));
|
||||
};
|
||||
}
|
||||
|
||||
#[simd_test(enable = "sse")]
|
||||
const fn test_mm_load1_ps() {
|
||||
let a = 42.0f32;
|
||||
let r = unsafe { _mm_load1_ps(ptr::addr_of!(a)) };
|
||||
assert_eq_m128(r, _mm_setr_ps(42.0, 42.0, 42.0, 42.0));
|
||||
test_mm_load1_ps_impl!(_mm_load1_ps);
|
||||
}
|
||||
|
||||
#[simd_test(enable = "sse")]
|
||||
const fn test_mm_load_ps1() {
|
||||
test_mm_load1_ps_impl!(_mm_load_ps1);
|
||||
}
|
||||
|
||||
#[simd_test(enable = "sse")]
|
||||
@@ -3227,19 +3265,24 @@ const fn test_mm_store_ss() {
|
||||
assert_eq!(vals[2], 0.0);
|
||||
}
|
||||
|
||||
macro_rules! test_mm_store1_ps_impl {
|
||||
($alias:ident) => {
|
||||
let mut vals = Memory { data: [0.0f32; 4] };
|
||||
let a = _mm_setr_ps(1.0, 2.0, 3.0, 4.0);
|
||||
let p = vals.data.as_mut_ptr();
|
||||
unsafe { $alias(p, *black_box(&a)) };
|
||||
assert_eq!(vals.data, [1.0, 1.0, 1.0, 1.0]);
|
||||
};
|
||||
}
|
||||
|
||||
#[simd_test(enable = "sse")]
|
||||
const fn test_mm_store1_ps() {
|
||||
let mut vals = Memory { data: [0.0f32; 4] };
|
||||
let a = _mm_setr_ps(1.0, 2.0, 3.0, 4.0);
|
||||
test_mm_store1_ps_impl!(_mm_store1_ps);
|
||||
}
|
||||
|
||||
// guaranteed to be aligned to 16 bytes
|
||||
let p = vals.data.as_mut_ptr();
|
||||
|
||||
unsafe {
|
||||
_mm_store1_ps(p, *black_box(&a));
|
||||
}
|
||||
|
||||
assert_eq!(vals.data, [1.0, 1.0, 1.0, 1.0]);
|
||||
#[simd_test(enable = "sse")]
|
||||
const fn test_mm_store_ps1() {
|
||||
test_mm_store1_ps_impl!(_mm_store_ps1);
|
||||
}
|
||||
|
||||
#[simd_test(enable = "sse")]
|
||||
|
||||
@@ -214,7 +214,7 @@ fn verify_all_signatures() {
|
||||
"_m_prefetchrs",
|
||||
// CMPXCHG
|
||||
"cmpxchg16b",
|
||||
// Undefined
|
||||
// Undefined,
|
||||
"_mm_undefined_ps",
|
||||
"_mm_undefined_pd",
|
||||
"_mm_undefined_si128",
|
||||
@@ -250,9 +250,6 @@ fn verify_all_signatures() {
|
||||
"_mm_cvt_ss2si",
|
||||
"_mm_cvtt_ss2si",
|
||||
"_mm_cvt_si2ss",
|
||||
"_mm_set_ps1",
|
||||
"_mm_load_ps1",
|
||||
"_mm_store_ps1",
|
||||
"_mm_bslli_si128",
|
||||
"_mm_bsrli_si128",
|
||||
"_bextr2_u32",
|
||||
|
||||
Reference in New Issue
Block a user