mmxlines.asm
上传用户:dangjiwu
上传日期:2013-07-19
资源大小:42019k
文件大小:11k
源码类别:

Symbian

开发平台:

Visual C++

  1. ;
  2. ; ***** BEGIN LICENSE BLOCK *****
  3. ; Source last modified: $Id: mmxlines.asm,v 1.1.1.1.50.1 2004/07/09 02:00:18 hubbe Exp $
  4. ; Portions Copyright (c) 1995-2004 RealNetworks, Inc. All Rights Reserved.
  5. ; The contents of this file, and the files included with this file,
  6. ; are subject to the current version of the RealNetworks Public
  7. ; Source License (the "RPSL") available at
  8. ; http://www.helixcommunity.org/content/rpsl unless you have licensed
  9. ; the file under the current version of the RealNetworks Community
  10. ; Source License (the "RCSL") available at
  11. ; http://www.helixcommunity.org/content/rcsl, in which case the RCSL
  12. ; will apply. You may also obtain the license terms directly from
  13. ; RealNetworks.  You may not use this file except in compliance with
  14. ; the RPSL or, if you have a valid RCSL with RealNetworks applicable
  15. ; to this file, the RCSL.  Please see the applicable RPSL or RCSL for
  16. ; the rights, obligations and limitations governing use of the
  17. ; contents of the file.
  18. ; Alternatively, the contents of this file may be used under the
  19. ; terms of the GNU General Public License Version 2 or later (the
  20. ; "GPL") in which case the provisions of the GPL are applicable
  21. ; instead of those above. If you wish to allow use of your version of
  22. ; this file only under the terms of the GPL, and not to allow others
  23. ; to use your version of this file under the terms of either the RPSL
  24. ; or RCSL, indicate your decision by deleting the provisions above
  25. ; and replace them with the notice and other provisions required by
  26. ; the GPL. If you do not delete the provisions above, a recipient may
  27. ; use your version of this file under the terms of any one of the
  28. ; RPSL, the RCSL or the GPL.
  29. ; This file is part of the Helix DNA Technology. RealNetworks is the
  30. ; developer of the Original Code and owns the copyrights in the
  31. ; portions it created.
  32. ; This file, and the files included with this file, is distributed
  33. ; and made available on an 'AS IS' basis, WITHOUT WARRANTY OF ANY
  34. ; KIND, EITHER EXPRESS OR IMPLIED, AND REALNETWORKS HEREBY DISCLAIMS
  35. ; ALL SUCH WARRANTIES, INCLUDING WITHOUT LIMITATION, ANY WARRANTIES
  36. ; OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE, QUIET
  37. ; ENJOYMENT OR NON-INFRINGEMENT.
  38. ; Technology Compatibility Kit Test Suite(s) Location:
  39. ;    http://www.helixcommunity.org/content/tck
  40. ; Contributor(s):
  41. ; ***** END LICENSE BLOCK *****
  42. ;
  43. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  44. ;;
  45. ;;  _MMX_lineI420toYUY2 and _MMX_lineI420toUYVY
  46. ;;
  47. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  48. ;;; YUY2ToPlanarYUV_MMX
  49. %ifdef   COFF
  50.         %define _MMX_lineI420toYUY2 __MMX_lineI420toYUY2
  51.         %define _MMX_lineI420toUYVY __MMX_lineI420toUYVY
  52. %elifdef WIN32
  53.         %define _MMX_lineI420toYUY2 __MMX_lineI420toYUY2
  54.         %define _MMX_lineI420toUYVY __MMX_lineI420toUYVY
  55. %elifdef ELF
  56.         %define _MMX_lineI420toYUY2 _MMX_lineI420toYUY2
  57.         %define _MMX_lineI420toUYVY _MMX_lineI420toUYVY
  58. %elifdef AOUTB
  59.         %define _MMX_lineI420toYUY2 _MMX_lineI420toYUY2
  60.         %define _MMX_lineI420toUYVY _MMX_lineI420toUYVY
  61. %else
  62.         %error linking format currently not supported by _MMX_lineI420to*
  63. %endif
  64.         ;; Export the functions implemented here.
  65.         global _MMX_lineI420toYUY2
  66.         global _MMX_lineI420toUYVY
  67. ;========================= DATA SEGMENT ============================
  68. section .data
  69. align 8        
  70. ;============================= CODE SEGMENT ========================                  
  71. section .text
  72. ;;
  73. ;; This is our stack params definition. It is used for both 
  74. ;; YUY2 and UYVY functions.
  75. ;;                                        
  76. %define var(a) [esp+a]       
  77.                 
  78. struc parms
  79.         ; Space for reg pushes and return address.
  80.         .registers  resd 6  ;pushed registers
  81.         .return     resd 1  ;return address
  82.         ; input params
  83.         .sy:        resd 1  ;unsigned char* sy,      
  84.         .su:        resd 1  ;unsigned char* su,      
  85.         .sv:        resd 1  ;unsigned char* sv,      
  86.         .d:         resd 1  ;unsigned char* d,      
  87.         .count:     resd 1  ;int            count
  88. endstruc
  89. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  90. ;;
  91. ;; I420 to YUY2...
  92. ;;                        
  93. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  94. _MMX_lineI420toYUY2:
  95.         ;; Save some stuff...
  96.         push ebx
  97.         push edi
  98.         push esi
  99.         push ebp
  100.         push ecx
  101.         push edx
  102. ;          load frame pointers
  103.         mov     esi, var(parms.sy)
  104.         mov     ebx, var(parms.su)
  105.         mov     ecx, var(parms.sv)
  106.         mov     edi, var(parms.d)
  107. ;          get # of pixels:  
  108.         mov     ebp, var(parms.count)
  109. ;          copy misaligned pixels first: 
  110.         sub     ebp, 2
  111.         jl      cont_1
  112. loop_1:
  113.         test    edi,15
  114.         jz      cont_1
  115.         xor     eax, eax
  116.         mov     al, [esi]      ; sy[0] 
  117.         xor     edx, edx
  118.         mov     dl, [esi+1]    ; sy[1] 
  119.         mov     ah, [ebx]      ; su[0] 
  120.         mov     dh, [ecx]      ; sv[0] 
  121.         lea     esi, [esi+2]
  122.         shl     edx, 16
  123.         lea     ebx, [ebx+1]
  124.         or      eax, edx
  125.         lea     ecx, [ecx+1]
  126.         mov    dword  [edi], eax
  127.         lea     edi, [edi+4]
  128.         sub     ebp, 2
  129.         jge     loop_1
  130. ;          process main bulk of data: 
  131. cont_1:
  132.         sub     ebp,16-2
  133.         jl      cont_2
  134. loop_2:
  135. ;          load 8 bytes from each plane 
  136.         movq    mm0, [esi]    ; mm0: y7..y0 
  137.         movq    mm1, [ebx]    ; mm1: u7..u0 
  138.         movq    mm2, [ecx]    ; mm2: v7..v0 
  139. ;          process first 8 pixels: 
  140.         movq      mm3, mm1
  141.         punpcklbw mm3, mm2      ; mm3: v3,u3,v2,u2,v1,u1,v0,u0 
  142.         movq      mm4, mm0
  143.         punpcklbw mm4, mm3      ; mm4: v1,y3,u1,y2,v0,y1,u0,y0 
  144.         movq      [edi], mm4
  145.         psrlq     mm3, 32
  146.         psrlq     mm0, 32
  147.         punpcklbw mm0, mm3      ; mm0: v3,y7,u3,y6,v2,y5,u2,y4 
  148.         movq      [edi+8], mm0
  149. ;          process another 8 pixels: 
  150.         movq      mm0, [esi+8]  ; mm0: y15..y8 
  151.         psrlq     mm1, 32
  152.         psrlq     mm2, 32
  153.         movq      mm3, mm1
  154.         punpcklbw mm3, mm2
  155.         movq      mm4, mm0
  156.         punpcklbw mm4, mm3
  157.         movq      [edi+16], mm4
  158.         psrlq     mm3, 32
  159.         psrlq     mm0, 32
  160.         punpcklbw mm0, mm3
  161.         movq      [edi+24], mm0
  162.         lea       esi, [esi+16]       ; sy 
  163.         lea       ebx, [ebx+8]        ; su 
  164.         lea       ecx, [ecx+8]        ; sv 
  165.         lea       edi, [edi+32]       ; d 
  166.   
  167.         sub       ebp, 16
  168.         jge       loop_2
  169. ;          copy the remaining pixels: 
  170. cont_2:
  171.         sub       ebp,2-16
  172.         jl        done
  173. loop_3:  
  174.         xor       eax, eax
  175.         mov       al, [esi]      ; sy[0] 
  176.         xor       edx, edx
  177.         mov       dl, [esi+1]    ; sy[1] 
  178.         mov       ah, [ebx]      ; su[0] 
  179.         mov       dh, [ecx]      ; sv[0] 
  180.         lea       esi, [esi+2]
  181.         shl       edx, 16
  182.         lea       ebx, [ebx+1]
  183.         or        eax, edx
  184.         lea       ecx, [ecx+1]
  185.         mov       dword [edi], eax
  186.         lea       edi, [edi+4]
  187.   
  188.         sub       ebp, 2
  189.         jge       loop_3
  190.                 
  191. done:   
  192.         ;; Pop off the stack....
  193.         pop edx
  194.         pop ecx
  195.         pop ebp
  196.         pop esi
  197.         pop edi
  198.         pop ebx
  199. ;;; No emms on purpose....
  200.         
  201.         ;; success
  202.         xor eax, eax
  203.         ret
  204.         
  205. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  206. ;;
  207. ;; _MMX_lineI420toUYVY
  208. ;;                        
  209. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  210. _MMX_lineI420toUYVY:
  211.         
  212.         ;; Save some stuff...
  213.         push ebx
  214.         push edi
  215.         push esi
  216.         push ebp
  217.         push ecx
  218.         push edx
  219.         mov     esi, var(parms.sy)
  220.         mov     ebx, var(parms.su)
  221.         mov     ecx, var(parms.sv)
  222.         mov     edi, var(parms.d)
  223.         mov     ebp, var(parms.count)
  224.         ; copy misaligned pixels first
  225.         sub     ebp, 2
  226.         jl      cont_11
  227. loop_11:
  228.         test    edi,15
  229.         jz      cont_11
  230.         xor     eax, eax
  231.         mov     al, byte [ebx]  ; su
  232.         xor     edx, edx
  233.         mov     dl, byte [ecx]  ; sv
  234.         mov     ah, byte [esi]  ; sy
  235.         lea     ebx, [ebx+1]
  236.         mov     dh, byte [esi+1]
  237.         lea     ecx, [ecx+1]
  238.         shl     edx, 16
  239.         lea     esi, [esi+2]
  240.         or      eax, edx
  241.         sub     ebp, 2
  242.         mov     dword [edi], eax
  243.         lea     edi, [edi+4]
  244.         jge     loop_11
  245.         
  246.         ; process main bulk of data
  247. cont_11:
  248.         sub     ebp,16-2
  249.         jl      cont_22
  250. loop_22:
  251.         ; load chroma pixels
  252.         movq    mm1, qword [ebx]    ; mm1: u7..u0 
  253.         movq    mm2, qword [ecx]    ; mm2: v7..v0 
  254.         ; process first 8 pixels
  255.         movq      mm3, mm1
  256.         punpcklbw mm3, mm2          ; mm3: v3,u3,v2,u2,v1,u1,v0,u0 
  257.         movq      mm0, qword [esi]  ; mm0: y7,y6,y5,y4,y3,y2,y1,y0 
  258.         movq      mm4, mm3
  259.         punpcklbw mm4, mm0          ; m4: y3,v1,y2,u1,y1,v0,y0,u0 
  260.         movq      qword [edi], mm4
  261.         psrlq     mm3, 32
  262.         psrlq     mm0, 32
  263.         punpcklbw mm3, mm0          ; mm3: y7,v3,y6,u3,y5,v2,y4,u2 
  264.         movq      qword [edi+8], mm3
  265.         ; process another 8 pixels
  266.         psrlq     mm1, 32
  267.         psrlq     mm2, 32
  268.         movq      mm3, mm1
  269.         punpcklbw mm3, mm2
  270.         movq      mm0, qword [esi+8]  ; mm0: y15..y8 
  271.         movq      mm4, mm3
  272.         punpcklbw mm4, mm0
  273.         movq      qword [edi+16], mm4
  274.         psrlq     mm3, 32
  275.         psrlq     mm0, 32
  276.         punpcklbw mm3, mm0
  277.         movq      qword [edi+24], mm3
  278.         lea       esi, [esi+16]       ;sy 
  279.         lea       ebx, [ebx+8]        ;su 
  280.         lea       ecx, [ecx+8]        ;sv 
  281.         lea       edi, [edi+32]       ;d  
  282.   
  283.         sub       ebp, 16
  284.         jge       loop_22
  285.         ; copy the remaining pixels
  286. cont_22:
  287.         sub       ebp,2-16
  288.         jl        done2
  289. loop_32:  
  290.         xor       eax, eax
  291.         mov       al, byte [ebx]      ;su[0]
  292.         xor       edx, edx
  293.         mov       dl, byte [ecx]      ;sv[0] 
  294.         mov       ah, byte [esi]      ;sy[0] 
  295.         lea       ebx, [ebx+1]
  296.         mov       dh, byte [esi+1]    ;sy[1] 
  297.         lea       ecx, [ecx+1]
  298.         shl       edx, 16
  299.         lea       esi, [esi+2]
  300.         or        eax, edx
  301.         sub       ebp, 2
  302.         mov       dword [edi], eax
  303.         lea       edi, [edi+4]
  304.         jge       loop_32
  305.         
  306. done2:
  307.         ;; Pop off the stack....
  308.         pop edx
  309.         pop ecx
  310.         pop ebp
  311.         pop esi
  312.         pop edi
  313.         pop ebx
  314. ;;; No emms on purpose....
  315.         
  316.         ;; success
  317.         xor eax, eax
  318.         ret
  319. ;;; Ident.
  320. version: db '$(cl13n7c0r3) Copyright 2002 RealNetworks Inc. Revision:1.0 $',0