28 #if !defined(_SPANDSP_SATURATED_H_) 29 #define _SPANDSP_SATURATED_H_ 40 #if defined(__cplusplus) 46 static __inline__ int16_t saturate(int32_t amp)
51 amp16 = (int16_t) amp;
60 static __inline__ int16_t saturate16(int32_t amp)
65 amp16 = (int16_t) amp;
75 static __inline__ int16_t saturate15(int32_t amp)
85 static __inline__ uint16_t saturateu16(int32_t amp)
90 amp16 = (uint16_t) amp;
99 static __inline__ uint8_t saturateu8(int32_t amp)
104 amp8 = (uint8_t) amp;
113 static __inline__ int16_t fsaturatef(
float famp)
115 if (famp > (
float) INT16_MAX)
117 if (famp < (
float) INT16_MIN)
119 return (int16_t) lrintf(famp);
123 static __inline__ int16_t fsaturate(
double damp)
125 if (damp > (
double) INT16_MAX)
127 if (damp < (
double) INT16_MIN)
129 return (int16_t) lrint(damp);
134 static __inline__ int16_t ffastsaturatef(
float famp)
136 if (famp > (
float) INT16_MAX)
138 if (famp < (
float) INT16_MIN)
140 return (int16_t) lfastrintf(famp);
145 static __inline__ int16_t ffastsaturate(
double damp)
147 if (damp > (
double) INT16_MAX)
149 if (damp < (
double) INT16_MIN)
151 return (int16_t) lfastrint(damp);
156 static __inline__
float ffsaturatef(
float famp)
158 if (famp > (
float) INT16_MAX)
159 return (
float) INT16_MAX;
160 if (famp < (
float) INT16_MIN)
161 return (
float) INT16_MIN;
167 static __inline__
double ffsaturate(
double famp)
169 if (famp > (
double) INT16_MAX)
170 return (
double) INT16_MAX;
171 if (famp < (
double) INT16_MIN)
172 return (
double) INT16_MIN;
177 static __inline__ int16_t saturated_add16(int16_t a, int16_t b)
179 #if defined(__GNUC__) && (defined(__i386__) || defined(__x86_64__)) 180 __asm__ __volatile__(
183 " movw $0x7fff,%0;\n" 191 #elif defined(__GNUC__) && defined(__arm5__) 194 __asm__ __volatile__(
195 " sadd16 %0,%1,%2;\n" 201 return saturate((int32_t) a + (int32_t) b);
206 static __inline__ int32_t saturated_add32(int32_t a, int32_t b)
208 #if defined(__GNUC__) && (defined(__i386__) || defined(__x86_64__)) 209 __asm__ __volatile__(
212 " movl $0x7fffffff,%0;\n" 220 #elif defined(__GNUC__) && defined(__arm5__) 223 __asm__ __volatile__(
236 sum = (a < 0) ? INT32_MIN : INT32_MAX;
243 static __inline__ int16_t saturated_sub16(int16_t a, int16_t b)
245 #if defined(__GNUC__) && (defined(__i386__) || defined(__x86_64__)) 246 __asm__ __volatile__(
249 " movw $0x8000,%0;\n" 257 #elif defined(__GNUC__) && defined(__arm5__) 260 __asm__ __volatile__(
261 " ssub16 %0,%1,%2;\n" 267 return saturate((int32_t) a - (int32_t) b);
272 static __inline__ int32_t saturated_sub32(int32_t a, int32_t b)
274 #if defined(__GNUC__) && (defined(__i386__) || defined(__x86_64__)) 275 __asm__ __volatile__(
278 " movl $0x80000000,%0;\n" 286 #elif defined(__GNUC__) && defined(__arm5__) 289 __asm__ __volatile__(
301 if ((diff ^ a) & INT32_MIN)
302 diff = (a < 0L) ? INT32_MIN : INT32_MAX;
309 static __inline__ int16_t saturated_mul16(int16_t a, int16_t b)
311 if (a == INT16_MIN && b == INT16_MIN)
314 return (int16_t) (((int32_t) a*(int32_t) b) >> 15);
318 static __inline__ int32_t saturated_mul16_32(int16_t a, int16_t b)
320 return ((int32_t) a*(int32_t) b) << 1;
324 static __inline__ int16_t saturated_abs16(int16_t a)
326 return (a == INT16_MIN) ? INT16_MAX : (int16_t) abs(a);
330 #if defined(__cplusplus)