Skip to content

Commit b989248

Browse files
committed
Replace multiversion by manually implemented macro rules
1 parent fefd02c commit b989248

File tree

3 files changed

+107
-15
lines changed

3 files changed

+107
-15
lines changed

Cargo.toml

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -10,12 +10,12 @@ license = "MIT"
1010
keywords = ["search", "text", "string", "single", "simd"]
1111

1212
[dependencies]
13+
cfg-if = "1"
14+
paste = "1"
1315
memchr = "2.3"
14-
multiversion = { version = "0.6", default-features = false }
1516
seq-macro = "0.3"
1617

1718
[dev-dependencies]
18-
cfg-if = "1"
1919
memmap2 = "0.5"
2020

2121
[profile.release]

src/lib.rs

Lines changed: 9 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -27,6 +27,9 @@ use memchr::memchr;
2727
use std::rc::Rc;
2828
use std::sync::Arc;
2929

30+
#[macro_use]
31+
mod multiversion;
32+
3033
/// Needle that can be searched for within a haystack. It allows specialized
3134
/// searcher implementations for needle sizes known at compile time.
3235
pub trait Needle {
@@ -193,10 +196,7 @@ macro_rules! memcmp {
193196
};
194197
}
195198

196-
#[multiversion::multiversion]
197-
#[clone(target = "[x86|x86_64]+avx2")]
198-
#[clone(target = "wasm32+simd128")]
199-
#[clone(target = "aarch64+neon")]
199+
multiversion! {
200200
unsafe fn vector_search_in_chunk<N: NeedleWithSize + ?Sized, V: Vector>(
201201
needle: &N,
202202
position: usize,
@@ -248,13 +248,9 @@ unsafe fn vector_search_in_chunk<N: NeedleWithSize + ?Sized, V: Vector>(
248248
}
249249

250250
false
251-
}
251+
}}
252252

253-
#[allow(dead_code)]
254-
#[multiversion::multiversion]
255-
#[clone(target = "[x86|x86_64]+avx2")]
256-
#[clone(target = "wasm32+simd128")]
257-
#[clone(target = "aarch64+neon")]
253+
multiversion! {
258254
pub(crate) unsafe fn vector_search_in<N: NeedleWithSize + ?Sized, V: Vector>(
259255
needle: &N,
260256
position: usize,
@@ -266,7 +262,7 @@ pub(crate) unsafe fn vector_search_in<N: NeedleWithSize + ?Sized, V: Vector>(
266262

267263
let mut chunks = haystack[..end].chunks_exact(V::LANES);
268264
for chunk in &mut chunks {
269-
if dispatch!(vector_search_in_chunk(
265+
if dispatch!(TARGET => vector_search_in_chunk(
270266
needle,
271267
position,
272268
hash,
@@ -282,13 +278,13 @@ pub(crate) unsafe fn vector_search_in<N: NeedleWithSize + ?Sized, V: Vector>(
282278
let start = haystack.as_ptr().add(end - V::LANES);
283279
let mask = u32::MAX << (V::LANES - remainder);
284280

285-
if dispatch!(vector_search_in_chunk(needle, position, hash, start, mask)) {
281+
if dispatch!(TARGET => vector_search_in_chunk(needle, position, hash, start, mask)) {
286282
return true;
287283
}
288284
}
289285

290286
false
291-
}
287+
}}
292288

293289
trait Searcher<N: NeedleWithSize + ?Sized> {
294290
fn needle(&self) -> &N;

src/multiversion.rs

Lines changed: 96 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,96 @@
1+
macro_rules! multiversion {
2+
($vis:vis unsafe fn $name:ident $(<$($gen_name:ident : $gen_ty:ty),+>)? ( $($arg_name:ident : $arg_ty:ty ,)+ ) -> $ret:ty $block:block) => {
3+
paste::paste! {
4+
#[allow(dead_code)]
5+
#[inline(always)]
6+
$vis unsafe fn [<$name _ default_version>] $(<$($gen_name : $gen_ty),+>)? ( $($arg_name : $arg_ty),+ ) -> $ret {
7+
#[allow(dead_code)]
8+
const TARGET: crate::multiversion::Target = crate::multiversion::Target::Default;
9+
$block
10+
}
11+
12+
#[cfg(target_arch = "x86_64")]
13+
#[target_feature(enable = "avx2")]
14+
#[inline]
15+
$vis unsafe fn [<$name _ avx2_version>] $(<$($gen_name : $gen_ty),+>)? ( $($arg_name : $arg_ty),+ ) -> $ret {
16+
#[allow(dead_code)]
17+
const TARGET: crate::multiversion::Target = crate::multiversion::Target::Avx2;
18+
$block
19+
}
20+
21+
#[cfg(target_arch = "wasm32")]
22+
#[target_feature(enable = "simd128")]
23+
#[inline]
24+
$vis unsafe fn [<$name _ simd128_version>] $(<$($gen_name : $gen_ty),+>)? ( $($arg_name : $arg_ty),+ ) -> $ret {
25+
#[allow(dead_code)]
26+
const TARGET: crate::multiversion::Target = crate::multiversion::Target::Simd128;
27+
$block
28+
}
29+
30+
#[cfg(target_arch = "aarch64")]
31+
#[target_feature(enable = "neon")]
32+
#[inline]
33+
$vis unsafe fn [<$name _ neon_version>] $(<$($gen_name : $gen_ty),+>)? ( $($arg_name : $arg_ty),+ ) -> $ret {
34+
#[allow(dead_code)]
35+
const TARGET: crate::multiversion::Target = crate::multiversion::Target::Neon;
36+
$block
37+
}
38+
}
39+
};
40+
}
41+
42+
cfg_if::cfg_if! {
43+
if #[cfg(target_arch = "x86_64")] {
44+
pub(crate) enum Target {
45+
Default,
46+
Avx2,
47+
}
48+
49+
macro_rules! dispatch {
50+
($target:ident => $name:ident ( $($arg:expr),+ )) => {
51+
match $target {
52+
crate::multiversion::Target::Default => paste::paste! { [<$name _ default_version>] ( $($arg),+ ) },
53+
crate::multiversion::Target::Avx2 => paste::paste! { [<$name _ avx2_version>] ( $($arg),+ ) },
54+
}
55+
}
56+
}
57+
} else if #[cfg(target_arch = "wasm32")] {
58+
pub(crate) enum Target {
59+
Default,
60+
Simd128,
61+
}
62+
63+
macro_rules! dispatch {
64+
($target:ident => $name:ident ( $($arg:expr),+ )) => {
65+
match $target {
66+
crate::multiversion::Target::Default => paste::paste! { [<$name _ default_version>] ( $($arg),+ ) },
67+
crate::multiversion::Target::Simd128 => paste::paste! { [<$name _ simd128_version>] ( $($arg),+ ) },
68+
}
69+
}
70+
}
71+
} else if #[cfg(target_arch = "aarch64")] {
72+
pub(crate) enum Target {
73+
Default,
74+
Neon,
75+
}
76+
77+
macro_rules! dispatch {
78+
($target:ident => $name:ident ( $($arg:expr),+ )) => {
79+
match $target {
80+
crate::multiversion::Target::Default => paste::paste! { [<$name _ default_version>] ( $($arg),+ ) },
81+
crate::multiversion::Target::Neon => paste::paste! { [<$name _ neon_version>] ( $($arg),+ ) },
82+
}
83+
}
84+
}
85+
} else {
86+
pub(crate) enum Target {
87+
Default,
88+
}
89+
90+
macro_rules! dispatch {
91+
($target:ident => $name:ident ( $($arg:expr),+ )) => {
92+
paste::paste! { [<$name _ default_version>] ( $($arg),+ ) },
93+
}
94+
}
95+
}
96+
}

0 commit comments

Comments
 (0)