

#ifndef MATHOPS_H
#define MATHOPS_H

#include "ssc_macro.h"
#include "rc_code.h"

#ifndef VC_PROJ
#include <xtensa/tie/xt_hifi2.h>
extern ae_int32 AE_MUL16S(ae_int16 b, ae_int16 c);
#endif




#ifdef VC_PROJ
#define FRAC_MUL16(a,b) ((16384+((int)(a)*(b)))>>15)
#else
#define FRAC_MUL16(a,b) (AE_MULA16S_scalar(16384, a, b)>>15)
#endif

unsigned isqrt32(unsigned int _val);

static SSC_INLINE short eclog_minus1(int x)
{
   audio_assert2(x>0, "eclog_minus1() only defined for strictly positive numbers");
   return EC_ILOG(x)-1;
}

short audio_rsqrt_norm(int x);

short norm_cosine(int x);

#define D0 16383
#define D1 22804
#define D2 14819
#define D3 10204

static SSC_INLINE int fractional_ex2(short x)
{
   short frac;
   frac = SSC_SHL16(x, 4);
   return SSC_ADD16(D0, SSC_MULT16x16_Q15(frac, SSC_ADD16(D1, SSC_MULT16x16_Q15(frac, SSC_ADD16(D2 , SSC_MULT16x16_Q15(D3,frac))))));
}
/** Base-2 exponential approximation (2^x). (Q10 input, Q16 output) */
static SSC_INLINE int second_exp(short x)
{
   int integer;
   short frac;
   integer = SSC_SHR16(x,10);
   if (integer>14)
      return 0x7f000000;
   else if (integer < -15)
      return 0;
   frac = fractional_ex2(x-SSC_SHL16(integer,10));
   return SSC_VSHR32(SSC_toINT(frac), -integer-2);
}

int audio_rcp(int x);

#define audio_div(a,b) SSC_MULT32x32_Q31((int)(a),audio_rcp(b))

#endif /* MATHOPS_H */
