@@ -86,71 +86,55 @@ pub unsafe fn _mm_shuffle_epi8(a: __m128i, b: __m128i) -> __m128i {
86
86
/// [Intel's documentation](https://software.intel.com/sites/landingpage/IntrinsicsGuide/#text=_mm_alignr_epi8)
87
87
#[ inline]
88
88
#[ target_feature( enable = "ssse3" ) ]
89
- #[ cfg_attr( test, assert_instr( palignr, n = 15 ) ) ]
90
- #[ rustc_args_required_const ( 2 ) ]
89
+ #[ cfg_attr( test, assert_instr( palignr, IMM8 = 15 ) ) ]
90
+ #[ rustc_legacy_const_generics ( 2 ) ]
91
91
#[ stable( feature = "simd_x86" , since = "1.27.0" ) ]
92
- pub unsafe fn _mm_alignr_epi8 ( a : __m128i , b : __m128i , n : i32 ) -> __m128i {
93
- let n = n as u32 ;
92
+ pub unsafe fn _mm_alignr_epi8 < const IMM8 : i32 > ( a : __m128i , b : __m128i ) -> __m128i {
93
+ static_assert_imm8 ! ( IMM8 ) ;
94
94
// If palignr is shifting the pair of vectors more than the size of two
95
95
// lanes, emit zero.
96
- if n > 32 {
96
+ if IMM8 > 32 {
97
97
return _mm_set1_epi8 ( 0 ) ;
98
98
}
99
99
// If palignr is shifting the pair of input vectors more than one lane,
100
100
// but less than two lanes, convert to shifting in zeroes.
101
- let ( a, b, n ) = if n > 16 {
102
- ( _mm_set1_epi8 ( 0 ) , a, n - 16 )
101
+ let ( a, b) = if IMM8 > 16 {
102
+ ( _mm_set1_epi8 ( 0 ) , a)
103
103
} else {
104
- ( a, b, n )
104
+ ( a, b)
105
105
} ;
106
- let a = a. as_i8x16 ( ) ;
107
- let b = b. as_i8x16 ( ) ;
108
-
109
- macro_rules! shuffle {
110
- ( $shift: expr) => {
111
- simd_shuffle16(
112
- b,
113
- a,
114
- [
115
- 0 + $shift,
116
- 1 + $shift,
117
- 2 + $shift,
118
- 3 + $shift,
119
- 4 + $shift,
120
- 5 + $shift,
121
- 6 + $shift,
122
- 7 + $shift,
123
- 8 + $shift,
124
- 9 + $shift,
125
- 10 + $shift,
126
- 11 + $shift,
127
- 12 + $shift,
128
- 13 + $shift,
129
- 14 + $shift,
130
- 15 + $shift,
131
- ] ,
132
- )
133
- } ;
106
+ const fn mask ( shift : u32 , i : u32 ) -> u32 {
107
+ if shift > 32 {
108
+ // Unused, but needs to be a valid index.
109
+ i
110
+ } else if shift > 16 {
111
+ shift - 16 + i
112
+ } else {
113
+ shift + i
114
+ }
134
115
}
135
- let r: i8x16 = match n {
136
- 0 => shuffle ! ( 0 ) ,
137
- 1 => shuffle ! ( 1 ) ,
138
- 2 => shuffle ! ( 2 ) ,
139
- 3 => shuffle ! ( 3 ) ,
140
- 4 => shuffle ! ( 4 ) ,
141
- 5 => shuffle ! ( 5 ) ,
142
- 6 => shuffle ! ( 6 ) ,
143
- 7 => shuffle ! ( 7 ) ,
144
- 8 => shuffle ! ( 8 ) ,
145
- 9 => shuffle ! ( 9 ) ,
146
- 10 => shuffle ! ( 10 ) ,
147
- 11 => shuffle ! ( 11 ) ,
148
- 12 => shuffle ! ( 12 ) ,
149
- 13 => shuffle ! ( 13 ) ,
150
- 14 => shuffle ! ( 14 ) ,
151
- 15 => shuffle ! ( 15 ) ,
152
- _ => shuffle ! ( 16 ) ,
153
- } ;
116
+ let r: i8x16 = simd_shuffle16 (
117
+ b. as_i8x16 ( ) ,
118
+ a. as_i8x16 ( ) ,
119
+ [
120
+ mask ( IMM8 as u32 , 0 ) ,
121
+ mask ( IMM8 as u32 , 1 ) ,
122
+ mask ( IMM8 as u32 , 2 ) ,
123
+ mask ( IMM8 as u32 , 3 ) ,
124
+ mask ( IMM8 as u32 , 4 ) ,
125
+ mask ( IMM8 as u32 , 5 ) ,
126
+ mask ( IMM8 as u32 , 6 ) ,
127
+ mask ( IMM8 as u32 , 7 ) ,
128
+ mask ( IMM8 as u32 , 8 ) ,
129
+ mask ( IMM8 as u32 , 9 ) ,
130
+ mask ( IMM8 as u32 , 10 ) ,
131
+ mask ( IMM8 as u32 , 11 ) ,
132
+ mask ( IMM8 as u32 , 12 ) ,
133
+ mask ( IMM8 as u32 , 13 ) ,
134
+ mask ( IMM8 as u32 , 14 ) ,
135
+ mask ( IMM8 as u32 , 15 ) ,
136
+ ] ,
137
+ ) ;
154
138
transmute ( r)
155
139
}
156
140
@@ -404,29 +388,29 @@ mod tests {
404
388
12 , 5 , 5 , 10 ,
405
389
4 , 1 , 8 , 0 ,
406
390
) ;
407
- let r = _mm_alignr_epi8 ( a, b, 33 ) ;
391
+ let r = _mm_alignr_epi8 :: < 33 > ( a, b) ;
408
392
assert_eq_m128i ( r, _mm_set1_epi8 ( 0 ) ) ;
409
393
410
- let r = _mm_alignr_epi8 ( a, b, 17 ) ;
394
+ let r = _mm_alignr_epi8 :: < 17 > ( a, b) ;
411
395
#[ rustfmt:: skip]
412
396
let expected = _mm_setr_epi8 (
413
397
2 , 3 , 4 , 5 , 6 , 7 , 8 , 9 ,
414
398
10 , 11 , 12 , 13 , 14 , 15 , 16 , 0 ,
415
399
) ;
416
400
assert_eq_m128i ( r, expected) ;
417
401
418
- let r = _mm_alignr_epi8 ( a, b, 16 ) ;
402
+ let r = _mm_alignr_epi8 :: < 16 > ( a, b) ;
419
403
assert_eq_m128i ( r, a) ;
420
404
421
- let r = _mm_alignr_epi8 ( a, b, 15 ) ;
405
+ let r = _mm_alignr_epi8 :: < 15 > ( a, b) ;
422
406
#[ rustfmt:: skip]
423
407
let expected = _mm_setr_epi8 (
424
408
0 , 1 , 2 , 3 , 4 , 5 , 6 , 7 ,
425
409
8 , 9 , 10 , 11 , 12 , 13 , 14 , 15 ,
426
410
) ;
427
411
assert_eq_m128i ( r, expected) ;
428
412
429
- let r = _mm_alignr_epi8 ( a, b, 0 ) ;
413
+ let r = _mm_alignr_epi8 :: < 0 > ( a, b) ;
430
414
assert_eq_m128i ( r, b) ;
431
415
}
432
416
0 commit comments