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

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. ;;  _MMX_lineI420toYUY2 and _MMX_lineI420toUYVY
  38. ;;
  39. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  40. ;;; YUY2ToPlanarYUV_MMX
  41. %ifdef   COFF
  42.         %define _MMX_lineI420toYUY2 __MMX_lineI420toYUY2
  43.         %define _MMX_lineI420toUYVY __MMX_lineI420toUYVY
  44. %elifdef WIN32
  45.         %define _MMX_lineI420toYUY2 __MMX_lineI420toYUY2
  46.         %define _MMX_lineI420toUYVY __MMX_lineI420toUYVY
  47. %elifdef ELF
  48.         %define _MMX_lineI420toYUY2 _MMX_lineI420toYUY2
  49.         %define _MMX_lineI420toUYVY _MMX_lineI420toUYVY
  50. %elifdef AOUTB
  51.         %define _MMX_lineI420toYUY2 _MMX_lineI420toYUY2
  52.         %define _MMX_lineI420toUYVY _MMX_lineI420toUYVY
  53. %else
  54.         %error linking format currently not supported by _MMX_lineI420to*
  55. %endif
  56.         ;; Export the functions implemented here.
  57.         global _MMX_lineI420toYUY2
  58.         global _MMX_lineI420toUYVY
  59. ;========================= DATA SEGMENT ============================
  60. section .data
  61. align 8        
  62. ;============================= CODE SEGMENT ========================                  
  63. section .text
  64. ;;
  65. ;; This is our stack params definition. It is used for both 
  66. ;; YUY2 and UYVY functions.
  67. ;;                                        
  68. %define var(a) [esp+a]       
  69.                 
  70. struc parms
  71.         ; Space for reg pushes and return address.
  72.         .registers  resd 6  ;pushed registers
  73.         .return     resd 1  ;return address
  74.         ; input params
  75.         .sy:        resd 1  ;unsigned char* sy,      
  76.         .su:        resd 1  ;unsigned char* su,      
  77.         .sv:        resd 1  ;unsigned char* sv,      
  78.         .d:         resd 1  ;unsigned char* d,      
  79.         .count:     resd 1  ;int            count
  80. endstruc
  81. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  82. ;;
  83. ;; I420 to YUY2...
  84. ;;                        
  85. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  86. _MMX_lineI420toYUY2:
  87.         ;; Save some stuff...
  88.         push ebx
  89.         push edi
  90.         push esi
  91.         push ebp
  92.         push ecx
  93.         push edx
  94. ;          load frame pointers
  95.         mov     esi, var(parms.sy)
  96.         mov     ebx, var(parms.su)
  97.         mov     ecx, var(parms.sv)
  98.         mov     edi, var(parms.d)
  99. ;          get # of pixels:  
  100.         mov     ebp, var(parms.count)
  101. ;          copy misaligned pixels first: 
  102.         sub     ebp, 2
  103.         jl      cont_1
  104. loop_1:
  105.         test    edi,15
  106.         jz      cont_1
  107.         xor     eax, eax
  108.         mov     al, [esi]      ; sy[0] 
  109.         xor     edx, edx
  110.         mov     dl, [esi+1]    ; sy[1] 
  111.         mov     ah, [ebx]      ; su[0] 
  112.         mov     dh, [ecx]      ; sv[0] 
  113.         lea     esi, [esi+2]
  114.         shl     edx, 16
  115.         lea     ebx, [ebx+1]
  116.         or      eax, edx
  117.         lea     ecx, [ecx+1]
  118.         mov    dword  [edi], eax
  119.         lea     edi, [edi+4]
  120.         sub     ebp, 2
  121.         jge     loop_1
  122. ;          process main bulk of data: 
  123. cont_1:
  124.         sub     ebp,16-2
  125.         jl      cont_2
  126. loop_2:
  127. ;          load 8 bytes from each plane 
  128.         movq    mm0, [esi]    ; mm0: y7..y0 
  129.         movq    mm1, [ebx]    ; mm1: u7..u0 
  130.         movq    mm2, [ecx]    ; mm2: v7..v0 
  131. ;          process first 8 pixels: 
  132.         movq      mm3, mm1
  133.         punpcklbw mm3, mm2      ; mm3: v3,u3,v2,u2,v1,u1,v0,u0 
  134.         movq      mm4, mm0
  135.         punpcklbw mm4, mm3      ; mm4: v1,y3,u1,y2,v0,y1,u0,y0 
  136.         movq      [edi], mm4
  137.         psrlq     mm3, 32
  138.         psrlq     mm0, 32
  139.         punpcklbw mm0, mm3      ; mm0: v3,y7,u3,y6,v2,y5,u2,y4 
  140.         movq      [edi+8], mm0
  141. ;          process another 8 pixels: 
  142.         movq      mm0, [esi+8]  ; mm0: y15..y8 
  143.         psrlq     mm1, 32
  144.         psrlq     mm2, 32
  145.         movq      mm3, mm1
  146.         punpcklbw mm3, mm2
  147.         movq      mm4, mm0
  148.         punpcklbw mm4, mm3
  149.         movq      [edi+16], mm4
  150.         psrlq     mm3, 32
  151.         psrlq     mm0, 32
  152.         punpcklbw mm0, mm3
  153.         movq      [edi+24], mm0
  154.         lea       esi, [esi+16]       ; sy 
  155.         lea       ebx, [ebx+8]        ; su 
  156.         lea       ecx, [ecx+8]        ; sv 
  157.         lea       edi, [edi+32]       ; d 
  158.   
  159.         sub       ebp, 16
  160.         jge       loop_2
  161. ;          copy the remaining pixels: 
  162. cont_2:
  163.         sub       ebp,2-16
  164.         jl        done
  165. loop_3:  
  166.         xor       eax, eax
  167.         mov       al, [esi]      ; sy[0] 
  168.         xor       edx, edx
  169.         mov       dl, [esi+1]    ; sy[1] 
  170.         mov       ah, [ebx]      ; su[0] 
  171.         mov       dh, [ecx]      ; sv[0] 
  172.         lea       esi, [esi+2]
  173.         shl       edx, 16
  174.         lea       ebx, [ebx+1]
  175.         or        eax, edx
  176.         lea       ecx, [ecx+1]
  177.         mov       dword [edi], eax
  178.         lea       edi, [edi+4]
  179.   
  180.         sub       ebp, 2
  181.         jge       loop_3
  182.                 
  183. done:   
  184.         ;; Pop off the stack....
  185.         pop edx
  186.         pop ecx
  187.         pop ebp
  188.         pop esi
  189.         pop edi
  190.         pop ebx
  191. ;;; No emms on purpose....
  192.         
  193.         ;; success
  194.         xor eax, eax
  195.         ret
  196.         
  197. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  198. ;;
  199. ;; _MMX_lineI420toUYVY
  200. ;;                        
  201. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  202. _MMX_lineI420toUYVY:
  203.         
  204.         ;; Save some stuff...
  205.         push ebx
  206.         push edi
  207.         push esi
  208.         push ebp
  209.         push ecx
  210.         push edx
  211.         mov     esi, var(parms.sy)
  212.         mov     ebx, var(parms.su)
  213.         mov     ecx, var(parms.sv)
  214.         mov     edi, var(parms.d)
  215.         mov     ebp, var(parms.count)
  216.         ; copy misaligned pixels first
  217.         sub     ebp, 2
  218.         jl      cont_11
  219. loop_11:
  220.         test    edi,15
  221.         jz      cont_11
  222.         xor     eax, eax
  223.         mov     al, byte [ebx]  ; su
  224.         xor     edx, edx
  225.         mov     dl, byte [ecx]  ; sv
  226.         mov     ah, byte [esi]  ; sy
  227.         lea     ebx, [ebx+1]
  228.         mov     dh, byte [esi+1]
  229.         lea     ecx, [ecx+1]
  230.         shl     edx, 16
  231.         lea     esi, [esi+2]
  232.         or      eax, edx
  233.         sub     ebp, 2
  234.         mov     dword [edi], eax
  235.         lea     edi, [edi+4]
  236.         jge     loop_11
  237.         
  238.         ; process main bulk of data
  239. cont_11:
  240.         sub     ebp,16-2
  241.         jl      cont_22
  242. loop_22:
  243.         ; load chroma pixels
  244.         movq    mm1, qword [ebx]    ; mm1: u7..u0 
  245.         movq    mm2, qword [ecx]    ; mm2: v7..v0 
  246.         ; process first 8 pixels
  247.         movq      mm3, mm1
  248.         punpcklbw mm3, mm2          ; mm3: v3,u3,v2,u2,v1,u1,v0,u0 
  249.         movq      mm0, qword [esi]  ; mm0: y7,y6,y5,y4,y3,y2,y1,y0 
  250.         movq      mm4, mm3
  251.         punpcklbw mm4, mm0          ; m4: y3,v1,y2,u1,y1,v0,y0,u0 
  252.         movq      qword [edi], mm4
  253.         psrlq     mm3, 32
  254.         psrlq     mm0, 32
  255.         punpcklbw mm3, mm0          ; mm3: y7,v3,y6,u3,y5,v2,y4,u2 
  256.         movq      qword [edi+8], mm3
  257.         ; process another 8 pixels
  258.         psrlq     mm1, 32
  259.         psrlq     mm2, 32
  260.         movq      mm3, mm1
  261.         punpcklbw mm3, mm2
  262.         movq      mm0, qword [esi+8]  ; mm0: y15..y8 
  263.         movq      mm4, mm3
  264.         punpcklbw mm4, mm0
  265.         movq      qword [edi+16], mm4
  266.         psrlq     mm3, 32
  267.         psrlq     mm0, 32
  268.         punpcklbw mm3, mm0
  269.         movq      qword [edi+24], mm3
  270.         lea       esi, [esi+16]       ;sy 
  271.         lea       ebx, [ebx+8]        ;su 
  272.         lea       ecx, [ecx+8]        ;sv 
  273.         lea       edi, [edi+32]       ;d  
  274.   
  275.         sub       ebp, 16
  276.         jge       loop_22
  277.         ; copy the remaining pixels
  278. cont_22:
  279.         sub       ebp,2-16
  280.         jl        done2
  281. loop_32:  
  282.         xor       eax, eax
  283.         mov       al, byte [ebx]      ;su[0]
  284.         xor       edx, edx
  285.         mov       dl, byte [ecx]      ;sv[0] 
  286.         mov       ah, byte [esi]      ;sy[0] 
  287.         lea       ebx, [ebx+1]
  288.         mov       dh, byte [esi+1]    ;sy[1] 
  289.         lea       ecx, [ecx+1]
  290.         shl       edx, 16
  291.         lea       esi, [esi+2]
  292.         or        eax, edx
  293.         sub       ebp, 2
  294.         mov       dword [edi], eax
  295.         lea       edi, [edi+4]
  296.         jge       loop_32
  297.         
  298. done2:
  299.         ;; Pop off the stack....
  300.         pop edx
  301.         pop ecx
  302.         pop ebp
  303.         pop esi
  304.         pop edi
  305.         pop ebx
  306. ;;; No emms on purpose....
  307.         
  308.         ;; success
  309.         xor eax, eax
  310.         ret
  311. ;;; Ident.
  312. version: db '$(cl13n7c0r3) Copyright 2002 RealNetworks Inc. Revision:1.0 $',0