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_V7
19#include "webrtc/common_audio/signal_processing/include/spl_inl_armv7.h"
20#else
21
22#if defined(MIPS32_LE)
23#include "webrtc/common_audio/signal_processing/include/spl_inl_mips.h"
24#endif
25
26#if !defined(MIPS_DSP_R1_LE)
27static __inline int16_t WebRtcSpl_SatW32ToW16(int32_t value32) {
28  int16_t out16 = (int16_t) value32;
29
30  if (value32 > 32767)
31    out16 = 32767;
32  else if (value32 < -32768)
33    out16 = -32768;
34
35  return out16;
36}
37
38static __inline int32_t WebRtcSpl_AddSatW32(int32_t l_var1, int32_t l_var2) {
39  int32_t l_sum;
40
41  // Perform long addition
42  l_sum = l_var1 + l_var2;
43
44  if (l_var1 < 0) {  // Check for underflow.
45    if ((l_var2 < 0) && (l_sum >= 0)) {
46        l_sum = (int32_t)0x80000000;
47    }
48  } else {  // Check for overflow.
49    if ((l_var2 > 0) && (l_sum < 0)) {
50        l_sum = (int32_t)0x7FFFFFFF;
51    }
52  }
53
54  return l_sum;
55}
56
57static __inline int32_t WebRtcSpl_SubSatW32(int32_t l_var1, int32_t l_var2) {
58  int32_t l_diff;
59
60  // Perform subtraction.
61  l_diff = l_var1 - l_var2;
62
63  if (l_var1 < 0) {  // Check for underflow.
64    if ((l_var2 > 0) && (l_diff > 0)) {
65      l_diff = (int32_t)0x80000000;
66    }
67  } else {  // Check for overflow.
68    if ((l_var2 < 0) && (l_diff < 0)) {
69      l_diff = (int32_t)0x7FFFFFFF;
70    }
71  }
72
73  return l_diff;
74}
75
76static __inline int16_t WebRtcSpl_AddSatW16(int16_t a, int16_t b) {
77  return WebRtcSpl_SatW32ToW16((int32_t) a + (int32_t) b);
78}
79
80static __inline int16_t WebRtcSpl_SubSatW16(int16_t var1, int16_t var2) {
81  return WebRtcSpl_SatW32ToW16((int32_t) var1 - (int32_t) var2);
82}
83#endif  // #if !defined(MIPS_DSP_R1_LE)
84
85#if !defined(MIPS32_LE)
86static __inline int16_t WebRtcSpl_GetSizeInBits(uint32_t n) {
87  int16_t bits;
88
89  if (0xFFFF0000 & n) {
90    bits = 16;
91  } else {
92    bits = 0;
93  }
94  if (0x0000FF00 & (n >> bits)) bits += 8;
95  if (0x000000F0 & (n >> bits)) bits += 4;
96  if (0x0000000C & (n >> bits)) bits += 2;
97  if (0x00000002 & (n >> bits)) bits += 1;
98  if (0x00000001 & (n >> bits)) bits += 1;
99
100  return bits;
101}
102
103static __inline int16_t WebRtcSpl_NormW32(int32_t a) {
104  int16_t zeros;
105
106  if (a == 0) {
107    return 0;
108  }
109  else if (a < 0) {
110    a = ~a;
111  }
112
113  if (!(0xFFFF8000 & a)) {
114    zeros = 16;
115  } else {
116    zeros = 0;
117  }
118  if (!(0xFF800000 & (a << zeros))) zeros += 8;
119  if (!(0xF8000000 & (a << zeros))) zeros += 4;
120  if (!(0xE0000000 & (a << zeros))) zeros += 2;
121  if (!(0xC0000000 & (a << zeros))) zeros += 1;
122
123  return zeros;
124}
125
126static __inline int16_t WebRtcSpl_NormU32(uint32_t a) {
127  int16_t zeros;
128
129  if (a == 0) return 0;
130
131  if (!(0xFFFF0000 & a)) {
132    zeros = 16;
133  } else {
134    zeros = 0;
135  }
136  if (!(0xFF000000 & (a << zeros))) zeros += 8;
137  if (!(0xF0000000 & (a << zeros))) zeros += 4;
138  if (!(0xC0000000 & (a << zeros))) zeros += 2;
139  if (!(0x80000000 & (a << zeros))) zeros += 1;
140
141  return zeros;
142}
143
144static __inline int16_t WebRtcSpl_NormW16(int16_t a) {
145  int16_t zeros;
146
147  if (a == 0) {
148    return 0;
149  }
150  else if (a < 0) {
151    a = ~a;
152  }
153
154  if (!(0xFF80 & a)) {
155    zeros = 8;
156  } else {
157    zeros = 0;
158  }
159  if (!(0xF800 & (a << zeros))) zeros += 4;
160  if (!(0xE000 & (a << zeros))) zeros += 2;
161  if (!(0xC000 & (a << zeros))) zeros += 1;
162
163  return zeros;
164}
165
166static __inline int32_t WebRtc_MulAccumW16(int16_t a, int16_t b, int32_t c) {
167  return (a * b + c);
168}
169#endif  // #if !defined(MIPS32_LE)
170
171#endif  // WEBRTC_ARCH_ARM_V7
172
173#endif  // WEBRTC_SPL_SPL_INL_H_
174