home *** CD-ROM | disk | FTP | other *** search
/ PC Welt 2004 March / PCWELT_3_2004.ISO / pcwsoft / flaskmpeg_078_39_src.z.exe / flaskmpeg / Audio / MPEG / polyphase.cpp < prev    next >
Encoding:
C/C++ Source or Header  |  2002-10-28  |  62.4 KB  |  2,097 lines

  1. #include <math.h>
  2. #include <string.h>
  3. #include <crtdbg.h>
  4. #include <stdio.h>
  5.  
  6. #include "AMPDecoder.h"
  7.  
  8. #define USE_ASM
  9.  
  10.  
  11. static float wincoef[16][32] =
  12. {                /* window coefs */
  13.     {
  14.         0.000000000f, 0.000442505f, -0.003250122f, 0.007003784f,
  15.         -0.031082151f, 0.078628540f, -0.100311279f, 0.572036743f,
  16.         -1.144989014f, -0.572036743f, -0.100311279f, -0.078628540f,
  17.         -0.031082151f, -0.007003784f, -0.003250122f, -0.000442505f,
  18.     },{
  19.         0.000015259f, 0.000473022f, -0.003326416f, 0.007919312f,
  20.         -0.030517576f, 0.084182739f, -0.090927124f, 0.600219727f,
  21.         -1.144287109f, -0.543823242f, -0.108856201f, -0.073059082f,
  22.         -0.031478882f, -0.006118774f, -0.003173828f, -0.000396729f,
  23.     },{
  24.         0.000015259f, 0.000534058f, -0.003387451f, 0.008865356f,
  25.         -0.029785154f, 0.089706421f, -0.080688477f, 0.628295898f,
  26.         -1.142211914f, -0.515609741f, -0.116577141f, -0.067520142f,
  27.         -0.031738281f, -0.005294800f, -0.003082275f, -0.000366211f,
  28.     },{
  29.         0.000015259f, 0.000579834f, -0.003433228f, 0.009841919f,
  30.         -0.028884888f, 0.095169067f, -0.069595337f, 0.656219482f,
  31.         -1.138763428f, -0.487472534f, -0.123474121f, -0.061996460f,
  32.         -0.031845093f, -0.004486084f, -0.002990723f, -0.000320435f,
  33.     },{
  34.         0.000015259f, 0.000625610f, -0.003463745f, 0.010848999f,
  35.         -0.027801514f, 0.100540161f, -0.057617184f, 0.683914185f,
  36.         -1.133926392f, -0.459472656f, -0.129577637f, -0.056533810f,
  37.         -0.031814575f, -0.003723145f, -0.002899170f, -0.000289917f,
  38.     },{
  39.         0.000015259f, 0.000686646f, -0.003479004f, 0.011886597f,
  40.         -0.026535034f, 0.105819702f, -0.044784546f, 0.711318970f,
  41.         -1.127746582f, -0.431655884f, -0.134887695f, -0.051132202f,
  42.         -0.031661987f, -0.003005981f, -0.002792358f, -0.000259399f,
  43.     },{
  44.         0.000015259f, 0.000747681f, -0.003479004f, 0.012939452f,
  45.         -0.025085449f, 0.110946655f, -0.031082151f, 0.738372803f,
  46.         -1.120223999f, -0.404083252f, -0.139450073f, -0.045837402f,
  47.         -0.031387329f, -0.002334595f, -0.002685547f, -0.000244141f,
  48.     },{
  49.         0.000030518f, 0.000808716f, -0.003463745f, 0.014022826f,
  50.         -0.023422241f, 0.115921021f, -0.016510010f, 0.765029907f,
  51.         -1.111373901f, -0.376800537f, -0.143264771f, -0.040634155f,
  52.         -0.031005858f, -0.001693726f, -0.002578735f, -0.000213623f,
  53.     },{
  54.         0.000030518f, 0.000885010f, -0.003417969f, 0.015121460f,
  55.         -0.021575928f, 0.120697014f, -0.001068115f, 0.791213989f,
  56.         -1.101211548f, -0.349868774f, -0.146362305f, -0.035552979f,
  57.         -0.030532837f, -0.001098633f, -0.002456665f, -0.000198364f,
  58.     },{
  59.         0.000030518f, 0.000961304f, -0.003372192f, 0.016235352f,
  60.         -0.019531250f, 0.125259399f, 0.015228271f, 0.816864014f,
  61.         -1.089782715f, -0.323318481f, -0.148773193f, -0.030609131f,
  62.         -0.029937742f, -0.000549316f, -0.002349854f, -0.000167847f,
  63.     },{
  64.         0.000030518f, 0.001037598f, -0.003280640f, 0.017349243f,
  65.         -0.017257690f, 0.129562378f, 0.032379150f, 0.841949463f,
  66.         -1.077117920f, -0.297210693f, -0.150497437f, -0.025817871f,
  67.         -0.029281614f, -0.000030518f, -0.002243042f, -0.000152588f,
  68.     },{
  69.         0.000045776f, 0.001113892f, -0.003173828f, 0.018463135f,
  70.         -0.014801024f, 0.133590698f, 0.050354004f, 0.866363525f,
  71.         -1.063217163f, -0.271591187f, -0.151596069f, -0.021179199f,
  72.         -0.028533936f, 0.000442505f, -0.002120972f, -0.000137329f,
  73.     },{
  74.         0.000045776f, 0.001205444f, -0.003051758f, 0.019577026f,
  75.         -0.012115479f, 0.137298584f, 0.069168091f, 0.890090942f,
  76.         -1.048156738f, -0.246505737f, -0.152069092f, -0.016708374f,
  77.         -0.027725220f, 0.000869751f, -0.002014160f, -0.000122070f,
  78.     },{
  79.         0.000061035f, 0.001296997f, -0.002883911f, 0.020690918f,
  80.         -0.009231566f, 0.140670776f, 0.088775635f, 0.913055420f,
  81.         -1.031936646f, -0.221984863f, -0.151962280f, -0.012420653f,
  82.         -0.026840210f, 0.001266479f, -0.001907349f, -0.000106812f,
  83.     },{
  84.         0.000061035f, 0.001388550f, -0.002700806f, 0.021789551f,
  85.         -0.006134033f, 0.143676758f, 0.109161377f, 0.935195923f,
  86.         -1.014617920f, -0.198059082f, -0.151306152f, -0.008316040f,
  87.         -0.025909424f, 0.001617432f, -0.001785278f, -0.000106812f,
  88.     },{
  89.         0.000076294f, 0.001480103f, -0.002487183f, 0.022857666f,
  90.         -0.002822876f, 0.146255493f, 0.130310059f, 0.956481934f,
  91.         -0.996246338f, -0.174789429f, -0.150115967f, -0.004394531f,
  92.         -0.024932859f, 0.001937866f, -0.001693726f, -0.000091553f,
  93.     }
  94. };
  95.  
  96. static const float wincoef2[]={
  97.     -0.001586914f, -0.023910521f, -0.148422241f, -0.976852417f,
  98.     0.152206421f, 0.000686646f, -0.002227783f, 0.000076294f,
  99. };
  100.  
  101. static const float coef32[31]={    /* 32 pt dct coefs */
  102.     .5006029983604062f,
  103.     .5054709610427671f,
  104.     .5154473132093669f,
  105.     .5310425978615345f,
  106.     .553103908021273f,
  107.     .5829349877738026f,
  108.     .6225041535926976f,
  109.     .674808388163145f,
  110.     .7445363421017894f,
  111.     .8393497548926808f,
  112.     .9725684113484575f,
  113.     1.16944022296938f,
  114.     1.484165144274385f,
  115.     2.057782139240278f,
  116.     3.407611810249888f,
  117.     10.19004086100494f,
  118.     .5024192866920285f,
  119.     .5224986197814337f,
  120.     .5669440502448403f,
  121.     .6468218211965951f,
  122.     .7881547114622637f,
  123.     1.060677908257709f,
  124.     1.722447849872342f,
  125.     5.101156529442028f,
  126.     .5097955811692735f,
  127.     .6013449114834756f,
  128.     .8999763602860835f,
  129.     2.562917284521227f,
  130.     .5411961092767109f,
  131.     1.306563350304716f,
  132.     .7071068387877132f,
  133. };
  134.  
  135. static void __inline forward_bf(int m, int n, const float x[], float f[], const float coef[])
  136. {
  137.     int j, n2;
  138.     int p, q, p0;
  139.     
  140.     n2 = n >> 1;
  141.     for (p0 = 0; p0 < 32; p0 += n) {
  142.         p = p0;
  143.         q = p + n - 1;
  144.         for (j = 0; j < n2; j++, p++, q--)
  145.         {
  146.             f[p] = x[p] + x[q];
  147.             f[n2 + p] = coef[j] * (x[p] - x[q]);
  148.         }
  149.     }
  150. }
  151. /*------------------------------------------------------------*/
  152. static void __inline back_bf(int m, int n, const float x[], float f[])
  153. {
  154.     int j, n2, n21;
  155.     int p, q, p0;
  156.     
  157.     n2 = n >> 1;
  158.     n21 = n2 - 1;
  159.     for (p0 = 0; p0 < 32; p0 += n) {
  160.         p = p0;
  161.         q = p0;
  162.         for (j = 0; j < n2; j++, p += 2, q++)
  163.             f[p] = x[q];
  164.         p = p0 + 1;
  165.         for (j = 0; j < n21; j++, p += 2, q++)
  166.             f[p] = x[q] + x[q + 1];
  167.         f[p] = x[q];
  168.     }
  169. }
  170. /*------------------------------------------------------------*/
  171.  
  172. void fdct32(float x[], float c[], bool odd, bool invert_odd)
  173. {
  174.     float a[32];            /* ping pong buffers */
  175.     float b[32];
  176.     int p, q;
  177.  
  178.     // special first stage
  179.     // forward_bf(2, 16, a, b, coef32 + 16);
  180.  
  181.     if (invert_odd) {
  182.         q = 15;
  183.         for(p = 0; p < 8; p+=2, q-=2) {
  184.             double a1, a2, a3, a4;
  185.  
  186.             // p: normal, q:inverted.
  187.  
  188.             a1 =  x[p] - x[16+q];
  189.             a2 = -x[q] + x[16+p];
  190.             a3 = (x[p] + x[16+q]) * coef32[p];
  191.             a4 = (-x[q] - x[16+p]) * coef32[q];
  192.  
  193.             b[p   ] =  a1 + a2;
  194.             b[p+ 8] = (a1 - a2) * coef32[16+p];
  195.             b[p+16] =  a3 + a4;
  196.             b[p+24] = (a3 - a4) * coef32[16+p];
  197.  
  198.             // p: inverted, q: normal.
  199.  
  200.             a1 = -x[p+1] + x[15+q];
  201.             a2 =  x[q-1] - x[17+p];
  202.             a3 = (-x[p+1] - x[15+q]) * coef32[p+1];
  203.             a4 = (x[q-1] + x[17+p]) * coef32[q-1];
  204.  
  205.             b[p+ 1] =  a1 + a2;
  206.             b[p+ 9] = (a1 - a2) * coef32[17+p];
  207.             b[p+17] =  a3 + a4;
  208.             b[p+25] = (a3 - a4) * coef32[17+p];
  209.         }
  210.     } else {
  211.         q = 15;
  212.         for(p = 0; p < 8; p++, q--) {
  213.             double a1 =  x[p] + x[16+q];
  214.             double a2 =  x[q] + x[16+p];
  215.             double a3 = (x[p] - x[16+q]) * coef32[p];
  216.             double a4 = (x[q] - x[16+p]) * coef32[q];
  217.  
  218.             b[p   ] =  a1 + a2;
  219.             b[p+ 8] = (a1 - a2) * coef32[16+p];
  220.             b[p+16] =  a3 + a4;
  221.             b[p+24] = (a3 - a4) * coef32[16+p];
  222.         }
  223.     }
  224.  
  225.     forward_bf(4, 8, b, a, coef32 + 16 + 8);
  226.  
  227. //    forward_bf(8, 4, a, b, coef32 + 16 + 8 + 4);
  228. //  forward_bf(16, 2, b, a, coef32 + 16 + 8 + 4 + 2);
  229. //    back_bf(8, 4, a, b);
  230. //    back_bf(4, 8, b, a);
  231. //    back_bf(2, 16, a, b);
  232.     
  233.     for (p = 0; p < 32; p += 16) {
  234.         double a0, a1, a2, a3;
  235.         double b0, b1, b2, b3;
  236.         double d0, d1, d2, d3, d4, d5, d6, d7;
  237.         double d8, d9, dA, dB, dC, dD, dE, dF;
  238.  
  239.         b0 = a[p  ] + a[p+3];
  240.         b1 = a[p+1] + a[p+2];
  241.         b2 = coef32[28] * (a[p  ] - a[p+3]);
  242.         b3 = coef32[29] * (a[p+1] - a[p+2]);
  243.  
  244.         a0 = b0 + b1;
  245.         a1 = coef32[30] * (b0 - b1);
  246.         a2 = b2 + b3;
  247.         a3 = coef32[30] * (b2 - b3);
  248.  
  249.         d0 = a0;
  250.         d1 = a2 + a3;
  251.         d2 = a1;
  252.         d3 = a3;
  253.  
  254.         b0 = a[p+4] + a[p+7];
  255.         b1 = a[p+5] + a[p+6];
  256.         b2 = coef32[28] * (a[p+4] - a[p+7]);
  257.         b3 = coef32[29] * (a[p+5] - a[p+6]);
  258.  
  259.         a0 = b0 + b1;
  260.         a1 = coef32[30] * (b0 - b1);
  261.         a2 = b2 + b3;
  262.         a3 = coef32[30] * (b2 - b3);
  263.  
  264.         d4 = a0;
  265.         d5 = a2 + a3;
  266.         d6 = a1;
  267.         d7 = a3;
  268.  
  269.         b0 = a[p+8] + a[p+11];
  270.         b1 = a[p+9] + a[p+10];
  271.         b2 = coef32[28] * (a[p+8] - a[p+11]);
  272.         b3 = coef32[29] * (a[p+9] - a[p+10]);
  273.  
  274.         a0 = b0 + b1;
  275.         a1 = coef32[30] * (b0 - b1);
  276.         a2 = b2 + b3;
  277.         a3 = coef32[30] * (b2 - b3);
  278.  
  279.         d8 = a0;
  280.         d9 = a2 + a3;
  281.         dA = a1;
  282.         dB = a3;
  283.  
  284.         b0 = a[p+12] + a[p+15];
  285.         b1 = a[p+13] + a[p+14];
  286.         b2 = coef32[28] * (a[p+12] - a[p+15]);
  287.         b3 = coef32[29] * (a[p+13] - a[p+14]);
  288.  
  289.         a0 = b0 + b1;
  290.         a1 = coef32[30] * (b0 - b1);
  291.         a2 = b2 + b3;
  292.         a3 = coef32[30] * (b2 - b3);
  293.  
  294.         dC = a0;
  295.         dD = a2 + a3;
  296.         dE = a1;
  297.         dF = a3;
  298.  
  299.         //////////////////////////////////////////////////
  300.  
  301.         double s1 = dC + dD;
  302.         double s2 = dD + dE;
  303.         double s3 = dE + dF;
  304.  
  305.         a[p   ] = d0;
  306.         a[p+ 2] = d4 + d5;
  307.         a[p+ 4] = d1;
  308.         a[p+ 6] = d5 + d6;
  309.         a[p+ 8] = d2;
  310.         a[p+10] = d6 + d7;
  311.         a[p+12] = d3;
  312.         a[p+14] = d7;
  313.  
  314.         a[p+ 1] = d8 + s1;
  315.         a[p+ 3] = d9 + s1;
  316.         a[p+ 5] = d9 + s2;
  317.         a[p+ 7] = dA + s2;
  318.         a[p+ 9] = dA + s3;
  319.         a[p+11] = dB + s3;
  320.         a[p+13] = dB + dF;
  321.         a[p+15] = dF;
  322.     }
  323.  
  324.  
  325.  
  326. //    back_bf(1, 32, b, c);
  327. //
  328. // reordering for windowing:
  329. //        flip around 256 if odd
  330.  
  331.     if (odd) {
  332.         c[0] = a[0];
  333.         c[512 - 16] = a[16] + a[17];
  334.  
  335.         q = 1;
  336.         for (p = 2; p < 30; p+=2, q++) {
  337.             c[512 - p*16     ] = a[q];
  338.             c[512 - p*16 - 16] = a[q+16] + a[q+17];
  339.         }
  340.  
  341.         c[ 2*16] = a[15];
  342.         c[ 1*16] = a[31];
  343.     } else {
  344.         q = 0;
  345.         for (p = 0; p < 30; p+=2, q++) {
  346.             c[p*16+0 ] = a[q];
  347.             c[p*16+16] = a[q+16] + a[q+17];
  348.         }
  349.  
  350.         c[30*16] = a[15];
  351.         c[31*16] = a[31];
  352.     }
  353. }
  354.  
  355.  
  356.  
  357.  
  358. #define float_to_long(x) ((converter = (double)(x)+6755399441055744.0),*(long *)&converter)
  359.  
  360. void window_dual(const float vbuf[2][512], int vb_ptr, short *pcm) {
  361.     double converter;
  362.     int i, j;
  363.     int si, bx;
  364.     int coef;
  365.     float *window, *window2;
  366.     float sum1, sum2, sum3, sum4;
  367.     long tmp;
  368.  
  369.     coef = 0;
  370.  
  371. /* first */
  372.  
  373.     i = 0;
  374.     if (vb_ptr & 1) {
  375.             sum1 = 0.0F;
  376.             sum2 = 0.0F;
  377.  
  378.             window = &wincoef[i][(-vb_ptr) & 15];
  379.  
  380.             si = 256-i*16;
  381.  
  382.             sum1 -= window[ 0] * vbuf[0][si+ 0];
  383.             sum2 -= window[ 0] * vbuf[1][si+ 0];
  384.             sum1 += window[ 1] * vbuf[0][si+ 1];
  385.             sum2 += window[ 1] * vbuf[1][si+ 1];
  386.             sum1 -= window[ 2] * vbuf[0][si+ 2];
  387.             sum2 -= window[ 2] * vbuf[1][si+ 2];
  388.             sum1 += window[ 3] * vbuf[0][si+ 3];
  389.             sum2 += window[ 3] * vbuf[1][si+ 3];
  390.             sum1 -= window[ 4] * vbuf[0][si+ 4];
  391.             sum2 -= window[ 4] * vbuf[1][si+ 4];
  392.             sum1 += window[ 5] * vbuf[0][si+ 5];
  393.             sum2 += window[ 5] * vbuf[1][si+ 5];
  394.             sum1 -= window[ 6] * vbuf[0][si+ 6];
  395.             sum2 -= window[ 6] * vbuf[1][si+ 6];
  396.             sum1 += window[ 7] * vbuf[0][si+ 7];
  397.             sum2 += window[ 7] * vbuf[1][si+ 7];
  398.             sum1 -= window[ 8] * vbuf[0][si+ 8];
  399.             sum2 -= window[ 8] * vbuf[1][si+ 8];
  400.             sum1 += window[ 9] * vbuf[0][si+ 9];
  401.             sum2 += window[ 9] * vbuf[1][si+ 9];
  402.             sum1 -= window[10] * vbuf[0][si+10];
  403.             sum2 -= window[10] * vbuf[1][si+10];
  404.             sum1 += window[11] * vbuf[0][si+11];
  405.             sum2 += window[11] * vbuf[1][si+11];
  406.             sum1 -= window[12] * vbuf[0][si+12];
  407.             sum2 -= window[12] * vbuf[1][si+12];
  408.             sum1 += window[13] * vbuf[0][si+13];
  409.             sum2 += window[13] * vbuf[1][si+13];
  410.             sum1 -= window[14] * vbuf[0][si+14];
  411.             sum2 -= window[14] * vbuf[1][si+14];
  412.             sum1 += window[15] * vbuf[0][si+15];
  413.             sum2 += window[15] * vbuf[1][si+15];
  414.  
  415.             tmp = float_to_long(sum1);
  416.             if (tmp > 32767)
  417.                 tmp = 32767;
  418.             else if (tmp < -32768)
  419.                 tmp = -32768;
  420.  
  421.             pcm[i*2] = tmp;
  422.  
  423.             tmp = float_to_long(sum2);
  424.             if (tmp > 32767)
  425.                 tmp = 32767;
  426.             else if (tmp < -32768)
  427.                 tmp = -32768;
  428.  
  429.             pcm[i*2+1] = tmp;
  430.     } else {
  431.             sum1 = 0.0F;
  432.             sum2 = 0.0F;
  433.  
  434.             window = &wincoef[i][(-vb_ptr) & 15];
  435.  
  436.             si = 256+i*16;
  437.  
  438.             sum1 += window[ 0] * vbuf[0][si+ 0];
  439.             sum2 += window[ 0] * vbuf[1][si+ 0];
  440.             sum1 -= window[ 1] * vbuf[0][si+ 1];
  441.             sum2 -= window[ 1] * vbuf[1][si+ 1];
  442.             sum1 += window[ 2] * vbuf[0][si+ 2];
  443.             sum2 += window[ 2] * vbuf[1][si+ 2];
  444.             sum1 -= window[ 3] * vbuf[0][si+ 3];
  445.             sum2 -= window[ 3] * vbuf[1][si+ 3];
  446.             sum1 += window[ 4] * vbuf[0][si+ 4];
  447.             sum2 += window[ 4] * vbuf[1][si+ 4];
  448.             sum1 -= window[ 5] * vbuf[0][si+ 5];
  449.             sum2 -= window[ 5] * vbuf[1][si+ 5];
  450.             sum1 += window[ 6] * vbuf[0][si+ 6];
  451.             sum2 += window[ 6] * vbuf[1][si+ 6];
  452.             sum1 -= window[ 7] * vbuf[0][si+ 7];
  453.             sum2 -= window[ 7] * vbuf[1][si+ 7];
  454.             sum1 += window[ 8] * vbuf[0][si+ 8];
  455.             sum2 += window[ 8] * vbuf[1][si+ 8];
  456.             sum1 -= window[ 9] * vbuf[0][si+ 9];
  457.             sum2 -= window[ 9] * vbuf[1][si+ 9];
  458.             sum1 += window[10] * vbuf[0][si+10];
  459.             sum2 += window[10] * vbuf[1][si+10];
  460.             sum1 -= window[11] * vbuf[0][si+11];
  461.             sum2 -= window[11] * vbuf[1][si+11];
  462.             sum1 += window[12] * vbuf[0][si+12];
  463.             sum2 += window[12] * vbuf[1][si+12];
  464.             sum1 -= window[13] * vbuf[0][si+13];
  465.             sum2 -= window[13] * vbuf[1][si+13];
  466.             sum1 += window[14] * vbuf[0][si+14];
  467.             sum2 += window[14] * vbuf[1][si+14];
  468.             sum1 -= window[15] * vbuf[0][si+15];
  469.             sum2 -= window[15] * vbuf[1][si+15];
  470.  
  471.             tmp = float_to_long(sum1);
  472.             if (tmp > 32767)
  473.                 tmp = 32767;
  474.             else if (tmp < -32768)
  475.                 tmp = -32768;
  476.  
  477.             pcm[i*2] = tmp;
  478.  
  479.             tmp = float_to_long(sum2);
  480.             if (tmp > 32767)
  481.                 tmp = 32767;
  482.             else if (tmp < -32768)
  483.                 tmp = -32768;
  484.  
  485.             pcm[i*2+1] = tmp;
  486.     }
  487.  
  488. /*-- 1-16, last 15 --*/
  489.  
  490.     if (vb_ptr & 1) {
  491. #ifdef USE_ASM
  492.         window = &wincoef[1][16-vb_ptr];
  493.         window2 = &wincoef[1][vb_ptr];
  494.  
  495.         const void *vbuf2 = (void *)&vbuf[0][240];
  496.  
  497.         __asm {
  498.             push    esi
  499.             push    vbuf2
  500.             mov        ecx,window
  501.             mov        edx,window2
  502.             mov        ebx,pcm
  503.             pop        esi
  504.             push    edi
  505.             mov        edi,ebx
  506.             add        ebx,2*2
  507.             add        edi,62*2
  508.             push    ebp
  509.             push    0
  510.             push    0
  511.             push    0
  512.             push    0
  513.             mov        ebp,15
  514.  
  515.             ;ESI = FP input
  516.             ;EBX = PCM output (low)
  517.             ;ECX = window
  518.             ;EDX = window2
  519.             ;EDI = PCM output (high)
  520.             ;EBP = counter
  521.             ;
  522.             ;A sum = window[0...15] * vbuf[0]
  523.             ;B sum = window2[15...0] * vbuf[0]
  524.             ;C sum = window[0...15] * vbuf[1]
  525.             ;D sum = window2[15...0] * vbuf[1]
  526.  
  527. div0_loop:
  528.             fld        dword ptr [esi+15*4+0*2048]    ;Lx
  529.             fmul    dword ptr [ecx+15*4]        ;Ax
  530.             fld        dword ptr [esi+15*4+0*2048]    ;Lx Ax
  531.             fmul    dword ptr [edx+ 0*4]        ;Bx Ax
  532.             fld        dword ptr [esi+15*4+1*2048]    ;Rx Bx Ax
  533.             fmul    dword ptr [ecx+15*4]        ;Cx Bx Ax
  534.             fld        dword ptr [esi+15*4+1*2048]    ;Rx Cx Bx Ax
  535.             fmul    dword ptr [edx+ 0*4]        ;Dx Cx Bx Ax
  536.  
  537.             fld        dword ptr [esi+14*4+0*2048]    ;Lx Dt Ct Bt At
  538.             fmul    dword ptr [ecx+14*4]        ;Ax Dt Ct Bt At
  539.             fld        dword ptr [esi+14*4+0*2048]    ;Lx Ax Dt Ct Bt At
  540.             fmul    dword ptr [edx+ 1*4]        ;Bx Ax Dt Ct Bt At
  541.             fld        dword ptr [esi+14*4+1*2048]    ;Rx Bx Ax Dt Ct Bt At
  542.             fmul    dword ptr [ecx+14*4]        ;Cx Bx Ax Dt Ct Bt At
  543.             fld        dword ptr [esi+14*4+1*2048]    ;Rx Cx Bx Ax Dt Ct Bt At
  544.             fmul    dword ptr [edx+ 1*4]        ;Dx Cx Bx Ax Dt Ct Bt At
  545.             fxch    st(3)                        ;Ax Cx Bx Dx Dt Ct Bt At
  546.             fsubp    st(7),st                    ;Cx Bx Dx Dt Ct Bt At
  547.             fxch    st(1)                        ;Bx Cx Dx Dt Ct Bt At
  548.             faddp    st(5),st                    ;Cx Dx Dt Ct Bt At
  549.             fsubp    st(3),st                    ;Dx Dt Ct Bt At
  550.             faddp    st(1),st                    ;Dt Ct Bt At
  551.  
  552.             fld        dword ptr [esi+13*4+0*2048]    ;Lx Dt Ct Bt At
  553.             fmul    dword ptr [ecx+13*4]        ;Ax Dt Ct Bt At
  554.             fld        dword ptr [esi+13*4+0*2048]    ;Lx Ax Dt Ct Bt At
  555.             fmul    dword ptr [edx+ 2*4]        ;Bx Ax Dt Ct Bt At
  556.             fld        dword ptr [esi+13*4+1*2048]    ;Rx Bx Ax Dt Ct Bt At
  557.             fmul    dword ptr [ecx+13*4]        ;Cx Bx Ax Dt Ct Bt At
  558.             fld        dword ptr [esi+13*4+1*2048]    ;Rx Cx Bx Ax Dt Ct Bt At
  559.             fmul    dword ptr [edx+ 2*4]        ;Dx Cx Bx Ax Dt Ct Bt At
  560.             fxch    st(3)                        ;Ax Cx Bx Dx Dt Ct Bt At
  561.             faddp    st(7),st                    ;Cx Bx Dx Dt Ct Bt At
  562.             fxch    st(1)                        ;Bx Cx Dx Dt Ct Bt At
  563.             faddp    st(5),st                    ;Cx Dx Dt Ct Bt At
  564.             faddp    st(3),st                    ;Dx Dt Ct Bt At
  565.             faddp    st(1),st                    ;Dt Ct Bt At
  566.  
  567.             fld        dword ptr [esi+12*4+0*2048]    ;Lx Dt Ct Bt At
  568.             fmul    dword ptr [ecx+12*4]        ;Ax Dt Ct Bt At
  569.             fld        dword ptr [esi+12*4+0*2048]    ;Lx Ax Dt Ct Bt At
  570.             fmul    dword ptr [edx+ 3*4]        ;Bx Ax Dt Ct Bt At
  571.             fld        dword ptr [esi+12*4+1*2048]    ;Rx Bx Ax Dt Ct Bt At
  572.             fmul    dword ptr [ecx+12*4]        ;Cx Bx Ax Dt Ct Bt At
  573.             fld        dword ptr [esi+12*4+1*2048]    ;Rx Cx Bx Ax Dt Ct Bt At
  574.             fmul    dword ptr [edx+ 3*4]        ;Dx Cx Bx Ax Dt Ct Bt At
  575.             fxch    st(3)                        ;Ax Cx Bx Dx Dt Ct Bt At
  576.             fsubp    st(7),st                    ;Cx Bx Dx Dt Ct Bt At
  577.             fxch    st(1)                        ;Bx Cx Dx Dt Ct Bt At
  578.             faddp    st(5),st                    ;Cx Dx Dt Ct Bt At
  579.             fsubp    st(3),st                    ;Dx Dt Ct Bt At
  580.             faddp    st(1),st                    ;Dt Ct Bt At
  581.  
  582.             fld        dword ptr [esi+11*4+0*2048]    ;Lx Dt Ct Bt At
  583.             fmul    dword ptr [ecx+11*4]        ;Ax Dt Ct Bt At
  584.             fld        dword ptr [esi+11*4+0*2048]    ;Lx Ax Dt Ct Bt At
  585.             fmul    dword ptr [edx+ 4*4]        ;Bx Ax Dt Ct Bt At
  586.             fld        dword ptr [esi+11*4+1*2048]    ;Rx Bx Ax Dt Ct Bt At
  587.             fmul    dword ptr [ecx+11*4]        ;Cx Bx Ax Dt Ct Bt At
  588.             fld        dword ptr [esi+11*4+1*2048]    ;Rx Cx Bx Ax Dt Ct Bt At
  589.             fmul    dword ptr [edx+ 4*4]        ;Dx Cx Bx Ax Dt Ct Bt At
  590.             fxch    st(3)                        ;Ax Cx Bx Dx Dt Ct Bt At
  591.             faddp    st(7),st                    ;Cx Bx Dx Dt Ct Bt At
  592.             fxch    st(1)                        ;Bx Cx Dx Dt Ct Bt At
  593.             faddp    st(5),st                    ;Cx Dx Dt Ct Bt At
  594.             faddp    st(3),st                    ;Dx Dt Ct Bt At
  595.             faddp    st(1),st                    ;Dt Ct Bt At
  596.  
  597.             fld        dword ptr [esi+10*4+0*2048]    ;Lx Dt Ct Bt At
  598.             fmul    dword ptr [ecx+10*4]        ;Ax Dt Ct Bt At
  599.             fld        dword ptr [esi+10*4+0*2048]    ;Lx Ax Dt Ct Bt At
  600.             fmul    dword ptr [edx+ 5*4]        ;Bx Ax Dt Ct Bt At
  601.             fld        dword ptr [esi+10*4+1*2048]    ;Rx Bx Ax Dt Ct Bt At
  602.             fmul    dword ptr [ecx+10*4]        ;Cx Bx Ax Dt Ct Bt At
  603.             fld        dword ptr [esi+10*4+1*2048]    ;Rx Cx Bx Ax Dt Ct Bt At
  604.             fmul    dword ptr [edx+ 5*4]        ;Dx Cx Bx Ax Dt Ct Bt At
  605.             fxch    st(3)                        ;Ax Cx Bx Dx Dt Ct Bt At
  606.             fsubp    st(7),st                    ;Cx Bx Dx Dt Ct Bt At
  607.             fxch    st(1)                        ;Bx Cx Dx Dt Ct Bt At
  608.             faddp    st(5),st                    ;Cx Dx Dt Ct Bt At
  609.             fsubp    st(3),st                    ;Dx Dt Ct Bt At
  610.             faddp    st(1),st                    ;Dt Ct Bt At
  611.  
  612.             fld        dword ptr [esi+ 9*4+0*2048]    ;Lx Dt Ct Bt At
  613.             fmul    dword ptr [ecx+ 9*4]        ;Ax Dt Ct Bt At
  614.             fld        dword ptr [esi+ 9*4+0*2048]    ;Lx Ax Dt Ct Bt At
  615.             fmul    dword ptr [edx+ 6*4]        ;Bx Ax Dt Ct Bt At
  616.             fld        dword ptr [esi+ 9*4+1*2048]    ;Rx Bx Ax Dt Ct Bt At
  617.             fmul    dword ptr [ecx+ 9*4]        ;Cx Bx Ax Dt Ct Bt At
  618.             fld        dword ptr [esi+ 9*4+1*2048]    ;Rx Cx Bx Ax Dt Ct Bt At
  619.             fmul    dword ptr [edx+ 6*4]        ;Dx Cx Bx Ax Dt Ct Bt At
  620.             fxch    st(3)                        ;Ax Cx Bx Dx Dt Ct Bt At
  621.             faddp    st(7),st                    ;Cx Bx Dx Dt Ct Bt At
  622.             fxch    st(1)                        ;Bx Cx Dx Dt Ct Bt At
  623.             faddp    st(5),st                    ;Cx Dx Dt Ct Bt At
  624.             faddp    st(3),st                    ;Dx Dt Ct Bt At
  625.             faddp    st(1),st                    ;Dt Ct Bt At
  626.  
  627.             fld        dword ptr [esi+ 8*4+0*2048]    ;Lx Dt Ct Bt At
  628.             fmul    dword ptr [ecx+ 8*4]        ;Ax Dt Ct Bt At
  629.             fld        dword ptr [esi+ 8*4+0*2048]    ;Lx Ax Dt Ct Bt At
  630.             fmul    dword ptr [edx+ 7*4]        ;Bx Ax Dt Ct Bt At
  631.             fld        dword ptr [esi+ 8*4+1*2048]    ;Rx Bx Ax Dt Ct Bt At
  632.             fmul    dword ptr [ecx+ 8*4]        ;Cx Bx Ax Dt Ct Bt At
  633.             fld        dword ptr [esi+ 8*4+1*2048]    ;Rx Cx Bx Ax Dt Ct Bt At
  634.             fmul    dword ptr [edx+ 7*4]        ;Dx Cx Bx Ax Dt Ct Bt At
  635.             fxch    st(3)                        ;Ax Cx Bx Dx Dt Ct Bt At
  636.             fsubp    st(7),st                    ;Cx Bx Dx Dt Ct Bt At
  637.             fxch    st(1)                        ;Bx Cx Dx Dt Ct Bt At
  638.             faddp    st(5),st                    ;Cx Dx Dt Ct Bt At
  639.             fsubp    st(3),st                    ;Dx Dt Ct Bt At
  640.             faddp    st(1),st                    ;Dt Ct Bt At
  641.  
  642.             fld        dword ptr [esi+ 7*4+0*2048]    ;Lx Dt Ct Bt At
  643.             fmul    dword ptr [ecx+ 7*4]        ;Ax Dt Ct Bt At
  644.             fld        dword ptr [esi+ 7*4+0*2048]    ;Lx Ax Dt Ct Bt At
  645.             fmul    dword ptr [edx+ 8*4]        ;Bx Ax Dt Ct Bt At
  646.             fld        dword ptr [esi+ 7*4+1*2048]    ;Rx Bx Ax Dt Ct Bt At
  647.             fmul    dword ptr [ecx+ 7*4]        ;Cx Bx Ax Dt Ct Bt At
  648.             fld        dword ptr [esi+ 7*4+1*2048]    ;Rx Cx Bx Ax Dt Ct Bt At
  649.             fmul    dword ptr [edx+ 8*4]        ;Dx Cx Bx Ax Dt Ct Bt At
  650.             fxch    st(3)                        ;Ax Cx Bx Dx Dt Ct Bt At
  651.             faddp    st(7),st                    ;Cx Bx Dx Dt Ct Bt At
  652.             fxch    st(1)                        ;Bx Cx Dx Dt Ct Bt At
  653.             faddp    st(5),st                    ;Cx Dx Dt Ct Bt At
  654.             faddp    st(3),st                    ;Dx Dt Ct Bt At
  655.             faddp    st(1),st                    ;Dt Ct Bt At
  656.  
  657.             fld        dword ptr [esi+ 6*4+0*2048]    ;Lx Dt Ct Bt At
  658.             fmul    dword ptr [ecx+ 6*4]        ;Ax Dt Ct Bt At
  659.             fld        dword ptr [esi+ 6*4+0*2048]    ;Lx Ax Dt Ct Bt At
  660.             fmul    dword ptr [edx+ 9*4]        ;Bx Ax Dt Ct Bt At
  661.             fld        dword ptr [esi+ 6*4+1*2048]    ;Rx Bx Ax Dt Ct Bt At
  662.             fmul    dword ptr [ecx+ 6*4]        ;Cx Bx Ax Dt Ct Bt At
  663.             fld        dword ptr [esi+ 6*4+1*2048]    ;Rx Cx Bx Ax Dt Ct Bt At
  664.             fmul    dword ptr [edx+ 9*4]        ;Dx Cx Bx Ax Dt Ct Bt At
  665.             fxch    st(3)                        ;Ax Cx Bx Dx Dt Ct Bt At
  666.             fsubp    st(7),st                    ;Cx Bx Dx Dt Ct Bt At
  667.             fxch    st(1)                        ;Bx Cx Dx Dt Ct Bt At
  668.             faddp    st(5),st                    ;Cx Dx Dt Ct Bt At
  669.             fsubp    st(3),st                    ;Dx Dt Ct Bt At
  670.             faddp    st(1),st                    ;Dt Ct Bt At
  671.  
  672.             fld        dword ptr [esi+ 5*4+0*2048]    ;Lx Dt Ct Bt At
  673.             fmul    dword ptr [ecx+ 5*4]        ;Ax Dt Ct Bt At
  674.             fld        dword ptr [esi+ 5*4+0*2048]    ;Lx Ax Dt Ct Bt At
  675.             fmul    dword ptr [edx+10*4]        ;Bx Ax Dt Ct Bt At
  676.             fld        dword ptr [esi+ 5*4+1*2048]    ;Rx Bx Ax Dt Ct Bt At
  677.             fmul    dword ptr [ecx+ 5*4]        ;Cx Bx Ax Dt Ct Bt At
  678.             fld        dword ptr [esi+ 5*4+1*2048]    ;Rx Cx Bx Ax Dt Ct Bt At
  679.             fmul    dword ptr [edx+10*4]        ;Dx Cx Bx Ax Dt Ct Bt At
  680.             fxch    st(3)                        ;Ax Cx Bx Dx Dt Ct Bt At
  681.             faddp    st(7),st                    ;Cx Bx Dx Dt Ct Bt At
  682.             fxch    st(1)                        ;Bx Cx Dx Dt Ct Bt At
  683.             faddp    st(5),st                    ;Cx Dx Dt Ct Bt At
  684.             faddp    st(3),st                    ;Dx Dt Ct Bt At
  685.             faddp    st(1),st                    ;Dt Ct Bt At
  686.  
  687.             fld        dword ptr [esi+ 4*4+0*2048]    ;Lx Dt Ct Bt At
  688.             fmul    dword ptr [ecx+ 4*4]        ;Ax Dt Ct Bt At
  689.             fld        dword ptr [esi+ 4*4+0*2048]    ;Lx Ax Dt Ct Bt At
  690.             fmul    dword ptr [edx+11*4]        ;Bx Ax Dt Ct Bt At
  691.             fld        dword ptr [esi+ 4*4+1*2048]    ;Rx Bx Ax Dt Ct Bt At
  692.             fmul    dword ptr [ecx+ 4*4]        ;Cx Bx Ax Dt Ct Bt At
  693.             fld        dword ptr [esi+ 4*4+1*2048]    ;Rx Cx Bx Ax Dt Ct Bt At
  694.             fmul    dword ptr [edx+11*4]        ;Dx Cx Bx Ax Dt Ct Bt At
  695.             fxch    st(3)                        ;Ax Cx Bx Dx Dt Ct Bt At
  696.             fsubp    st(7),st                    ;Cx Bx Dx Dt Ct Bt At
  697.             fxch    st(1)                        ;Bx Cx Dx Dt Ct Bt At
  698.             faddp    st(5),st                    ;Cx Dx Dt Ct Bt At
  699.             fsubp    st(3),st                    ;Dx Dt Ct Bt At
  700.             faddp    st(1),st                    ;Dt Ct Bt At
  701.  
  702.             fld        dword ptr [esi+ 3*4+0*2048]    ;Lx Dt Ct Bt At
  703.             fmul    dword ptr [ecx+ 3*4]        ;Ax Dt Ct Bt At
  704.             fld        dword ptr [esi+ 3*4+0*2048]    ;Lx Ax Dt Ct Bt At
  705.             fmul    dword ptr [edx+12*4]        ;Bx Ax Dt Ct Bt At
  706.             fld        dword ptr [esi+ 3*4+1*2048]    ;Rx Bx Ax Dt Ct Bt At
  707.             fmul    dword ptr [ecx+ 3*4]        ;Cx Bx Ax Dt Ct Bt At
  708.             fld        dword ptr [esi+ 3*4+1*2048]    ;Rx Cx Bx Ax Dt Ct Bt At
  709.             fmul    dword ptr [edx+12*4]        ;Dx Cx Bx Ax Dt Ct Bt At
  710.             fxch    st(3)                        ;Ax Cx Bx Dx Dt Ct Bt At
  711.             faddp    st(7),st                    ;Cx Bx Dx Dt Ct Bt At
  712.             fxch    st(1)                        ;Bx Cx Dx Dt Ct Bt At
  713.             faddp    st(5),st                    ;Cx Dx Dt Ct Bt At
  714.             faddp    st(3),st                    ;Dx Dt Ct Bt At
  715.             faddp    st(1),st                    ;Dt Ct Bt At
  716.  
  717.             fld        dword ptr [esi+ 2*4+0*2048]    ;Lx Dt Ct Bt At
  718.             fmul    dword ptr [ecx+ 2*4]        ;Ax Dt Ct Bt At
  719.             fld        dword ptr [esi+ 2*4+0*2048]    ;Lx Ax Dt Ct Bt At
  720.             fmul    dword ptr [edx+13*4]        ;Bx Ax Dt Ct Bt At
  721.             fld        dword ptr [esi+ 2*4+1*2048]    ;Rx Bx Ax Dt Ct Bt At
  722.             fmul    dword ptr [ecx+ 2*4]        ;Cx Bx Ax Dt Ct Bt At
  723.             fld        dword ptr [esi+ 2*4+1*2048]    ;Rx Cx Bx Ax Dt Ct Bt At
  724.             fmul    dword ptr [edx+13*4]        ;Dx Cx Bx Ax Dt Ct Bt At
  725.             fxch    st(3)                        ;Ax Cx Bx Dx Dt Ct Bt At
  726.             fsubp    st(7),st                    ;Cx Bx Dx Dt Ct Bt At
  727.             fxch    st(1)                        ;Bx Cx Dx Dt Ct Bt At
  728.             faddp    st(5),st                    ;Cx Dx Dt Ct Bt At
  729.             fsubp    st(3),st                    ;Dx Dt Ct Bt At
  730.             faddp    st(1),st                    ;Dt Ct Bt At
  731.  
  732.             fld        dword ptr [esi+ 1*4+0*2048]    ;Lx Dt Ct Bt At
  733.             fmul    dword ptr [ecx+ 1*4]        ;Ax Dt Ct Bt At
  734.             fld        dword ptr [esi+ 1*4+0*2048]    ;Lx Ax Dt Ct Bt At
  735.             fmul    dword ptr [edx+14*4]        ;Bx Ax Dt Ct Bt At
  736.             fld        dword ptr [esi+ 1*4+1*2048]    ;Rx Bx Ax Dt Ct Bt At
  737.             fmul    dword ptr [ecx+ 1*4]        ;Cx Bx Ax Dt Ct Bt At
  738.             fld        dword ptr [esi+ 1*4+1*2048]    ;Rx Cx Bx Ax Dt Ct Bt At
  739.             fmul    dword ptr [edx+14*4]        ;Dx Cx Bx Ax Dt Ct Bt At
  740.             fxch    st(3)                        ;Ax Cx Bx Dx Dt Ct Bt At
  741.             faddp    st(7),st                    ;Cx Bx Dx Dt Ct Bt At
  742.             fxch    st(1)                        ;Bx Cx Dx Dt Ct Bt At
  743.             faddp    st(5),st                    ;Cx Dx Dt Ct Bt At
  744.             faddp    st(3),st                    ;Dx Dt Ct Bt At
  745.             faddp    st(1),st                    ;Dt Ct Bt At
  746.  
  747.             fld        dword ptr [esi+ 0*4+0*2048]    ;Lx Dt Ct Bt At
  748.             fmul    dword ptr [ecx+ 0*4]        ;Ax Dt Ct Bt At
  749.             fld        dword ptr [esi+ 0*4+0*2048]    ;Lx Ax Dt Ct Bt At
  750.             fmul    dword ptr [edx+15*4]        ;Bx Ax Dt Ct Bt At
  751.             fld        dword ptr [esi+ 0*4+1*2048]    ;Rx Bx Ax Dt Ct Bt At
  752.             fmul    dword ptr [ecx+ 0*4]        ;Cx Bx Ax Dt Ct Bt At
  753.             fld        dword ptr [esi+ 0*4+1*2048]    ;Rx Cx Bx Ax Dt Ct Bt At
  754.             fmul    dword ptr [edx+15*4]        ;Dx Cx Bx Ax Dt Ct Bt At
  755.             fxch    st(3)                        ;Ax Cx Bx Dx Dt Ct Bt At
  756.             fsubp    st(7),st                    ;Cx Bx Dx Dt Ct Bt At
  757.             fxch    st(1)                        ;Bx Cx Dx Dt Ct Bt At
  758.             faddp    st(5),st                    ;Cx Dx Dt Ct Bt At
  759.             fsubp    st(3),st                    ;Dx Dt Ct Bt At
  760.             faddp    st(1),st                    ;Dt Ct Bt At
  761.  
  762.             add        ecx,32*4
  763.             add        edx,32*4
  764.             sub        esi,16*4
  765.  
  766.             fistp    dword ptr [esp+12]            ;[esp+8] = Dt
  767.             fistp    dword ptr [esp+8]            ;[esp+12] = Ct
  768.             fistp    dword ptr [esp+4]            ;[esp+0] = Bt
  769.             fistp    dword ptr [esp+0]            ;[esp+4] = At
  770.  
  771.             mov        eax,[esp+4]
  772.             cmp        eax,-32768
  773.             jge        div0_noclip1low
  774.             mov        eax,-32768
  775. div0_noclip1low:
  776.             cmp        eax,32767
  777.             jle        div0_noclip1high
  778.             mov        eax,32767
  779. div0_noclip1high:
  780.             mov        [edi],ax
  781.  
  782.             mov        eax,[esp+12]
  783.             cmp        eax,-32768
  784.             jge        div0_noclip3low
  785.             mov        eax,-32768
  786. div0_noclip3low:
  787.             cmp        eax,32767
  788.             jle        div0_noclip3high
  789.             mov        eax,32767
  790. div0_noclip3high:
  791.             mov        [edi+2],ax
  792.  
  793.  
  794.             mov        eax,[esp+0]
  795.             cmp        eax,-32768
  796.             jge        div0_noclip2low
  797.             mov        eax,-32768
  798. div0_noclip2low:
  799.             cmp        eax,32767
  800.             jle        div0_noclip2high
  801.             mov        eax,32767
  802. div0_noclip2high:
  803.             mov        [ebx],ax
  804.             nop
  805.  
  806.             mov        eax,[esp+8]
  807.             cmp        eax,-32768
  808.             jge        div0_noclip4low
  809.             mov        eax,-32768
  810. div0_noclip4low:
  811.             cmp        eax,32767
  812.             jle        div0_noclip4high
  813.             mov        eax,32767
  814. div0_noclip4high:
  815.             mov        [ebx+2],ax
  816.             nop
  817.  
  818.  
  819.             add        ebx,4
  820.             sub        edi,4
  821.  
  822.             dec        ebp
  823.             jne        div0_loop
  824.             pop        eax
  825.             pop        eax
  826.             pop        eax
  827.             pop        eax
  828.             pop        ebp
  829.  
  830.             pop        edi
  831.             mov        ebx,esi
  832.             pop        esi
  833. ;            mov        window,ecx
  834. ;            mov        window2,edx
  835. ;            mov        u_ptr,ebx
  836.         };
  837. #else
  838.         for (i = 1; i < 16; i++) {
  839.             sum1 = 0.0F;
  840.             sum2 = 0.0F;
  841.             sum3 = 0.0F;
  842.             sum4 = 0.0F;
  843.  
  844.             window = &wincoef[i][16-vb_ptr];
  845.             window2 = &wincoef[i][vb_ptr];
  846.  
  847.             si = 256-i*16;
  848.  
  849.             sum1 -= window [ 0] * vbuf[0][si+ 0];
  850.             sum2 += window2[15] * vbuf[0][si+ 0];
  851.             sum3 -= window [ 0] * vbuf[1][si+ 0];
  852.             sum4 += window2[15] * vbuf[1][si+ 0];
  853.             sum1 += window [ 1] * vbuf[0][si+ 1];
  854.             sum2 += window2[14] * vbuf[0][si+ 1];
  855.             sum3 += window [ 1] * vbuf[1][si+ 1];
  856.             sum4 += window2[14] * vbuf[1][si+ 1];
  857.             sum1 -= window [ 2] * vbuf[0][si+ 2];
  858.             sum2 += window2[13] * vbuf[0][si+ 2];
  859.             sum3 -= window [ 2] * vbuf[1][si+ 2];
  860.             sum4 += window2[13] * vbuf[1][si+ 2];
  861.             sum1 += window [ 3] * vbuf[0][si+ 3];
  862.             sum2 += window2[12] * vbuf[0][si+ 3];
  863.             sum3 += window [ 3] * vbuf[1][si+ 3];
  864.             sum4 += window2[12] * vbuf[1][si+ 3];
  865.             sum1 -= window [ 4] * vbuf[0][si+ 4];
  866.             sum2 += window2[11] * vbuf[0][si+ 4];
  867.             sum3 -= window [ 4] * vbuf[1][si+ 4];
  868.             sum4 += window2[11] * vbuf[1][si+ 4];
  869.             sum1 += window [ 5] * vbuf[0][si+ 5];
  870.             sum2 += window2[10] * vbuf[0][si+ 5];
  871.             sum3 += window [ 5] * vbuf[1][si+ 5];
  872.             sum4 += window2[10] * vbuf[1][si+ 5];
  873.             sum1 -= window [ 6] * vbuf[0][si+ 6];
  874.             sum2 += window2[ 9] * vbuf[0][si+ 6];
  875.             sum3 -= window [ 6] * vbuf[1][si+ 6];
  876.             sum4 += window2[ 9] * vbuf[1][si+ 6];
  877.             sum1 += window [ 7] * vbuf[0][si+ 7];
  878.             sum2 += window2[ 8] * vbuf[0][si+ 7];
  879.             sum3 += window [ 7] * vbuf[1][si+ 7];
  880.             sum4 += window2[ 8] * vbuf[1][si+ 7];
  881.             sum1 -= window [ 8] * vbuf[0][si+ 8];
  882.             sum2 += window2[ 7] * vbuf[0][si+ 8];
  883.             sum3 -= window [ 8] * vbuf[1][si+ 8];
  884.             sum4 += window2[ 7] * vbuf[1][si+ 8];
  885.             sum1 += window [ 9] * vbuf[0][si+ 9];
  886.             sum2 += window2[ 6] * vbuf[0][si+ 9];
  887.             sum3 += window [ 9] * vbuf[1][si+ 9];
  888.             sum4 += window2[ 6] * vbuf[1][si+ 9];
  889.             sum1 -= window [10] * vbuf[0][si+10];
  890.             sum2 += window2[ 5] * vbuf[0][si+10];
  891.             sum3 -= window [10] * vbuf[1][si+10];
  892.             sum4 += window2[ 5] * vbuf[1][si+10];
  893.             sum1 += window [11] * vbuf[0][si+11];
  894.             sum2 += window2[ 4] * vbuf[0][si+11];
  895.             sum3 += window [11] * vbuf[1][si+11];
  896.             sum4 += window2[ 4] * vbuf[1][si+11];
  897.             sum1 -= window [12] * vbuf[0][si+12];
  898.             sum2 += window2[ 3] * vbuf[0][si+12];
  899.             sum3 -= window [12] * vbuf[1][si+12];
  900.             sum4 += window2[ 3] * vbuf[1][si+12];
  901.             sum1 += window [13] * vbuf[0][si+13];
  902.             sum2 += window2[ 2] * vbuf[0][si+13];
  903.             sum3 += window [13] * vbuf[1][si+13];
  904.             sum4 += window2[ 2] * vbuf[1][si+13];
  905.             sum1 -= window [14] * vbuf[0][si+14];
  906.             sum2 += window2[ 1] * vbuf[0][si+14];
  907.             sum3 -= window [14] * vbuf[1][si+14];
  908.             sum4 += window2[ 1] * vbuf[1][si+14];
  909.             sum1 += window [15] * vbuf[0][si+15];
  910.             sum2 += window2[ 0] * vbuf[0][si+15];
  911.             sum3 += window [15] * vbuf[1][si+15];
  912.             sum4 += window2[ 0] * vbuf[1][si+15];
  913.  
  914.             tmp = float_to_long(sum1);
  915.             if (tmp > 32767)
  916.                 tmp = 32767;
  917.             else if (tmp < -32768)
  918.                 tmp = -32768;
  919.  
  920.             pcm[i*2] = tmp;
  921.  
  922.             tmp = float_to_long(sum3);
  923.             if (tmp > 32767)
  924.                 tmp = 32767;
  925.             else if (tmp < -32768)
  926.                 tmp = -32768;
  927.  
  928.             pcm[i*2+1] = tmp;
  929.  
  930.  
  931.             tmp = float_to_long(sum2);
  932.             if (tmp > 32767)
  933.                 tmp = 32767;
  934.             else if (tmp < -32768)
  935.                 tmp = -32768;
  936.  
  937.             pcm[64-i*2] = tmp;
  938.  
  939.             tmp = float_to_long(sum4);
  940.             if (tmp > 32767)
  941.                 tmp = 32767;
  942.             else if (tmp < -32768)
  943.                 tmp = -32768;
  944.  
  945.             pcm[64-i*2+1] = tmp;
  946.         }
  947. #endif
  948.     } else {
  949. #ifdef USE_ASM
  950.         window = &wincoef[1][16-vb_ptr];
  951.         window2 = &wincoef[1][vb_ptr];
  952.  
  953.         const void *vbuf2 = (void *)&vbuf[0][272];
  954.  
  955.         __asm {
  956.             push    esi
  957.             push    vbuf2
  958.             mov        ecx,window
  959.             mov        edx,window2
  960.             mov        ebx,pcm
  961.             pop        esi
  962.             push    edi
  963.             mov        edi,ebx
  964.             add        ebx,2*2
  965.             add        edi,62*2
  966.             push    ebp
  967.             push    0
  968.             push    0
  969.             push    0
  970.             push    0
  971.             mov        ebp,15
  972.  
  973.             ;ESI = FP input
  974.             ;EBX = PCM output (low)
  975.             ;ECX = window
  976.             ;EDX = window2
  977.             ;EDI = PCM output (high)
  978.             ;EBP = counter
  979.             ;
  980.             ;A sum = window[0...15] * vbuf[0] (alternating)
  981.             ;B sum = window2[15...0] * vbuf[0]
  982.             ;C sum = window[0...15] * vbuf[1] (alternating)
  983.             ;D sum = window2[15...0] * vbuf[1]
  984.  
  985. div1_loop:
  986.             fld        dword ptr [esi+ 0*4+0*2048]    ;Lx
  987.             fmul    dword ptr [ecx+ 0*4]        ;Ax
  988.             fld        dword ptr [esi+ 0*4+0*2048]    ;Lx Ax
  989.             fmul    dword ptr [edx+15*4]        ;Bx Ax
  990.             fld        dword ptr [esi+ 0*4+1*2048]    ;Rx Bx Ax
  991.             fmul    dword ptr [ecx+ 0*4]        ;Cx Bx Ax
  992.             fld        dword ptr [esi+ 0*4+1*2048]    ;Rx Cx Bx Ax
  993.             fmul    dword ptr [edx+15*4]        ;Dx Cx Bx Ax
  994.  
  995.             fld        dword ptr [esi+ 1*4+0*2048]    ;Lx Dt Ct Bt At
  996.             fmul    dword ptr [ecx+ 1*4]        ;Ax Dt Ct Bt At
  997.             fld        dword ptr [esi+ 1*4+0*2048]    ;Lx Ax Dt Ct Bt At
  998.             fmul    dword ptr [edx+14*4]        ;Bx Ax Dt Ct Bt At
  999.             fld        dword ptr [esi+ 1*4+1*2048]    ;Rx Bx Ax Dt Ct Bt At
  1000.             fmul    dword ptr [ecx+ 1*4]        ;Cx Bx Ax Dt Ct Bt At
  1001.             fld        dword ptr [esi+ 1*4+1*2048]    ;Rx Cx Bx Ax Dt Ct Bt At
  1002.             fmul    dword ptr [edx+14*4]        ;Dx Cx Bx Ax Dt Ct Bt At
  1003.             fxch    st(3)                        ;Ax Cx Bx Dx Dt Ct Bt At
  1004.             fsubp    st(7),st                    ;Cx Bx Dx Dt Ct Bt At
  1005.             fxch    st(1)                        ;Bx Cx Dx Dt Ct Bt At
  1006.             faddp    st(5),st                    ;Cx Dx Dt Ct Bt At
  1007.             fsubp    st(3),st                    ;Dx Dt Ct Bt At
  1008.             faddp    st(1),st                    ;Dt Ct Bt At
  1009.  
  1010.             fld        dword ptr [esi+ 2*4+0*2048]    ;Lx Dt Ct Bt At
  1011.             fmul    dword ptr [ecx+ 2*4]        ;Ax Dt Ct Bt At
  1012.             fld        dword ptr [esi+ 2*4+0*2048]    ;Lx Ax Dt Ct Bt At
  1013.             fmul    dword ptr [edx+13*4]        ;Bx Ax Dt Ct Bt At
  1014.             fld        dword ptr [esi+ 2*4+1*2048]    ;Rx Bx Ax Dt Ct Bt At
  1015.             fmul    dword ptr [ecx+ 2*4]        ;Cx Bx Ax Dt Ct Bt At
  1016.             fld        dword ptr [esi+ 2*4+1*2048]    ;Rx Cx Bx Ax Dt Ct Bt At
  1017.             fmul    dword ptr [edx+13*4]        ;Dx Cx Bx Ax Dt Ct Bt At
  1018.             fxch    st(3)                        ;Ax Cx Bx Dx Dt Ct Bt At
  1019.             faddp    st(7),st                    ;Cx Bx Dx Dt Ct Bt At
  1020.             fxch    st(1)                        ;Bx Cx Dx Dt Ct Bt At
  1021.             faddp    st(5),st                    ;Cx Dx Dt Ct Bt At
  1022.             faddp    st(3),st                    ;Dx Dt Ct Bt At
  1023.             faddp    st(1),st                    ;Dt Ct Bt At
  1024.  
  1025.             fld        dword ptr [esi+ 3*4+0*2048]    ;Lx Dt Ct Bt At
  1026.             fmul    dword ptr [ecx+ 3*4]        ;Ax Dt Ct Bt At
  1027.             fld        dword ptr [esi+ 3*4+0*2048]    ;Lx Ax Dt Ct Bt At
  1028.             fmul    dword ptr [edx+12*4]        ;Bx Ax Dt Ct Bt At
  1029.             fld        dword ptr [esi+ 3*4+1*2048]    ;Rx Bx Ax Dt Ct Bt At
  1030.             fmul    dword ptr [ecx+ 3*4]        ;Cx Bx Ax Dt Ct Bt At
  1031.             fld        dword ptr [esi+ 3*4+1*2048]    ;Rx Cx Bx Ax Dt Ct Bt At
  1032.             fmul    dword ptr [edx+12*4]        ;Dx Cx Bx Ax Dt Ct Bt At
  1033.             fxch    st(3)                        ;Ax Cx Bx Dx Dt Ct Bt At
  1034.             fsubp    st(7),st                    ;Cx Bx Dx Dt Ct Bt At
  1035.             fxch    st(1)                        ;Bx Cx Dx Dt Ct Bt At
  1036.             faddp    st(5),st                    ;Cx Dx Dt Ct Bt At
  1037.             fsubp    st(3),st                    ;Dx Dt Ct Bt At
  1038.             faddp    st(1),st                    ;Dt Ct Bt At
  1039.  
  1040.             fld        dword ptr [esi+ 4*4+0*2048]    ;Lx Dt Ct Bt At
  1041.             fmul    dword ptr [ecx+ 4*4]        ;Ax Dt Ct Bt At
  1042.             fld        dword ptr [esi+ 4*4+0*2048]    ;Lx Ax Dt Ct Bt At
  1043.             fmul    dword ptr [edx+11*4]        ;Bx Ax Dt Ct Bt At
  1044.             fld        dword ptr [esi+ 4*4+1*2048]    ;Rx Bx Ax Dt Ct Bt At
  1045.             fmul    dword ptr [ecx+ 4*4]        ;Cx Bx Ax Dt Ct Bt At
  1046.             fld        dword ptr [esi+ 4*4+1*2048]    ;Rx Cx Bx Ax Dt Ct Bt At
  1047.             fmul    dword ptr [edx+11*4]        ;Dx Cx Bx Ax Dt Ct Bt At
  1048.             fxch    st(3)                        ;Ax Cx Bx Dx Dt Ct Bt At
  1049.             faddp    st(7),st                    ;Cx Bx Dx Dt Ct Bt At
  1050.             fxch    st(1)                        ;Bx Cx Dx Dt Ct Bt At
  1051.             faddp    st(5),st                    ;Cx Dx Dt Ct Bt At
  1052.             faddp    st(3),st                    ;Dx Dt Ct Bt At
  1053.             faddp    st(1),st                    ;Dt Ct Bt At
  1054.  
  1055.             fld        dword ptr [esi+ 5*4+0*2048]    ;Lx Dt Ct Bt At
  1056.             fmul    dword ptr [ecx+ 5*4]        ;Ax Dt Ct Bt At
  1057.             fld        dword ptr [esi+ 5*4+0*2048]    ;Lx Ax Dt Ct Bt At
  1058.             fmul    dword ptr [edx+10*4]        ;Bx Ax Dt Ct Bt At
  1059.             fld        dword ptr [esi+ 5*4+1*2048]    ;Rx Bx Ax Dt Ct Bt At
  1060.             fmul    dword ptr [ecx+ 5*4]        ;Cx Bx Ax Dt Ct Bt At
  1061.             fld        dword ptr [esi+ 5*4+1*2048]    ;Rx Cx Bx Ax Dt Ct Bt At
  1062.             fmul    dword ptr [edx+10*4]        ;Dx Cx Bx Ax Dt Ct Bt At
  1063.             fxch    st(3)                        ;Ax Cx Bx Dx Dt Ct Bt At
  1064.             fsubp    st(7),st                    ;Cx Bx Dx Dt Ct Bt At
  1065.             fxch    st(1)                        ;Bx Cx Dx Dt Ct Bt At
  1066.             faddp    st(5),st                    ;Cx Dx Dt Ct Bt At
  1067.             fsubp    st(3),st                    ;Dx Dt Ct Bt At
  1068.             faddp    st(1),st                    ;Dt Ct Bt At
  1069.  
  1070.             fld        dword ptr [esi+ 6*4+0*2048]    ;Lx Dt Ct Bt At
  1071.             fmul    dword ptr [ecx+ 6*4]        ;Ax Dt Ct Bt At
  1072.             fld        dword ptr [esi+ 6*4+0*2048]    ;Lx Ax Dt Ct Bt At
  1073.             fmul    dword ptr [edx+ 9*4]        ;Bx Ax Dt Ct Bt At
  1074.             fld        dword ptr [esi+ 6*4+1*2048]    ;Rx Bx Ax Dt Ct Bt At
  1075.             fmul    dword ptr [ecx+ 6*4]        ;Cx Bx Ax Dt Ct Bt At
  1076.             fld        dword ptr [esi+ 6*4+1*2048]    ;Rx Cx Bx Ax Dt Ct Bt At
  1077.             fmul    dword ptr [edx+ 9*4]        ;Dx Cx Bx Ax Dt Ct Bt At
  1078.             fxch    st(3)                        ;Ax Cx Bx Dx Dt Ct Bt At
  1079.             faddp    st(7),st                    ;Cx Bx Dx Dt Ct Bt At
  1080.             fxch    st(1)                        ;Bx Cx Dx Dt Ct Bt At
  1081.             faddp    st(5),st                    ;Cx Dx Dt Ct Bt At
  1082.             faddp    st(3),st                    ;Dx Dt Ct Bt At
  1083.             faddp    st(1),st                    ;Dt Ct Bt At
  1084.  
  1085.             fld        dword ptr [esi+ 7*4+0*2048]    ;Lx Dt Ct Bt At
  1086.             fmul    dword ptr [ecx+ 7*4]        ;Ax Dt Ct Bt At
  1087.             fld        dword ptr [esi+ 7*4+0*2048]    ;Lx Ax Dt Ct Bt At
  1088.             fmul    dword ptr [edx+ 8*4]        ;Bx Ax Dt Ct Bt At
  1089.             fld        dword ptr [esi+ 7*4+1*2048]    ;Rx Bx Ax Dt Ct Bt At
  1090.             fmul    dword ptr [ecx+ 7*4]        ;Cx Bx Ax Dt Ct Bt At
  1091.             fld        dword ptr [esi+ 7*4+1*2048]    ;Rx Cx Bx Ax Dt Ct Bt At
  1092.             fmul    dword ptr [edx+ 8*4]        ;Dx Cx Bx Ax Dt Ct Bt At
  1093.             fxch    st(3)                        ;Ax Cx Bx Dx Dt Ct Bt At
  1094.             fsubp    st(7),st                    ;Cx Bx Dx Dt Ct Bt At
  1095.             fxch    st(1)                        ;Bx Cx Dx Dt Ct Bt At
  1096.             faddp    st(5),st                    ;Cx Dx Dt Ct Bt At
  1097.             fsubp    st(3),st                    ;Dx Dt Ct Bt At
  1098.             faddp    st(1),st                    ;Dt Ct Bt At
  1099.  
  1100.             fld        dword ptr [esi+ 8*4+0*2048]    ;Lx Dt Ct Bt At
  1101.             fmul    dword ptr [ecx+ 8*4]        ;Ax Dt Ct Bt At
  1102.             fld        dword ptr [esi+ 8*4+0*2048]    ;Lx Ax Dt Ct Bt At
  1103.             fmul    dword ptr [edx+ 7*4]        ;Bx Ax Dt Ct Bt At
  1104.             fld        dword ptr [esi+ 8*4+1*2048]    ;Rx Bx Ax Dt Ct Bt At
  1105.             fmul    dword ptr [ecx+ 8*4]        ;Cx Bx Ax Dt Ct Bt At
  1106.             fld        dword ptr [esi+ 8*4+1*2048]    ;Rx Cx Bx Ax Dt Ct Bt At
  1107.             fmul    dword ptr [edx+ 7*4]        ;Dx Cx Bx Ax Dt Ct Bt At
  1108.             fxch    st(3)                        ;Ax Cx Bx Dx Dt Ct Bt At
  1109.             faddp    st(7),st                    ;Cx Bx Dx Dt Ct Bt At
  1110.             fxch    st(1)                        ;Bx Cx Dx Dt Ct Bt At
  1111.             faddp    st(5),st                    ;Cx Dx Dt Ct Bt At
  1112.             faddp    st(3),st                    ;Dx Dt Ct Bt At
  1113.             faddp    st(1),st                    ;Dt Ct Bt At
  1114.  
  1115.             fld        dword ptr [esi+ 9*4+0*2048]    ;Lx Dt Ct Bt At
  1116.             fmul    dword ptr [ecx+ 9*4]        ;Ax Dt Ct Bt At
  1117.             fld        dword ptr [esi+ 9*4+0*2048]    ;Lx Ax Dt Ct Bt At
  1118.             fmul    dword ptr [edx+ 6*4]        ;Bx Ax Dt Ct Bt At
  1119.             fld        dword ptr [esi+ 9*4+1*2048]    ;Rx Bx Ax Dt Ct Bt At
  1120.             fmul    dword ptr [ecx+ 9*4]        ;Cx Bx Ax Dt Ct Bt At
  1121.             fld        dword ptr [esi+ 9*4+1*2048]    ;Rx Cx Bx Ax Dt Ct Bt At
  1122.             fmul    dword ptr [edx+ 6*4]        ;Dx Cx Bx Ax Dt Ct Bt At
  1123.             fxch    st(3)                        ;Ax Cx Bx Dx Dt Ct Bt At
  1124.             fsubp    st(7),st                    ;Cx Bx Dx Dt Ct Bt At
  1125.             fxch    st(1)                        ;Bx Cx Dx Dt Ct Bt At
  1126.             faddp    st(5),st                    ;Cx Dx Dt Ct Bt At
  1127.             fsubp    st(3),st                    ;Dx Dt Ct Bt At
  1128.             faddp    st(1),st                    ;Dt Ct Bt At
  1129.  
  1130.             fld        dword ptr [esi+10*4+0*2048]    ;Lx Dt Ct Bt At
  1131.             fmul    dword ptr [ecx+10*4]        ;Ax Dt Ct Bt At
  1132.             fld        dword ptr [esi+10*4+0*2048]    ;Lx Ax Dt Ct Bt At
  1133.             fmul    dword ptr [edx+ 5*4]        ;Bx Ax Dt Ct Bt At
  1134.             fld        dword ptr [esi+10*4+1*2048]    ;Rx Bx Ax Dt Ct Bt At
  1135.             fmul    dword ptr [ecx+10*4]        ;Cx Bx Ax Dt Ct Bt At
  1136.             fld        dword ptr [esi+10*4+1*2048]    ;Rx Cx Bx Ax Dt Ct Bt At
  1137.             fmul    dword ptr [edx+ 5*4]        ;Dx Cx Bx Ax Dt Ct Bt At
  1138.             fxch    st(3)                        ;Ax Cx Bx Dx Dt Ct Bt At
  1139.             faddp    st(7),st                    ;Cx Bx Dx Dt Ct Bt At
  1140.             fxch    st(1)                        ;Bx Cx Dx Dt Ct Bt At
  1141.             faddp    st(5),st                    ;Cx Dx Dt Ct Bt At
  1142.             faddp    st(3),st                    ;Dx Dt Ct Bt At
  1143.             faddp    st(1),st                    ;Dt Ct Bt At
  1144.  
  1145.             fld        dword ptr [esi+11*4+0*2048]    ;Lx Dt Ct Bt At
  1146.             fmul    dword ptr [ecx+11*4]        ;Ax Dt Ct Bt At
  1147.             fld        dword ptr [esi+11*4+0*2048]    ;Lx Ax Dt Ct Bt At
  1148.             fmul    dword ptr [edx+ 4*4]        ;Bx Ax Dt Ct Bt At
  1149.             fld        dword ptr [esi+11*4+1*2048]    ;Rx Bx Ax Dt Ct Bt At
  1150.             fmul    dword ptr [ecx+11*4]        ;Cx Bx Ax Dt Ct Bt At
  1151.             fld        dword ptr [esi+11*4+1*2048]    ;Rx Cx Bx Ax Dt Ct Bt At
  1152.             fmul    dword ptr [edx+ 4*4]        ;Dx Cx Bx Ax Dt Ct Bt At
  1153.             fxch    st(3)                        ;Ax Cx Bx Dx Dt Ct Bt At
  1154.             fsubp    st(7),st                    ;Cx Bx Dx Dt Ct Bt At
  1155.             fxch    st(1)                        ;Bx Cx Dx Dt Ct Bt At
  1156.             faddp    st(5),st                    ;Cx Dx Dt Ct Bt At
  1157.             fsubp    st(3),st                    ;Dx Dt Ct Bt At
  1158.             faddp    st(1),st                    ;Dt Ct Bt At
  1159.  
  1160.             fld        dword ptr [esi+12*4+0*2048]    ;Lx Dt Ct Bt At
  1161.             fmul    dword ptr [ecx+12*4]        ;Ax Dt Ct Bt At
  1162.             fld        dword ptr [esi+12*4+0*2048]    ;Lx Ax Dt Ct Bt At
  1163.             fmul    dword ptr [edx+ 3*4]        ;Bx Ax Dt Ct Bt At
  1164.             fld        dword ptr [esi+12*4+1*2048]    ;Rx Bx Ax Dt Ct Bt At
  1165.             fmul    dword ptr [ecx+12*4]        ;Cx Bx Ax Dt Ct Bt At
  1166.             fld        dword ptr [esi+12*4+1*2048]    ;Rx Cx Bx Ax Dt Ct Bt At
  1167.             fmul    dword ptr [edx+ 3*4]        ;Dx Cx Bx Ax Dt Ct Bt At
  1168.             fxch    st(3)                        ;Ax Cx Bx Dx Dt Ct Bt At
  1169.             faddp    st(7),st                    ;Cx Bx Dx Dt Ct Bt At
  1170.             fxch    st(1)                        ;Bx Cx Dx Dt Ct Bt At
  1171.             faddp    st(5),st                    ;Cx Dx Dt Ct Bt At
  1172.             faddp    st(3),st                    ;Dx Dt Ct Bt At
  1173.             faddp    st(1),st                    ;Dt Ct Bt At
  1174.  
  1175.             fld        dword ptr [esi+13*4+0*2048]    ;Lx Dt Ct Bt At
  1176.             fmul    dword ptr [ecx+13*4]        ;Ax Dt Ct Bt At
  1177.             fld        dword ptr [esi+13*4+0*2048]    ;Lx Ax Dt Ct Bt At
  1178.             fmul    dword ptr [edx+ 2*4]        ;Bx Ax Dt Ct Bt At
  1179.             fld        dword ptr [esi+13*4+1*2048]    ;Rx Bx Ax Dt Ct Bt At
  1180.             fmul    dword ptr [ecx+13*4]        ;Cx Bx Ax Dt Ct Bt At
  1181.             fld        dword ptr [esi+13*4+1*2048]    ;Rx Cx Bx Ax Dt Ct Bt At
  1182.             fmul    dword ptr [edx+ 2*4]        ;Dx Cx Bx Ax Dt Ct Bt At
  1183.             fxch    st(3)                        ;Ax Cx Bx Dx Dt Ct Bt At
  1184.             fsubp    st(7),st                    ;Cx Bx Dx Dt Ct Bt At
  1185.             fxch    st(1)                        ;Bx Cx Dx Dt Ct Bt At
  1186.             faddp    st(5),st                    ;Cx Dx Dt Ct Bt At
  1187.             fsubp    st(3),st                    ;Dx Dt Ct Bt At
  1188.             faddp    st(1),st                    ;Dt Ct Bt At
  1189.  
  1190.             fld        dword ptr [esi+14*4+0*2048]    ;Lx Dt Ct Bt At
  1191.             fmul    dword ptr [ecx+14*4]        ;Ax Dt Ct Bt At
  1192.             fld        dword ptr [esi+14*4+0*2048]    ;Lx Ax Dt Ct Bt At
  1193.             fmul    dword ptr [edx+ 1*4]        ;Bx Ax Dt Ct Bt At
  1194.             fld        dword ptr [esi+14*4+1*2048]    ;Rx Bx Ax Dt Ct Bt At
  1195.             fmul    dword ptr [ecx+14*4]        ;Cx Bx Ax Dt Ct Bt At
  1196.             fld        dword ptr [esi+14*4+1*2048]    ;Rx Cx Bx Ax Dt Ct Bt At
  1197.             fmul    dword ptr [edx+ 1*4]        ;Dx Cx Bx Ax Dt Ct Bt At
  1198.             fxch    st(3)                        ;Ax Cx Bx Dx Dt Ct Bt At
  1199.             faddp    st(7),st                    ;Cx Bx Dx Dt Ct Bt At
  1200.             fxch    st(1)                        ;Bx Cx Dx Dt Ct Bt At
  1201.             faddp    st(5),st                    ;Cx Dx Dt Ct Bt At
  1202.             faddp    st(3),st                    ;Dx Dt Ct Bt At
  1203.             faddp    st(1),st                    ;Dt Ct Bt At
  1204.  
  1205.             fld        dword ptr [esi+15*4+0*2048]    ;Lx Dt Ct Bt At
  1206.             fmul    dword ptr [ecx+15*4]        ;Ax Dt Ct Bt At
  1207.             fld        dword ptr [esi+15*4+0*2048]    ;Lx Ax Dt Ct Bt At
  1208.             fmul    dword ptr [edx+ 0*4]        ;Bx Ax Dt Ct Bt At
  1209.             fld        dword ptr [esi+15*4+1*2048]    ;Rx Bx Ax Dt Ct Bt At
  1210.             fmul    dword ptr [ecx+15*4]        ;Cx Bx Ax Dt Ct Bt At
  1211.             fld        dword ptr [esi+15*4+1*2048]    ;Rx Cx Bx Ax Dt Ct Bt At
  1212.             fmul    dword ptr [edx+ 0*4]        ;Dx Cx Bx Ax Dt Ct Bt At
  1213.             fxch    st(3)                        ;Ax Cx Bx Dx Dt Ct Bt At
  1214.             fsubp    st(7),st                    ;Cx Bx Dx Dt Ct Bt At
  1215.             fxch    st(1)                        ;Bx Cx Dx Dt Ct Bt At
  1216.             faddp    st(5),st                    ;Cx Dx Dt Ct Bt At
  1217.             fsubp    st(3),st                    ;Dx Dt Ct Bt At
  1218.             faddp    st(1),st                    ;Dt Ct Bt At
  1219.  
  1220.             add        ecx,32*4
  1221.             add        edx,32*4
  1222.             add        esi,16*4
  1223.  
  1224.             fistp    dword ptr [esp+12]            ;[esp+8] = Dt
  1225.             fistp    dword ptr [esp+8]            ;[esp+12] = Ct
  1226.             fistp    dword ptr [esp+4]            ;[esp+0] = Bt
  1227.             fistp    dword ptr [esp+0]            ;[esp+4] = At
  1228.  
  1229.             mov        eax,[esp+4]
  1230.             cmp        eax,-32768
  1231.             jge        div1_noclip1low
  1232.             mov        eax,-32768
  1233. div1_noclip1low:
  1234.             cmp        eax,32767
  1235.             jle        div1_noclip1high
  1236.             mov        eax,32767
  1237. div1_noclip1high:
  1238.             mov        [edi],ax
  1239.  
  1240.             mov        eax,[esp+12]
  1241.             cmp        eax,-32768
  1242.             jge        div1_noclip3low
  1243.             mov        eax,-32768
  1244. div1_noclip3low:
  1245.             cmp        eax,32767
  1246.             jle        div1_noclip3high
  1247.             mov        eax,32767
  1248. div1_noclip3high:
  1249.             mov        [edi+2],ax
  1250.  
  1251.  
  1252.             mov        eax,[esp+0]
  1253.             cmp        eax,-32768
  1254.             jge        div1_noclip2low
  1255.             mov        eax,-32768
  1256. div1_noclip2low:
  1257.             cmp        eax,32767
  1258.             jle        div1_noclip2high
  1259.             mov        eax,32767
  1260. div1_noclip2high:
  1261.             mov        [ebx],ax
  1262.             nop
  1263.  
  1264.             mov        eax,[esp+8]
  1265.             cmp        eax,-32768
  1266.             jge        div1_noclip4low
  1267.             mov        eax,-32768
  1268. div1_noclip4low:
  1269.             cmp        eax,32767
  1270.             jle        div1_noclip4high
  1271.             mov        eax,32767
  1272. div1_noclip4high:
  1273.             mov        [ebx+2],ax
  1274.             nop
  1275.  
  1276.  
  1277.             add        ebx,4
  1278.             sub        edi,4
  1279.  
  1280.             dec        ebp
  1281.             jne        div1_loop
  1282.             pop        eax
  1283.             pop        eax
  1284.             pop        eax
  1285.             pop        eax
  1286.             pop        ebp
  1287.  
  1288.             pop        edi
  1289.             mov        ebx,esi
  1290.             pop        esi
  1291. ;            mov        window,ecx
  1292. ;            mov        window2,edx
  1293. ;            mov        u_ptr,ebx
  1294.         };
  1295. #else
  1296.         for (i = 1; i < 16; i++) {
  1297.             sum1 = 0.0F;
  1298.             sum2 = 0.0F;
  1299.             sum3 = 0.0F;
  1300.             sum4 = 0.0F;
  1301.  
  1302.             window = &wincoef[i][16-vb_ptr];
  1303.             window2 = &wincoef[i][vb_ptr & 15];
  1304.  
  1305.             si = 256+i*16;
  1306.  
  1307.             sum1 += window [ 0] * vbuf[0][si+ 0];
  1308.             sum2 += window2[15] * vbuf[0][si+ 0];
  1309.             sum3 += window [ 0] * vbuf[1][si+ 0];
  1310.             sum4 += window2[15] * vbuf[1][si+ 0];
  1311.             sum1 -= window [ 1] * vbuf[0][si+ 1];
  1312.             sum2 += window2[14] * vbuf[0][si+ 1];
  1313.             sum3 -= window [ 1] * vbuf[1][si+ 1];
  1314.             sum4 += window2[14] * vbuf[1][si+ 1];
  1315.             sum1 += window [ 2] * vbuf[0][si+ 2];
  1316.             sum2 += window2[13] * vbuf[0][si+ 2];
  1317.             sum3 += window [ 2] * vbuf[1][si+ 2];
  1318.             sum4 += window2[13] * vbuf[1][si+ 2];
  1319.             sum1 -= window [ 3] * vbuf[0][si+ 3];
  1320.             sum2 += window2[12] * vbuf[0][si+ 3];
  1321.             sum3 -= window [ 3] * vbuf[1][si+ 3];
  1322.             sum4 += window2[12] * vbuf[1][si+ 3];
  1323.             sum1 += window [ 4] * vbuf[0][si+ 4];
  1324.             sum2 += window2[11] * vbuf[0][si+ 4];
  1325.             sum3 += window [ 4] * vbuf[1][si+ 4];
  1326.             sum4 += window2[11] * vbuf[1][si+ 4];
  1327.             sum1 -= window [ 5] * vbuf[0][si+ 5];
  1328.             sum2 += window2[10] * vbuf[0][si+ 5];
  1329.             sum3 -= window [ 5] * vbuf[1][si+ 5];
  1330.             sum4 += window2[10] * vbuf[1][si+ 5];
  1331.             sum1 += window [ 6] * vbuf[0][si+ 6];
  1332.             sum2 += window2[ 9] * vbuf[0][si+ 6];
  1333.             sum3 += window [ 6] * vbuf[1][si+ 6];
  1334.             sum4 += window2[ 9] * vbuf[1][si+ 6];
  1335.             sum1 -= window [ 7] * vbuf[0][si+ 7];
  1336.             sum2 += window2[ 8] * vbuf[0][si+ 7];
  1337.             sum3 -= window [ 7] * vbuf[1][si+ 7];
  1338.             sum4 += window2[ 8] * vbuf[1][si+ 7];
  1339.             sum1 += window [ 8] * vbuf[0][si+ 8];
  1340.             sum2 += window2[ 7] * vbuf[0][si+ 8];
  1341.             sum3 += window [ 8] * vbuf[1][si+ 8];
  1342.             sum4 += window2[ 7] * vbuf[1][si+ 8];
  1343.             sum1 -= window [ 9] * vbuf[0][si+ 9];
  1344.             sum2 += window2[ 6] * vbuf[0][si+ 9];
  1345.             sum3 -= window [ 9] * vbuf[1][si+ 9];
  1346.             sum4 += window2[ 6] * vbuf[1][si+ 9];
  1347.             sum1 += window [10] * vbuf[0][si+10];
  1348.             sum2 += window2[ 5] * vbuf[0][si+10];
  1349.             sum3 += window [10] * vbuf[1][si+10];
  1350.             sum4 += window2[ 5] * vbuf[1][si+10];
  1351.             sum1 -= window [11] * vbuf[0][si+11];
  1352.             sum2 += window2[ 4] * vbuf[0][si+11];
  1353.             sum3 -= window [11] * vbuf[1][si+11];
  1354.             sum4 += window2[ 4] * vbuf[1][si+11];
  1355.             sum1 += window [12] * vbuf[0][si+12];
  1356.             sum2 += window2[ 3] * vbuf[0][si+12];
  1357.             sum3 += window [12] * vbuf[1][si+12];
  1358.             sum4 += window2[ 3] * vbuf[1][si+12];
  1359.             sum1 -= window [13] * vbuf[0][si+13];
  1360.             sum2 += window2[ 2] * vbuf[0][si+13];
  1361.             sum3 -= window [13] * vbuf[1][si+13];
  1362.             sum4 += window2[ 2] * vbuf[1][si+13];
  1363.             sum1 += window [14] * vbuf[0][si+14];
  1364.             sum2 += window2[ 1] * vbuf[0][si+14];
  1365.             sum3 += window [14] * vbuf[1][si+14];
  1366.             sum4 += window2[ 1] * vbuf[1][si+14];
  1367.             sum1 -= window [15] * vbuf[0][si+15];
  1368.             sum2 += window2[ 0] * vbuf[0][si+15];
  1369.             sum3 -= window [15] * vbuf[1][si+15];
  1370.             sum4 += window2[ 0] * vbuf[1][si+15];
  1371.  
  1372.             tmp = float_to_long(sum1);
  1373.             if (tmp > 32767)
  1374.                 tmp = 32767;
  1375.             else if (tmp < -32768)
  1376.                 tmp = -32768;
  1377.  
  1378.             pcm[i*2] = tmp;
  1379.  
  1380.             tmp = float_to_long(sum3);
  1381.             if (tmp > 32767)
  1382.                 tmp = 32767;
  1383.             else if (tmp < -32768)
  1384.                 tmp = -32768;
  1385.  
  1386.             pcm[i*2+1] = tmp;
  1387.         
  1388.  
  1389.             tmp = float_to_long(sum2);
  1390.             if (tmp > 32767)
  1391.                 tmp = 32767;
  1392.             else if (tmp < -32768)
  1393.                 tmp = -32768;
  1394.  
  1395.             pcm[64-i*2] = tmp;
  1396.         
  1397.             tmp = float_to_long(sum4);
  1398.             if (tmp > 32767)
  1399.                 tmp = 32767;
  1400.             else if (tmp < -32768)
  1401.                 tmp = -32768;
  1402.  
  1403.             pcm[64-i*2+1] = tmp;
  1404.         
  1405.         }
  1406. #endif
  1407.     }
  1408.  
  1409.  
  1410.  
  1411.     /*--  special case --*/
  1412.     coef = 0;
  1413.     bx = (vb_ptr+1)&15;
  1414.  
  1415.     sum1 = sum2 = 0.0F;
  1416.  
  1417.     for (j = 0; j < 8; j++) {
  1418.         sum1 += wincoef2[coef] * vbuf[0][bx];
  1419.         sum2 += wincoef2[coef] * vbuf[1][bx];    bx = (bx+2)&15;
  1420.         ++coef;
  1421.     }
  1422.  
  1423.     tmp = (long)sum1;
  1424.  
  1425.     if (tmp > 32767)
  1426.         tmp = 32767;
  1427.     else if (tmp < -32768)
  1428.         tmp = -32768;
  1429.     pcm[32] = tmp;
  1430.  
  1431.     tmp = (long)sum2;
  1432.  
  1433.     if (tmp > 32767)
  1434.         tmp = 32767;
  1435.     else if (tmp < -32768)
  1436.         tmp = -32768;
  1437.     pcm[33] = tmp;
  1438. }
  1439.  
  1440. void window_mono(const float *vbuf, int vb_ptr, short *pcm) {
  1441.     double converter;
  1442.     int i, j;
  1443.     int si, bx;
  1444.     int coef;
  1445.     float *window, *window2;
  1446.     float sum1, sum2;
  1447.     long tmp;
  1448.  
  1449.     coef = 0;
  1450.  
  1451. /* first */
  1452.  
  1453.     i = 0;
  1454.     if (vb_ptr & 1) {
  1455.             sum1 = 0.0F;
  1456.  
  1457.             window = &wincoef[i][(-vb_ptr) & 15];
  1458.  
  1459.             si = 256-i*16;
  1460.  
  1461.             sum1 -= window[ 0] * vbuf[si+ 0];
  1462.             sum1 += window[ 1] * vbuf[si+ 1];
  1463.             sum1 -= window[ 2] * vbuf[si+ 2];
  1464.             sum1 += window[ 3] * vbuf[si+ 3];
  1465.             sum1 -= window[ 4] * vbuf[si+ 4];
  1466.             sum1 += window[ 5] * vbuf[si+ 5];
  1467.             sum1 -= window[ 6] * vbuf[si+ 6];
  1468.             sum1 += window[ 7] * vbuf[si+ 7];
  1469.             sum1 -= window[ 8] * vbuf[si+ 8];
  1470.             sum1 += window[ 9] * vbuf[si+ 9];
  1471.             sum1 -= window[10] * vbuf[si+10];
  1472.             sum1 += window[11] * vbuf[si+11];
  1473.             sum1 -= window[12] * vbuf[si+12];
  1474.             sum1 += window[13] * vbuf[si+13];
  1475.             sum1 -= window[14] * vbuf[si+14];
  1476.             sum1 += window[15] * vbuf[si+15];
  1477.  
  1478.             tmp = float_to_long(sum1);
  1479.             if (tmp > 32767)
  1480.                 tmp = 32767;
  1481.             else if (tmp < -32768)
  1482.                 tmp = -32768;
  1483.  
  1484.             pcm[i] = tmp;
  1485.     } else {
  1486.             sum1 = 0.0F;
  1487.  
  1488.             window = &wincoef[i][(-vb_ptr) & 15];
  1489.  
  1490.             si = 256+i*16;
  1491.  
  1492.             sum1 += window[ 0] * vbuf[si+ 0];
  1493.             sum1 -= window[ 1] * vbuf[si+ 1];
  1494.             sum1 += window[ 2] * vbuf[si+ 2];
  1495.             sum1 -= window[ 3] * vbuf[si+ 3];
  1496.             sum1 += window[ 4] * vbuf[si+ 4];
  1497.             sum1 -= window[ 5] * vbuf[si+ 5];
  1498.             sum1 += window[ 6] * vbuf[si+ 6];
  1499.             sum1 -= window[ 7] * vbuf[si+ 7];
  1500.             sum1 += window[ 8] * vbuf[si+ 8];
  1501.             sum1 -= window[ 9] * vbuf[si+ 9];
  1502.             sum1 += window[10] * vbuf[si+10];
  1503.             sum1 -= window[11] * vbuf[si+11];
  1504.             sum1 += window[12] * vbuf[si+12];
  1505.             sum1 -= window[13] * vbuf[si+13];
  1506.             sum1 += window[14] * vbuf[si+14];
  1507.             sum1 -= window[15] * vbuf[si+15];
  1508.  
  1509.             tmp = float_to_long(sum1);
  1510.             if (tmp > 32767)
  1511.                 tmp = 32767;
  1512.             else if (tmp < -32768)
  1513.                 tmp = -32768;
  1514.  
  1515.             pcm[i] = tmp;
  1516.     }
  1517.  
  1518. /*-- 1-16, last 15 --*/
  1519.  
  1520.     if (vb_ptr & 1) {
  1521. #ifdef USE_ASM
  1522.         window = &wincoef[1][16-vb_ptr];
  1523.         window2 = &wincoef[1][vb_ptr];
  1524.  
  1525.         const float *vbuf2 = vbuf+240;
  1526.  
  1527.         __asm {
  1528.             push    esi
  1529.             push    vbuf2
  1530.             mov        edx,window
  1531.             mov        ecx,window2
  1532.             mov        ebx,pcm
  1533.             pop        esi
  1534.             push    edi
  1535.             mov        edi,ebx
  1536.             add        ebx,2
  1537.             add        edi,62
  1538.             cmp        eax,2
  1539.             push    ebp
  1540.             push    0
  1541.             push    0
  1542.             mov        ebp,15
  1543. div0_loop:
  1544.             fld        dword ptr [esi+ 0*4]    ;x0
  1545.             fmul    dword ptr [ecx+15*4]    ;A0
  1546.             fld        dword ptr [esi+ 0*4]    ;x0 A0
  1547.             fmul    dword ptr [edx+ 0*4]    ;B0 A0
  1548.             fld        dword ptr [esi+ 1*4]    ;x1 B0 A0
  1549.             fmul    dword ptr [ecx+14*4]    ;A1 B0 A0
  1550.             fld        dword ptr [esi+ 1*4]    ;x1 A1 B0 A0
  1551.             fmul    dword ptr [edx+ 1*4]    ;B1 A1 B0 A0
  1552.             fld        dword ptr [esi+ 2*4]    ;x2 B1 A1 B0 A0
  1553.             fxch    st(2)                    ;A1 B1 x2 B0 A0
  1554.             faddp    st(4),st                ;B1 x2 B0 At
  1555.             fsubp    st(2),st                ;x2 Bt At
  1556.             fmul    dword ptr [ecx+13*4]    ;A2 Bt At
  1557.             fld        dword ptr [esi+ 2*4]    ;x2 A2 Bt At
  1558.             fmul    dword ptr [edx+ 2*4]    ;B2 A2 Bt At
  1559.  
  1560.             fld        dword ptr [esi+ 3*4]    ;x3 B2 A2 Bt At
  1561.             fxch    st(2)                    ;A2 B2 x3 Bt At
  1562.             faddp    st(4),st                ;B2 x3 Bt At
  1563.             faddp    st(2),st                ;x3 Bt At
  1564.             fmul    dword ptr [ecx+12*4]    ;A3 Bt At
  1565.             fld        dword ptr [esi+ 3*4]    ;x3 A3 Bt At
  1566.             fmul    dword ptr [edx+ 3*4]    ;B3 A3 Bt At
  1567.  
  1568.             fld        dword ptr [esi+ 4*4]    ;x3 B2 A2 Bt At
  1569.             fxch    st(2)                    ;A2 B2 x3 Bt At
  1570.             faddp    st(4),st                ;B2 x3 Bt At
  1571.             fsubp    st(2),st                ;x3 Bt At
  1572.             fmul    dword ptr [ecx+11*4]    ;A3 Bt At
  1573.             fld        dword ptr [esi+ 4*4]    ;x3 A3 Bt At
  1574.             fmul    dword ptr [edx+ 4*4]    ;B3 A3 Bt At
  1575.  
  1576.             fld        dword ptr [esi+ 5*4]    ;x3 B2 A2 Bt At
  1577.             fxch    st(2)                    ;A2 B2 x3 Bt At
  1578.             faddp    st(4),st                ;B2 x3 Bt At
  1579.             faddp    st(2),st                ;x3 Bt At
  1580.             fmul    dword ptr [ecx+10*4]    ;A3 Bt At
  1581.             fld        dword ptr [esi+ 5*4]    ;x3 A3 Bt At
  1582.             fmul    dword ptr [edx+ 5*4]    ;B3 A3 Bt At
  1583.  
  1584.             fld        dword ptr [esi+ 6*4]    ;x3 B2 A2 Bt At
  1585.             fxch    st(2)                    ;A2 B2 x3 Bt At
  1586.             faddp    st(4),st                ;B2 x3 Bt At
  1587.             fsubp    st(2),st                ;x3 Bt At
  1588.             fmul    dword ptr [ecx+ 9*4]    ;A3 Bt At
  1589.             fld        dword ptr [esi+ 6*4]    ;x3 A3 Bt At
  1590.             fmul    dword ptr [edx+ 6*4]    ;B3 A3 Bt At
  1591.  
  1592.             fld        dword ptr [esi+ 7*4]    ;x3 B2 A2 Bt At
  1593.             fxch    st(2)                    ;A2 B2 x3 Bt At
  1594.             faddp    st(4),st                ;B2 x3 Bt At
  1595.             faddp    st(2),st                ;x3 Bt At
  1596.             fmul    dword ptr [ecx+ 8*4]    ;A3 Bt At
  1597.             fld        dword ptr [esi+ 7*4]    ;x3 A3 Bt At
  1598.             fmul    dword ptr [edx+ 7*4]    ;B3 A3 Bt At
  1599.  
  1600.             fld        dword ptr [esi+ 8*4]    ;x3 B2 A2 Bt At
  1601.             fxch    st(2)                    ;A2 B2 x3 Bt At
  1602.             faddp    st(4),st                ;B2 x3 Bt At
  1603.             fsubp    st(2),st                ;x3 Bt At
  1604.             fmul    dword ptr [ecx+ 7*4]    ;A3 Bt At
  1605.             fld        dword ptr [esi+ 8*4]    ;x3 A3 Bt At
  1606.             fmul    dword ptr [edx+ 8*4]    ;B3 A3 Bt At
  1607.  
  1608.             fld        dword ptr [esi+ 9*4]    ;x3 B2 A2 Bt At
  1609.             fxch    st(2)                    ;A2 B2 x3 Bt At
  1610.             faddp    st(4),st                ;B2 x3 Bt At
  1611.             faddp    st(2),st                ;x3 Bt At
  1612.             fmul    dword ptr [ecx+ 6*4]    ;A3 Bt At
  1613.             fld        dword ptr [esi+ 9*4]    ;x3 A3 Bt At
  1614.             fmul    dword ptr [edx+ 9*4]    ;B3 A3 Bt At
  1615.  
  1616.             fld        dword ptr [esi+10*4]    ;x3 B2 A2 Bt At
  1617.             fxch    st(2)                    ;A2 B2 x3 Bt At
  1618.             faddp    st(4),st                ;B2 x3 Bt At
  1619.             fsubp    st(2),st                ;x3 Bt At
  1620.             fmul    dword ptr [ecx+ 5*4]    ;A3 Bt At
  1621.             fld        dword ptr [esi+10*4]    ;x3 A3 Bt At
  1622.             fmul    dword ptr [edx+10*4]    ;B3 A3 Bt At
  1623.  
  1624.             fld        dword ptr [esi+11*4]    ;x3 B2 A2 Bt At
  1625.             fxch    st(2)                    ;A2 B2 x3 Bt At
  1626.             faddp    st(4),st                ;B2 x3 Bt At
  1627.             faddp    st(2),st                ;x3 Bt At
  1628.             fmul    dword ptr [ecx+ 4*4]    ;A3 Bt At
  1629.             fld        dword ptr [esi+11*4]    ;x3 A3 Bt At
  1630.             fmul    dword ptr [edx+11*4]    ;B3 A3 Bt At
  1631.  
  1632.             fld        dword ptr [esi+12*4]    ;x3 B2 A2 Bt At
  1633.             fxch    st(2)                    ;A2 B2 x3 Bt At
  1634.             faddp    st(4),st                ;B2 x3 Bt At
  1635.             fsubp    st(2),st                ;x3 Bt At
  1636.             fmul    dword ptr [ecx+ 3*4]    ;A3 Bt At
  1637.             fld        dword ptr [esi+12*4]    ;x3 A3 Bt At
  1638.             fmul    dword ptr [edx+12*4]    ;B3 A3 Bt At
  1639.  
  1640.             fld        dword ptr [esi+13*4]    ;x3 B2 A2 Bt At
  1641.             fxch    st(2)                    ;A2 B2 x3 Bt At
  1642.             faddp    st(4),st                ;B2 x3 Bt At
  1643.             faddp    st(2),st                ;x3 Bt At
  1644.             fmul    dword ptr [ecx+ 2*4]    ;A3 Bt At
  1645.             fld        dword ptr [esi+13*4]    ;x3 A3 Bt At
  1646.             fmul    dword ptr [edx+13*4]    ;B3 A3 Bt At
  1647.  
  1648.             fld        dword ptr [esi+14*4]    ;x3 B2 A2 Bt At
  1649.             fxch    st(2)                    ;A2 B2 x3 Bt At
  1650.             faddp    st(4),st                ;B2 x3 Bt At
  1651.             fsubp    st(2),st                ;x3 Bt At
  1652.             fmul    dword ptr [ecx+ 1*4]    ;A3 Bt At
  1653.             fld        dword ptr [esi+14*4]    ;x3 A3 Bt At
  1654.             fmul    dword ptr [edx+14*4]    ;B3 A3 Bt At
  1655.  
  1656.             fld        dword ptr [esi+15*4]    ;xF BE AE Bt At
  1657.             fxch    st(2)                    ;AE BE xF Bt At
  1658.             faddp    st(4),st                ;BE xF Bt At
  1659.             faddp    st(2),st                ;xF Bt At
  1660.             fmul    dword ptr [ecx+ 0*4]    ;AF Bt At
  1661.             fld        dword ptr [esi+15*4]    ;xF AF Bt At
  1662.             fmul    dword ptr [edx+15*4]    ;BF AF Bt At
  1663.  
  1664.             add        ecx,32*4
  1665.             add        edx,32*4
  1666.             sub        esi,16*4
  1667.  
  1668.             fsubp    st(2),st                ;AF Bt At
  1669.             faddp    st(2),st                ;Bt At
  1670.             fchs
  1671.             fistp    dword ptr [esp+0]        ;[esp+0] = outf3
  1672.             fistp    dword ptr [esp+4]        ;[esp+4] = outf1
  1673.  
  1674.             mov        eax,[esp+4]
  1675.             cmp        eax,-32768
  1676.             jge        div0_noclip1low
  1677.             mov        eax,-32768
  1678. div0_noclip1low:
  1679.             cmp        eax,32767
  1680.             jle        div0_noclip1high
  1681.             mov        eax,32767
  1682. div0_noclip1high:
  1683.             mov        [edi],ax
  1684.             mov        eax,[esp+0]
  1685.             cmp        eax,-32768
  1686.             jge        div0_noclip2low
  1687.             mov        eax,-32768
  1688. div0_noclip2low:
  1689.             cmp        eax,32767
  1690.             jle        div0_noclip2high
  1691.             mov        eax,32767
  1692. div0_noclip2high:
  1693.             mov        [ebx],ax
  1694.             nop
  1695.  
  1696.             add        ebx,2
  1697.             sub        edi,2
  1698.  
  1699.             dec        ebp
  1700.             jne        div0_loop
  1701.             pop        eax
  1702.             pop        eax
  1703.             pop        ebp
  1704.  
  1705.             pop        edi
  1706.             mov        ebx,esi
  1707.             pop        esi
  1708. ;            mov        window,ecx
  1709. ;            mov        window2,edx
  1710. ;            mov        u_ptr,ebx
  1711.         };
  1712. #else
  1713.         for (i = 1; i < 16; i++) {
  1714.             sum1 = 0.0F;
  1715.             sum2 = 0.0F;
  1716.  
  1717.             window = &wincoef[i][16-vb_ptr];
  1718.             window2 = &wincoef[i][vb_ptr];
  1719.  
  1720.             si = 256-i*16;
  1721.  
  1722.             sum1 -= window [ 0] * vbuf[si+ 0];
  1723.             sum2 += window2[15] * vbuf[si+ 0];
  1724.             sum1 += window [ 1] * vbuf[si+ 1];
  1725.             sum2 += window2[14] * vbuf[si+ 1];
  1726.             sum1 -= window [ 2] * vbuf[si+ 2];
  1727.             sum2 += window2[13] * vbuf[si+ 2];
  1728.             sum1 += window [ 3] * vbuf[si+ 3];
  1729.             sum2 += window2[12] * vbuf[si+ 3];
  1730.             sum1 -= window [ 4] * vbuf[si+ 4];
  1731.             sum2 += window2[11] * vbuf[si+ 4];
  1732.             sum1 += window [ 5] * vbuf[si+ 5];
  1733.             sum2 += window2[10] * vbuf[si+ 5];
  1734.             sum1 -= window [ 6] * vbuf[si+ 6];
  1735.             sum2 += window2[ 9] * vbuf[si+ 6];
  1736.             sum1 += window [ 7] * vbuf[si+ 7];
  1737.             sum2 += window2[ 8] * vbuf[si+ 7];
  1738.             sum1 -= window [ 8] * vbuf[si+ 8];
  1739.             sum2 += window2[ 7] * vbuf[si+ 8];
  1740.             sum1 += window [ 9] * vbuf[si+ 9];
  1741.             sum2 += window2[ 6] * vbuf[si+ 9];
  1742.             sum1 -= window [10] * vbuf[si+10];
  1743.             sum2 += window2[ 5] * vbuf[si+10];
  1744.             sum1 += window [11] * vbuf[si+11];
  1745.             sum2 += window2[ 4] * vbuf[si+11];
  1746.             sum1 -= window [12] * vbuf[si+12];
  1747.             sum2 += window2[ 3] * vbuf[si+12];
  1748.             sum1 += window [13] * vbuf[si+13];
  1749.             sum2 += window2[ 2] * vbuf[si+13];
  1750.             sum1 -= window [14] * vbuf[si+14];
  1751.             sum2 += window2[ 1] * vbuf[si+14];
  1752.             sum1 += window [15] * vbuf[si+15];
  1753.             sum2 += window2[ 0] * vbuf[si+15];
  1754.  
  1755.             tmp = float_to_long(sum1);
  1756.             if (tmp > 32767)
  1757.                 tmp = 32767;
  1758.             else if (tmp < -32768)
  1759.                 tmp = -32768;
  1760.  
  1761.             pcm[i] = tmp;
  1762.  
  1763.  
  1764.  
  1765.             tmp = float_to_long(sum2);
  1766.             if (tmp > 32767)
  1767.                 tmp = 32767;
  1768.             else if (tmp < -32768)
  1769.                 tmp = -32768;
  1770.  
  1771.             pcm[32-i] = tmp;
  1772.  
  1773.         }
  1774. #endif
  1775.     } else {
  1776. #ifdef USE_ASM
  1777.         window = &wincoef[1][16-vb_ptr];
  1778.         window2 = &wincoef[1][vb_ptr];
  1779.  
  1780.         const float *vbuf2 = vbuf+272;
  1781.  
  1782.         __asm {
  1783.             push    esi
  1784.             push    vbuf2
  1785.             mov        edx,window
  1786.             mov        ecx,window2
  1787.             mov        ebx,pcm
  1788.             pop        esi
  1789.             push    edi
  1790.             mov        edi,ebx
  1791.             add        ebx,2
  1792.             add        edi,62
  1793.             cmp        eax,2
  1794.             push    ebp
  1795.             push    0
  1796.             push    0
  1797.             mov        ebp,15
  1798. div1_loop:
  1799.             fld        dword ptr [esi+ 0*4]    ;x0
  1800.             fmul    dword ptr [ecx+15*4]    ;A0
  1801.             fld        dword ptr [esi+ 0*4]    ;x0 A0
  1802.             fmul    dword ptr [edx+ 0*4]    ;B0 A0
  1803.             fld        dword ptr [esi+ 1*4]    ;x1 B0 A0
  1804.             fmul    dword ptr [ecx+14*4]    ;A1 B0 A0
  1805.             fld        dword ptr [esi+ 1*4]    ;x1 A1 B0 A0
  1806.             fmul    dword ptr [edx+ 1*4]    ;B1 A1 B0 A0
  1807.             fld        dword ptr [esi+ 2*4]    ;x2 B1 A1 B0 A0
  1808.             fxch    st(2)                    ;A1 B1 x2 B0 A0
  1809.             faddp    st(4),st                ;B1 x2 B0 At
  1810.             fsubp    st(2),st                ;x2 Bt At
  1811.             fmul    dword ptr [ecx+13*4]    ;A2 Bt At
  1812.             fld        dword ptr [esi+ 2*4]    ;x2 A2 Bt At
  1813.             fmul    dword ptr [edx+ 2*4]    ;B2 A2 Bt At
  1814.  
  1815.             fld        dword ptr [esi+ 3*4]    ;x3 B2 A2 Bt At
  1816.             fxch    st(2)                    ;A2 B2 x3 Bt At
  1817.             faddp    st(4),st                ;B2 x3 Bt At
  1818.             faddp    st(2),st                ;x3 Bt At
  1819.             fmul    dword ptr [ecx+12*4]    ;A3 Bt At
  1820.             fld        dword ptr [esi+ 3*4]    ;x3 A3 Bt At
  1821.             fmul    dword ptr [edx+ 3*4]    ;B3 A3 Bt At
  1822.  
  1823.             fld        dword ptr [esi+ 4*4]    ;x3 B2 A2 Bt At
  1824.             fxch    st(2)                    ;A2 B2 x3 Bt At
  1825.             faddp    st(4),st                ;B2 x3 Bt At
  1826.             fsubp    st(2),st                ;x3 Bt At
  1827.             fmul    dword ptr [ecx+11*4]    ;A3 Bt At
  1828.             fld        dword ptr [esi+ 4*4]    ;x3 A3 Bt At
  1829.             fmul    dword ptr [edx+ 4*4]    ;B3 A3 Bt At
  1830.  
  1831.             fld        dword ptr [esi+ 5*4]    ;x3 B2 A2 Bt At
  1832.             fxch    st(2)                    ;A2 B2 x3 Bt At
  1833.             faddp    st(4),st                ;B2 x3 Bt At
  1834.             faddp    st(2),st                ;x3 Bt At
  1835.             fmul    dword ptr [ecx+10*4]    ;A3 Bt At
  1836.             fld        dword ptr [esi+ 5*4]    ;x3 A3 Bt At
  1837.             fmul    dword ptr [edx+ 5*4]    ;B3 A3 Bt At
  1838.  
  1839.             fld        dword ptr [esi+ 6*4]    ;x3 B2 A2 Bt At
  1840.             fxch    st(2)                    ;A2 B2 x3 Bt At
  1841.             faddp    st(4),st                ;B2 x3 Bt At
  1842.             fsubp    st(2),st                ;x3 Bt At
  1843.             fmul    dword ptr [ecx+ 9*4]    ;A3 Bt At
  1844.             fld        dword ptr [esi+ 6*4]    ;x3 A3 Bt At
  1845.             fmul    dword ptr [edx+ 6*4]    ;B3 A3 Bt At
  1846.  
  1847.             fld        dword ptr [esi+ 7*4]    ;x3 B2 A2 Bt At
  1848.             fxch    st(2)                    ;A2 B2 x3 Bt At
  1849.             faddp    st(4),st                ;B2 x3 Bt At
  1850.             faddp    st(2),st                ;x3 Bt At
  1851.             fmul    dword ptr [ecx+ 8*4]    ;A3 Bt At
  1852.             fld        dword ptr [esi+ 7*4]    ;x3 A3 Bt At
  1853.             fmul    dword ptr [edx+ 7*4]    ;B3 A3 Bt At
  1854.  
  1855.             fld        dword ptr [esi+ 8*4]    ;x3 B2 A2 Bt At
  1856.             fxch    st(2)                    ;A2 B2 x3 Bt At
  1857.             faddp    st(4),st                ;B2 x3 Bt At
  1858.             fsubp    st(2),st                ;x3 Bt At
  1859.             fmul    dword ptr [ecx+ 7*4]    ;A3 Bt At
  1860.             fld        dword ptr [esi+ 8*4]    ;x3 A3 Bt At
  1861.             fmul    dword ptr [edx+ 8*4]    ;B3 A3 Bt At
  1862.  
  1863.             fld        dword ptr [esi+ 9*4]    ;x3 B2 A2 Bt At
  1864.             fxch    st(2)                    ;A2 B2 x3 Bt At
  1865.             faddp    st(4),st                ;B2 x3 Bt At
  1866.             faddp    st(2),st                ;x3 Bt At
  1867.             fmul    dword ptr [ecx+ 6*4]    ;A3 Bt At
  1868.             fld        dword ptr [esi+ 9*4]    ;x3 A3 Bt At
  1869.             fmul    dword ptr [edx+ 9*4]    ;B3 A3 Bt At
  1870.  
  1871.             fld        dword ptr [esi+10*4]    ;x3 B2 A2 Bt At
  1872.             fxch    st(2)                    ;A2 B2 x3 Bt At
  1873.             faddp    st(4),st                ;B2 x3 Bt At
  1874.             fsubp    st(2),st                ;x3 Bt At
  1875.             fmul    dword ptr [ecx+ 5*4]    ;A3 Bt At
  1876.             fld        dword ptr [esi+10*4]    ;x3 A3 Bt At
  1877.             fmul    dword ptr [edx+10*4]    ;B3 A3 Bt At
  1878.  
  1879.             fld        dword ptr [esi+11*4]    ;x3 B2 A2 Bt At
  1880.             fxch    st(2)                    ;A2 B2 x3 Bt At
  1881.             faddp    st(4),st                ;B2 x3 Bt At
  1882.             faddp    st(2),st                ;x3 Bt At
  1883.             fmul    dword ptr [ecx+ 4*4]    ;A3 Bt At
  1884.             fld        dword ptr [esi+11*4]    ;x3 A3 Bt At
  1885.             fmul    dword ptr [edx+11*4]    ;B3 A3 Bt At
  1886.  
  1887.             fld        dword ptr [esi+12*4]    ;x3 B2 A2 Bt At
  1888.             fxch    st(2)                    ;A2 B2 x3 Bt At
  1889.             faddp    st(4),st                ;B2 x3 Bt At
  1890.             fsubp    st(2),st                ;x3 Bt At
  1891.             fmul    dword ptr [ecx+ 3*4]    ;A3 Bt At
  1892.             fld        dword ptr [esi+12*4]    ;x3 A3 Bt At
  1893.             fmul    dword ptr [edx+12*4]    ;B3 A3 Bt At
  1894.  
  1895.             fld        dword ptr [esi+13*4]    ;x3 B2 A2 Bt At
  1896.             fxch    st(2)                    ;A2 B2 x3 Bt At
  1897.             faddp    st(4),st                ;B2 x3 Bt At
  1898.             faddp    st(2),st                ;x3 Bt At
  1899.             fmul    dword ptr [ecx+ 2*4]    ;A3 Bt At
  1900.             fld        dword ptr [esi+13*4]    ;x3 A3 Bt At
  1901.             fmul    dword ptr [edx+13*4]    ;B3 A3 Bt At
  1902.  
  1903.             fld        dword ptr [esi+14*4]    ;x3 B2 A2 Bt At
  1904.             fxch    st(2)                    ;A2 B2 x3 Bt At
  1905.             faddp    st(4),st                ;B2 x3 Bt At
  1906.             fsubp    st(2),st                ;x3 Bt At
  1907.             fmul    dword ptr [ecx+ 1*4]    ;A3 Bt At
  1908.             fld        dword ptr [esi+14*4]    ;x3 A3 Bt At
  1909.             fmul    dword ptr [edx+14*4]    ;B3 A3 Bt At
  1910.  
  1911.             fld        dword ptr [esi+15*4]    ;xF BE AE Bt At
  1912.             fxch    st(2)                    ;AE BE xF Bt At
  1913.             faddp    st(4),st                ;BE xF Bt At
  1914.             faddp    st(2),st                ;xF Bt At
  1915.             fmul    dword ptr [ecx+ 0*4]    ;AF Bt At
  1916.             fld        dword ptr [esi+15*4]    ;xF AF Bt At
  1917.             fmul    dword ptr [edx+15*4]    ;BF AF Bt At
  1918.  
  1919.             add        ecx,32*4
  1920.             add        edx,32*4
  1921.             add        esi,16*4
  1922.  
  1923.             fsubp    st(2),st                ;AF Bt At
  1924.             faddp    st(2),st                ;Bt At
  1925.             fistp    dword ptr [esp+0]        ;[esp+0] = outf3
  1926.             fistp    dword ptr [esp+4]        ;[esp+4] = outf1
  1927.  
  1928.             mov        eax,[esp+0]
  1929.             cmp        eax,-32768
  1930.             jge        div1_noclip1low
  1931.             mov        eax,-32768
  1932. div1_noclip1low:
  1933.             cmp        eax,32767
  1934.             jle        div1_noclip1high
  1935.             mov        eax,32767
  1936. div1_noclip1high:
  1937.             mov        [ebx],ax
  1938.             mov        eax,[esp+4]
  1939.             cmp        eax,-32768
  1940.             jge        div1_noclip2low
  1941.             mov        eax,-32768
  1942. div1_noclip2low:
  1943.             cmp        eax,32767
  1944.             jle        div1_noclip2high
  1945.             mov        eax,32767
  1946. div1_noclip2high:
  1947.             mov        [edi],ax
  1948.             nop
  1949.  
  1950.             add        ebx,2
  1951.             sub        edi,2
  1952.  
  1953.             dec        ebp
  1954.             jne        div1_loop
  1955.             pop        eax
  1956.             pop        eax
  1957.             pop        ebp
  1958.  
  1959.             pop        edi
  1960.             mov        ebx,esi
  1961.             pop        esi
  1962. ;            mov        window,ecx
  1963. ;            mov        window2,edx
  1964. ;            mov        u_ptr,ebx
  1965.         };
  1966. #else
  1967.         for (i = 1; i < 16; i++) {
  1968.             sum1 = 0.0F;
  1969.             sum2 = 0.0F;
  1970.  
  1971.             window = &wincoef[i][16-vb_ptr];
  1972.             window2 = &wincoef[i][vb_ptr & 15];
  1973.  
  1974.             si = 256+i*16;
  1975.  
  1976.             sum1 += window [ 0] * vbuf[si+ 0];
  1977.             sum2 += window2[15] * vbuf[si+ 0];
  1978.             sum1 -= window [ 1] * vbuf[si+ 1];
  1979.             sum2 += window2[14] * vbuf[si+ 1];
  1980.             sum1 += window [ 2] * vbuf[si+ 2];
  1981.             sum2 += window2[13] * vbuf[si+ 2];
  1982.             sum1 -= window [ 3] * vbuf[si+ 3];
  1983.             sum2 += window2[12] * vbuf[si+ 3];
  1984.             sum1 += window [ 4] * vbuf[si+ 4];
  1985.             sum2 += window2[11] * vbuf[si+ 4];
  1986.             sum1 -= window [ 5] * vbuf[si+ 5];
  1987.             sum2 += window2[10] * vbuf[si+ 5];
  1988.             sum1 += window [ 6] * vbuf[si+ 6];
  1989.             sum2 += window2[ 9] * vbuf[si+ 6];
  1990.             sum1 -= window [ 7] * vbuf[si+ 7];
  1991.             sum2 += window2[ 8] * vbuf[si+ 7];
  1992.             sum1 += window [ 8] * vbuf[si+ 8];
  1993.             sum2 += window2[ 7] * vbuf[si+ 8];
  1994.             sum1 -= window [ 9] * vbuf[si+ 9];
  1995.             sum2 += window2[ 6] * vbuf[si+ 9];
  1996.             sum1 += window [10] * vbuf[si+10];
  1997.             sum2 += window2[ 5] * vbuf[si+10];
  1998.             sum1 -= window [11] * vbuf[si+11];
  1999.             sum2 += window2[ 4] * vbuf[si+11];
  2000.             sum1 += window [12] * vbuf[si+12];
  2001.             sum2 += window2[ 3] * vbuf[si+12];
  2002.             sum1 -= window [13] * vbuf[si+13];
  2003.             sum2 += window2[ 2] * vbuf[si+13];
  2004.             sum1 += window [14] * vbuf[si+14];
  2005.             sum2 += window2[ 1] * vbuf[si+14];
  2006.             sum1 -= window [15] * vbuf[si+15];
  2007.             sum2 += window2[ 0] * vbuf[si+15];
  2008.  
  2009.             tmp = float_to_long(sum1);
  2010.             if (tmp > 32767)
  2011.                 tmp = 32767;
  2012.             else if (tmp < -32768)
  2013.                 tmp = -32768;
  2014.  
  2015.             pcm[i] = tmp;
  2016.  
  2017.         
  2018.  
  2019.             tmp = float_to_long(sum2);
  2020.             if (tmp > 32767)
  2021.                 tmp = 32767;
  2022.             else if (tmp < -32768)
  2023.                 tmp = -32768;
  2024.  
  2025.             pcm[32-i] = tmp;
  2026.         
  2027.         }
  2028. #endif
  2029.     }
  2030.  
  2031.  
  2032.  
  2033.     /*--  special case --*/
  2034.     coef = 0;
  2035.     bx = (vb_ptr+1)&15;
  2036.  
  2037.     sum1 = 0.0F;
  2038.  
  2039.     for (j = 0; j < 8; j++) {
  2040.         sum1 += wincoef2[coef++] * vbuf[bx];    bx = (bx+2)&15;
  2041.     }
  2042.  
  2043.     tmp = (long)sum1;
  2044.  
  2045.     if (tmp > 32767)
  2046.         tmp = 32767;
  2047.     else if (tmp < -32768)
  2048.         tmp = -32768;
  2049.     pcm[16] = tmp;
  2050.  
  2051. }
  2052.  
  2053. static bool pp_init_flag = true;
  2054.  
  2055. static void pp_init() {
  2056.     int i,j;
  2057.  
  2058.     pp_init_flag = false;
  2059.  
  2060.     for(i=0; i<16; i++)
  2061.         for(j=0; j<16; j++)
  2062.             wincoef[i][j+16] = wincoef[i][j];
  2063. }
  2064.  
  2065. void AMPDecoder::polyphase(float *band_l, float *band_r, short *samples, bool invert_odd) {
  2066.     if (pp_init_flag)
  2067.         pp_init();
  2068.     
  2069.     fdct32(band_l, window[0] + winptr, !!(winptr & 1), invert_odd);
  2070.     if (band_r) {
  2071.         fdct32(band_r, window[1] + winptr, !!(winptr & 1), invert_odd);
  2072. //        window_dual(window[0], winptr, samples);
  2073. //        window_dual(window[1], winptr, samples + 1);
  2074.         window_dual(window, winptr, samples);
  2075.     } else
  2076.         window_mono(window[0], winptr, samples);
  2077.  
  2078.     winptr = (winptr - 1) & 15;
  2079. }
  2080.  
  2081. #if 0
  2082. void AMPDecoder::polyphase_single(float *band, int ch, short *samples) {
  2083.     if (pp_init_flag)
  2084.         pp_init();
  2085.  
  2086.     fdct32(band, window[ch] + winptr, !!(winptr&1), false);
  2087.     window_dual(window[ch], winptr, samples);
  2088.  
  2089.     winptr = (winptr - 1) & 15;
  2090. }
  2091. #endif
  2092.  
  2093. void AMPDecoder::polyphase_retract(int amount) {
  2094.     winptr = (winptr +
  2095.         amount) & 15;
  2096. }
  2097.