fixed-point: adds rounding to some shifts to eliminate bias
[opus.git] / celt / _kiss_fft_guts.h
index 7694130..aefe490 100644 (file)
     do {(res).r = ADD32((res).r,(a).r);  (res).i = SUB32((res).i,(a).i); \
     }while(0)
 
-#if defined(ARMv4_ASM)
-
-#undef C_MUL
-#define C_MUL(m,a,b) \
-    do{ \
-       int br__; \
-       int bi__; \
-       int tt__; \
-        __asm__ __volatile__( \
-            "#C_MUL\n\t" \
-            "ldm %[ap], {r0,r1}\n\t" \
-            "ldrsh %[br], [%[bp], #0]\n\t" \
-            "ldrsh %[bi], [%[bp], #2]\n\t" \
-            "smull %[tt], %[mi], r1, %[br]\n\t" \
-            "smlal %[tt], %[mi], r0, %[bi]\n\t" \
-            "rsb %[bi], %[bi], #0\n\t" \
-            "smull r0, %[mr], r0, %[br]\n\t" \
-            "mov %[tt], %[tt], lsr #15\n\t" \
-            "smlal r0, %[mr], r1, %[bi]\n\t" \
-            "orr %[mi], %[tt], %[mi], lsl #17\n\t" \
-            "mov r0, r0, lsr #15\n\t" \
-            "orr %[mr], r0, %[mr], lsl #17\n\t" \
-            : [mr]"=r"((m).r), [mi]"=r"((m).i), \
-              [br]"=&r"(br__), [bi]"=r"(bi__), [tt]"=r"(tt__) \
-            : [ap]"r"(&(a)), [bp]"r"(&(b)) \
-            : "r0", "r1" \
-        ); \
-    } \
-    while(0)
-
-#undef C_MUL4
-#define C_MUL4(m,a,b) \
-    do{ \
-       int br__; \
-       int bi__; \
-       int tt__; \
-        __asm__ __volatile__( \
-            "#C_MUL4\n\t" \
-            "ldm %[ap], {r0,r1}\n\t" \
-            "ldrsh %[br], [%[bp], #0]\n\t" \
-            "ldrsh %[bi], [%[bp], #2]\n\t" \
-            "smull %[tt], %[mi], r1, %[br]\n\t" \
-            "smlal %[tt], %[mi], r0, %[bi]\n\t" \
-            "rsb %[bi], %[bi], #0\n\t" \
-            "smull r0, %[mr], r0, %[br]\n\t" \
-            "mov %[tt], %[tt], lsr #17\n\t" \
-            "smlal r0, %[mr], r1, %[bi]\n\t" \
-            "orr %[mi], %[tt], %[mi], lsl #15\n\t" \
-            "mov r0, r0, lsr #17\n\t" \
-            "orr %[mr], r0, %[mr], lsl #15\n\t" \
-            : [mr]"=r"((m).r), [mi]"=r"((m).i), \
-              [br]"=&r"(br__), [bi]"=r"(bi__), [tt]"=r"(tt__) \
-            : [ap]"r"(&(a)), [bp]"r"(&(b)) \
-            : "r0", "r1" \
-        ); \
-    } \
-    while(0)
-
-#undef C_MULC
-#define C_MULC(m,a,b) \
-    do{ \
-       int br__; \
-       int bi__; \
-       int tt__; \
-        __asm__ __volatile__( \
-            "#C_MULC\n\t" \
-            "ldm %[ap], {r0,r1}\n\t" \
-            "ldrsh %[br], [%[bp], #0]\n\t" \
-            "ldrsh %[bi], [%[bp], #2]\n\t" \
-            "smull %[tt], %[mr], r0, %[br]\n\t" \
-            "smlal %[tt], %[mr], r1, %[bi]\n\t" \
-            "rsb %[bi], %[bi], #0\n\t" \
-            "smull r1, %[mi], r1, %[br]\n\t" \
-            "mov %[tt], %[tt], lsr #15\n\t" \
-            "smlal r1, %[mi], r0, %[bi]\n\t" \
-            "orr %[mr], %[tt], %[mr], lsl #17\n\t" \
-            "mov r1, r1, lsr #15\n\t" \
-            "orr %[mi], r1, %[mi], lsl #17\n\t" \
-            : [mr]"=r"((m).r), [mi]"=r"((m).i), \
-              [br]"=&r"(br__), [bi]"=r"(bi__), [tt]"=r"(tt__) \
-            : [ap]"r"(&(a)), [bp]"r"(&(b)) \
-            : "r0", "r1" \
-        ); \
-    } \
-    while(0)
-
-#endif /* ARMv4_ASM */
-
-#if defined(ARMv5E_ASM)
-
-#if defined(__thumb__)||defined(__thumb2__)
-#define LDRD_CONS "Q"
-#else
-#define LDRD_CONS "Uq"
+#if defined(OPUS_ARM_INLINE_ASM)
+#include "arm/kiss_fft_armv4.h"
 #endif
 
-#undef C_MUL
-#define C_MUL(m,a,b) \
-    do{ \
-        int mr1__; \
-        int mr2__; \
-        int mi__; \
-        long long aval__; \
-        int bval__; \
-        __asm__( \
-            "#C_MUL\n\t" \
-            "ldrd %[aval], %H[aval], %[ap]\n\t" \
-            "ldr %[bval], %[bp]\n\t" \
-            "smulwb %[mi], %H[aval], %[bval]\n\t" \
-            "smulwb %[mr1], %[aval], %[bval]\n\t" \
-            "smulwt %[mr2], %H[aval], %[bval]\n\t" \
-            "smlawt %[mi], %[aval], %[bval], %[mi]\n\t" \
-            : [mr1]"=r"(mr1__), [mr2]"=r"(mr2__), [mi]"=r"(mi__), \
-              [aval]"=&r"(aval__), [bval]"=r"(bval__) \
-            : [ap]LDRD_CONS(a), [bp]"m"(b) \
-        ); \
-        (m).r = SHL32(SUB32(mr1__, mr2__), 1); \
-        (m).i = SHL32(mi__, 1); \
-    } \
-    while(0)
-
-#undef C_MUL4
-#define C_MUL4(m,a,b) \
-    do{ \
-        int mr1__; \
-        int mr2__; \
-        int mi__; \
-        long long aval__; \
-        int bval__; \
-        __asm__( \
-            "#C_MUL4\n\t" \
-            "ldrd %[aval], %H[aval], %[ap]\n\t" \
-            "ldr %[bval], %[bp]\n\t" \
-            "smulwb %[mi], %H[aval], %[bval]\n\t" \
-            "smulwb %[mr1], %[aval], %[bval]\n\t" \
-            "smulwt %[mr2], %H[aval], %[bval]\n\t" \
-            "smlawt %[mi], %[aval], %[bval], %[mi]\n\t" \
-            : [mr1]"=r"(mr1__), [mr2]"=r"(mr2__), [mi]"=r"(mi__), \
-              [aval]"=&r"(aval__), [bval]"=r"(bval__) \
-            : [ap]LDRD_CONS(a), [bp]"m"(b) \
-        ); \
-        (m).r = SHR32(SUB32(mr1__, mr2__), 1); \
-        (m).i = SHR32(mi__, 1); \
-    } \
-    while(0)
-
-#undef C_MULC
-#define C_MULC(m,a,b) \
-    do{ \
-        int mr__; \
-        int mi1__; \
-        int mi2__; \
-        long long aval__; \
-        int bval__; \
-        __asm__( \
-            "#C_MULC\n\t" \
-            "ldrd %[aval], %H[aval], %[ap]\n\t" \
-            "ldr %[bval], %[bp]\n\t" \
-            "smulwb %[mr], %[aval], %[bval]\n\t" \
-            "smulwb %[mi1], %H[aval], %[bval]\n\t" \
-            "smulwt %[mi2], %[aval], %[bval]\n\t" \
-            "smlawt %[mr], %H[aval], %[bval], %[mr]\n\t" \
-            : [mr]"=r"(mr__), [mi1]"=r"(mi1__), [mi2]"=r"(mi2__), \
-              [aval]"=&r"(aval__), [bval]"=r"(bval__) \
-            : [ap]LDRD_CONS(a), [bp]"m"(b) \
-        ); \
-        (m).r = SHL32(mr__, 1); \
-        (m).i = SHL32(SUB32(mi1__, mi2__), 1); \
-    } \
-    while(0)
-
-#endif /* ARMv5E_ASM */
+#if defined(OPUS_ARM_INLINE_EDSP)
+#include "arm/kiss_fft_armv5e.h"
+#endif
 
 #else  /* not FIXED_POINT*/