1 /* 2 * Copyright (c) 2011 The WebRTC project authors. All Rights Reserved. 3 * 4 * Use of this source code is governed by a BSD-style license 5 * that can be found in the LICENSE file in the root of the source 6 * tree. An additional intellectual property rights grant can be found 7 * in the file PATENTS. All contributing project authors may 8 * be found in the AUTHORS file in the root of the source tree. 9 */ 10 11 12 // This header file includes the inline functions in 13 // the fix point signal processing library. 14 15 #ifndef WEBRTC_SPL_SPL_INL_H_ 16 #define WEBRTC_SPL_SPL_INL_H_ 17 18 #ifdef WEBRTC_ARCH_ARM_V7A 19 #include "spl_inl_armv7.h" 20 #else 21 22 static __inline WebRtc_Word16 WebRtcSpl_SatW32ToW16(WebRtc_Word32 value32) { 23 WebRtc_Word16 out16 = (WebRtc_Word16) value32; 24 25 if (value32 > 32767) 26 out16 = 32767; 27 else if (value32 < -32768) 28 out16 = -32768; 29 30 return out16; 31 } 32 33 static __inline WebRtc_Word16 WebRtcSpl_AddSatW16(WebRtc_Word16 a, 34 WebRtc_Word16 b) { 35 return WebRtcSpl_SatW32ToW16((WebRtc_Word32) a + (WebRtc_Word32) b); 36 } 37 38 static __inline WebRtc_Word32 WebRtcSpl_AddSatW32(WebRtc_Word32 l_var1, 39 WebRtc_Word32 l_var2) { 40 WebRtc_Word32 l_sum; 41 42 // perform long addition 43 l_sum = l_var1 + l_var2; 44 45 // check for under or overflow 46 if (WEBRTC_SPL_IS_NEG(l_var1)) { 47 if (WEBRTC_SPL_IS_NEG(l_var2) && !WEBRTC_SPL_IS_NEG(l_sum)) { 48 l_sum = (WebRtc_Word32)0x80000000; 49 } 50 } else { 51 if (!WEBRTC_SPL_IS_NEG(l_var2) && WEBRTC_SPL_IS_NEG(l_sum)) { 52 l_sum = (WebRtc_Word32)0x7FFFFFFF; 53 } 54 } 55 56 return l_sum; 57 } 58 59 static __inline WebRtc_Word16 WebRtcSpl_SubSatW16(WebRtc_Word16 var1, 60 WebRtc_Word16 var2) { 61 return WebRtcSpl_SatW32ToW16((WebRtc_Word32) var1 - (WebRtc_Word32) var2); 62 } 63 64 static __inline WebRtc_Word32 WebRtcSpl_SubSatW32(WebRtc_Word32 l_var1, 65 WebRtc_Word32 l_var2) { 66 WebRtc_Word32 l_diff; 67 68 // perform subtraction 69 l_diff = l_var1 - l_var2; 70 71 // check for underflow 72 if ((l_var1 < 0) && (l_var2 > 0) && (l_diff > 0)) 73 l_diff = (WebRtc_Word32)0x80000000; 74 // check for overflow 75 if ((l_var1 > 0) && (l_var2 < 0) && (l_diff < 0)) 76 l_diff = (WebRtc_Word32)0x7FFFFFFF; 77 78 return l_diff; 79 } 80 81 static __inline WebRtc_Word16 WebRtcSpl_GetSizeInBits(WebRtc_UWord32 n) { 82 int bits; 83 84 if (0xFFFF0000 & n) { 85 bits = 16; 86 } else { 87 bits = 0; 88 } 89 if (0x0000FF00 & (n >> bits)) bits += 8; 90 if (0x000000F0 & (n >> bits)) bits += 4; 91 if (0x0000000C & (n >> bits)) bits += 2; 92 if (0x00000002 & (n >> bits)) bits += 1; 93 if (0x00000001 & (n >> bits)) bits += 1; 94 95 return bits; 96 } 97 98 static __inline int WebRtcSpl_NormW32(WebRtc_Word32 a) { 99 int zeros; 100 101 if (a <= 0) a ^= 0xFFFFFFFF; 102 103 if (!(0xFFFF8000 & a)) { 104 zeros = 16; 105 } else { 106 zeros = 0; 107 } 108 if (!(0xFF800000 & (a << zeros))) zeros += 8; 109 if (!(0xF8000000 & (a << zeros))) zeros += 4; 110 if (!(0xE0000000 & (a << zeros))) zeros += 2; 111 if (!(0xC0000000 & (a << zeros))) zeros += 1; 112 113 return zeros; 114 } 115 116 static __inline int WebRtcSpl_NormU32(WebRtc_UWord32 a) { 117 int zeros; 118 119 if (a == 0) return 0; 120 121 if (!(0xFFFF0000 & a)) { 122 zeros = 16; 123 } else { 124 zeros = 0; 125 } 126 if (!(0xFF000000 & (a << zeros))) zeros += 8; 127 if (!(0xF0000000 & (a << zeros))) zeros += 4; 128 if (!(0xC0000000 & (a << zeros))) zeros += 2; 129 if (!(0x80000000 & (a << zeros))) zeros += 1; 130 131 return zeros; 132 } 133 134 static __inline int WebRtcSpl_NormW16(WebRtc_Word16 a) { 135 int zeros; 136 137 if (a <= 0) a ^= 0xFFFF; 138 139 if (!(0xFF80 & a)) { 140 zeros = 8; 141 } else { 142 zeros = 0; 143 } 144 if (!(0xF800 & (a << zeros))) zeros += 4; 145 if (!(0xE000 & (a << zeros))) zeros += 2; 146 if (!(0xC000 & (a << zeros))) zeros += 1; 147 148 return zeros; 149 } 150 151 static __inline int32_t WebRtc_MulAccumW16(int16_t a, 152 int16_t b, 153 int32_t c) { 154 return (a * b + c); 155 } 156 157 #endif // WEBRTC_ARCH_ARM_V7A 158 159 #endif // WEBRTC_SPL_SPL_INL_H_ 160