[svn] / trunk / xvidcore / src / image / x86_asm / colorspace_yuyv_mmx.asm Repository:
ViewVC logotype

Diff of /trunk/xvidcore/src/image/x86_asm/colorspace_yuyv_mmx.asm

Parent Directory Parent Directory | Revision Log Revision Log | View Patch Patch

revision 1535, Sun Aug 22 11:46:10 2004 UTC revision 1795, Wed Nov 26 01:04:34 2008 UTC
# Line 19  Line 19 
19  ; *  along with this program; if not, write to the Free Software  ; *  along with this program; if not, write to the Free Software
20  ; *  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307 USA  ; *  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307 USA
21  ; *  ; *
22  ; * $Id: colorspace_yuyv_mmx.asm,v 1.5 2004-08-22 11:46:09 edgomez Exp $  ; * $Id: colorspace_yuyv_mmx.asm,v 1.10 2008-11-26 01:04:34 Isibaar Exp $
23  ; *  ; *
24  ; ***************************************************************************/  ; ***************************************************************************/
25    
26  BITS 32  %include "nasm.inc"
   
 %macro cglobal 1  
         %ifdef PREFIX  
                 %ifdef MARK_FUNCS  
                         global _%1:function  
                         %define %1 _%1:function  
                 %else  
                         global _%1  
                         %define %1 _%1  
                 %endif  
         %else  
                 %ifdef MARK_FUNCS  
                         global %1:function  
                 %else  
                         global %1  
                 %endif  
         %endif  
 %endmacro  
27    
28  ;=============================================================================  ;=============================================================================
29  ; Read only data  ; Read only data
30  ;=============================================================================  ;=============================================================================
31    
32  %ifdef FORMAT_COFF  DATA
 SECTION .rodata  
 %else  
 SECTION .rodata align=16  
 %endif  
33    
34  ;-----------------------------------------------------------------------------  ;-----------------------------------------------------------------------------
35  ; yuyv/uyvy mask for extracting yuv components  ; yuyv/uyvy mask for extracting yuv components
36  ;-----------------------------------------------------------------------------  ;-----------------------------------------------------------------------------
37  ;                               y     u     y     v     y     u     y     v  ;                               y     u     y     v     y     u     y     v
38    
39  ALIGN 16  ALIGN SECTION_ALIGN
40  yuyv_mask:      db 0xff,  0,  0xff,   0,   0xff,  0,   0xff,  0  yuyv_mask:      db 0xff,  0,  0xff,   0,   0xff,  0,   0xff,  0
41  mmx_one:    dw 1, 1, 1, 1  mmx_one:    dw 1, 1, 1, 1
42    
# Line 81  Line 59 
59    
60    
61  %macro YUYV_TO_YV12             2  %macro YUYV_TO_YV12             2
62    movq mm0, [edi]               ; x_ptr[0]    movq mm0, [x_ptr]               ; x_ptr[0]
63    movq mm1, [edi + 8]           ; x_ptr[8]    movq mm1, [x_ptr + 8]           ; x_ptr[8]
64    movq mm2, [edi + edx]         ; x_ptr[x_stride + 0]    movq mm2, [x_ptr + x_stride]         ; x_ptr[x_stride + 0]
65    movq mm3, [edi + edx + 8]     ; x_ptr[x_stride + 8]    movq mm3, [x_ptr + x_stride + 8]     ; x_ptr[x_stride + 8]
66    
67      ; average uv-components      ; average uv-components
68  ;---[ plain mmx ]----------------------------------------------------  ;---[ plain mmx ]----------------------------------------------------
# Line 150  Line 128 
128    packuswb mm2, mm3    packuswb mm2, mm3
129    
130  %ifidn %2,pavgb         ; xmm  %ifidn %2,pavgb         ; xmm
131    movntq [esi], mm0    movntq [y_ptr], mm0
132    movntq [esi+eax], mm2    movntq [y_ptr+y_stride], mm2
133  %else                   ; plain mmx,3dnow  %else                   ; plain mmx,3dnow
134    movq [esi], mm0    movq [y_ptr], mm0
135    movq [esi+eax], mm2    movq [y_ptr+y_stride], mm2
136  %endif  %endif
137    
138      ; write uv-components      ; write uv-components
# Line 165  Line 143 
143    pand mm4, mm7    pand mm4, mm7
144    packuswb mm5,mm5    packuswb mm5,mm5
145    packuswb mm4,mm4    packuswb mm4,mm4
146    movd [ebx],mm5    movd [u_ptr],mm5
147    movd [ecx],mm4    movd [v_ptr],mm4
148  %endmacro  %endmacro
149    
150  ;-----------------------------------------------------------------------------  ;-----------------------------------------------------------------------------
151  ; YV12_TO_YUYV( TYPE )  ; YV12_TO_YUYV( TYPE )
152  ;  ;
153  ; TYPE  0=yuyv, 1=uyvy  ; bytes=2, pixels = 16, vpixels=2
 ;  
 ; bytes=2, pixels = 8, vpixels=2  
154  ;-----------------------------------------------------------------------------  ;-----------------------------------------------------------------------------
155    
156  %macro YV12_TO_YUYV_INIT        2  %macro YV12_TO_YUYV_INIT        2
# Line 182  Line 158 
158    
159    
160  %macro YV12_TO_YUYV             2  %macro YV12_TO_YUYV             2
161    movd mm4, [ebx]               ; [    |uuuu]    movq mm6, [u_ptr]               ; [    |uuuu]
162    movd mm5, [ecx]               ; [    |vvvv]    movq mm2, [v_ptr]               ; [    |vvvv]
163    movq mm0, [esi]               ; [yyyy|yyyy] ; y row 0    movq mm0, [y_ptr    ]           ; [yyyy|yyyy] ; y row 0
164    movq mm1, [esi+eax]           ; [yyyy|yyyy] ; y row 1    movq mm1, [y_ptr+y_stride]           ; [yyyy|yyyy] ; y row 1
165    punpcklbw mm4, mm5            ; [vuvu|vuvu] ; uv row 0    movq      mm7, mm6
166      punpcklbw mm6, mm2            ; [vuvu|vuvu] ; uv[0..3]
167      punpckhbw mm7, mm2            ; [vuvu|vuvu] ; uv[4..7]
168    
169  %if %1 == 0     ; YUYV  %if %1 == 0     ; YUYV
170    movq mm2, mm0    movq mm2, mm0
171    movq mm3, mm1    movq mm3, mm1
172    punpcklbw mm0, mm4            ; [vyuy|vyuy] ; y row 0 + 0    movq mm4, [y_ptr    +8]         ; [yyyy|yyyy] ; y[8..15] row 0
173    punpckhbw mm2, mm4            ; [vyuy|vyuy] ; y row 0 + 8    movq mm5, [y_ptr+y_stride+8]         ; [yyyy|yyyy] ; y[8..15] row 1
174    punpcklbw mm1, mm4            ; [vyuy|vyuy] ; y row 1 + 0    punpcklbw mm0, mm6            ; [vyuy|vyuy] ; y row 0 + 0
175    punpckhbw mm3, mm4            ; [vyuy|vyuy] ; y row 1 + 8    punpckhbw mm2, mm6            ; [vyuy|vyuy] ; y row 0 + 8
176    movq [edi], mm0    punpcklbw mm1, mm6            ; [vyuy|vyuy] ; y row 1 + 0
177    movq [edi+8], mm2    punpckhbw mm3, mm6            ; [vyuy|vyuy] ; y row 1 + 8
178    movq [edi+edx], mm1    movq [x_ptr      ], mm0
179    movq [edi+edx+8], mm3    movq [x_ptr+8    ], mm2
180      movq [x_ptr+x_stride  ], mm1
181      movq [x_ptr+x_stride+8], mm3
182      movq mm0, mm4
183      movq mm2, mm5
184      punpcklbw mm0, mm7            ; [vyuy|vyuy] ; y row 0 + 16
185      punpckhbw mm4, mm7            ; [vyuy|vyuy] ; y row 0 + 24
186      punpcklbw mm2, mm7            ; [vyuy|vyuy] ; y row 1 + 16
187      punpckhbw mm5, mm7            ; [vyuy|vyuy] ; y row 1 + 24
188      movq [x_ptr    +16], mm0
189      movq [x_ptr    +24], mm4
190      movq [x_ptr+x_stride+16], mm2
191      movq [x_ptr+x_stride+24], mm5
192  %else           ; UYVY  %else           ; UYVY
193    movq mm5, mm4    movq mm2, mm6
194    movq mm6, mm4    movq mm3, mm6
195    movq mm7, mm4    movq mm4, mm6
196    punpcklbw mm4, mm0            ; [yvyu|yvyu]   ; y row 0 + 0    punpcklbw mm2, mm0            ; [yvyu|yvyu]   ; y row 0 + 0
197    punpckhbw mm5, mm0            ; [yvyu|yvyu]   ; y row 0 + 8    punpckhbw mm3, mm0            ; [yvyu|yvyu]   ; y row 0 + 8
198    punpcklbw mm6, mm1            ; [yvyu|yvyu]   ; y row 1 + 0    movq mm0, [y_ptr    +8]         ; [yyyy|yyyy] ; y[8..15] row 0
199    punpckhbw mm7, mm1            ; [yvyu|yvyu]   ; y row 1 + 8    movq mm5, [y_ptr+y_stride+8]         ; [yyyy|yyyy] ; y[8..15] row 1
200    movq [edi], mm4    punpcklbw mm4, mm1            ; [yvyu|yvyu]   ; y row 1 + 0
201    movq [edi+8], mm5    punpckhbw mm6, mm1            ; [yvyu|yvyu]   ; y row 1 + 8
202    movq [edi+edx], mm6    movq [x_ptr      ], mm2
203    movq [edi+edx+8], mm7    movq [x_ptr    +8], mm3
204      movq [x_ptr+x_stride  ], mm4
205      movq [x_ptr+x_stride+8], mm6
206      movq mm2, mm7
207      movq mm3, mm7
208      movq mm6, mm7
209      punpcklbw mm2, mm0            ; [yvyu|yvyu]   ; y row 0 + 0
210      punpckhbw mm3, mm0            ; [yvyu|yvyu]   ; y row 0 + 8
211      punpcklbw mm6, mm5            ; [yvyu|yvyu]   ; y row 1 + 0
212      punpckhbw mm7, mm5            ; [yvyu|yvyu]   ; y row 1 + 8
213      movq [x_ptr    +16], mm2
214      movq [x_ptr    +24], mm3
215      movq [x_ptr+x_stride+16], mm6
216      movq [x_ptr+x_stride+24], mm7
217  %endif  %endif
218  %endmacro  %endmacro
219    
# Line 226  Line 229 
229  %endmacro  %endmacro
230    
231  %macro YV12_TO_YUYVI                2  %macro YV12_TO_YUYVI                2
232    xchg ebp, [uv_stride]  %ifdef ARCH_IS_X86_64
233    movd mm0, [ebx]               ; [    |uuuu]    mov TMP1d, prm_uv_stride
234    movd mm1, [ebx+ebp]           ; [    |uuuu]    movd mm0, [u_ptr]               ; [    |uuuu]
235    punpcklbw mm0, [ecx]          ; [vuvu|vuvu] ; uv row 0    movd mm1, [u_ptr+TMP1]          ; [    |uuuu]
236    punpcklbw mm1, [ecx+ebp]      ; [vuvu|vuvu] ; uv row 1    punpcklbw mm0, [v_ptr]          ; [vuvu|vuvu] ; uv row 0
237    xchg ebp, [uv_stride]    punpcklbw mm1, [v_ptr+TMP1]     ; [vuvu|vuvu] ; uv row 1
238    %else
239      xchg width, prm_uv_stride
240      movd mm0, [u_ptr]               ; [    |uuuu]
241      movd mm1, [u_ptr+width]         ; [    |uuuu]
242      punpcklbw mm0, [v_ptr]          ; [vuvu|vuvu] ; uv row 0
243      punpcklbw mm1, [v_ptr+width]    ; [vuvu|vuvu] ; uv row 1
244      xchg width, prm_uv_stride
245    %endif
246    
247  %if %1 == 0     ; YUYV  %if %1 == 0     ; YUYV
248    movq mm4, [esi]               ; [yyyy|yyyy] ; y row 0    movq mm4, [y_ptr]               ; [yyyy|yyyy] ; y row 0
249    movq mm6, [esi+eax]           ; [yyyy|yyyy] ; y row 1    movq mm6, [y_ptr+y_stride]           ; [yyyy|yyyy] ; y row 1
250    movq mm5, mm4    movq mm5, mm4
251    movq mm7, mm6    movq mm7, mm6
252    punpcklbw mm4, mm0            ; [yuyv|yuyv] ; y row 0 + 0    punpcklbw mm4, mm0            ; [yuyv|yuyv] ; y row 0 + 0
253    punpckhbw mm5, mm0            ; [yuyv|yuyv] ; y row 0 + 8    punpckhbw mm5, mm0            ; [yuyv|yuyv] ; y row 0 + 8
254    punpcklbw mm6, mm1            ; [yuyv|yuyv] ; y row 1 + 0    punpcklbw mm6, mm1            ; [yuyv|yuyv] ; y row 1 + 0
255    punpckhbw mm7, mm1            ; [yuyv|yuyv] ; y row 1 + 8    punpckhbw mm7, mm1            ; [yuyv|yuyv] ; y row 1 + 8
256    movq [edi], mm4    movq [x_ptr], mm4
257    movq [edi+8], mm5    movq [x_ptr+8], mm5
258    movq [edi+edx], mm6    movq [x_ptr+x_stride], mm6
259    movq [edi+edx+8], mm7    movq [x_ptr+x_stride+8], mm7
260    
261    push esi    push y_ptr
262    push edi    push x_ptr
263    add esi, eax    add y_ptr, y_stride
264    add edi, edx    add x_ptr, x_stride
265    movq mm4, [esi+eax]           ; [yyyy|yyyy] ; y row 2    movq mm4, [y_ptr+y_stride]           ; [yyyy|yyyy] ; y row 2
266    movq mm6, [esi+2*eax]         ; [yyyy|yyyy] ; y row 3    movq mm6, [y_ptr+2*y_stride]         ; [yyyy|yyyy] ; y row 3
267    movq mm5, mm4    movq mm5, mm4
268    movq mm7, mm6    movq mm7, mm6
269    punpcklbw mm4, mm0            ; [yuyv|yuyv] ; y row 2 + 0    punpcklbw mm4, mm0            ; [yuyv|yuyv] ; y row 2 + 0
270    punpckhbw mm5, mm0            ; [yuyv|yuyv] ; y row 2 + 8    punpckhbw mm5, mm0            ; [yuyv|yuyv] ; y row 2 + 8
271    punpcklbw mm6, mm1            ; [yuyv|yuyv] ; y row 3 + 0    punpcklbw mm6, mm1            ; [yuyv|yuyv] ; y row 3 + 0
272    punpckhbw mm7, mm1            ; [yuyv|yuyv] ; y row 3 + 8    punpckhbw mm7, mm1            ; [yuyv|yuyv] ; y row 3 + 8
273    movq [edi+edx], mm4    movq [x_ptr+x_stride], mm4
274    movq [edi+edx+8], mm5    movq [x_ptr+x_stride+8], mm5
275    movq [edi+2*edx], mm6    movq [x_ptr+2*x_stride], mm6
276    movq [edi+2*edx+8], mm7    movq [x_ptr+2*x_stride+8], mm7
277    pop edi    pop x_ptr
278    pop esi    pop y_ptr
279  %else           ; UYVY  %else           ; UYVY
280    movq mm2, [esi]               ; [yyyy|yyyy] ; y row 0    movq mm2, [y_ptr]               ; [yyyy|yyyy] ; y row 0
281    movq mm3, [esi+eax]           ; [yyyy|yyyy] ; y row 1    movq mm3, [y_ptr+y_stride]           ; [yyyy|yyyy] ; y row 1
282    movq mm4, mm0    movq mm4, mm0
283    movq mm5, mm0    movq mm5, mm0
284    movq mm6, mm1    movq mm6, mm1
# Line 276  Line 287 
287    punpckhbw mm5, mm2            ; [uyvy|uyvy] ; y row 0 + 8    punpckhbw mm5, mm2            ; [uyvy|uyvy] ; y row 0 + 8
288    punpcklbw mm6, mm3            ; [uyvy|uyvy] ; y row 1 + 0    punpcklbw mm6, mm3            ; [uyvy|uyvy] ; y row 1 + 0
289    punpckhbw mm7, mm3            ; [uyvy|uyvy] ; y row 1 + 8    punpckhbw mm7, mm3            ; [uyvy|uyvy] ; y row 1 + 8
290    movq [edi], mm4    movq [x_ptr], mm4
291    movq [edi+8], mm5    movq [x_ptr+8], mm5
292    movq [edi+edx], mm6    movq [x_ptr+x_stride], mm6
293    movq [edi+edx+8], mm7    movq [x_ptr+x_stride+8], mm7
294    
295    push esi    push y_ptr
296    push edi    push x_ptr
297    add esi, eax    add y_ptr, y_stride
298    add edi, edx    add x_ptr, x_stride
299    movq mm2, [esi+eax]           ; [yyyy|yyyy] ; y row 2    movq mm2, [y_ptr+y_stride]           ; [yyyy|yyyy] ; y row 2
300    movq mm3, [esi+2*eax]         ; [yyyy|yyyy] ; y row 3    movq mm3, [y_ptr+2*y_stride]         ; [yyyy|yyyy] ; y row 3
301    movq mm4, mm0    movq mm4, mm0
302    movq mm5, mm0    movq mm5, mm0
303    movq mm6, mm1    movq mm6, mm1
# Line 295  Line 306 
306    punpckhbw mm5, mm2            ; [uyvy|uyvy] ; y row 2 + 8    punpckhbw mm5, mm2            ; [uyvy|uyvy] ; y row 2 + 8
307    punpcklbw mm6, mm3            ; [uyvy|uyvy] ; y row 3 + 0    punpcklbw mm6, mm3            ; [uyvy|uyvy] ; y row 3 + 0
308    punpckhbw mm7, mm3            ; [uyvy|uyvy] ; y row 3 + 8    punpckhbw mm7, mm3            ; [uyvy|uyvy] ; y row 3 + 8
309    movq [edi+edx], mm4    movq [x_ptr+x_stride], mm4
310    movq [edi+edx+8], mm5    movq [x_ptr+x_stride+8], mm5
311    movq [edi+2*edx], mm6    movq [x_ptr+2*x_stride], mm6
312    movq [edi+2*edx+8], mm7    movq [x_ptr+2*x_stride+8], mm7
313    pop edi    pop x_ptr
314    pop esi    pop y_ptr
315  %endif  %endif
316  %endmacro  %endmacro
317    
# Line 308  Line 319 
319  ; Code  ; Code
320  ;=============================================================================  ;=============================================================================
321    
322  SECTION .text  SECTION .rotext align=SECTION_ALIGN
323    
324  %include "colorspace_mmx.inc"  %include "colorspace_mmx.inc"
325    
# Line 324  Line 335 
335    
336  ; output  ; output
337    
338  MAKE_COLORSPACE  yv12_to_yuyv_mmx,0,    2,8,2,  YV12_TO_YUYV, 0, -1  MAKE_COLORSPACE  yv12_to_yuyv_mmx,0,    2,16,2,  YV12_TO_YUYV, 0, -1
339  MAKE_COLORSPACE  yv12_to_uyvy_mmx,0,    2,8,2,  YV12_TO_YUYV, 1, -1  MAKE_COLORSPACE  yv12_to_uyvy_mmx,0,    2,16,2,  YV12_TO_YUYV, 1, -1
340    
341  MAKE_COLORSPACE  yv12_to_yuyvi_mmx,0,   2,8,4,  YV12_TO_YUYVI, 0, -1  MAKE_COLORSPACE  yv12_to_yuyvi_mmx,0,   2,8,4,  YV12_TO_YUYVI, 0, -1
342  MAKE_COLORSPACE  yv12_to_uyvyi_mmx,0,   2,8,4,  YV12_TO_YUYVI, 1, -1  MAKE_COLORSPACE  yv12_to_uyvyi_mmx,0,   2,8,4,  YV12_TO_YUYVI, 1, -1
343    
344    %ifidn __OUTPUT_FORMAT__,elf
345    section ".note.GNU-stack" noalloc noexec nowrite progbits
346    %endif
347    

Legend:
Removed from v.1535  
changed lines
  Added in v.1795

No admin address has been configured
ViewVC Help
Powered by ViewVC 1.0.4