@@ -2125,6 +2125,15 @@ pub unsafe fn i64x2_mul(a: v128, b: v128) -> v128 {
2125
2125
transmute ( simd_mul ( a. as_i64x2 ( ) , b. as_i64x2 ( ) ) )
2126
2126
}
2127
2127
2128
+ /// Extracts the high bit for each lane in `a` and produce a scalar mask with
2129
+ /// all bits concatenated.
2130
+ #[ inline]
2131
+ #[ cfg_attr( test, assert_instr( i64x2. bitmask) ) ]
2132
+ #[ target_feature( enable = "simd128" ) ]
2133
+ pub unsafe fn i64x2_bitmask ( a : v128 ) -> i32 {
2134
+ llvm_bitmask_i64x2 ( transmute ( a) )
2135
+ }
2136
+
2128
2137
/// Calculates the absolute value of each lane of a 128-bit vector interpreted
2129
2138
/// as four 32-bit floating point numbers.
2130
2139
#[ inline]
@@ -2806,6 +2815,46 @@ pub mod tests {
2806
2815
}
2807
2816
}
2808
2817
2818
+ #[ test]
2819
+ fn test_bitmask_ops ( ) {
2820
+ unsafe {
2821
+ let a: [ u32 ; 4 ] = [ u32:: MAX , 0 , u32:: MAX , 0 ] ;
2822
+ let b: [ u32 ; 4 ] = [ u32:: MAX ; 4 ] ;
2823
+ let c: [ u32 ; 4 ] = [ 0 ; 4 ] ;
2824
+
2825
+ let vec_a: v128 = transmute ( a) ;
2826
+ let vec_b: v128 = transmute ( b) ;
2827
+ let vec_c: v128 = transmute ( c) ;
2828
+
2829
+ let r: i32 = i8x16_bitmask ( vec_a) ;
2830
+ assert_eq ! ( r, 0b1111000011110000 ) ;
2831
+ let r: i32 = i16x8_bitmask ( vec_a) ;
2832
+ assert_eq ! ( r, 0b11001100 ) ;
2833
+ let r: i32 = i32x4_bitmask ( vec_a) ;
2834
+ assert_eq ! ( r, 0b1010 ) ;
2835
+ let r: i32 = i64x2_bitmask ( vec_a) ;
2836
+ assert_eq ! ( r, 0b11 ) ;
2837
+
2838
+ let r: i32 = i8x16_bitmask ( vec_b) ;
2839
+ assert_eq ! ( r, 0xFFFF ) ;
2840
+ let r: i32 = i16x8_bitmask ( vec_b) ;
2841
+ assert_eq ! ( r, 0xFF ) ;
2842
+ let r: i32 = i32x4_bitmask ( vec_b) ;
2843
+ assert_eq ! ( r, 0xF ) ;
2844
+ let r: i32 = i64x2_bitmask ( vec_b) ;
2845
+ assert_eq ! ( r, 0b11 ) ;
2846
+
2847
+ let r: i32 = i8x16_bitmask ( vec_c) ;
2848
+ assert_eq ! ( r, 0 ) ;
2849
+ let r: i32 = i16x8_bitmask ( vec_c) ;
2850
+ assert_eq ! ( r, 0 ) ;
2851
+ let r: i32 = i32x4_bitmask ( vec_c) ;
2852
+ assert_eq ! ( r, 0 ) ;
2853
+ let r: i32 = i64x2_bitmask ( vec_c) ;
2854
+ assert_eq ! ( r, 0 ) ;
2855
+ }
2856
+ }
2857
+
2809
2858
macro_rules! test_bool_red {
2810
2859
( [ $test_id: ident, $any: ident, $all: ident] | [ $( $true: expr) ,* ] | [ $( $false: expr) ,* ] | [ $( $alt: expr) ,* ] ) => {
2811
2860
#[ test]
0 commit comments