1#![expect(
7 missing_docs,
8 reason = "TODO: https://github.com/linebender/fearless_simd/issues/40"
9)]
10
11#[cfg(feature = "std")]
12#[macro_export]
13macro_rules! simd_dispatch {
14 (
15 $( #[$meta:meta] )* $vis:vis
16 $func:ident ( level $( , $arg:ident : $ty:ty $(,)? )* ) $( -> $ret:ty )?
17 = $inner:ident
18 ) => {
19 $( #[$meta] )* $vis
20 fn $func(level: $crate::Level $(, $arg: $ty )*) $( -> $ret )? {
21 #[cfg(target_arch = "aarch64")]
22 #[target_feature(enable = "neon")]
23 #[inline]
24 unsafe fn inner_neon(neon: $crate::aarch64::Neon $( , $arg: $ty )* ) $( -> $ret )? {
25 $inner( neon $( , $arg )* )
26 }
27 #[cfg(all(target_arch = "wasm32", target_feature = "simd128"))]
28 #[inline]
29 unsafe fn inner_wasm_simd128(simd128: $crate::wasm32::WasmSimd128 $( , $arg: $ty )* ) $( -> $ret )? {
30 $inner( simd128 $( , $arg )* )
31 }
32 #[cfg(all(feature = "std", any(target_arch = "x86", target_arch = "x86_64")))]
33 #[target_feature(enable = "sse4.2")]
34 #[inline]
35 unsafe fn inner_sse4_2(sse4_2: $crate::x86::Sse4_2 $( , $arg: $ty )* ) $( -> $ret )? {
36 $inner( sse4_2 $( , $arg )* )
37 }
38 #[cfg(all(feature = "std", any(target_arch = "x86", target_arch = "x86_64")))]
39 #[target_feature(enable = "avx2,fma")]
40 #[inline]
41 unsafe fn inner_avx2(avx2: $crate::x86::Avx2 $( , $arg: $ty )* ) $( -> $ret )? {
42 $inner( avx2 $( , $arg )* )
43 }
44 match level {
45 $crate::Level::Fallback(fb) => {
46 $inner(fb $( , $arg )* )
47 },
48 #[cfg(target_arch = "aarch64")]
49 $crate::Level::Neon(neon) => unsafe { inner_neon (neon $( , $arg )* ) }
50 #[cfg(all(target_arch = "wasm32", target_feature = "simd128"))]
51 $crate::Level::WasmSimd128(wasm) => unsafe { inner_wasm_simd128 (wasm $( , $arg )* ) }
52 #[cfg(all(feature = "std", any(target_arch = "x86", target_arch = "x86_64")))]
53 $crate::Level::Sse4_2(sse4_2) => unsafe { inner_sse4_2(sse4_2 $( , $arg)* ) }
54 #[cfg(all(feature = "std", any(target_arch = "x86", target_arch = "x86_64")))]
55 $crate::Level::Avx2(avx2) => unsafe { inner_avx2(avx2 $( , $arg)* ) }
56 _ => unreachable!()
57 }
58 }
59 };
60}
61
62#[cfg(not(feature = "std"))]
63#[macro_export]
64macro_rules! simd_dispatch {
65 (
66 $( #[$meta:meta] )* $vis:vis
67 $func:ident ( level $( , $arg:ident : $ty:ty $(,)? )* ) $( -> $ret:ty )?
68 = $inner:ident
69 ) => {
70 $( #[$meta] )* $vis
71 fn $func(level: $crate::Level $(, $arg: $ty )*) $( -> $ret )? {
72 #[cfg(all(target_arch = "wasm32", target_feature = "simd128"))]
73 #[inline]
74 unsafe fn inner_wasm_simd128(simd128: $crate::wasm32::WasmSimd128 $( , $arg: $ty )* ) $( -> $ret )? {
75 $inner( simd128 $( , $arg )* )
76 }
77 match level {
78 Level::Fallback(fb) => $inner(fb $( , $arg )* ),
79 #[cfg(all(target_arch = "wasm32", target_feature = "simd128"))]
80 Level::WasmSimd128(wasm) => unsafe { inner_wasm_simd128 (wasm $( , $arg )* ) }
81 _ => unreachable!()
82 }
83 }
84 };
85}