aom_neon_sve2_bridge.h (1630B)
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 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_