Skip to content

Commit 728d475

Browse files
Update shuffle API for const generics
1 parent 34d0488 commit 728d475

File tree

3 files changed

+90
-68
lines changed

3 files changed

+90
-68
lines changed

src/api/shuffle.rs

Lines changed: 22 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -75,20 +75,18 @@ macro_rules! shuffle {
7575
($vec0:expr, $vec1:expr, [$l0:expr, $l1:expr]) => {{
7676
#[allow(unused_unsafe)]
7777
unsafe {
78-
$crate::Simd($crate::__shuffle_vector2(
78+
$crate::Simd($crate::__shuffle_vector2::<{[$l0, $l1]}, _, _>(
7979
$vec0.0,
8080
$vec1.0,
81-
[$l0, $l1],
8281
))
8382
}
8483
}};
8584
($vec0:expr, $vec1:expr, [$l0:expr, $l1:expr, $l2:expr, $l3:expr]) => {{
8685
#[allow(unused_unsafe)]
8786
unsafe {
88-
$crate::Simd($crate::__shuffle_vector4(
87+
$crate::Simd($crate::__shuffle_vector4::<{[$l0, $l1, $l2, $l3]}, _, _>(
8988
$vec0.0,
9089
$vec1.0,
91-
[$l0, $l1, $l2, $l3],
9290
))
9391
}
9492
}};
@@ -97,10 +95,9 @@ macro_rules! shuffle {
9795
$l4:expr, $l5:expr, $l6:expr, $l7:expr]) => {{
9896
#[allow(unused_unsafe)]
9997
unsafe {
100-
$crate::Simd($crate::__shuffle_vector8(
98+
$crate::Simd($crate::__shuffle_vector8::<{[$l0, $l1, $l2, $l3, $l4, $l5, $l6, $l7]}, _, _>(
10199
$vec0.0,
102100
$vec1.0,
103-
[$l0, $l1, $l2, $l3, $l4, $l5, $l6, $l7],
104101
))
105102
}
106103
}};
@@ -111,13 +108,14 @@ macro_rules! shuffle {
111108
$l12:expr, $l13:expr, $l14:expr, $l15:expr]) => {{
112109
#[allow(unused_unsafe)]
113110
unsafe {
114-
$crate::Simd($crate::__shuffle_vector16(
115-
$vec0.0,
116-
$vec1.0,
111+
$crate::Simd($crate::__shuffle_vector16::<{
117112
[
118113
$l0, $l1, $l2, $l3, $l4, $l5, $l6, $l7, $l8, $l9, $l10,
119114
$l11, $l12, $l13, $l14, $l15,
120-
],
115+
]
116+
}, _, _>(
117+
$vec0.0,
118+
$vec1.0,
121119
))
122120
}
123121
}};
@@ -132,15 +130,16 @@ macro_rules! shuffle {
132130
$l28:expr, $l29:expr, $l30:expr, $l31:expr]) => {{
133131
#[allow(unused_unsafe)]
134132
unsafe {
135-
$crate::Simd($crate::__shuffle_vector32(
136-
$vec0.0,
137-
$vec1.0,
133+
$crate::Simd($crate::__shuffle_vector32::<{
138134
[
139135
$l0, $l1, $l2, $l3, $l4, $l5, $l6, $l7, $l8, $l9, $l10,
140136
$l11, $l12, $l13, $l14, $l15, $l16, $l17, $l18, $l19,
141137
$l20, $l21, $l22, $l23, $l24, $l25, $l26, $l27, $l28,
142138
$l29, $l30, $l31,
143-
],
139+
]
140+
}, _, _>(
141+
$vec0.0,
142+
$vec1.0,
144143
))
145144
}
146145
}};
@@ -163,18 +162,17 @@ macro_rules! shuffle {
163162
$l60:expr, $l61:expr, $l62:expr, $l63:expr]) => {{
164163
#[allow(unused_unsafe)]
165164
unsafe {
166-
$crate::Simd($crate::__shuffle_vector64(
165+
$crate::Simd($crate::__shuffle_vector64::<{[
166+
$l0, $l1, $l2, $l3, $l4, $l5, $l6, $l7, $l8, $l9, $l10,
167+
$l11, $l12, $l13, $l14, $l15, $l16, $l17, $l18, $l19,
168+
$l20, $l21, $l22, $l23, $l24, $l25, $l26, $l27, $l28,
169+
$l29, $l30, $l31, $l32, $l33, $l34, $l35, $l36, $l37,
170+
$l38, $l39, $l40, $l41, $l42, $l43, $l44, $l45, $l46,
171+
$l47, $l48, $l49, $l50, $l51, $l52, $l53, $l54, $l55,
172+
$l56, $l57, $l58, $l59, $l60, $l61, $l62, $l63,
173+
]}, _, _>(
167174
$vec0.0,
168175
$vec1.0,
169-
[
170-
$l0, $l1, $l2, $l3, $l4, $l5, $l6, $l7, $l8, $l9, $l10,
171-
$l11, $l12, $l13, $l14, $l15, $l16, $l17, $l18, $l19,
172-
$l20, $l21, $l22, $l23, $l24, $l25, $l26, $l27, $l28,
173-
$l29, $l30, $l31, $l32, $l33, $l34, $l35, $l36, $l37,
174-
$l38, $l39, $l40, $l41, $l42, $l43, $l44, $l45, $l46,
175-
$l47, $l48, $l49, $l50, $l51, $l52, $l53, $l54, $l55,
176-
$l56, $l57, $l58, $l59, $l60, $l61, $l62, $l63,
177-
],
178176
))
179177
}
180178
}};

src/codegen/llvm.rs

Lines changed: 65 additions & 44 deletions
Original file line numberDiff line numberDiff line change
@@ -7,52 +7,73 @@ use crate::sealed::Simd;
77

88
// Shuffle intrinsics: expanded in users' crates, therefore public.
99
extern "platform-intrinsic" {
10-
// FIXME: Passing this intrinsics an `idx` array with an index that is
11-
// out-of-bounds will produce a monomorphization-time error.
12-
// https://github.com/rust-lang-nursery/packed_simd/issues/21
13-
#[rustc_args_required_const(2)]
14-
pub fn simd_shuffle2<T, U>(x: T, y: T, idx: [u32; 2]) -> U
15-
where
16-
T: Simd,
17-
<T as Simd>::Element: Shuffle<[u32; 2], Output = U>;
18-
19-
#[rustc_args_required_const(2)]
20-
pub fn simd_shuffle4<T, U>(x: T, y: T, idx: [u32; 4]) -> U
21-
where
22-
T: Simd,
23-
<T as Simd>::Element: Shuffle<[u32; 4], Output = U>;
24-
25-
#[rustc_args_required_const(2)]
26-
pub fn simd_shuffle8<T, U>(x: T, y: T, idx: [u32; 8]) -> U
27-
where
28-
T: Simd,
29-
<T as Simd>::Element: Shuffle<[u32; 8], Output = U>;
30-
31-
#[rustc_args_required_const(2)]
32-
pub fn simd_shuffle16<T, U>(x: T, y: T, idx: [u32; 16]) -> U
33-
where
34-
T: Simd,
35-
<T as Simd>::Element: Shuffle<[u32; 16], Output = U>;
36-
37-
#[rustc_args_required_const(2)]
38-
pub fn simd_shuffle32<T, U>(x: T, y: T, idx: [u32; 32]) -> U
39-
where
40-
T: Simd,
41-
<T as Simd>::Element: Shuffle<[u32; 32], Output = U>;
42-
43-
#[rustc_args_required_const(2)]
44-
pub fn simd_shuffle64<T, U>(x: T, y: T, idx: [u32; 64]) -> U
45-
where
46-
T: Simd,
47-
<T as Simd>::Element: Shuffle<[u32; 64], Output = U>;
10+
pub fn simd_shuffle2<T, U>(x: T, y: T, idx: [u32; 2]) -> U;
11+
pub fn simd_shuffle4<T, U>(x: T, y: T, idx: [u32; 4]) -> U;
12+
pub fn simd_shuffle8<T, U>(x: T, y: T, idx: [u32; 8]) -> U;
13+
pub fn simd_shuffle16<T, U>(x: T, y: T, idx: [u32; 16]) -> U;
14+
pub fn simd_shuffle32<T, U>(x: T, y: T, idx: [u32; 32]) -> U;
15+
pub fn simd_shuffle64<T, U>(x: T, y: T, idx: [u32; 64]) -> U;
4816
}
4917

50-
pub use self::simd_shuffle16 as __shuffle_vector16;
51-
pub use self::simd_shuffle2 as __shuffle_vector2;
52-
pub use self::simd_shuffle32 as __shuffle_vector32;
53-
pub use self::simd_shuffle4 as __shuffle_vector4;
54-
pub use self::simd_shuffle64 as __shuffle_vector64;
55-
pub use self::simd_shuffle8 as __shuffle_vector8;
18+
#[allow(clippy::missing_safety_doc)]
19+
#[inline]
20+
pub unsafe fn __shuffle_vector2<const IDX: [u32; 2], T, U>(x: T, y: T) -> U
21+
where
22+
T: Simd,
23+
<T as Simd>::Element: Shuffle<[u32; 2], Output = U>,
24+
{
25+
simd_shuffle2(x, y, IDX)
26+
}
27+
28+
#[allow(clippy::missing_safety_doc)]
29+
#[inline]
30+
pub unsafe fn __shuffle_vector4<const IDX: [u32; 4], T, U>(x: T, y: T) -> U
31+
where
32+
T: Simd,
33+
<T as Simd>::Element: Shuffle<[u32; 4], Output = U>,
34+
{
35+
simd_shuffle4(x, y, IDX)
36+
}
37+
38+
#[allow(clippy::missing_safety_doc)]
39+
#[inline]
40+
pub unsafe fn __shuffle_vector8<const IDX: [u32; 8], T, U>(x: T, y: T) -> U
41+
where
42+
T: Simd,
43+
<T as Simd>::Element: Shuffle<[u32; 8], Output = U>,
44+
{
45+
simd_shuffle8(x, y, IDX)
46+
}
47+
48+
#[allow(clippy::missing_safety_doc)]
49+
#[inline]
50+
pub unsafe fn __shuffle_vector16<const IDX: [u32; 16], T, U>(x: T, y: T) -> U
51+
where
52+
T: Simd,
53+
<T as Simd>::Element: Shuffle<[u32; 16], Output = U>,
54+
{
55+
simd_shuffle16(x, y, IDX)
56+
}
57+
58+
#[allow(clippy::missing_safety_doc)]
59+
#[inline]
60+
pub unsafe fn __shuffle_vector32<const IDX: [u32; 32], T, U>(x: T, y: T) -> U
61+
where
62+
T: Simd,
63+
<T as Simd>::Element: Shuffle<[u32; 32], Output = U>,
64+
{
65+
simd_shuffle32(x, y, IDX)
66+
}
67+
68+
#[allow(clippy::missing_safety_doc)]
69+
#[inline]
70+
pub unsafe fn __shuffle_vector64<const IDX: [u32; 64], T, U>(x: T, y: T) -> U
71+
where
72+
T: Simd,
73+
<T as Simd>::Element: Shuffle<[u32; 64], Output = U>,
74+
{
75+
simd_shuffle64(x, y, IDX)
76+
}
5677

5778
extern "platform-intrinsic" {
5879
crate fn simd_eq<T, U>(x: T, y: T) -> U;

src/lib.rs

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -212,6 +212,7 @@
212212
//! guide](https://rust-lang-nursery.github.io/packed_simd/perf-guide/)
213213
214214
#![feature(
215+
const_generics,
215216
repr_simd,
216217
rustc_attrs,
217218
platform_intrinsics,
@@ -229,6 +230,7 @@
229230
// FIXME: these types are unsound in C FFI already
230231
// See https://github.com/rust-lang/rust/issues/53346
231232
improper_ctypes_definitions,
233+
incomplete_features,
232234
clippy::cast_possible_truncation,
233235
clippy::cast_lossless,
234236
clippy::cast_possible_wrap,
@@ -239,6 +241,7 @@
239241
// See https://github.com/rust-lang/rust-clippy/issues/3410
240242
clippy::use_self,
241243
clippy::wrong_self_convention,
244+
clippy::from_over_into,
242245
)]
243246
#![cfg_attr(test, feature(hashmap_internals))]
244247
#![deny(rust_2018_idioms, clippy::missing_inline_in_public_items)]

0 commit comments

Comments
 (0)