]> git.lizzy.rs Git - rust.git/blob - src/test/ui/simd/simd-intrinsic-generic-select.rs
Merge branch 'master' into feature/incorporate-tracing
[rust.git] / src / test / ui / simd / simd-intrinsic-generic-select.rs
1 // run-pass
2 #![allow(non_camel_case_types)]
3
4 // ignore-emscripten
5 // ignore-endian-big behavior of simd_select_bitmask is endian-specific
6
7 // Test that the simd_select intrinsics produces correct results.
8
9 #![feature(repr_simd, platform_intrinsics)]
10 #[allow(non_camel_case_types)]
11
12 #[repr(simd)]
13 #[derive(Copy, Clone, PartialEq, Debug)]
14 struct i32x4(pub i32, pub i32, pub i32, pub i32);
15
16 #[repr(simd)]
17 #[derive(Copy, Clone, PartialEq, Debug)]
18 struct u32x4(pub u32, pub u32, pub u32, pub u32);
19
20 #[repr(simd)]
21 #[derive(Copy, Clone, PartialEq, Debug)]
22 struct u32x8(u32, u32, u32, u32, u32, u32, u32, u32);
23
24 #[repr(simd)]
25 #[derive(Copy, Clone, PartialEq, Debug)]
26 struct f32x4(pub f32, pub f32, pub f32, pub f32);
27
28 #[repr(simd)]
29 #[derive(Copy, Clone, PartialEq, Debug)]
30 struct b8x4(pub i8, pub i8, pub i8, pub i8);
31
32 extern "platform-intrinsic" {
33     fn simd_select<T, U>(x: T, a: U, b: U) -> U;
34     fn simd_select_bitmask<T, U>(x: T, a: U, b: U) -> U;
35 }
36
37 fn main() {
38     let m0 = b8x4(!0, !0, !0, !0);
39     let m1 = b8x4(0, 0, 0, 0);
40     let m2 = b8x4(!0, !0, 0, 0);
41     let m3 = b8x4(0, 0, !0, !0);
42     let m4 = b8x4(!0, 0, !0, 0);
43
44     unsafe {
45         let a = i32x4(1, -2, 3, 4);
46         let b = i32x4(5, 6, -7, 8);
47
48         let r: i32x4 = simd_select(m0, a, b);
49         let e = a;
50         assert_eq!(r, e);
51
52         let r: i32x4 = simd_select(m1, a, b);
53         let e = b;
54         assert_eq!(r, e);
55
56         let r: i32x4 = simd_select(m2, a, b);
57         let e = i32x4(1, -2, -7, 8);
58         assert_eq!(r, e);
59
60         let r: i32x4 = simd_select(m3, a, b);
61         let e = i32x4(5, 6, 3, 4);
62         assert_eq!(r, e);
63
64         let r: i32x4 = simd_select(m4, a, b);
65         let e = i32x4(1, 6, 3, 8);
66         assert_eq!(r, e);
67     }
68
69     unsafe {
70         let a = u32x4(1, 2, 3, 4);
71         let b = u32x4(5, 6, 7, 8);
72
73         let r: u32x4 = simd_select(m0, a, b);
74         let e = a;
75         assert_eq!(r, e);
76
77         let r: u32x4 = simd_select(m1, a, b);
78         let e = b;
79         assert_eq!(r, e);
80
81         let r: u32x4 = simd_select(m2, a, b);
82         let e = u32x4(1, 2, 7, 8);
83         assert_eq!(r, e);
84
85         let r: u32x4 = simd_select(m3, a, b);
86         let e = u32x4(5, 6, 3, 4);
87         assert_eq!(r, e);
88
89         let r: u32x4 = simd_select(m4, a, b);
90         let e = u32x4(1, 6, 3, 8);
91         assert_eq!(r, e);
92     }
93
94     unsafe {
95         let a = f32x4(1., 2., 3., 4.);
96         let b = f32x4(5., 6., 7., 8.);
97
98         let r: f32x4 = simd_select(m0, a, b);
99         let e = a;
100         assert_eq!(r, e);
101
102         let r: f32x4 = simd_select(m1, a, b);
103         let e = b;
104         assert_eq!(r, e);
105
106         let r: f32x4 = simd_select(m2, a, b);
107         let e = f32x4(1., 2., 7., 8.);
108         assert_eq!(r, e);
109
110         let r: f32x4 = simd_select(m3, a, b);
111         let e = f32x4(5., 6., 3., 4.);
112         assert_eq!(r, e);
113
114         let r: f32x4 = simd_select(m4, a, b);
115         let e = f32x4(1., 6., 3., 8.);
116         assert_eq!(r, e);
117     }
118
119     unsafe {
120         let t = !0 as i8;
121         let f = 0 as i8;
122         let a = b8x4(t, f, t, f);
123         let b = b8x4(f, f, f, t);
124
125         let r: b8x4 = simd_select(m0, a, b);
126         let e = a;
127         assert_eq!(r, e);
128
129         let r: b8x4 = simd_select(m1, a, b);
130         let e = b;
131         assert_eq!(r, e);
132
133         let r: b8x4 = simd_select(m2, a, b);
134         let e = b8x4(t, f, f, t);
135         assert_eq!(r, e);
136
137         let r: b8x4 = simd_select(m3, a, b);
138         let e = b8x4(f, f, t, f);
139         assert_eq!(r, e);
140
141         let r: b8x4 = simd_select(m4, a, b);
142         let e = b8x4(t, f, t, t);
143         assert_eq!(r, e);
144     }
145
146     unsafe {
147         let a = u32x8(0, 1, 2, 3, 4, 5, 6, 7);
148         let b = u32x8(8, 9, 10, 11, 12, 13, 14, 15);
149
150         let r: u32x8 = simd_select_bitmask(0u8, a, b);
151         let e = b;
152         assert_eq!(r, e);
153
154         let r: u32x8 = simd_select_bitmask(0xffu8, a, b);
155         let e = a;
156         assert_eq!(r, e);
157
158         let r: u32x8 = simd_select_bitmask(0b01010101u8, a, b);
159         let e = u32x8(0, 9, 2, 11, 4, 13, 6, 15);
160         assert_eq!(r, e);
161
162         let r: u32x8 = simd_select_bitmask(0b10101010u8, a, b);
163         let e = u32x8(8, 1, 10, 3, 12, 5, 14, 7);
164         assert_eq!(r, e);
165
166         let r: u32x8 = simd_select_bitmask(0b11110000u8, a, b);
167         let e = u32x8(8, 9, 10, 11, 4, 5, 6, 7);
168         assert_eq!(r, e);
169     }
170 }