dct64_i386.c

Go to the documentation of this file.
00001 /*
00002  * Discrete Cosine Tansform (DCT) for subband synthesis
00003  * optimized for machines with no auto-increment. 
00004  * The performance is highly compiler dependend. Maybe
00005  * the dct64.c version for 'normal' processor may be faster
00006  * even for Intel processors.
00007  */
00008 
00009 /* $Id: dct64_i386.c,v 1.10 2004/04/14 22:15:44 robert Exp $ */
00010 
00011 #ifdef HAVE_CONFIG_H
00012 #include <config.h>
00013 #endif
00014 
00015 #include "dct64_i386.h"
00016 #include "tabinit.h"
00017 
00018 #ifdef WITH_DMALLOC
00019 #include <dmalloc.h>
00020 #endif
00021 
00022 static void dct64_1(real *out0,real *out1,real *b1,real *b2,real *samples)
00023 {
00024 
00025  {
00026   real *costab = pnts[0];
00027 
00028   b1[0x00] = samples[0x00] + samples[0x1F];
00029   b1[0x1F] = (samples[0x00] - samples[0x1F]) * costab[0x0];
00030 
00031   b1[0x01] = samples[0x01] + samples[0x1E];
00032   b1[0x1E] = (samples[0x01] - samples[0x1E]) * costab[0x1];
00033 
00034   b1[0x02] = samples[0x02] + samples[0x1D];
00035   b1[0x1D] = (samples[0x02] - samples[0x1D]) * costab[0x2];
00036 
00037   b1[0x03] = samples[0x03] + samples[0x1C];
00038   b1[0x1C] = (samples[0x03] - samples[0x1C]) * costab[0x3];
00039 
00040   b1[0x04] = samples[0x04] + samples[0x1B];
00041   b1[0x1B] = (samples[0x04] - samples[0x1B]) * costab[0x4];
00042 
00043   b1[0x05] = samples[0x05] + samples[0x1A];
00044   b1[0x1A] = (samples[0x05] - samples[0x1A]) * costab[0x5];
00045 
00046   b1[0x06] = samples[0x06] + samples[0x19];
00047   b1[0x19] = (samples[0x06] - samples[0x19]) * costab[0x6];
00048 
00049   b1[0x07] = samples[0x07] + samples[0x18];
00050   b1[0x18] = (samples[0x07] - samples[0x18]) * costab[0x7];
00051 
00052   b1[0x08] = samples[0x08] + samples[0x17];
00053   b1[0x17] = (samples[0x08] - samples[0x17]) * costab[0x8];
00054 
00055   b1[0x09] = samples[0x09] + samples[0x16];
00056   b1[0x16] = (samples[0x09] - samples[0x16]) * costab[0x9];
00057 
00058   b1[0x0A] = samples[0x0A] + samples[0x15];
00059   b1[0x15] = (samples[0x0A] - samples[0x15]) * costab[0xA];
00060 
00061   b1[0x0B] = samples[0x0B] + samples[0x14];
00062   b1[0x14] = (samples[0x0B] - samples[0x14]) * costab[0xB];
00063 
00064   b1[0x0C] = samples[0x0C] + samples[0x13];
00065   b1[0x13] = (samples[0x0C] - samples[0x13]) * costab[0xC];
00066 
00067   b1[0x0D] = samples[0x0D] + samples[0x12];
00068   b1[0x12] = (samples[0x0D] - samples[0x12]) * costab[0xD];
00069 
00070   b1[0x0E] = samples[0x0E] + samples[0x11];
00071   b1[0x11] = (samples[0x0E] - samples[0x11]) * costab[0xE];
00072 
00073   b1[0x0F] = samples[0x0F] + samples[0x10];
00074   b1[0x10] = (samples[0x0F] - samples[0x10]) * costab[0xF];
00075  }
00076 
00077 
00078  {
00079   real *costab = pnts[1];
00080 
00081   b2[0x00] = b1[0x00] + b1[0x0F]; 
00082   b2[0x0F] = (b1[0x00] - b1[0x0F]) * costab[0];
00083   b2[0x01] = b1[0x01] + b1[0x0E]; 
00084   b2[0x0E] = (b1[0x01] - b1[0x0E]) * costab[1];
00085   b2[0x02] = b1[0x02] + b1[0x0D]; 
00086   b2[0x0D] = (b1[0x02] - b1[0x0D]) * costab[2];
00087   b2[0x03] = b1[0x03] + b1[0x0C]; 
00088   b2[0x0C] = (b1[0x03] - b1[0x0C]) * costab[3];
00089   b2[0x04] = b1[0x04] + b1[0x0B]; 
00090   b2[0x0B] = (b1[0x04] - b1[0x0B]) * costab[4];
00091   b2[0x05] = b1[0x05] + b1[0x0A]; 
00092   b2[0x0A] = (b1[0x05] - b1[0x0A]) * costab[5];
00093   b2[0x06] = b1[0x06] + b1[0x09]; 
00094   b2[0x09] = (b1[0x06] - b1[0x09]) * costab[6];
00095   b2[0x07] = b1[0x07] + b1[0x08]; 
00096   b2[0x08] = (b1[0x07] - b1[0x08]) * costab[7];
00097 
00098   b2[0x10] = b1[0x10] + b1[0x1F];
00099   b2[0x1F] = (b1[0x1F] - b1[0x10]) * costab[0];
00100   b2[0x11] = b1[0x11] + b1[0x1E];
00101   b2[0x1E] = (b1[0x1E] - b1[0x11]) * costab[1];
00102   b2[0x12] = b1[0x12] + b1[0x1D];
00103   b2[0x1D] = (b1[0x1D] - b1[0x12]) * costab[2];
00104   b2[0x13] = b1[0x13] + b1[0x1C];
00105   b2[0x1C] = (b1[0x1C] - b1[0x13]) * costab[3];
00106   b2[0x14] = b1[0x14] + b1[0x1B];
00107   b2[0x1B] = (b1[0x1B] - b1[0x14]) * costab[4];
00108   b2[0x15] = b1[0x15] + b1[0x1A];
00109   b2[0x1A] = (b1[0x1A] - b1[0x15]) * costab[5];
00110   b2[0x16] = b1[0x16] + b1[0x19];
00111   b2[0x19] = (b1[0x19] - b1[0x16]) * costab[6];
00112   b2[0x17] = b1[0x17] + b1[0x18];
00113   b2[0x18] = (b1[0x18] - b1[0x17]) * costab[7];
00114  }
00115 
00116  {
00117   real *costab = pnts[2];
00118 
00119   b1[0x00] = b2[0x00] + b2[0x07];
00120   b1[0x07] = (b2[0x00] - b2[0x07]) * costab[0];
00121   b1[0x01] = b2[0x01] + b2[0x06];
00122   b1[0x06] = (b2[0x01] - b2[0x06]) * costab[1];
00123   b1[0x02] = b2[0x02] + b2[0x05];
00124   b1[0x05] = (b2[0x02] - b2[0x05]) * costab[2];
00125   b1[0x03] = b2[0x03] + b2[0x04];
00126   b1[0x04] = (b2[0x03] - b2[0x04]) * costab[3];
00127 
00128   b1[0x08] = b2[0x08] + b2[0x0F];
00129   b1[0x0F] = (b2[0x0F] - b2[0x08]) * costab[0];
00130   b1[0x09] = b2[0x09] + b2[0x0E];
00131   b1[0x0E] = (b2[0x0E] - b2[0x09]) * costab[1];
00132   b1[0x0A] = b2[0x0A] + b2[0x0D];
00133   b1[0x0D] = (b2[0x0D] - b2[0x0A]) * costab[2];
00134   b1[0x0B] = b2[0x0B] + b2[0x0C];
00135   b1[0x0C] = (b2[0x0C] - b2[0x0B]) * costab[3];
00136 
00137   b1[0x10] = b2[0x10] + b2[0x17];
00138   b1[0x17] = (b2[0x10] - b2[0x17]) * costab[0];
00139   b1[0x11] = b2[0x11] + b2[0x16];
00140   b1[0x16] = (b2[0x11] - b2[0x16]) * costab[1];
00141   b1[0x12] = b2[0x12] + b2[0x15];
00142   b1[0x15] = (b2[0x12] - b2[0x15]) * costab[2];
00143   b1[0x13] = b2[0x13] + b2[0x14];
00144   b1[0x14] = (b2[0x13] - b2[0x14]) * costab[3];
00145 
00146   b1[0x18] = b2[0x18] + b2[0x1F];
00147   b1[0x1F] = (b2[0x1F] - b2[0x18]) * costab[0];
00148   b1[0x19] = b2[0x19] + b2[0x1E];
00149   b1[0x1E] = (b2[0x1E] - b2[0x19]) * costab[1];
00150   b1[0x1A] = b2[0x1A] + b2[0x1D];
00151   b1[0x1D] = (b2[0x1D] - b2[0x1A]) * costab[2];
00152   b1[0x1B] = b2[0x1B] + b2[0x1C];
00153   b1[0x1C] = (b2[0x1C] - b2[0x1B]) * costab[3];
00154  }
00155 
00156  {
00157   real const cos0 = pnts[3][0];
00158   real const cos1 = pnts[3][1];
00159 
00160   b2[0x00] = b1[0x00] + b1[0x03];
00161   b2[0x03] = (b1[0x00] - b1[0x03]) * cos0;
00162   b2[0x01] = b1[0x01] + b1[0x02];
00163   b2[0x02] = (b1[0x01] - b1[0x02]) * cos1;
00164 
00165   b2[0x04] = b1[0x04] + b1[0x07];
00166   b2[0x07] = (b1[0x07] - b1[0x04]) * cos0;
00167   b2[0x05] = b1[0x05] + b1[0x06];
00168   b2[0x06] = (b1[0x06] - b1[0x05]) * cos1;
00169 
00170   b2[0x08] = b1[0x08] + b1[0x0B];
00171   b2[0x0B] = (b1[0x08] - b1[0x0B]) * cos0;
00172   b2[0x09] = b1[0x09] + b1[0x0A];
00173   b2[0x0A] = (b1[0x09] - b1[0x0A]) * cos1;
00174   
00175   b2[0x0C] = b1[0x0C] + b1[0x0F];
00176   b2[0x0F] = (b1[0x0F] - b1[0x0C]) * cos0;
00177   b2[0x0D] = b1[0x0D] + b1[0x0E];
00178   b2[0x0E] = (b1[0x0E] - b1[0x0D]) * cos1;
00179 
00180   b2[0x10] = b1[0x10] + b1[0x13];
00181   b2[0x13] = (b1[0x10] - b1[0x13]) * cos0;
00182   b2[0x11] = b1[0x11] + b1[0x12];
00183   b2[0x12] = (b1[0x11] - b1[0x12]) * cos1;
00184 
00185   b2[0x14] = b1[0x14] + b1[0x17];
00186   b2[0x17] = (b1[0x17] - b1[0x14]) * cos0;
00187   b2[0x15] = b1[0x15] + b1[0x16];
00188   b2[0x16] = (b1[0x16] - b1[0x15]) * cos1;
00189 
00190   b2[0x18] = b1[0x18] + b1[0x1B];
00191   b2[0x1B] = (b1[0x18] - b1[0x1B]) * cos0;
00192   b2[0x19] = b1[0x19] + b1[0x1A];
00193   b2[0x1A] = (b1[0x19] - b1[0x1A]) * cos1;
00194 
00195   b2[0x1C] = b1[0x1C] + b1[0x1F];
00196   b2[0x1F] = (b1[0x1F] - b1[0x1C]) * cos0;
00197   b2[0x1D] = b1[0x1D] + b1[0x1E];
00198   b2[0x1E] = (b1[0x1E] - b1[0x1D]) * cos1;
00199  }
00200 
00201  {
00202   real const cos0 = pnts[4][0];
00203 
00204   b1[0x00] = b2[0x00] + b2[0x01];
00205   b1[0x01] = (b2[0x00] - b2[0x01]) * cos0;
00206   b1[0x02] = b2[0x02] + b2[0x03];
00207   b1[0x03] = (b2[0x03] - b2[0x02]) * cos0;
00208   b1[0x02] += b1[0x03];
00209 
00210   b1[0x04] = b2[0x04] + b2[0x05];
00211   b1[0x05] = (b2[0x04] - b2[0x05]) * cos0;
00212   b1[0x06] = b2[0x06] + b2[0x07];
00213   b1[0x07] = (b2[0x07] - b2[0x06]) * cos0;
00214   b1[0x06] += b1[0x07];
00215   b1[0x04] += b1[0x06];
00216   b1[0x06] += b1[0x05];
00217   b1[0x05] += b1[0x07];
00218 
00219   b1[0x08] = b2[0x08] + b2[0x09];
00220   b1[0x09] = (b2[0x08] - b2[0x09]) * cos0;
00221   b1[0x0A] = b2[0x0A] + b2[0x0B];
00222   b1[0x0B] = (b2[0x0B] - b2[0x0A]) * cos0;
00223   b1[0x0A] += b1[0x0B];
00224 
00225   b1[0x0C] = b2[0x0C] + b2[0x0D];
00226   b1[0x0D] = (b2[0x0C] - b2[0x0D]) * cos0;
00227   b1[0x0E] = b2[0x0E] + b2[0x0F];
00228   b1[0x0F] = (b2[0x0F] - b2[0x0E]) * cos0;
00229   b1[0x0E] += b1[0x0F];
00230   b1[0x0C] += b1[0x0E];
00231   b1[0x0E] += b1[0x0D];
00232   b1[0x0D] += b1[0x0F];
00233 
00234   b1[0x10] = b2[0x10] + b2[0x11];
00235   b1[0x11] = (b2[0x10] - b2[0x11]) * cos0;
00236   b1[0x12] = b2[0x12] + b2[0x13];
00237   b1[0x13] = (b2[0x13] - b2[0x12]) * cos0;
00238   b1[0x12] += b1[0x13];
00239 
00240   b1[0x14] = b2[0x14] + b2[0x15];
00241   b1[0x15] = (b2[0x14] - b2[0x15]) * cos0;
00242   b1[0x16] = b2[0x16] + b2[0x17];
00243   b1[0x17] = (b2[0x17] - b2[0x16]) * cos0;
00244   b1[0x16] += b1[0x17];
00245   b1[0x14] += b1[0x16];
00246   b1[0x16] += b1[0x15];
00247   b1[0x15] += b1[0x17];
00248 
00249   b1[0x18] = b2[0x18] + b2[0x19];
00250   b1[0x19] = (b2[0x18] - b2[0x19]) * cos0;
00251   b1[0x1A] = b2[0x1A] + b2[0x1B];
00252   b1[0x1B] = (b2[0x1B] - b2[0x1A]) * cos0;
00253   b1[0x1A] += b1[0x1B];
00254 
00255   b1[0x1C] = b2[0x1C] + b2[0x1D];
00256   b1[0x1D] = (b2[0x1C] - b2[0x1D]) * cos0;
00257   b1[0x1E] = b2[0x1E] + b2[0x1F];
00258   b1[0x1F] = (b2[0x1F] - b2[0x1E]) * cos0;
00259   b1[0x1E] += b1[0x1F];
00260   b1[0x1C] += b1[0x1E];
00261   b1[0x1E] += b1[0x1D];
00262   b1[0x1D] += b1[0x1F];
00263  }
00264 
00265  out0[0x10*16] = b1[0x00];
00266  out0[0x10*12] = b1[0x04];
00267  out0[0x10* 8] = b1[0x02];
00268  out0[0x10* 4] = b1[0x06];
00269  out0[0x10* 0] = b1[0x01];
00270  out1[0x10* 0] = b1[0x01];
00271  out1[0x10* 4] = b1[0x05];
00272  out1[0x10* 8] = b1[0x03];
00273  out1[0x10*12] = b1[0x07];
00274 
00275  b1[0x08] += b1[0x0C];
00276  out0[0x10*14] = b1[0x08];
00277  b1[0x0C] += b1[0x0a];
00278  out0[0x10*10] = b1[0x0C];
00279  b1[0x0A] += b1[0x0E];
00280  out0[0x10* 6] = b1[0x0A];
00281  b1[0x0E] += b1[0x09];
00282  out0[0x10* 2] = b1[0x0E];
00283  b1[0x09] += b1[0x0D];
00284  out1[0x10* 2] = b1[0x09];
00285  b1[0x0D] += b1[0x0B];
00286  out1[0x10* 6] = b1[0x0D];
00287  b1[0x0B] += b1[0x0F];
00288  out1[0x10*10] = b1[0x0B];
00289  out1[0x10*14] = b1[0x0F];
00290 
00291  b1[0x18] += b1[0x1C];
00292  out0[0x10*15] = b1[0x10] + b1[0x18];
00293  out0[0x10*13] = b1[0x18] + b1[0x14];
00294  b1[0x1C] += b1[0x1a];
00295  out0[0x10*11] = b1[0x14] + b1[0x1C];
00296  out0[0x10* 9] = b1[0x1C] + b1[0x12];
00297  b1[0x1A] += b1[0x1E];
00298  out0[0x10* 7] = b1[0x12] + b1[0x1A];
00299  out0[0x10* 5] = b1[0x1A] + b1[0x16];
00300  b1[0x1E] += b1[0x19];
00301  out0[0x10* 3] = b1[0x16] + b1[0x1E];
00302  out0[0x10* 1] = b1[0x1E] + b1[0x11];
00303  b1[0x19] += b1[0x1D];
00304  out1[0x10* 1] = b1[0x11] + b1[0x19];
00305  out1[0x10* 3] = b1[0x19] + b1[0x15];
00306  b1[0x1D] += b1[0x1B];
00307  out1[0x10* 5] = b1[0x15] + b1[0x1D];
00308  out1[0x10* 7] = b1[0x1D] + b1[0x13];
00309  b1[0x1B] += b1[0x1F];
00310  out1[0x10* 9] = b1[0x13] + b1[0x1B];
00311  out1[0x10*11] = b1[0x1B] + b1[0x17];
00312  out1[0x10*13] = b1[0x17] + b1[0x1F];
00313  out1[0x10*15] = b1[0x1F];
00314 }
00315 
00316 /*
00317  * the call via dct64 is a trick to force GCC to use
00318  * (new) registers for the b1,b2 pointer to the bufs[xx] field
00319  */
00320 void dct64( real *a,real *b,real *c)
00321 {
00322   real bufs[0x40];
00323   dct64_1(a,b,bufs,bufs+0x20,c);
00324 }
00325 

Generated on Sun Dec 2 11:34:21 2007 for LAME by  doxygen 1.5.2