- {
- int r,s;
- for(i=0;i<init->log2n-3;i++){
- int k0=n>>(i+1);
- int k1=1<<(i+2);
- int wbase=n-4;
- double *AE=init->trig;
- double *AO=AE+n4;
- double *temp;
-
- for(r=0;r<(n4>>i);r+=4){
- int w1=wbase;
- int w2=wbase-(k0>>1);
- double AEv= *AE,wA;
- double AOv= *AO,wB;
- wbase-=4;
-
- for(s=0;s<(2<<i);s++){
- x[w1+2]=w[w1+2]+w[w2+2];
- x[w1] =w[w1]+w[w2];
- wA =w[w1+2]-w[w2+2];
- wB =w[w1]-w[w2];
- x[w2+2]=wA*AEv - wB*AOv;
- x[w2] =wB*AEv + wA*AOv;
- w1-=k0;
- w2-=k0;
- }
- AE+=k1;
- AO+=k1;
- }
-
- temp=w;
- w=x;
- x=temp;
- }
+/* N/stage point generic N stage butterfly (in place, 2 register) */
+STIN void mdct_butterfly_generic(DATA_TYPE *T,
+ DATA_TYPE *x,
+ int points,
+ int trigint){
+
+ DATA_TYPE *x1 = x + points - 8;
+ DATA_TYPE *x2 = x + (points>>1) - 8;
+ REG_TYPE r0;
+ REG_TYPE r1;
+
+ do{
+
+ r0 = x1[6] - x2[6];
+ r1 = x1[7] - x2[7];
+ x1[6] += x2[6];
+ x1[7] += x2[7];
+ x2[6] = MULT_NORM(r1 * T[1] + r0 * T[0]);
+ x2[7] = MULT_NORM(r1 * T[0] - r0 * T[1]);
+
+ T+=trigint;
+
+ r0 = x1[4] - x2[4];
+ r1 = x1[5] - x2[5];
+ x1[4] += x2[4];
+ x1[5] += x2[5];
+ x2[4] = MULT_NORM(r1 * T[1] + r0 * T[0]);
+ x2[5] = MULT_NORM(r1 * T[0] - r0 * T[1]);
+
+ T+=trigint;
+
+ r0 = x1[2] - x2[2];
+ r1 = x1[3] - x2[3];
+ x1[2] += x2[2];
+ x1[3] += x2[3];
+ x2[2] = MULT_NORM(r1 * T[1] + r0 * T[0]);
+ x2[3] = MULT_NORM(r1 * T[0] - r0 * T[1]);
+
+ T+=trigint;
+
+ r0 = x1[0] - x2[0];
+ r1 = x1[1] - x2[1];
+ x1[0] += x2[0];
+ x1[1] += x2[1];
+ x2[0] = MULT_NORM(r1 * T[1] + r0 * T[0]);
+ x2[1] = MULT_NORM(r1 * T[0] - r0 * T[1]);
+
+ T+=trigint;
+ x1-=8;
+ x2-=8;
+
+ }while(x2>=x);
+}
+
+STIN void mdct_butterflies(mdct_lookup *init,
+ DATA_TYPE *x,
+ int points){
+
+ DATA_TYPE *T=init->trig;
+ int stages=init->log2n-5;
+ int i,j;
+
+ if(--stages>0){
+ mdct_butterfly_first(T,x,points);