1 /*
2 * Copyright (c) 2024, Alliance for Open Media. All rights reserved.
3 *
4 * This source code is subject to the terms of the BSD 2 Clause License and
5 * the Alliance for Open Media Patent License 1.0. If the BSD 2 Clause License
6 * was not distributed with this source code in the LICENSE file, you can
7 * obtain it at www.aomedia.org/license/software. If the Alliance for Open
8 * Media Patent License 1.0 was not distributed with this source code in the
9 * PATENTS file, you can obtain it at www.aomedia.org/license/patent.
10 */
11
12 #ifndef AOM_AOM_DSP_ARM_AOM_NEON_SVE2_BRIDGE_H_
13 #define AOM_AOM_DSP_ARM_AOM_NEON_SVE2_BRIDGE_H_
14
15 #include <arm_neon_sve_bridge.h>
16
17 #include "config/aom_dsp_rtcd.h"
18 #include "config/aom_config.h"
19
20 // We can access instructions exclusive to the SVE2 instruction set from a
21 // predominantly Neon context by making use of the Neon-SVE bridge intrinsics
22 // to reinterpret Neon vectors as SVE vectors - with the high part of the SVE
23 // vector (if it's longer than 128 bits) being "don't care".
24
25 // While sub-optimal on machines that have SVE vector length > 128-bit - as the
26 // remainder of the vector is unused - this approach is still beneficial when
27 // compared to a Neon-only solution.
28
aom_tbl2_s16(int16x8_t s0,int16x8_t s1,uint16x8_t tbl)29 static inline int16x8_t aom_tbl2_s16(int16x8_t s0, int16x8_t s1,
30 uint16x8_t tbl) {
31 svint16x2_t samples = svcreate2_s16(svset_neonq_s16(svundef_s16(), s0),
32 svset_neonq_s16(svundef_s16(), s1));
33 return svget_neonq_s16(
34 svtbl2_s16(samples, svset_neonq_u16(svundef_u16(), tbl)));
35 }
36
37 #endif // AOM_AOM_DSP_ARM_AOM_NEON_SVE2_BRIDGE_H_
38