1
1
//run-pass
2
2
#![ feature( repr_simd, platform_intrinsics) ]
3
+ #![ allow( incomplete_features) ]
4
+ #![ feature( adt_const_params) ]
3
5
4
6
extern "platform-intrinsic" {
5
7
fn simd_shuffle < T , I , U > ( a : T , b : T , i : I ) -> U ;
8
+ fn simd_shuffle16 < T , U > ( x : T , y : T , idx : [ u32 ; 16 ] ) -> U ;
6
9
}
7
10
8
11
#[ derive( Copy , Clone ) ]
9
12
#[ repr( simd) ]
10
13
struct Simd < T , const N : usize > ( [ T ; N ] ) ;
11
14
15
+ pub unsafe fn __shuffle_vector16 < const IDX : [ u32 ; 16 ] , T , U > ( x : T , y : T ) -> U {
16
+ simd_shuffle16 ( x, y, IDX )
17
+ }
18
+
12
19
fn main ( ) {
13
20
const I1 : [ u32 ; 4 ] = [ 0 , 2 , 4 , 6 ] ;
14
21
const I2 : [ u32 ; 2 ] = [ 1 , 5 ] ;
@@ -21,4 +28,16 @@ fn main() {
21
28
let y: Simd < u8 , 2 > = simd_shuffle ( a, b, I2 ) ;
22
29
assert_eq ! ( y. 0 , [ 1 , 5 ] ) ;
23
30
}
31
+ // Test that an indirection (via an unnamed constant)
32
+ // through a const generic parameter also works.
33
+ // See https://github.com/rust-lang/rust/issues/113500 for details.
34
+ let a = Simd :: < u8 , 16 > ( [ 0 , 1 , 2 , 3 , 4 , 5 , 6 , 7 , 8 , 9 , 10 , 11 , 12 , 13 , 14 , 15 ] ) ;
35
+ let b = Simd :: < u8 , 16 > ( [ 16 , 17 , 18 , 19 , 20 , 21 , 22 , 23 , 24 , 25 , 26 , 27 , 28 , 29 , 30 , 31 ] ) ;
36
+ unsafe {
37
+ __shuffle_vector16 :: <
38
+ { [ 1 , 2 , 3 , 4 , 5 , 6 , 7 , 8 , 9 , 10 , 11 , 12 , 13 , 14 , 15 , 16 ] } ,
39
+ Simd < u8 , 16 > ,
40
+ Simd < u8 , 16 > ,
41
+ > ( a, b) ;
42
+ }
24
43
}
0 commit comments