#ifndef FIXED_GENERIC_H
#define FIXED_GENERIC_H

#include "config.h"

#ifdef VC_PROJ
#define SSC_MULT16x16SU(a,b) ((int)(a)*(unsigned short)(b))
#else
#define SSC_MULT16x16SU(a,b) (long long)AE_MUL32_HH(a,b)
#endif

#define SSC_MULT16x32_Q15(a,b) SSC_ADD32(SSC_SHL(SSC_MULT16x16((a),SSC_SHR((b),16)),1), SSC_SHR(SSC_MULT16x16SU((a),((b)&0x0000ffff)),15))


#ifdef VC_PROJ
#define SSC_MULT16x32(a,b) ((long long)a*b)
#else
#define SSC_MULT16x32(a,b) (long long)AE_MUL32_HH(a, b)
#endif


#define SSC_MULT32x32_Q31(a,b) SSC_ADD32(SSC_ADD32(SSC_SHL(SSC_MULT16x16(SSC_SHR((a),16),SSC_SHR((b),16)),1), SSC_SHR(SSC_MULT16x16SU(SSC_SHR((a),16),((b)&0x0000ffff)),15)), SSC_SHR(SSC_MULT16x16SU(SSC_SHR((b),16),((a)&0x0000ffff)),15))
#define SSC_CONST32(x,bits) ((int)(.5+(x)*(((int)1)<<(bits))))


#define SSC_NEG(x) (-(x))

#define SSC_toSHORT(x) ((short)(x))
#define SSC_toINT(x) ((int)(x))

#define SSC_SHR16(a,shift) ((a)>>(shift))
#define SSC_SHL16(a,shift) ((a)<<(shift))

#define SSC_SHR32(a,shift) ((a)>>(shift))
#define SSC_SHL32(a,shift) ((a)<<(shift))


#define SSC_PSHR32(a,shift) (SSC_SHR32((a)+((SSC_toINT(1)<<((shift))>>1)),shift))




#ifdef VC_PROJ
#define SSC_VSHR32(a, shift) (((shift)>0) ? SSC_SHR32(a, shift) : SSC_SHL32(a, -(shift)))
#else
#define SSC_VSHR32(a, shift) ((int)(AE_INT32_SLA(a,-(shift))))
#endif

#define SSC_SHR(a,shift) ((a)>>(shift))
#define SSC_SHL(a,shift) ((a)<<(shift))


#define SSC_HLF16(x)  (SSC_SHR16(x,1))
#define SSC_HLF32(x)  (SSC_SHR32(x,1))

#define SSC_ADD16(a,b) ((short)((a)+(b)))
#define SSC_SUB16(a,b) ((short)((a)-(b)))
#define SSC_ADD32(a,b) ((int)((a)+(b)))
#define SSC_SUB32(a,b) ((int)((a)-(b)))

#ifdef VC_PROJ
#define SSC_MULT16x16(a,b) ((a)*(b))
#else
#define SSC_MULT16x16(a,b) ((int)(AE_MUL16S(a, b)))
#endif


#ifdef VC_PROJ
#define SSC_MAC16x16(c,a,b) (SSC_ADD32((c),SSC_MULT16x16((a),(b))))
#else
#define SSC_MAC16x16(c,a,b) AE_MULA32_HH(c, a, b)
#endif

#define SSC_MAC16x16_tmp(c,a,b) (SSC_ADD32((c),SSC_MULT16x16((a),(b))))	

#define SSC_MULT16x16_Q14(a,b) (SSC_SHR(SSC_MULT16x16((a),(b)),14))
#define SSC_MULT16x16_Q15(a,b) (SSC_SHR(SSC_MULT16x16((a),(b)),15))


#ifdef VC_PROJ
#define SSC_MULT16x16_P15(a,b) (SSC_SHR(SSC_ADD32(16384,SSC_MULT16x16((a),(b))),15))
#else
#define SSC_MULT16x16_P15(a,b) SSC_SHR(AE_MULA16S_scalar(16384, a, b),15)
#endif





#endif
