Completed the separation of coarse and fine energy quantisation
[opus.git] / libcelt / fixed_c5x.h
index 050ae96..de7a217 100644 (file)
 #ifndef FIXED_C5X_H
 #define FIXED_C5X_H
 
-#if 0 /* All macros disabled until they can be properly tested */
+#include "dsplib.h"
+
+#undef IMUL32
+static inline long IMUL32(long i, long j)
+{
+   long ac0, ac1;
+   ac0 = _lmpy(i>>16,j);
+   ac1 = ac0 + _lmpy(i,j>>16);
+   return _lmpyu(i,j) + (ac1<<16);
+}
+
 #undef MAX16
 #define MAX16(a,b) _max(a,b)
 
 
 #undef VSHR32
 #define VSHR32(a, shift) _lshl(a,-(shift))
-#endif
 
-#endif /* FIXED_C5X_H */
\ No newline at end of file
+#undef MULT16_16_Q15
+#define MULT16_16_Q15(a,b) (_smpy(a,b))
+
+#undef MULT16_16SU 
+#define MULT16_16SU(a,b) _lmpysu(a,b)
+
+#undef MULT_16_16
+#define MULT_16_16(a,b) _lmpy(a,b)
+
+/* FIXME: This is technically incorrect and is bound to cause problems. Is there any cleaner solution? */
+#undef MULT16_32_Q15
+#define MULT16_32_Q15(a,b) ADD32(SHL(MULT16_16((a),SHR((b),16)),1), SHR(MULT16_16SU((a),(b)),15))
+
+
+#define celt_ilog2(x) (30 - _lnorm(x))
+#define OVERRIDE_CELT_ILOG2
+
+#define celt_maxabs16(x, len) MAX16(maxval((DATA *)x, len),-minval((DATA *)x, len))
+#define OVERRIDE_CELT_MAXABS16
+
+#define OVERRIDE_FIND_MAX16
+static inline int find_max16(celt_word16_t *x, int len)
+{
+   DATA max_corr16 = -VERY_LARGE16;
+   DATA pitch16 = 0;
+   maxvec((DATA *)x, len, &max_corr16, &pitch16);
+   return pitch16;
+}
+
+#endif /* FIXED_C5X_H */