diff options
Diffstat (limited to 'lib/rbcodec/codecs/libopus/celt/fixed_generic.h')
-rw-r--r-- | lib/rbcodec/codecs/libopus/celt/fixed_generic.h | 62 |
1 files changed, 7 insertions, 55 deletions
diff --git a/lib/rbcodec/codecs/libopus/celt/fixed_generic.h b/lib/rbcodec/codecs/libopus/celt/fixed_generic.h index 28a1598d3e..0e77976e83 100644 --- a/lib/rbcodec/codecs/libopus/celt/fixed_generic.h +++ b/lib/rbcodec/codecs/libopus/celt/fixed_generic.h | |||
@@ -42,64 +42,12 @@ | |||
42 | /** 16x32 multiplication, followed by a 16-bit shift right (round-to-nearest). Results fits in 32 bits */ | 42 | /** 16x32 multiplication, followed by a 16-bit shift right (round-to-nearest). Results fits in 32 bits */ |
43 | #define MULT16_32_P16(a,b) ADD32(MULT16_16((a),SHR((b),16)), PSHR(MULT16_16((a),((b)&0x0000ffff)),16)) | 43 | #define MULT16_32_P16(a,b) ADD32(MULT16_16((a),SHR((b),16)), PSHR(MULT16_16((a),((b)&0x0000ffff)),16)) |
44 | 44 | ||
45 | #if defined(CPU_COLDFIRE) | ||
46 | static inline int32_t MULT16_32_Q15(int32_t a, int32_t b) | ||
47 | { | ||
48 | int32_t r; | ||
49 | asm volatile ("mac.l %[a], %[b], %%acc0;" | ||
50 | "movclr.l %%acc0, %[r];" | ||
51 | : [r] "=r" (r) | ||
52 | : [a] "r" (a<<16), [b] "r" (b) | ||
53 | : "cc"); | ||
54 | return r; | ||
55 | } | ||
56 | |||
57 | #elif defined(CPU_ARM) | ||
58 | static inline int32_t MULT16_32_Q15(int32_t a, int32_t b) | ||
59 | { | ||
60 | int32_t lo, hi; | ||
61 | asm volatile("smull %[lo], %[hi], %[b], %[a] \n\t" | ||
62 | "mov %[lo], %[lo], lsr #15 \n\t" | ||
63 | "orr %[hi], %[lo], %[hi], lsl #17 \n\t" | ||
64 | : [lo] "=&r" (lo), [hi] "=&r" (hi) | ||
65 | : [a] "r" (a), [b] "r" (b) ); | ||
66 | return(hi); | ||
67 | } | ||
68 | |||
69 | #else | ||
70 | /** 16x32 multiplication, followed by a 15-bit shift right. Results fits in 32 bits */ | 45 | /** 16x32 multiplication, followed by a 15-bit shift right. Results fits in 32 bits */ |
71 | #define MULT16_32_Q15(a,b) ADD32(SHL(MULT16_16((a),SHR((b),16)),1), SHR(MULT16_16SU((a),((b)&0x0000ffff)),15)) | 46 | #define MULT16_32_Q15(a,b) ADD32(SHL(MULT16_16((a),SHR((b),16)),1), SHR(MULT16_16SU((a),((b)&0x0000ffff)),15)) |
72 | #endif | ||
73 | 47 | ||
74 | #if defined(CPU_COLDFIRE) | ||
75 | static inline int32_t MULT32_32_Q31(int32_t a, int32_t b) | ||
76 | { | ||
77 | int32_t r; | ||
78 | asm volatile ("mac.l %[a], %[b], %%acc0;" | ||
79 | "movclr.l %%acc0, %[r];" | ||
80 | : [r] "=r" (r) | ||
81 | : [a] "r" (a), [b] "r" (b) | ||
82 | : "cc"); | ||
83 | return r; | ||
84 | } | ||
85 | |||
86 | #elif defined(CPU_ARM) | ||
87 | static inline int32_t MULT32_32_Q31(int32_t a, int32_t b) | ||
88 | { | ||
89 | int32_t lo, hi; | ||
90 | asm volatile("smull %[lo], %[hi], %[a], %[b] \n\t" | ||
91 | "mov %[lo], %[lo], lsr #31 \n\t" | ||
92 | "orr %[hi], %[lo], %[hi], lsl #1 \n\t" | ||
93 | : [lo] "=&r" (lo), [hi] "=&r" (hi) | ||
94 | : [a] "r" (a), [b] "r" (b) ); | ||
95 | return(hi); | ||
96 | } | ||
97 | |||
98 | #else | ||
99 | /** 32x32 multiplication, followed by a 31-bit shift right. Results fits in 32 bits */ | 48 | /** 32x32 multiplication, followed by a 31-bit shift right. Results fits in 32 bits */ |
100 | //#define MULT32_32_Q31(a,b) ADD32(ADD32(SHL(MULT16_16(SHR((a),16),SHR((b),16)),1), SHR(MULT16_16SU(SHR((a),16),((b)&0x0000ffff)),15)), SHR(MULT16_16SU(SHR((b),16),((a)&0x0000ffff)),15)) | 49 | #define MULT32_32_Q31(a,b) ADD32(ADD32(SHL(MULT16_16(SHR((a),16),SHR((b),16)),1), SHR(MULT16_16SU(SHR((a),16),((b)&0x0000ffff)),15)), SHR(MULT16_16SU(SHR((b),16),((a)&0x0000ffff)),15)) |
101 | #define MULT32_32_Q31(a,b) (opus_val32)((((int64_t)(a)) * ((int64_t)(b)))>>31) | 50 | |
102 | #endif | ||
103 | /** Compile-time conversion of float constant to 16-bit value */ | 51 | /** Compile-time conversion of float constant to 16-bit value */ |
104 | #define QCONST16(x,bits) ((opus_val16)(.5+(x)*(((opus_val32)1)<<(bits)))) | 52 | #define QCONST16(x,bits) ((opus_val16)(.5+(x)*(((opus_val32)1)<<(bits)))) |
105 | 53 | ||
@@ -136,6 +84,8 @@ static inline int32_t MULT32_32_Q31(int32_t a, int32_t b) | |||
136 | #define PSHR(a,shift) (SHR((a)+((EXTEND32(1)<<((shift))>>1)),shift)) | 84 | #define PSHR(a,shift) (SHR((a)+((EXTEND32(1)<<((shift))>>1)),shift)) |
137 | #define SATURATE(x,a) (((x)>(a) ? (a) : (x)<-(a) ? -(a) : (x))) | 85 | #define SATURATE(x,a) (((x)>(a) ? (a) : (x)<-(a) ? -(a) : (x))) |
138 | 86 | ||
87 | #define SATURATE16(x) (EXTRACT16((x)>32767 ? 32767 : (x)<-32768 ? -32768 : (x))) | ||
88 | |||
139 | /** Shift by a and round-to-neareast 32-bit value. Result is a 16-bit value */ | 89 | /** Shift by a and round-to-neareast 32-bit value. Result is a 16-bit value */ |
140 | #define ROUND16(x,a) (EXTRACT16(PSHR32((x),(a)))) | 90 | #define ROUND16(x,a) (EXTRACT16(PSHR32((x),(a)))) |
141 | /** Divide by two */ | 91 | /** Divide by two */ |
@@ -160,7 +110,9 @@ static inline int32_t MULT32_32_Q31(int32_t a, int32_t b) | |||
160 | 110 | ||
161 | /** 16x16 multiply-add where the result fits in 32 bits */ | 111 | /** 16x16 multiply-add where the result fits in 32 bits */ |
162 | #define MAC16_16(c,a,b) (ADD32((c),MULT16_16((a),(b)))) | 112 | #define MAC16_16(c,a,b) (ADD32((c),MULT16_16((a),(b)))) |
163 | /** 16x32 multiply-add, followed by a 15-bit shift right. Results fits in 32 bits */ | 113 | /** 16x32 multiply, followed by a 15-bit shift right and 32-bit add. |
114 | b must fit in 31 bits. | ||
115 | Result fits in 32 bits. */ | ||
164 | #define MAC16_32_Q15(c,a,b) ADD32(c,ADD32(MULT16_16((a),SHR((b),15)), SHR(MULT16_16((a),((b)&0x00007fff)),15))) | 116 | #define MAC16_32_Q15(c,a,b) ADD32(c,ADD32(MULT16_16((a),SHR((b),15)), SHR(MULT16_16((a),((b)&0x00007fff)),15))) |
165 | 117 | ||
166 | #define MULT16_16_Q11_32(a,b) (SHR(MULT16_16((a),(b)),11)) | 118 | #define MULT16_16_Q11_32(a,b) (SHR(MULT16_16((a),(b)),11)) |