28#if !defined(_SPANDSP_SATURATED_H_)
29#define _SPANDSP_SATURATED_H_
40#if defined(__cplusplus)
46static __inline__ int16_t saturate(int32_t amp)
51 amp16 = (int16_t) amp;
60static __inline__ int16_t saturate16(int32_t amp)
65 amp16 = (int16_t) amp;
75static __inline__ int16_t saturate15(int32_t amp)
85static __inline__ uint16_t saturateu16(int32_t amp)
90 amp16 = (uint16_t) amp;
99static __inline__ uint8_t saturateu8(int32_t amp)
104 amp8 = (uint8_t) amp;
113static __inline__ int16_t fsaturatef(
float famp)
115 if (famp > (
float) INT16_MAX)
117 if (famp < (
float) INT16_MIN)
119 return (int16_t) lrintf(famp);
123static __inline__ int16_t fsaturate(
double damp)
125 if (damp > (
double) INT16_MAX)
127 if (damp < (
double) INT16_MIN)
129 return (int16_t) lrint(damp);
134static __inline__ int16_t ffastsaturatef(
float famp)
136 if (famp > (
float) INT16_MAX)
138 if (famp < (
float) INT16_MIN)
140 return (int16_t) lfastrintf(famp);
145static __inline__ int16_t ffastsaturate(
double damp)
147 if (damp > (
double) INT16_MAX)
149 if (damp < (
double) INT16_MIN)
151 return (int16_t) lfastrint(damp);
156static __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;
167static __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;
177static __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);
206static __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;
243static __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);
272static __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;
309static __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);
318static __inline__ int32_t saturated_mul16_32(int16_t a, int16_t b)
320 return ((int32_t) a*(int32_t) b) << 1;
324static __inline__ int16_t saturated_abs16(int16_t a)
326 return (a == INT16_MIN) ? INT16_MAX : (int16_t) abs(a);
330#if defined(__cplusplus)