1
- use crate :: simd:: { LaneCount , Mask , MaskElement , Simd , SimdElement , SupportedLaneCount } ;
1
+ use crate :: simd:: {
2
+ FixEndianness , LaneCount , Mask , MaskElement , Simd , SimdElement , SupportedLaneCount ,
3
+ } ;
2
4
3
5
/// Choose elements from two vectors using a mask.
4
6
///
82
84
assert ! ( N <= 64 , "number of elements can't be greater than 64" ) ;
83
85
}
84
86
85
- // LLVM assumes bit order should match endianness
86
- let bitmask = if cfg ! ( target_endian = "big" ) {
87
- let rev = self . reverse_bits ( ) ;
88
- if N < 64 {
89
- // Shift things back to the right
90
- rev >> ( 64 - N )
91
- } else {
92
- rev
93
- }
94
- } else {
95
- self
96
- } ;
97
-
98
87
#[ inline]
99
- unsafe fn select_impl < T , U , const M : usize , const N : usize > (
88
+ unsafe fn select_impl < T , U : FixEndianness , const M : usize , const N : usize > (
100
89
bitmask : U ,
101
90
true_values : Simd < T , N > ,
102
91
false_values : Simd < T , N > ,
110
99
let true_values = true_values. resize :: < M > ( default) ;
111
100
let false_values = false_values. resize :: < M > ( default) ;
112
101
102
+ // LLVM assumes bit order should match endianness
103
+ let bitmask = bitmask. fix_endianness ( ) ;
104
+
113
105
// Safety: the caller guarantees that the size of U matches M
114
106
let selected = unsafe {
115
107
core:: intrinsics:: simd:: simd_select_bitmask ( bitmask, true_values, false_values)
@@ -120,15 +112,19 @@ where
120
112
121
113
// TODO modify simd_bitmask_select to truncate input, making this unnecessary
122
114
if N <= 8 {
115
+ let bitmask = self as u8 ;
123
116
// Safety: bitmask matches length
124
- unsafe { select_impl :: < T , u8 , 8 , N > ( bitmask as u8 , true_values, false_values) }
117
+ unsafe { select_impl :: < T , u8 , 8 , N > ( bitmask, true_values, false_values) }
125
118
} else if N <= 16 {
119
+ let bitmask = self as u16 ;
126
120
// Safety: bitmask matches length
127
- unsafe { select_impl :: < T , u16 , 16 , N > ( bitmask as u16 , true_values, false_values) }
121
+ unsafe { select_impl :: < T , u16 , 16 , N > ( bitmask, true_values, false_values) }
128
122
} else if N <= 32 {
123
+ let bitmask = self as u32 ;
129
124
// Safety: bitmask matches length
130
- unsafe { select_impl :: < T , u32 , 32 , N > ( bitmask as u32 , true_values, false_values) }
125
+ unsafe { select_impl :: < T , u32 , 32 , N > ( bitmask, true_values, false_values) }
131
126
} else {
127
+ let bitmask = self ;
132
128
// Safety: bitmask matches length
133
129
unsafe { select_impl :: < T , u64 , 64 , N > ( bitmask, true_values, false_values) }
134
130
}
0 commit comments