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)