p2pyuv.asm
上传用户:zhongxx05
上传日期:2007-06-06
资源大小:33641k
文件大小:19k
源码类别:

Symbian

开发平台:

C/C++

  1. ;
  2. ; ***** BEGIN LICENSE BLOCK ***** 
  3. ; Version: RCSL 1.0/RPSL 1.0 
  4. ;  
  5. ; Portions Copyright (c) 1995-2002 RealNetworks, Inc. All Rights Reserved. 
  6. ;      
  7. ; The contents of this file, and the files included with this file, are 
  8. ; subject to the current version of the RealNetworks Public Source License 
  9. ; Version 1.0 (the "RPSL") available at 
  10. ; http://www.helixcommunity.org/content/rpsl unless you have licensed 
  11. ; the file under the RealNetworks Community Source License Version 1.0 
  12. ; (the "RCSL") available at http://www.helixcommunity.org/content/rcsl, 
  13. ; in which case the RCSL will apply. You may also obtain the license terms 
  14. ; directly from RealNetworks.  You may not use this file except in 
  15. ; compliance with the RPSL or, if you have a valid RCSL with RealNetworks 
  16. ; applicable to this file, the RCSL.  Please see the applicable RPSL or 
  17. ; RCSL for the rights, obligations and limitations governing use of the 
  18. ; contents of the file.  
  19. ;  
  20. ; This file is part of the Helix DNA Technology. RealNetworks is the 
  21. ; developer of the Original Code and owns the copyrights in the portions 
  22. ; it created. 
  23. ;  
  24. ; This file, and the files included with this file, is distributed and made 
  25. ; available on an 'AS IS' basis, WITHOUT WARRANTY OF ANY KIND, EITHER 
  26. ; EXPRESS OR IMPLIED, AND REALNETWORKS HEREBY DISCLAIMS ALL SUCH WARRANTIES, 
  27. ; INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY, FITNESS 
  28. ; FOR A PARTICULAR PURPOSE, QUIET ENJOYMENT OR NON-INFRINGEMENT. 
  29. ; Technology Compatibility Kit Test Suite(s) Location: 
  30. ;    http://www.helixcommunity.org/content/tck 
  31. ; Contributor(s): 
  32. ;  
  33. ; ***** END LICENSE BLOCK *****
  34. ;
  35. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  36. ;;
  37. ;;  Packed YUV To PlanarYUV MMX converters.
  38. ;;
  39. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  40. ;;; YUY2ToPlanarYUV_MMX
  41. %ifdef   COFF
  42.         %define YUY2ToPlanarYUV_MMX _YUY2ToPlanarYUV_MMX
  43.         %define UYVYToPlanarYUV_MMX _UYVYToPlanarYUV_MMX
  44. %elifdef WIN32
  45.         %define YUY2ToPlanarYUV_MMX _YUY2ToPlanarYUV_MMX
  46.         %define UYVYToPlanarYUV_MMX _UYVYToPlanarYUV_MMX
  47. %elifdef ELF
  48.         %define YUY2ToPlanarYUV_MMX YUY2ToPlanarYUV_MMX
  49.         %define UYVYToPlanarYUV_MMX UYVYToPlanarYUV_MMX
  50. %elifdef AOUTB
  51.         %define YUY2ToPlanarYUV_MMX YUY2ToPlanarYUV_MMX
  52.         %define UYVYToPlanarYUV_MMX UYVYToPlanarYUV_MMX
  53. %else
  54.         %error linking format currently not supported by alphbablend.asm
  55. %endif
  56.         ;; Export the functions implemented here.
  57.         global YUY2ToPlanarYUV_MMX
  58.         global UYVYToPlanarYUV_MMX
  59. ;========================= DATA SEGMENT ============================
  60. section .data
  61. align 8        
  62. MaskChroma
  63.     dd  0xFF00FF00, 0xFF00FF00
  64.         
  65. MaskLuma
  66.     dd  0x00FF00FF, 0x00FF00FF
  67.         
  68. ;============================= CODE SEGMENT =======================                        
  69. section .text
  70. ;;
  71. ;; This is our stack params definition. It is used for both
  72. ;; YUY2 and UYVY routines as they both take the same parms.
  73. ;;                                        
  74. %assign numtemps 4
  75. %define var(a) [esp+a]       
  76.                 
  77. struc parms
  78.         ;Temps on stack
  79.         .tmp1       resd 1  ;General DWORD temp.
  80.         .tmp2       resd 1  ;General DWORD temp.
  81.         .tmp3       resd 1  ;General DWORD temp.
  82.         .tmp4       resd 1  ;General DWORD temp.
  83.         
  84.         ; Space for reg pushes and return address.
  85.         .registers  resd 6  ;pushed registers
  86.         .return     resd 1  ;return address
  87.         ; input params
  88.         .d1:        resd 1  ;unsigned char* d1,      
  89.         .d2:        resd 1  ;unsigned char* d2,      
  90.         .du:        resd 1  ;unsigned char* du,      
  91.         .dv:        resd 1  ;unsigned char* dv,      
  92.         .dyPitch:   resd 1  ;INT32          dyPitch, 
  93.         .duPitch:   resd 1  ;INT32          duPitch, 
  94.         .dvPitch:   resd 1  ;INT32          dvPitch, 
  95.         .dest_dx:   resd 1  ;INT32          dest_dx, 
  96.         .dest_dy:   resd 1  ;INT32          dest_dy, 
  97.         .s1:        resd 1  ;unsigned char* s1,      
  98.         .s2:        resd 1  ;unsigned char* s2,      
  99.         .src_pitch: resd 1  ;INT32          src_pitch
  100. endstruc
  101. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  102. ;;
  103. ;; Our UYVY to Planar YUV MMX
  104. ;;                        
  105. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  106. UYVYToPlanarYUV_MMX:
  107.         ;; Save some stuff...
  108.         push ebx
  109.         push edi
  110.         push esi
  111.         push ebp
  112.         push ecx
  113.         push edx
  114.         ; Make room for temps on stack
  115.         sub esp, numtemps*4;
  116.         ;; Load our dest chroma pointers.
  117.         movd  mm4, var(parms.du)      ; mm4 = du
  118.         movd  mm5, var(parms.dv)      ; mm5 = dv
  119.                 
  120.         ;; Set up the loops
  121.         mov eax, var(parms.dest_dy)
  122.         mov ecx, var(parms.dest_dx)
  123.         shr eax, 1                    ; eax = dest_dy/2
  124.         
  125.         shr ecx, 2                    ; ecx = dest_dx/4
  126.         jnc even1                      ; Was dest_dx divisible by 4?
  127. odd1:            
  128.         ; We have 1 macro pixel left over
  129.         mov DWORD var(parms.tmp3), 1  ; Store the fact that we got odd marco pixels.
  130.         jmp cont1
  131. even1:   
  132.         mov DWORD var(parms.tmp3), 0  ; We have even pixels...        
  133. cont1:           
  134.         mov var(parms.tmp1), ecx      ; save dx loop count
  135.         mov var(parms.tmp2), eax      ; save dx loop count
  136.         
  137.         xor ecx, ecx
  138.         mov edi, var(parms.s1)        ;s1
  139.         mov esi, var(parms.s2)        ;s2
  140.         mov ebx, var(parms.d1)        ;d1
  141.         mov ebp, var(parms.d2)        ;d2
  142.         pxor  mm7, mm7                ; mm7 = 00000000 00000000
  143.         movq  mm6, [MaskLuma]         ; mm6 = Mask out Luma value.
  144.         xor eax, eax
  145. DYLOOP1: 
  146. DXLOOP1:
  147.         ;; Process 2 macro pixels at a time, 2 lines at a time.
  148.         movq mm0, [edi+ecx*8]      ; mm0= y4v2y3u2 y2v1y1u1
  149.         movq mm1, [esi+ecx*8]      ; mm1= y4v2y3u2 y2v1y1u1
  150.         ;; These two lines are the only difference between the two
  151.         ;; YUY2 and UYVY conversion routines. I really should make
  152.         ;; time to combine the 2 routines to save a little download
  153.         ;; space.
  154.         ;; Byte swap the 2 MMX registers.
  155.         ;; s1
  156.         movq     mm2, mm0
  157.         movq     mm3, mm0
  158.         psrlq    mm2, 8            ; mm2 = 00y4v2y3 u2y2v1y1
  159.         psllq    mm3, 8            ; mm3 = v2y3u2y2 v1y1u100
  160.         pand     mm3, [MaskChroma] ; mm3 = v200u200 v100u100
  161.         pand     mm2, mm6          ; mm2 = 00y400y3 00y200y1
  162.         por      mm2, mm3          ; mm2 = v2y4u2y3 v1y2u1y1
  163.         movq     mm0, mm2
  164.         ;; s2
  165.         movq     mm2, mm1
  166.         movq     mm3, mm1
  167.         psrlq    mm2, 8            ; mm2 = 00y4v2y3 u2y2v1y1
  168.         psllq    mm3, 8            ; mm3 = v2y3u2y2 v1y1u100
  169.         pand     mm3, [MaskChroma] ; mm3 = v200u200 v100u100
  170.         pand     mm2, mm6          ; mm2 = 00y400y3 00y200y1
  171.         por      mm2, mm3          ; mm2 = v2y4u2y3 v1y2u1y1
  172.         movq     mm1, mm2
  173.         
  174.         ;; Store luma values in planar YUV space
  175.         movq     mm2, mm0
  176.         movq     mm3, mm1
  177.         pand     mm2, mm6          ; mm2 = 00Y400Y3 00Y200Y1 of s1
  178.         pand     mm3, mm6          ; mm3 = 00Y400Y3 00Y200Y1 of s1
  179.         packuswb mm2, mm7          ; mm2 = 00000000 Y4Y3Y2Y1 of s1
  180.         packuswb mm3, mm7          ; mm3 = 00000000 Y4Y3Y2Y1 of s2
  181.         movd     [ebx+ecx*4], mm2  ; d1=s1
  182.         psrlw    mm0, 8            ; mm0 = 00v200u2 00v100u1 of S1
  183.         movd     [ebp+ecx*4], mm3  ; d2=s2
  184.         ;;Compute averaged chroma values
  185.         psrlw      mm1, 8            ; mm1 = 00v200u2 00v100u1 of S2
  186.         paddw      mm0, mm1          ; mm0 = v2v2u2u2 v1v1u1u1 s1+s2
  187.         psrlw      mm0, 1            ; mm0 = 00v200u2 00v100u1 (s1+s2)/2
  188.         ;;
  189.         ;;Store chromas in du and dv.
  190.         ;;
  191.         movd mm3, esi ;save esi
  192.         ;; unpack and pack
  193.         packuswb   mm0, mm0          ; mm0 = 00000000 v2u2v2u1
  194.         punpcklbw  mm0, mm0          ; mm0 = v2v2u2u2 v1v1u1u1
  195.         movd       esi, mm4          ; esi = dU
  196.         movq       mm1, mm0
  197.         psrlq      mm1, 32           ; mm1 = 0000000 v2v2u2u2
  198.         punpcklbw  mm0, mm1          ; mm0 = v2v1v2v1 u2u1u2u1
  199.         ;; Store the U data
  200.         movd edx, mm0                ; edx = u1u2u1u2
  201.         psrlq mm0, 32                ; mm0 = 00000000 v1v2v1v2
  202.         mov  WORD [esi+ecx*2], dx    ; store 2 bytes of U data.
  203.         ;; Store the V data
  204.         movd  esi, mm5                ; esi = dV
  205.         movd  edx, mm0                ; ecx = v1v2v1v2
  206.         mov   WORD [esi+ecx*2], dx    ; store 2 bytes of V data.
  207.         movd esi, mm3
  208.         
  209.         ;; inc DX counter and loop
  210.         inc  ecx
  211.         cmp  ecx, var(parms.tmp1)
  212.         jne  NEAR DXLOOP1
  213.         
  214.         ;; Now we have to check for any pixels left over if dest_dx
  215.         ;; is not divisible by 4. Since dest_dx must be at least even
  216.         ;; we can only have 0 or two(1 macro pixel).
  217.         mov ecx, var(parms.tmp3)
  218.         jz  nextline1
  219.         ;;
  220.         ;; Do odd marco pixel here. ===========
  221.         ;;
  222.         movd mm0, [edi+ecx*8]      ; mm0= 00000000 v1y2u1y1
  223.         movd mm1, [esi+ecx*8]      ; mm1= 00000000 v1y2u1y1
  224.         ;; Store luma values in planar YUV space
  225.         movq     mm2, mm0
  226.         movq     mm3, mm1
  227.         pand     mm2, mm6          ; mm2 = 00000000 00Y100Y2 of s1
  228.         pand     mm3, mm6          ; mm3 = 00000000 00Y100Y2 of s1
  229.         packuswb mm2, mm7          ; mm2 = 00000000 0000Y2Y1 of s1
  230.         packuswb mm3, mm7          ; mm3 = 00000000 0000Y2Y1 of s2
  231.         movd     edx, mm2              ; grab lower 32 bits of mm2
  232.         mov      WORD [ebx+ecx*4], dx  ; Just store 16 bits of ecx
  233.         movd     edx, mm3              ; grab lower 32 bits of mm3
  234.         mov      WORD [ebp+ecx*4], dx  ; just store 16 bits of ecx
  235.         ;;Compute averaged chroma values
  236.         psrlw      mm0, 8            ; mm0 = 00000000 00v100u1 of S1
  237.         psrlw      mm1, 8            ; mm1 = 00000000 00v100u1 of S2
  238.         paddw      mm0, mm1          ; mm0 = 00000000 v1v1u1u1 s1+s2
  239.         psrlw      mm0, 1            ; mm0 = 00000000 00v100u1 (s1+s2)/2
  240.         ;;
  241.         ;;Store chromas in du and dv.
  242.         ;;
  243.         movd mm3, esi ;save esi
  244.         movd esi, mm4                ; esi = dU
  245.         ;; unpack and pack
  246.         movd edx, mm0    ; edx = 00v100u1
  247.         
  248.         ;; Store the U data
  249.         mov  [esi+ecx*2], dl         ; store 1 byte of U data.
  250.         movd  esi, mm5                ; esi = dV
  251.         ;; Store the V data
  252.         shr   edx, 16                 ; edx = 000000v1
  253.         mov   [esi+ecx*2], dl         ; store 1 byte of V data.
  254.         movd  esi, mm3
  255.         
  256. nextline1:               
  257.         ;; Add pitches for next line
  258.         mov ecx, var(parms.src_pitch)
  259.         shl ecx, 1                     ; ecx = src_pitch*2
  260.         add edi, ecx                   ; s1 = s1 + src_pitch*2
  261.         add esi, ecx                   ; s2 = s2 + src_pitch*2
  262.         mov ecx, var(parms.dyPitch)
  263.         shl ecx, 1                     ; ecx = dyPitch*2
  264.         add ebx, ecx                   ; d1 = d1+ dyPitch*2
  265.         add ebp, ecx                   ; d2 = d2+ dyPitch*2
  266.         mov   ecx, var(parms.dvPitch)  ; ecx = dvPitch
  267.         movd  mm3, ecx
  268.         paddd mm4, mm3                  ; dv = dv+ dvPitch
  269.         mov   ecx, var(parms.duPitch)    ; ecx = 
  270.         movd  mm3, ecx
  271.         xor   ecx, ecx
  272.         paddd mm5, mm3                  ; du = du+ duPitch
  273.         
  274.         ;; inc DY counter and loop
  275.         inc eax
  276.         cmp eax, var(parms.tmp2)
  277.         jne NEAR DYLOOP1
  278.         
  279. end1: 
  280.         ;; Free up stack temp var.
  281.         add esp, numtemps*4
  282.         
  283.         ;; Pop off the stack....
  284.         pop edx
  285.         pop ecx
  286.         pop ebp
  287.         pop esi
  288.         pop edi
  289.         pop ebx
  290.         emms
  291.         
  292.         ;; success
  293.         xor eax, eax
  294.         ret
  295.         
  296. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  297. ;;
  298. ;; Our YUY2 to Planar YUV MMX
  299. ;;                        
  300. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  301. YUY2ToPlanarYUV_MMX:
  302.         ;; Save some stuff...
  303.         push ebx
  304.         push edi
  305.         push esi
  306.         push ebp
  307.         push ecx
  308.         push edx
  309.         ; Make room for temps on stack
  310.         sub esp, numtemps*4;
  311.         ;; Load our chroma pointers.
  312.         movd  mm4, var(parms.du)      ; mm4 = du
  313.         movd  mm5, var(parms.dv)      ; mm5 = dv
  314.         ;; Set up the loops
  315.         mov eax, var(parms.dest_dy)
  316.         mov ecx, var(parms.dest_dx)
  317.         shr eax, 1                    ; eax = dest_dy/2
  318.         
  319.         shr ecx, 2                    ; ecx = dest_dx/4
  320.         jnc even                      ; Was dest_dx divisible by 4?
  321. odd:            
  322.         ; We have 1 macro pixel left over
  323.         mov DWORD var(parms.tmp3), 1  ; Store the fact that we got odd marco pixels.
  324.         jmp cont
  325. even:   
  326.         mov DWORD var(parms.tmp3), 0  ; We have even pixels...        
  327. cont:           
  328.         mov var(parms.tmp1), ecx      ; save dx loop count
  329.         mov var(parms.tmp2), eax      ; save dx loop count
  330.         
  331.         xor ecx, ecx
  332.         mov edi, var(parms.s1)        ;s1
  333.         mov esi, var(parms.s2)        ;s2
  334.         mov ebx, var(parms.d1)        ;d1
  335.         mov ebp, var(parms.d2)        ;d2
  336.         pxor  mm7, mm7                ; mm7 = 00000000 00000000
  337.         movq  mm6, [MaskLuma]         ; mm6 = Mask out Luma value.
  338.         xor eax, eax
  339. DYLOOP: 
  340. DXLOOP:
  341.         ;; Process 2 macro pixels at a time, 2 lines at a time.
  342.         movq mm0, [edi+ecx*8]      ; mm0= v2y4u2y3 v1y2u1y1
  343.         movq mm1, [esi+ecx*8]      ; mm1= v2y4u2y3 v1y2u1y1
  344.         
  345.         ;; Store luma values in planar YUV space
  346.         movq     mm2, mm0
  347.         movq     mm3, mm1
  348.         pand     mm2, mm6          ; mm2 = 00Y400Y3 00Y200Y1 of s1
  349.         pand     mm3, mm6          ; mm3 = 00Y400Y3 00Y200Y1 of s1
  350.         packuswb mm2, mm7          ; mm2 = 00000000 Y4Y3Y2Y1 of s1
  351.         packuswb mm3, mm7          ; mm3 = 00000000 Y4Y3Y2Y1 of s2
  352.         movd     [ebx+ecx*4], mm2  ; d1=s1
  353.         psrlw      mm0, 8            ; mm0 = 00v200u2 00v100u1 of S1
  354.         movd     [ebp+ecx*4], mm3  ; d2=s2
  355.         ;;Compute averaged chroma values
  356.         psrlw      mm1, 8            ; mm1 = 00v200u2 00v100u1 of S2
  357.         paddw      mm0, mm1          ; mm0 = v2v2u2u2 v1v1u1u1 s1+s2
  358.         psrlw      mm0, 1            ; mm0 = 00v200u2 00v100u1 (s1+s2)/2
  359.         ;;
  360.         ;;Store chromas in du and dv.
  361.         ;;
  362.         movd mm3, esi ;save esi
  363.         ;; unpack and pack
  364.         packuswb   mm0, mm0          ; mm0 = 00000000 v2u2v2u1
  365.         punpcklbw  mm0, mm0          ; mm0 = v2v2u2u2 v1v1u1u1
  366.         movd       esi, mm4          ; esi = dU
  367.         movq       mm1, mm0
  368.         psrlq      mm1, 32           ; mm1 = 0000000 v2v2u2u2
  369.         punpcklbw  mm0, mm1          ; mm0 = v2v1v2v1 u2u1u2u1
  370.         ;; Store the U data
  371.         movd edx, mm0                ; edx = u1u2u1u2
  372.         psrlq mm0, 32                ; mm0 = 00000000 v1v2v1v2
  373.         mov  WORD [esi+ecx*2], dx    ; store 2 bytes of U data.
  374.         ;; Store the V data
  375.         movd  esi, mm5                ; esi = dV
  376.         movd  edx, mm0                ; ecx = v1v2v1v2
  377.         mov   WORD [esi+ecx*2], dx    ; store 2 bytes of V data.
  378.         movd esi, mm3
  379.         
  380.         ;; inc DX counter and loop
  381.         inc  ecx
  382.         cmp  ecx, var(parms.tmp1)
  383.         jne  DXLOOP
  384.         
  385.         ;; Now we have to check for any pixels left over if dest_dx
  386.         ;; is not divisible by 4. Since dest_dx must be at least even
  387.         ;; we can only have 0 or two(1 macro pixel).
  388.         mov ecx, var(parms.tmp3)
  389.         jz  nextline
  390.         ;;
  391.         ;; Do odd marco pixel here. ===========
  392.         ;;
  393.         movd mm0, [edi+ecx*8]      ; mm0= 00000000 v1y2u1y1
  394.         movd mm1, [esi+ecx*8]      ; mm1= 00000000 v1y2u1y1
  395.         ;; Store luma values in planar YUV space
  396.         movq     mm2, mm0
  397.         movq     mm3, mm1
  398.         pand     mm2, mm6          ; mm2 = 00000000 00Y100Y2 of s1
  399.         pand     mm3, mm6          ; mm3 = 00000000 00Y100Y2 of s1
  400.         packuswb mm2, mm7          ; mm2 = 00000000 0000Y2Y1 of s1
  401.         packuswb mm3, mm7          ; mm3 = 00000000 0000Y2Y1 of s2
  402.         movd     edx, mm2              ; grab lower 32 bits of mm2
  403.         mov      WORD [ebx+ecx*4], dx  ; Just store 16 bits of ecx
  404.         movd     edx, mm3              ; grab lower 32 bits of mm3
  405.         mov      WORD [ebp+ecx*4], dx  ; just store 16 bits of ecx
  406.         ;;Compute averaged chroma values
  407.         psrlw      mm0, 8            ; mm0 = 00000000 00v100u1 of S1
  408.         psrlw      mm1, 8            ; mm1 = 00000000 00v100u1 of S2
  409.         paddw      mm0, mm1          ; mm0 = 00000000 v1v1u1u1 s1+s2
  410.         psrlw      mm0, 1            ; mm0 = 00000000 00v100u1 (s1+s2)/2
  411.         ;;
  412.         ;;Store chromas in du and dv.
  413.         ;;
  414.         movd mm3, esi ;save esi
  415.         movd esi, mm4                ; esi = dU
  416.         ;; unpack and pack
  417.         movd edx, mm0    ; edx = 00v100u1
  418.         
  419.         ;; Store the U data
  420.         mov  [esi+ecx*2], dl         ; store 1 byte of U data.
  421.         movd  esi, mm5                ; esi = dV
  422.         ;; Store the V data
  423.         shr   edx, 16                 ; edx = 000000v1
  424.         mov   [esi+ecx*2], dl         ; store 1 byte of V data.
  425.         movd  esi, mm3
  426.         
  427. nextline:               
  428.         ;; Add pitches for next line
  429.         mov ecx, var(parms.src_pitch)
  430.         shl ecx, 1                     ; ecx = src_pitch*2
  431.         add edi, ecx                   ; s1 = s1 + src_pitch*2
  432.         add esi, ecx                   ; s2 = s2 + src_pitch*2
  433.         mov ecx, var(parms.dyPitch)
  434.         shl ecx, 1                     ; ecx = dyPitch*2
  435.         add ebx, ecx                   ; d1 = d1+ dyPitch*2
  436.         add ebp, ecx                   ; d2 = d2+ dyPitch*2
  437.         mov   ecx, var(parms.dvPitch)  ; ecx = dvPitch
  438.         movd  mm3, ecx
  439.         paddd mm4, mm3                  ; dv = dv+ dvPitch
  440.         mov   ecx, var(parms.duPitch)    ; ecx = 
  441.         movd  mm3, ecx
  442.         xor   ecx, ecx
  443.         paddd mm5, mm3                  ; du = du+ duPitch
  444.         
  445.         ;; inc DY counter and loop
  446.         inc eax
  447.         cmp eax, var(parms.tmp2)
  448.         jne NEAR DYLOOP
  449.         
  450. end: 
  451.         ;; Free up stack temp var.
  452.         add esp, numtemps*4
  453.         
  454.         ;; Pop off the stack....
  455.         pop edx
  456.         pop ecx
  457.         pop ebp
  458.         pop esi
  459.         pop edi
  460.         pop ebx
  461.         emms
  462.         
  463.         ;; success
  464.         xor eax, eax
  465.         ret
  466. ;;; leave a trace
  467. version: db '$(gfw) Copyright 2001 RealNetworks Inc. Revision:1.0 $',0