home *** CD-ROM | disk | FTP | other *** search
/ AmigActive 13 / AACD13.ISO / AACD / Sound / LAME / src / i386 / fft3dn.nas < prev    next >
Text File  |  2000-01-30  |  12KB  |  673 lines

  1. ; back port from GOGO-no coda 2.24b by Takehiro TOMINAGA
  2.  
  3. ; GOGO-no-coda
  4. ;    Copyright (C) 1999 shigeo
  5. ;    special thanks to URURI
  6.  
  7. %include "nasm.h"
  8.  
  9.     externdef costab_fft
  10.     externdef sintab_fft
  11.  
  12.     segment_data
  13.     align 32
  14. D_1_41421    dd    1.41421356    , 1.41421356
  15. D_1_0    dd    1.0        , 1.0
  16. D_0_5    dd    0.5        , 0.5
  17. D_0_25    dd    0.25    , 0.25
  18. D_0_02236    dd    0.02236067    , 0.02236067
  19. D_0_0005    dd    0.0005    , 0.0005
  20. D_0_0    dd    0.0        , 0.0
  21.  
  22. D_1_0_D_0_0    dd    0.0        , 1.0
  23. D_0_0_D_1_0    dd    1.0        , 0.0
  24.  
  25. D_MSB1_0    dd    0x00000000    , 0x80000000
  26. D_MSB1_1    dd    0x80000000    , 0x80000000
  27. D_MSB0_1    dd    0x80000000    , 0x00000000
  28.  
  29.     segment_code
  30.  
  31. ;void fht_3DN2(float *fz, int n);
  32. proc    fht_3DN2
  33.  
  34. %$fz    arg    4
  35. %$n    arg    4
  36.  
  37. %$k    local    4
  38.  
  39. %$Ps2_Pc2    local    8
  40. %$Mc2_Ps2    local    8
  41.  
  42. %$t_s    local    8
  43. %$t_c    local    8
  44.     alloc
  45.  
  46.     femms
  47.     pushd    ebp, ebx, esi, edi
  48.  
  49. fht_3DN_1st_part:
  50.  
  51. fht_3DN_2nd_part:
  52.  
  53. fht_3DN_3rd_part:
  54.  
  55. .do_init:
  56.     mov    r3, 16            ;k1*fsize = 4*fsize = k4
  57.     mov    r4, 8            ;kx = k1/2
  58.     mov    r2, 48            ;k3*fsize
  59.     mov    dword [sp(%$k)], 2    ;k = 2
  60.     mov    r0, [sp(%$fz)]        ;fi
  61.     lea    r1, [r0+8]        ;gi = fi + kx
  62.     jmp    .do
  63.  
  64.     align 16
  65. .do:
  66.     pmov    mm6, [D_MSB1_0]        ;MSB1_0
  67.     pmov    mm7, [D_1_41421]
  68.  
  69. .do2:
  70.     ;f
  71.     pmov    mm1, [r0+r3]    ;fi1
  72.     pmov    mm4, [r0+r2]    ;fi3
  73.     pmov    mm0, [r0]        ;fi0
  74.     pmov    mm3, [r0+r3*2]    ;fi2
  75.  
  76.     pupldq    mm1, mm1
  77.     pupldq    mm4, mm4
  78.     pupldq    mm0, mm0        ;fi0 | fi0
  79.     pupldq    mm3, mm3        ;fi2 | fi2
  80.  
  81.     pxor    mm1, mm6        ;-fi1 | fi1
  82.     pxor    mm4, mm6        ;-fi3 | fi3
  83.  
  84.     pfadd    mm0, mm1        ;f1 | f0
  85.     pfadd    mm3, mm4        ;f3 | f2
  86.  
  87.     pmov    mm4, mm0
  88.     pfadd    mm0, mm3        ;fi1 | fi0
  89.     pfsub    mm4, mm3        ;fi3 | fi2
  90.  
  91.     pmovd    [r0], mm0        ;fi[0]
  92.     puphdq    mm0, mm0
  93.     pmovd    [r0+r3*2], mm4    ;fi[k2]
  94.     puphdq    mm4, mm4
  95.  
  96.     pmovd    [r0+r3], mm0    ;fi[k1]
  97.     pmovd    [r0+r2], mm4    ;fi[k3]
  98.  
  99.     ;g
  100.     pmov    mm1, [r1+r3]    ;gi1
  101.     pmov    mm0, [r1]        ;gi0
  102.     pmov    mm3, [r1+r3*2]    ;gi2
  103.     pmov    mm5, [r1+r2]    ;gi3
  104.  
  105.     pupldq    mm1, mm1
  106.     pupldq    mm0, mm0        ;gi0 | gi0
  107.     pupldq    mm3, mm5        ;gi3 | gi2
  108.  
  109.     pxor    mm1, mm6        ;-gi1 | gi1
  110.  
  111.     pfadd    mm0, mm1        ;g1 | g0
  112.     pfmul    mm3, mm7        ;g3 | g2
  113.  
  114.     pmov    mm4, mm0
  115.     pfadd    mm0, mm3        ;gi1 | gi0
  116.     pfsub    mm4, mm3        ;gi3 | gi2
  117.  
  118.     pmovd    [r1], mm0        ;gi[0]
  119.     puphdq    mm0, mm0
  120.     pmovd    [r1+r3*2], mm4    ;gi[k2]
  121.     puphdq    mm4, mm4
  122.  
  123.     pmovd    [r1+r3], mm0    ;gi[k1]
  124.     pmovd    [r1+r2], mm4    ;gi[k3]
  125.  
  126.     lea    r0, [r0+r3*4]
  127.     lea    r1, [r1+r3*4]
  128.     cmp    r0, r6
  129.     jb near .do2
  130.  
  131.     
  132.     mov    r0, [sp(%$k)]
  133.     pmov    mm0, [costab_fft +r0*4]
  134.     pmov    mm1, [sintab_fft +r0*4]
  135.     pupldq    mm0, mm0
  136.     pupldq    mm1, mm1
  137.     pmov    mm6, [D_1_0_D_0_0]        ;c1 | s1
  138.     pmov    mm7, [D_0_0_D_1_0]        ;-s1 | c1
  139.     pmov    [sp(%$t_c)], mm0
  140.     pmov    [sp(%$t_s)], mm1
  141.  
  142. .for_init:
  143.     mov    r5, 4        ;i = 1*fsize
  144.     jmp    .for
  145.  
  146.     align 16
  147. .for:
  148.     pfmul    mm6, [sp(%$t_c)]    ;c1*t_c | s1*t_c
  149.     pfmul    mm7, [sp(%$t_s)]    ;-s1*t_s | c1*t_s
  150.  
  151.     pfadd    mm6, mm7        ;c1 | s1
  152.     pmov    mm7, [D_MSB0_1]
  153.  
  154.     pmov    mm1, mm6
  155.     pxor    mm7, mm6        ;c1 | -s1
  156.  
  157.     puphdq    mm1, mm1        ;c1
  158.     pmov    mm0, mm7
  159.  
  160.     pupldq    mm2, mm7
  161.     pfmul    mm0, mm6        ;c1*c1 | -s1*s1
  162.     pfmul    mm1, mm6        ;c1*s1
  163.  
  164.     puphdq    mm7, mm2        ;-s1 | c1
  165.     pfacc    mm0, mm0        ;c2
  166.     pfadd    mm1, mm1        ;s2 = 2*c1*s1
  167.  
  168.     pupldq    mm1, mm0        ;c2 | s2
  169.     pupldq    mm0, mm1        ;s2 | c2
  170.  
  171.     pxor    mm1, [D_MSB1_0]    ;-c2 | s2
  172.  
  173.     pmov    [sp(%$Ps2_Pc2)], mm0
  174.     pmov    [sp(%$Mc2_Ps2)], mm1
  175.  
  176.     mov    r0, [sp(%$fz)]
  177.     mov    r1, [sp(%$fz)]
  178.     add    r0, r5        ;r0 = fi
  179.     add    r1, r3
  180.     sub    r1, r5        ;r1 = gi
  181.     jmp    .do3
  182.  
  183.     align 16
  184. .do3:
  185.     pmov    mm2, [r0+r3]
  186.     pmov    mm4, [r1+r3]
  187.     pmov    mm3, [r0+r2]
  188.     pmov    mm5, [r1+r2]
  189.  
  190.     pupldq    mm2, mm2
  191.     pupldq    mm4, mm4
  192.     pupldq    mm3, mm3
  193.     pupldq    mm5, mm5
  194.  
  195.     pmov    mm0, [sp(%$Ps2_Pc2)]
  196.     pmov    mm1, [sp(%$Mc2_Ps2)]
  197.  
  198.     pfmul    mm2, mm0        ;s2 * fi1 | c2 * fi1
  199.     pfmul    mm4, mm1        ;-c2 * gi1 | s2 * gi1
  200.     pfmul    mm3, mm0        ;s2 * fi3 | c2 * fi3
  201.     pfmul    mm5, mm1        ;-c2 * gi3 | s2 * gi3
  202.  
  203.     pfadd    mm2, mm4        ;b | a
  204.     pfadd    mm3, mm5        ;d | c
  205.  
  206.     pmov    mm0, [r0]
  207.     pmov    mm4, [r1]
  208.     pmov    mm1, [r0+r3*2]
  209.     pmov    mm5, [r1+r3*2]
  210.  
  211.     pupldq    mm0, mm4        ;gi0 | fi0
  212.     pupldq    mm1, mm5        ;gi2 | fi2
  213.  
  214.     pmov    mm4, mm2
  215.     pmov    mm5, mm3
  216.  
  217.     pfadd    mm2, mm0        ;g0 | f0
  218.     pfadd    mm3, mm1        ;g2 | f2
  219.  
  220.     pfsub    mm0, mm4        ;g1 | f1
  221.     pfsub    mm1, mm5        ;g3 | f3
  222.  
  223.  
  224.     pmov    mm4, mm3
  225.     pmov    mm5, mm1
  226.  
  227.     pupldq    mm4, mm4        ;f2 | f2
  228.     puphdq    mm5, mm5        ;g3 | g3
  229.     puphdq    mm3, mm3        ;g2 | g2
  230.     pupldq    mm1, mm1        ;f3 | f3
  231.  
  232.     pfmul    mm4, mm6        ;f2 * c1 | f2 * s1
  233.     pfmul    mm5, mm7        ;g3 * -s1 | g3 * c1
  234.     pfmul    mm3, mm6        ;g2 * c1 | g2 * s1
  235.     pfmul    mm1, mm7        ;f3 * -s1 | f3 * c1
  236.  
  237.     pfsub    mm4, mm5        ;a | b
  238.     pfadd    mm3, mm1        ;d | c
  239.  
  240.     pmov    mm5, mm2
  241.     pmov    mm1, mm0
  242.  
  243.     pupldq    mm2, mm2        ;f0 | f0
  244.     pupldq    mm0, mm0        ;f1 | f1
  245.  
  246.     puphdq    mm1, mm2        ;f0 | g1
  247.     puphdq    mm5, mm0        ;f1 | g0
  248.  
  249.     pmov    mm2, mm4
  250.     pmov    mm0, mm3
  251.  
  252.     pfadd    mm4, mm1        ;fi0 | gi1
  253.     pfadd    mm3, mm5        ;fi1 | gi0
  254.     pfsub    mm1, mm2        ;fi2 | gi3
  255.     pfsub    mm5, mm0        ;fi3 | gi2
  256.  
  257.     pmovd    [r1+r3], mm4    ;gi[k1]
  258.     puphdq    mm4, mm4
  259.     pmovd    [r1], mm3        ;gi[0]
  260.     puphdq    mm3, mm3
  261.     pmovd    [r1+r2], mm1    ;gi[k3]
  262.     puphdq    mm1, mm1
  263.     pmovd    [r1+r3*2], mm5    ;gi[k2]
  264.     puphdq    mm5, mm5
  265.  
  266.     pmovd    [r0], mm4        ;fi[0]
  267.     pmovd    [r0+r3], mm3    ;fi[k1]
  268.     pmovd    [r0+r3*2], mm1    ;fi[k2]
  269.     pmovd    [r0+r2], mm5    ;fi[k3]
  270.  
  271.     lea    r0, [r0+r3*4]
  272.     lea    r1, [r1+r3*4]
  273.     cmp    r0, r6
  274.     jb near    .do3
  275.  
  276.     add    r5, 4
  277.     cmp    r5, r4
  278.     jb near    .for
  279.  
  280.     cmp    r3, [sp(%$n)]
  281.     jae    .exit
  282.  
  283.     add    dword [sp(%$k)], 2    ;k  += 2;
  284.     lea    r3, [r3*4]        ;k1 *= 4
  285.     lea    r2, [r2*4]        ;k3 *= 4
  286.     lea    r4, [r4*4]        ;kx *= 4
  287.     mov    r0, [sp(%$fz)]    ;fi
  288.     lea    r1, [r0+r4]        ;gi = fi + kx
  289.     jmp    .do
  290.  
  291. .exit:
  292.     femms
  293.     popd    ebp, ebx, esi, edi
  294. endproc
  295.  
  296. ;***********************************************************************
  297. %ifdef USE_E3DN
  298.  
  299. ;void fht_E3DN(float *fz, int n);
  300. proc    fht_E3DN
  301.  
  302. %$fz    arg    4
  303. %$n    arg    4
  304.  
  305. %$k    local    4
  306.  
  307. %$Ps2_Pc2    local    8
  308. %$Mc2_Ps2    local    8
  309.  
  310. %$t_s    local    8
  311. %$t_c    local    8
  312.     alloc
  313.  
  314.     femms
  315.     pushd    ebp, ebx, esi, edi
  316.  
  317. fht_E3DN_1st_part:
  318.  
  319. fht_E3DN_2nd_part:
  320.  
  321. fht_E3DN_3rd_part:
  322.  
  323. .do_init:
  324.     mov    r3, 16            ;k1*fsize = 4*fsize = k4
  325.     mov    r4, 8            ;kx = k1/2
  326.     mov    r2, 48            ;k3*fsize
  327.     mov    dword [sp(%$k)], 2    ;k = 2
  328.     mov    r0, [sp(%$fz)]        ;fi
  329.     lea    r1, [r0+8]        ;gi = fi + kx
  330.     jmp    .do
  331.  
  332.     align 16
  333. .do:
  334.     pmov    mm7, [D_1_41421]
  335.  
  336. .do2:
  337.     pmov    mm0, [r0]        ;fi0
  338.     pupldq    mm0, [r0+r3]    ;fi1 | fi0
  339.     pmov    mm1, [r0+r3*2]    ;fi2
  340.     pupldq    mm1, [r0+r2]    ;fi3 | fi2
  341.     pmov    mm3, [r1]        ;gi0
  342.     pupldq    mm3, [r1+r3]    ;gi1 | gi0
  343.     pmov    mm4, [r1+r2]    ;gi3
  344.     pupldq    mm4, [r1+r3*2]    ;gi2 | gi3
  345.  
  346.     pfpnacc    mm0, mm0        ;f0 | f1
  347.     pfpnacc    mm1, mm1        ;f2 | f3
  348.     pfpnacc    mm3, mm3        ;g0 | g1
  349.     pfmul    mm4, mm7        ;g2 | g3
  350.  
  351.     pmov    mm2, mm0
  352.     pfadd    mm0, mm1        ;fi0 | fi1
  353.     pfsub    mm2, mm1        ;fi2 | fi3
  354.     pmov    mm5, mm3
  355.     pfadd    mm3, mm4        ;gi0 | gi1
  356.     pfsub    mm5, mm4        ;gi2 | gi3
  357.  
  358.     pmovd    [r0+r3], mm0    ;fi[k1]
  359.     puphdq    mm0, mm0
  360.     pmovd    [r0+r2], mm2    ;fi[k3]
  361.     puphdq    mm2, mm2
  362.     pmovd    [r1+r3], mm3    ;gi[k1]
  363.     puphdq    mm3, mm3
  364.     pmovd    [r1+r2], mm5    ;gi[k3]
  365.     puphdq    mm5, mm5
  366.  
  367.     pmovd    [r0], mm0        ;fi[0]
  368.     pmovd    [r0+r3*2], mm2    ;fi[k2]
  369.     pmovd    [r1], mm3        ;gi[0]
  370.     pmovd    [r1+r3*2], mm5    ;gi[k2]
  371.  
  372.     lea    r0, [r0+r3*4]
  373.     lea    r1, [r1+r3*4]
  374.     cmp    r0, r6
  375.     jb near .do2
  376.  
  377.     
  378.     mov    r0, [sp(%$k)]
  379.     pmov    mm0, [costab_fft +r0*4]
  380.     pmov    mm1, [sintab_fft +r0*4]
  381.     pupldq    mm0, mm0
  382.     pupldq    mm1, mm1
  383.     pmov    mm6, [D_1_0_D_0_0]        ;c1 | s1
  384.     pmov    mm7, [D_0_0_D_1_0]        ;-s1 | c1
  385.     pmov    [sp(%$t_c)], mm0
  386.     pmov    [sp(%$t_s)], mm1
  387.  
  388. .for_init:
  389.     mov    r5, 4        ;i = 1*fsize
  390.     jmp    .for
  391.  
  392.     align 16
  393. .for:
  394.     pfmul    mm6, [sp(%$t_c)]    ;c1*t_c | s1*t_c
  395.     pfmul    mm7, [sp(%$t_s)]    ;-s1*t_s | c1*t_s
  396.  
  397.     pfadd    mm6, mm7        ;c1 | s1
  398.     pmov    mm7, [D_MSB0_1]
  399.  
  400.     pswapd    mm1, mm6        ;s1 | c1
  401.     pswapd    mm0, mm6
  402.     pxor    mm7, mm6        ;c1 | -s1
  403.  
  404.     pfmul    mm1, mm6        ;c1*s1 | c1*s1
  405.     pfmul    mm0, mm0        ;s1*s1 | c1*c1
  406.     pswapd    mm7, mm7        ;-s1 | c1
  407.  
  408.     pfpnacc    mm0, mm1        ;s2 = 2*c1*s1 | c2 = c1*c1-s1*s1
  409.     pswapd    mm1, mm0        ;c2 | s2
  410.     pxor    mm1, [D_MSB1_0]    ;-c2 | s2
  411.  
  412.     pmov    [sp(%$Ps2_Pc2)], mm0
  413.     pmov    [sp(%$Mc2_Ps2)], mm1
  414.  
  415.     mov    r0, [sp(%$fz)]
  416.     mov    r1, [sp(%$fz)]
  417.     add    r0, r5        ;r0 = fi
  418.     add    r1, r3
  419.     sub    r1, r5        ;r1 = gi
  420.     jmp    .do3
  421.  
  422.     align 16
  423. .do3:
  424.     pmov    mm0, [r0+r2]
  425.     pmov    mm2, [r1+r2]
  426.     pmov    mm1, [r0+r3]
  427.     pmov    mm3, [r1+r3]
  428.  
  429.     pupldq    mm0, mm0
  430.     pupldq    mm2, mm2
  431.     pupldq    mm1, mm1
  432.     pupldq    mm3, mm3
  433.  
  434.     pmov    mm4, [sp(%$Ps2_Pc2)]
  435.     pmov    mm5, [sp(%$Mc2_Ps2)]
  436.  
  437.     pfmul    mm0, mm4        ;s2 * fi3 | c2 * fi3
  438.     pfmul    mm2, mm5        ;-c2 * gi3 | s2 * gi3
  439.     pfmul    mm1, mm4        ;s2 * fi1 | c2 * fi1
  440.     pfmul    mm3, mm5        ;-c2 * gi1 | s2 * gi1
  441.  
  442.     pfadd    mm0, mm2        ;d | c
  443.     pfadd    mm1, mm3        ;b | a
  444.  
  445.     pmov    mm2, [r0+r3*2]    ;fi2
  446.     pupldq    mm3, [r1+r3*2]    ;gi2 | -
  447.     pmov    mm4, [r0]        ;fi0
  448.     pupldq    mm5, [r1]        ;gi0 | -
  449.  
  450.     pupldq    mm2, mm0        ;c | fi2
  451.     puphdq    mm3, mm0        ;d | gi2
  452.     pupldq    mm4, mm1        ;a | fi0
  453.     puphdq    mm5, mm1        ;b | gi0
  454.  
  455.     pfpnacc    mm2, mm2        ;f2 | f3
  456.     pfpnacc    mm3, mm3        ;g2 | g3
  457.     pfpnacc    mm4, mm4        ;f0 | f1
  458.     pfpnacc    mm5, mm5        ;g0 | g1
  459.  
  460.     pmov    mm0, mm2
  461.     pmov    mm1, mm3
  462.     pupldq    mm2, mm2        ;f3 | f3
  463.     pupldq    mm3, mm3        ;g3 | g3
  464.     puphdq    mm0, mm0        ;f2 | f2
  465.     puphdq    mm1, mm1        ;g2 | g2
  466.  
  467.     pswapd    mm4, mm4        ;f1 | f0
  468.     pswapd    mm5, mm5        ;g1 | g0
  469.  
  470.     pfmul    mm0, mm7        ;f2 *-s1 | f2 * c1
  471.     pfmul    mm3, mm6        ;g3 * c1 | g3 * s1
  472.     pfmul    mm1, mm6        ;g2 * c1 | g2 * s1
  473.     pfmul    mm2, mm7        ;f3 *-s1 | f3 * c1
  474.  
  475.     pfadd    mm0, mm3        ;-b | a
  476.     pfadd    mm1, mm2        ; d | c
  477.  
  478.     pmov    mm2, mm5
  479.     pmov    mm3, mm4
  480.     pupldq    mm4, mm0        ; a | f0
  481.     pupldq    mm5, mm1        ; c | g0
  482.     puphdq    mm2, mm0        ;-b | g1
  483.     puphdq    mm3, mm1        ; d | f1
  484.  
  485.     pfpnacc    mm4, mm4        ;fi0 | fi2
  486.     pfpnacc    mm5, mm5        ;gi0 | gi2
  487.     pfpnacc    mm2, mm2        ;gi3 | gi1
  488.     pfpnacc    mm3, mm3        ;fi1 | fi3
  489.  
  490.     pmovd    [r0+r3*2], mm4    ;fi[k2]
  491.     puphdq    mm4, mm4
  492.     pmovd    [r1+r3*2], mm5    ;gi[k2]
  493.     puphdq    mm5, mm5
  494.     pmovd    [r1+r3], mm2    ;gi[k1]
  495.     puphdq    mm2, mm2
  496.     pmovd    [r0+r2], mm3    ;fi[k3]
  497.     puphdq    mm3, mm3
  498.  
  499.     pmovd    [r0], mm4        ;fi[0]
  500.     pmovd    [r1], mm5        ;gi[0]
  501.     pmovd    [r1+r2], mm2    ;gi[k3]
  502.     pmovd    [r0+r3], mm3    ;fi[k1]
  503.  
  504.     lea    r0, [r0+r3*4]
  505.     lea    r1, [r1+r3*4]
  506.     cmp    r0, r6
  507.     jb near    .do3
  508.  
  509.     add    r5, 4
  510.     cmp    r5, r4
  511.     jb near    .for
  512.  
  513.     cmp    r3, [sp(%$n)]
  514.     jae    .exit
  515.  
  516.     add    dword [sp(%$k)], 2    ;k  += 2;
  517.     lea    r3, [r3*4]        ;k1 *= 4
  518.     lea    r2, [r2*4]        ;k3 *= 4
  519.     lea    r4, [r4*4]        ;kx *= 4
  520.     mov    r0, [sp(%$fz)]    ;fi
  521.     lea    r1, [r0+r4]        ;gi = fi + kx
  522.     jmp    .do
  523.  
  524. .exit:
  525.     femms
  526.     popd    ebp, ebx, esi, edi
  527. endproc
  528.  
  529. %endif
  530.  
  531. ;***********************************************************************
  532.  
  533. ;void fft_side_3DN(float in[2][1024], int s, float *ret); /* s = MSFREQ ¤Ï4¤ÎÇÜ¿ô¤ò²¾Äê¡£ºîÀ®»þ¤Ï20¤À¤Ã¤¿ */
  534. proc fft_side_3DN
  535.  
  536. %$in    arg    4
  537. %$s    arg    4
  538. %$pret    arg    4
  539.  
  540.     femms
  541.     pushd    ebx, esi
  542.  
  543. .for_init:
  544.     mov    r0, [sp(%$in)]        ;r0 = &in[0][0]
  545.     lea    r1, [r0+fsizen(1024)]    ;r1 = &in[1][0]
  546.  
  547.     mov    r2, [sp(%$s)]
  548.     mov    r3, fsizen(1023)
  549.     shl    r2, 2            ;r2 = s * fsize
  550.     sub    r3, r2            ;r3 = (1023-s) * fsize
  551.  
  552.     mov    r4, fsizen(512)        ;r4 = 512 * fsize
  553.     pxor    mm7, mm7
  554.     jmp    .for
  555.  
  556.     align 16
  557. .for:
  558.     pmov    mm0, [r0+r3]
  559.     pmov    mm1, [r1+r3]
  560.     pmov    mm2, [r0+r2]
  561.     pfsub    mm0, mm1
  562.     pmov    mm3, [r1+r2]
  563.     pfsub    mm2, mm3
  564.     pmov    mm4, [r0+r3-fsizen(2)]
  565.     pfmul    mm0, mm0
  566.     pmov    mm5, [r1+r3-fsizen(2)]
  567.     pfmul    mm2, mm2
  568.     pmov    mm1, [r0+r2+fsizen(2)]
  569.     pupldq    mm6, mm0
  570.     pmov    mm3, [r1+r2+fsizen(2)]
  571.     pfadd    mm7, mm2
  572.     pfsub    mm4, mm5
  573.     puphdq    mm0, mm6
  574.     pfsub    mm1, mm3
  575.     pfadd    mm7, mm0
  576.  
  577.     pfmul    mm4, mm4
  578.     add    r2, fsizen(4)
  579.     pfmul    mm1, mm1
  580.     sub    r3, fsizen(4)
  581.     pupldq    mm6, mm4
  582.     pfadd    mm7, mm1
  583.     cmp    r2, r4
  584.     puphdq    mm4, mm6
  585.     pfadd    mm7, mm4
  586.     jb    .for
  587.  
  588.     pmov    mm0, [r0+r2]
  589.     pmov    mm1, [r1+r2]
  590.     pmov    mm2, [D_0_25]
  591.     pfsub    mm0, mm1
  592.     pmov    mm3, [D_0_5]
  593.     pfacc    mm7, mm7
  594.     pfmul    mm0, mm0
  595.     pfmul    mm7, mm2
  596.     pfmul    mm0, mm3
  597.     mov    r0, [sp(%$pret)]
  598.     pfadd    mm0, mm7
  599.  
  600.     pmovd    [r0], mm0
  601. .exit:
  602.     femms
  603.     popd    ebx, esi
  604. endproc
  605.  
  606. ;***********************************************************************
  607. %ifdef USE_E3DN
  608.  
  609. ;void fft_side_E3DN(float in[2][1024], int s, float *ret); /* s = MSFREQ ¤Ï4¤ÎÇÜ¿ô¤ò²¾Äê¡£ºîÀ®»þ¤Ï20¤À¤Ã¤¿ */
  610. proc fft_side_E3DN
  611.  
  612. %$in    arg    4
  613. %$s    arg    4
  614. %$pret    arg    4
  615.  
  616.     femms
  617.     pushd    ebx, esi
  618.  
  619. .for_init:
  620.     mov    r0, [sp(%$in)]        ;r0 = &in[0][0]
  621.     lea    r1, [r0+fsizen(1024)]    ;r1 = &in[1][0]
  622.  
  623.     mov    r2, [sp(%$s)]
  624.     mov    r3, fsizen(1023)
  625.     shl    r2, 2            ;r2 = s * fsize
  626.     sub    r3, r2            ;r3 = (1023-s) * fsize
  627.  
  628.     mov    r4, fsizen(512)        ;r4 = 512 * fsize
  629.     pxor    mm7, mm7
  630.     jmp    .for
  631.  
  632.     align 16
  633. .for:
  634.     pmov    mm0, [r0+r3]
  635.     pfsub    mm0, [r1+r3]
  636.     pmov    mm4, [r0+r3-fsizen(2)]
  637.     pfsub    mm4, [r1+r3-fsizen(2)]
  638.     pmov    mm2, [r0+r2]
  639.     pfsub    mm2, [r1+r2]
  640.     pmov    mm1, [r0+r2+fsizen(2)]
  641.     pfsub    mm1, [r1+r2+fsizen(2)]
  642.     pfmul    mm0, mm0
  643.     pfmul    mm4, mm4
  644.     pfmul    mm2, mm2
  645.     pfmul    mm1, mm1
  646.     pswapd    mm0, mm0
  647.     pswapd    mm4, mm4
  648.     pfadd    mm7, mm2
  649.     add    r2, fsizen(4)
  650.     pfadd    mm7, mm1
  651.     sub    r3, fsizen(4)
  652.     pfadd    mm7, mm0
  653.     cmp    r2, r4
  654.     pfadd    mm7, mm4
  655.     jb    .for
  656.  
  657.     pmov    mm0, [r0+r2]
  658.     pfsub    mm0, [r1+r2]
  659.     pfacc    mm7, mm7
  660.     pfmul    mm0, mm0
  661.     pfmul    mm7, [D_0_25]
  662.     pfmul    mm0, [D_0_5]
  663.     mov    r0, [sp(%$pret)]
  664.     pfadd    mm0, mm7
  665.  
  666.     pmovd    [r0], mm0
  667. .exit:
  668.     femms
  669.     popd    ebx, esi
  670. endproc
  671.  
  672. %endif
  673.