]> git.proxmox.com Git - rustc.git/blob - src/test/ui/simd/simd-intrinsic-generic-select.rs
New upstream version 1.49.0~beta.4+dfsg1
[rustc.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
171 unsafe {
172 let a = u32x4(0, 1, 2, 3);
173 let b = u32x4(4, 5, 6, 7);
174
175 let r: u32x4 = simd_select_bitmask(0u8, a, b);
176 let e = b;
177 assert_eq!(r, e);
178
179 let r: u32x4 = simd_select_bitmask(0xfu8, a, b);
180 let e = a;
181 assert_eq!(r, e);
182
183 let r: u32x4 = simd_select_bitmask(0b0101u8, a, b);
184 let e = u32x4(0, 5, 2, 7);
185 assert_eq!(r, e);
186
187 let r: u32x4 = simd_select_bitmask(0b1010u8, a, b);
188 let e = u32x4(4, 1, 6, 3);
189 assert_eq!(r, e);
190
191 let r: u32x4 = simd_select_bitmask(0b1100u8, a, b);
192 let e = u32x4(4, 5, 2, 3);
193 assert_eq!(r, e);
194 }
195 }