about summary refs log tree commit diff
path: root/library/stdarch/crates
diff options
context:
space:
mode:
authorNugine <nugine@foxmail.com>2022-11-17 02:15:48 +0800
committerGitHub <noreply@github.com>2022-11-16 18:15:48 +0000
commit83cd38d056c67ec890d1dc45e3d4f8f9f5becb7c (patch)
tree563ed67759c880187fb22cc659fe03d703587674 /library/stdarch/crates
parent75127705cc355ff2183d1301837ac86f4e6191ef (diff)
downloadrust-83cd38d056c67ec890d1dc45e3d4f8f9f5becb7c.tar.gz
rust-83cd38d056c67ec890d1dc45e3d4f8f9f5becb7c.zip
Fix undefined behavior in movemask_epi8 (#1354)
Fixes https://github.com/rust-lang/stdarch/issues/1347
Diffstat (limited to 'library/stdarch/crates')
-rw-r--r--library/stdarch/crates/core_arch/src/x86/avx2.rs4
-rw-r--r--library/stdarch/crates/core_arch/src/x86/sse2.rs4
2 files changed, 6 insertions, 2 deletions
diff --git a/library/stdarch/crates/core_arch/src/x86/avx2.rs b/library/stdarch/crates/core_arch/src/x86/avx2.rs
index 16add3dbb13..4bd87bfd7fd 100644
--- a/library/stdarch/crates/core_arch/src/x86/avx2.rs
+++ b/library/stdarch/crates/core_arch/src/x86/avx2.rs
@@ -2001,7 +2001,9 @@ pub unsafe fn _mm256_min_epu8(a: __m256i, b: __m256i) -> __m256i {
 #[cfg_attr(test, assert_instr(vpmovmskb))]
 #[stable(feature = "simd_x86", since = "1.27.0")]
 pub unsafe fn _mm256_movemask_epi8(a: __m256i) -> i32 {
-    simd_bitmask::<_, u32>(a.as_i8x32()) as i32
+    let z = i8x32::splat(0);
+    let m: i8x32 = simd_lt(a.as_i8x32(), z);
+    simd_bitmask::<_, u32>(m) as i32
 }
 
 /// Computes the sum of absolute differences (SADs) of quadruplets of unsigned
diff --git a/library/stdarch/crates/core_arch/src/x86/sse2.rs b/library/stdarch/crates/core_arch/src/x86/sse2.rs
index b32fb44c031..f3f613219d4 100644
--- a/library/stdarch/crates/core_arch/src/x86/sse2.rs
+++ b/library/stdarch/crates/core_arch/src/x86/sse2.rs
@@ -1378,7 +1378,9 @@ pub unsafe fn _mm_insert_epi16<const IMM8: i32>(a: __m128i, i: i32) -> __m128i {
 #[cfg_attr(test, assert_instr(pmovmskb))]
 #[stable(feature = "simd_x86", since = "1.27.0")]
 pub unsafe fn _mm_movemask_epi8(a: __m128i) -> i32 {
-    simd_bitmask::<_, u16>(a.as_i8x16()) as u32 as i32
+    let z = i8x16::splat(0);
+    let m: i8x16 = simd_lt(a.as_i8x16(), z);
+    simd_bitmask::<_, u16>(m) as u32 as i32
 }
 
 /// Shuffles 32-bit integers in `a` using the control in `IMM8`.