11// run-pass
22#![ allow( non_camel_case_types) ]
3-
43// ignore-emscripten FIXME(#45351) hits an LLVM assert
5-
64#![ feature( repr_simd, platform_intrinsics) ]
75
86#[ repr( simd) ]
@@ -22,18 +20,17 @@ macro_rules! all_eq {
2220 let a = $a;
2321 let b = $b;
2422 assert!( a. 0 == b. 0 && a. 1 == b. 1 && a. 2 == b. 2 && a. 3 == b. 3 ) ;
25- } }
23+ } } ;
2624}
2725
2826macro_rules! all_eq_ {
2927 ( $a: expr, $b: expr) => { {
3028 let a = $a;
3129 let b = $b;
3230 assert!( a. 0 == b. 0 ) ;
33- } }
31+ } } ;
3432}
3533
36-
3734extern "platform-intrinsic" {
3835 fn simd_add < T > ( x : T , y : T ) -> T ;
3936 fn simd_sub < T > ( x : T , y : T ) -> T ;
@@ -47,6 +44,10 @@ extern "platform-intrinsic" {
4744 fn simd_xor < T > ( x : T , y : T ) -> T ;
4845
4946 fn simd_neg < T > ( x : T ) -> T ;
47+ fn simd_bswap < T > ( x : T ) -> T ;
48+ fn simd_bitreverse < T > ( x : T ) -> T ;
49+ fn simd_ctlz < T > ( x : T ) -> T ;
50+ fn simd_cttz < T > ( x : T ) -> T ;
5051}
5152
5253fn main ( ) {
@@ -84,8 +85,8 @@ fn main() {
8485 all_eq_ ! ( simd_div( y1, y1) , U32 :: <4 >( [ 1 , 1 , 1 , 1 ] ) ) ;
8586 all_eq_ ! ( simd_div( U32 :: <4 >( [ 2 , 4 , 6 , 8 ] ) , U32 :: <4 >( [ 2 , 2 , 2 , 2 ] ) ) , y1) ;
8687 all_eq ! ( simd_div( z1, z1) , f32x4( 1.0 , 1.0 , 1.0 , 1.0 ) ) ;
87- all_eq ! ( simd_div( z1, z2) , f32x4( 1.0 / 2.0 , 2.0 / 3.0 , 3.0 / 4.0 , 4.0 / 5.0 ) ) ;
88- all_eq ! ( simd_div( z2, z1) , f32x4( 2.0 / 1.0 , 3.0 / 2.0 , 4.0 / 3.0 , 5.0 / 4.0 ) ) ;
88+ all_eq ! ( simd_div( z1, z2) , f32x4( 1.0 / 2.0 , 2.0 / 3.0 , 3.0 / 4.0 , 4.0 / 5.0 ) ) ;
89+ all_eq ! ( simd_div( z2, z1) , f32x4( 2.0 / 1.0 , 3.0 / 2.0 , 4.0 / 3.0 , 5.0 / 4.0 ) ) ;
8990
9091 all_eq ! ( simd_rem( x1, x1) , i32x4( 0 , 0 , 0 , 0 ) ) ;
9192 all_eq ! ( simd_rem( x2, x1) , i32x4( 0 , 1 , 1 , 1 ) ) ;
@@ -109,8 +110,10 @@ fn main() {
109110 // ensure we get logical vs. arithmetic shifts correct
110111 let ( a, b, c, d) = ( -12 , -123 , -1234 , -12345 ) ;
111112 all_eq ! ( simd_shr( i32x4( a, b, c, d) , x1) , i32x4( a >> 1 , b >> 2 , c >> 3 , d >> 4 ) ) ;
112- all_eq_ ! ( simd_shr( U32 :: <4 >( [ a as u32 , b as u32 , c as u32 , d as u32 ] ) , y1) ,
113- U32 :: <4 >( [ ( a as u32 ) >> 1 , ( b as u32 ) >> 2 , ( c as u32 ) >> 3 , ( d as u32 ) >> 4 ] ) ) ;
113+ all_eq_ ! (
114+ simd_shr( U32 :: <4 >( [ a as u32 , b as u32 , c as u32 , d as u32 ] ) , y1) ,
115+ U32 :: <4 >( [ ( a as u32 ) >> 1 , ( b as u32 ) >> 2 , ( c as u32 ) >> 3 , ( d as u32 ) >> 4 ] )
116+ ) ;
114117
115118 all_eq ! ( simd_and( x1, x2) , i32x4( 0 , 2 , 0 , 4 ) ) ;
116119 all_eq ! ( simd_and( x2, x1) , i32x4( 0 , 2 , 0 , 4 ) ) ;
@@ -132,5 +135,19 @@ fn main() {
132135 all_eq ! ( simd_neg( z1) , f32x4( -1.0 , -2.0 , -3.0 , -4.0 ) ) ;
133136 all_eq ! ( simd_neg( z2) , f32x4( -2.0 , -3.0 , -4.0 , -5.0 ) ) ;
134137
138+ all_eq ! ( simd_bswap( x1) , i32x4( 0x01000000 , 0x02000000 , 0x03000000 , 0x04000000 ) ) ;
139+ all_eq_ ! ( simd_bswap( y1) , U32 :: <4 >( [ 0x01000000 , 0x02000000 , 0x03000000 , 0x04000000 ] ) ) ;
140+
141+ all_eq ! (
142+ simd_bitreverse( x1) ,
143+ i32x4( 0x80000000u32 as i32 , 0x40000000 , 0xc0000000u32 as i32 , 0x20000000 )
144+ ) ;
145+ all_eq_ ! ( simd_bitreverse( y1) , U32 :: <4 >( [ 0x80000000 , 0x40000000 , 0xc0000000 , 0x20000000 ] ) ) ;
146+
147+ all_eq ! ( simd_ctlz( x1) , i32x4( 31 , 30 , 30 , 29 ) ) ;
148+ all_eq_ ! ( simd_ctlz( y1) , U32 :: <4 >( [ 31 , 30 , 30 , 29 ] ) ) ;
149+
150+ all_eq ! ( simd_cttz( x1) , i32x4( 0 , 1 , 0 , 2 ) ) ;
151+ all_eq_ ! ( simd_cttz( y1) , U32 :: <4 >( [ 0 , 1 , 0 , 2 ] ) ) ;
135152 }
136153}
0 commit comments