home *** CD-ROM | disk | FTP | other *** search
/ Computer Shopper 275 / DPCS0111DVD.ISO / Toolkit / Audio-Visual / VirtualDub / Source / VirtualDub-1.9.10-src.7z / src / Kasumi / source / a_resample_mmx.asm < prev    next >
Encoding:
Assembly Source File  |  2009-09-14  |  31.7 KB  |  1,560 lines

  1. ;    VirtualDub - Video processing and capture application
  2. ;    Graphics support library
  3. ;    Copyright (C) 1998-2004 Avery Lee
  4. ;
  5. ;    This program is free software; you can redistribute it and/or modify
  6. ;    it under the terms of the GNU General Public License as published by
  7. ;    the Free Software Foundation; either version 2 of the License, or
  8. ;    (at your option) any later version.
  9. ;
  10. ;    This program is distributed in the hope that it will be useful,
  11. ;    but WITHOUT ANY WARRANTY; without even the implied warranty of
  12. ;    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  13. ;    GNU General Public License for more details.
  14. ;
  15. ;    You should have received a copy of the GNU General Public License
  16. ;    along with this program; if not, write to the Free Software
  17. ;    Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
  18. ;
  19.     section    .rdata, rdata, align=16
  20.  
  21. x0002000200020002    dq    0002000200020002h
  22. x0004000400040004    dq    0004000400040004h
  23. x0008000800080008    dq    0008000800080008h
  24. x0000200000002000    dq    0000200000002000h
  25.  
  26.     align 16
  27. MMX_roundval        dq    0000200000002000h, 0000200000002000h
  28.  
  29.  
  30. ;**************************************************************************
  31.  
  32. x0000FFFF0000FFFF    dq    0000FFFF0000FFFFh
  33. x0000010100000101    dq    0000010100000101h
  34. x0100010001000100    dq    0100010001000100h
  35.  
  36.     section    .text
  37.  
  38. ;--------------------------------------------------------------------------
  39. ;_vdasm_resize_interp_row_run_MMX(
  40. ;    [esp+ 4] void *dst,
  41. ;    [esp+ 8] void *src,
  42. ;    [esp+12] ulong width,
  43. ;    [esp+16] __int64 xaccum,
  44. ;    [esp+24] __int64 x_inc);
  45. ;
  46.     global    _vdasm_resize_interp_row_run_MMX
  47. _vdasm_resize_interp_row_run_MMX:
  48.     push    ebp
  49.     push    edi
  50.     push    esi
  51.     push    ebx
  52.  
  53.     mov        esi, [esp+8+16]
  54.     mov        edi, [esp+4+16]
  55.     mov        ebp, [esp+12+16]
  56.  
  57.     movd    mm4, dword [esp+16+16]
  58.     pxor    mm7, mm7
  59.     movd    mm6, dword [esp+24+16]
  60.     punpckldq mm4, mm4
  61.     punpckldq mm6, mm6
  62.  
  63.     shr        esi, 2
  64.  
  65.     mov        eax, [esp+16+16]
  66.     mov        ebx, [esp+20+16]
  67.     add        esi, ebx
  68.     mov        ebx, [esp+24+16]
  69.     mov        ecx, [esp+28+16]
  70.  
  71.     shl        ebp,2
  72.     add        edi,ebp
  73.     neg        ebp
  74.  
  75. .colloop:
  76.     movd        mm1, dword [esi*4+4]
  77.     movq        mm5, mm4
  78.  
  79.     movd        mm0, dword [esi*4]
  80.     punpcklbw    mm1, mm7
  81.  
  82.     punpcklbw    mm0, mm7
  83.     psrld        mm5, 24
  84.  
  85.     movq        mm3, [x0100010001000100]
  86.     packssdw    mm5, mm5
  87.  
  88.     pmullw        mm1, mm5
  89.     psubw        mm3, mm5
  90.  
  91.     pmullw        mm0, mm3
  92.     paddd        mm4, mm6
  93.  
  94.     ;stall
  95.     ;stall
  96.  
  97.     ;stall
  98.     ;stall
  99.  
  100.     paddw        mm0, mm1
  101.  
  102.     psrlw        mm0, 8
  103.     add            eax, ebx
  104.  
  105.     adc            esi, ecx
  106.     packuswb    mm0, mm0
  107.  
  108.     movd        dword [edi+ebp],mm0
  109.  
  110.     add            ebp, 4
  111.     jnz            .colloop
  112.  
  113.     pop        ebx
  114.     pop        esi
  115.     pop        edi
  116.     pop        ebp
  117.     ret
  118.  
  119.  
  120.  
  121. ;**************************************************************************
  122.  
  123. ;vdasm_resize_interp_col_run_MMX(
  124. ;    [esp+ 4] void *dst,
  125. ;    [esp+ 8] void *src1,
  126. ;    [esp+12] void *src2,
  127. ;    [esp+16] ulong width,
  128. ;    [esp+20] ulong yaccum);
  129.  
  130.  
  131.     global    _vdasm_resize_interp_col_run_MMX
  132. _vdasm_resize_interp_col_run_MMX:
  133.     push    ebp
  134.     push    edi
  135.     push    esi
  136.     push    ebx
  137.  
  138.     mov        esi, [esp+8+16]
  139.     mov        edx, [esp+12+16]
  140.     mov        edi, [esp+4+16]
  141.     mov        ebp, [esp+16+16]
  142.  
  143.     movd    mm4, dword [esp+20+16]
  144.     pxor    mm7, mm7
  145.     punpcklwd mm4, mm4
  146.     punpckldq mm4, mm4
  147.     psrlw    mm4, 8
  148.     pxor    mm4, [x0000FFFF0000FFFF]
  149.     paddw    mm4, [x0000010100000101]
  150.  
  151.     shl        ebp, 2
  152.     add        edi, ebp
  153.     add        esi, ebp
  154.     add        edx, ebp
  155.     neg        ebp
  156.  
  157. .colloop:
  158.     movd    mm0, dword [esi+ebp]
  159.     movd    mm2, dword [edx+ebp]
  160.  
  161.     punpcklbw    mm0, mm7
  162.     punpcklbw    mm2, mm7
  163.  
  164.     movq        mm1, mm0
  165.     punpcklwd    mm0, mm2
  166.     punpckhwd    mm1, mm2
  167.  
  168.     pmaddwd        mm0, mm4
  169.     pmaddwd        mm1, mm4
  170.  
  171.     psrad        mm0, 8
  172.     psrad        mm1, 8
  173.  
  174.     packssdw    mm0, mm1
  175.     packuswb    mm0, mm0
  176.  
  177.     movd        dword [edi+ebp],mm0
  178.  
  179.     add            ebp, 4
  180.     jnz            .colloop
  181.  
  182.     pop        ebx
  183.     pop        esi
  184.     pop        edi
  185.     pop        ebp
  186.     ret
  187.  
  188.  
  189. ;--------------------------------------------------------------------------
  190. ;vdasm_resize_ccint_row_MMX(dst, src, count, xaccum, xinc, tbl);
  191.  
  192.     global    _vdasm_resize_ccint_row_MMX
  193. _vdasm_resize_ccint_row_MMX:
  194.     push    ebx
  195.     push    esi
  196.     push    edi
  197.     push    ebp
  198.  
  199.     mov        ebx, [esp+4+16]        ;ebx = dest addr
  200.     mov        ecx, [esp+12+16]    ;ecx = count
  201.  
  202.     mov        ebp, [esp+20+16]    ;ebp = increment
  203.     mov        edi, ebp            ;edi = increment
  204.     shl        ebp, 16                ;ebp = fractional increment
  205.     mov        esi, [esp+16+16]    ;esi = 16:16 position
  206.     sar        edi, 16                ;edi = integer increment
  207.     mov        [esp+20+16], ebp    ;xinc = fractional increment
  208.     mov        ebp, esi            ;ebp = 16:16 position
  209.     shr        esi, 16                ;esi = integer position
  210.     shl        ebp, 16                ;ebp = fraction
  211.     mov        [esp+16+16], ebp    ;xaccum = fraction
  212.  
  213.     mov        eax, [esp+8+16]
  214.  
  215.     shr        ebp, 24                ;ebp = fraction (0...255)
  216.     mov        [esp+8+16], edi
  217.     shl        ebp, 4                ;ebp = fraction*16
  218.     mov        edi, ebp
  219.     mov        ebp, [esp+4+16]        ;ebp = destination
  220.  
  221.     shr        eax, 2
  222.     add        eax, esi
  223.     shl        ecx, 2                ;ecx = count*4
  224.     lea        ebp, [ebp+ecx-4]
  225.     neg        ecx                    ;ecx = -count*4
  226.  
  227.     movq        mm6, [x0000200000002000]
  228.     pxor        mm7, mm7
  229.  
  230.     mov            edx,[esp+16+16]        ;edx = fractional accumulator
  231.     mov            esi,[esp+20+16]        ;esi = fractional increment
  232.  
  233.     mov            ebx,[esp+24+16]        ;ebx = coefficient pointer
  234.  
  235.     movd        mm0,dword [eax*4]
  236.     movd        mm1,dword [eax*4+4]
  237.     punpcklbw    mm0,mm7                ;mm0 = [a1][r1][g1][b1]
  238.  
  239.     ;borrow stack pointer
  240.     push        0                    ;don't crash
  241.     push        dword [fs:0]
  242.     mov            dword [fs:0], esp
  243.     mov            esp, [esp+8+24]        ;esp = integer increment
  244.     jmp            short ccint_loop_MMX_start
  245.  
  246.     ;EAX    source pointer / 4
  247.     ;EBX    coefficient pointer
  248.     ;ECX    count
  249.     ;EDX    fractional accumulator
  250.     ;ESI    fractional increment
  251.     ;EDI    coefficient offset
  252.     ;ESP    integer increment
  253.     ;EBP    destination pointer
  254.  
  255.     align        16
  256. ccint_loop_MMX:
  257.     movd        mm0,dword [eax*4]
  258.     packuswb    mm2,mm2                ;mm0 = [a][r][g][b][a][r][g][b]
  259.  
  260.     movd        mm1,dword [eax*4+4]
  261.     punpcklbw    mm0,mm7                ;mm0 = [a1][r1][g1][b1]
  262.  
  263.     movd        dword [ebp+ecx],mm2
  264. ccint_loop_MMX_start:
  265.     movq        mm4,mm0                ;mm0 = [a1][r1][g1][b1]
  266.  
  267.     movd        mm2,dword [eax*4+8]
  268.     punpcklbw    mm1,mm7                ;mm1 = [a2][r2][g2][b2]
  269.  
  270.     movd        mm3,dword [eax*4+12]
  271.     punpcklbw    mm2,mm7                ;mm2 = [a3][r3][g3][b3]
  272.  
  273.     punpcklbw    mm3,mm7                ;mm3 = [a4][r4][g4][b4]
  274.     movq        mm5,mm2                ;mm2 = [a3][r3][g3][b3]
  275.  
  276.     add            edx,esi                ;add fractional increment
  277.     punpcklwd    mm0,mm1                ;mm0 = [g2][g1][b2][b1]
  278.  
  279.     pmaddwd        mm0,[ebx+edi]
  280.     punpcklwd    mm2,mm3                ;mm2 = [g4][g3][b4][b3]
  281.  
  282.     pmaddwd        mm2,[ebx+edi+8]
  283.     punpckhwd    mm4,mm1                ;mm4 = [a2][a1][r2][r1]
  284.  
  285.     pmaddwd        mm4,[ebx+edi]
  286.     punpckhwd    mm5,mm3                ;mm5 = [a4][a3][b4][b3]
  287.  
  288.     pmaddwd        mm5,[ebx+edi+8]
  289.     paddd        mm0,mm6
  290.  
  291.     adc            eax,esp                ;add integer increment and fractional bump to offset
  292.     mov            edi,0ff000000h
  293.  
  294.     paddd        mm2,mm0                ;mm0 = [ g ][ b ]
  295.     paddd        mm4,mm6
  296.  
  297.     psrad        mm2,14
  298.     paddd        mm4,mm5                ;mm4 = [ a ][ r ]
  299.  
  300.     and            edi,edx
  301.     psrad        mm4,14
  302.  
  303.     shr            edi,20                ;edi = fraction (0...255)*16
  304.     add            ecx,4
  305.  
  306.     packssdw    mm2,mm4                ;mm0 = [ a ][ r ][ g ][  b ]
  307.     jnc            ccint_loop_MMX
  308.  
  309.     packuswb    mm2,mm2                ;mm0 = [a][r][g][b][a][r][g][b]
  310.     movd        dword [ebp],mm2
  311.  
  312.     mov        esp, dword [fs:0]
  313.     pop        dword [fs:0]
  314.     pop        eax
  315.  
  316.     pop        ebp
  317.     pop        edi
  318.     pop        esi
  319.     pop        ebx
  320.     ret
  321.  
  322. ;--------------------------------------------------------------------------
  323. ;vdasm_resize_ccint_col_MMX(dst, src1, src2, src3, src4, count, tbl);
  324.  
  325.     global    _vdasm_resize_ccint_col_MMX
  326. _vdasm_resize_ccint_col_MMX:
  327.     push    ebx
  328.     push    esi
  329.     push    edi
  330.     push    ebp
  331.  
  332.     mov        ebp, [esp+4+16]    ;ebp = dest addr
  333.     mov        esi, [esp+24+16]    ;esi = count
  334.     add        esi, esi
  335.     add        esi, esi
  336.  
  337.     mov        eax, [esp+8+16]    ;eax = row 1
  338.     mov        ebx, [esp+12+16]    ;ebx = row 2
  339.     mov        ecx, [esp+16+16]    ;ecx = row 3
  340.     mov        edx, [esp+20+16]    ;edx = row 4
  341.     mov        edi, [esp+28+16]    ;edi = coefficient ptr
  342.     
  343.     add        eax, esi
  344.     add        ebx, esi
  345.     add        ecx, esi
  346.     add        edx, esi
  347.     add        ebp, esi
  348.     neg        esi
  349.  
  350.     movq        mm4,[edi]
  351.     movq        mm5,[edi+8]
  352.     movq        mm6,[x0000200000002000]
  353.     pxor        mm7,mm7
  354.  
  355.     movd        mm2,dword [eax+esi]
  356.     movd        mm1,dword [ebx+esi]        ;mm1 = pixel1
  357.     punpcklbw    mm2,mm7
  358.     jmp        short ccint_col_loop_MMX.entry
  359.  
  360.     align        16
  361. ccint_col_loop_MMX:
  362.     movd        mm2,dword [eax+esi]        ;mm2 = pixel0
  363.     packuswb    mm0,mm0
  364.     
  365.     movd        mm1,dword [ebx+esi]        ;mm1 = pixel1
  366.     pxor        mm7,mm7
  367.  
  368.     movd        dword [ebp+esi-4],mm0
  369.     punpcklbw    mm2,mm7
  370.     
  371. ccint_col_loop_MMX.entry:    
  372.     punpcklbw    mm1,mm7
  373.     movq        mm0,mm2
  374.     
  375.     movd        mm3,dword [edx+esi]        ;mm3 = pixel3
  376.     punpcklwd    mm0,mm1            ;mm0 = [g1][g0][b1][b0]
  377.     
  378.     pmaddwd        mm0,mm4
  379.     punpckhwd    mm2,mm1            ;mm2 = [a1][a0][r1][r0]
  380.     
  381.     movd        mm1,dword [ecx+esi]        ;mm1 = pixel2
  382.     punpcklbw    mm3,mm7
  383.         
  384.     pmaddwd        mm2,mm4
  385.     punpcklbw    mm1,mm7
  386.     
  387.     movq        mm7,mm1
  388.     punpcklwd    mm1,mm3            ;mm1 = [g3][g2][b3][b2]
  389.     
  390.     punpckhwd    mm7,mm3            ;mm7 = [a3][a2][r3][r2]
  391.     pmaddwd        mm1,mm5
  392.     
  393.     pmaddwd        mm7,mm5
  394.     paddd        mm0,mm6
  395.     
  396.     paddd        mm2,mm6
  397.     paddd        mm0,mm1
  398.     
  399.     paddd        mm2,mm7
  400.     psrad        mm0,14
  401.     
  402.     psrad        mm2,14
  403.     add            esi,4
  404.     
  405.     packssdw    mm0,mm2
  406.     jne            ccint_col_loop_MMX
  407.     
  408.     packuswb    mm0,mm0
  409.     movd        dword [ebp-4],mm0
  410.  
  411.     pop        ebp
  412.     pop        edi
  413.     pop        esi
  414.     pop        ebx
  415.     ret
  416.  
  417. ;--------------------------------------------------------------------------
  418. ;vdasm_resize_ccint_col_SSE2(dst, src1, src2, src3, src4, count, tbl);
  419.  
  420.     global    _vdasm_resize_ccint_col_SSE2
  421. _vdasm_resize_ccint_col_SSE2:
  422.     push    ebx
  423.     push    esi
  424.     push    edi
  425.     push    ebp
  426.  
  427.     mov    ebp,[esp + 4 + 16]    ;ebp = dest addr
  428.     mov    esi,[esp + 24 + 16]    ;esi = count
  429.     add    esi,esi
  430.     add    esi,esi
  431.  
  432.     mov    eax,[esp + 8 + 16]    ;eax = row 1
  433.     mov    ebx,[esp + 12 + 16]    ;ebx = row 2
  434.     mov    ecx,[esp + 16 + 16]    ;ecx = row 3
  435.     mov    edx,[esp + 20 + 16]    ;edx = row 4
  436.     mov    edi,[esp + 28 + 16]    ;edi = coefficient ptr
  437.     
  438.     neg    esi
  439.  
  440.     add    esi,4
  441.     jz    ccint_col_SSE2_odd
  442.  
  443.     movq        xmm4,qword [edi]
  444.     movq        xmm5,qword [edi+8]
  445.     punpcklqdq    xmm4,xmm4
  446.     punpcklqdq    xmm5,xmm5
  447.     movq        xmm6,[x0000200000002000]
  448.     punpcklqdq    xmm6,xmm6
  449.     pxor        xmm7,xmm7
  450.  
  451. ;    jmp        short ccint_col_loop_SSE2.entry
  452.  
  453. ;    align        16
  454. ccint_col_loop_SSE2:
  455.     movq        xmm0, qword [eax]
  456.     add            eax, 8
  457.     movq        xmm1, qword [ebx]
  458.     add            ebx, 8
  459.     movq        xmm2, qword [ecx]
  460.     add            ecx, 8
  461.     movq        xmm3, qword [edx]
  462.     add            edx, 8
  463.     punpcklbw    xmm0,xmm1
  464.     punpcklbw    xmm2,xmm3
  465.     movdqa        xmm1,xmm0
  466.     movdqa        xmm3,xmm2
  467.     punpcklbw    xmm0,xmm7
  468.     punpckhbw    xmm1,xmm7
  469.     punpcklbw    xmm2,xmm7
  470.     punpckhbw    xmm3,xmm7
  471.     pmaddwd        xmm0,xmm4
  472.     pmaddwd        xmm1,xmm4
  473.     pmaddwd        xmm2,xmm5
  474.     pmaddwd        xmm3,xmm5
  475.     paddd        xmm0,xmm6
  476.     paddd        xmm1,xmm6
  477.     paddd        xmm0,xmm2
  478.     paddd        xmm1,xmm3
  479.     psrad        xmm0,14
  480.     psrad        xmm1,14
  481.     packssdw    xmm0,xmm1
  482.     packuswb    xmm0,xmm0
  483.     movdq2q        mm0,xmm0    
  484.     movntq        [ebp],mm0
  485.     add        ebp,8
  486.     add        esi,8
  487.     jnc        ccint_col_loop_SSE2
  488.     jnz        ccint_col_SSE2_noodd
  489. ccint_col_SSE2_odd:
  490.     movd        mm0, dword [eax]
  491.     pxor        mm7,mm7
  492.     movd        mm1, dword [ebx]
  493.     movdq2q        mm4,xmm4
  494.     movd        mm2, dword [ecx]
  495.     movdq2q        mm5,xmm5
  496.     movd        mm3, dword [edx]
  497.     movdq2q        mm6,xmm6
  498.     punpcklbw    mm0,mm1
  499.     punpcklbw    mm2,mm3
  500.     movq        mm1,mm0
  501.     movq        mm3,mm2
  502.     punpcklbw    mm0,mm7
  503.     punpckhbw    mm1,mm7
  504.     punpcklbw    mm2,mm7
  505.     punpckhbw    mm3,mm7
  506.     pmaddwd        mm0,mm4
  507.     pmaddwd        mm1,mm4
  508.     pmaddwd        mm2,mm5
  509.     pmaddwd        mm3,mm5
  510.     paddd        mm0,mm6
  511.     paddd        mm2,mm6
  512.     paddd        mm0,mm2
  513.     paddd        mm1,mm3
  514.     psrad        mm0,14
  515.     psrad        mm1,14
  516.     packssdw    mm0,mm1
  517.     packuswb    mm0,mm0
  518.     movd        eax,mm0
  519.     movnti        [ebp],eax
  520.  
  521. ccint_col_SSE2_noodd:
  522.     pop        ebp
  523.     pop        edi
  524.     pop        esi
  525.     pop        ebx
  526.     ret
  527.  
  528.  
  529.  
  530. ;-------------------------------------------------------------------------
  531. ;
  532. ;    long resize_table_row_MMX(Pixel *out, Pixel *in, int *filter, int filter_width, PixDim w, long accum, long frac);
  533.  
  534.     .code
  535.  
  536.     global    _vdasm_resize_table_row_MMX
  537. _vdasm_resize_table_row_MMX:
  538.     push    ebp
  539.     push    esi
  540.     push    edi
  541.     push    ebx
  542.  
  543.     cmp        dword [esp+16+16], 4
  544.     jz        .accel_4coeff
  545.     cmp        dword [esp+16+16], 6
  546.     jz        .accel_6coeff
  547.     cmp        dword [esp+16+16], 8
  548.     jz        .accel_8coeff
  549.  
  550.     mov    eax,[esp + 24 + 16]
  551.     mov    ebp,[esp + 20 + 16]
  552.     mov    ebx,[esp + 8 + 16]
  553.     mov    edi,[esp + 4 + 16]
  554.  
  555.     mov    esi,eax
  556.     mov    edx,eax
  557.  
  558.     pxor        mm5,mm5
  559.  
  560.     mov        ecx,[esp + 16 + 16]
  561.     shr        ecx,1
  562.     mov        [esp+16+16],ecx
  563.     test    ecx,1
  564.     jnz        .pixelloop_odd_pairs
  565.  
  566. .pixelloop_even_pairs:
  567.     shr        esi,14
  568.     and        edx,0000ff00h
  569.     and        esi,byte -4
  570.  
  571.     mov        ecx,[esp + 16 + 16]
  572.     shr        edx,5
  573.     add        esi,ebx
  574.     imul    edx,ecx
  575.     add        eax,[esp + 28 + 16]
  576.     add        edx,[esp + 12 + 16]
  577.  
  578.     movq    mm6,[MMX_roundval]
  579.     pxor    mm3,mm3
  580.     movq    mm7,mm6
  581.     pxor    mm2,mm2
  582.  
  583. .coeffloop_unaligned_even_pairs:
  584.     movd        mm0,dword [esi+0]
  585.     paddd        mm7,mm2            ;accumulate alpha/red (pixels 2/3)
  586.  
  587.     punpcklbw    mm0,[esi+4]        ;mm1=[a0][a1][r0][r1][g0][g1][b0][b1]
  588.     paddd        mm6,mm3            ;accumulate green/blue (pixels 2/3)
  589.  
  590.     movd        mm2,dword [esi+8]
  591.     movq        mm1,mm0            ;mm0=[a0][a1][r0][r1][g0][g1][b0][b1]
  592.  
  593.     punpcklbw    mm2,[esi+12]    ;mm2=[a2][a3][r2][r3][g2][g3][b2][b3]
  594.  
  595.     punpckhbw    mm0,mm5            ;mm0=[ a0 ][ a1 ][ r0 ][ r1 ]
  596.     movq        mm3,mm2            ;mm3=[a2][a3][r2][r3][g2][g3][b2][b3]
  597.  
  598.     pmaddwd        mm0,[edx]        ;mm0=[a0*f0+a1*f1][r0*f0+r1*f1]
  599.     punpcklbw    mm1,mm5            ;mm1=[ g0 ][ g1 ][ b0 ][ b1 ]
  600.  
  601.     pmaddwd        mm1,[edx]        ;mm1=[g0*f0+g1*f1][b0*f0+b1*f1]
  602.     punpckhbw    mm2,mm5            ;mm2=[ a2 ][ a3 ][ r0 ][ r1 ]
  603.  
  604.     pmaddwd        mm2,[edx+8]        ;mm2=[a2*f2+a3*f3][r2*f2+r3*f3]
  605.     punpcklbw    mm3,mm5            ;mm3=[ g2 ][ g3 ][ b2 ][ b3 ]
  606.  
  607.     pmaddwd        mm3,[edx+8]        ;mm3=[g2*f2+g3*f3][b2*f2+b3*f3]
  608.     paddd        mm7,mm0            ;accumulate alpha/red (pixels 0/1)
  609.  
  610.     paddd        mm6,mm1            ;accumulate green/blue (pixels 0/1)
  611.     add        edx,16
  612.  
  613.     add        esi,16
  614.     sub        ecx,2
  615.  
  616.     jne        .coeffloop_unaligned_even_pairs
  617.  
  618.     paddd        mm7,mm2            ;accumulate alpha/red (pixels 2/3)
  619.     paddd        mm6,mm3            ;accumulate green/blue (pixels 2/3)
  620.  
  621.     psrad        mm7,14
  622.     psrad        mm6,14
  623.  
  624.     packssdw    mm6,mm7
  625.     add        edi,4
  626.  
  627.     packuswb    mm6,mm6
  628.     sub        ebp,1
  629.  
  630.     mov    esi,eax
  631.     mov    edx,eax
  632.  
  633.     movd    dword [edi-4],mm6
  634.     jne    .pixelloop_even_pairs
  635.  
  636.     pop    ebx
  637.     pop    edi
  638.     pop    esi
  639.     pop    ebp
  640.  
  641.     ret
  642.  
  643. ;----------------------------------------------------------------
  644.  
  645. .pixelloop_odd_pairs:
  646.     shr        esi,14
  647.     and        edx,0000ff00h
  648.     and        esi,byte -4
  649.  
  650.     mov        ecx,[esp + 16 + 16]
  651.     shr        edx,5
  652.     add        esi,ebx
  653.     imul    edx,ecx
  654.     add        eax,[esp + 28 + 16]
  655.     sub        ecx,1
  656.     add        edx,[esp + 12 + 16]
  657.  
  658.     movq    mm6,[MMX_roundval]
  659.     pxor    mm3,mm3
  660.     pxor    mm2,mm2
  661.     movq    mm7,mm6
  662.  
  663. .coeffloop_unaligned_odd_pairs:
  664.     movd        mm0,dword [esi+0]
  665.     paddd        mm7,mm2            ;accumulate alpha/red (pixels 2/3)
  666.  
  667.     punpcklbw    mm0,[esi+4]        ;mm1=[a0][a1][r0][r1][g0][g1][b0][b1]
  668.     paddd        mm6,mm3            ;accumulate green/blue (pixels 2/3)
  669.  
  670.     movd        mm2,dword [esi+8]
  671.     movq        mm1,mm0            ;mm0=[a0][a1][r0][r1][g0][g1][b0][b1]
  672.  
  673.     punpcklbw    mm2,[esi+12]    ;mm2=[a2][a3][r2][r3][g2][g3][b2][b3]
  674.  
  675.     punpckhbw    mm0,mm5            ;mm0=[ a0 ][ a1 ][ r0 ][ r1 ]
  676.     movq        mm3,mm2            ;mm3=[a2][a3][r2][r3][g2][g3][b2][b3]
  677.  
  678.     pmaddwd        mm0,[edx]        ;mm0=[a0*f0+a1*f1][r0*f0+r1*f1]
  679.     punpcklbw    mm1,mm5            ;mm1=[ g0 ][ g1 ][ b0 ][ b1 ]
  680.  
  681.     pmaddwd        mm1,[edx]        ;mm1=[g0*f0+g1*f1][b0*f0+b1*f1]
  682.     punpckhbw    mm2,mm5            ;mm2=[ a2 ][ a3 ][ r0 ][ r1 ]
  683.  
  684.     pmaddwd        mm2,[edx+8]        ;mm2=[a2*f2+a3*f3][r2*f2+r3*f3]
  685.     punpcklbw    mm3,mm5            ;mm3=[ g2 ][ g3 ][ b2 ][ b3 ]
  686.  
  687.     pmaddwd        mm3,[edx+8]        ;mm3=[g2*f2+g3*f3][b2*f2+b3*f3]
  688.     paddd        mm7,mm0            ;accumulate alpha/red (pixels 0/1)
  689.  
  690.     paddd        mm6,mm1            ;accumulate green/blue (pixels 0/1)
  691.     add        edx,16
  692.  
  693.     add        esi,16
  694.     sub        ecx,2
  695.  
  696.     jne        .coeffloop_unaligned_odd_pairs
  697.  
  698.     paddd        mm7,mm2            ;accumulate alpha/red (pixels 2/3)
  699.     paddd        mm6,mm3            ;accumulate green/blue (pixels 2/3)
  700.  
  701.     ;finish up odd pair
  702.  
  703.     movd        mm0,dword [esi]        ;mm0 = [x1][r1][g1][b1]
  704.     punpcklbw    mm0,[esi+4]        ;mm2 = [x0][x1][r0][r1][g0][g1][b0][b1]
  705.     movq        mm1,mm0
  706.     punpcklbw    mm0,mm5            ;mm0 = [g0][g1][b0][b1]
  707.     punpckhbw    mm1,mm5            ;mm1 = [x0][x1][r0][r1]
  708.  
  709.     pmaddwd        mm0,[edx]
  710.     pmaddwd        mm1,[edx]
  711.  
  712.     paddd        mm6,mm0
  713.     paddd        mm7,mm1
  714.  
  715.     ;combine into pixel
  716.  
  717.     psrad        mm6,14
  718.  
  719.     psrad        mm7,14
  720.  
  721.     packssdw    mm6,mm7
  722.     add        edi,4
  723.  
  724.     packuswb    mm6,mm6
  725.     sub        ebp,1
  726.  
  727.     mov        esi,eax
  728.     mov        edx,eax
  729.  
  730.     movd        dword [edi-4],mm6
  731.     jne        .pixelloop_odd_pairs
  732.  
  733.     pop    ebx
  734.     pop    edi
  735.     pop    esi
  736.     pop    ebp
  737.  
  738.     ret
  739.  
  740. ;----------------------------------------------------------------
  741.  
  742. .accel_4coeff:
  743.     mov    eax,[esp + 24 + 16]
  744.     mov    ebp,[esp + 20 + 16]
  745.     add    ebp,ebp
  746.     add    ebp,ebp
  747.     mov    ebx,[esp + 8 + 16]
  748.     mov    edi,[esp + 4 + 16]
  749.     add    edi,ebp
  750.     neg    ebp
  751.  
  752.     mov    esi,eax
  753.     mov    edx,eax
  754.  
  755.     movq        mm4,[MMX_roundval]
  756.     pxor        mm5,mm5
  757.  
  758.     mov        ecx,[esp+12+16]
  759.  
  760. .pixelloop_4coeff:
  761.     shr        esi,14
  762.     and        edx,0000ff00h
  763.     and        esi,byte -4
  764.  
  765.     shr        edx,4
  766.     add        esi,ebx
  767.     add        eax,[esp+28+16]
  768.     add        edx,ecx
  769.  
  770.     movd        mm0,dword [esi+0]
  771.     movd        mm2,dword [esi+8]
  772.     punpcklbw    mm0,[esi+4]        ;mm0=[a0][a1][r0][r1][g0][g1][b0][b1]
  773.  
  774.     movq        mm1,mm0            ;mm1=[a0][a1][r0][r1][g0][g1][b0][b1]
  775.  
  776.     punpckhbw    mm0,mm5            ;mm0=[ a0 ][ a1 ][ r0 ][ r1 ]
  777.  
  778.     pmaddwd        mm0,[edx]        ;mm0=[a0*f0+a1*f1][r0*f0+r1*f1]
  779.     punpcklbw    mm2,[esi+12]    ;mm2=[a2][a3][r2][r3][g2][g3][b2][b3]
  780.  
  781.     movq        mm3,mm2            ;mm3=[a2][a3][r2][r3][g2][g3][b2][b3]
  782.     punpcklbw    mm1,mm5            ;mm1=[ g0 ][ g1 ][ b0 ][ b1 ]
  783.  
  784.     pmaddwd        mm1,[edx]        ;mm1=[g0*f0+g1*f1][b0*f0+b1*f1]
  785.     punpckhbw    mm2,mm5            ;mm2=[ a2 ][ a3 ][ r0 ][ r1 ]
  786.  
  787.     pmaddwd        mm2,[edx+8]        ;mm2=[a2*f2+a3*f3][r2*f2+r3*f3]
  788.     punpcklbw    mm3,mm5            ;mm3=[ g2 ][ g3 ][ b2 ][ b3 ]
  789.  
  790.     pmaddwd        mm3,[edx+8]        ;mm3=[g2*f2+g3*f3][b2*f2+b3*f3]
  791.     paddd        mm0,mm4            ;accumulate alpha/red (pixels 0/1)
  792.  
  793.     paddd        mm1,mm4            ;accumulate green/blue (pixels 0/1)
  794.  
  795.     paddd        mm0,mm2            ;accumulate alpha/red (pixels 2/3)
  796.     paddd        mm1,mm3            ;accumulate green/blue (pixels 2/3)
  797.  
  798.     psrad        mm0,14
  799.     psrad        mm1,14
  800.  
  801.     packssdw    mm1,mm0
  802.     mov    esi,eax
  803.  
  804.     packuswb    mm1,mm1
  805.     mov    edx,eax
  806.  
  807.     movd    dword [edi+ebp],mm1
  808.     add        ebp,4
  809.     jne        .pixelloop_4coeff
  810.  
  811.     pop    ebx
  812.     pop    edi
  813.     pop    esi
  814.     pop    ebp
  815.  
  816.     ret
  817.  
  818.  
  819. ;----------------------------------------------------------------
  820.  
  821. .accel_6coeff:
  822.     mov    eax,[esp + 24 + 16]
  823.     mov    ebp,[esp + 20 + 16]
  824.     add    ebp,ebp
  825.     add    ebp,ebp
  826.     mov    ebx,[esp + 8 + 16]
  827.     mov    edi,[esp + 4 + 16]
  828.     add    edi,ebp
  829.     neg    ebp
  830.  
  831.     mov    esi,eax
  832.     mov    edx,eax
  833.  
  834.     movq        mm4,[MMX_roundval]
  835.     pxor        mm5,mm5
  836.  
  837.     mov        ecx,[esp+12+16]
  838.  
  839. .pixelloop_6coeff:
  840.     shr        esi,14
  841.     and        edx,0000ff00h
  842.     and        esi,byte -4
  843.  
  844.     shr        edx,5
  845.     lea        edx,[edx+edx*2]
  846.     add        esi,ebx
  847.     add        eax,[esp+28+16]
  848.     add        edx,ecx
  849.  
  850.     movd        mm0,dword [esi+0]
  851.     movd        mm2,dword [esi+8]
  852.     punpcklbw    mm0,[esi+4]        ;mm0=[a0][a1][r0][r1][g0][g1][b0][b1]
  853.  
  854.     movq        mm1,mm0            ;mm1=[a0][a1][r0][r1][g0][g1][b0][b1]
  855.  
  856.     punpckhbw    mm0,mm5            ;mm0=[ a0 ][ a1 ][ r0 ][ r1 ]
  857.  
  858.     pmaddwd        mm0,[edx]        ;mm0=[a0*f0+a1*f1][r0*f0+r1*f1]
  859.     punpcklbw    mm2,[esi+12]    ;mm2=[a2][a3][r2][r3][g2][g3][b2][b3]
  860.  
  861.     movq        mm3,mm2            ;mm3=[a2][a3][r2][r3][g2][g3][b2][b3]
  862.     punpcklbw    mm1,mm5            ;mm1=[ g0 ][ g1 ][ b0 ][ b1 ]
  863.  
  864.     pmaddwd        mm1,[edx]        ;mm1=[g0*f0+g1*f1][b0*f0+b1*f1]
  865.     punpckhbw    mm2,mm5            ;mm2=[ a2 ][ a3 ][ r0 ][ r1 ]
  866.  
  867.     pmaddwd        mm2,[edx+8]        ;mm2=[a2*f2+a3*f3][r2*f2+r3*f3]
  868.     punpcklbw    mm3,mm5            ;mm3=[ g2 ][ g3 ][ b2 ][ b3 ]
  869.  
  870.     pmaddwd        mm3,[edx+8]        ;mm3=[g2*f2+g3*f3][b2*f2+b3*f3]
  871.     paddd        mm0,mm4            ;accumulate alpha/red (pixels 0/1)
  872.  
  873.     paddd        mm1,mm4            ;accumulate green/blue (pixels 0/1)
  874.  
  875.     paddd        mm0,mm2            ;accumulate alpha/red (pixels 2/3)
  876.     paddd        mm1,mm3            ;accumulate green/blue (pixels 2/3)
  877.  
  878.     movd        mm6,dword [esi+16]
  879.  
  880.     punpcklbw    mm6,[esi+20]    ;mm1=[a0][a1][r0][r1][g0][g1][b0][b1]
  881.  
  882.     movq        mm7,mm6            ;mm0=[a0][a1][r0][r1][g0][g1][b0][b1]
  883.  
  884.     punpckhbw    mm6,mm5            ;mm0=[ a0 ][ a1 ][ r0 ][ r1 ]
  885.  
  886.     pmaddwd        mm6,[edx+16]    ;mm0=[a0*f0+a1*f1][r0*f0+r1*f1]
  887.     punpcklbw    mm7,mm5            ;mm1=[ g0 ][ g1 ][ b0 ][ b1 ]
  888.  
  889.     pmaddwd        mm7,[edx+16]    ;mm1=[g0*f0+g1*f1][b0*f0+b1*f1]
  890.     paddd        mm0,mm6            ;accumulate alpha/red (pixels 0/1)
  891.  
  892.     paddd        mm1,mm7            ;accumulate green/blue (pixels 0/1)
  893.  
  894.  
  895.     psrad        mm0,14
  896.     psrad        mm1,14
  897.  
  898.     packssdw    mm1,mm0
  899.     mov    esi,eax
  900.  
  901.     packuswb    mm1,mm1
  902.     mov    edx,eax
  903.  
  904.     movd    dword [edi+ebp],mm1
  905.     add        ebp,4
  906.     jne        .pixelloop_6coeff
  907.  
  908.     pop    ebx
  909.     pop    edi
  910.     pop    esi
  911.     pop    ebp
  912.  
  913.     ret
  914.  
  915. ;----------------------------------------------------------------
  916.  
  917. .accel_8coeff:
  918.     mov    eax,[esp + 24 + 16]
  919.     mov    ebp,[esp + 20 + 16]
  920.     add    ebp,ebp
  921.     add    ebp,ebp
  922.     mov    ebx,[esp + 8 + 16]
  923.     mov    edi,[esp + 4 + 16]
  924.     add    edi,ebp
  925.     neg    ebp
  926.  
  927.     mov    esi,eax
  928.     mov    edx,eax
  929.  
  930.     movq        mm4,[MMX_roundval]
  931.     pxor        mm5,mm5
  932.  
  933.     mov        ecx,[esp+12+16]
  934.  
  935. .pixelloop_8coeff:
  936.     shr        esi,14
  937.     and        edx,0000ff00h
  938.     and        esi,byte -4
  939.  
  940.     shr        edx,3
  941.     add        esi,ebx
  942.     add        eax,[esp+28+16]
  943.     add        edx,ecx
  944.  
  945.     movd        mm0,dword [esi+0]
  946.     movd        mm2,dword [esi+8]
  947.     punpcklbw    mm0,[esi+4]        ;mm0=[a0][a1][r0][r1][g0][g1][b0][b1]
  948.  
  949.     movq        mm1,mm0            ;mm1=[a0][a1][r0][r1][g0][g1][b0][b1]
  950.  
  951.     punpckhbw    mm0,mm5            ;mm0=[ a0 ][ a1 ][ r0 ][ r1 ]
  952.  
  953.     pmaddwd        mm0,[edx]        ;mm0=[a0*f0+a1*f1][r0*f0+r1*f1]
  954.     punpcklbw    mm2,[esi+12]    ;mm2=[a2][a3][r2][r3][g2][g3][b2][b3]
  955.  
  956.     movq        mm3,mm2            ;mm3=[a2][a3][r2][r3][g2][g3][b2][b3]
  957.     punpcklbw    mm1,mm5            ;mm1=[ g0 ][ g1 ][ b0 ][ b1 ]
  958.  
  959.     pmaddwd        mm1,[edx]        ;mm1=[g0*f0+g1*f1][b0*f0+b1*f1]
  960.     punpckhbw    mm2,mm5            ;mm2=[ a2 ][ a3 ][ r0 ][ r1 ]
  961.  
  962.     pmaddwd        mm2,[edx+8]        ;mm2=[a2*f2+a3*f3][r2*f2+r3*f3]
  963.     punpcklbw    mm3,mm5            ;mm3=[ g2 ][ g3 ][ b2 ][ b3 ]
  964.  
  965.     pmaddwd        mm3,[edx+8]        ;mm3=[g2*f2+g3*f3][b2*f2+b3*f3]
  966.     paddd        mm0,mm4            ;accumulate alpha/red (pixels 0/1)
  967.  
  968.     paddd        mm1,mm4            ;accumulate green/blue (pixels 0/1)
  969.  
  970.     paddd        mm0,mm2            ;accumulate alpha/red (pixels 2/3)
  971.     paddd        mm1,mm3            ;accumulate green/blue (pixels 2/3)
  972.  
  973.  
  974.     movd        mm6,dword [esi+16]
  975.  
  976.     punpcklbw    mm6,[esi+20]    ;mm1=[a0][a1][r0][r1][g0][g1][b0][b1]
  977.  
  978.     movd        mm2,dword [esi+24]
  979.  
  980.     punpcklbw    mm2,[esi+28]    ;mm2=[a2][a3][r2][r3][g2][g3][b2][b3]
  981.     movq        mm7,mm6            ;mm0=[a0][a1][r0][r1][g0][g1][b0][b1]
  982.  
  983.     punpckhbw    mm6,mm5            ;mm0=[ a0 ][ a1 ][ r0 ][ r1 ]
  984.     movq        mm3,mm2            ;mm3=[a2][a3][r2][r3][g2][g3][b2][b3]
  985.  
  986.     pmaddwd        mm6,[edx+16]    ;mm0=[a0*f0+a1*f1][r0*f0+r1*f1]
  987.     punpcklbw    mm7,mm5            ;mm1=[ g0 ][ g1 ][ b0 ][ b1 ]
  988.  
  989.     pmaddwd        mm7,[edx+16]    ;mm1=[g0*f0+g1*f1][b0*f0+b1*f1]
  990.     punpckhbw    mm2,mm5            ;mm2=[ a2 ][ a3 ][ r0 ][ r1 ]
  991.  
  992.     pmaddwd        mm2,[edx+24]    ;mm2=[a2*f2+a3*f3][r2*f2+r3*f3]
  993.     punpcklbw    mm3,mm5            ;mm3=[ g2 ][ g3 ][ b2 ][ b3 ]
  994.  
  995.     pmaddwd        mm3,[edx+24]    ;mm3=[g2*f2+g3*f3][b2*f2+b3*f3]
  996.     paddd        mm0,mm6            ;accumulate alpha/red (pixels 0/1)
  997.  
  998.     paddd        mm1,mm7            ;accumulate green/blue (pixels 0/1)
  999.     paddd        mm0,mm2            ;accumulate alpha/red (pixels 0/1)
  1000.  
  1001.     paddd        mm1,mm3            ;accumulate green/blue (pixels 0/1)
  1002.  
  1003.  
  1004.     psrad        mm0,14
  1005.     psrad        mm1,14
  1006.  
  1007.     packssdw    mm1,mm0
  1008.     mov    esi,eax
  1009.  
  1010.     packuswb    mm1,mm1
  1011.     mov    edx,eax
  1012.  
  1013.     movd    dword [edi+ebp],mm1
  1014.     add        ebp,4
  1015.     jne        .pixelloop_8coeff
  1016.  
  1017.     pop    ebx
  1018.     pop    edi
  1019.     pop    esi
  1020.     pop    ebp
  1021.  
  1022.     ret
  1023.  
  1024.  
  1025.  
  1026.  
  1027.  
  1028.  
  1029.  
  1030. ;-------------------------------------------------------------------------
  1031. ;
  1032. ;    long resize_table_col_MMX(Pixel *out, Pixel **in_table, int *filter, int filter_width, PixDim w, long frac);
  1033.  
  1034.     global    _vdasm_resize_table_col_MMX
  1035. _vdasm_resize_table_col_MMX:
  1036.     push        ebp
  1037.     push        esi
  1038.     push        edi
  1039.     push        ebx
  1040.  
  1041.     mov            edx,[esp + 12 + 16]
  1042.     mov            eax,[esp + 24 + 16]
  1043.     shl            eax,2
  1044.     imul        eax,[esp + 16 + 16]
  1045.     add            edx,eax
  1046.     mov            [esp + 12 + 16], edx    ;[esp+12+28] = filter pointer
  1047.  
  1048.     mov            ebp,[esp + 20 + 16]        ;ebp = pixel counter
  1049.     mov            edi,[esp + 4 + 16]        ;edi = destination pointer
  1050.  
  1051.     pxor        mm5,mm5
  1052.  
  1053.     cmp            dword [esp+16+16], 4
  1054.     jz            .accel_4coeff
  1055.     cmp            dword [esp+16+16], 6
  1056.     jz            .accel_6coeff
  1057.  
  1058.     mov            ecx,[esp + 16 + 16]
  1059.     shr            ecx,1
  1060.     mov            [esp + 16 + 16],ecx        ;ecx = filter pair count
  1061.  
  1062.     xor            ebx,ebx                    ;ebx = source offset 
  1063.  
  1064.     mov            ecx,[esp + 16 + 16]        ;ecx = filter width counter
  1065. .pixelloop:
  1066.     mov            eax,[esp + 8 + 16]        ;esi = row pointer table
  1067.     movq        mm6,[MMX_roundval]
  1068.     movq        mm7,mm6
  1069.     pxor        mm0,mm0
  1070.     pxor        mm1,mm1
  1071. .coeffloop:
  1072.     mov            esi,[eax]
  1073.     paddd        mm6,mm0
  1074.  
  1075.     movd        mm0,dword [esi+ebx]    ;mm0 = [0][0][0][0][x0][r0][g0][b0]
  1076.     paddd        mm7,mm1
  1077.  
  1078.     mov            esi,[eax+4]
  1079.     add            eax,8
  1080.  
  1081.     movd        mm1,dword [esi+ebx]    ;mm1 = [0][0][0][0][x1][r1][g1][b1]
  1082.     punpcklbw    mm0,mm1            ;mm0 = [x0][x1][r0][r1][g0][g1][b0][b1]
  1083.  
  1084.     movq        mm1,mm0
  1085.     punpcklbw    mm0,mm5            ;mm0 = [g1][g0][b1][b0]
  1086.  
  1087.     pmaddwd        mm0,[edx]
  1088.     punpckhbw    mm1,mm5            ;mm1 = [x1][x0][r1][r0]
  1089.  
  1090.     pmaddwd        mm1,[edx]
  1091.     add            edx,8
  1092.  
  1093.     sub            ecx,1
  1094.     jne            .coeffloop
  1095.  
  1096.     paddd        mm6,mm0
  1097.     paddd        mm7,mm1
  1098.  
  1099.     psrad        mm6,14
  1100.     psrad        mm7,14
  1101.     add            edi,4
  1102.     packssdw    mm6,mm7
  1103.     add            ebx,4
  1104.     packuswb    mm6,mm6
  1105.     sub            ebp,1
  1106.  
  1107.     mov            ecx,[esp + 16 + 16]        ;ecx = filter width counter
  1108.     mov            edx,[esp + 12 + 16]        ;edx = filter bank pointer
  1109.  
  1110.     movd        dword [edi-4],mm6
  1111.     jne            .pixelloop
  1112.  
  1113. .xit:
  1114.     pop        ebx
  1115.     pop        edi
  1116.     pop        esi
  1117.     pop        ebp
  1118.     ret
  1119.  
  1120.  
  1121.  
  1122. .accel_4coeff:
  1123.     movq        mm2,[edx]
  1124.     movq        mm3,[edx+8]
  1125.  
  1126.     mov            esi,[esp+8+16]            ;esi = row pointer table
  1127.     mov            eax,[esi]
  1128.     add            ebp,ebp
  1129.     mov            ebx,[esi+4]
  1130.     add            ebp,ebp
  1131.     mov            ecx,[esi+8]
  1132.     mov            esi,[esi+12]
  1133.     add            eax,ebp
  1134.     add            ebx,ebp
  1135.     add            ecx,ebp
  1136.     add            esi,ebp
  1137.     add            edi,ebp
  1138.     neg            ebp
  1139.  
  1140.     ;EAX    source 0
  1141.     ;EBX    source 1
  1142.     ;ECX    source 2
  1143.     ;ESI    source 3
  1144.     ;EDI    destination
  1145.     ;EBP    counter
  1146.  
  1147.     movq        mm4,[MMX_roundval]
  1148.  
  1149. .pixelloop4:
  1150.     movd        mm6,dword [eax+ebp]    ;mm0 = [0][0][0][0][x0][r0][g0][b0]
  1151.  
  1152.     punpcklbw    mm6,[ebx+ebp]    ;mm0 = [x0][x1][r0][r1][g0][g1][b0][b1]
  1153.  
  1154.     movq        mm7,mm6
  1155.     punpcklbw    mm6,mm5            ;mm0 = [g1][g0][b1][b0]
  1156.  
  1157.     pmaddwd        mm6,mm2
  1158.     punpckhbw    mm7,mm5            ;mm1 = [x1][x0][r1][r0]
  1159.  
  1160.     movd        mm0,dword [ecx+ebp]    ;mm0 = [0][0][0][0][x0][r0][g0][b0]
  1161.     pmaddwd        mm7,mm2
  1162.  
  1163.     punpcklbw    mm0,[esi+ebp]    ;mm0 = [x0][x1][r0][r1][g0][g1][b0][b1]
  1164.     paddd        mm6,mm4
  1165.  
  1166.     movq        mm1,mm0
  1167.     punpcklbw    mm0,mm5            ;mm0 = [g1][g0][b1][b0]
  1168.  
  1169.     pmaddwd        mm0,mm3
  1170.     punpckhbw    mm1,mm5            ;mm1 = [x1][x0][r1][r0]
  1171.  
  1172.     pmaddwd        mm1,mm3
  1173.     paddd        mm7,mm4
  1174.  
  1175.     paddd        mm6,mm0
  1176.     paddd        mm7,mm1
  1177.  
  1178.     psrad        mm6,14
  1179.     psrad        mm7,14
  1180.     packssdw    mm6,mm7
  1181.     packuswb    mm6,mm6
  1182.  
  1183.     movd        dword [edi+ebp],mm6
  1184.  
  1185.     add            ebp,4
  1186.     jne            .pixelloop4
  1187.     jmp            .xit
  1188.  
  1189. .accel_6coeff:
  1190.     movq        mm2,[edx]
  1191.     movq        mm3,[edx+8]
  1192.     movq        mm4,[edx+16]
  1193.  
  1194.     push        0
  1195.     push        dword [fs:0]
  1196.     mov            dword [fs:0],esp
  1197.  
  1198.     mov            esp,[esp+8+24]            ;esp = row pointer table
  1199.     mov            eax,[esp]
  1200.     add            ebp,ebp
  1201.     mov            ebx,[esp+4]
  1202.     add            ebp,ebp
  1203.     mov            ecx,[esp+8]
  1204.     mov            edx,[esp+12]
  1205.     mov            esi,[esp+16]
  1206.     mov            esp,[esp+20]
  1207.     add            eax,ebp
  1208.     add            ebx,ebp
  1209.     add            ecx,ebp
  1210.     add            edx,ebp
  1211.     add            esi,ebp
  1212.     add            edi,ebp
  1213.     add            esp,ebp
  1214.     neg            ebp
  1215.  
  1216.     ;EAX    source 0
  1217.     ;EBX    source 1
  1218.     ;ECX    source 2
  1219.     ;EDX    source 3
  1220.     ;ESI    source 4
  1221.     ;EDI    destination
  1222.     ;ESP    source 5
  1223.     ;EBP    counter
  1224.  
  1225. .pixelloop6:
  1226.     movd        mm6,dword [eax+ebp]    ;mm0 = [0][0][0][0][x0][r0][g0][b0]
  1227.  
  1228.     punpcklbw    mm6,[ebx+ebp]    ;mm0 = [x0][x1][r0][r1][g0][g1][b0][b1]
  1229.  
  1230.     movq        mm7,mm6
  1231.     punpcklbw    mm6,mm5            ;mm0 = [g1][g0][b1][b0]
  1232.  
  1233.     movd        mm0,dword [ecx+ebp]    ;mm0 = [0][0][0][0][x0][r0][g0][b0]
  1234.     punpckhbw    mm7,mm5            ;mm1 = [x1][x0][r1][r0]
  1235.  
  1236.     punpcklbw    mm0,[edx+ebp]    ;mm0 = [x0][x1][r0][r1][g0][g1][b0][b1]
  1237.     pmaddwd        mm6,mm2
  1238.  
  1239.     movq        mm1,mm0
  1240.     punpcklbw    mm0,mm5            ;mm0 = [g1][g0][b1][b0]
  1241.  
  1242.     pmaddwd        mm7,mm2
  1243.     punpckhbw    mm1,mm5            ;mm1 = [x1][x0][r1][r0]
  1244.  
  1245.     paddd        mm6,[MMX_roundval]
  1246.     pmaddwd        mm0,mm3
  1247.  
  1248.     paddd        mm7,[MMX_roundval]
  1249.     pmaddwd        mm1,mm3
  1250.  
  1251.     paddd        mm6,mm0
  1252.  
  1253.     movd        mm0,dword [esi+ebp]    ;mm0 = [0][0][0][0][x0][r0][g0][b0]
  1254.     paddd        mm7,mm1
  1255.  
  1256.     punpcklbw    mm0,[esp+ebp]    ;mm0 = [x0][x1][r0][r1][g0][g1][b0][b1]
  1257.     movq        mm1,mm0
  1258.     punpcklbw    mm0,mm5            ;mm0 = [g1][g0][b1][b0]
  1259.     punpckhbw    mm1,mm5            ;mm1 = [x1][x0][r1][r0]
  1260.     pmaddwd        mm0,mm4
  1261.     pmaddwd        mm1,mm4
  1262.     paddd        mm6,mm0
  1263.     paddd        mm7,mm1
  1264.  
  1265.     psrad        mm6,14
  1266.     psrad        mm7,14
  1267.     packssdw    mm6,mm7
  1268.     packuswb    mm6,mm6
  1269.  
  1270.     movd        dword [edi+ebp],mm6
  1271.  
  1272.     add            ebp,4
  1273.     jne            .pixelloop6
  1274.  
  1275.     mov            esp, dword [fs:0]
  1276.     pop            dword [fs:0]
  1277.     pop            eax
  1278.  
  1279.     jmp            .xit
  1280.  
  1281.  
  1282.     global        _vdasm_resize_table_col_SSE2
  1283. _vdasm_resize_table_col_SSE2:
  1284.     push        ebp
  1285.     push        esi
  1286.     push        edi
  1287.     push        ebx
  1288.  
  1289.     mov            edx,[esp+12+16]
  1290.     mov            eax,[esp+24+16]
  1291.     shl            eax,2
  1292.     imul        eax,[esp+16+16]
  1293.     add            edx,eax
  1294.     mov            [esp+12+16], edx        ;[esp+12+16] = filter pointer
  1295.  
  1296.     mov            ebp,[esp+20+16]        ;ebp = pixel counter
  1297.     mov            edi,[esp+4+16]        ;edi = destination pointer
  1298.  
  1299.     pxor        xmm7, xmm7
  1300.     movdqa        xmm6, [MMX_roundval]
  1301.  
  1302.     cmp            dword [esp+16+16], 4
  1303.     jz            .accel_4coeff
  1304.     cmp            dword [esp+16+16], 6
  1305.     jz            .accel_6coeff
  1306.  
  1307.     mov            ecx,[esp+16+16]
  1308.     shr            ecx,1
  1309.     mov            [esp+16+16],ecx        ;ecx = filter pair count
  1310.  
  1311.     xor            ebx,ebx                    ;ebx = source offset 
  1312.  
  1313.     mov            ecx,[esp+16+16]        ;ecx = filter width counter
  1314. .pixelloop:
  1315.     mov            eax, [esp+8+16]        ;esi = row pointer table
  1316.     movdqa        xmm4, xmm6
  1317. .coeffloop:
  1318.     mov            esi,[eax]
  1319.  
  1320.     movd        xmm0, dword [esi+ebx]
  1321.  
  1322.     mov            esi,[eax+4]
  1323.     add            eax,8
  1324.  
  1325.     movd        xmm1, dword [esi+ebx]
  1326.     punpcklbw    xmm0, xmm1
  1327.  
  1328.     punpcklbw    xmm0, xmm7
  1329.  
  1330.     movq        xmm2, qword [edx]
  1331.     pshufd        xmm2, xmm2, 01000100b
  1332.  
  1333.     pmaddwd        xmm0, xmm2
  1334.  
  1335.     paddd        xmm4, xmm0
  1336.  
  1337.     add            edx,8
  1338.  
  1339.     sub            ecx,1
  1340.     jne            .coeffloop
  1341.  
  1342.     psrad        xmm4,14
  1343.     add            edi,4
  1344.     packssdw    xmm4,xmm4
  1345.     add            ebx,4
  1346.     packuswb    xmm4,xmm4
  1347.     sub            ebp,1
  1348.  
  1349.     mov            ecx,[esp+16+16]        ;ecx = filter width counter
  1350.     mov            edx,[esp+12+16]        ;edx = filter bank pointer
  1351.  
  1352.     movd        dword [edi-4],xmm4
  1353.     jne            .pixelloop
  1354.  
  1355. .xit:
  1356.     pop        ebx
  1357.     pop        edi
  1358.     pop        esi
  1359.     pop        ebp
  1360.     ret
  1361.  
  1362. .accel_4coeff:
  1363.     shl            ebp, 2
  1364.     mov            eax, [esp+8+16]            ;eax = row pointer table
  1365.     mov            esi, [eax+12]
  1366.     mov            ecx, [eax+8]
  1367.     mov            ebx, [eax+4]
  1368.     mov            eax, [eax]
  1369.     lea            edi, [edi+ebp-4]
  1370.     neg            ebp
  1371.  
  1372.     ;registers:
  1373.     ;
  1374.     ;EAX    source 0
  1375.     ;EBX    source 1
  1376.     ;ECX    source 2
  1377.     ;ESI    source 3
  1378.     ;EDI    destination
  1379.     ;EBP    counter
  1380.     ;
  1381.     movq        xmm4, qword [edx]                ;xmm4 = coeff 0/1
  1382.     movq        xmm5, qword [edx+8]            ;xmm5 = coeff 2/3
  1383.     punpcklqdq    xmm4, xmm4
  1384.     punpcklqdq    xmm5, xmm5
  1385.  
  1386.     add            ebp, 4
  1387.     jz            .oddpixel_4coeff
  1388.  
  1389. .pixelloop_4coeff_dualpel:
  1390.     movq        xmm0, qword [eax]
  1391.     movq        xmm1, qword [ebx]
  1392.     movq        xmm2, qword [ecx]
  1393.     movq        xmm3, qword [esi]
  1394.     add            eax,8
  1395.     add            ebx,8
  1396.     add            ecx,8
  1397.     add            esi,8
  1398.     punpcklbw    xmm0, xmm1
  1399.     punpcklbw    xmm2, xmm3
  1400.     movdqa        xmm1, xmm0
  1401.     movdqa        xmm3, xmm2
  1402.     punpcklbw    xmm0, xmm7
  1403.     punpckhbw    xmm1, xmm7
  1404.     punpcklbw    xmm2, xmm7
  1405.     punpckhbw    xmm3, xmm7
  1406.     pmaddwd        xmm0, xmm4
  1407.     pmaddwd        xmm1, xmm4
  1408.     pmaddwd        xmm2, xmm5
  1409.     pmaddwd        xmm3, xmm5
  1410.     paddd        xmm0, xmm2
  1411.     paddd        xmm1, xmm3
  1412.     paddd        xmm0, xmm6
  1413.     paddd        xmm1, xmm6
  1414.     psrad        xmm0, 14
  1415.     psrad        xmm1, 14
  1416.     packssdw    xmm0, xmm1
  1417.     packuswb    xmm0, xmm0
  1418.     movq        qword [edi+ebp],xmm0
  1419.     add            ebp, 8
  1420.     jae            .pixelloop_4coeff_dualpel
  1421.     jnz            .xit
  1422.  
  1423. .oddpixel_4coeff:
  1424.     movd        xmm0, dword [eax]
  1425.     movd        xmm1, dword [ebx]
  1426.     movd        xmm2, dword [ecx]
  1427.     movd        xmm3, dword [esi]
  1428.     punpcklbw    xmm0, xmm1
  1429.     punpcklbw    xmm2, xmm3
  1430.     punpcklbw    xmm0, xmm7
  1431.     punpcklbw    xmm2, xmm7
  1432.     pmaddwd        xmm0, xmm4
  1433.     pmaddwd        xmm2, xmm5
  1434.     paddd        xmm0, xmm2
  1435.     paddd        xmm0, xmm6
  1436.     psrad        xmm0, 14
  1437.     packssdw    xmm0, xmm0
  1438.     packuswb    xmm0, xmm0
  1439.     movd        dword [edi],xmm0
  1440.     jmp            .xit
  1441.  
  1442.  
  1443. .accel_6coeff:
  1444.     movq        xmm4, qword [edx]                ;xmm4 = coeff 0/1
  1445.     movq        xmm5, qword [edx+8]            ;xmm5 = coeff 2/3
  1446.     movq        xmm6, qword [edx+16]            ;xmm5 = coeff 4/5
  1447.     punpcklqdq    xmm4, xmm4
  1448.     punpcklqdq    xmm5, xmm5
  1449.     punpcklqdq    xmm6, xmm6
  1450.  
  1451.     push        0
  1452.     push        dword [fs:0]
  1453.     mov            dword [fs:0],esp
  1454.  
  1455.     shl            ebp, 2
  1456.     mov            eax, [esp+8+24]            ;eax = row pointer table
  1457.     mov            esp, [eax+20]
  1458.     mov            esi, [eax+16]
  1459.     mov            edx, [eax+12]
  1460.     mov            ecx, [eax+8]
  1461.     mov            ebx, [eax+4]
  1462.     mov            eax, [eax]
  1463.     lea            edi, [edi+ebp-4]
  1464.     neg            ebp
  1465.  
  1466.     ;registers:
  1467.     ;
  1468.     ;EAX    source 0
  1469.     ;EBX    source 1
  1470.     ;ECX    source 2
  1471.     ;EDX    source 3
  1472.     ;ESI    source 4
  1473.     ;EDI    destination
  1474.     ;ESP    source 5
  1475.     ;EBP    counter
  1476.     ;
  1477.  
  1478.     add            ebp, 4
  1479.     jz            .oddpixel_6coeff
  1480.  
  1481. .pixelloop_6coeff_dualpel:
  1482.     movq        xmm0, qword [eax]
  1483.     movq        xmm1, qword [ebx]
  1484.     movq        xmm2, qword [ecx]
  1485.     movq        xmm3, qword [edx]
  1486.     add            eax,8
  1487.     add            ebx,8
  1488.     add            ecx,8
  1489.     add            edx,8
  1490.     punpcklbw    xmm0, xmm1
  1491.     punpcklbw    xmm2, xmm3
  1492.     movdqa        xmm1, xmm0
  1493.     movdqa        xmm3, xmm2
  1494.     punpcklbw    xmm0, xmm7
  1495.     punpckhbw    xmm1, xmm7
  1496.     punpcklbw    xmm2, xmm7
  1497.     punpckhbw    xmm3, xmm7
  1498.     pmaddwd        xmm0, xmm4
  1499.     pmaddwd        xmm1, xmm4
  1500.     pmaddwd        xmm2, xmm5
  1501.     pmaddwd        xmm3, xmm5
  1502.     paddd        xmm0, xmm2
  1503.     paddd        xmm1, xmm3
  1504.  
  1505.     movq        xmm2, qword [esi]
  1506.     movq        xmm3, qword [esp]
  1507.     add            esi, 8
  1508.     add            esp, 8
  1509.     punpcklbw    xmm2, xmm3
  1510.     movdqa        xmm3, xmm2
  1511.     punpcklbw    xmm2, xmm7
  1512.     punpckhbw    xmm3, xmm7
  1513.     pmaddwd        xmm2, xmm6
  1514.     pmaddwd        xmm3, xmm6
  1515.     paddd        xmm0, xmm2
  1516.     paddd        xmm1, xmm3
  1517.     paddd        xmm0, [MMX_roundval]
  1518.     paddd        xmm1, [MMX_roundval]
  1519.     psrad        xmm0, 14
  1520.     psrad        xmm1, 14
  1521.     packssdw    xmm0, xmm1
  1522.     packuswb    xmm0, xmm0
  1523.     movq        qword [edi+ebp],xmm0
  1524.     add            ebp, 8
  1525.     jae            .pixelloop_6coeff_dualpel
  1526.     jnz            .xit_6coeff
  1527.  
  1528. .oddpixel_6coeff:
  1529.     movd        xmm0, dword [eax]
  1530.     movd        xmm1, dword [ebx]
  1531.     movd        xmm2, dword [ecx]
  1532.     movd        xmm3, dword [edx]
  1533.     punpcklbw    xmm0, xmm1
  1534.     punpcklbw    xmm2, xmm3
  1535.     movd        xmm1, dword [esi]
  1536.     movd        xmm3, dword [esp]
  1537.     punpcklbw    xmm0, xmm7
  1538.     punpcklbw    xmm2, xmm7
  1539.     pmaddwd        xmm0, xmm4
  1540.     punpcklbw    xmm1, xmm3
  1541.     pmaddwd        xmm2, xmm5
  1542.     punpcklbw    xmm1, xmm7
  1543.     pmaddwd        xmm1, xmm6
  1544.     paddd        xmm0, xmm2
  1545.     paddd        xmm1, [MMX_roundval]
  1546.     paddd        xmm0, xmm1
  1547.     psrad        xmm0, 14
  1548.     packssdw    xmm0, xmm0
  1549.     packuswb    xmm0, xmm0
  1550.     movd        dword [edi],xmm0
  1551.  
  1552. .xit_6coeff:
  1553.     mov            esp, dword [fs:0]
  1554.     pop            dword [fs:0]
  1555.     pop            eax
  1556.     jmp            .xit
  1557.  
  1558.  
  1559.     end
  1560.