1c55a96383497a772a307b346368133960b02ad03Eric Laurent/* 2c55a96383497a772a307b346368133960b02ad03Eric Laurent * Copyright (c) 2011 The WebRTC project authors. All Rights Reserved. 3c55a96383497a772a307b346368133960b02ad03Eric Laurent * 4c55a96383497a772a307b346368133960b02ad03Eric Laurent * Use of this source code is governed by a BSD-style license 5c55a96383497a772a307b346368133960b02ad03Eric Laurent * that can be found in the LICENSE file in the root of the source 6c55a96383497a772a307b346368133960b02ad03Eric Laurent * tree. An additional intellectual property rights grant can be found 7c55a96383497a772a307b346368133960b02ad03Eric Laurent * in the file PATENTS. All contributing project authors may 8c55a96383497a772a307b346368133960b02ad03Eric Laurent * be found in the AUTHORS file in the root of the source tree. 9c55a96383497a772a307b346368133960b02ad03Eric Laurent */ 10c55a96383497a772a307b346368133960b02ad03Eric Laurent 11c55a96383497a772a307b346368133960b02ad03Eric Laurent 12c55a96383497a772a307b346368133960b02ad03Eric Laurent// This header file includes the inline functions for ARM processors in 13c55a96383497a772a307b346368133960b02ad03Eric Laurent// the fix point signal processing library. 14c55a96383497a772a307b346368133960b02ad03Eric Laurent 15c55a96383497a772a307b346368133960b02ad03Eric Laurent#ifndef WEBRTC_SPL_SPL_INL_ARMV7_H_ 16c55a96383497a772a307b346368133960b02ad03Eric Laurent#define WEBRTC_SPL_SPL_INL_ARMV7_H_ 17c55a96383497a772a307b346368133960b02ad03Eric Laurent 18c55a96383497a772a307b346368133960b02ad03Eric Laurentstatic __inline WebRtc_Word32 WEBRTC_SPL_MUL_16_32_RSFT16(WebRtc_Word16 a, 19c55a96383497a772a307b346368133960b02ad03Eric Laurent WebRtc_Word32 b) { 20c55a96383497a772a307b346368133960b02ad03Eric Laurent WebRtc_Word32 tmp; 21c55a96383497a772a307b346368133960b02ad03Eric Laurent __asm__("smulwb %0, %1, %2":"=r"(tmp):"r"(b), "r"(a)); 22c55a96383497a772a307b346368133960b02ad03Eric Laurent return tmp; 23c55a96383497a772a307b346368133960b02ad03Eric Laurent} 24c55a96383497a772a307b346368133960b02ad03Eric Laurent 25c55a96383497a772a307b346368133960b02ad03Eric Laurentstatic __inline WebRtc_Word32 WEBRTC_SPL_MUL_32_32_RSFT32(WebRtc_Word16 a, 26c55a96383497a772a307b346368133960b02ad03Eric Laurent WebRtc_Word16 b, 27c55a96383497a772a307b346368133960b02ad03Eric Laurent WebRtc_Word32 c) { 28c55a96383497a772a307b346368133960b02ad03Eric Laurent WebRtc_Word32 tmp; 29c55a96383497a772a307b346368133960b02ad03Eric Laurent __asm__("pkhbt %0, %1, %2, lsl #16" : "=r"(tmp) : "r"(b), "r"(a)); 30c55a96383497a772a307b346368133960b02ad03Eric Laurent __asm__("smmul %0, %1, %2":"=r"(tmp):"r"(tmp), "r"(c)); 31c55a96383497a772a307b346368133960b02ad03Eric Laurent return tmp; 32c55a96383497a772a307b346368133960b02ad03Eric Laurent} 33c55a96383497a772a307b346368133960b02ad03Eric Laurent 34c55a96383497a772a307b346368133960b02ad03Eric Laurentstatic __inline WebRtc_Word32 WEBRTC_SPL_MUL_32_32_RSFT32BI(WebRtc_Word32 a, 35c55a96383497a772a307b346368133960b02ad03Eric Laurent WebRtc_Word32 b) { 36c55a96383497a772a307b346368133960b02ad03Eric Laurent WebRtc_Word32 tmp; 37c55a96383497a772a307b346368133960b02ad03Eric Laurent __asm__("smmul %0, %1, %2":"=r"(tmp):"r"(a), "r"(b)); 38c55a96383497a772a307b346368133960b02ad03Eric Laurent return tmp; 39c55a96383497a772a307b346368133960b02ad03Eric Laurent} 40c55a96383497a772a307b346368133960b02ad03Eric Laurent 41c55a96383497a772a307b346368133960b02ad03Eric Laurentstatic __inline WebRtc_Word32 WEBRTC_SPL_MUL_16_16(WebRtc_Word16 a, 42c55a96383497a772a307b346368133960b02ad03Eric Laurent WebRtc_Word16 b) { 43c55a96383497a772a307b346368133960b02ad03Eric Laurent WebRtc_Word32 tmp; 44c55a96383497a772a307b346368133960b02ad03Eric Laurent __asm__("smulbb %0, %1, %2":"=r"(tmp):"r"(a), "r"(b)); 45c55a96383497a772a307b346368133960b02ad03Eric Laurent return tmp; 46c55a96383497a772a307b346368133960b02ad03Eric Laurent} 47c55a96383497a772a307b346368133960b02ad03Eric Laurent 48c55a96383497a772a307b346368133960b02ad03Eric Laurentstatic __inline int32_t WebRtc_MulAccumW16(int16_t a, 49c55a96383497a772a307b346368133960b02ad03Eric Laurent int16_t b, 50c55a96383497a772a307b346368133960b02ad03Eric Laurent int32_t c) { 51c55a96383497a772a307b346368133960b02ad03Eric Laurent int32_t tmp = 0; 52c55a96383497a772a307b346368133960b02ad03Eric Laurent __asm__("smlabb %0, %1, %2, %3":"=r"(tmp):"r"(a), "r"(b), "r"(c)); 53c55a96383497a772a307b346368133960b02ad03Eric Laurent return tmp; 54c55a96383497a772a307b346368133960b02ad03Eric Laurent} 55c55a96383497a772a307b346368133960b02ad03Eric Laurent 56c55a96383497a772a307b346368133960b02ad03Eric Laurentstatic __inline WebRtc_Word16 WebRtcSpl_AddSatW16(WebRtc_Word16 a, 57c55a96383497a772a307b346368133960b02ad03Eric Laurent WebRtc_Word16 b) { 58c55a96383497a772a307b346368133960b02ad03Eric Laurent WebRtc_Word32 s_sum; 59c55a96383497a772a307b346368133960b02ad03Eric Laurent 60c55a96383497a772a307b346368133960b02ad03Eric Laurent __asm__("qadd16 %0, %1, %2":"=r"(s_sum):"r"(a), "r"(b)); 61c55a96383497a772a307b346368133960b02ad03Eric Laurent 62c55a96383497a772a307b346368133960b02ad03Eric Laurent return (WebRtc_Word16) s_sum; 63c55a96383497a772a307b346368133960b02ad03Eric Laurent} 64c55a96383497a772a307b346368133960b02ad03Eric Laurent 65c55a96383497a772a307b346368133960b02ad03Eric Laurentstatic __inline WebRtc_Word32 WebRtcSpl_AddSatW32(WebRtc_Word32 l_var1, 66c55a96383497a772a307b346368133960b02ad03Eric Laurent WebRtc_Word32 l_var2) { 67c55a96383497a772a307b346368133960b02ad03Eric Laurent WebRtc_Word32 l_sum; 68c55a96383497a772a307b346368133960b02ad03Eric Laurent 69c55a96383497a772a307b346368133960b02ad03Eric Laurent __asm__("qadd %0, %1, %2":"=r"(l_sum):"r"(l_var1), "r"(l_var2)); 70c55a96383497a772a307b346368133960b02ad03Eric Laurent 71c55a96383497a772a307b346368133960b02ad03Eric Laurent return l_sum; 72c55a96383497a772a307b346368133960b02ad03Eric Laurent} 73c55a96383497a772a307b346368133960b02ad03Eric Laurent 74c55a96383497a772a307b346368133960b02ad03Eric Laurentstatic __inline WebRtc_Word16 WebRtcSpl_SubSatW16(WebRtc_Word16 var1, 75c55a96383497a772a307b346368133960b02ad03Eric Laurent WebRtc_Word16 var2) { 76c55a96383497a772a307b346368133960b02ad03Eric Laurent WebRtc_Word32 s_sub; 77c55a96383497a772a307b346368133960b02ad03Eric Laurent 78c55a96383497a772a307b346368133960b02ad03Eric Laurent __asm__("qsub16 %0, %1, %2":"=r"(s_sub):"r"(var1), "r"(var2)); 79c55a96383497a772a307b346368133960b02ad03Eric Laurent 80c55a96383497a772a307b346368133960b02ad03Eric Laurent return (WebRtc_Word16)s_sub; 81c55a96383497a772a307b346368133960b02ad03Eric Laurent} 82c55a96383497a772a307b346368133960b02ad03Eric Laurent 83c55a96383497a772a307b346368133960b02ad03Eric Laurentstatic __inline WebRtc_Word32 WebRtcSpl_SubSatW32(WebRtc_Word32 l_var1, 84c55a96383497a772a307b346368133960b02ad03Eric Laurent WebRtc_Word32 l_var2) { 85c55a96383497a772a307b346368133960b02ad03Eric Laurent WebRtc_Word32 l_sub; 86c55a96383497a772a307b346368133960b02ad03Eric Laurent 87c55a96383497a772a307b346368133960b02ad03Eric Laurent __asm__("qsub %0, %1, %2":"=r"(l_sub):"r"(l_var1), "r"(l_var2)); 88c55a96383497a772a307b346368133960b02ad03Eric Laurent 89c55a96383497a772a307b346368133960b02ad03Eric Laurent return l_sub; 90c55a96383497a772a307b346368133960b02ad03Eric Laurent} 91c55a96383497a772a307b346368133960b02ad03Eric Laurent 92c55a96383497a772a307b346368133960b02ad03Eric Laurentstatic __inline WebRtc_Word16 WebRtcSpl_GetSizeInBits(WebRtc_UWord32 n) { 93c55a96383497a772a307b346368133960b02ad03Eric Laurent WebRtc_Word32 tmp; 94c55a96383497a772a307b346368133960b02ad03Eric Laurent 95c55a96383497a772a307b346368133960b02ad03Eric Laurent __asm__("clz %0, %1":"=r"(tmp):"r"(n)); 96c55a96383497a772a307b346368133960b02ad03Eric Laurent 97c55a96383497a772a307b346368133960b02ad03Eric Laurent return (WebRtc_Word16)(32 - tmp); 98c55a96383497a772a307b346368133960b02ad03Eric Laurent} 99c55a96383497a772a307b346368133960b02ad03Eric Laurent 100c55a96383497a772a307b346368133960b02ad03Eric Laurentstatic __inline int WebRtcSpl_NormW32(WebRtc_Word32 a) { 101c55a96383497a772a307b346368133960b02ad03Eric Laurent WebRtc_Word32 tmp; 102c55a96383497a772a307b346368133960b02ad03Eric Laurent 103c55a96383497a772a307b346368133960b02ad03Eric Laurent if (a <= 0) a ^= 0xFFFFFFFF; 104c55a96383497a772a307b346368133960b02ad03Eric Laurent 105c55a96383497a772a307b346368133960b02ad03Eric Laurent __asm__("clz %0, %1":"=r"(tmp):"r"(a)); 106c55a96383497a772a307b346368133960b02ad03Eric Laurent 107c55a96383497a772a307b346368133960b02ad03Eric Laurent return tmp - 1; 108c55a96383497a772a307b346368133960b02ad03Eric Laurent} 109c55a96383497a772a307b346368133960b02ad03Eric Laurent 110c55a96383497a772a307b346368133960b02ad03Eric Laurentstatic __inline int WebRtcSpl_NormU32(WebRtc_UWord32 a) { 111c55a96383497a772a307b346368133960b02ad03Eric Laurent int tmp; 112c55a96383497a772a307b346368133960b02ad03Eric Laurent 113c55a96383497a772a307b346368133960b02ad03Eric Laurent if (a == 0) return 0; 114c55a96383497a772a307b346368133960b02ad03Eric Laurent 115c55a96383497a772a307b346368133960b02ad03Eric Laurent __asm__("clz %0, %1":"=r"(tmp):"r"(a)); 116c55a96383497a772a307b346368133960b02ad03Eric Laurent 117c55a96383497a772a307b346368133960b02ad03Eric Laurent return tmp; 118c55a96383497a772a307b346368133960b02ad03Eric Laurent} 119c55a96383497a772a307b346368133960b02ad03Eric Laurent 120c55a96383497a772a307b346368133960b02ad03Eric Laurentstatic __inline int WebRtcSpl_NormW16(WebRtc_Word16 a) { 121c55a96383497a772a307b346368133960b02ad03Eric Laurent WebRtc_Word32 tmp; 122c55a96383497a772a307b346368133960b02ad03Eric Laurent 123c55a96383497a772a307b346368133960b02ad03Eric Laurent if (a <= 0) a ^= 0xFFFFFFFF; 124c55a96383497a772a307b346368133960b02ad03Eric Laurent 125c55a96383497a772a307b346368133960b02ad03Eric Laurent __asm__("clz %0, %1":"=r"(tmp):"r"(a)); 126c55a96383497a772a307b346368133960b02ad03Eric Laurent 127c55a96383497a772a307b346368133960b02ad03Eric Laurent return tmp - 17; 128c55a96383497a772a307b346368133960b02ad03Eric Laurent} 129c55a96383497a772a307b346368133960b02ad03Eric Laurent 130c55a96383497a772a307b346368133960b02ad03Eric Laurentstatic __inline WebRtc_Word16 WebRtcSpl_SatW32ToW16(WebRtc_Word32 value32) { 131c55a96383497a772a307b346368133960b02ad03Eric Laurent WebRtc_Word16 out16; 132c55a96383497a772a307b346368133960b02ad03Eric Laurent 133c55a96383497a772a307b346368133960b02ad03Eric Laurent __asm__("ssat %r0, #16, %r1" : "=r"(out16) : "r"(value32)); 134c55a96383497a772a307b346368133960b02ad03Eric Laurent 135c55a96383497a772a307b346368133960b02ad03Eric Laurent return out16; 136c55a96383497a772a307b346368133960b02ad03Eric Laurent} 137c55a96383497a772a307b346368133960b02ad03Eric Laurent#endif // WEBRTC_SPL_SPL_INL_ARMV7_H_ 138