@@ -2066,7 +2066,10 @@ pub unsafe fn _mm_testnzc_ps(a: __m128, b: __m128) -> i32 {
2066
2066
#[ cfg_attr( test, assert_instr( vmovmskpd) ) ]
2067
2067
#[ stable( feature = "simd_x86" , since = "1.27.0" ) ]
2068
2068
pub 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 ( )
2070
2073
}
2071
2074
2072
2075
/// 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 {
2079
2082
#[ cfg_attr( test, assert_instr( vmovmskps) ) ]
2080
2083
#[ stable( feature = "simd_x86" , since = "1.27.0" ) ]
2081
2084
pub 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 ( )
2083
2089
}
2084
2090
2085
2091
/// Returns vector of type __m256d with all elements set to zero.
0 commit comments