@@ -8,20 +8,17 @@ use crate::{
8
8
#[ cfg( test) ]
9
9
use stdarch_test:: assert_instr;
10
10
11
- /// Extracts an 64-bit integer from `a` selected with `imm8 `
11
+ /// Extracts an 64-bit integer from `a` selected with `IMM1 `
12
12
///
13
13
/// [Intel's documentation](https://software.intel.com/sites/landingpage/IntrinsicsGuide/#text=_mm_extract_epi64)
14
14
#[ inline]
15
15
#[ target_feature( enable = "sse4.1" ) ]
16
- #[ cfg_attr( all( test, not( target_os = "windows" ) ) , assert_instr( pextrq, imm8 = 1 ) ) ]
17
- #[ rustc_args_required_const ( 1 ) ]
16
+ #[ cfg_attr( all( test, not( target_os = "windows" ) ) , assert_instr( pextrq, IMM1 = 1 ) ) ]
17
+ #[ rustc_legacy_const_generics ( 1 ) ]
18
18
#[ stable( feature = "simd_x86" , since = "1.27.0" ) ]
19
- pub unsafe fn _mm_extract_epi64 ( a : __m128i , imm8 : i32 ) -> i64 {
20
- let a = a. as_i64x2 ( ) ;
21
- match imm8 & 1 {
22
- 0 => simd_extract ( a, 0 ) ,
23
- _ => simd_extract ( a, 1 ) ,
24
- }
19
+ pub unsafe fn _mm_extract_epi64 < const IMM1 : i32 > ( a : __m128i ) -> i64 {
20
+ static_assert_imm1 ! ( IMM1 ) ;
21
+ simd_extract ( a. as_i64x2 ( ) , IMM1 as u32 )
25
22
}
26
23
27
24
/// Returns a copy of `a` with the 64-bit integer from `i` inserted at a
@@ -49,10 +46,10 @@ mod tests {
49
46
#[ simd_test( enable = "sse4.1" ) ]
50
47
unsafe fn test_mm_extract_epi64 ( ) {
51
48
let a = _mm_setr_epi64x ( 0 , 1 ) ;
52
- let r = _mm_extract_epi64 ( a, 1 ) ;
53
- assert_eq ! ( r, 1 ) ;
54
- let r = _mm_extract_epi64 ( a, 3 ) ;
49
+ let r = _mm_extract_epi64 :: < 1 > ( a) ;
55
50
assert_eq ! ( r, 1 ) ;
51
+ let r = _mm_extract_epi64 :: < 0 > ( a) ;
52
+ assert_eq ! ( r, 0 ) ;
56
53
}
57
54
58
55
#[ simd_test( enable = "sse4.1" ) ]
0 commit comments