fearless_simd/
macros.rs

1// Copyright 2024 the Fearless_SIMD Authors
2// SPDX-License-Identifier: Apache-2.0 OR MIT
3
4//! Macros publicly exported
5
6#![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}