@@ -2026,8 +2026,12 @@ pub unsafe fn i8x16_all_true(a: v128) -> bool {
2026
2026
#[ cfg_attr( test, assert_instr( i8x16. bitmask) ) ]
2027
2027
#[ target_feature( enable = "simd128" ) ]
2028
2028
#[ doc( alias( "i8x16.bitmask" ) ) ]
2029
- pub unsafe fn i8x16_bitmask ( a : v128 ) -> i32 {
2030
- llvm_bitmask_i8x16 ( transmute ( a) )
2029
+ pub unsafe fn i8x16_bitmask ( a : v128 ) -> u16 {
2030
+ // FIXME(https://bugs.llvm.org/show_bug.cgi?id=50507) - this produces an
2031
+ // extraneous `i32.and` instruction against a mask of 65535 when converting
2032
+ // from the native intrinsic's i32 return value to our desired u16. This
2033
+ // shouldn't be necessary, though, but requires upstream LLVM changes.
2034
+ llvm_bitmask_i8x16 ( transmute ( a) ) as u16
2031
2035
}
2032
2036
2033
2037
/// Converts two input vectors into a smaller lane vector by narrowing each
@@ -2277,8 +2281,8 @@ pub unsafe fn i16x8_all_true(a: v128) -> bool {
2277
2281
#[ cfg_attr( test, assert_instr( i16x8. bitmask) ) ]
2278
2282
#[ target_feature( enable = "simd128" ) ]
2279
2283
#[ doc( alias( "i16x8.bitmask" ) ) ]
2280
- pub unsafe fn i16x8_bitmask ( a : v128 ) -> i32 {
2281
- llvm_bitmask_i16x8 ( transmute ( a) )
2284
+ pub unsafe fn i16x8_bitmask ( a : v128 ) -> u8 {
2285
+ llvm_bitmask_i16x8 ( transmute ( a) ) as u8
2282
2286
}
2283
2287
2284
2288
/// Converts two input vectors into a smaller lane vector by narrowing each
@@ -2633,8 +2637,8 @@ pub unsafe fn i32x4_all_true(a: v128) -> bool {
2633
2637
#[ cfg_attr( test, assert_instr( i32x4. bitmask) ) ]
2634
2638
#[ target_feature( enable = "simd128" ) ]
2635
2639
#[ doc( alias( "i32x4.bitmask" ) ) ]
2636
- pub unsafe fn i32x4_bitmask ( a : v128 ) -> i32 {
2637
- llvm_bitmask_i32x4 ( transmute ( a) )
2640
+ pub unsafe fn i32x4_bitmask ( a : v128 ) -> u8 {
2641
+ llvm_bitmask_i32x4 ( transmute ( a) ) as u8
2638
2642
}
2639
2643
2640
2644
/// Converts low half of the smaller lane vector to a larger lane
@@ -2904,8 +2908,8 @@ pub unsafe fn i64x2_all_true(a: v128) -> bool {
2904
2908
#[ cfg_attr( test, assert_instr( i64x2. bitmask) ) ]
2905
2909
#[ target_feature( enable = "simd128" ) ]
2906
2910
#[ doc( alias( "i64x2.bitmask" ) ) ]
2907
- pub unsafe fn i64x2_bitmask ( a : v128 ) -> i32 {
2908
- llvm_bitmask_i64x2 ( transmute ( a) )
2911
+ pub unsafe fn i64x2_bitmask ( a : v128 ) -> u8 {
2912
+ llvm_bitmask_i64x2 ( transmute ( a) ) as u8
2909
2913
}
2910
2914
2911
2915
/// Converts low half of the smaller lane vector to a larger lane
@@ -3805,27 +3809,27 @@ pub mod tests {
3805
3809
let ones = i8x16_splat ( !0 ) ;
3806
3810
3807
3811
assert_eq ! ( i8x16_bitmask( zero) , 0 ) ;
3808
- assert_eq ! ( i8x16_bitmask( ones) , ( 1 << 16 ) - 1 ) ;
3812
+ assert_eq ! ( i8x16_bitmask( ones) , 0xffff ) ;
3809
3813
assert_eq ! ( i8x16_bitmask( i8x16_splat( i8 :: MAX ) ) , 0 ) ;
3810
- assert_eq ! ( i8x16_bitmask( i8x16_splat( i8 :: MIN ) ) , ( 1 << 16 ) - 1 ) ;
3814
+ assert_eq ! ( i8x16_bitmask( i8x16_splat( i8 :: MIN ) ) , 0xffff ) ;
3811
3815
assert_eq ! ( i8x16_bitmask( i8x16_replace_lane:: <1 >( zero, -1 ) ) , 0b10 ) ;
3812
3816
3813
3817
assert_eq ! ( i16x8_bitmask( zero) , 0 ) ;
3814
- assert_eq ! ( i16x8_bitmask( ones) , ( 1 << 8 ) - 1 ) ;
3818
+ assert_eq ! ( i16x8_bitmask( ones) , 0xff ) ;
3815
3819
assert_eq ! ( i16x8_bitmask( i16x8_splat( i16 :: MAX ) ) , 0 ) ;
3816
- assert_eq ! ( i16x8_bitmask( i16x8_splat( i16 :: MIN ) ) , ( 1 << 8 ) - 1 ) ;
3820
+ assert_eq ! ( i16x8_bitmask( i16x8_splat( i16 :: MIN ) ) , 0xff ) ;
3817
3821
assert_eq ! ( i16x8_bitmask( i16x8_replace_lane:: <1 >( zero, -1 ) ) , 0b10 ) ;
3818
3822
3819
3823
assert_eq ! ( i32x4_bitmask( zero) , 0 ) ;
3820
- assert_eq ! ( i32x4_bitmask( ones) , ( 1 << 4 ) - 1 ) ;
3824
+ assert_eq ! ( i32x4_bitmask( ones) , 0b1111 ) ;
3821
3825
assert_eq ! ( i32x4_bitmask( i32x4_splat( i32 :: MAX ) ) , 0 ) ;
3822
- assert_eq ! ( i32x4_bitmask( i32x4_splat( i32 :: MIN ) ) , ( 1 << 4 ) - 1 ) ;
3826
+ assert_eq ! ( i32x4_bitmask( i32x4_splat( i32 :: MIN ) ) , 0b1111 ) ;
3823
3827
assert_eq ! ( i32x4_bitmask( i32x4_replace_lane:: <1 >( zero, -1 ) ) , 0b10 ) ;
3824
3828
3825
3829
assert_eq ! ( i64x2_bitmask( zero) , 0 ) ;
3826
- assert_eq ! ( i64x2_bitmask( ones) , ( 1 << 2 ) - 1 ) ;
3830
+ assert_eq ! ( i64x2_bitmask( ones) , 0b11 ) ;
3827
3831
assert_eq ! ( i64x2_bitmask( i64x2_splat( i64 :: MAX ) ) , 0 ) ;
3828
- assert_eq ! ( i64x2_bitmask( i64x2_splat( i64 :: MIN ) ) , ( 1 << 2 ) - 1 ) ;
3832
+ assert_eq ! ( i64x2_bitmask( i64x2_splat( i64 :: MIN ) ) , 0b11 ) ;
3829
3833
assert_eq ! ( i64x2_bitmask( i64x2_replace_lane:: <1 >( zero, -1 ) ) , 0b10 ) ;
3830
3834
}
3831
3835
}
0 commit comments