Skip to main content

zenjxl_decoder_simd/aarch64/
mod.rs

1// Copyright (c) the JPEG XL Project Authors. All rights reserved.
2//
3// Use of this source code is governed by a BSD-style
4// license that can be found in the LICENSE file.
5
6#![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}