Skip to content

Commit 17c527f

Browse files
committed
Stop projecting into SIMD types in ui/simd/ tests
Part of MCP838
1 parent 1c3b035 commit 17c527f

26 files changed

+374
-190
lines changed

tests/ui/simd/generics.rs

Lines changed: 16 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -8,18 +8,30 @@ use std::ops;
88
#[repr(simd)]
99
#[derive(Copy, Clone)]
1010
struct f32x4([f32; 4]);
11+
impl f32x4 {
12+
fn to_array(self) -> [f32; 4] { unsafe { std::mem::transmute(self) } }
13+
}
1114

1215
#[repr(simd)]
1316
#[derive(Copy, Clone)]
1417
struct A<const N: usize>([f32; N]);
18+
impl<const N: usize> A<N> {
19+
fn to_array(self) -> [f32; N] { unsafe { std::intrinsics::transmute_unchecked(self) } }
20+
}
1521

1622
#[repr(simd)]
1723
#[derive(Copy, Clone)]
1824
struct B<T>([T; 4]);
25+
impl<T> B<T> {
26+
fn to_array(self) -> [T; 4] { unsafe { std::intrinsics::transmute_unchecked(self) } }
27+
}
1928

2029
#[repr(simd)]
2130
#[derive(Copy, Clone)]
2231
struct C<T, const N: usize>([T; N]);
32+
impl<T, const N: usize> C<T, N> {
33+
fn to_array(self) -> [T; N] { unsafe { std::intrinsics::transmute_unchecked(self) } }
34+
}
2335

2436
fn add<T: ops::Add<Output = T>>(lhs: T, rhs: T) -> T {
2537
lhs + rhs
@@ -63,18 +75,18 @@ pub fn main() {
6375

6476
// lame-o
6577
let a = f32x4([1.0f32, 2.0f32, 3.0f32, 4.0f32]);
66-
let f32x4([a0, a1, a2, a3]) = add(a, a);
78+
let [a0, a1, a2, a3] = add(a, a).to_array();
6779
assert_eq!(a0, 2.0f32);
6880
assert_eq!(a1, 4.0f32);
6981
assert_eq!(a2, 6.0f32);
7082
assert_eq!(a3, 8.0f32);
7183

7284
let a = A(x);
73-
assert_eq!(add(a, a).0, y);
85+
assert_eq!(add(a, a).to_array(), y);
7486

7587
let b = B(x);
76-
assert_eq!(add(b, b).0, y);
88+
assert_eq!(add(b, b).to_array(), y);
7789

7890
let c = C(x);
79-
assert_eq!(add(c, c).0, y);
91+
assert_eq!(add(c, c).to_array(), y);
8092
}

tests/ui/simd/intrinsic/float-math-pass.rs

Lines changed: 14 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -12,8 +12,11 @@
1212
#![allow(non_camel_case_types)]
1313

1414
#[repr(simd)]
15-
#[derive(Copy, Clone, PartialEq, Debug)]
15+
#[derive(Copy, Clone)]
1616
struct f32x4(pub [f32; 4]);
17+
impl f32x4 {
18+
fn to_array(self) -> [f32; 4] { unsafe { std::mem::transmute(self) } }
19+
}
1720

1821
use std::intrinsics::simd::*;
1922

@@ -25,12 +28,12 @@ macro_rules! assert_approx_eq_f32 {
2528
}
2629
macro_rules! assert_approx_eq {
2730
($a:expr, $b:expr) => {{
28-
let a = $a;
29-
let b = $b;
30-
assert_approx_eq_f32!(a.0[0], b.0[0]);
31-
assert_approx_eq_f32!(a.0[1], b.0[1]);
32-
assert_approx_eq_f32!(a.0[2], b.0[2]);
33-
assert_approx_eq_f32!(a.0[3], b.0[3]);
31+
let a = $a.to_array();
32+
let b = $b.to_array();
33+
assert_approx_eq_f32!(a[0], b[0]);
34+
assert_approx_eq_f32!(a[1], b[1]);
35+
assert_approx_eq_f32!(a[2], b[2]);
36+
assert_approx_eq_f32!(a[3], b[3]);
3437
}};
3538
}
3639

@@ -77,15 +80,15 @@ fn main() {
7780

7881
// rounding functions
7982
let r = simd_floor(h);
80-
assert_eq!(z, r);
83+
assert_eq!(z.to_array(), r.to_array());
8184

8285
let r = simd_ceil(h);
83-
assert_eq!(x, r);
86+
assert_eq!(x.to_array(), r.to_array());
8487

8588
let r = simd_round(h);
86-
assert_eq!(x, r);
89+
assert_eq!(x.to_array(), r.to_array());
8790

8891
let r = simd_trunc(h);
89-
assert_eq!(z, r);
92+
assert_eq!(z.to_array(), r.to_array());
9093
}
9194
}

tests/ui/simd/intrinsic/float-minmax-pass.rs

Lines changed: 20 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -7,11 +7,22 @@
77
#![allow(non_camel_case_types)]
88

99
#[repr(simd)]
10-
#[derive(Copy, Clone, PartialEq, Debug)]
10+
#[derive(Copy, Clone)]
1111
struct f32x4(pub [f32; 4]);
12+
impl f32x4 {
13+
fn to_array(self) -> [f32; 4] { unsafe { std::mem::transmute(self) } }
14+
}
1215

1316
use std::intrinsics::simd::*;
1417

18+
macro_rules! all_eq {
19+
($a: expr, $b: expr) => {{
20+
let a = $a;
21+
let b = $b;
22+
assert_eq!(a.to_array(), b.to_array());
23+
}};
24+
}
25+
1526
fn main() {
1627
let x = f32x4([1.0, 2.0, 3.0, 4.0]);
1728
let y = f32x4([2.0, 1.0, 4.0, 3.0]);
@@ -28,22 +39,22 @@ fn main() {
2839
unsafe {
2940
let min0 = simd_fmin(x, y);
3041
let min1 = simd_fmin(y, x);
31-
assert_eq!(min0, min1);
42+
all_eq!(min0, min1);
3243
let e = f32x4([1.0, 1.0, 3.0, 3.0]);
33-
assert_eq!(min0, e);
44+
all_eq!(min0, e);
3445
let minn = simd_fmin(x, n);
35-
assert_eq!(minn, x);
46+
all_eq!(minn, x);
3647
let minn = simd_fmin(y, n);
37-
assert_eq!(minn, y);
48+
all_eq!(minn, y);
3849

3950
let max0 = simd_fmax(x, y);
4051
let max1 = simd_fmax(y, x);
41-
assert_eq!(max0, max1);
52+
all_eq!(max0, max1);
4253
let e = f32x4([2.0, 2.0, 4.0, 4.0]);
43-
assert_eq!(max0, e);
54+
all_eq!(max0, e);
4455
let maxn = simd_fmax(x, n);
45-
assert_eq!(maxn, x);
56+
all_eq!(maxn, x);
4657
let maxn = simd_fmax(y, n);
47-
assert_eq!(maxn, y);
58+
all_eq!(maxn, y);
4859
}
4960
}

tests/ui/simd/intrinsic/generic-arithmetic-pass.rs

Lines changed: 10 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,20 +5,29 @@
55
#[repr(simd)]
66
#[derive(Copy, Clone)]
77
struct i32x4(pub [i32; 4]);
8+
impl i32x4 {
9+
fn to_array(self) -> [i32; 4] { unsafe { std::mem::transmute(self) } }
10+
}
811

912
#[repr(simd)]
1013
#[derive(Copy, Clone)]
1114
struct U32<const N: usize>([u32; N]);
15+
impl<const N: usize> U32<N> {
16+
fn to_array(self) -> [u32; N] { unsafe { std::intrinsics::transmute_unchecked(self) } }
17+
}
1218

1319
#[repr(simd)]
1420
#[derive(Copy, Clone)]
1521
struct f32x4(pub [f32; 4]);
22+
impl f32x4 {
23+
fn to_array(self) -> [f32; 4] { unsafe { std::mem::transmute(self) } }
24+
}
1625

1726
macro_rules! all_eq {
1827
($a: expr, $b: expr) => {{
1928
let a = $a;
2029
let b = $b;
21-
assert!(a.0 == b.0);
30+
assert!(a.to_array() == b.to_array());
2231
}};
2332
}
2433

tests/ui/simd/intrinsic/generic-arithmetic-saturating-pass.rs

Lines changed: 49 additions & 35 deletions
Original file line numberDiff line numberDiff line change
@@ -7,12 +7,26 @@
77
use std::intrinsics::simd::{simd_saturating_add, simd_saturating_sub};
88

99
#[repr(simd)]
10-
#[derive(Copy, Clone, PartialEq, Debug)]
10+
#[derive(Copy, Clone)]
1111
struct u32x4(pub [u32; 4]);
12+
impl u32x4 {
13+
fn to_array(self) -> [u32; 4] { unsafe { std::mem::transmute(self) } }
14+
}
1215

1316
#[repr(simd)]
1417
#[derive(Copy, Clone)]
1518
struct I32<const N: usize>([i32; N]);
19+
impl<const N: usize> I32<N> {
20+
fn to_array(self) -> [i32; N] { unsafe { std::intrinsics::transmute_unchecked(self) } }
21+
}
22+
23+
macro_rules! all_eq {
24+
($a: expr, $b: expr) => {{
25+
let a = $a;
26+
let b = $b;
27+
assert_eq!(a.to_array(), b.to_array());
28+
}};
29+
}
1630

1731
fn main() {
1832
// unsigned
@@ -26,20 +40,20 @@ fn main() {
2640
let z = u32x4([0, 0, 0, 0]);
2741

2842
unsafe {
29-
assert_eq!(simd_saturating_add(z, z), z);
30-
assert_eq!(simd_saturating_add(z, a), a);
31-
assert_eq!(simd_saturating_add(b, z), b);
32-
assert_eq!(simd_saturating_add(a, a), b);
33-
assert_eq!(simd_saturating_add(a, m), m);
34-
assert_eq!(simd_saturating_add(m, b), m);
35-
assert_eq!(simd_saturating_add(m1, a), m);
43+
all_eq!(simd_saturating_add(z, z), z);
44+
all_eq!(simd_saturating_add(z, a), a);
45+
all_eq!(simd_saturating_add(b, z), b);
46+
all_eq!(simd_saturating_add(a, a), b);
47+
all_eq!(simd_saturating_add(a, m), m);
48+
all_eq!(simd_saturating_add(m, b), m);
49+
all_eq!(simd_saturating_add(m1, a), m);
3650

37-
assert_eq!(simd_saturating_sub(b, z), b);
38-
assert_eq!(simd_saturating_sub(b, a), a);
39-
assert_eq!(simd_saturating_sub(a, a), z);
40-
assert_eq!(simd_saturating_sub(a, b), z);
41-
assert_eq!(simd_saturating_sub(a, m1), z);
42-
assert_eq!(simd_saturating_sub(b, m1), z);
51+
all_eq!(simd_saturating_sub(b, z), b);
52+
all_eq!(simd_saturating_sub(b, a), a);
53+
all_eq!(simd_saturating_sub(a, a), z);
54+
all_eq!(simd_saturating_sub(a, b), z);
55+
all_eq!(simd_saturating_sub(a, m1), z);
56+
all_eq!(simd_saturating_sub(b, m1), z);
4357
}
4458
}
4559

@@ -61,28 +75,28 @@ fn main() {
6175
let z = I32::<4>([0, 0, 0, 0]);
6276

6377
unsafe {
64-
assert_eq!(simd_saturating_add(z, z).0, z.0);
65-
assert_eq!(simd_saturating_add(z, a).0, a.0);
66-
assert_eq!(simd_saturating_add(b, z).0, b.0);
67-
assert_eq!(simd_saturating_add(a, a).0, b.0);
68-
assert_eq!(simd_saturating_add(a, max).0, max.0);
69-
assert_eq!(simd_saturating_add(max, b).0, max.0);
70-
assert_eq!(simd_saturating_add(max1, a).0, max.0);
71-
assert_eq!(simd_saturating_add(min1, z).0, min1.0);
72-
assert_eq!(simd_saturating_add(min, z).0, min.0);
73-
assert_eq!(simd_saturating_add(min1, c).0, min.0);
74-
assert_eq!(simd_saturating_add(min, c).0, min.0);
75-
assert_eq!(simd_saturating_add(min1, d).0, min.0);
76-
assert_eq!(simd_saturating_add(min, d).0, min.0);
78+
all_eq!(simd_saturating_add(z, z), z);
79+
all_eq!(simd_saturating_add(z, a), a);
80+
all_eq!(simd_saturating_add(b, z), b);
81+
all_eq!(simd_saturating_add(a, a), b);
82+
all_eq!(simd_saturating_add(a, max), max);
83+
all_eq!(simd_saturating_add(max, b), max);
84+
all_eq!(simd_saturating_add(max1, a), max);
85+
all_eq!(simd_saturating_add(min1, z), min1);
86+
all_eq!(simd_saturating_add(min, z), min);
87+
all_eq!(simd_saturating_add(min1, c), min);
88+
all_eq!(simd_saturating_add(min, c), min);
89+
all_eq!(simd_saturating_add(min1, d), min);
90+
all_eq!(simd_saturating_add(min, d), min);
7791

78-
assert_eq!(simd_saturating_sub(b, z).0, b.0);
79-
assert_eq!(simd_saturating_sub(b, a).0, a.0);
80-
assert_eq!(simd_saturating_sub(a, a).0, z.0);
81-
assert_eq!(simd_saturating_sub(a, b).0, c.0);
82-
assert_eq!(simd_saturating_sub(z, max).0, min1.0);
83-
assert_eq!(simd_saturating_sub(min1, z).0, min1.0);
84-
assert_eq!(simd_saturating_sub(min1, a).0, min.0);
85-
assert_eq!(simd_saturating_sub(min1, b).0, min.0);
92+
all_eq!(simd_saturating_sub(b, z), b);
93+
all_eq!(simd_saturating_sub(b, a), a);
94+
all_eq!(simd_saturating_sub(a, a), z);
95+
all_eq!(simd_saturating_sub(a, b), c);
96+
all_eq!(simd_saturating_sub(z, max), min1);
97+
all_eq!(simd_saturating_sub(min1, z), min1);
98+
all_eq!(simd_saturating_sub(min1, a), min);
99+
all_eq!(simd_saturating_sub(min1, b), min);
86100
}
87101
}
88102
}

tests/ui/simd/intrinsic/generic-as.rs

Lines changed: 13 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -7,40 +7,43 @@ use std::intrinsics::simd::simd_as;
77
#[derive(Copy, Clone)]
88
#[repr(simd)]
99
struct V<T>([T; 2]);
10+
impl<T> V<T> {
11+
fn to_array(self) -> [T; 2] { unsafe { std::intrinsics::transmute_unchecked(self) } }
12+
}
1013

1114
fn main() {
1215
unsafe {
1316
let u = V::<u32>([u32::MIN, u32::MAX]);
1417
let i: V<i16> = simd_as(u);
15-
assert_eq!(i.0[0], u.0[0] as i16);
16-
assert_eq!(i.0[1], u.0[1] as i16);
18+
assert_eq!(i.to_array()[0], u.to_array()[0] as i16);
19+
assert_eq!(i.to_array()[1], u.to_array()[1] as i16);
1720
}
1821

1922
unsafe {
2023
let f = V::<f32>([f32::MIN, f32::MAX]);
2124
let i: V<i16> = simd_as(f);
22-
assert_eq!(i.0[0], f.0[0] as i16);
23-
assert_eq!(i.0[1], f.0[1] as i16);
25+
assert_eq!(i.to_array()[0], f.to_array()[0] as i16);
26+
assert_eq!(i.to_array()[1], f.to_array()[1] as i16);
2427
}
2528

2629
unsafe {
2730
let f = V::<f32>([f32::MIN, f32::MAX]);
2831
let u: V<u8> = simd_as(f);
29-
assert_eq!(u.0[0], f.0[0] as u8);
30-
assert_eq!(u.0[1], f.0[1] as u8);
32+
assert_eq!(u.to_array()[0], f.to_array()[0] as u8);
33+
assert_eq!(u.to_array()[1], f.to_array()[1] as u8);
3134
}
3235

3336
unsafe {
3437
let f = V::<f64>([f64::MIN, f64::MAX]);
3538
let i: V<isize> = simd_as(f);
36-
assert_eq!(i.0[0], f.0[0] as isize);
37-
assert_eq!(i.0[1], f.0[1] as isize);
39+
assert_eq!(i.to_array()[0], f.to_array()[0] as isize);
40+
assert_eq!(i.to_array()[1], f.to_array()[1] as isize);
3841
}
3942

4043
unsafe {
4144
let f = V::<f64>([f64::MIN, f64::MAX]);
4245
let u: V<usize> = simd_as(f);
43-
assert_eq!(u.0[0], f.0[0] as usize);
44-
assert_eq!(u.0[1], f.0[1] as usize);
46+
assert_eq!(u.to_array()[0], f.to_array()[0] as usize);
47+
assert_eq!(u.to_array()[1], f.to_array()[1] as usize);
4548
}
4649
}

tests/ui/simd/intrinsic/generic-bswap-byte.rs

Lines changed: 8 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -7,14 +7,20 @@ use std::intrinsics::simd::simd_bswap;
77
#[repr(simd)]
88
#[derive(Copy, Clone)]
99
struct i8x4([i8; 4]);
10+
impl i8x4 {
11+
fn to_array(self) -> [i8; 4] { unsafe { std::mem::transmute(self) } }
12+
}
1013

1114
#[repr(simd)]
1215
#[derive(Copy, Clone)]
1316
struct u8x4([u8; 4]);
17+
impl u8x4 {
18+
fn to_array(self) -> [u8; 4] { unsafe { std::mem::transmute(self) } }
19+
}
1420

1521
fn main() {
1622
unsafe {
17-
assert_eq!(simd_bswap(i8x4([0, 1, 2, 3])).0, [0, 1, 2, 3]);
18-
assert_eq!(simd_bswap(u8x4([0, 1, 2, 3])).0, [0, 1, 2, 3]);
23+
assert_eq!(simd_bswap(i8x4([0, 1, 2, 3])).to_array(), [0, 1, 2, 3]);
24+
assert_eq!(simd_bswap(u8x4([0, 1, 2, 3])).to_array(), [0, 1, 2, 3]);
1925
}
2026
}

0 commit comments

Comments
 (0)