@@ -412,65 +412,48 @@ pub unsafe fn _mm_subs_epu16(a: __m128i, b: __m128i) -> __m128i {
412
412
#[ inline]
413
413
#[ target_feature( enable = "sse2" ) ]
414
414
#[ cfg_attr( test, assert_instr( pslldq, imm8 = 1 ) ) ]
415
- #[ rustc_args_required_const ( 1 ) ]
415
+ #[ rustc_legacy_const_generics ( 1 ) ]
416
416
#[ stable( feature = "simd_x86" , since = "1.27.0" ) ]
417
- pub unsafe fn _mm_slli_si128 ( a : __m128i , imm8 : i32 ) -> __m128i {
418
- _mm_slli_si128_impl ( a, imm8)
417
+ pub unsafe fn _mm_slli_si128 < const imm8: i32 > ( a : __m128i ) -> __m128i {
418
+ static_assert_imm8 ! ( imm8) ;
419
+ _mm_slli_si128_impl :: < imm8 > ( a)
419
420
}
420
421
421
422
/// Implementation detail: converts the immediate argument of the
422
423
/// `_mm_slli_si128` intrinsic into a compile-time constant.
423
424
#[ inline]
424
425
#[ target_feature( enable = "sse2" ) ]
425
- unsafe fn _mm_slli_si128_impl ( a : __m128i , imm8 : i32 ) -> __m128i {
426
- let ( zero, imm8) = ( _mm_set1_epi8 ( 0 ) . as_i8x16 ( ) , imm8 as u32 ) ;
427
- let a = a. as_i8x16 ( ) ;
428
- macro_rules! shuffle {
429
- ( $shift: expr) => {
430
- simd_shuffle16:: <i8x16, i8x16>(
431
- zero,
432
- a,
433
- [
434
- 16 - $shift,
435
- 17 - $shift,
436
- 18 - $shift,
437
- 19 - $shift,
438
- 20 - $shift,
439
- 21 - $shift,
440
- 22 - $shift,
441
- 23 - $shift,
442
- 24 - $shift,
443
- 25 - $shift,
444
- 26 - $shift,
445
- 27 - $shift,
446
- 28 - $shift,
447
- 29 - $shift,
448
- 30 - $shift,
449
- 31 - $shift,
450
- ] ,
451
- )
452
- } ;
426
+ unsafe fn _mm_slli_si128_impl < const imm8: i32 > ( a : __m128i ) -> __m128i {
427
+ const fn mask ( shift : i32 , i : u32 ) -> u32 {
428
+ if ( shift as u32 ) > 15 {
429
+ i
430
+ } else {
431
+ 16 - ( shift as u32 ) + i
432
+ }
453
433
}
454
- let x = match imm8 {
455
- 0 => shuffle ! ( 0 ) ,
456
- 1 => shuffle ! ( 1 ) ,
457
- 2 => shuffle ! ( 2 ) ,
458
- 3 => shuffle ! ( 3 ) ,
459
- 4 => shuffle ! ( 4 ) ,
460
- 5 => shuffle ! ( 5 ) ,
461
- 6 => shuffle ! ( 6 ) ,
462
- 7 => shuffle ! ( 7 ) ,
463
- 8 => shuffle ! ( 8 ) ,
464
- 9 => shuffle ! ( 9 ) ,
465
- 10 => shuffle ! ( 10 ) ,
466
- 11 => shuffle ! ( 11 ) ,
467
- 12 => shuffle ! ( 12 ) ,
468
- 13 => shuffle ! ( 13 ) ,
469
- 14 => shuffle ! ( 14 ) ,
470
- 15 => shuffle ! ( 15 ) ,
471
- _ => shuffle ! ( 16 ) ,
472
- } ;
473
- transmute ( x)
434
+ let zero = _mm_set1_epi8 ( 0 ) . as_i8x16 ( ) ;
435
+ transmute ( simd_shuffle16 :: < i8x16 , i8x16 > (
436
+ zero,
437
+ a. as_i8x16 ( ) ,
438
+ [
439
+ mask ( imm8, 0 ) ,
440
+ mask ( imm8, 1 ) ,
441
+ mask ( imm8, 2 ) ,
442
+ mask ( imm8, 3 ) ,
443
+ mask ( imm8, 4 ) ,
444
+ mask ( imm8, 5 ) ,
445
+ mask ( imm8, 6 ) ,
446
+ mask ( imm8, 7 ) ,
447
+ mask ( imm8, 8 ) ,
448
+ mask ( imm8, 9 ) ,
449
+ mask ( imm8, 10 ) ,
450
+ mask ( imm8, 11 ) ,
451
+ mask ( imm8, 12 ) ,
452
+ mask ( imm8, 13 ) ,
453
+ mask ( imm8, 14 ) ,
454
+ mask ( imm8, 15 ) ,
455
+ ] ,
456
+ ) )
474
457
}
475
458
476
459
/// Shifts `a` left by `imm8` bytes while shifting in zeros.
@@ -479,10 +462,11 @@ unsafe fn _mm_slli_si128_impl(a: __m128i, imm8: i32) -> __m128i {
479
462
#[ inline]
480
463
#[ target_feature( enable = "sse2" ) ]
481
464
#[ cfg_attr( test, assert_instr( pslldq, imm8 = 1 ) ) ]
482
- #[ rustc_args_required_const ( 1 ) ]
465
+ #[ rustc_legacy_const_generics ( 1 ) ]
483
466
#[ stable( feature = "simd_x86" , since = "1.27.0" ) ]
484
- pub unsafe fn _mm_bslli_si128 ( a : __m128i , imm8 : i32 ) -> __m128i {
485
- _mm_slli_si128_impl ( a, imm8)
467
+ pub unsafe fn _mm_bslli_si128 < const imm8: i32 > ( a : __m128i ) -> __m128i {
468
+ static_assert_imm8 ! ( imm8) ;
469
+ _mm_slli_si128_impl :: < imm8 > ( a)
486
470
}
487
471
488
472
/// Shifts `a` right by `imm8` bytes while shifting in zeros.
@@ -491,10 +475,11 @@ pub unsafe fn _mm_bslli_si128(a: __m128i, imm8: i32) -> __m128i {
491
475
#[ inline]
492
476
#[ target_feature( enable = "sse2" ) ]
493
477
#[ cfg_attr( test, assert_instr( psrldq, imm8 = 1 ) ) ]
494
- #[ rustc_args_required_const ( 1 ) ]
478
+ #[ rustc_legacy_const_generics ( 1 ) ]
495
479
#[ stable( feature = "simd_x86" , since = "1.27.0" ) ]
496
- pub unsafe fn _mm_bsrli_si128 ( a : __m128i , imm8 : i32 ) -> __m128i {
497
- _mm_srli_si128_impl ( a, imm8)
480
+ pub unsafe fn _mm_bsrli_si128 < const imm8: i32 > ( a : __m128i ) -> __m128i {
481
+ static_assert_imm8 ! ( imm8) ;
482
+ _mm_srli_si128_impl :: < imm8 > ( a)
498
483
}
499
484
500
485
/// Shifts packed 16-bit integers in `a` left by `imm8` while shifting in zeros.
@@ -630,64 +615,48 @@ pub unsafe fn _mm_sra_epi32(a: __m128i, count: __m128i) -> __m128i {
630
615
#[ inline]
631
616
#[ target_feature( enable = "sse2" ) ]
632
617
#[ cfg_attr( test, assert_instr( psrldq, imm8 = 1 ) ) ]
633
- #[ rustc_args_required_const ( 1 ) ]
618
+ #[ rustc_legacy_const_generics ( 1 ) ]
634
619
#[ stable( feature = "simd_x86" , since = "1.27.0" ) ]
635
- pub unsafe fn _mm_srli_si128 ( a : __m128i , imm8 : i32 ) -> __m128i {
636
- _mm_srli_si128_impl ( a, imm8)
620
+ pub unsafe fn _mm_srli_si128 < const imm8: i32 > ( a : __m128i ) -> __m128i {
621
+ static_assert_imm8 ! ( imm8) ;
622
+ _mm_srli_si128_impl :: < imm8 > ( a)
637
623
}
638
624
639
625
/// Implementation detail: converts the immediate argument of the
640
626
/// `_mm_srli_si128` intrinsic into a compile-time constant.
641
627
#[ inline]
642
628
#[ target_feature( enable = "sse2" ) ]
643
- unsafe fn _mm_srli_si128_impl ( a : __m128i , imm8 : i32 ) -> __m128i {
644
- let ( zero, imm8) = ( _mm_set1_epi8 ( 0 ) . as_i8x16 ( ) , imm8 as u32 ) ;
645
- let a = a. as_i8x16 ( ) ;
646
- macro_rules! shuffle {
647
- ( $shift: expr) => {
648
- simd_shuffle16(
649
- a,
650
- zero,
651
- [
652
- 0 + $shift,
653
- 1 + $shift,
654
- 2 + $shift,
655
- 3 + $shift,
656
- 4 + $shift,
657
- 5 + $shift,
658
- 6 + $shift,
659
- 7 + $shift,
660
- 8 + $shift,
661
- 9 + $shift,
662
- 10 + $shift,
663
- 11 + $shift,
664
- 12 + $shift,
665
- 13 + $shift,
666
- 14 + $shift,
667
- 15 + $shift,
668
- ] ,
669
- )
670
- } ;
629
+ unsafe fn _mm_srli_si128_impl < const imm8: i32 > ( a : __m128i ) -> __m128i {
630
+ const fn mask ( shift : i32 , i : u32 ) -> u32 {
631
+ if ( shift as u32 ) > 15 {
632
+ i + 16
633
+ } else {
634
+ i + ( shift as u32 )
635
+ }
671
636
}
672
- let x: i8x16 = match imm8 {
673
- 0 => shuffle ! ( 0 ) ,
674
- 1 => shuffle ! ( 1 ) ,
675
- 2 => shuffle ! ( 2 ) ,
676
- 3 => shuffle ! ( 3 ) ,
677
- 4 => shuffle ! ( 4 ) ,
678
- 5 => shuffle ! ( 5 ) ,
679
- 6 => shuffle ! ( 6 ) ,
680
- 7 => shuffle ! ( 7 ) ,
681
- 8 => shuffle ! ( 8 ) ,
682
- 9 => shuffle ! ( 9 ) ,
683
- 10 => shuffle ! ( 10 ) ,
684
- 11 => shuffle ! ( 11 ) ,
685
- 12 => shuffle ! ( 12 ) ,
686
- 13 => shuffle ! ( 13 ) ,
687
- 14 => shuffle ! ( 14 ) ,
688
- 15 => shuffle ! ( 15 ) ,
689
- _ => shuffle ! ( 16 ) ,
690
- } ;
637
+ let zero = _mm_set1_epi8 ( 0 ) . as_i8x16 ( ) ;
638
+ let x: i8x16 = simd_shuffle16 (
639
+ a. as_i8x16 ( ) ,
640
+ zero,
641
+ [
642
+ mask ( imm8, 0 ) ,
643
+ mask ( imm8, 1 ) ,
644
+ mask ( imm8, 2 ) ,
645
+ mask ( imm8, 3 ) ,
646
+ mask ( imm8, 4 ) ,
647
+ mask ( imm8, 5 ) ,
648
+ mask ( imm8, 6 ) ,
649
+ mask ( imm8, 7 ) ,
650
+ mask ( imm8, 8 ) ,
651
+ mask ( imm8, 9 ) ,
652
+ mask ( imm8, 10 ) ,
653
+ mask ( imm8, 11 ) ,
654
+ mask ( imm8, 12 ) ,
655
+ mask ( imm8, 13 ) ,
656
+ mask ( imm8, 14 ) ,
657
+ mask ( imm8, 15 ) ,
658
+ ] ,
659
+ ) ;
691
660
transmute ( x)
692
661
}
693
662
@@ -3375,37 +3344,23 @@ mod tests {
3375
3344
let a = _mm_setr_epi8 (
3376
3345
1 , 2 , 3 , 4 , 5 , 6 , 7 , 8 , 9 , 10 , 11 , 12 , 13 , 14 , 15 , 16 ,
3377
3346
) ;
3378
- let r = _mm_slli_si128 ( a , 1 ) ;
3347
+ let r = _mm_slli_si128 :: < 1 > ( a ) ;
3379
3348
let e = _mm_setr_epi8 ( 0 , 1 , 2 , 3 , 4 , 5 , 6 , 7 , 8 , 9 , 10 , 11 , 12 , 13 , 14 , 15 ) ;
3380
3349
assert_eq_m128i ( r, e) ;
3381
3350
3382
3351
#[ rustfmt:: skip]
3383
3352
let a = _mm_setr_epi8 (
3384
3353
1 , 2 , 3 , 4 , 5 , 6 , 7 , 8 , 9 , 10 , 11 , 12 , 13 , 14 , 15 , 16 ,
3385
3354
) ;
3386
- let r = _mm_slli_si128 ( a , 15 ) ;
3355
+ let r = _mm_slli_si128 :: < 15 > ( a ) ;
3387
3356
let e = _mm_setr_epi8 ( 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 1 ) ;
3388
3357
assert_eq_m128i ( r, e) ;
3389
3358
3390
3359
#[ rustfmt:: skip]
3391
3360
let a = _mm_setr_epi8 (
3392
3361
1 , 2 , 3 , 4 , 5 , 6 , 7 , 8 , 9 , 10 , 11 , 12 , 13 , 14 , 15 , 16 ,
3393
3362
) ;
3394
- let r = _mm_slli_si128 ( a, 16 ) ;
3395
- assert_eq_m128i ( r, _mm_set1_epi8 ( 0 ) ) ;
3396
-
3397
- #[ rustfmt:: skip]
3398
- let a = _mm_setr_epi8 (
3399
- 1 , 2 , 3 , 4 , 5 , 6 , 7 , 8 , 9 , 10 , 11 , 12 , 13 , 14 , 15 , 16 ,
3400
- ) ;
3401
- let r = _mm_slli_si128 ( a, -1 ) ;
3402
- assert_eq_m128i ( _mm_set1_epi8 ( 0 ) , r) ;
3403
-
3404
- #[ rustfmt:: skip]
3405
- let a = _mm_setr_epi8 (
3406
- 1 , 2 , 3 , 4 , 5 , 6 , 7 , 8 , 9 , 10 , 11 , 12 , 13 , 14 , 15 , 16 ,
3407
- ) ;
3408
- let r = _mm_slli_si128 ( a, -0x80000000 ) ;
3363
+ let r = _mm_slli_si128 :: < 16 > ( a) ;
3409
3364
assert_eq_m128i ( r, _mm_set1_epi8 ( 0 ) ) ;
3410
3365
}
3411
3366
@@ -3496,7 +3451,7 @@ mod tests {
3496
3451
let a = _mm_setr_epi8 (
3497
3452
1 , 2 , 3 , 4 , 5 , 6 , 7 , 8 , 9 , 10 , 11 , 12 , 13 , 14 , 15 , 16 ,
3498
3453
) ;
3499
- let r = _mm_srli_si128 ( a , 1 ) ;
3454
+ let r = _mm_srli_si128 :: < 1 > ( a ) ;
3500
3455
#[ rustfmt:: skip]
3501
3456
let e = _mm_setr_epi8 (
3502
3457
2 , 3 , 4 , 5 , 6 , 7 , 8 , 9 , 10 , 11 , 12 , 13 , 14 , 15 , 16 , 0 ,
@@ -3507,29 +3462,15 @@ mod tests {
3507
3462
let a = _mm_setr_epi8 (
3508
3463
1 , 2 , 3 , 4 , 5 , 6 , 7 , 8 , 9 , 10 , 11 , 12 , 13 , 14 , 15 , 16 ,
3509
3464
) ;
3510
- let r = _mm_srli_si128 ( a , 15 ) ;
3465
+ let r = _mm_srli_si128 :: < 15 > ( a ) ;
3511
3466
let e = _mm_setr_epi8 ( 16 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 ) ;
3512
3467
assert_eq_m128i ( r, e) ;
3513
3468
3514
3469
#[ rustfmt:: skip]
3515
3470
let a = _mm_setr_epi8 (
3516
3471
1 , 2 , 3 , 4 , 5 , 6 , 7 , 8 , 9 , 10 , 11 , 12 , 13 , 14 , 15 , 16 ,
3517
3472
) ;
3518
- let r = _mm_srli_si128 ( a, 16 ) ;
3519
- assert_eq_m128i ( r, _mm_set1_epi8 ( 0 ) ) ;
3520
-
3521
- #[ rustfmt:: skip]
3522
- let a = _mm_setr_epi8 (
3523
- 1 , 2 , 3 , 4 , 5 , 6 , 7 , 8 , 9 , 10 , 11 , 12 , 13 , 14 , 15 , 16 ,
3524
- ) ;
3525
- let r = _mm_srli_si128 ( a, -1 ) ;
3526
- assert_eq_m128i ( r, _mm_set1_epi8 ( 0 ) ) ;
3527
-
3528
- #[ rustfmt:: skip]
3529
- let a = _mm_setr_epi8 (
3530
- 1 , 2 , 3 , 4 , 5 , 6 , 7 , 8 , 9 , 10 , 11 , 12 , 13 , 14 , 15 , 16 ,
3531
- ) ;
3532
- let r = _mm_srli_si128 ( a, -0x80000000 ) ;
3473
+ let r = _mm_srli_si128 :: < 16 > ( a) ;
3533
3474
assert_eq_m128i ( r, _mm_set1_epi8 ( 0 ) ) ;
3534
3475
}
3535
3476
0 commit comments