1- use crate :: simd:: { LaneCount , Mask , MaskElement , Simd , SimdElement , SupportedLaneCount } ;
1+ use crate :: simd:: {
2+ FixEndianness , LaneCount , Mask , MaskElement , Simd , SimdElement , SupportedLaneCount ,
3+ } ;
24
35/// Choose elements from two vectors using a mask.
46///
8284 assert ! ( N <= 64 , "number of elements can't be greater than 64" ) ;
8385 }
8486
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-
9887 #[ 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 > (
10089 bitmask : U ,
10190 true_values : Simd < T , N > ,
10291 false_values : Simd < T , N > ,
11099 let true_values = true_values. resize :: < M > ( default) ;
111100 let false_values = false_values. resize :: < M > ( default) ;
112101
102+ // LLVM assumes bit order should match endianness
103+ let bitmask = bitmask. fix_endianness ( N ) ;
104+
113105 // Safety: the caller guarantees that the size of U matches M
114106 let selected = unsafe {
115107 core:: intrinsics:: simd:: simd_select_bitmask ( bitmask, true_values, false_values)
@@ -120,15 +112,19 @@ where
120112
121113 // TODO modify simd_bitmask_select to truncate input, making this unnecessary
122114 if N <= 8 {
115+ let bitmask = self as u8 ;
123116 // 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) }
125118 } else if N <= 16 {
119+ let bitmask = self as u16 ;
126120 // 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) }
128122 } else if N <= 32 {
123+ let bitmask = self as u32 ;
129124 // 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) }
131126 } else {
127+ let bitmask = self ;
132128 // Safety: bitmask matches length
133129 unsafe { select_impl :: < T , u64 , 64 , N > ( bitmask, true_values, false_values) }
134130 }
0 commit comments