ReactOS Fundraising Campaign 2012
 
€ 4,410 / € 30,000

Information | Donate

Home | Info | Community | Development | myReactOS | Contact Us

  1. Home
  2. Community
  3. Development
  4. myReactOS
  5. Fundraiser 2012

  1. Main Page
  2. Alphabetical List
  3. Data Structures
  4. Directories
  5. File List
  6. Data Fields
  7. Globals
  8. Related Pages

ReactOS Development > Doxygen

dct64_i486.c
Go to the documentation of this file.
00001 /*
00002     dct64_i486.c: DCT64, a plain C variant for i486
00003 
00004     copyright 1998-2006 by the mpg123 project - free software under the terms of the LGPL 2.1
00005     see COPYING and AUTHORS files in distribution or http://mpg123.org
00006     initially written by Fabrice Bellard
00007 */
00008 
00009 /* Discrete Cosine Tansform (DCT) for subband synthesis.
00010  *
00011  * This code is optimized for 80486. It should be compiled with gcc
00012  * 2.7.2 or higher.
00013  *
00014  * Note: This code does not give the necessary accuracy. Moreover, no
00015  * overflow test are done.
00016  *
00017  * (c) 1998 Fabrice Bellard.  
00018  */
00019 
00020 #include "mpg123lib_intern.h"
00021 
00022 #define COS_0_0 16403
00023 #define COS_0_1 16563
00024 #define COS_0_2 16890
00025 #define COS_0_3 17401
00026 #define COS_0_4 18124
00027 #define COS_0_5 19101
00028 #define COS_0_6 20398
00029 #define COS_0_7 22112
00030 #define COS_0_8 24396
00031 #define COS_0_9 27503
00032 #define COS_0_10 31869
00033 #define COS_0_11 38320
00034 #define COS_0_12 48633
00035 #define COS_0_13 67429
00036 #define COS_0_14 111660
00037 #define COS_0_15 333906
00038 #define COS_1_0 16463
00039 #define COS_1_1 17121
00040 #define COS_1_2 18577
00041 #define COS_1_3 21195
00042 #define COS_1_4 25826
00043 #define COS_1_5 34756
00044 #define COS_1_6 56441
00045 #define COS_1_7 167154
00046 #define COS_2_0 16704
00047 #define COS_2_1 19704
00048 #define COS_2_2 29490
00049 #define COS_2_3 83981
00050 #define COS_3_0 17733
00051 #define COS_3_1 42813
00052 #define COS_4_0 23170         
00053 
00054 #define SETOUT(out,n,expr) out[FIR_BUFFER_SIZE*(n)]=(expr)
00055 #define MULL(a,b) (((long long)(a)*(long long)(b)) >> 15)
00056 #define MUL(a,b) \
00057 (\
00058        ((!(b & 0x3F)) ? (((a)*(b >> 6)) >> 9) :\
00059        ((!(b & 0x1F)) ? (((a)*(b >> 5)) >> 10) :\
00060        ((!(b & 0x0F)) ? (((a)*(b >> 4)) >> 11) :\
00061        ((!(b & 0x07)) ? (((a)*(b >> 3)) >> 12) :\
00062        ((!(b & 0x03)) ? (((a)*(b >> 2)) >> 13) :\
00063        ((!(b & 0x01)) ? (((a)*(b >> 1)) >> 14) :\
00064                         (((a)*(b   )) >> 15))))))))
00065 
00066 
00067 void dct64_1_486(int *out0,int *out1,int *b1,int *b2)
00068 {
00069   b1[0x00] = b2[0x00] + b2[0x1F];
00070   b1[0x1F] = MUL((b2[0x00] - b2[0x1F]),COS_0_0);
00071 
00072   b1[0x01] = b2[0x01] + b2[0x1E];
00073   b1[0x1E] = MUL((b2[0x01] - b2[0x1E]),COS_0_1);
00074 
00075   b1[0x02] = b2[0x02] + b2[0x1D];
00076   b1[0x1D] = MUL((b2[0x02] - b2[0x1D]),COS_0_2);
00077 
00078   b1[0x03] = b2[0x03] + b2[0x1C];
00079   b1[0x1C] = MUL((b2[0x03] - b2[0x1C]),COS_0_3);
00080 
00081   b1[0x04] = b2[0x04] + b2[0x1B];
00082   b1[0x1B] = MUL((b2[0x04] - b2[0x1B]),COS_0_4);
00083 
00084   b1[0x05] = b2[0x05] + b2[0x1A];
00085   b1[0x1A] = MUL((b2[0x05] - b2[0x1A]),COS_0_5);
00086 
00087   b1[0x06] = b2[0x06] + b2[0x19];
00088   b1[0x19] = MUL((b2[0x06] - b2[0x19]),COS_0_6);
00089 
00090   b1[0x07] = b2[0x07] + b2[0x18];
00091   b1[0x18] = MUL((b2[0x07] - b2[0x18]),COS_0_7);
00092 
00093   b1[0x08] = b2[0x08] + b2[0x17];
00094   b1[0x17] = MUL((b2[0x08] - b2[0x17]),COS_0_8);
00095 
00096   b1[0x09] = b2[0x09] + b2[0x16];
00097   b1[0x16] = MUL((b2[0x09] - b2[0x16]),COS_0_9);
00098 
00099   b1[0x0A] = b2[0x0A] + b2[0x15];
00100   b1[0x15] = MUL((b2[0x0A] - b2[0x15]),COS_0_10);
00101 
00102   b1[0x0B] = b2[0x0B] + b2[0x14];
00103   b1[0x14] = MUL((b2[0x0B] - b2[0x14]),COS_0_11);
00104 
00105   b1[0x0C] = b2[0x0C] + b2[0x13];
00106   b1[0x13] = MUL((b2[0x0C] - b2[0x13]),COS_0_12);
00107 
00108   b1[0x0D] = b2[0x0D] + b2[0x12];
00109   b1[0x12] = MULL((b2[0x0D] - b2[0x12]),COS_0_13);
00110 
00111   b1[0x0E] = b2[0x0E] + b2[0x11];
00112   b1[0x11] = MULL((b2[0x0E] - b2[0x11]),COS_0_14);
00113 
00114   b1[0x0F] = b2[0x0F] + b2[0x10];
00115   b1[0x10] = MULL((b2[0x0F] - b2[0x10]),COS_0_15);
00116 
00117 
00118   b2[0x00] = b1[0x00] + b1[0x0F]; 
00119   b2[0x0F] = MUL((b1[0x00] - b1[0x0F]),COS_1_0);
00120   b2[0x01] = b1[0x01] + b1[0x0E]; 
00121   b2[0x0E] = MUL((b1[0x01] - b1[0x0E]),COS_1_1);
00122   b2[0x02] = b1[0x02] + b1[0x0D]; 
00123   b2[0x0D] = MUL((b1[0x02] - b1[0x0D]),COS_1_2);
00124   b2[0x03] = b1[0x03] + b1[0x0C]; 
00125   b2[0x0C] = MUL((b1[0x03] - b1[0x0C]),COS_1_3);
00126   b2[0x04] = b1[0x04] + b1[0x0B]; 
00127   b2[0x0B] = MUL((b1[0x04] - b1[0x0B]),COS_1_4);
00128   b2[0x05] = b1[0x05] + b1[0x0A]; 
00129   b2[0x0A] = MUL((b1[0x05] - b1[0x0A]),COS_1_5);
00130   b2[0x06] = b1[0x06] + b1[0x09]; 
00131   b2[0x09] = MUL((b1[0x06] - b1[0x09]),COS_1_6);
00132   b2[0x07] = b1[0x07] + b1[0x08]; 
00133   b2[0x08] = MULL((b1[0x07] - b1[0x08]),COS_1_7);
00134 
00135   b2[0x10] = b1[0x10] + b1[0x1F];
00136   b2[0x1F] = MUL((b1[0x1F] - b1[0x10]),COS_1_0);
00137   b2[0x11] = b1[0x11] + b1[0x1E];
00138   b2[0x1E] = MUL((b1[0x1E] - b1[0x11]),COS_1_1);
00139   b2[0x12] = b1[0x12] + b1[0x1D];
00140   b2[0x1D] = MUL((b1[0x1D] - b1[0x12]),COS_1_2);
00141   b2[0x13] = b1[0x13] + b1[0x1C];
00142   b2[0x1C] = MUL((b1[0x1C] - b1[0x13]),COS_1_3);
00143   b2[0x14] = b1[0x14] + b1[0x1B];
00144   b2[0x1B] = MUL((b1[0x1B] - b1[0x14]),COS_1_4);
00145   b2[0x15] = b1[0x15] + b1[0x1A];
00146   b2[0x1A] = MUL((b1[0x1A] - b1[0x15]),COS_1_5);
00147   b2[0x16] = b1[0x16] + b1[0x19];
00148   b2[0x19] = MUL((b1[0x19] - b1[0x16]),COS_1_6);
00149   b2[0x17] = b1[0x17] + b1[0x18];
00150   b2[0x18] = MULL((b1[0x18] - b1[0x17]),COS_1_7);
00151 
00152 
00153   b1[0x00] = b2[0x00] + b2[0x07];
00154   b1[0x07] = MUL((b2[0x00] - b2[0x07]),COS_2_0);
00155   b1[0x01] = b2[0x01] + b2[0x06];
00156   b1[0x06] = MUL((b2[0x01] - b2[0x06]),COS_2_1);
00157   b1[0x02] = b2[0x02] + b2[0x05];
00158   b1[0x05] = MUL((b2[0x02] - b2[0x05]),COS_2_2);
00159   b1[0x03] = b2[0x03] + b2[0x04];
00160   b1[0x04] = MULL((b2[0x03] - b2[0x04]),COS_2_3);
00161 
00162   b1[0x08] = b2[0x08] + b2[0x0F];
00163   b1[0x0F] = MUL((b2[0x0F] - b2[0x08]),COS_2_0);
00164   b1[0x09] = b2[0x09] + b2[0x0E];
00165   b1[0x0E] = MUL((b2[0x0E] - b2[0x09]),COS_2_1);
00166   b1[0x0A] = b2[0x0A] + b2[0x0D];
00167   b1[0x0D] = MUL((b2[0x0D] - b2[0x0A]),COS_2_2);
00168   b1[0x0B] = b2[0x0B] + b2[0x0C];
00169   b1[0x0C] = MULL((b2[0x0C] - b2[0x0B]),COS_2_3);
00170 
00171   b1[0x10] = b2[0x10] + b2[0x17];
00172   b1[0x17] = MUL((b2[0x10] - b2[0x17]),COS_2_0);
00173   b1[0x11] = b2[0x11] + b2[0x16];
00174   b1[0x16] = MUL((b2[0x11] - b2[0x16]),COS_2_1);
00175   b1[0x12] = b2[0x12] + b2[0x15];
00176   b1[0x15] = MUL((b2[0x12] - b2[0x15]),COS_2_2);
00177   b1[0x13] = b2[0x13] + b2[0x14];
00178   b1[0x14] = MULL((b2[0x13] - b2[0x14]),COS_2_3);
00179 
00180   b1[0x18] = b2[0x18] + b2[0x1F];
00181   b1[0x1F] = MUL((b2[0x1F] - b2[0x18]),COS_2_0);
00182   b1[0x19] = b2[0x19] + b2[0x1E];
00183   b1[0x1E] = MUL((b2[0x1E] - b2[0x19]),COS_2_1);
00184   b1[0x1A] = b2[0x1A] + b2[0x1D];
00185   b1[0x1D] = MUL((b2[0x1D] - b2[0x1A]),COS_2_2);
00186   b1[0x1B] = b2[0x1B] + b2[0x1C];
00187   b1[0x1C] = MULL((b2[0x1C] - b2[0x1B]),COS_2_3);
00188 
00189 
00190   b2[0x00] = b1[0x00] + b1[0x03];
00191   b2[0x03] = MUL((b1[0x00] - b1[0x03]),COS_3_0);
00192   b2[0x01] = b1[0x01] + b1[0x02];
00193   b2[0x02] = MUL((b1[0x01] - b1[0x02]),COS_3_1);
00194 
00195   b2[0x04] = b1[0x04] + b1[0x07];
00196   b2[0x07] = MUL((b1[0x07] - b1[0x04]),COS_3_0);
00197   b2[0x05] = b1[0x05] + b1[0x06];
00198   b2[0x06] = MUL((b1[0x06] - b1[0x05]),COS_3_1);
00199 
00200   b2[0x08] = b1[0x08] + b1[0x0B];
00201   b2[0x0B] = MUL((b1[0x08] - b1[0x0B]),COS_3_0);
00202   b2[0x09] = b1[0x09] + b1[0x0A];
00203   b2[0x0A] = MUL((b1[0x09] - b1[0x0A]),COS_3_1);
00204   
00205   b2[0x0C] = b1[0x0C] + b1[0x0F];
00206   b2[0x0F] = MUL((b1[0x0F] - b1[0x0C]),COS_3_0);
00207   b2[0x0D] = b1[0x0D] + b1[0x0E];
00208   b2[0x0E] = MUL((b1[0x0E] - b1[0x0D]),COS_3_1);
00209 
00210   b2[0x10] = b1[0x10] + b1[0x13];
00211   b2[0x13] = MUL((b1[0x10] - b1[0x13]),COS_3_0);
00212   b2[0x11] = b1[0x11] + b1[0x12];
00213   b2[0x12] = MUL((b1[0x11] - b1[0x12]),COS_3_1);
00214 
00215   b2[0x14] = b1[0x14] + b1[0x17];
00216   b2[0x17] = MUL((b1[0x17] - b1[0x14]),COS_3_0);
00217   b2[0x15] = b1[0x15] + b1[0x16];
00218   b2[0x16] = MUL((b1[0x16] - b1[0x15]),COS_3_1);
00219 
00220   b2[0x18] = b1[0x18] + b1[0x1B];
00221   b2[0x1B] = MUL((b1[0x18] - b1[0x1B]),COS_3_0);
00222   b2[0x19] = b1[0x19] + b1[0x1A];
00223   b2[0x1A] = MUL((b1[0x19] - b1[0x1A]),COS_3_1);
00224 
00225   b2[0x1C] = b1[0x1C] + b1[0x1F];
00226   b2[0x1F] = MUL((b1[0x1F] - b1[0x1C]),COS_3_0);
00227   b2[0x1D] = b1[0x1D] + b1[0x1E];
00228   b2[0x1E] = MUL((b1[0x1E] - b1[0x1D]),COS_3_1);
00229 
00230   {
00231     int i;
00232     for(i=0;i<32;i+=4) {
00233       b1[i+0x00] = b2[i+0x00] + b2[i+0x01];
00234       b1[i+0x01] = MUL((b2[i+0x00] - b2[i+0x01]),COS_4_0);
00235       b1[i+0x02] = b2[i+0x02] + b2[i+0x03];
00236       b1[i+0x03] = MUL((b2[i+0x03] - b2[i+0x02]),COS_4_0);
00237     }
00238   }
00239 
00240   b1[0x02] += b1[0x03];
00241   b1[0x06] += b1[0x07];
00242   b1[0x04] += b1[0x06];
00243   b1[0x06] += b1[0x05];
00244   b1[0x05] += b1[0x07];
00245 
00246   b1[0x0A] += b1[0x0B];
00247   b1[0x0E] += b1[0x0F];
00248   b1[0x0C] += b1[0x0E];
00249   b1[0x0E] += b1[0x0D];
00250   b1[0x0D] += b1[0x0F];
00251 
00252   b1[0x12] += b1[0x13];
00253   b1[0x16] += b1[0x17];
00254   b1[0x14] += b1[0x16];
00255   b1[0x16] += b1[0x15];
00256   b1[0x15] += b1[0x17];
00257 
00258   b1[0x1A] += b1[0x1B];
00259   b1[0x1E] += b1[0x1F];
00260   b1[0x1C] += b1[0x1E];
00261   b1[0x1E] += b1[0x1D];
00262   b1[0x1D] += b1[0x1F];
00263 
00264  SETOUT(out0,16,b1[0x00]);
00265  SETOUT(out0,12,b1[0x04]);
00266  SETOUT(out0, 8,b1[0x02]);
00267  SETOUT(out0, 4,b1[0x06]);
00268  SETOUT(out0, 0,b1[0x01]);
00269  SETOUT(out1, 0,b1[0x01]);
00270  SETOUT(out1, 4,b1[0x05]);
00271  SETOUT(out1, 8,b1[0x03]);
00272  SETOUT(out1,12,b1[0x07]);
00273 
00274  b1[0x08] += b1[0x0C];
00275  SETOUT(out0,14,b1[0x08]);
00276  b1[0x0C] += b1[0x0a];
00277  SETOUT(out0,10,b1[0x0C]);
00278  b1[0x0A] += b1[0x0E];
00279  SETOUT(out0, 6,b1[0x0A]);
00280  b1[0x0E] += b1[0x09];
00281  SETOUT(out0, 2,b1[0x0E]);
00282  b1[0x09] += b1[0x0D];
00283  SETOUT(out1, 2,b1[0x09]);
00284  b1[0x0D] += b1[0x0B];
00285  SETOUT(out1, 6,b1[0x0D]);
00286  b1[0x0B] += b1[0x0F];
00287  SETOUT(out1,10,b1[0x0B]);
00288  SETOUT(out1,14,b1[0x0F]);
00289 
00290  b1[0x18] += b1[0x1C];
00291  SETOUT(out0,15,b1[0x10] + b1[0x18]);
00292  SETOUT(out0,13,b1[0x18] + b1[0x14]);
00293  b1[0x1C] += b1[0x1a];
00294  SETOUT(out0,11,b1[0x14] + b1[0x1C]);
00295  SETOUT(out0, 9,b1[0x1C] + b1[0x12]);
00296  b1[0x1A] += b1[0x1E];
00297  SETOUT(out0, 7,b1[0x12] + b1[0x1A]);
00298  SETOUT(out0, 5,b1[0x1A] + b1[0x16]);
00299  b1[0x1E] += b1[0x19];
00300  SETOUT(out0, 3,b1[0x16] + b1[0x1E]);
00301  SETOUT(out0, 1,b1[0x1E] + b1[0x11]);
00302  b1[0x19] += b1[0x1D];
00303  SETOUT(out1, 1,b1[0x11] + b1[0x19]);
00304  SETOUT(out1, 3,b1[0x19] + b1[0x15]);
00305  b1[0x1D] += b1[0x1B];
00306  SETOUT(out1, 5,b1[0x15] + b1[0x1D]);
00307  SETOUT(out1, 7,b1[0x1D] + b1[0x13]);
00308  b1[0x1B] += b1[0x1F];
00309  SETOUT(out1, 9,b1[0x13] + b1[0x1B]);
00310  SETOUT(out1,11,b1[0x1B] + b1[0x17]);
00311  SETOUT(out1,13,b1[0x17] + b1[0x1F]);
00312  SETOUT(out1,15,b1[0x1F]);
00313 }
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_i486(int *a,int *b,real *samples)
00321 {
00322   int bufs[64];
00323   int i;
00324 
00325 #ifdef REAL_IS_FIXED  
00326 #define TOINT(a) ((a) * 32768 / (int)REAL_FACTOR)
00327 
00328   for(i=0;i<32;i++) {
00329     bufs[i]=TOINT(samples[i]);
00330   }
00331 #else      
00332   int *p = bufs;
00333   register double const scale = ((65536.0 * 32) + 1) * 65536.0;
00334   
00335   for(i=0;i<32;i++) {
00336     *((double *) (p++)) = scale + *samples++; /* beware on bufs overrun: 8B store from x87 */
00337   }
00338 #endif
00339   
00340   dct64_1_486(a,b,bufs+32,bufs);
00341 }
00342 

Generated on Sun May 27 2012 04:34:09 for ReactOS by doxygen 1.7.6.1

ReactOS is a registered trademark or a trademark of ReactOS Foundation in the United States and other countries.