summaryrefslogtreecommitdiff
path: root/apps/codecs/Tremor/mdct.c
diff options
context:
space:
mode:
Diffstat (limited to 'apps/codecs/Tremor/mdct.c')
-rw-r--r--apps/codecs/Tremor/mdct.c72
1 files changed, 32 insertions, 40 deletions
diff --git a/apps/codecs/Tremor/mdct.c b/apps/codecs/Tremor/mdct.c
index 2d2564f196..53d1ed4f0c 100644
--- a/apps/codecs/Tremor/mdct.c
+++ b/apps/codecs/Tremor/mdct.c
@@ -41,7 +41,6 @@
41 41
42/* 8 point butterfly (in place) */ 42/* 8 point butterfly (in place) */
43STIN void mdct_butterfly_8(DATA_TYPE *x){ 43STIN void mdct_butterfly_8(DATA_TYPE *x){
44
45 REG_TYPE r0 = x[4] + x[0]; 44 REG_TYPE r0 = x[4] + x[0];
46 REG_TYPE r1 = x[4] - x[0]; 45 REG_TYPE r1 = x[4] - x[0];
47 REG_TYPE r2 = x[5] + x[1]; 46 REG_TYPE r2 = x[5] + x[1];
@@ -144,88 +143,81 @@ STIN void mdct_butterfly_32(DATA_TYPE *x){
144 mdct_butterfly_16(x+16); 143 mdct_butterfly_16(x+16);
145} 144}
146 145
147/* N/stage point generic N stage butterfly (in place, 2 register) */ 146/* N/stage point generic N stage butterfly (in place, 4 register) */
148STIN void mdct_butterfly_generic(DATA_TYPE *x,int points,int step){ 147void mdct_butterfly_generic(DATA_TYPE *x,int points, int step){
149
150 LOOKUP_T *T = sincos_lookup0; 148 LOOKUP_T *T = sincos_lookup0;
151 DATA_TYPE *x1 = x + points - 8; 149 DATA_TYPE *x1 = x + points - 8;
152 DATA_TYPE *x2 = x + (points>>1) - 8; 150 DATA_TYPE *x2 = x + (points>>1) - 8;
153 REG_TYPE r0; 151 REG_TYPE r0;
154 REG_TYPE r1; 152 REG_TYPE r1;
153 REG_TYPE r2;
154 REG_TYPE r3;
155 155
156 do{ 156 do{
157 r0 = x1[6] - x2[6]; x1[6] += x2[6]; 157 r0 = x1[6] - x2[6]; x1[6] += x2[6];
158 r1 = x2[7] - x1[7]; x1[7] += x2[7]; 158 r1 = x2[7] - x1[7]; x1[7] += x2[7];
159 r2 = x1[4] - x2[4]; x1[4] += x2[4];
160 r3 = x2[5] - x1[5]; x1[5] += x2[5];
159 XPROD31( r1, r0, T[0], T[1], &x2[6], &x2[7] ); T+=step; 161 XPROD31( r1, r0, T[0], T[1], &x2[6], &x2[7] ); T+=step;
160 162 XPROD31( r3, r2, T[0], T[1], &x2[4], &x2[5] ); T+=step;
161 r0 = x1[4] - x2[4]; x1[4] += x2[4]; 163
162 r1 = x2[5] - x1[5]; x1[5] += x2[5];
163 XPROD31( r1, r0, T[0], T[1], &x2[4], &x2[5] ); T+=step;
164
165 r0 = x1[2] - x2[2]; x1[2] += x2[2]; 164 r0 = x1[2] - x2[2]; x1[2] += x2[2];
166 r1 = x2[3] - x1[3]; x1[3] += x2[3]; 165 r1 = x2[3] - x1[3]; x1[3] += x2[3];
166 r2 = x1[0] - x2[0]; x1[0] += x2[0];
167 r3 = x2[1] - x1[1]; x1[1] += x2[1];
167 XPROD31( r1, r0, T[0], T[1], &x2[2], &x2[3] ); T+=step; 168 XPROD31( r1, r0, T[0], T[1], &x2[2], &x2[3] ); T+=step;
168 169 XPROD31( r3, r2, T[0], T[1], &x2[0], &x2[1] ); T+=step;
169 r0 = x1[0] - x2[0]; x1[0] += x2[0]; 170
170 r1 = x2[1] - x1[1]; x1[1] += x2[1];
171 XPROD31( r1, r0, T[0], T[1], &x2[0], &x2[1] ); T+=step;
172
173 x1-=8; x2-=8; 171 x1-=8; x2-=8;
174 }while(T<sincos_lookup0+1024); 172 }while(T<sincos_lookup0+1024);
175 do{ 173 do{
176 r0 = x1[6] - x2[6]; x1[6] += x2[6]; 174 r0 = x1[6] - x2[6]; x1[6] += x2[6];
177 r1 = x1[7] - x2[7]; x1[7] += x2[7]; 175 r1 = x1[7] - x2[7]; x1[7] += x2[7];
176 r2 = x1[4] - x2[4]; x1[4] += x2[4];
177 r3 = x1[5] - x2[5]; x1[5] += x2[5];
178 XNPROD31( r0, r1, T[0], T[1], &x2[6], &x2[7] ); T-=step; 178 XNPROD31( r0, r1, T[0], T[1], &x2[6], &x2[7] ); T-=step;
179 XNPROD31( r2, r3, T[0], T[1], &x2[4], &x2[5] ); T-=step;
179 180
180 r0 = x1[4] - x2[4]; x1[4] += x2[4];
181 r1 = x1[5] - x2[5]; x1[5] += x2[5];
182 XNPROD31( r0, r1, T[0], T[1], &x2[4], &x2[5] ); T-=step;
183
184 r0 = x1[2] - x2[2]; x1[2] += x2[2]; 181 r0 = x1[2] - x2[2]; x1[2] += x2[2];
185 r1 = x1[3] - x2[3]; x1[3] += x2[3]; 182 r1 = x1[3] - x2[3]; x1[3] += x2[3];
183 r2 = x1[0] - x2[0]; x1[0] += x2[0];
184 r3 = x1[1] - x2[1]; x1[1] += x2[1];
186 XNPROD31( r0, r1, T[0], T[1], &x2[2], &x2[3] ); T-=step; 185 XNPROD31( r0, r1, T[0], T[1], &x2[2], &x2[3] ); T-=step;
187 186 XNPROD31( r2, r3, T[0], T[1], &x2[0], &x2[1] ); T-=step;
188 r0 = x1[0] - x2[0]; x1[0] += x2[0];
189 r1 = x1[1] - x2[1]; x1[1] += x2[1];
190 XNPROD31( r0, r1, T[0], T[1], &x2[0], &x2[1] ); T-=step;
191 187
192 x1-=8; x2-=8; 188 x1-=8; x2-=8;
193 }while(T>sincos_lookup0); 189 }while(T>sincos_lookup0);
194 do{ 190 do{
195 r0 = x2[6] - x1[6]; x1[6] += x2[6]; 191 r0 = x2[6] - x1[6]; x1[6] += x2[6];
196 r1 = x2[7] - x1[7]; x1[7] += x2[7]; 192 r1 = x2[7] - x1[7]; x1[7] += x2[7];
193 r2 = x2[4] - x1[4]; x1[4] += x2[4];
194 r3 = x2[5] - x1[5]; x1[5] += x2[5];
197 XPROD31( r0, r1, T[0], T[1], &x2[6], &x2[7] ); T+=step; 195 XPROD31( r0, r1, T[0], T[1], &x2[6], &x2[7] ); T+=step;
198 196 XPROD31( r2, r3, T[0], T[1], &x2[4], &x2[5] ); T+=step;
199 r0 = x2[4] - x1[4]; x1[4] += x2[4];
200 r1 = x2[5] - x1[5]; x1[5] += x2[5];
201 XPROD31( r0, r1, T[0], T[1], &x2[4], &x2[5] ); T+=step;
202 197
203 r0 = x2[2] - x1[2]; x1[2] += x2[2]; 198 r0 = x2[2] - x1[2]; x1[2] += x2[2];
204 r1 = x2[3] - x1[3]; x1[3] += x2[3]; 199 r1 = x2[3] - x1[3]; x1[3] += x2[3];
200 r2 = x2[0] - x1[0]; x1[0] += x2[0];
201 r3 = x2[1] - x1[1]; x1[1] += x2[1];
205 XPROD31( r0, r1, T[0], T[1], &x2[2], &x2[3] ); T+=step; 202 XPROD31( r0, r1, T[0], T[1], &x2[2], &x2[3] ); T+=step;
206 203 XPROD31( r2, r3, T[0], T[1], &x2[0], &x2[1] ); T+=step;
207 r0 = x2[0] - x1[0]; x1[0] += x2[0];
208 r1 = x2[1] - x1[1]; x1[1] += x2[1];
209 XPROD31( r0, r1, T[0], T[1], &x2[0], &x2[1] ); T+=step;
210 204
211 x1-=8; x2-=8; 205 x1-=8; x2-=8;
212 }while(T<sincos_lookup0+1024); 206 }while(T<sincos_lookup0+1024);
213 do{ 207 do{
214 r0 = x1[6] - x2[6]; x1[6] += x2[6]; 208 r0 = x1[6] - x2[6]; x1[6] += x2[6];
215 r1 = x2[7] - x1[7]; x1[7] += x2[7]; 209 r1 = x2[7] - x1[7]; x1[7] += x2[7];
210 r2 = x1[4] - x2[4]; x1[4] += x2[4];
211 r3 = x2[5] - x1[5]; x1[5] += x2[5];
216 XNPROD31( r1, r0, T[0], T[1], &x2[6], &x2[7] ); T-=step; 212 XNPROD31( r1, r0, T[0], T[1], &x2[6], &x2[7] ); T-=step;
217 213 XNPROD31( r3, r2, T[0], T[1], &x2[4], &x2[5] ); T-=step;
218 r0 = x1[4] - x2[4]; x1[4] += x2[4];
219 r1 = x2[5] - x1[5]; x1[5] += x2[5];
220 XNPROD31( r1, r0, T[0], T[1], &x2[4], &x2[5] ); T-=step;
221 214
222 r0 = x1[2] - x2[2]; x1[2] += x2[2]; 215 r0 = x1[2] - x2[2]; x1[2] += x2[2];
223 r1 = x2[3] - x1[3]; x1[3] += x2[3]; 216 r1 = x2[3] - x1[3]; x1[3] += x2[3];
217 r2 = x1[0] - x2[0]; x1[0] += x2[0];
218 r3 = x2[1] - x1[1]; x1[1] += x2[1];
224 XNPROD31( r1, r0, T[0], T[1], &x2[2], &x2[3] ); T-=step; 219 XNPROD31( r1, r0, T[0], T[1], &x2[2], &x2[3] ); T-=step;
225 220 XNPROD31( r3, r2, T[0], T[1], &x2[0], &x2[1] ); T-=step;
226 r0 = x1[0] - x2[0]; x1[0] += x2[0];
227 r1 = x2[1] - x1[1]; x1[1] += x2[1];
228 XNPROD31( r1, r0, T[0], T[1], &x2[0], &x2[1] ); T-=step;
229 221
230 x1-=8; x2-=8; 222 x1-=8; x2-=8;
231 }while(T>sincos_lookup0); 223 }while(T>sincos_lookup0);
@@ -246,8 +238,8 @@ STIN void mdct_butterflies(DATA_TYPE *x,int points,int shift) {
246} 238}
247 239
248 240
249static const unsigned char bitrev[16] 241static const unsigned char bitrev[16] IDATA_ATTR =
250 IDATA_ATTR = {0,8,4,12,2,10,6,14,1,9,5,13,3,11,7,15}; 242 {0,8,4,12,2,10,6,14,1,9,5,13,3,11,7,15};
251 243
252STIN int bitrev12(int x){ 244STIN int bitrev12(int x){
253 return bitrev[x>>8]|(bitrev[(x&0x0f0)>>4]<<4)|(((int)bitrev[x&0x00f])<<8); 245 return bitrev[x>>8]|(bitrev[(x&0x0f0)>>4]<<4)|(((int)bitrev[x&0x00f])<<8);