1
1
//@run-pass
2
- //@ignore-endian-big behavior of simd_select_bitmask is endian-specific
3
2
#![ feature( repr_simd, intrinsics) ]
4
3
5
4
extern "rust-intrinsic" {
@@ -17,36 +16,100 @@ fn main() {
17
16
let i: u8 = simd_bitmask ( v) ;
18
17
let a: [ u8 ; 1 ] = simd_bitmask ( v) ;
19
18
20
- assert_eq ! ( i, 0b0101 ) ;
21
- assert_eq ! ( a, [ 0b0101 ] ) ;
19
+ if cfg ! ( target_endian = "little" ) {
20
+ assert_eq ! ( i, 0b0101 ) ;
21
+ assert_eq ! ( a, [ 0b0101 ] ) ;
22
+ } else {
23
+ assert_eq ! ( i, 0b1010 ) ;
24
+ assert_eq ! ( a, [ 0b1010 ] ) ;
25
+ }
22
26
23
27
let v = Simd :: < i8 , 16 > ( [ 0 , 0 , -1 , -1 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , -1 , 0 , -1 , 0 ] ) ;
24
28
let i: u16 = simd_bitmask ( v) ;
25
29
let a: [ u8 ; 2 ] = simd_bitmask ( v) ;
26
30
27
- assert_eq ! ( i, 0b0101000000001100 ) ;
28
- assert_eq ! ( a, [ 0b1100 , 0b01010000 ] ) ;
31
+ if cfg ! ( target_endian = "little" ) {
32
+ assert_eq ! ( i, 0b0101000000001100 ) ;
33
+ assert_eq ! ( a, [ 0b00001100 , 0b01010000 ] ) ;
34
+ } else {
35
+ assert_eq ! ( i, 0b0011000000001010 ) ;
36
+ assert_eq ! ( a, [ 0b00110000 , 0b00001010 ] ) ;
37
+ }
29
38
}
30
39
31
40
unsafe {
32
- let a = Simd :: < i32 , 8 > ( [ 0 , 1 , 2 , 3 , 4 , 5 , 6 , 7 ] ) ;
33
- let b = Simd :: < i32 , 8 > ( [ 8 , 9 , 10 , 11 , 12 , 13 , 14 , 15 ] ) ;
34
- let e = [ 0 , 9 , 2 , 11 , 12 , 13 , 14 , 15 ] ;
41
+ let a = Simd :: < i32 , 4 > ( [ 0 , 1 , 2 , 3 ] ) ;
42
+ let b = Simd :: < i32 , 4 > ( [ 8 , 9 , 10 , 11 ] ) ;
43
+ let e = [ 0 , 9 , 2 , 11 ] ;
35
44
36
- let r = simd_select_bitmask ( 0b0101u8 , a, b) ;
45
+ let mask = if cfg ! ( target_endian = "little" ) { 0b0101u8 } else { 0b1010u8 } ;
46
+ let r = simd_select_bitmask ( mask, a, b) ;
37
47
assert_eq ! ( r. 0 , e) ;
38
48
39
- let r = simd_select_bitmask ( [ 0b0101u8 ] , a, b) ;
49
+ let mask = if cfg ! ( target_endian = "little" ) { [ 0b0101u8 ] } else { [ 0b1010u8 ] } ;
50
+ let r = simd_select_bitmask ( mask, a, b) ;
40
51
assert_eq ! ( r. 0 , e) ;
41
52
42
53
let a = Simd :: < i32 , 16 > ( [ 0 , 1 , 2 , 3 , 4 , 5 , 6 , 7 , 8 , 9 , 10 , 11 , 12 , 13 , 14 , 15 ] ) ;
43
54
let b = Simd :: < i32 , 16 > ( [ 16 , 17 , 18 , 19 , 20 , 21 , 22 , 23 , 24 , 25 , 26 , 27 , 28 , 29 , 30 , 31 ] ) ;
44
55
let e = [ 16 , 17 , 2 , 3 , 20 , 21 , 22 , 23 , 24 , 25 , 26 , 27 , 12 , 29 , 14 , 31 ] ;
45
56
46
- let r = simd_select_bitmask ( 0b0101000000001100u16 , a, b) ;
57
+ let mask = if cfg ! ( target_endian = "little" ) {
58
+ 0b0101000000001100u16
59
+ } else {
60
+ 0b0011000000001010u16
61
+ } ;
62
+ let r = simd_select_bitmask ( mask, a, b) ;
47
63
assert_eq ! ( r. 0 , e) ;
48
64
49
- let r = simd_select_bitmask ( [ 0b1100u8 , 0b01010000u8 ] , a, b) ;
65
+ let mask = if cfg ! ( target_endian = "little" ) {
66
+ [ 0b00001100u8 , 0b01010000u8 ]
67
+ } else {
68
+ [ 0b00110000u8 , 0b00001010u8 ]
69
+ } ;
70
+ let r = simd_select_bitmask ( mask, a, b) ;
50
71
assert_eq ! ( r. 0 , e) ;
51
72
}
73
+
74
+ non_pow2 ( ) ;
75
+ }
76
+
77
+ fn non_pow2 ( ) {
78
+ // Non-power-of-2 multi-byte mask.
79
+ #[ repr( simd, packed) ]
80
+ #[ allow( non_camel_case_types) ]
81
+ #[ derive( Copy , Clone , Debug , PartialEq ) ]
82
+ struct i32x10 ( i32 , i32 , i32 , i32 , i32 , i32 , i32 , i32 , i32 , i32 ) ;
83
+ impl i32x10 {
84
+ fn splat ( x : i32 ) -> Self {
85
+ Self ( x, x, x, x, x, x, x, x, x, x)
86
+ }
87
+ fn from_array ( a : [ i32 ; 10 ] ) -> Self {
88
+ unsafe { std:: mem:: transmute ( a) }
89
+ }
90
+ }
91
+ unsafe {
92
+ let mask = i32x10:: from_array ( [ !0 , !0 , 0 , !0 , 0 , 0 , !0 , 0 , !0 , 0 ] ) ;
93
+ let bitmask1: u16 = simd_bitmask ( mask) ;
94
+ let bitmask2: [ u8 ; 2 ] = simd_bitmask ( mask) ;
95
+ if cfg ! ( target_endian = "little" ) {
96
+ assert_eq ! ( bitmask1, 0b0101001011 ) ;
97
+ assert_eq ! ( bitmask2, [ 0b01001011 , 0b01 ] ) ;
98
+ } else {
99
+ assert_eq ! ( bitmask1, 0b1101001010 ) ;
100
+ assert_eq ! ( bitmask2, [ 0b11 , 0b01001010 ] ) ;
101
+ }
102
+ let selected1 = simd_select_bitmask :: < u16 , _ > (
103
+ if cfg ! ( target_endian = "little" ) { 0b0101001011 } else { 0b1101001010 } ,
104
+ i32x10:: splat ( !0 ) , // yes
105
+ i32x10:: splat ( 0 ) , // no
106
+ ) ;
107
+ let selected2 = simd_select_bitmask :: < [ u8 ; 2 ] , _ > (
108
+ if cfg ! ( target_endian = "little" ) { [ 0b01001011 , 0b01 ] } else { [ 0b11 , 0b01001010 ] } ,
109
+ i32x10:: splat ( !0 ) , // yes
110
+ i32x10:: splat ( 0 ) , // no
111
+ ) ;
112
+ assert_eq ! ( selected1, mask) ;
113
+ assert_eq ! ( selected2, selected1) ;
114
+ }
52
115
}
0 commit comments