Skip to content

Commit 25dfd40

Browse files
jethrogbJethro Beekman
and
Jethro Beekman
authored
Re-land mm_extract_epi fix (#898)
This reverts commit 311d56c. Co-authored-by: Jethro Beekman <[email protected]>
1 parent 8bff519 commit 25dfd40

File tree

2 files changed

+18
-10
lines changed

2 files changed

+18
-10
lines changed

crates/core_arch/src/x86/avx2.rs

+18-8
Original file line numberDiff line numberDiff line change
@@ -3743,9 +3743,14 @@ pub unsafe fn _mm256_xor_si256(a: __m256i, b: __m256i) -> __m256i {
37433743
// This intrinsic has no corresponding instruction.
37443744
#[rustc_args_required_const(1)]
37453745
#[stable(feature = "simd_x86", since = "1.27.0")]
3746-
pub unsafe fn _mm256_extract_epi8(a: __m256i, imm8: i32) -> i8 {
3747-
let imm8 = (imm8 & 31) as u32;
3748-
simd_extract(a.as_i8x32(), imm8 as u32)
3746+
pub unsafe fn _mm256_extract_epi8(a: __m256i, imm8: i32) -> i32 {
3747+
let a = a.as_u8x32();
3748+
macro_rules! call {
3749+
($imm5:expr) => {
3750+
simd_extract::<_, u8>(a, $imm5) as i32
3751+
};
3752+
}
3753+
constify_imm5!(imm8, call)
37493754
}
37503755

37513756
/// Extracts a 16-bit integer from `a`, selected with `imm8`. Returns a 32-bit
@@ -3759,9 +3764,14 @@ pub unsafe fn _mm256_extract_epi8(a: __m256i, imm8: i32) -> i8 {
37593764
// This intrinsic has no corresponding instruction.
37603765
#[rustc_args_required_const(1)]
37613766
#[stable(feature = "simd_x86", since = "1.27.0")]
3762-
pub unsafe fn _mm256_extract_epi16(a: __m256i, imm8: i32) -> i16 {
3763-
let imm8 = (imm8 & 15) as u32;
3764-
simd_extract(a.as_i16x16(), imm8)
3767+
pub unsafe fn _mm256_extract_epi16(a: __m256i, imm8: i32) -> i32 {
3768+
let a = a.as_u16x16();
3769+
macro_rules! call {
3770+
($imm4:expr) => {
3771+
simd_extract::<_, u16>(a, $imm4) as i32
3772+
};
3773+
}
3774+
constify_imm4!((imm8 & 15), call)
37653775
}
37663776

37673777
/// Extracts a 32-bit integer from `a`, selected with `imm8`.
@@ -6120,7 +6130,7 @@ mod tests {
61206130
);
61216131
let r1 = _mm256_extract_epi8(a, 0);
61226132
let r2 = _mm256_extract_epi8(a, 35);
6123-
assert_eq!(r1, -1);
6133+
assert_eq!(r1, 0xFF);
61246134
assert_eq!(r2, 3);
61256135
}
61266136

@@ -6133,7 +6143,7 @@ mod tests {
61336143
);
61346144
let r1 = _mm256_extract_epi16(a, 0);
61356145
let r2 = _mm256_extract_epi16(a, 19);
6136-
assert_eq!(r1, -1);
6146+
assert_eq!(r1, 0xFFFF);
61376147
assert_eq!(r2, 3);
61386148
}
61396149

crates/stdarch-verify/tests/x86-intel.rs

-2
Original file line numberDiff line numberDiff line change
@@ -323,8 +323,6 @@ fn verify_all_signatures() {
323323
// take a signed-integer. This breaks `_MM_SHUFFLE` for
324324
// `_mm_shuffle_ps`:
325325
"_mm_shuffle_ps" => continue,
326-
// FIXME(#867)
327-
"_mm256_extract_epi8" | "_mm256_extract_epi16" => continue,
328326
_ => {}
329327
}
330328

0 commit comments

Comments
 (0)