@@ -2066,7 +2066,10 @@ pub unsafe fn _mm_testnzc_ps(a: __m128, b: __m128) -> i32 {
20662066#[ cfg_attr( test, assert_instr( vmovmskpd) ) ]
20672067#[ stable( feature = "simd_x86" , since = "1.27.0" ) ]
20682068pub unsafe fn _mm256_movemask_pd ( a : __m256d ) -> i32 {
2069- simd_bitmask :: < u64x4 , u8 > ( transmute ( a) ) . into ( )
2069+ // Propagate the highest bit to the rest, because simd_bitmask
2070+ // requires all-1 or all-0.
2071+ let mask: i64x4 = simd_lt ( transmute ( a) , i64x4:: splat ( 0 ) ) ;
2072+ simd_bitmask :: < i64x4 , u8 > ( mask) . into ( )
20702073}
20712074
20722075/// Sets each bit of the returned mask based on the most significant bit of the
@@ -2079,7 +2082,10 @@ pub unsafe fn _mm256_movemask_pd(a: __m256d) -> i32 {
20792082#[ cfg_attr( test, assert_instr( vmovmskps) ) ]
20802083#[ stable( feature = "simd_x86" , since = "1.27.0" ) ]
20812084pub unsafe fn _mm256_movemask_ps ( a : __m256 ) -> i32 {
2082- simd_bitmask :: < u32x8 , u8 > ( transmute ( a) ) . into ( )
2085+ // Propagate the highest bit to the rest, because simd_bitmask
2086+ // requires all-1 or all-0.
2087+ let mask: i32x8 = simd_lt ( transmute ( a) , i32x8:: splat ( 0 ) ) ;
2088+ simd_bitmask :: < i32x8 , u8 > ( mask) . into ( )
20832089}
20842090
20852091/// Returns vector of type __m256d with all elements set to zero.
0 commit comments