zenjxl_decoder_simd/aarch64/
mod.rs1#![allow(clippy::identity_op)]
7
8#[cfg(feature = "neon")]
9pub(super) mod neon;
10
11#[macro_export]
12macro_rules! simd_function {
13 (
14 $dname:ident,
15 $descr:ident: $descr_ty:ident,
16 $(#[$($attr:meta)*])*
17 $pub:vis fn $name:ident($($arg:ident: $ty:ty),* $(,)?) $(-> $ret:ty )? $body: block
18 ) => {
19 #[inline(always)]
20 $(#[$($attr)*])*
21 $pub fn $name<$descr_ty: $crate::SimdDescriptor>($descr: $descr_ty, $($arg: $ty),*) $(-> $ret)? $body
22
23 paste::paste! {
24 #[cfg(all(target_arch = "aarch64", feature = "neon"))]
25 #[$crate::__arcane]
26 $(#[$($attr)*])*
27 fn [<$dname __neon>](_token: $crate::NeonToken, $($arg: $ty),*) $(-> $ret)? {
28 $name($crate::NeonDescriptor::from_token(_token), $($arg),*)
29 }
30
31 $(#[$($attr)*])*
32 fn [<$dname __scalar>](_token: $crate::ScalarToken, $($arg: $ty),*) $(-> $ret)? {
33 $name($crate::ScalarDescriptor::from_token(_token), $($arg),*)
34 }
35
36 $(#[$($attr)*])*
37 $pub fn $dname($($arg: $ty),*) $(-> $ret)? {
38 use $crate::__SimdToken;
39 #[cfg(all(target_arch = "aarch64", feature = "neon"))]
40 if let Some(t) = $crate::NeonToken::summon() {
41 return [<$dname __neon>](t, $($arg),*);
42 }
43 [<$dname __scalar>]($crate::ScalarToken::summon().unwrap(), $($arg),*)
44 }
45 }
46 };
47}
48
49#[macro_export]
50macro_rules! test_all_instruction_sets {
51 (
52 $name:ident
53 ) => {
54 paste::paste! {
55 #[test]
56 fn [<$name _scalar>]() {
57 use $crate::SimdDescriptor;
58 $name($crate::ScalarDescriptor::new().unwrap())
59 }
60 }
61
62 $crate::test_neon!($name);
63 };
64}
65
66#[cfg(feature = "neon")]
67#[doc(hidden)]
68#[macro_export]
69macro_rules! test_neon {
70 ($name:ident) => {
71 paste::paste! {
72 #[test]
73 fn [<$name _neon>]() {
74 use $crate::__SimdToken;
75 let Some(token) = $crate::NeonToken::summon() else { return; };
76 #[$crate::__arcane]
77 fn inner(token: $crate::NeonToken) {
78 $name($crate::NeonDescriptor::from_token(token))
79 }
80 inner(token);
81 }
82 }
83 };
84}
85
86#[cfg(not(feature = "neon"))]
87#[doc(hidden)]
88#[macro_export]
89macro_rules! test_neon {
90 ($name:ident) => {};
91}
92
93#[macro_export]
94macro_rules! bench_all_instruction_sets {
95 (
96 $name:ident,
97 $criterion:ident
98 ) => {
99 #[allow(unused)]
100 use $crate::SimdDescriptor;
101 $crate::bench_neon!($name, $criterion);
102 $name(
103 $crate::ScalarDescriptor::new().unwrap(),
104 $criterion,
105 "scalar",
106 );
107 };
108}
109
110#[cfg(feature = "neon")]
111#[doc(hidden)]
112#[macro_export]
113macro_rules! bench_neon {
114 ($name:ident, $criterion:ident) => {
115 if let Some(d) = $crate::NeonDescriptor::new() {
116 d.call(|d| $name(d, $criterion, "neon"));
117 }
118 };
119}
120
121#[cfg(not(feature = "neon"))]
122#[doc(hidden)]
123#[macro_export]
124macro_rules! bench_neon {
125 ($name:ident, $criterion:ident) => {};
126}