Skip to content

Commit aba9587

Browse files
authored
Convert some SSE2 intrinsics to const generics (#1021)
1 parent 3b52e06 commit aba9587

File tree

5 files changed

+87
-219
lines changed

5 files changed

+87
-219
lines changed

crates/core_arch/src/macros.rs

+16-42
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,21 @@
11
//! Utility macros.
22
3+
// Helper struct used to trigger const eval errors when a const generic immediate value is
4+
// out of range.
5+
pub(crate) struct ValidateConstImm8<const imm8: i32>();
6+
impl<const imm8: i32> ValidateConstImm8<imm8> {
7+
pub(crate) const VALID: () = {
8+
let _ = 1 / ((imm8 >= 0 && imm8 <= 255) as usize);
9+
};
10+
}
11+
12+
#[allow(unused)]
13+
macro_rules! static_assert_imm8 {
14+
($imm:ident) => {
15+
let _ = $crate::core_arch::macros::ValidateConstImm8::<$imm>::VALID;
16+
};
17+
}
18+
319
#[allow(unused)]
420
macro_rules! static_assert {
521
($imm:ident : $ty:ty where $e:expr) => {
@@ -320,48 +336,6 @@ macro_rules! constify_imm5 {
320336
};
321337
}
322338

323-
//immediate value: -16:15
324-
#[allow(unused)]
325-
macro_rules! constify_imm5 {
326-
($imm8:expr, $expand:ident) => {
327-
#[allow(overflowing_literals)]
328-
match ($imm8) & 0b1_1111 {
329-
0 => $expand!(0),
330-
1 => $expand!(1),
331-
2 => $expand!(2),
332-
3 => $expand!(3),
333-
4 => $expand!(4),
334-
5 => $expand!(5),
335-
6 => $expand!(6),
336-
7 => $expand!(7),
337-
8 => $expand!(8),
338-
9 => $expand!(9),
339-
10 => $expand!(10),
340-
11 => $expand!(11),
341-
12 => $expand!(12),
342-
13 => $expand!(13),
343-
14 => $expand!(14),
344-
15 => $expand!(15),
345-
16 => $expand!(16),
346-
17 => $expand!(17),
347-
18 => $expand!(18),
348-
19 => $expand!(19),
349-
20 => $expand!(20),
350-
21 => $expand!(21),
351-
22 => $expand!(22),
352-
23 => $expand!(23),
353-
24 => $expand!(24),
354-
25 => $expand!(25),
355-
26 => $expand!(26),
356-
27 => $expand!(27),
357-
28 => $expand!(28),
358-
29 => $expand!(29),
359-
30 => $expand!(30),
360-
_ => $expand!(31),
361-
}
362-
};
363-
}
364-
365339
//immediate value: 0:16
366340
#[allow(unused)]
367341
macro_rules! constify_imm4 {

crates/core_arch/src/x86/avx512bw.rs

+6-6
Original file line numberDiff line numberDiff line change
@@ -5858,7 +5858,7 @@ pub unsafe fn _mm256_maskz_srai_epi16(k: __mmask16, a: __m256i, imm8: u32) -> __
58585858
pub unsafe fn _mm_mask_srai_epi16(src: __m128i, k: __mmask8, a: __m128i, imm8: u32) -> __m128i {
58595859
macro_rules! call {
58605860
($imm8:expr) => {
5861-
_mm_srai_epi16(a, $imm8)
5861+
_mm_srai_epi16::<$imm8>(a)
58625862
};
58635863
}
58645864
let shf = constify_imm8_sae!(imm8, call);
@@ -5875,7 +5875,7 @@ pub unsafe fn _mm_mask_srai_epi16(src: __m128i, k: __mmask8, a: __m128i, imm8: u
58755875
pub unsafe fn _mm_maskz_srai_epi16(k: __mmask8, a: __m128i, imm8: u32) -> __m128i {
58765876
macro_rules! call {
58775877
($imm8:expr) => {
5878-
_mm_srai_epi16(a, $imm8)
5878+
_mm_srai_epi16::<$imm8>(a)
58795879
};
58805880
}
58815881
let shf = constify_imm8_sae!(imm8, call);
@@ -7414,7 +7414,7 @@ pub unsafe fn _mm_mask_shufflelo_epi16(
74147414
) -> __m128i {
74157415
macro_rules! call {
74167416
($imm8:expr) => {
7417-
_mm_shufflelo_epi16(a, $imm8)
7417+
_mm_shufflelo_epi16::<$imm8>(a)
74187418
};
74197419
}
74207420
let shuffle = constify_imm8_sae!(imm8, call);
@@ -7431,7 +7431,7 @@ pub unsafe fn _mm_mask_shufflelo_epi16(
74317431
pub unsafe fn _mm_maskz_shufflelo_epi16(k: __mmask8, a: __m128i, imm8: i32) -> __m128i {
74327432
macro_rules! call {
74337433
($imm8:expr) => {
7434-
_mm_shufflelo_epi16(a, $imm8)
7434+
_mm_shufflelo_epi16::<$imm8>(a)
74357435
};
74367436
}
74377437
let shuffle = constify_imm8_sae!(imm8, call);
@@ -7592,7 +7592,7 @@ pub unsafe fn _mm_mask_shufflehi_epi16(
75927592
) -> __m128i {
75937593
macro_rules! call {
75947594
($imm8:expr) => {
7595-
_mm_shufflehi_epi16(a, $imm8)
7595+
_mm_shufflehi_epi16::<$imm8>(a)
75967596
};
75977597
}
75987598
let shuffle = constify_imm8_sae!(imm8, call);
@@ -7609,7 +7609,7 @@ pub unsafe fn _mm_mask_shufflehi_epi16(
76097609
pub unsafe fn _mm_maskz_shufflehi_epi16(k: __mmask8, a: __m128i, imm8: i32) -> __m128i {
76107610
macro_rules! call {
76117611
($imm8:expr) => {
7612-
_mm_shufflehi_epi16(a, $imm8)
7612+
_mm_shufflehi_epi16::<$imm8>(a)
76137613
};
76147614
}
76157615
let shuffle = constify_imm8_sae!(imm8, call);

crates/core_arch/src/x86/avx512f.rs

+4-4
Original file line numberDiff line numberDiff line change
@@ -19238,7 +19238,7 @@ pub unsafe fn _mm256_maskz_srai_epi32(k: __mmask8, a: __m256i, imm8: u32) -> __m
1923819238
pub unsafe fn _mm_mask_srai_epi32(src: __m128i, k: __mmask8, a: __m128i, imm8: u32) -> __m128i {
1923919239
macro_rules! call {
1924019240
($imm8:expr) => {
19241-
_mm_srai_epi32(a, $imm8)
19241+
_mm_srai_epi32::<$imm8>(a)
1924219242
};
1924319243
}
1924419244
let shf = constify_imm8_sae!(imm8, call);
@@ -19255,7 +19255,7 @@ pub unsafe fn _mm_mask_srai_epi32(src: __m128i, k: __mmask8, a: __m128i, imm8: u
1925519255
pub unsafe fn _mm_maskz_srai_epi32(k: __mmask8, a: __m128i, imm8: u32) -> __m128i {
1925619256
macro_rules! call {
1925719257
($imm8:expr) => {
19258-
_mm_srai_epi32(a, $imm8)
19258+
_mm_srai_epi32::<$imm8>(a)
1925919259
};
1926019260
}
1926119261
let shf = constify_imm8_sae!(imm8, call);
@@ -22495,7 +22495,7 @@ pub unsafe fn _mm_mask_shuffle_epi32(
2249522495
) -> __m128i {
2249622496
macro_rules! call {
2249722497
($imm8:expr) => {
22498-
_mm_shuffle_epi32(a, $imm8)
22498+
_mm_shuffle_epi32::<$imm8>(a)
2249922499
};
2250022500
}
2250122501
let r = constify_imm8_sae!(imm8, call);
@@ -22512,7 +22512,7 @@ pub unsafe fn _mm_mask_shuffle_epi32(
2251222512
pub unsafe fn _mm_maskz_shuffle_epi32(k: __mmask8, a: __m128i, imm8: _MM_PERM_ENUM) -> __m128i {
2251322513
macro_rules! call {
2251422514
($imm8:expr) => {
22515-
_mm_shuffle_epi32(a, $imm8)
22515+
_mm_shuffle_epi32::<$imm8>(a)
2251622516
};
2251722517
}
2251822518
let r = constify_imm8_sae!(imm8, call);

crates/core_arch/src/x86/sse.rs

+1-1
Original file line numberDiff line numberDiff line change
@@ -1010,7 +1010,7 @@ pub const fn _MM_SHUFFLE(z: u32, y: u32, x: u32, w: u32) -> i32 {
10101010
#[rustc_legacy_const_generics(2)]
10111011
#[stable(feature = "simd_x86", since = "1.27.0")]
10121012
pub unsafe fn _mm_shuffle_ps<const mask: i32>(a: __m128, b: __m128) -> __m128 {
1013-
static_assert!(mask: i32 where mask >= 0 && mask <= 255);
1013+
static_assert_imm8!(mask);
10141014
simd_shuffle4(
10151015
a,
10161016
b,

0 commit comments

Comments
 (0)