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