@@ -3743,9 +3743,14 @@ pub unsafe fn _mm256_xor_si256(a: __m256i, b: __m256i) -> __m256i {
3743
3743
// This intrinsic has no corresponding instruction.
3744
3744
#[ rustc_args_required_const( 1 ) ]
3745
3745
#[ 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)
3749
3754
}
3750
3755
3751
3756
/// 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 {
3759
3764
// This intrinsic has no corresponding instruction.
3760
3765
#[ rustc_args_required_const( 1 ) ]
3761
3766
#[ 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)
3765
3775
}
3766
3776
3767
3777
/// Extracts a 32-bit integer from `a`, selected with `imm8`.
@@ -6120,7 +6130,7 @@ mod tests {
6120
6130
) ;
6121
6131
let r1 = _mm256_extract_epi8 ( a, 0 ) ;
6122
6132
let r2 = _mm256_extract_epi8 ( a, 35 ) ;
6123
- assert_eq ! ( r1, - 1 ) ;
6133
+ assert_eq ! ( r1, 0xFF ) ;
6124
6134
assert_eq ! ( r2, 3 ) ;
6125
6135
}
6126
6136
@@ -6133,7 +6143,7 @@ mod tests {
6133
6143
) ;
6134
6144
let r1 = _mm256_extract_epi16 ( a, 0 ) ;
6135
6145
let r2 = _mm256_extract_epi16 ( a, 19 ) ;
6136
- assert_eq ! ( r1, - 1 ) ;
6146
+ assert_eq ! ( r1, 0xFFFF ) ;
6137
6147
assert_eq ! ( r2, 3 ) ;
6138
6148
}
6139
6149
0 commit comments