@@ -383,68 +383,32 @@ pub unsafe fn _mm_blend_epi32<const IMM4: i32>(a: __m128i, b: __m128i) -> __m128
383
383
transmute ( r)
384
384
}
385
385
386
- /// Blends packed 32-bit integers from `a` and `b` using control mask `imm8 `.
386
+ /// Blends packed 32-bit integers from `a` and `b` using control mask `IMM8 `.
387
387
///
388
388
/// [Intel's documentation](https://software.intel.com/sites/landingpage/IntrinsicsGuide/#text=_mm256_blend_epi32)
389
389
#[ inline]
390
390
#[ target_feature( enable = "avx2" ) ]
391
- #[ cfg_attr( test, assert_instr( vblendps, imm8 = 9 ) ) ]
392
- #[ rustc_args_required_const ( 2 ) ]
391
+ #[ cfg_attr( test, assert_instr( vblendps, IMM8 = 9 ) ) ]
392
+ #[ rustc_legacy_const_generics ( 2 ) ]
393
393
#[ stable( feature = "simd_x86" , since = "1.27.0" ) ]
394
- pub unsafe fn _mm256_blend_epi32 ( a : __m256i , b : __m256i , imm8 : i32 ) -> __m256i {
395
- let imm8 = ( imm8 & 0xFF ) as u8 ;
394
+ pub unsafe fn _mm256_blend_epi32 < const IMM8 : i32 > ( a : __m256i , b : __m256i ) -> __m256i {
395
+ static_assert_imm8 ! ( IMM8 ) ;
396
396
let a = a. as_i32x8 ( ) ;
397
397
let b = b. as_i32x8 ( ) ;
398
- macro_rules! blend4 {
399
- (
400
- $a: expr,
401
- $b: expr,
402
- $c: expr,
403
- $d: expr,
404
- $e: expr,
405
- $f: expr,
406
- $g: expr,
407
- $h: expr
408
- ) => {
409
- simd_shuffle8( a, b, [ $a, $b, $c, $d, $e, $f, $g, $h] )
410
- } ;
411
- }
412
- macro_rules! blend3 {
413
- ( $a: expr, $b: expr, $c: expr, $d: expr, $e: expr, $f: expr) => {
414
- match ( imm8 >> 6 ) & 0b11 {
415
- 0b00 => blend4!( $a, $b, $c, $d, $e, $f, 6 , 7 ) ,
416
- 0b01 => blend4!( $a, $b, $c, $d, $e, $f, 14 , 7 ) ,
417
- 0b10 => blend4!( $a, $b, $c, $d, $e, $f, 6 , 15 ) ,
418
- _ => blend4!( $a, $b, $c, $d, $e, $f, 14 , 15 ) ,
419
- }
420
- } ;
421
- }
422
- macro_rules! blend2 {
423
- ( $a: expr, $b: expr, $c: expr, $d: expr) => {
424
- match ( imm8 >> 4 ) & 0b11 {
425
- 0b00 => blend3!( $a, $b, $c, $d, 4 , 5 ) ,
426
- 0b01 => blend3!( $a, $b, $c, $d, 12 , 5 ) ,
427
- 0b10 => blend3!( $a, $b, $c, $d, 4 , 13 ) ,
428
- _ => blend3!( $a, $b, $c, $d, 12 , 13 ) ,
429
- }
430
- } ;
431
- }
432
- macro_rules! blend1 {
433
- ( $a: expr, $b: expr) => {
434
- match ( imm8 >> 2 ) & 0b11 {
435
- 0b00 => blend2!( $a, $b, 2 , 3 ) ,
436
- 0b01 => blend2!( $a, $b, 10 , 3 ) ,
437
- 0b10 => blend2!( $a, $b, 2 , 11 ) ,
438
- _ => blend2!( $a, $b, 10 , 11 ) ,
439
- }
440
- } ;
441
- }
442
- let r: i32x8 = match imm8 & 0b11 {
443
- 0b00 => blend1 ! ( 0 , 1 ) ,
444
- 0b01 => blend1 ! ( 8 , 1 ) ,
445
- 0b10 => blend1 ! ( 0 , 9 ) ,
446
- _ => blend1 ! ( 8 , 9 ) ,
447
- } ;
398
+ let r: i32x8 = simd_shuffle8 (
399
+ a,
400
+ b,
401
+ [
402
+ [ 0 , 8 , 0 , 8 ] [ IMM8 as usize & 0b11 ] ,
403
+ [ 1 , 1 , 9 , 9 ] [ IMM8 as usize & 0b11 ] ,
404
+ [ 2 , 10 , 2 , 10 ] [ ( IMM8 as usize >> 2 ) & 0b11 ] ,
405
+ [ 3 , 3 , 11 , 11 ] [ ( IMM8 as usize >> 2 ) & 0b11 ] ,
406
+ [ 4 , 12 , 4 , 12 ] [ ( IMM8 as usize >> 4 ) & 0b11 ] ,
407
+ [ 5 , 5 , 13 , 13 ] [ ( IMM8 as usize >> 4 ) & 0b11 ] ,
408
+ [ 6 , 14 , 6 , 14 ] [ ( IMM8 as usize >> 6 ) & 0b11 ] ,
409
+ [ 7 , 7 , 15 , 15 ] [ ( IMM8 as usize >> 6 ) & 0b11 ] ,
410
+ ] ,
411
+ ) ;
448
412
transmute ( r)
449
413
}
450
414
@@ -4065,15 +4029,15 @@ mod tests {
4065
4029
unsafe fn test_mm256_blend_epi32 ( ) {
4066
4030
let ( a, b) = ( _mm256_set1_epi32 ( 3 ) , _mm256_set1_epi32 ( 9 ) ) ;
4067
4031
let e = _mm256_setr_epi32 ( 9 , 3 , 3 , 3 , 3 , 3 , 3 , 3 ) ;
4068
- let r = _mm256_blend_epi32 ( a, b, 0x01 as i32 ) ;
4032
+ let r = _mm256_blend_epi32 :: < 0x01 > ( a, b) ;
4069
4033
assert_eq_m256i ( r, e) ;
4070
4034
4071
4035
let e = _mm256_setr_epi32 ( 3 , 9 , 3 , 3 , 3 , 3 , 3 , 9 ) ;
4072
- let r = _mm256_blend_epi32 ( a, b, 0x82 as i32 ) ;
4036
+ let r = _mm256_blend_epi32 :: < 0x82 > ( a, b) ;
4073
4037
assert_eq_m256i ( r, e) ;
4074
4038
4075
4039
let e = _mm256_setr_epi32 ( 3 , 3 , 9 , 9 , 9 , 9 , 9 , 3 ) ;
4076
- let r = _mm256_blend_epi32 ( a, b, 0x7C as i32 ) ;
4040
+ let r = _mm256_blend_epi32 :: < 0x7C > ( a, b) ;
4077
4041
assert_eq_m256i ( r, e) ;
4078
4042
}
4079
4043
0 commit comments