]> git.lizzy.rs Git - rust.git/blob - src/test/ui/simd/monomorphize-shuffle-index.rs
Auto merge of #101679 - compiler-errors:rpitit-default-body, r=nikomatsakis
[rust.git] / src / test / ui / simd / monomorphize-shuffle-index.rs
1 //run-pass
2 #![feature(repr_simd, platform_intrinsics)]
3
4 extern "platform-intrinsic" {
5     fn simd_shuffle<T, I, U>(a: T, b: T, i: I) -> U;
6 }
7
8 #[derive(Copy, Clone)]
9 #[repr(simd)]
10 struct Simd<T, const N: usize>([T; N]);
11
12 trait Shuffle<const N: usize> {
13     const I: [u32; N];
14
15     unsafe fn shuffle<T, const M: usize>(&self, a: Simd<T, M>, b: Simd<T, M>) -> Simd<T, N> {
16         simd_shuffle(a, b, Self::I)
17     }
18 }
19
20 fn main() {
21     struct I1;
22     impl Shuffle<4> for I1 {
23         const I: [u32; 4] = [0, 2, 4, 6];
24     }
25
26     struct I2;
27     impl Shuffle<2> for I2 {
28         const I: [u32; 2] = [1, 5];
29     }
30
31     let a = Simd::<u8, 4>([0, 1, 2, 3]);
32     let b = Simd::<u8, 4>([4, 5, 6, 7]);
33     unsafe {
34         let x: Simd<u8, 4> = I1.shuffle(a, b);
35         assert_eq!(x.0, [0, 2, 4, 6]);
36
37         let y: Simd<u8, 2> = I2.shuffle(a, b);
38         assert_eq!(y.0, [1, 5]);
39     }
40 }