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

  1. ;    VirtualDub - Video processing and capture application
  2. ;    Copyright (C) 1998-2001 Avery Lee
  3. ;
  4. ;    This program is free software; you can redistribute it and/or modify
  5. ;    it under the terms of the GNU General Public License as published by
  6. ;    the Free Software Foundation; either version 2 of the License, or
  7. ;    (at your option) any later version.
  8. ;
  9. ;    This program is distributed in the hope that it will be useful,
  10. ;    but WITHOUT ANY WARRANTY; without even the implied warranty of
  11. ;    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  12. ;    GNU General Public License for more details.
  13. ;
  14. ;    You should have received a copy of the GNU General Public License
  15. ;    along with this program; if not, write to the Free Software
  16. ;    Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
  17.  
  18.     extern _YUV_Y_table: dword
  19.     extern _YUV_U_table: dword
  20.     extern _YUV_V_table: dword
  21.     extern _YUV_clip_table: byte
  22.     extern _YUV_clip_table16: byte
  23.  
  24.     segment    .rdata, align=16
  25.  
  26.     align    16
  27.  
  28.     global    _asm_YUVtoRGB_row_constants_SSE2        
  29. _asm_YUVtoRGB_row_constants_SSE2:
  30. SSE2_80w    dq    00080008000800080h, 00080008000800080h
  31. SSE2_Ublucoeff    dq    00081008100810081h, 00081008100810081h
  32. SSE2_Vredcoeff    dq    00066006600660066h, 00066006600660066h
  33. SSE2_Ugrncoeff    dq    0FFE7FFE7FFE7FFE7h, 0FFE7FFE7FFE7FFE7h
  34. SSE2_Vgrncoeff    dq    0FFCCFFCCFFCCFFCCh, 0FFCCFFCCFFCCFFCCh
  35. SSE2_Ylow    dq    000FF00FF00FF00FFh, 000FF00FF00FF00FFh
  36. SSE2_Ybias    dq    00010001000100010h, 00010001000100010h
  37. SSE2_Ycoeff    dq    0004A004A004A004Ah, 0004A004A004A004Ah
  38.  
  39. SSE2_Ucoeff0    dq    000810000FFE70081h, 0FFE700810000FFE7h
  40. SSE2_Ucoeff1    dq    00000FFE700810000h, 000810000FFE70081h
  41. SSE2_Ucoeff2    dq    0FFE700810000FFE7h, 00000FFE700810000h
  42. SSE2_Vcoeff0    dq    000000066FFCC0000h, 0FFCC00000066FFCCh
  43. SSE2_Vcoeff1    dq    00066FFCC00000066h, 000000066FFCC0000h
  44. SSE2_Vcoeff2    dq    0FFCC00000066FFCCh, 00066FFCC00000066h
  45.  
  46. %assign        offs_var_begin        0
  47. %assign        offs_rgb_pitch        offs_var_begin + 0
  48. %assign        offs_y_pitch        offs_var_begin + 4
  49. %assign        offs_uv_pitch        offs_var_begin + 8
  50. %assign        offs_width            offs_var_begin + 12
  51. %assign        offs_height            offs_var_begin + 16
  52.  
  53. %assign        offs_const_begin    32
  54.  
  55. %assign        offs_SSE2_80w        offs_const_begin + 0
  56. %assign        offs_SSE2_Ublucoeff    offs_const_begin + 16
  57. %assign        offs_SSE2_Vredcoeff    offs_const_begin + 32
  58. %assign        offs_SSE2_Ugrncoeff    offs_const_begin + 48
  59. %assign        offs_SSE2_Vgrncoeff    offs_const_begin + 64
  60. %assign        offs_SSE2_Ylow        offs_const_begin + 80
  61. %assign        offs_SSE2_Ybias        offs_const_begin + 96
  62. %assign        offs_SSE2_Ycoeff    offs_const_begin + 112
  63.  
  64. %assign        offs_SSE2_Ucoeff0    offs_const_begin + 128
  65. %assign        offs_SSE2_Ucoeff1    offs_const_begin + 144
  66. %assign        offs_SSE2_Ucoeff2    offs_const_begin + 160
  67. %assign        offs_SSE2_Vcoeff0    offs_const_begin + 176
  68. %assign        offs_SSE2_Vcoeff1    offs_const_begin + 192
  69. %assign        offs_SSE2_Vcoeff2    offs_const_begin + 208
  70.  
  71.  
  72. MMX_10w        dq    00010001000100010h
  73. MMX_80w        dq    00080008000800080h
  74. MMX_00FFw    dq    000FF00FF00FF00FFh
  75. MMX_FF00w    dq    0FF00FF00FF00FF00h
  76. MMX_Ublucoeff    dq    00081008100810081h
  77. MMX_Vredcoeff    dq    00066006600660066h
  78. MMX_Ugrncoeff    dq    0FFE7FFE7FFE7FFE7h
  79. MMX_Vgrncoeff    dq    0FFCCFFCCFFCCFFCCh
  80. MMX_Ycoeff    dq    0004A004A004A004Ah
  81. MMX_rbmask    dq    07c1f7c1f7c1f7c1fh
  82. MMX_grnmask    dq    003e003e003e003e0h
  83. MMX_grnmask2    dq    000f800f800f800f8h
  84. MMX_clip    dq    07c007c007c007c00h
  85.  
  86. MMX_Ucoeff0    dq    000810000FFE70081h
  87. MMX_Ucoeff1    dq    0FFE700810000FFE7h
  88. MMX_Ucoeff2    dq    00000FFE700810000h
  89. MMX_Vcoeff0    dq    000000066FFCC0000h
  90. MMX_Vcoeff1    dq    0FFCC00000066FFCCh
  91. MMX_Vcoeff2    dq    00066FFCC00000066h
  92.  
  93.     segment    .text
  94.  
  95.     global _asm_YUVtoRGB32_row
  96.     global _asm_YUVtoRGB32_row_MMX
  97.     global _asm_YUVtoRGB32_row_ISSE
  98.     global _asm_YUVtoRGB32_row_SSE2
  99.     global _asm_YUVtoRGB24_row
  100.     global _asm_YUVtoRGB24_row_MMX
  101.     global _asm_YUVtoRGB24_SSE2
  102.     global _asm_YUVtoRGB16_row
  103.     global _asm_YUVtoRGB16_row_MMX
  104.     global _asm_YUVtoRGB16_row_ISSE
  105.  
  106. ;    asm_YUVtoRGB_row(
  107. ;        Pixel *ARGB1_pointer,
  108. ;        Pixel *ARGB2_pointer,
  109. ;        YUVPixel *Y1_pointer,
  110. ;        YUVPixel *Y2_pointer,
  111. ;        YUVPixel *U_pointer,
  112. ;        YUVPixel *V_pointer,
  113. ;        long width
  114. ;        );
  115.  
  116. %define    ARGB1_pointer    [esp+ 4+16]
  117. %define    ARGB2_pointer    [esp+ 8+16]
  118. %define    Y1_pointer        [esp+12+16]
  119. %define    Y2_pointer        [esp+16+16]
  120. %define    U_pointer        [esp+20+16]
  121. %define    V_pointer        [esp+24+16]
  122. %define    count            [esp+28+16]
  123. %define    context_pointer [esp+32+16+8]
  124.  
  125. _asm_YUVtoRGB32_row:
  126.     push    ebx
  127.     push    esi
  128.     push    edi
  129.     push    ebp
  130.  
  131.     mov    eax,count
  132.     mov    ebp,eax
  133.     mov    ebx,eax
  134.     shl    ebx,3
  135.     add    eax,eax
  136.     add    ARGB1_pointer,ebx
  137.     add    ARGB2_pointer,ebx
  138.     add    Y1_pointer,eax
  139.     add    Y2_pointer,eax
  140.     add    U_pointer,ebp
  141.     add    V_pointer,ebp
  142.     neg    ebp
  143.  
  144.     mov    esi,U_pointer            ;[C]
  145.     mov    edi,V_pointer            ;[C]
  146.     xor    edx,edx                ;[C]
  147.     xor    ecx,ecx                ;[C]
  148.     jmp    short col_loop_start
  149.  
  150. col_loop:
  151.     mov    ch,[_YUV_clip_table+ebx-3f00h]    ;[4] edx = [0][0][red][green]
  152.     mov    esi,U_pointer            ;[C]
  153.     shl    ecx,8                ;[4] edx = [0][red][green][0]
  154.     mov    edi,V_pointer            ;[C]
  155.     mov    cl,[_YUV_clip_table+edx-3f00h]    ;[4] edx = [0][r][g][b] !!
  156.     xor    edx,edx                ;[C]
  157.     mov    [eax+ebp*8-4],ecx        ;[4] 
  158.     xor    ecx,ecx                ;[C]
  159. col_loop_start:
  160.     mov    cl,[esi + ebp]            ;[C] eax = U
  161.     mov    dl,[edi + ebp]            ;[C] ebx = V
  162.     mov    eax,Y1_pointer            ;[1] 
  163.     xor    ebx,ebx                ;[1] 
  164.     mov    esi,[_YUV_U_table + ecx*4]    ;[C] eax = [b impact][u-g impact]
  165.     mov    ecx,[_YUV_V_table + edx*4]    ;[C] ebx = [r impact][v-g impact]
  166.     mov    edi,esi                ;[C]
  167.     mov    bl,[eax + ebp*2]        ;[1] ebx = Y1 value
  168.     shr    esi,16                ;[C] eax = blue impact
  169.     add    edi,ecx                ;[C] edi = [junk][g impact]
  170.     mov    ebx,[_YUV_Y_table + ebx*4]    ;[1] ebx = Y impact
  171.     and    ecx,0ffff0000h            ;[C]
  172.     mov    edx,ebx                ;[1] edx = Y impact
  173.     add    esi,ecx                ;[C] eax = [r impact][b impact]
  174.     and    edi,0000ffffh            ;[C]
  175.     add    ebx,esi                ;[1] ebx = [red][blue]
  176.     mov    ecx,ebx                ;[1] edi = [red][blue]
  177.     and    edx,0000ffffh            ;[1] ecx = green
  178.     shr    ebx,16                ;[1] ebx = red
  179.     and    ecx,0000ffffh            ;[1] edi = blue
  180.     mov    dl,[_YUV_clip_table+edx+edi-3f00h]    ;[1] edx = [0][0][junk][green]
  181.     mov    eax,Y1_pointer            ;[2] 
  182.     mov    dh,[_YUV_clip_table+ebx-3f00h]    ;[1] edx = [0][0][red][green]
  183.     xor    ebx,ebx                ;[2] 
  184.     shl    edx,8                ;[1] edx = [0][red][green][0]
  185.     mov    bl,[eax + ebp*2 + 1]        ;[2] ebx = Y1 value
  186.     mov    eax,ARGB1_pointer        ;[1] 
  187.     mov    dl,[_YUV_clip_table+ecx-3f00h]    ;[1] edx = [0][r][g][b] !!
  188.     mov    ebx,[_YUV_Y_table + ebx*4]    ;[2] ebx = Y impact
  189.     mov    ecx,0000ffffh            ;[2] 
  190.  
  191.     and    ecx,ebx                ;[2]
  192.     add    ebx,esi                ;[2] ebx = [red][blue]
  193.  
  194.     mov    [eax+ebp*8],edx            ;[1] 
  195.     mov    edx,ebx                ;[2]
  196.  
  197.     shr    ebx,16                ;[2] ebx = red
  198.     mov    eax,Y2_pointer            ;[3] 
  199.  
  200.     and    edx,0000ffffh            ;[2]
  201.     mov    cl,[_YUV_clip_table+ecx+edi-3f00h]    ;[2] edx = [0][0][junk][green]    
  202.  
  203.     mov    al,[eax + ebp*2]        ;[3] ebx = Y1 value
  204.     mov    ch,[_YUV_clip_table+ebx-3f00h]    ;[2] edx = [0][0][red][green]
  205.  
  206.     shl    ecx,8                ;[2] edx = [0][red][green][0]
  207.     and    eax,000000ffh            ;[3] 
  208.  
  209.     mov    cl,[_YUV_clip_table+edx-3f00h]    ;[2] edx = [0][r][g][b] !!
  210.     mov    edx,ARGB1_pointer        ;[2] 
  211.  
  212.     mov    ebx,[_YUV_Y_table + eax*4]    ;[3] ebx = Y impact
  213.     mov    eax,0000ffffh
  214.  
  215.     and    eax,ebx                ;[3] edi = [red][blue]
  216.     add    ebx,esi                ;[3] ebx = [red][blue]
  217.  
  218.     mov    [edx+ebp*8+4],ecx        ;[2] 
  219.     mov    edx,ebx                ;[3]
  220.  
  221.     shr    ebx,16                ;[3] ebx = red
  222.     mov    ecx,Y2_pointer            ;[4] 
  223.  
  224.     and    edx,0000ffffh            ;[3] ecx = green
  225.     mov    al,[_YUV_clip_table+eax+edi-3f00h]    ;[3] edx = [0][0][junk][green]
  226.  
  227.     mov    cl,[ecx + ebp*2+1]        ;[4] ebx = Y1 value
  228.     mov    ah,[_YUV_clip_table+ebx-3f00h]    ;[3] edx = [0][0][red][green]
  229.  
  230.     shl    eax,8                ;[3] edx = [0][red][green][0]
  231.     and    ecx,000000ffh            ;[4] 
  232.  
  233.     mov    al,[_YUV_clip_table+edx-3f00h]    ;[3] edx = [0][r][g][b] !!
  234.     mov    edx,ARGB2_pointer        ;[3] 
  235.  
  236.     mov    ebx,[_YUV_Y_table + ecx*4]    ;[4] ebx = Y impact
  237.     mov    ecx,0000ffffh            ;[4]
  238.  
  239.     and    ecx,ebx                ;[4] ecx = [0][Y-impact]
  240.     add    ebx,esi                ;[4] ebx = [red][blue]
  241.  
  242.     mov    [edx+ebp*8],eax            ;[3] 
  243.     mov    edx,ebx                ;[4] edx = [red][blue]
  244.  
  245.     shr    ebx,16                ;[4] ebx = red
  246.     mov    cl,[_YUV_clip_table+ecx+edi-3f00h]    ;[4] edx = [0][0][junk][green]
  247.  
  248.     and    edx,0000ffffh            ;[4] edx = blue
  249.     mov    eax,ARGB2_pointer        ;[4] 
  250.  
  251.     inc    ebp
  252.  
  253.     jnz    col_loop
  254.  
  255.     mov    ch,[_YUV_clip_table+ebx-3f00h]    ;[4] edx = [0][0][red][green]
  256.     shl    ecx,8                ;[4] edx = [0][red][green][0]
  257.     mov    cl,[_YUV_clip_table+edx-3f00h]    ;[4] edx = [0][r][g][b] !!
  258.     mov    [eax+ebp*8-4],ecx        ;[4] 
  259.  
  260.     pop    ebp
  261.     pop    edi
  262.     pop    esi
  263.     pop    ebx
  264.     ret
  265.  
  266. ;MMX_test    dq    7060504030201000h
  267.  
  268. _asm_YUVtoRGB32_row_MMX:
  269.     push    ebx
  270.     push    esi
  271.     push    edi
  272.     push    ebp
  273.  
  274.     mov    eax,count
  275.     mov    ebp,eax
  276.     mov    ebx,eax
  277.     shl    ebx,3
  278.     add    eax,eax
  279.     add    ARGB1_pointer,ebx
  280.     add    ARGB2_pointer,ebx
  281.     add    Y1_pointer,eax
  282.     add    Y2_pointer,eax
  283.     add    U_pointer,ebp
  284.     add    V_pointer,ebp
  285.     neg    ebp
  286.  
  287.     mov    esi,U_pointer
  288.     mov    edi,V_pointer
  289.     mov    ecx,Y1_pointer
  290.     mov    edx,Y2_pointer
  291.     mov    eax,ARGB1_pointer
  292.     mov    ebx,ARGB2_pointer
  293.  
  294. col_loop_MMX:
  295.     movd    mm0,dword [esi+ebp]    ;U (byte)
  296.     pxor    mm7,mm7
  297.  
  298.     movd    mm1,dword [edi+ebp]    ;V (byte)
  299.     punpcklbw mm0,mm7        ;U (word)
  300.  
  301.     psubw    mm0,[MMX_80w]
  302.     punpcklbw mm1,mm7        ;V (word)
  303.  
  304.     psubw    mm1,[MMX_80w]
  305.     movq    mm2,mm0
  306.  
  307.     pmullw    mm2,[MMX_Ugrncoeff]
  308.     movq    mm3,mm1
  309.  
  310.     pmullw    mm3,[MMX_Vgrncoeff]
  311.     pmullw    mm0,[MMX_Ublucoeff]
  312.     pmullw    mm1,[MMX_Vredcoeff]
  313.     paddw    mm2,mm3
  314.  
  315.     ;mm0: blue
  316.     ;mm1: red
  317.     ;mm2: green
  318.  
  319.     movq    mm6,[ecx+ebp*2]        ;Y
  320.     pand    mm6,[MMX_00FFw]
  321.     psubw    mm6,[MMX_10w]
  322.     pmullw    mm6,[MMX_Ycoeff]
  323.     movq    mm4,mm6
  324.     paddw    mm6,mm0            ;mm6: <B3><B2><B1><B0>
  325.     movq    mm5,mm4
  326.     paddw    mm4,mm1            ;mm4: <R3><R2><R1><R0>
  327.     paddw    mm5,mm2            ;mm5: <G3><G2><G1><G0>
  328.     psraw    mm6,6
  329.     psraw    mm4,6
  330.     packuswb mm6,mm6        ;mm6: B3B2B1B0B3B2B1B0
  331.     psraw    mm5,6
  332.     packuswb mm4,mm4        ;mm4: R3R2R1R0R3R2R1R0
  333.     punpcklbw mm6,mm4        ;mm6: R3B3R2B2R1B1R0B0
  334.     packuswb mm5,mm5        ;mm5: G3G2G1G0G3G2G1G0
  335.     punpcklbw mm5,mm5        ;mm5: G3G3G2G2G1G1G0G0
  336.     movq    mm4,mm6
  337.     punpcklbw mm6,mm5        ;mm6: G1R1G1B2G0R0G0B0
  338.     punpckhbw mm4,mm5        ;mm4: G3R3G3B3G2R2G2B2
  339.  
  340.     movq    mm7,[ecx+ebp*2]        ;Y
  341.     psrlw    mm7,8
  342.     psubw    mm7,[MMX_10w]
  343.     pmullw    mm7,[MMX_Ycoeff]
  344.     movq    mm3,mm7
  345.     paddw    mm7,mm0            ;mm7: final blue
  346.     movq    mm5,mm3
  347.     paddw    mm3,mm1            ;mm3: final red
  348.     paddw    mm5,mm2            ;mm5: final green
  349.     psraw    mm7,6
  350.     psraw    mm3,6
  351.     packuswb mm7,mm7        ;mm7: B3B2B1B0B3B2B1B0
  352.     psraw    mm5,6
  353.     packuswb mm3,mm3        ;mm3: R3R2R1R0R3R2R1R0
  354.     punpcklbw mm7,mm3        ;mm7: R3B3R2B2R1B1R0B0
  355.     packuswb mm5,mm5        ;mm5: G3G2G1G0G3G2G1G0
  356.     punpcklbw mm5,mm5        ;mm5: G3G3G2G2G1G1G0G0
  357.     movq    mm3,mm7
  358.     punpcklbw mm7,mm5        ;mm7: G1R1G1B2G0R0G0B0
  359.     punpckhbw mm3,mm5        ;mm3: G3R3G3B3G2R2G2B2
  360.  
  361.     ;mm3    P7:P5
  362.     ;mm4    P6:P4
  363.     ;mm6    P2:P0
  364.     ;mm7    P3:P1
  365.  
  366.     movq    mm5,mm6
  367.     punpckldq mm5,mm7        ;P1:P0
  368.     punpckhdq mm6,mm7        ;P3:P2
  369.     movq    mm7,mm4
  370.     punpckldq mm4,mm3        ;P5:P4
  371.     punpckhdq mm7,mm3        ;P7:P6
  372.  
  373.     movq    [eax+ebp*8],mm5
  374.     movq    [eax+ebp*8+8],mm6
  375.     movq    [eax+ebp*8+16],mm4
  376.     movq    [eax+ebp*8+24],mm7
  377.  
  378.     movq    mm6,[edx+ebp*2]        ;Y
  379.     pand    mm6,[MMX_00FFw]
  380.     psubw    mm6,[MMX_10w]
  381.     pmullw    mm6,[MMX_Ycoeff]
  382.     movq    mm4,mm6
  383.     paddw    mm6,mm0            ;mm6: <B3><B2><B1><B0>
  384.     movq    mm5,mm4
  385.     paddw    mm4,mm1            ;mm4: <R3><R2><R1><R0>
  386.     paddw    mm5,mm2            ;mm5: <G3><G2><G1><G0>
  387.     psraw    mm6,6
  388.     psraw    mm4,6
  389.     packuswb mm6,mm6        ;mm6: B3B2B1B0B3B2B1B0
  390.     psraw    mm5,6
  391.     packuswb mm4,mm4        ;mm4: R3R2R1R0R3R2R1R0
  392.     punpcklbw mm6,mm4        ;mm6: R3B3R2B2R1B1R0B0
  393.     packuswb mm5,mm5        ;mm5: G3G2G1G0G3G2G1G0
  394.     punpcklbw mm5,mm5        ;mm5: G3G3G2G2G1G1G0G0
  395.     movq    mm4,mm6
  396.     punpcklbw mm6,mm5        ;mm6: G1R1G1B2G0R0G0B0
  397.     punpckhbw mm4,mm5        ;mm4: G3R3G3B3G2R2G2B2
  398.  
  399.     movq    mm7,[edx+ebp*2]        ;Y
  400.     psrlw    mm7,8
  401.     psubw    mm7,[MMX_10w]
  402.     pmullw    mm7,[MMX_Ycoeff]
  403.     movq    mm3,mm7
  404.     paddw    mm7,mm0            ;mm7: final blue
  405.     movq    mm5,mm3
  406.     paddw    mm3,mm1            ;mm3: final red
  407.     paddw    mm5,mm2            ;mm5: final green
  408.     psraw    mm7,6
  409.     psraw    mm3,6
  410.     packuswb mm7,mm7        ;mm7: B3B2B1B0B3B2B1B0
  411.     psraw    mm5,6
  412.     packuswb mm3,mm3        ;mm3: R3R2R1R0R3R2R1R0
  413.     punpcklbw mm7,mm3        ;mm7: R3B3R2B2R1B1R0B0
  414.     packuswb mm5,mm5        ;mm5: G3G2G1G0G3G2G1G0
  415.     punpcklbw mm5,mm5        ;mm5: G3G3G2G2G1G1G0G0
  416.     movq    mm3,mm7
  417.     punpcklbw mm7,mm5        ;mm7: G1R1G1B2G0R0G0B0
  418.     punpckhbw mm3,mm5        ;mm3: G3R3G3B3G2R2G2B2
  419.  
  420.     ;mm3    P7:P5
  421.     ;mm4    P6:P4
  422.     ;mm6    P2:P0
  423.     ;mm7    P3:P1
  424.  
  425.     movq    mm5,mm6
  426.     punpckldq mm5,mm7        ;P1:P0
  427.     punpckhdq mm6,mm7        ;P3:P2
  428.     movq    mm7,mm4
  429.     punpckldq mm4,mm3        ;P5:P4
  430.     punpckhdq mm7,mm3        ;P7:P6
  431.  
  432.     movq    [ebx+ebp*8   ],mm5
  433.     movq    [ebx+ebp*8+ 8],mm6
  434.  
  435.     movq    [ebx+ebp*8+16],mm4
  436.     movq    [ebx+ebp*8+24],mm7
  437.  
  438.     add    ebp,4
  439.  
  440.     jnz    col_loop_MMX
  441.  
  442.     pop    ebp
  443.     pop    edi
  444.     pop    esi
  445.     pop    ebx
  446.     ret
  447.  
  448. ;**************************************************************************
  449. ;
  450. ;    asm_YUVtoRGB24_row(
  451. ;        Pixel *ARGB1_pointer,
  452. ;        Pixel *ARGB2_pointer,
  453. ;        YUVPixel *Y1_pointer,
  454. ;        YUVPixel *Y2_pointer,
  455. ;        YUVPixel *U_pointer,
  456. ;        YUVPixel *V_pointer,
  457. ;        long width
  458. ;        );
  459.  
  460. %define    ARGB1_pointer    [esp+ 4+16]
  461. %define    ARGB2_pointer    [esp+ 8+16]
  462. %define    Y1_pointer        [esp+12+16]
  463. %define    Y2_pointer        [esp+16+16]
  464. %define    U_pointer        [esp+20+16]
  465. %define    V_pointer        [esp+24+16]
  466. %define    count            [esp+28+16]
  467.  
  468. _asm_YUVtoRGB24_row:
  469.     push    ebx
  470.     push    esi
  471.     push    edi
  472.     push    ebp
  473.  
  474.     mov    eax,count
  475.     mov    ebp,eax
  476.     add    eax,eax
  477.     add    Y1_pointer,eax
  478.     add    Y2_pointer,eax
  479.     add    U_pointer,ebp
  480.     add    V_pointer,ebp
  481.     neg    ebp
  482.  
  483.     mov    esi,U_pointer            ;[C]
  484.     mov    edi,V_pointer            ;[C]
  485.     xor    edx,edx                ;[C]
  486.     xor    ecx,ecx                ;[C]
  487.  
  488. col_loop24:
  489.     mov    esi,U_pointer
  490.     mov    edi,V_pointer
  491.     xor    eax,eax
  492.     xor    ebx,ebx
  493.     mov    al,[esi + ebp]            ;eax = U
  494.     mov    bl,[edi + ebp]            ;ebx = V
  495.     mov    eax,[_YUV_U_table + eax*4]    ;eax = [b impact][u-g impact]
  496.     mov    edi,[_YUV_V_table + ebx*4]    ;edi = [r impact][v-g impact]
  497.  
  498.     mov    ecx,eax                ;[C]
  499.     mov    esi,Y1_pointer            ;[1]
  500.  
  501.     mov    edx,edi                ;[C]
  502.     xor    ebx,ebx                ;[1]
  503.  
  504.     shr    eax,16                ;[C] eax = blue impact
  505.     mov    bl,[esi + ebp*2]        ;[1] ebx = Y1 value
  506.  
  507.     and    edi,0ffff0000h            ;[C] edi = [r impact][0]
  508.     add    ecx,edx                ;[C] ecx = [junk][g impact]
  509.  
  510.     add    eax,edi                ;[C] eax = [r impact][b impact]
  511.     mov    ebx,[_YUV_Y_table + ebx*4]    ;[1] ebx = Y impact
  512.  
  513.     ;eax = [r][b]
  514.     ;ecx = [g]
  515.  
  516.     mov    esi,ebx                ;[1]
  517.     add    ebx,eax                ;[1] ebx = [red][blue]
  518.  
  519.     add    esi,ecx                ;[1] edx = [junk][green]
  520.     mov    edi,ebx                ;[1] edi = [red][blue]
  521.  
  522.     shr    ebx,16                ;[1] ebx = red
  523.     and    esi,0000ffffh            ;[1] ecx = green
  524.  
  525.     and    edi,0000ffffh            ;edi = blue
  526.     xor    edx,edx
  527.  
  528.     mov    bh,[_YUV_clip_table+ebx-3f00h]    ;bh = red
  529.     mov    dl,[_YUV_clip_table+esi-3f00h]    ;dl = green
  530.  
  531.     mov    esi,Y1_pointer            ;[2]
  532.     mov    bl,[_YUV_clip_table+edi-3f00h]    ;bl = blue
  533.  
  534.     mov    edi,ARGB1_pointer        ;[1]
  535.     mov    [edi+2],bh            ;[1]
  536.  
  537.     mov    [edi+0],bl            ;[1]
  538.     xor    ebx,ebx                ;[2]
  539.  
  540.     mov    [edi+1],dl            ;[1]
  541.  
  542.     mov    bl,[esi + ebp*2 + 1]        ;[2] ebx = Y1 value
  543.     mov    esi,ecx                ;[2]
  544.  
  545.     mov    ebx,[_YUV_Y_table + ebx*4]    ;[2] ebx = Y impact
  546.     mov    edi,0000ffffh            ;[2]
  547.  
  548.     add    esi,ebx                ;[2] edx = [junk][green]
  549.     add    ebx,eax                ;[2] ebx = [red][blue]
  550.  
  551.     and    edi,ebx                ;[2] edi = blue
  552.     and    esi,0000ffffh            ;[2] ecx = green
  553.  
  554.     shr    ebx,16                ;ebx = red
  555.     xor    edx,edx
  556.  
  557.     mov    bh,[_YUV_clip_table+ebx-3f00h]    ;bh = red
  558.     mov    dl,[_YUV_clip_table+esi-3f00h]    ;dl = green
  559.  
  560.     mov    esi,Y2_pointer            ;[3]
  561.     mov    bl,[_YUV_clip_table+edi-3f00h]    ;bl = blue
  562.  
  563.     mov    edi,ARGB1_pointer        ;[2]
  564.     mov    [edi+5],bh            ;[2]
  565.  
  566.     mov    [edi+4],dl            ;[2]
  567.     mov    [edi+3],bl            ;[2]
  568.  
  569.     xor    ebx,ebx                ;[3]
  570.  
  571.     mov    bl,[esi + ebp*2]        ;[3] ebx = Y1 value
  572.     mov    edi,ecx                ;[2]
  573.  
  574.     mov    ebx,[_YUV_Y_table + ebx*4]    ;[3] ebx = Y impact
  575.     mov    esi,0000ffffh            ;[3]
  576.  
  577.     add    edi,ebx                ;[3] edx = [junk][green]
  578.     add    ebx,eax                ;[3] ebx = [red][blue]
  579.  
  580.     and    esi,ebx                ;[3] edi = blue
  581.     and    edi,0000ffffh            ;ecx = green
  582.  
  583.     shr    ebx,16                ;ebx = red
  584.     xor    edx,edx
  585.  
  586.     mov    dl,[_YUV_clip_table+edi-3f00h]    ;dl = green
  587.     mov    edi,ARGB2_pointer        ;[3]
  588.  
  589.     mov    bh,[_YUV_clip_table+ebx-3f00h]    ;bh = red
  590.     mov    bl,[_YUV_clip_table+esi-3f00h]    ;bl = blue
  591.  
  592.     mov    esi,Y2_pointer            ;[4]
  593.     mov    [edi+2],bh
  594.  
  595.     mov    [edi+0],bl
  596.     xor    ebx,ebx                ;[4]
  597.  
  598.     mov    [edi+1],dl
  599.     mov    bl,[esi + ebp*2 + 1]        ;[4] ebx = Y1 value
  600.  
  601.     mov    edi,0000ffffh            ;[4]
  602.  
  603.     mov    ebx,[_YUV_Y_table + ebx*4]    ;[4] ebx = Y impact
  604.     xor    edx,edx
  605.  
  606.     add    ecx,ebx                ;[4] ecx = [junk][green]
  607.     add    ebx,eax                ;ebx = [red][blue]
  608.  
  609.     and    edi,ebx                ;edi = blue
  610.     and    ecx,0000ffffh            ;ecx = green
  611.  
  612.     shr    ebx,16                ;ebx = red
  613.     mov    esi,ARGB2_pointer
  614.  
  615.     mov    bl,[_YUV_clip_table+ebx-3f00h]    ;bh = red
  616.     mov    dl,[_YUV_clip_table+ecx-3f00h]    ;dl = green
  617.  
  618.     mov    al,[_YUV_clip_table+edi-3f00h]    ;bl = blue
  619.     mov    [esi+5],bl
  620.  
  621.     mov    [esi+4],dl
  622.     mov    ecx,ARGB1_pointer
  623.  
  624.     mov    [esi+3],al
  625.     add    esi,6
  626.  
  627.     mov    ARGB2_pointer,esi
  628.     add    ecx,6
  629.  
  630.     mov    ARGB1_pointer,ecx
  631.  
  632.     inc    ebp
  633.     jnz    col_loop24
  634.  
  635.     pop    ebp
  636.     pop    edi
  637.     pop    esi
  638.     pop    ebx
  639.     ret
  640.  
  641. _asm_YUVtoRGB24_row_MMX:
  642.     push    ebx
  643.     push    esi
  644.     push    edi
  645.     push    ebp
  646.  
  647.     mov    eax,count
  648.     mov    ebp,eax
  649.     add    eax,eax
  650.     add    Y1_pointer,eax
  651.     add    Y2_pointer,eax
  652.     add    U_pointer,ebp
  653.     add    V_pointer,ebp
  654.     neg    ebp
  655.  
  656.     mov    esi,U_pointer
  657.     mov    edi,V_pointer
  658.     mov    ecx,Y1_pointer
  659.     mov    edx,Y2_pointer
  660.     mov    eax,ARGB1_pointer
  661.     mov    ebx,ARGB2_pointer
  662.  
  663. col_loop_MMX24:
  664.     movd        mm0,dword [esi+ebp]    ;U (byte)
  665.     pxor        mm7,mm7
  666.  
  667.     movd        mm1,dword [edi+ebp]    ;V (byte)
  668.     punpcklbw mm0,mm7        ;U (word)
  669.  
  670.     movd        mm2,dword [ecx+ebp*2]    ;Y low
  671.     punpcklbw mm1,mm7        ;V (word)
  672.  
  673.     movd        mm3,dword [edx+ebp*2]    ;Y high
  674.     punpcklbw mm2,mm7        ;Y1 (word)
  675.  
  676.     psubw        mm2,[MMX_10w]
  677.     punpcklbw mm3,mm7        ;Y2 (word)
  678.  
  679.     psubw        mm3,[MMX_10w]
  680.  
  681.     psubw        mm0,[MMX_80w]
  682.     psubw        mm1,[MMX_80w]
  683.  
  684.     ;group 1
  685.  
  686.     pmullw        mm2,[MMX_Ycoeff]    ;[lazy]
  687.     movq        mm6,mm0
  688.     pmullw        mm3,[MMX_Ycoeff]    ;[lazy]
  689.     movq        mm7,mm1
  690.     punpcklwd    mm6,mm6        ;mm6 = U1U1U0U0
  691.     movq        mm4,mm2        ;mm4 = Y3Y2Y1Y0        [high]
  692.     punpckldq    mm6,mm6        ;mm6 = U0U0U0U0
  693.     movq        mm5,mm3        ;mm3 = Y3Y2Y1Y0        [low]
  694.     punpcklwd    mm7,mm7        ;mm7 = V1V1V0V0
  695.     punpckldq    mm7,mm7        ;mm7 = V0V0V0V0
  696.  
  697.     pmullw        mm6,[MMX_Ucoeff0]
  698.     punpcklwd    mm4,mm4        ;mm4 = Y1Y1Y0Y0        [high]
  699.     pmullw        mm7,[MMX_Vcoeff0]
  700.     punpcklwd    mm5,mm5        ;mm5 = Y1Y1Y0Y0        [low]
  701.  
  702.     punpcklwd    mm4,mm2        ;mm4 = Y1Y0Y0Y0
  703.     punpcklwd    mm5,mm3        ;mm5 = Y1Y0Y0Y0
  704.  
  705.     paddw        mm4,mm6
  706.     paddw        mm5,mm6
  707.     paddw        mm4,mm7
  708.     paddw        mm5,mm7
  709.  
  710.     psraw        mm4,6
  711.     psraw        mm5,6
  712.  
  713.     packuswb    mm4,mm4
  714.     packuswb    mm5,mm5
  715.  
  716.     ;group 2
  717.  
  718.     movd        dword [eax],mm4    ;[lazy write]
  719.     movq        mm4,mm0
  720.     movd        dword [ebx],mm5    ;[lazy write]
  721.     movq        mm5,mm1
  722.  
  723.     punpcklwd    mm4,mm4        ;mm6 = U1U1U0U0
  724.     movq        mm6,mm2        ;mm4 = Y3Y2Y1Y0        [high]
  725.     punpcklwd    mm5,mm5        ;mm6 = V1V1V0V0
  726.     movq        mm7,mm3        ;mm3 = Y3Y2Y1Y0        [low]
  727.  
  728.     pmullw        mm4,[MMX_Ucoeff1]
  729.     psrlq        mm6,16        ;mm4 = 00Y3Y2Y1        [high]
  730.     pmullw        mm5,[MMX_Vcoeff1]
  731.     psrlq        mm7,16        ;mm4 = 00Y3Y2Y1        [low]
  732.  
  733.     punpcklwd    mm6,mm6        ;mm4 = Y2Y2Y1Y1        [high]
  734.     punpcklwd    mm7,mm7        ;mm5 = Y2Y2Y1Y1        [high]
  735.  
  736.     paddw        mm6,mm4
  737.     paddw        mm7,mm4
  738.     paddw        mm6,mm5
  739.     paddw        mm7,mm5
  740.  
  741.     psraw        mm6,6
  742.     psraw        mm7,6
  743.  
  744.     packuswb    mm6,mm6
  745.     packuswb    mm7,mm7
  746.  
  747.     ;group 3
  748.  
  749.     movd        dword [eax+4],mm6    ;[lazy write]
  750.     movq        mm6,mm0
  751.     movd        dword [ebx+4],mm7    ;[lazy write]
  752.     movq        mm7,mm1
  753.  
  754.     movq        mm4,mm2        ;mm4 = Y3Y2Y1Y0        [high]
  755.     punpcklwd    mm6,mm6        ;mm6 = U1U1U0U0
  756.     movq        mm5,mm3        ;mm3 = Y3Y2Y1Y0        [low]
  757.     punpckhdq    mm6,mm6        ;mm6 = U1U1U1U1
  758.     punpcklwd    mm7,mm7        ;mm7 = V1V1V0V0
  759.     punpckhdq    mm7,mm7        ;mm7 = V1V1V1V1
  760.  
  761.     pmullw        mm6,[MMX_Ucoeff2]
  762.     punpckhwd    mm2,mm2        ;mm2 = Y3Y3Y2Y2        [high]
  763.     pmullw        mm7,[MMX_Vcoeff2]
  764.     punpckhwd    mm3,mm3        ;mm3 = Y3Y3Y2Y2        [low]
  765.  
  766.     punpckhdq    mm4,mm2        ;mm4 = Y3Y3Y3Y2        [high]
  767.     punpckhdq    mm5,mm3        ;mm5 = Y3Y3Y3Y2        [low]
  768.  
  769.     paddw        mm4,mm6
  770.     paddw        mm5,mm6
  771.     paddw        mm4,mm7
  772.     paddw        mm5,mm7
  773.  
  774.     psraw        mm4,6
  775.     psraw        mm5,6
  776.  
  777.     ;next 3 groups
  778.  
  779.     movd        mm2,dword [ecx+ebp*2+4]    ;Y low
  780.     packuswb    mm4,mm4        ;[lazy]
  781.  
  782.     movd        mm3,dword [edx+ebp*2+4]    ;Y high
  783.     packuswb    mm5,mm5        ;[lazy]
  784.  
  785.     movd        dword [eax+8],mm4    ;[lazy write]
  786.     pxor        mm7,mm7
  787.  
  788.     movd        dword [ebx+8],mm5    ;[lazy write]
  789.     punpcklbw    mm2,mm7        ;U (word)
  790.  
  791.  
  792.     psubw        mm2,[MMX_10w]
  793.     punpcklbw    mm3,mm7        ;V (word)
  794.  
  795.     psubw        mm3,[MMX_10w]
  796.  
  797.  
  798.     ;group 1
  799.  
  800.     pmullw        mm2,[MMX_Ycoeff]    ;[init]
  801.     movq        mm6,mm0
  802.  
  803.     pmullw        mm3,[MMX_Ycoeff]    ;[init]
  804.     punpckhwd    mm6,mm6        ;mm6 = U3U3U2U2
  805.  
  806.     movq        mm7,mm1
  807.     punpckldq    mm6,mm6        ;mm6 = U2U2U2U2
  808.     movq        mm4,mm2        ;mm4 = Y3Y2Y1Y0        [high]
  809.     punpckhwd    mm7,mm7        ;mm7 = V3V3V2V2
  810.     movq        mm5,mm3        ;mm3 = Y3Y2Y1Y0        [low]
  811.     punpckldq    mm7,mm7        ;mm7 = V2V2V2V2
  812.  
  813.     pmullw        mm6,[MMX_Ucoeff0]
  814.     punpcklwd    mm4,mm4        ;mm4 = Y1Y1Y0Y0        [high]
  815.     pmullw        mm7,[MMX_Vcoeff0]
  816.     punpcklwd    mm5,mm5        ;mm5 = Y1Y1Y0Y0        [low]
  817.  
  818.     punpcklwd    mm4,mm2        ;mm4 = Y1Y0Y0Y0
  819.     punpcklwd    mm5,mm3        ;mm5 = Y1Y0Y0Y0
  820.  
  821.     paddw        mm4,mm6
  822.     paddw        mm5,mm6
  823.     paddw        mm4,mm7
  824.     paddw        mm5,mm7
  825.  
  826.     psraw        mm4,6
  827.     psraw        mm5,6
  828.  
  829.     packuswb    mm4,mm4
  830.     packuswb    mm5,mm5
  831.  
  832.     ;group 2
  833.  
  834.     movd        dword [eax+12],mm4
  835.     movq        mm6,mm0
  836.     movd        dword [ebx+12],mm5
  837.     movq        mm7,mm1
  838.  
  839.     punpckhwd    mm6,mm6        ;mm6 = U3U3U2U2
  840.     movq        mm4,mm2        ;mm4 = Y3Y2Y1Y0        [high]
  841.     punpckhwd    mm7,mm7        ;mm6 = V3V3V2V2
  842.     movq        mm5,mm3        ;mm3 = Y3Y2Y1Y0        [low]
  843.  
  844.     pmullw        mm6,[MMX_Ucoeff1]
  845.     psrlq        mm4,16        ;mm4 = 00Y3Y2Y1        [high]
  846.     pmullw        mm7,[MMX_Vcoeff1]
  847.     psrlq        mm5,16        ;mm4 = 00Y3Y2Y1        [low]
  848.  
  849.     punpcklwd    mm4,mm4        ;mm4 = Y2Y2Y1Y1        [high]
  850.     punpcklwd    mm5,mm5        ;mm5 = Y2Y2Y1Y1        [high]
  851.  
  852.     paddw        mm4,mm6
  853.     paddw        mm5,mm6
  854.     paddw        mm4,mm7
  855.     paddw        mm5,mm7
  856.  
  857.     psraw        mm4,6
  858.     psraw        mm5,6
  859.  
  860.     packuswb    mm4,mm4
  861.     packuswb    mm5,mm5
  862.  
  863.     ;group 3
  864.  
  865.     movq        mm6,mm2        ;mm4 = Y3Y2Y1Y0        [high]
  866.     punpckhwd    mm0,mm0        ;mm6 = U3U3U2U2
  867.  
  868.     movq        mm7,mm3        ;mm3 = Y3Y2Y1Y0        [low]
  869.     punpckhdq    mm0,mm0        ;mm6 = U3U3U3U3
  870.  
  871.     movd        dword [eax+16],mm4    ;[lazy write]
  872.     punpckhwd    mm1,mm1        ;mm7 = V3V3V2V2
  873.  
  874.     movd        dword [ebx+16],mm5    ;[lazy write]
  875.     punpckhdq    mm1,mm1        ;mm7 = V3V3V3V3
  876.  
  877.     pmullw        mm0,[MMX_Ucoeff2]
  878.     punpckhwd    mm2,mm2        ;mm2 = Y3Y3Y2Y2        [high]
  879.     pmullw        mm1,[MMX_Vcoeff2]
  880.     punpckhwd    mm3,mm3        ;mm3 = Y3Y3Y2Y2        [low]
  881.  
  882.     punpckhdq    mm6,mm2        ;mm4 = Y3Y3Y3Y2        [high]
  883.     punpckhdq    mm7,mm3        ;mm5 = Y3Y3Y3Y2        [low]
  884.  
  885.     paddw        mm6,mm0
  886.     paddw        mm7,mm0
  887.     paddw        mm6,mm1
  888.     paddw        mm7,mm1
  889.  
  890.     psraw        mm6,6
  891.     psraw        mm7,6
  892.  
  893.     packuswb    mm6,mm6
  894.     packuswb    mm7,mm7
  895.  
  896.     movd        dword [eax+20],mm6
  897.     add    eax,24
  898.     movd        dword [ebx+20],mm7
  899.     add    ebx,24
  900.  
  901.     ;done
  902.  
  903.     add    ebp,4
  904.     jnz    col_loop_MMX24
  905.  
  906.     pop    ebp
  907.     pop    edi
  908.     pop    esi
  909.     pop    ebx
  910.     ret
  911.  
  912. ;**************************************************************************
  913.  
  914. _asm_YUVtoRGB16_row:
  915.     push    ebx
  916.     push    esi
  917.     push    edi
  918.     push    ebp
  919.  
  920.     mov    eax,count
  921.     mov    ebp,eax
  922.     mov    ebx,eax
  923.     shl    ebx,2
  924.     add    ARGB1_pointer,ebx
  925.     add    ARGB2_pointer,ebx
  926.     add    eax,eax
  927.     add    Y1_pointer,eax
  928.     add    Y2_pointer,eax
  929.     add    U_pointer,ebp
  930.     add    V_pointer,ebp
  931.     neg    ebp
  932.  
  933.     mov    esi,U_pointer            ;[C]
  934.     mov    edi,V_pointer            ;[C]
  935.     xor    edx,edx                ;[C]
  936.     xor    ecx,ecx                ;[C]
  937.  
  938. col_loop16:
  939.     mov    esi,U_pointer
  940.     mov    edi,V_pointer
  941.     xor    eax,eax
  942.     xor    ebx,ebx
  943.     mov    al,[esi + ebp]            ;eax = U
  944.     mov    bl,[edi + ebp]            ;ebx = V
  945.     mov    eax,[_YUV_U_table + eax*4]    ;eax = [b impact][u-g impact]
  946.     mov    edi,[_YUV_V_table + ebx*4]    ;edi = [r impact][v-g impact]
  947.  
  948.     mov    ecx,eax                ;[C]
  949.     mov    esi,Y1_pointer            ;[1]
  950.  
  951.     mov    edx,edi                ;[C]
  952.     xor    ebx,ebx                ;[1]
  953.  
  954.     shr    eax,16                ;[C] eax = blue impact
  955.     mov    bl,[esi + ebp*2]        ;[1] ebx = Y1 value
  956.  
  957.     and    edi,0ffff0000h            ;[C] edi = [r impact][0]
  958.     add    ecx,edx                ;[C] ecx = [junk][g impact]
  959.  
  960.     add    eax,edi                ;[C] eax = [r impact][b impact]
  961.     mov    ebx,[_YUV_Y_table + ebx*4]    ;[1] ebx = Y impact
  962.  
  963.     ;eax = [r][b]
  964.     ;ecx = [g]
  965.  
  966.     mov    esi,ebx                ;[1]
  967.     add    ebx,eax                ;[1] ebx = [red][blue]
  968.  
  969.     add    esi,ecx                ;[1] edx = [junk][green]
  970.     mov    edi,ebx                ;[1] edi = [red][blue]
  971.  
  972.     shr    ebx,16                ;[1] ebx = red
  973.     and    esi,0000ffffh            ;[1] ecx = green
  974.  
  975.     and    edi,0000ffffh            ;edi = blue
  976.     xor    edx,edx
  977.  
  978.     mov    bh,[_YUV_clip_table16+ebx-3f00h]    ;bh = red
  979.     mov    dl,[_YUV_clip_table16+esi-3f00h]    ;dl = green
  980.  
  981.     mov    bl,[_YUV_clip_table16+edi-3f00h]    ;bl = blue
  982.     xor    dh,dh                ;[1]
  983.  
  984.     shl    bh,2                ;[1]
  985.     mov    edi,ARGB1_pointer        ;[1]
  986.  
  987.     shl    edx,5                ;[1]
  988.     mov    esi,Y1_pointer            ;[2]
  989.  
  990.     add    edx,ebx                ;[1]
  991.     xor    ebx,ebx                ;[2]
  992.  
  993.     mov    [edi+ebp*4+0],dl        ;[1]
  994.     mov    bl,[esi + ebp*2 + 1]        ;[2] ebx = Y1 value
  995.  
  996.     mov    [edi+ebp*4+1],dh        ;[1]
  997.     mov    esi,ecx                ;[2]
  998.  
  999.     mov    ebx,[_YUV_Y_table + ebx*4]    ;[2] ebx = Y impact
  1000.     mov    edi,0000ffffh            ;[2]
  1001.  
  1002.     add    esi,ebx                ;[2] edx = [junk][green]
  1003.     add    ebx,eax                ;[2] ebx = [red][blue]
  1004.  
  1005.     and    edi,ebx                ;[2] edi = blue
  1006.     and    esi,0000ffffh            ;[2] ecx = green
  1007.  
  1008.     shr    ebx,16                ;ebx = red
  1009.     xor    edx,edx
  1010.  
  1011.     mov    bh,[_YUV_clip_table16+ebx-3f00h]    ;bh = red
  1012.  
  1013.     mov    dl,[_YUV_clip_table16+esi-3f00h]    ;dl = green
  1014.     mov    bl,[_YUV_clip_table16+edi-3f00h]    ;bl = blue
  1015.  
  1016.     shl    edx,5                ;[2]
  1017.     mov    edi,ARGB1_pointer        ;[2]
  1018.  
  1019.     shl    bh,2                ;[2]
  1020.     mov    esi,Y2_pointer            ;[3]
  1021.  
  1022.     add    edx,ebx                ;[2]
  1023.     xor    ebx,ebx                ;[3]
  1024.  
  1025.     mov    [edi+ebp*4+2],dl        ;[2]
  1026.     mov    bl,[esi + ebp*2]        ;[3] ebx = Y1 value
  1027.  
  1028.     mov    [edi+ebp*4+3],dh        ;[2]
  1029.     mov    edi,ecx                ;[2]
  1030.  
  1031.     mov    ebx,[_YUV_Y_table + ebx*4]    ;[3] ebx = Y impact
  1032.     mov    esi,0000ffffh            ;[3]
  1033.  
  1034.     add    edi,ebx                ;[3] edx = [junk][green]
  1035.     add    ebx,eax                ;[3] ebx = [red][blue]
  1036.  
  1037.     and    esi,ebx                ;[3] edi = blue
  1038.     and    edi,0000ffffh            ;ecx = green
  1039.  
  1040.     shr    ebx,16                ;ebx = red
  1041.     xor    edx,edx
  1042.  
  1043.     mov    dl,[_YUV_clip_table16+edi-3f00h]    ;dl = green
  1044.     mov    edi,ARGB2_pointer        ;[3]
  1045.  
  1046.     shl    edx,5
  1047.     mov    bh,[_YUV_clip_table16+ebx-3f00h]    ;bh = red
  1048.  
  1049.     mov    bl,[_YUV_clip_table16+esi-3f00h]    ;bl = blue
  1050.     mov    esi,Y2_pointer            ;[4]
  1051.  
  1052.     shl    bh,2                ;[3]
  1053.     nop
  1054.  
  1055.     add    edx,ebx                ;[3]
  1056.     xor    ebx,ebx                ;[4]
  1057.  
  1058.     mov    [edi+ebp*4+0],dl        ;[3]
  1059.     mov    bl,[esi + ebp*2 + 1]        ;[4] ebx = Y1 value
  1060.  
  1061.     mov    [edi+ebp*4+1],dh        ;[3]
  1062.     mov    edi,0000ffffh            ;[4]
  1063.  
  1064.     mov    ebx,[_YUV_Y_table + ebx*4]    ;[4] ebx = Y impact
  1065.     xor    edx,edx
  1066.  
  1067.     add    ecx,ebx                ;[4] ecx = [junk][green]
  1068.     add    ebx,eax                ;ebx = [red][blue]
  1069.  
  1070.     and    edi,ebx                ;edi = blue
  1071.     and    ecx,0000ffffh            ;ecx = green
  1072.  
  1073.     shr    ebx,16                ;ebx = red
  1074.     mov    esi,ARGB2_pointer
  1075.  
  1076.     mov    dl,[_YUV_clip_table16+ecx-3f00h]    ;dl = green
  1077.     mov    al,[_YUV_clip_table16+edi-3f00h]    ;bl = blue
  1078.  
  1079.     shl    edx,5
  1080.     mov    ah,[_YUV_clip_table16+ebx-3f00h]    ;bh = red
  1081.  
  1082.     shl    ah,2
  1083.  
  1084.     add    eax,edx
  1085.  
  1086.     mov    [esi+ebp*4+2],al
  1087.     mov    [esi+ebp*4+3],ah
  1088.  
  1089.     inc    ebp
  1090.     jnz    col_loop16
  1091.  
  1092.     pop    ebp
  1093.     pop    edi
  1094.     pop    esi
  1095.     pop    ebx
  1096.     ret
  1097.  
  1098.  
  1099.  
  1100. _asm_YUVtoRGB16_row_MMX:
  1101.     push    ebx
  1102.     push    esi
  1103.     push    edi
  1104.     push    ebp
  1105.  
  1106.     mov    eax,count
  1107.     mov    ebp,eax
  1108.     mov    ebx,eax
  1109.     shl    ebx,2
  1110.     add    eax,eax
  1111.     add    ARGB1_pointer,ebx
  1112.     add    ARGB2_pointer,ebx
  1113.     add    Y1_pointer,eax
  1114.     add    Y2_pointer,eax
  1115.     add    U_pointer,ebp
  1116.     add    V_pointer,ebp
  1117.     neg    ebp
  1118.  
  1119.     mov    esi,U_pointer
  1120.     mov    edi,V_pointer
  1121.     mov    ecx,Y1_pointer
  1122.     mov    edx,Y2_pointer
  1123.     mov    eax,ARGB1_pointer
  1124.     mov    ebx,ARGB2_pointer
  1125.  
  1126. col_loop_MMX16:
  1127.     movd    mm0,dword [esi+ebp]        ;[0       ] U (byte)
  1128.     pxor    mm7,mm7            ;[0      7] 
  1129.  
  1130.     movd    mm1,dword [edi+ebp]        ;[01     7] V (byte)
  1131.     punpcklbw mm0,mm7        ;[01     7] U (word)
  1132.  
  1133.     psubw    mm0,[MMX_80w]        ;[01     7] 
  1134.     punpcklbw mm1,mm7        ;[01     7] V (word)
  1135.  
  1136.     psubw    mm1,[MMX_80w]        ;[01      ] 
  1137.     movq    mm2,mm0            ;[012     ] 
  1138.  
  1139.     pmullw    mm2,[MMX_Ugrncoeff]    ;[012     ] 
  1140.     movq    mm3,mm1            ;[0123    ] 
  1141.  
  1142.     ;mm0: blue
  1143.     ;mm1: red
  1144.     ;mm2: green
  1145.  
  1146.     movq    mm6,[ecx+ebp*2]        ;[0123  6 ] [1] Y
  1147.     ;<-->
  1148.  
  1149.     pmullw    mm3,[MMX_Vgrncoeff]    ;[0123    ] 
  1150.     movq    mm7,mm6            ;[012   67] [2] Y
  1151.  
  1152.     pmullw    mm0,[MMX_Ublucoeff]    ;[0123    ] 
  1153.     psrlw    mm7,8            ;[012   67] [2]
  1154.  
  1155.     pmullw    mm1,[MMX_Vredcoeff]    ;[0123    ] 
  1156.     ;<-->
  1157.  
  1158.     pand    mm6,[MMX_00FFw]        ;[012   67] [1]
  1159.     paddw    mm2,mm3            ;[012   6 ] [C]
  1160.  
  1161.     psubw    mm6,[MMX_10w]        ;[012   67] [1]
  1162.  
  1163.     pmullw    mm6,[MMX_Ycoeff]        ;[012   67] [1]
  1164.  
  1165.     psubw    mm7,[MMX_10w]        ;[012   67] [2]
  1166.     movq    mm4,mm6            ;[012 4 67] [1]
  1167.  
  1168.     pmullw    mm7,[MMX_Ycoeff]        ;[012   67] [2]
  1169.     movq    mm5,mm6            ;[012 4567] [1]
  1170.  
  1171.     paddw    mm6,mm0            ;[012 4 67] [1] mm6: <B3><B2><B1><B0>
  1172.     paddw    mm4,mm1            ;[012 4567] [1] mm4: <R3><R2><R1><R0>
  1173.  
  1174.     paddw    mm5,mm2            ;[012 4567] [1] mm5: <G3><G2><G1><G0>
  1175.     psraw    mm4,6            ;[012 4567] [1]
  1176.  
  1177.     movq    mm3,mm7            ;[01234567] [2]
  1178.     psraw    mm5,4            ;[01234567] [1]
  1179.  
  1180.     paddw    mm7,mm0            ;[01234567] [2] mm6: <B3><B2><B1><B0>
  1181.     psraw    mm6,6            ;[01234567] [1]
  1182.  
  1183.     paddsw    mm5,[MMX_clip]
  1184.     packuswb mm6,mm6        ;[01234567] [1] mm6: B3B2B1B0B3B2B1B0
  1185.  
  1186.     psubusw    mm5,[MMX_clip]
  1187.     packuswb mm4,mm4        ;[01234567] [1] mm4: R3R2R1R0R3R2R1R0
  1188.  
  1189.     pand    mm5,[MMX_grnmask]        ;[01234567] [1] mm7: <G3><G2><G1><G0>
  1190.     psrlq    mm6,2            ;[01234567] [1]
  1191.  
  1192.     punpcklbw mm6,mm4        ;[0123 567] [1] mm4: R3B3R2B2R1B1R0B0
  1193.  
  1194.     movq    mm4,[edx+ebp*2]        ;[01234567] [3] Y
  1195.     psrlw    mm6,1            ;[01234567] [1]
  1196.  
  1197.     pand    mm6,[MMX_rbmask]        ;[01234567] [1] mm6: <RB3><RB2><RB1><RB0>
  1198.  
  1199.     por    mm6,mm5            ;[01234 67] [1] mm6: P6P4P2P0
  1200.     movq    mm5,mm3            ;[01234567] [2]
  1201.  
  1202.     paddw    mm3,mm1            ;[01234567] [2] mm4: <R3><R2><R1><R0>
  1203.     paddw    mm5,mm2            ;[01234567] [2] mm5: <G3><G2><G1><G0>
  1204.  
  1205.     pand    mm4,[MMX_00FFw]        ;[01234567] [3]
  1206.     psraw    mm3,6            ;[01234567] [2]    
  1207.  
  1208.     psubw    mm4,[MMX_10w]        ;[01234567] [3]
  1209.     psraw    mm5,4            ;[01234567] [2]
  1210.  
  1211.     pmullw    mm4,[MMX_Ycoeff]        ;[01234567] [3]
  1212.     psraw    mm7,6            ;[01234567] [2]
  1213.  
  1214.     paddsw    mm5,[MMX_clip]
  1215.     packuswb mm3,mm3        ;[01234567] [2] mm4: R3R2R1R0R3R2R1R0
  1216.  
  1217.     psubusw    mm5,[MMX_clip]
  1218.     packuswb mm7,mm7        ;[01234567] [2] mm6: B3B2B1B0B3B2B1B0
  1219.  
  1220.     pand    mm5,[MMX_grnmask]        ;[012 4567] [2] mm7: <G3><G2><G1><G0>
  1221.     psrlq    mm7,2            ;[01234567] [2]
  1222.  
  1223.     punpcklbw mm7,mm3        ;[012 4567] [2] mm6: R3B3R2B2R1B1R0B0
  1224.  
  1225.     movq    mm3,[edx+ebp*2]        ;[01234567] [4] Y
  1226.     psrlw    mm7,1            ;[01234567] [2]
  1227.  
  1228.     pand    mm7,[MMX_rbmask]        ;[01234567] [2] mm6: <RB3><RB2><RB1><RB0>
  1229.     psrlw    mm3,8            ;[01234567] [4]
  1230.  
  1231.     por    mm7,mm5            ;[01234567] [2] mm7: P7P5P3P1
  1232.     movq    mm5,mm6            ;[01234567] [A]
  1233.  
  1234.     psubw    mm3,[MMX_10w]        ;[01234567] [4]
  1235.     punpcklwd mm6,mm7        ;[01234567] [A] mm4: P3P2P1P0
  1236.  
  1237.     pmullw    mm3,[MMX_Ycoeff]        ;[0123456 ] [4]
  1238.     punpckhwd mm5,mm7        ;[0123456 ] [A} mm5: P7P6P5P4
  1239.  
  1240.     movq    [eax+ebp*4   ],mm6    ;[012345  ] [A]
  1241.     movq    mm6,mm4            ;[0123456 ] [3]
  1242.  
  1243.     movq    [eax+ebp*4+ 8],mm5    ;[0123456 ] [A]
  1244.     paddw    mm6,mm0            ;[01234 6 ] [3] mm6: <B3><B2><B1><B0>
  1245.  
  1246.     movq    mm5,mm4            ;[0123456 ] [3]
  1247.     paddw    mm4,mm1            ;[0123456 ] [3] mm4: <R3><R2><R1><R0>
  1248.  
  1249.     paddw    mm5,mm2            ;[0123456 ] [3] mm5: <G3><G2><G1><G0>
  1250.     psraw    mm4,6            ;[0123456 ] [3]
  1251.  
  1252.     movq    mm7,mm3            ;[01234567] [4]
  1253.     psraw    mm5,4            ;[01234567] [3]
  1254.  
  1255.     paddw    mm7,mm0            ;[01234567] [4] mm6: <B3><B2><B1><B0>
  1256.     psraw    mm6,6            ;[01234567] [3]
  1257.  
  1258.     movq    mm0,mm3            ;[01234567] [4]
  1259.     packuswb mm4,mm4        ;[01234567] [3] mm4: R3R2R1R0R3R2R1R0
  1260.  
  1261.  
  1262.     packuswb mm6,mm6        ;[01 34567] [3] mm6: B3B2B1B0B3B2B1B0
  1263.     paddw    mm3,mm1            ;[01234567] [4] mm4: <R3><R2><R1><R0>
  1264.  
  1265.     psrlq    mm6,2
  1266.     paddw    mm0,mm2            ;[01 34567] [4] mm5: <G3><G2><G1><G0>
  1267.  
  1268.     paddsw    mm5,[MMX_clip]
  1269.     punpcklbw mm6,mm4        ;[01 3 567] [3] mm6: B3B3B2B2B1B1B0B0
  1270.  
  1271.     psubusw    mm5,[MMX_clip]
  1272.     psrlw    mm6,1            ;[01 3 567] [3]
  1273.  
  1274.     pand    mm6,[MMX_rbmask]        ;[01 3 567] [3] mm6: <B3><B2><B1><B0>
  1275.     psraw    mm3,6            ;[01 3 567] [4]
  1276.  
  1277.     pand    mm5,[MMX_grnmask]        ;[01 3 567] [3] mm7: <G3><G2><G1><G0>
  1278.     psraw    mm0,4            ;[01 3 567] [4]
  1279.  
  1280.     por    mm6,mm5            ;[01 3  67] [3] mm4: P6P4P2P0    
  1281.     psraw    mm7,6            ;[01 3  67] [4]
  1282.  
  1283.     paddsw    mm0,[MMX_clip]
  1284.     packuswb mm3,mm3        ;[01 3  67] [4] mm4: R3R2R1R0R3R2R1R0
  1285.  
  1286.     psubusw    mm0,[MMX_clip]
  1287.     packuswb mm7,mm7        ;[01 3  67] mm6: B3B2B1B0B3B2B1B0
  1288.  
  1289.     pand    mm0,[MMX_grnmask]        ;[01    67] mm7: <G3><G2><G1><G0>
  1290.     psrlq    mm7,2
  1291.  
  1292.     punpcklbw mm7,mm3        ;[01    67] mm6: R3B3R2B2R1B1R0B0
  1293.     movq    mm1,mm6
  1294.  
  1295.     psrlw    mm7,1
  1296.     add    ebp,4
  1297.  
  1298.     pand    mm7,[MMX_rbmask]        ;[01    67] mm6: <B3><B2><B1><B0>
  1299.  
  1300.     por    mm0,mm7            ;[01    67] mm0: P7P5P3P1
  1301.  
  1302.     punpcklwd mm6,mm0        ;[01    6 ] mm4: P3P2P1P0
  1303.  
  1304.     punpckhwd mm1,mm0        ;[ 1    6 ] mm5: P7P6P5P4
  1305.     movq    [ebx+ebp*4-16],mm6
  1306.  
  1307.     movq    [ebx+ebp*4- 8],mm1
  1308.     jnz    col_loop_MMX16
  1309.  
  1310.     pop    ebp
  1311.     pop    edi
  1312.     pop    esi
  1313.     pop    ebx
  1314.     ret
  1315.  
  1316. ;--------------------------------------------------------------------------
  1317.  
  1318. _asm_YUVtoRGB32_row_ISSE:
  1319.     push    ebx
  1320.     push    esi
  1321.     push    edi
  1322.     push    ebp
  1323.  
  1324.     mov    eax,count
  1325.     mov    ebp,eax
  1326.     mov    ebx,eax
  1327.     shl    ebx,3
  1328.     add    eax,eax
  1329.     add    ARGB1_pointer,ebx
  1330.     add    ARGB2_pointer,ebx
  1331.     add    Y1_pointer,eax
  1332.     add    Y2_pointer,eax
  1333.     add    U_pointer,ebp
  1334.     add    V_pointer,ebp
  1335.     neg    ebp
  1336.  
  1337.     mov    esi,U_pointer
  1338.     mov    edi,V_pointer
  1339.     mov    ecx,Y1_pointer
  1340.     mov    edx,Y2_pointer
  1341.     mov    eax,ARGB1_pointer
  1342.     mov    ebx,ARGB2_pointer
  1343.  
  1344. col_loop_SSE:
  1345.     prefetchnta [esi+ebp+32]
  1346.     prefetchnta [edi+ebp+32]
  1347.     prefetchnta [ecx+ebp*2+32]
  1348.     prefetchnta [edx+ebp*2+32]
  1349.  
  1350.     movd    mm0,dword [esi+ebp]        ;U (byte)
  1351.     pxor    mm7,mm7
  1352.  
  1353.     movd    mm1,dword [edi+ebp]        ;V (byte)
  1354.     punpcklbw mm0,mm7        ;U (word)
  1355.  
  1356.     psubw    mm0,[MMX_80w]
  1357.     punpcklbw mm1,mm7        ;V (word)
  1358.  
  1359.     psubw    mm1,[MMX_80w]
  1360.     movq    mm2,mm0
  1361.  
  1362.     pmullw    mm2,[MMX_Ugrncoeff]
  1363.     movq    mm3,mm1
  1364.  
  1365.     pmullw    mm3,[MMX_Vgrncoeff]
  1366.     pmullw    mm0,[MMX_Ublucoeff]
  1367.     pmullw    mm1,[MMX_Vredcoeff]
  1368.     paddw    mm2,mm3
  1369.  
  1370.     ;mm0: blue
  1371.     ;mm1: red
  1372.     ;mm2: green
  1373.  
  1374.     movq    mm6,[ecx+ebp*2]        ;Y
  1375.     pand    mm6,[MMX_00FFw]
  1376.     psubw    mm6,[MMX_10w]
  1377.     pmullw    mm6,[MMX_Ycoeff]
  1378.     movq    mm4,mm6
  1379.     paddw    mm6,mm0            ;mm6: <B3><B2><B1><B0>
  1380.     movq    mm5,mm4
  1381.     paddw    mm4,mm1            ;mm4: <R3><R2><R1><R0>
  1382.     paddw    mm5,mm2            ;mm5: <G3><G2><G1><G0>
  1383.     psraw    mm6,6
  1384.     psraw    mm4,6
  1385.     packuswb mm6,mm6        ;mm6: B3B2B1B0B3B2B1B0
  1386.     psraw    mm5,6
  1387.     packuswb mm4,mm4        ;mm4: R3R2R1R0R3R2R1R0
  1388.     punpcklbw mm6,mm4        ;mm6: R3B3R2B2R1B1R0B0
  1389.     packuswb mm5,mm5        ;mm5: G3G2G1G0G3G2G1G0
  1390.     punpcklbw mm5,mm5        ;mm5: G3G3G2G2G1G1G0G0
  1391.     movq    mm4,mm6
  1392.     punpcklbw mm6,mm5        ;mm6: G1R1G1B2G0R0G0B0
  1393.     punpckhbw mm4,mm5        ;mm4: G3R3G3B3G2R2G2B2
  1394.  
  1395.     movq    mm7,[ecx+ebp*2]        ;Y
  1396.     psrlw    mm7,8
  1397.     psubw    mm7,[MMX_10w]
  1398.     pmullw    mm7,[MMX_Ycoeff]
  1399.     movq    mm3,mm7
  1400.     paddw    mm7,mm0            ;mm7: final blue
  1401.     movq    mm5,mm3
  1402.     paddw    mm3,mm1            ;mm3: final red
  1403.     paddw    mm5,mm2            ;mm5: final green
  1404.     psraw    mm7,6
  1405.     psraw    mm3,6
  1406.     packuswb mm7,mm7        ;mm7: B3B2B1B0B3B2B1B0
  1407.     psraw    mm5,6
  1408.     packuswb mm3,mm3        ;mm3: R3R2R1R0R3R2R1R0
  1409.     punpcklbw mm7,mm3        ;mm7: R3B3R2B2R1B1R0B0
  1410.     packuswb mm5,mm5        ;mm5: G3G2G1G0G3G2G1G0
  1411.     punpcklbw mm5,mm5        ;mm5: G3G3G2G2G1G1G0G0
  1412.     movq    mm3,mm7
  1413.     punpcklbw mm7,mm5        ;mm7: G1R1G1B2G0R0G0B0
  1414.     punpckhbw mm3,mm5        ;mm3: G3R3G3B3G2R2G2B2
  1415.  
  1416.     ;mm3    P7:P5
  1417.     ;mm4    P6:P4
  1418.     ;mm6    P2:P0
  1419.     ;mm7    P3:P1
  1420.  
  1421.     movq    mm5,mm6
  1422.     punpckldq mm5,mm7        ;P1:P0
  1423.     punpckhdq mm6,mm7        ;P3:P2
  1424.     movq    mm7,mm4
  1425.     punpckldq mm4,mm3        ;P5:P4
  1426.     punpckhdq mm7,mm3        ;P7:P6
  1427.  
  1428.     movntq    [eax+ebp*8],mm5
  1429.     movntq    [eax+ebp*8+8],mm6
  1430.     movntq    [eax+ebp*8+16],mm4
  1431.     movntq    [eax+ebp*8+24],mm7
  1432.  
  1433.     movq    mm6,[edx+ebp*2]        ;Y
  1434.     pand    mm6,[MMX_00FFw]
  1435.     psubw    mm6,[MMX_10w]
  1436.     pmullw    mm6,[MMX_Ycoeff]
  1437.     movq    mm4,mm6
  1438.     paddw    mm6,mm0            ;mm6: <B3><B2><B1><B0>
  1439.     movq    mm5,mm4
  1440.     paddw    mm4,mm1            ;mm4: <R3><R2><R1><R0>
  1441.     paddw    mm5,mm2            ;mm5: <G3><G2><G1><G0>
  1442.     psraw    mm6,6
  1443.     psraw    mm4,6
  1444.     packuswb mm6,mm6        ;mm6: B3B2B1B0B3B2B1B0
  1445.     psraw    mm5,6
  1446.     packuswb mm4,mm4        ;mm4: R3R2R1R0R3R2R1R0
  1447.     punpcklbw mm6,mm4        ;mm6: R3B3R2B2R1B1R0B0
  1448.     packuswb mm5,mm5        ;mm5: G3G2G1G0G3G2G1G0
  1449.     punpcklbw mm5,mm5        ;mm5: G3G3G2G2G1G1G0G0
  1450.     movq    mm4,mm6
  1451.     punpcklbw mm6,mm5        ;mm6: G1R1G1B2G0R0G0B0
  1452.     punpckhbw mm4,mm5        ;mm4: G3R3G3B3G2R2G2B2
  1453.  
  1454.     movq    mm7,[edx+ebp*2]        ;Y
  1455.     psrlw    mm7,8
  1456.     psubw    mm7,[MMX_10w]
  1457.     pmullw    mm7,[MMX_Ycoeff]
  1458.     movq    mm3,mm7
  1459.     paddw    mm7,mm0            ;mm7: final blue
  1460.     movq    mm5,mm3
  1461.     paddw    mm3,mm1            ;mm3: final red
  1462.     paddw    mm5,mm2            ;mm5: final green
  1463.     psraw    mm7,6
  1464.     psraw    mm3,6
  1465.     packuswb mm7,mm7        ;mm7: B3B2B1B0B3B2B1B0
  1466.     psraw    mm5,6
  1467.     packuswb mm3,mm3        ;mm3: R3R2R1R0R3R2R1R0
  1468.     punpcklbw mm7,mm3        ;mm7: R3B3R2B2R1B1R0B0
  1469.     packuswb mm5,mm5        ;mm5: G3G2G1G0G3G2G1G0
  1470.     punpcklbw mm5,mm5        ;mm5: G3G3G2G2G1G1G0G0
  1471.     movq    mm3,mm7
  1472.     punpcklbw mm7,mm5        ;mm7: G1R1G1B2G0R0G0B0
  1473.     punpckhbw mm3,mm5        ;mm3: G3R3G3B3G2R2G2B2
  1474.  
  1475.     ;mm3    P7:P5
  1476.     ;mm4    P6:P4
  1477.     ;mm6    P2:P0
  1478.     ;mm7    P3:P1
  1479.  
  1480.     movq    mm5,mm6
  1481.     punpckldq mm5,mm7        ;P1:P0
  1482.     punpckhdq mm6,mm7        ;P3:P2
  1483.     movq    mm7,mm4
  1484.     punpckldq mm4,mm3        ;P5:P4
  1485.     punpckhdq mm7,mm3        ;P7:P6
  1486.  
  1487.     movntq    [ebx+ebp*8   ],mm5
  1488.     movntq    [ebx+ebp*8+ 8],mm6
  1489.  
  1490.     movntq    [ebx+ebp*8+16],mm4
  1491.     movntq    [ebx+ebp*8+24],mm7
  1492.  
  1493.     add    ebp,4
  1494.  
  1495.     jnz    col_loop_SSE
  1496.  
  1497.     pop    ebp
  1498.     pop    edi
  1499.     pop    esi
  1500.     pop    ebx
  1501.     ret
  1502.  
  1503.     global    _asm_YUVtoRGB24_row_ISSE
  1504. _asm_YUVtoRGB24_row_ISSE:
  1505.     ;.FPO (7, 9, 0, 0, 0, 0)
  1506.     push    ebx
  1507.     push    esi
  1508.     push    edi
  1509.     push    ebp
  1510.  
  1511.     mov    eax,count
  1512.     mov    ebp,eax
  1513.     add    eax,eax
  1514.     add    Y1_pointer,eax
  1515.     add    Y2_pointer,eax
  1516.     add    U_pointer,ebp
  1517.     add    V_pointer,ebp
  1518.     neg    ebp
  1519.  
  1520.     mov    esi,U_pointer
  1521.     mov    edi,V_pointer
  1522.     mov    ecx,Y1_pointer
  1523.     mov    edx,Y2_pointer
  1524.     mov    eax,ARGB1_pointer
  1525.     mov    ebx,ARGB2_pointer
  1526.  
  1527.     movd    mm0,esp
  1528.     sub    esp,20
  1529.     and    esp,-8
  1530.     movd    dword [esp+16],mm0
  1531.  
  1532. col_loop_ISSE24:
  1533.     prefetchnta    [esi+ebp+32]
  1534.     prefetchnta [edi+ebp+32]
  1535.     prefetchnta [ecx+ebp*2+32]
  1536.     prefetchnta [edx+ebp*2+32]
  1537.  
  1538.     movd        mm0,dword [esi+ebp]    ;U (byte)
  1539.     pxor        mm7,mm7
  1540.  
  1541.     movd        mm1,dword [edi+ebp]    ;V (byte)
  1542.     punpcklbw mm0,mm7        ;U (word)
  1543.  
  1544.     movd        mm2,dword [ecx+ebp*2]    ;Y low
  1545.     punpcklbw mm1,mm7        ;V (word)
  1546.  
  1547.     movd        mm3,dword [edx+ebp*2]    ;Y high
  1548.     punpcklbw mm2,mm7        ;Y1 (word)
  1549.  
  1550.     psubw        mm2,[MMX_10w]
  1551.     punpcklbw mm3,mm7        ;Y2 (word)
  1552.  
  1553.     psubw        mm3,[MMX_10w]
  1554.  
  1555.     psubw        mm0,[MMX_80w]
  1556.     psubw        mm1,[MMX_80w]
  1557.  
  1558.     movq        [esp+0],mm0
  1559.     movq        [esp+8],mm1
  1560.  
  1561.     ;group 1
  1562.  
  1563.     pmullw        mm2,[MMX_Ycoeff]    ;[lazy]
  1564.     pmullw        mm3,[MMX_Ycoeff]    ;[lazy]
  1565.  
  1566.     pshufw        mm6,mm0,00000000b    ;mm6 = U0U0U0U0
  1567.     pshufw        mm7,mm1,00000000b    ;mm7 = V0V0V0V0
  1568.  
  1569.     pmullw        mm6,[MMX_Ucoeff0]
  1570.     pshufw        mm4,mm2,01000000b    ;mm4 = Y1Y0Y0Y0 [high]
  1571.     pmullw        mm7,[MMX_Vcoeff0]
  1572.     pshufw        mm5,mm3,01000000b    ;mm4 = Y1Y0Y0Y0 [low]
  1573.  
  1574.     paddw        mm4,mm6
  1575.     paddw        mm5,mm6
  1576.     paddw        mm4,mm7
  1577.     paddw        mm5,mm7
  1578.  
  1579.     psraw        mm4,6
  1580.     psraw        mm5,6
  1581.  
  1582.     ;group 2
  1583.  
  1584.     pshufw        mm6,[esp+0],01010000b    ;mm6 = U1U1U0U0
  1585.     pshufw        mm7,[esp+8],01010000b    ;mm7 = V1V1V0V0
  1586.  
  1587.     pmullw        mm6,[MMX_Ucoeff1]
  1588.     pshufw        mm0,mm2,10100101b    ;mm0 = Y2Y2Y1Y1        [high]
  1589.     pmullw        mm7,[MMX_Vcoeff1]
  1590.     pshufw        mm1,mm3,10100101b    ;mm1 = Y2Y2Y1Y1        [low]
  1591.  
  1592.     paddw        mm0,mm6
  1593.     paddw        mm1,mm6
  1594.     paddw        mm0,mm7
  1595.     paddw        mm1,mm7
  1596.  
  1597.     psraw        mm0,6
  1598.     psraw        mm1,6
  1599.  
  1600.     packuswb    mm4,mm0
  1601.     packuswb    mm5,mm1
  1602.  
  1603.     ;group 3
  1604.  
  1605.     pshufw        mm6,[esp+0],01010101b    ;mm6 = U1U1U1U1
  1606.     pshufw        mm7,[esp+8],01010101b    ;mm7 = V1V1V1V1
  1607.  
  1608.     movntq        [eax],mm4    ;[lazy write]
  1609.     movntq        [ebx],mm5    ;[lazy write]
  1610.  
  1611.     pmullw        mm6,[MMX_Ucoeff2]
  1612.     pshufw        mm4,mm2,11111110b    ;mm4 = Y3Y3Y3Y2        [high]
  1613.     pmullw        mm7,[MMX_Vcoeff2]
  1614.     pshufw        mm5,mm3,11111110b    ;mm5 = Y3Y3Y3Y2        [low]
  1615.  
  1616.     paddw        mm4,mm6
  1617.     paddw        mm5,mm6
  1618.     paddw        mm4,mm7
  1619.     paddw        mm5,mm7
  1620.  
  1621.     psraw        mm4,6
  1622.     psraw        mm5,6
  1623.  
  1624.     ;next 3 groups
  1625.  
  1626.     movd        mm2,dword [ecx+ebp*2+4]    ;Y low
  1627.     pxor        mm7,mm7
  1628.  
  1629.     movd        mm3,dword [edx+ebp*2+4]    ;Y high
  1630.     punpcklbw    mm2,mm7        ;U (word)
  1631.  
  1632.     psubw        mm2,[MMX_10w]
  1633.     punpcklbw    mm3,mm7        ;V (word)
  1634.  
  1635.     psubw        mm3,[MMX_10w]
  1636.  
  1637.  
  1638.     ;group 1
  1639.  
  1640.     pmullw        mm2,[MMX_Ycoeff]    ;[init]
  1641.     pmullw        mm3,[MMX_Ycoeff]    ;[init]
  1642.  
  1643.     pshufw        mm6,[esp+0],10101010b    ;mm6 = U2U2U2U2
  1644.     pshufw        mm7,[esp+8],10101010b    ;mm7 = V2V2V2V2
  1645.  
  1646.     pmullw        mm6,[MMX_Ucoeff0]
  1647.     pshufw        mm0,mm2,01000000b    ;mm0 = Y1Y0Y0Y0 [high]
  1648.     pmullw        mm7,[MMX_Vcoeff0]
  1649.     pshufw        mm1,mm3,01000000b    ;mm1 = Y1Y0Y0Y0 [low]
  1650.  
  1651.     paddw        mm0,mm6
  1652.     paddw        mm1,mm6
  1653.     paddw        mm0,mm7
  1654.     paddw        mm1,mm7
  1655.  
  1656.     psraw        mm0,6
  1657.     psraw        mm1,6
  1658.  
  1659.     packuswb    mm4,mm0
  1660.     packuswb    mm5,mm1
  1661.  
  1662.     ;group 2
  1663.  
  1664.     pshufw        mm6,[esp+0],11111010b    ;mm6 = U3U3U2U2
  1665.     pshufw        mm7,[esp+8],11111010b    ;mm7 = V3V3V2V2
  1666.  
  1667.     movntq        [eax+8],mm4
  1668.     movntq        [ebx+8],mm5
  1669.  
  1670.     pmullw        mm6,[MMX_Ucoeff1]
  1671.     pshufw        mm4,mm2,10100101b    ;mm4 = Y2Y2Y1Y1        [high]
  1672.     pmullw        mm7,[MMX_Vcoeff1]
  1673.     pshufw        mm5,mm3,10100101b    ;mm5 = Y2Y2Y1Y1        [low]
  1674.  
  1675.     paddw        mm4,mm6
  1676.     paddw        mm5,mm6
  1677.     paddw        mm4,mm7
  1678.     paddw        mm5,mm7
  1679.  
  1680.     psraw        mm4,6
  1681.     psraw        mm5,6
  1682.  
  1683.     ;group 3
  1684.  
  1685.     pshufw        mm0,[esp+0],11111111b    ;mm6 = U3U3U3U3
  1686.     pshufw        mm1,[esp+8],11111111b    ;mm7 = V3V3V3V3
  1687.  
  1688.     pmullw        mm0,[MMX_Ucoeff2]
  1689.     pshufw        mm2,mm2,11111110b    ;mm6 = Y3Y3Y3Y2        [high]
  1690.     pmullw        mm1,[MMX_Vcoeff2]
  1691.     pshufw        mm3,mm3,11111110b    ;mm7 = Y3Y3Y3Y2        [low]
  1692.  
  1693.     paddw        mm2,mm0
  1694.     paddw        mm3,mm0
  1695.     paddw        mm2,mm1
  1696.     paddw        mm3,mm1
  1697.  
  1698.     psraw        mm2,6
  1699.     psraw        mm3,6
  1700.  
  1701.     packuswb    mm4,mm2
  1702.     packuswb    mm5,mm3
  1703.  
  1704.     movntq        [eax+16],mm4
  1705.     add    eax,24
  1706.     movntq        [ebx+16],mm5
  1707.     add    ebx,24
  1708.  
  1709.     ;done
  1710.  
  1711.     add    ebp,4
  1712.     jnz    col_loop_ISSE24
  1713.  
  1714.     mov    esp,[esp+16]
  1715.  
  1716.     pop    ebp
  1717.     pop    edi
  1718.     pop    esi
  1719.     pop    ebx
  1720.     ret
  1721.  
  1722. _asm_YUVtoRGB16_row_ISSE:
  1723.     push    ebx
  1724.     push    esi
  1725.     push    edi
  1726.     push    ebp
  1727.  
  1728.     mov    eax,count
  1729.     mov    ebp,eax
  1730.     mov    ebx,eax
  1731.     shl    ebx,2
  1732.     add    eax,eax
  1733.     add    ARGB1_pointer,ebx
  1734.     add    ARGB2_pointer,ebx
  1735.     add    Y1_pointer,eax
  1736.     add    Y2_pointer,eax
  1737.     add    U_pointer,ebp
  1738.     add    V_pointer,ebp
  1739.     neg    ebp
  1740.  
  1741.     mov    esi,U_pointer
  1742.     mov    edi,V_pointer
  1743.     mov    ecx,Y1_pointer
  1744.     mov    edx,Y2_pointer
  1745.     mov    eax,ARGB1_pointer
  1746.     mov    ebx,ARGB2_pointer
  1747.  
  1748. col_loop_ISSE16:
  1749.     prefetchnta [esi+ebp+32]
  1750.     prefetchnta [edi+ebp+32]
  1751.  
  1752.     movd    mm0,dword [esi+ebp]        ;[0       ] U (byte)
  1753.     pxor    mm7,mm7            ;[0      7] 
  1754.  
  1755.     movd    mm1,dword [edi+ebp]        ;[01     7] V (byte)
  1756.     punpcklbw mm0,mm7        ;[01     7] U (word)
  1757.  
  1758.     psubw    mm0,[MMX_80w]        ;[01     7] 
  1759.     punpcklbw mm1,mm7        ;[01     7] V (word)
  1760.  
  1761.     psubw    mm1,[MMX_80w]        ;[01      ] 
  1762.     movq    mm2,mm0            ;[012     ] 
  1763.  
  1764.     pmullw    mm2,[MMX_Ugrncoeff]    ;[012     ] 
  1765.     movq    mm3,mm1            ;[0123    ] 
  1766.  
  1767.     ;mm0: blue
  1768.     ;mm1: red
  1769.     ;mm2: green
  1770.  
  1771.     prefetchnta [ecx+ebp*2+32]
  1772.     prefetchnta [edx+ebp*2+32]
  1773.  
  1774.     movq    mm6,[ecx+ebp*2]        ;[0123  6 ] [1] Y
  1775.     ;<-->
  1776.  
  1777.     pmullw    mm3,[MMX_Vgrncoeff]    ;[0123    ] 
  1778.     movq    mm7,mm6            ;[012   67] [2] Y
  1779.  
  1780.     pmullw    mm0,[MMX_Ublucoeff]    ;[0123    ] 
  1781.     psrlw    mm7,8            ;[012   67] [2]
  1782.  
  1783.     pmullw    mm1,[MMX_Vredcoeff]    ;[0123    ] 
  1784.     ;<-->
  1785.  
  1786.     pand    mm6,[MMX_00FFw]        ;[012   67] [1]
  1787.     paddw    mm2,mm3            ;[012   6 ] [C]
  1788.  
  1789.     psubw    mm6,[MMX_10w]        ;[012   67] [1]
  1790.  
  1791.     pmullw    mm6,[MMX_Ycoeff]        ;[012   67] [1]
  1792.  
  1793.     psubw    mm7,[MMX_10w]        ;[012   67] [2]
  1794.     movq    mm4,mm6            ;[012 4 67] [1]
  1795.  
  1796.     pmullw    mm7,[MMX_Ycoeff]        ;[012   67] [2]
  1797.     movq    mm5,mm6            ;[012 4567] [1]
  1798.  
  1799.     paddw    mm6,mm0            ;[012 4 67] [1] mm6: <B3><B2><B1><B0>
  1800.     paddw    mm4,mm1            ;[012 4567] [1] mm4: <R3><R2><R1><R0>
  1801.  
  1802.     paddw    mm5,mm2            ;[012 4567] [1] mm5: <G3><G2><G1><G0>
  1803.     psraw    mm4,6            ;[012 4567] [1]
  1804.  
  1805.     movq    mm3,mm7            ;[01234567] [2]
  1806.     psraw    mm5,4            ;[01234567] [1]
  1807.  
  1808.     paddw    mm7,mm0            ;[01234567] [2] mm6: <B3><B2><B1><B0>
  1809.     psraw    mm6,6            ;[01234567] [1]
  1810.  
  1811.     paddsw    mm5,[MMX_clip]
  1812.     packuswb mm6,mm6        ;[01234567] [1] mm6: B3B2B1B0B3B2B1B0
  1813.  
  1814.     psubusw    mm5,[MMX_clip]
  1815.     packuswb mm4,mm4        ;[01234567] [1] mm4: R3R2R1R0R3R2R1R0
  1816.  
  1817.     pand    mm5,[MMX_grnmask]        ;[01234567] [1] mm7: <G3><G2><G1><G0>
  1818.     psrlq    mm6,2            ;[01234567] [1]
  1819.  
  1820.     punpcklbw mm6,mm4        ;[0123 567] [1] mm4: R3B3R2B2R1B1R0B0
  1821.  
  1822.     movq    mm4,[edx+ebp*2]        ;[01234567] [3] Y
  1823.     psrlw    mm6,1            ;[01234567] [1]
  1824.  
  1825.     pand    mm6,[MMX_rbmask]        ;[01234567] [1] mm6: <RB3><RB2><RB1><RB0>
  1826.  
  1827.     por    mm6,mm5            ;[01234 67] [1] mm6: P6P4P2P0
  1828.     movq    mm5,mm3            ;[01234567] [2]
  1829.  
  1830.     paddw    mm3,mm1            ;[01234567] [2] mm4: <R3><R2><R1><R0>
  1831.     paddw    mm5,mm2            ;[01234567] [2] mm5: <G3><G2><G1><G0>
  1832.  
  1833.     pand    mm4,[MMX_00FFw]        ;[01234567] [3]
  1834.     psraw    mm3,6            ;[01234567] [2]    
  1835.  
  1836.     psubw    mm4,[MMX_10w]        ;[01234567] [3]
  1837.     psraw    mm5,4            ;[01234567] [2]
  1838.  
  1839.     pmullw    mm4,[MMX_Ycoeff]        ;[01234567] [3]
  1840.     psraw    mm7,6            ;[01234567] [2]
  1841.  
  1842.     paddsw    mm5,[MMX_clip]
  1843.     packuswb mm3,mm3        ;[01234567] [2] mm4: R3R2R1R0R3R2R1R0
  1844.  
  1845.     psubusw    mm5,[MMX_clip]
  1846.     packuswb mm7,mm7        ;[01234567] [2] mm6: B3B2B1B0B3B2B1B0
  1847.  
  1848.     pand    mm5,[MMX_grnmask]        ;[012 4567] [2] mm7: <G3><G2><G1><G0>
  1849.     psrlq    mm7,2            ;[01234567] [2]
  1850.  
  1851.     punpcklbw mm7,mm3        ;[012 4567] [2] mm6: R3B3R2B2R1B1R0B0
  1852.  
  1853.     movq    mm3,[edx+ebp*2]        ;[01234567] [4] Y
  1854.     psrlw    mm7,1            ;[01234567] [2]
  1855.  
  1856.     pand    mm7,[MMX_rbmask]        ;[01234567] [2] mm6: <RB3><RB2><RB1><RB0>
  1857.     psrlw    mm3,8            ;[01234567] [4]
  1858.  
  1859.     por    mm7,mm5            ;[01234567] [2] mm7: P7P5P3P1
  1860.     movq    mm5,mm6            ;[01234567] [A]
  1861.  
  1862.     psubw    mm3,[MMX_10w]        ;[01234567] [4]
  1863.     punpcklwd mm6,mm7        ;[01234567] [A] mm4: P3P2P1P0
  1864.  
  1865.     pmullw    mm3,[MMX_Ycoeff]        ;[0123456 ] [4]
  1866.     punpckhwd mm5,mm7        ;[0123456 ] [A} mm5: P7P6P5P4
  1867.  
  1868.     movntq    [eax+ebp*4   ],mm6    ;[012345  ] [A]
  1869.     movq    mm6,mm4            ;[0123456 ] [3]
  1870.  
  1871.     movntq    [eax+ebp*4+ 8],mm5    ;[0123456 ] [A]
  1872.     paddw    mm6,mm0            ;[01234 6 ] [3] mm6: <B3><B2><B1><B0>
  1873.  
  1874.     movq    mm5,mm4            ;[0123456 ] [3]
  1875.     paddw    mm4,mm1            ;[0123456 ] [3] mm4: <R3><R2><R1><R0>
  1876.  
  1877.     paddw    mm5,mm2            ;[0123456 ] [3] mm5: <G3><G2><G1><G0>
  1878.     psraw    mm4,6            ;[0123456 ] [3]
  1879.  
  1880.     movq    mm7,mm3            ;[01234567] [4]
  1881.     psraw    mm5,4            ;[01234567] [3]
  1882.  
  1883.     paddw    mm7,mm0            ;[01234567] [4] mm6: <B3><B2><B1><B0>
  1884.     psraw    mm6,6            ;[01234567] [3]
  1885.  
  1886.     movq    mm0,mm3            ;[01234567] [4]
  1887.     packuswb mm4,mm4        ;[01234567] [3] mm4: R3R2R1R0R3R2R1R0
  1888.  
  1889.  
  1890.     packuswb mm6,mm6        ;[01 34567] [3] mm6: B3B2B1B0B3B2B1B0
  1891.     paddw    mm3,mm1            ;[01234567] [4] mm4: <R3><R2><R1><R0>
  1892.  
  1893.     psrlq    mm6,2
  1894.     paddw    mm0,mm2            ;[01 34567] [4] mm5: <G3><G2><G1><G0>
  1895.  
  1896.     paddsw    mm5,[MMX_clip]
  1897.     punpcklbw mm6,mm4        ;[01 3 567] [3] mm6: B3B3B2B2B1B1B0B0
  1898.  
  1899.     psubusw    mm5,[MMX_clip]
  1900.     psrlw    mm6,1            ;[01 3 567] [3]
  1901.  
  1902.     pand    mm6,[MMX_rbmask]        ;[01 3 567] [3] mm6: <B3><B2><B1><B0>
  1903.     psraw    mm3,6            ;[01 3 567] [4]
  1904.  
  1905.     pand    mm5,[MMX_grnmask]        ;[01 3 567] [3] mm7: <G3><G2><G1><G0>
  1906.     psraw    mm0,4            ;[01 3 567] [4]
  1907.  
  1908.     por    mm6,mm5            ;[01 3  67] [3] mm4: P6P4P2P0    
  1909.     psraw    mm7,6            ;[01 3  67] [4]
  1910.  
  1911.     paddsw    mm0,[MMX_clip]
  1912.     packuswb mm3,mm3        ;[01 3  67] [4] mm4: R3R2R1R0R3R2R1R0
  1913.  
  1914.     psubusw    mm0,[MMX_clip]
  1915.     packuswb mm7,mm7        ;[01 3  67] mm6: B3B2B1B0B3B2B1B0
  1916.  
  1917.     pand    mm0,[MMX_grnmask]        ;[01    67] mm7: <G3><G2><G1><G0>
  1918.     psrlq    mm7,2
  1919.  
  1920.     punpcklbw mm7,mm3        ;[01    67] mm6: R3B3R2B2R1B1R0B0
  1921.     movq    mm1,mm6
  1922.  
  1923.     psrlw    mm7,1
  1924.     add    ebp,4
  1925.  
  1926.     pand    mm7,[MMX_rbmask]        ;[01    67] mm6: <B3><B2><B1><B0>
  1927.  
  1928.     por    mm0,mm7            ;[01    67] mm0: P7P5P3P1
  1929.  
  1930.     punpcklwd mm6,mm0        ;[01    6 ] mm4: P3P2P1P0
  1931.  
  1932.     punpckhwd mm1,mm0        ;[ 1    6 ] mm5: P7P6P5P4
  1933.     movntq    [ebx+ebp*4-16],mm6
  1934.  
  1935.     movntq    [ebx+ebp*4- 8],mm1
  1936.     jnz    col_loop_ISSE16
  1937.  
  1938.     pop    ebp
  1939.     pop    edi
  1940.     pop    esi
  1941.     pop    ebx
  1942.     ret
  1943.  
  1944. ;==========================================================================
  1945. ;
  1946. ;    SSE2 (Pentium 4) implementation
  1947. ;
  1948. ;==========================================================================
  1949.  
  1950. _asm_YUVtoRGB32_row_SSE2:
  1951.     push    ebx
  1952.     push    esi
  1953.     push    edi
  1954.     push    ebp
  1955.  
  1956.     mov    eax,count
  1957.     mov    ebp,eax
  1958.     mov    ebx,eax
  1959.     shl    ebx,3
  1960.     add    eax,eax
  1961.     add    ARGB1_pointer,ebx
  1962.     add    ARGB2_pointer,ebx
  1963.     add    Y1_pointer,eax
  1964.     add    Y2_pointer,eax
  1965.     add    U_pointer,ebp
  1966.     add    V_pointer,ebp
  1967.     neg    ebp
  1968.  
  1969.     mov    esi,U_pointer
  1970.     mov    edi,V_pointer
  1971.     mov    ecx,Y1_pointer
  1972.     mov    edx,Y2_pointer
  1973.     mov    eax,ARGB1_pointer
  1974.     mov    ebx,ARGB2_pointer
  1975.  
  1976. col_loop_SSE2:
  1977.     prefetchnta [esi+ebp+32]
  1978.     prefetchnta [edi+ebp+32]
  1979.     prefetchnta [ecx+ebp*2+32]
  1980.     prefetchnta [edx+ebp*2+32]
  1981.  
  1982.     movq        xmm0,qword [esi+ebp];xmm0 = U7|U6|U5|U4|U3|U2|U1|U0
  1983.     pxor        xmm7,xmm7
  1984.  
  1985.     movq        xmm1,qword [edi+ebp];xmm1 = V7|V6|V5|V4|V3|V2|V1|V0
  1986.  
  1987.     punpcklbw    xmm0,xmm7
  1988.     punpcklbw    xmm1,xmm7
  1989.     
  1990.     psubw        xmm0, [SSE2_80w]        ;xmm0 = U3|U2|U1|U0
  1991.     psubw        xmm1, [SSE2_80w]        ;xmm1 = V3|V2|V1|V0
  1992.     
  1993.     movdqa        xmm2,xmm0
  1994.     pmullw        xmm0, [SSE2_Ugrncoeff]
  1995.     pmullw        xmm2, [SSE2_Ublucoeff]
  1996.     
  1997.     movdqa        xmm3,xmm1
  1998.     pmullw        xmm1, [SSE2_Vredcoeff]
  1999.     pmullw        xmm3, [SSE2_Vgrncoeff]
  2000.     
  2001.     paddw        xmm0,xmm1        ;xmm0 = cG7|cG6|cG5|cG4|cG3|cG2|cG1|cG0
  2002.     
  2003.     movdqu        xmm3,[ecx+ebp*2]    ;xmm4 = YF|YE|YD|YC|YB|YA|Y9|Y8|Y7|Y6|Y5|Y4|Y3|Y2|Y1|Y0
  2004.     movq        xmm4,xmm4        ;xmm5 = YF|YE|YD|YC|YB|YA|Y9|Y8|Y7|Y6|Y5|Y4|Y3|Y2|Y1|Y0
  2005.     pand        xmm3, [SSE2_Ylow]        ;xmm4 = YE|YC|YA|Y8|Y6|Y4|Y2|Y0
  2006.     psrlw        xmm4,8            ;xmm5 = YF|YD|YB|Y9|Y7|Y5|Y3|Y1
  2007.     
  2008.     psubw        xmm3, [SSE2_Ybias]
  2009.     pmullw        xmm3, [SSE2_Ycoeff]
  2010.     psubw        xmm4, [SSE2_Ybias]
  2011.     pmullw        xmm4, [SSE2_Ycoeff]
  2012.     
  2013.     ;register layout at this point:
  2014.     ;xmm0:    chroma green
  2015.     ;xmm1:    chroma red
  2016.     ;xmm2:    chroma blue
  2017.     ;xmm3:    Y low
  2018.     ;xmm4:    Y high
  2019.  
  2020.     movdqa        xmm5,xmm4
  2021.     movdqa        xmm6,xmm4
  2022.     paddw        xmm4,xmm0        ;xmm4 = green high
  2023.     paddw        xmm5,xmm1        ;xmm5 = red high
  2024.     paddw        xmm6,xmm2        ;xmm6 = blue high
  2025.     paddw        xmm0,xmm3        ;xmm0 = green low
  2026.     paddw        xmm1,xmm3        ;xmm1 = red low
  2027.     paddw        xmm2,xmm3        ;xmm2 = blue low
  2028.     
  2029.     psraw        xmm0,6
  2030.     psraw        xmm1,6
  2031.     psraw        xmm2,6
  2032.     psraw        xmm4,6
  2033.     psraw        xmm5,6
  2034.     psraw        xmm6,6
  2035.     
  2036.     packuswb    xmm0,xmm0
  2037.     packuswb    xmm1,xmm1
  2038.     packuswb    xmm2,xmm2
  2039.     packuswb    xmm4,xmm4
  2040.     packuswb    xmm5,xmm5
  2041.     packuswb    xmm6,xmm6
  2042.         
  2043.     punpcklbw    xmm0,xmm0        ;xmm3 = GE|GE|GC|GC|GA|GA|G8|G8|G6|G6|G4|G4|G2|G2|G0|G0
  2044.     punpcklbw    xmm4,xmm4        ;xmm4 = GF|GF|GD|GD|GB|GB|G9|G9|G7|G7|G5|G5|G3|G3|G1|G1
  2045.     punpcklbw    xmm2,xmm1        ;xmm2 = RE|BE|RC|BC|RA|BA|R8|B8|R6|B6|R4|B4|R2|B2|R0|B0
  2046.     punpcklbw    xmm6,xmm5        ;xmm6 = RF|BF|RD|BD|RB|BB|R9|B9|R7|B7|R5|B5|R3|B3|B1|B1
  2047.  
  2048.     movdqa        xmm1,xmm2
  2049.     movdqa        xmm5,xmm6
  2050.     
  2051.     punpcklbw    xmm1,xmm0        ;xmm1 = p6|p4|p2|p0
  2052.     punpckhbw    xmm2,xmm0        ;xmm2 = pE|pC|pA|p8
  2053.     punpcklbw    xmm5,xmm4        ;xmm5 = p7|p5|p3|p1
  2054.     punpckhbw    xmm6,xmm4        ;xmm6 = pF|pD|pB|p9
  2055.     
  2056.     movdqa        xmm0,xmm1
  2057.     punpckldq    xmm0,xmm5        ;xmm0 = p3|p2|p1|p0
  2058.     punpckhdq    xmm1,xmm5        ;xmm1 = p7|p6|p5|p4
  2059.     movdqa        xmm3,xmm2
  2060.     punpckldq    xmm2,xmm6        ;xmm2 = pB|pA|p9|p8
  2061.     punpckhdq    xmm3,xmm6        ;xmm3 = pF|pE|pD|pC
  2062.  
  2063.     movdqu    [ebx+ebp*8   ],xmm0
  2064.     movdqu    [ebx+ebp*8+ 8],xmm1
  2065.  
  2066.     movdqu    [ebx+ebp*8+16],xmm2
  2067.     movdqu    [ebx+ebp*8+24],xmm3
  2068.  
  2069.     add    ebp,4
  2070.  
  2071.     jnz    col_loop_SSE2
  2072.  
  2073.     pop    ebp
  2074.     pop    edi
  2075.     pop    esi
  2076.     pop    ebx
  2077.     ret
  2078.  
  2079. _asm_YUVtoRGB24_SSE2:
  2080.     push    ebx
  2081.     push    esi
  2082.     push    edi
  2083.     push    ebp
  2084.  
  2085.     mov    eax,count
  2086.     mov    ebp,eax
  2087.     add    eax,eax
  2088.     mov    esi,U_pointer
  2089.     mov    edi,V_pointer
  2090.     add    esi,ebp
  2091.     add    edi,ebp
  2092.     mov    ecx,Y1_pointer
  2093.     mov    edx,Y2_pointer
  2094.     add    ecx,eax
  2095.     add    edx,eax
  2096.     mov    eax,ARGB1_pointer
  2097.     mov    ebx,ARGB2_pointer
  2098.     neg    ebp
  2099.     
  2100.     ;store esp in the SEH chain and set esp=constant_struct
  2101.     push    0
  2102.     push    dword [fs:0]
  2103.     mov        dword [fs:0],esp
  2104.     mov        esp, context_pointer
  2105.     
  2106.     ;---- we have no stack at this point!
  2107.     
  2108.     mov    [esp+offs_width], ebp
  2109.     
  2110. row_loop_SSE2_24:
  2111.     mov    ebp, [esp+offs_width]
  2112.  
  2113. col_loop_SSE2_24:
  2114.     prefetchnta    [esi+ebp+128]
  2115.     prefetchnta    [edi+ebp+128]
  2116.     prefetchnta    [ecx+ebp*2+128]
  2117.     prefetchnta    [edx+ebp*2+128]
  2118.  
  2119.     ;U1|U1|U0|U0|U0|U0|U0|U0
  2120.     ;U2|U2|U2|U2|U1|U1|U1|U1
  2121.     ;U3|U3|U3|U3|U3|U3|U2|U2
  2122.  
  2123.     movd        xmm0,dword [esi+ebp];xmm0 = U3|U2|U1|U0
  2124.     pxor        xmm7,xmm7
  2125.     punpcklbw    xmm0,xmm7        ;xmm0 = U3|U2|U1|U0
  2126.     psubw        xmm0,[esp+offs_SSE2_80w]
  2127.     punpcklwd    xmm0,xmm0        ;xmm0 = U3|U3|U2|U2|U1|U1|U0|U0
  2128.     pshufd        xmm2,xmm0,11111110b    ;xmm2 = U3|U3|U3|U3|U3|U3|U2|U2
  2129.     pshufd        xmm1,xmm0,10100101b    ;xmm1 = U2|U2|U2|U2|U1|U1|U1|U1
  2130.     pshufd        xmm0,xmm0,01000000b    ;xmm0 = U1|U1|U0|U0|U0|U0|U0|U0
  2131.         
  2132.     pmullw        xmm0,[esp+offs_SSE2_Ucoeff0]
  2133.     pmullw        xmm1,[esp+offs_SSE2_Ucoeff1]
  2134.     pmullw        xmm2,[esp+offs_SSE2_Ucoeff2]
  2135.  
  2136.     movd        xmm3,dword [edi+ebp];xmm3 = V3|V2|V1|V0
  2137.     punpcklbw    xmm3,xmm7        ;xmm3 = V3|V2|V1|V0
  2138.     psubw        xmm3,[esp+offs_SSE2_80w]
  2139.     punpcklwd    xmm3,xmm3
  2140.     pshufd        xmm5,xmm3,11111110b    ;xmm5 = V7|V6|V7|V6|V7|V6|V5|V4
  2141.     pshufd        xmm4,xmm3,10100101b    ;xmm4 = V5|V4|V5|V4|V3|V2|V3|V2
  2142.     pshufd        xmm3,xmm3,01000000b    ;xmm3 = V3|V2|V1|V0|V1|V0|V1|V0
  2143.         
  2144.     pmullw        xmm3,[esp+offs_SSE2_Vcoeff0]
  2145.     pmullw        xmm4,[esp+offs_SSE2_Vcoeff1]
  2146.     pmullw        xmm5,[esp+offs_SSE2_Vcoeff2]
  2147.     
  2148.     paddw        xmm0,xmm3
  2149.     paddw        xmm1,xmm4
  2150.     paddw        xmm2,xmm5
  2151.     
  2152.     movq        xmm3,qword [ecx+ebp*2];xmm3 = Y7 | Y6 | Y5 | Y4 | Y3 | Y2 | Y1 | Y0
  2153.     punpcklbw    xmm3,xmm7
  2154.     psubw        xmm3,[esp+offs_SSE2_Ybias]
  2155.     pmullw        xmm3,[esp+offs_SSE2_Ycoeff]
  2156.     pshufd        xmm5,xmm3,11111110b    ;xmm5 = Y7|Y6|Y7|Y6|Y7|Y6|Y5|Y4
  2157.     pshufd        xmm4,xmm3,10100101b    ;xmm4 = Y5|Y4|Y5|Y4|Y3|Y2|Y3|Y2
  2158.     pshufd        xmm3,xmm3,01000000b    ;xmm3 = Y3|Y2|Y1|Y0|Y1|Y0|Y1|Y0
  2159.     pshufhw        xmm5,xmm5,11111110b    ;xmm5 = Y7|Y7|Y7|Y6|Y7|Y6|Y5|Y4
  2160.     pshuflw        xmm5,xmm5,10100101b    ;xmm5 = Y7|Y7|Y7|Y6|Y6|Y6|Y5|Y5
  2161.     pshufhw        xmm4,xmm4,01000000b    ;xmm4 = Y5|Y4|Y4|Y4|Y3|Y2|Y3|Y2
  2162.     pshuflw        xmm4,xmm4,11111110b    ;xmm4 = Y5|Y4|Y4|Y4|Y3|Y3|Y3|Y2
  2163.     pshufhw        xmm3,xmm3,10100101b    ;xmm3 = Y2|Y2|Y1|Y1|Y1|Y0|Y1|Y0
  2164.     pshuflw        xmm3,xmm3,01000000b    ;xmm3 = Y2|Y2|Y1|Y1|Y1|Y0|Y0|Y0
  2165.     
  2166.     paddw        xmm3,xmm0
  2167.     paddw        xmm4,xmm1
  2168.     paddw        xmm5,xmm2
  2169.     
  2170.     psraw        xmm3,6
  2171.     psraw        xmm4,6
  2172.     psraw        xmm5,6
  2173.     
  2174.     packuswb    xmm3,xmm3
  2175.     packuswb    xmm4,xmm4
  2176.     packuswb    xmm5,xmm5
  2177.  
  2178.     movdq2q        mm0,xmm3
  2179.     movdq2q        mm1,xmm4
  2180.     movdq2q        mm2,xmm5
  2181.     
  2182.     movq        xmm3,qword [edx+ebp*2]    ;xmm3 = Y7 | Y6 | Y5 | Y4 | Y3 | Y2 | Y1 | Y0
  2183.     punpcklbw    xmm3,xmm7
  2184.     psubw        xmm3,[esp+offs_SSE2_Ybias]
  2185.     pmullw        xmm3,[esp+offs_SSE2_Ycoeff]
  2186.     pshufd        xmm5,xmm3,11111110b    ;xmm5 = Y7|Y6|Y7|Y6|Y7|Y6|Y5|Y4
  2187.     pshufd        xmm4,xmm3,10100101b    ;xmm4 = Y5|Y4|Y5|Y4|Y3|Y2|Y3|Y2
  2188.     pshufd        xmm3,xmm3,01000000b    ;xmm3 = Y3|Y2|Y1|Y0|Y1|Y0|Y1|Y0
  2189.     pshufhw        xmm5,xmm5,11111110b    ;xmm5 = Y7|Y7|Y7|Y6|Y7|Y6|Y5|Y4
  2190.     pshuflw        xmm5,xmm5,10100101b    ;xmm5 = Y7|Y7|Y7|Y6|Y6|Y6|Y5|Y5
  2191.     pshufhw        xmm4,xmm4,01000000b    ;xmm4 = Y5|Y4|Y4|Y4|Y3|Y2|Y3|Y2
  2192.     pshuflw        xmm4,xmm4,11111110b    ;xmm4 = Y5|Y4|Y4|Y4|Y3|Y3|Y3|Y2
  2193.     pshufhw        xmm3,xmm3,10100101b    ;xmm3 = Y2|Y2|Y1|Y1|Y1|Y0|Y1|Y0
  2194.     pshuflw        xmm3,xmm3,01000000b    ;xmm3 = Y2|Y2|Y1|Y1|Y1|Y0|Y0|Y0
  2195.     
  2196.     paddw        xmm3,xmm0
  2197.     paddw        xmm4,xmm1
  2198.     paddw        xmm5,xmm2
  2199.     
  2200.     psraw        xmm3,6
  2201.     psraw        xmm4,6
  2202.     psraw        xmm5,6
  2203.     
  2204.     packuswb    xmm3,xmm3
  2205.     packuswb    xmm4,xmm4
  2206.     packuswb    xmm5,xmm5
  2207.  
  2208.     movdq2q        mm3,xmm3
  2209.     movdq2q        mm4,xmm4
  2210.     movdq2q        mm5,xmm5
  2211.     
  2212.     movntq        [eax],mm0
  2213.     movntq        [eax+8],mm1
  2214.     movntq        [eax+16],mm2
  2215.     movntq        [ebx],mm3
  2216.     movntq        [ebx+8],mm4
  2217.     movntq        [ebx+16],mm5    
  2218.     add        eax,24
  2219.     add        ebx,24
  2220.  
  2221.     ;done
  2222.  
  2223.     add    ebp,4
  2224.     jnz    col_loop_SSE2_24
  2225.  
  2226.     mov    ebp, [esp+offs_rgb_pitch]    
  2227.     add    eax, ebp
  2228.     add    ebx, ebp
  2229.     mov    ebp, [esp+offs_y_pitch]
  2230.     add    ecx, ebp
  2231.     add    edx, ebp
  2232.     mov    ebp, [esp+offs_uv_pitch]
  2233.     add    esi, ebp
  2234.     add    edi, ebp
  2235.     
  2236.     dec    dword [esp+offs_height]
  2237.     jnz    row_loop_SSE2_24
  2238.  
  2239.     ;restore esp from SEH chain
  2240.     mov    esp, dword [fs:0]
  2241.     pop    dword [fs:0]
  2242.     pop    eax
  2243.  
  2244.     pop    ebp
  2245.     pop    edi
  2246.     pop    esi
  2247.     pop    ebx
  2248.     ret
  2249.  
  2250. _asm_YUVtoRGB16_row_SSE2:
  2251.     push    ebx
  2252.     push    esi
  2253.     push    edi
  2254.     push    ebp
  2255.  
  2256.     mov    eax,count
  2257.     mov    ebp,eax
  2258.     mov    ebx,eax
  2259.     shl    ebx,2
  2260.     add    eax,eax
  2261.     add    ARGB1_pointer,ebx
  2262.     add    ARGB2_pointer,ebx
  2263.     add    Y1_pointer,eax
  2264.     add    Y2_pointer,eax
  2265.     add    U_pointer,ebp
  2266.     add    V_pointer,ebp
  2267.     neg    ebp
  2268.  
  2269.     mov    esi,U_pointer
  2270.     mov    edi,V_pointer
  2271.     mov    ecx,Y1_pointer
  2272.     mov    edx,Y2_pointer
  2273.     mov    eax,ARGB1_pointer
  2274.     mov    ebx,ARGB2_pointer
  2275.  
  2276. col_loop_SSE2_16:
  2277.     prefetchnta [esi+ebp+32]
  2278.     prefetchnta [edi+ebp+32]
  2279.  
  2280.     movd    mm0,dword [esi+ebp]    ;[0       ] U (byte)
  2281.     pxor    mm7,mm7            ;[0      7] 
  2282.  
  2283.     movd    mm1,dword [edi+ebp]    ;[01     7] V (byte)
  2284.     punpcklbw mm0,mm7        ;[01     7] U (word)
  2285.  
  2286.     psubw    mm0,[MMX_80w]        ;[01     7] 
  2287.     punpcklbw mm1,mm7        ;[01     7] V (word)
  2288.  
  2289.     psubw    mm1,[MMX_80w]        ;[01      ] 
  2290.     movq    mm2,mm0            ;[012     ] 
  2291.  
  2292.     pmullw    mm2,[MMX_Ugrncoeff]    ;[012     ] 
  2293.     movq    mm3,mm1            ;[0123    ] 
  2294.  
  2295.     ;mm0: blue
  2296.     ;mm1: red
  2297.     ;mm2: green
  2298.  
  2299.     prefetchnta [ecx+ebp*2+32]
  2300.     prefetchnta [edx+ebp*2+32]
  2301.  
  2302.     movq    mm6,[ecx+ebp*2]        ;[0123  6 ] [1] Y
  2303.     ;<-->
  2304.  
  2305.     pmullw    mm3,[MMX_Vgrncoeff]    ;[0123    ] 
  2306.     movq    mm7,mm6            ;[012   67] [2] Y
  2307.  
  2308.     pmullw    mm0,[MMX_Ublucoeff]    ;[0123    ] 
  2309.     psrlw    mm7,8            ;[012   67] [2]
  2310.  
  2311.     pmullw    mm1,[MMX_Vredcoeff]    ;[0123    ] 
  2312.     ;<-->
  2313.  
  2314.     pand    mm6,[MMX_00FFw]        ;[012   67] [1]
  2315.     paddw    mm2,mm3            ;[012   6 ] [C]
  2316.  
  2317.     psubw    mm6,[MMX_10w]        ;[012   67] [1]
  2318.  
  2319.     pmullw    mm6,[MMX_Ycoeff]        ;[012   67] [1]
  2320.  
  2321.     psubw    mm7,[MMX_10w]        ;[012   67] [2]
  2322.     movq    mm4,mm6            ;[012 4 67] [1]
  2323.  
  2324.     pmullw    mm7,[MMX_Ycoeff]        ;[012   67] [2]
  2325.     movq    mm5,mm6            ;[012 4567] [1]
  2326.  
  2327.     paddw    mm6,mm0            ;[012 4 67] [1] mm6: <B3><B2><B1><B0>
  2328.     paddw    mm4,mm1            ;[012 4567] [1] mm4: <R3><R2><R1><R0>
  2329.  
  2330.     paddw    mm5,mm2            ;[012 4567] [1] mm5: <G3><G2><G1><G0>
  2331.     psraw    mm4,6            ;[012 4567] [1]
  2332.  
  2333.     movq    mm3,mm7            ;[01234567] [2]
  2334.     psraw    mm5,4            ;[01234567] [1]
  2335.  
  2336.     paddw    mm7,mm0            ;[01234567] [2] mm6: <B3><B2><B1><B0>
  2337.     psraw    mm6,6            ;[01234567] [1]
  2338.  
  2339.     paddsw    mm5,[MMX_clip]
  2340.     packuswb mm6,mm6        ;[01234567] [1] mm6: B3B2B1B0B3B2B1B0
  2341.  
  2342.     psubusw    mm5,[MMX_clip]
  2343.     packuswb mm4,mm4        ;[01234567] [1] mm4: R3R2R1R0R3R2R1R0
  2344.  
  2345.     pand    mm5,[MMX_grnmask]        ;[01234567] [1] mm7: <G3><G2><G1><G0>
  2346.     psrlq    mm6,2            ;[01234567] [1]
  2347.  
  2348.     punpcklbw mm6,mm4        ;[0123 567] [1] mm4: R3B3R2B2R1B1R0B0
  2349.  
  2350.     movq    mm4,[edx+ebp*2]        ;[01234567] [3] Y
  2351.     psrlw    mm6,1            ;[01234567] [1]
  2352.  
  2353.     pand    mm6,[MMX_rbmask]        ;[01234567] [1] mm6: <RB3><RB2><RB1><RB0>
  2354.  
  2355.     por    mm6,mm5            ;[01234 67] [1] mm6: P6P4P2P0
  2356.     movq    mm5,mm3            ;[01234567] [2]
  2357.  
  2358.     paddw    mm3,mm1            ;[01234567] [2] mm4: <R3><R2><R1><R0>
  2359.     paddw    mm5,mm2            ;[01234567] [2] mm5: <G3><G2><G1><G0>
  2360.  
  2361.     pand    mm4,[MMX_00FFw]        ;[01234567] [3]
  2362.     psraw    mm3,6            ;[01234567] [2]    
  2363.  
  2364.     psubw    mm4,[MMX_10w]        ;[01234567] [3]
  2365.     psraw    mm5,4            ;[01234567] [2]
  2366.  
  2367.     pmullw    mm4,[MMX_Ycoeff]        ;[01234567] [3]
  2368.     psraw    mm7,6            ;[01234567] [2]
  2369.  
  2370.     paddsw    mm5,[MMX_clip]
  2371.     packuswb mm3,mm3        ;[01234567] [2] mm4: R3R2R1R0R3R2R1R0
  2372.  
  2373.     psubusw    mm5,[MMX_clip]
  2374.     packuswb mm7,mm7        ;[01234567] [2] mm6: B3B2B1B0B3B2B1B0
  2375.  
  2376.     pand    mm5,[MMX_grnmask]        ;[012 4567] [2] mm7: <G3><G2><G1><G0>
  2377.     psrlq    mm7,2            ;[01234567] [2]
  2378.  
  2379.     punpcklbw mm7,mm3        ;[012 4567] [2] mm6: R3B3R2B2R1B1R0B0
  2380.  
  2381.     movq    mm3,[edx+ebp*2]        ;[01234567] [4] Y
  2382.     psrlw    mm7,1            ;[01234567] [2]
  2383.  
  2384.     pand    mm7,[MMX_rbmask]        ;[01234567] [2] mm6: <RB3><RB2><RB1><RB0>
  2385.     psrlw    mm3,8            ;[01234567] [4]
  2386.  
  2387.     por    mm7,mm5            ;[01234567] [2] mm7: P7P5P3P1
  2388.     movq    mm5,mm6            ;[01234567] [A]
  2389.  
  2390.     psubw    mm3,[MMX_10w]        ;[01234567] [4]
  2391.     punpcklwd mm6,mm7        ;[01234567] [A] mm4: P3P2P1P0
  2392.  
  2393.     pmullw    mm3,[MMX_Ycoeff]        ;[0123456 ] [4]
  2394.     punpckhwd mm5,mm7        ;[0123456 ] [A} mm5: P7P6P5P4
  2395.  
  2396.     movntq    [eax+ebp*4   ],mm6    ;[012345  ] [A]
  2397.     movq    mm6,mm4            ;[0123456 ] [3]
  2398.  
  2399.     movntq    [eax+ebp*4+ 8],mm5    ;[0123456 ] [A]
  2400.     paddw    mm6,mm0            ;[01234 6 ] [3] mm6: <B3><B2><B1><B0>
  2401.  
  2402.     movq    mm5,mm4            ;[0123456 ] [3]
  2403.     paddw    mm4,mm1            ;[0123456 ] [3] mm4: <R3><R2><R1><R0>
  2404.  
  2405.     paddw    mm5,mm2            ;[0123456 ] [3] mm5: <G3><G2><G1><G0>
  2406.     psraw    mm4,6            ;[0123456 ] [3]
  2407.  
  2408.     movq    mm7,mm3            ;[01234567] [4]
  2409.     psraw    mm5,4            ;[01234567] [3]
  2410.  
  2411.     paddw    mm7,mm0            ;[01234567] [4] mm6: <B3><B2><B1><B0>
  2412.     psraw    mm6,6            ;[01234567] [3]
  2413.  
  2414.     movq    mm0,mm3            ;[01234567] [4]
  2415.     packuswb mm4,mm4        ;[01234567] [3] mm4: R3R2R1R0R3R2R1R0
  2416.  
  2417.  
  2418.     packuswb mm6,mm6        ;[01 34567] [3] mm6: B3B2B1B0B3B2B1B0
  2419.     paddw    mm3,mm1            ;[01234567] [4] mm4: <R3><R2><R1><R0>
  2420.  
  2421.     psrlq    mm6,2
  2422.     paddw    mm0,mm2            ;[01 34567] [4] mm5: <G3><G2><G1><G0>
  2423.  
  2424.     paddsw    mm5,[MMX_clip]
  2425.     punpcklbw mm6,mm4        ;[01 3 567] [3] mm6: B3B3B2B2B1B1B0B0
  2426.  
  2427.     psubusw    mm5,[MMX_clip]
  2428.     psrlw    mm6,1            ;[01 3 567] [3]
  2429.  
  2430.     pand    mm6,[MMX_rbmask]        ;[01 3 567] [3] mm6: <B3><B2><B1><B0>
  2431.     psraw    mm3,6            ;[01 3 567] [4]
  2432.  
  2433.     pand    mm5,[MMX_grnmask]        ;[01 3 567] [3] mm7: <G3><G2><G1><G0>
  2434.     psraw    mm0,4            ;[01 3 567] [4]
  2435.  
  2436.     por    mm6,mm5            ;[01 3  67] [3] mm4: P6P4P2P0    
  2437.     psraw    mm7,6            ;[01 3  67] [4]
  2438.  
  2439.     paddsw    mm0,[MMX_clip]
  2440.     packuswb mm3,mm3        ;[01 3  67] [4] mm4: R3R2R1R0R3R2R1R0
  2441.  
  2442.     psubusw    mm0,[MMX_clip]
  2443.     packuswb mm7,mm7        ;[01 3  67] mm6: B3B2B1B0B3B2B1B0
  2444.  
  2445.     pand    mm0,[MMX_grnmask]        ;[01    67] mm7: <G3><G2><G1><G0>
  2446.     psrlq    mm7,2
  2447.  
  2448.     punpcklbw mm7,mm3        ;[01    67] mm6: R3B3R2B2R1B1R0B0
  2449.     movq    mm1,mm6
  2450.  
  2451.     psrlw    mm7,1
  2452.     add    ebp,4
  2453.  
  2454.     pand    mm7,[MMX_rbmask]        ;[01    67] mm6: <B3><B2><B1><B0>
  2455.  
  2456.     por    mm0,mm7            ;[01    67] mm0: P7P5P3P1
  2457.  
  2458.     punpcklwd mm6,mm0        ;[01    6 ] mm4: P3P2P1P0
  2459.  
  2460.     punpckhwd mm1,mm0        ;[ 1    6 ] mm5: P7P6P5P4
  2461.     movntq    [ebx+ebp*4-16],mm6
  2462.  
  2463.     movntq    [ebx+ebp*4- 8],mm1
  2464.     jnz    col_loop_SSE2_16
  2465.  
  2466.     pop    ebp
  2467.     pop    edi
  2468.     pop    esi
  2469.     pop    ebx
  2470.     ret
  2471.  
  2472.     end
  2473.