1
1
// run-pass
2
2
#![ allow( non_camel_case_types) ]
3
-
4
3
// ignore-emscripten FIXME(#45351) hits an LLVM assert
5
-
6
4
#![ feature( repr_simd, platform_intrinsics) ]
7
5
8
6
#[ repr( simd) ]
@@ -22,18 +20,17 @@ macro_rules! all_eq {
22
20
let a = $a;
23
21
let b = $b;
24
22
assert!( a. 0 == b. 0 && a. 1 == b. 1 && a. 2 == b. 2 && a. 3 == b. 3 ) ;
25
- } }
23
+ } } ;
26
24
}
27
25
28
26
macro_rules! all_eq_ {
29
27
( $a: expr, $b: expr) => { {
30
28
let a = $a;
31
29
let b = $b;
32
30
assert!( a. 0 == b. 0 ) ;
33
- } }
31
+ } } ;
34
32
}
35
33
36
-
37
34
extern "platform-intrinsic" {
38
35
fn simd_add < T > ( x : T , y : T ) -> T ;
39
36
fn simd_sub < T > ( x : T , y : T ) -> T ;
@@ -47,6 +44,10 @@ extern "platform-intrinsic" {
47
44
fn simd_xor < T > ( x : T , y : T ) -> T ;
48
45
49
46
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 ;
50
51
}
51
52
52
53
fn main ( ) {
@@ -84,8 +85,8 @@ fn main() {
84
85
all_eq_ ! ( simd_div( y1, y1) , U32 :: <4 >( [ 1 , 1 , 1 , 1 ] ) ) ;
85
86
all_eq_ ! ( simd_div( U32 :: <4 >( [ 2 , 4 , 6 , 8 ] ) , U32 :: <4 >( [ 2 , 2 , 2 , 2 ] ) ) , y1) ;
86
87
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 ) ) ;
89
90
90
91
all_eq ! ( simd_rem( x1, x1) , i32x4( 0 , 0 , 0 , 0 ) ) ;
91
92
all_eq ! ( simd_rem( x2, x1) , i32x4( 0 , 1 , 1 , 1 ) ) ;
@@ -109,8 +110,10 @@ fn main() {
109
110
// ensure we get logical vs. arithmetic shifts correct
110
111
let ( a, b, c, d) = ( -12 , -123 , -1234 , -12345 ) ;
111
112
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
+ ) ;
114
117
115
118
all_eq ! ( simd_and( x1, x2) , i32x4( 0 , 2 , 0 , 4 ) ) ;
116
119
all_eq ! ( simd_and( x2, x1) , i32x4( 0 , 2 , 0 , 4 ) ) ;
@@ -132,5 +135,19 @@ fn main() {
132
135
all_eq ! ( simd_neg( z1) , f32x4( -1.0 , -2.0 , -3.0 , -4.0 ) ) ;
133
136
all_eq ! ( simd_neg( z2) , f32x4( -2.0 , -3.0 , -4.0 , -5.0 ) ) ;
134
137
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 ] ) ) ;
135
152
}
136
153
}
0 commit comments