[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 1794, Fri Nov 14 15:43:28 2008 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.9 2008-11-11 20:46:24 Isibaar 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 %1.endfunc-%1  
                         %define %1 _%1:function %1.endfunc-%1  
                         %define ENDFUNC .endfunc  
                 %else  
                         global _%1  
                         %define %1 _%1  
                         %define ENDFUNC  
                 %endif  
         %else  
                 %ifdef MARK_FUNCS  
                         global %1:function %1.endfunc-%1  
                         %define ENDFUNC .endfunc  
                 %else  
                         global %1  
                         %define ENDFUNC  
                 %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 85  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 154  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 169  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  ;-----------------------------------------------------------------------------  ;-----------------------------------------------------------------------------
# Line 184  Line 158 
158    
159    
160  %macro YV12_TO_YUYV             2  %macro YV12_TO_YUYV             2
161    movq mm6, [ebx]               ; [    |uuuu]    movq mm6, [u_ptr]               ; [    |uuuu]
162    movq mm2, [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    movq      mm7, mm6    movq      mm7, mm6
166    punpcklbw mm6, mm2            ; [vuvu|vuvu] ; uv[0..3]    punpcklbw mm6, mm2            ; [vuvu|vuvu] ; uv[0..3]
167    punpckhbw mm7, mm2            ; [vuvu|vuvu] ; uv[4..7]    punpckhbw mm7, mm2            ; [vuvu|vuvu] ; uv[4..7]
# Line 195  Line 169 
169  %if %1 == 0     ; YUYV  %if %1 == 0     ; YUYV
170    movq mm2, mm0    movq mm2, mm0
171    movq mm3, mm1    movq mm3, mm1
172    movq mm4, [esi    +8]         ; [yyyy|yyyy] ; y[8..15] row 0    movq mm4, [y_ptr    +8]         ; [yyyy|yyyy] ; y[8..15] row 0
173    movq mm5, [esi+eax+8]         ; [yyyy|yyyy] ; y[8..15] row 1    movq mm5, [y_ptr+y_stride+8]         ; [yyyy|yyyy] ; y[8..15] row 1
174    punpcklbw mm0, mm6            ; [vyuy|vyuy] ; y row 0 + 0    punpcklbw mm0, mm6            ; [vyuy|vyuy] ; y row 0 + 0
175    punpckhbw mm2, mm6            ; [vyuy|vyuy] ; y row 0 + 8    punpckhbw mm2, mm6            ; [vyuy|vyuy] ; y row 0 + 8
176    punpcklbw mm1, mm6            ; [vyuy|vyuy] ; y row 1 + 0    punpcklbw mm1, mm6            ; [vyuy|vyuy] ; y row 1 + 0
177    punpckhbw mm3, mm6            ; [vyuy|vyuy] ; y row 1 + 8    punpckhbw mm3, mm6            ; [vyuy|vyuy] ; y row 1 + 8
178    movq [edi      ], mm0    movq [x_ptr      ], mm0
179    movq [edi+8    ], mm2    movq [x_ptr+8    ], mm2
180    movq [edi+edx  ], mm1    movq [x_ptr+x_stride  ], mm1
181    movq [edi+edx+8], mm3    movq [x_ptr+x_stride+8], mm3
182    movq mm0, mm4    movq mm0, mm4
183    movq mm2, mm5    movq mm2, mm5
184    punpcklbw mm0, mm7            ; [vyuy|vyuy] ; y row 0 + 16    punpcklbw mm0, mm7            ; [vyuy|vyuy] ; y row 0 + 16
185    punpckhbw mm4, mm7            ; [vyuy|vyuy] ; y row 0 + 24    punpckhbw mm4, mm7            ; [vyuy|vyuy] ; y row 0 + 24
186    punpcklbw mm2, mm7            ; [vyuy|vyuy] ; y row 1 + 16    punpcklbw mm2, mm7            ; [vyuy|vyuy] ; y row 1 + 16
187    punpckhbw mm5, mm7            ; [vyuy|vyuy] ; y row 1 + 24    punpckhbw mm5, mm7            ; [vyuy|vyuy] ; y row 1 + 24
188    movq [edi    +16], mm0    movq [x_ptr    +16], mm0
189    movq [edi    +24], mm4    movq [x_ptr    +24], mm4
190    movq [edi+edx+16], mm2    movq [x_ptr+x_stride+16], mm2
191    movq [edi+edx+24], mm5    movq [x_ptr+x_stride+24], mm5
192  %else           ; UYVY  %else           ; UYVY
193    movq mm2, mm6    movq mm2, mm6
194    movq mm3, mm6    movq mm3, mm6
195    movq mm4, mm6    movq mm4, mm6
196    punpcklbw mm2, mm0            ; [yvyu|yvyu]   ; y row 0 + 0    punpcklbw mm2, mm0            ; [yvyu|yvyu]   ; y row 0 + 0
197    punpckhbw mm3, mm0            ; [yvyu|yvyu]   ; y row 0 + 8    punpckhbw mm3, mm0            ; [yvyu|yvyu]   ; y row 0 + 8
198    movq mm0, [esi    +8]         ; [yyyy|yyyy] ; y[8..15] row 0    movq mm0, [y_ptr    +8]         ; [yyyy|yyyy] ; y[8..15] row 0
199    movq mm5, [esi+eax+8]         ; [yyyy|yyyy] ; y[8..15] row 1    movq mm5, [y_ptr+y_stride+8]         ; [yyyy|yyyy] ; y[8..15] row 1
200    punpcklbw mm4, mm1            ; [yvyu|yvyu]   ; y row 1 + 0    punpcklbw mm4, mm1            ; [yvyu|yvyu]   ; y row 1 + 0
201    punpckhbw mm6, mm1            ; [yvyu|yvyu]   ; y row 1 + 8    punpckhbw mm6, mm1            ; [yvyu|yvyu]   ; y row 1 + 8
202    movq [edi      ], mm2    movq [x_ptr      ], mm2
203    movq [edi    +8], mm3    movq [x_ptr    +8], mm3
204    movq [edi+edx  ], mm4    movq [x_ptr+x_stride  ], mm4
205    movq [edi+edx+8], mm6    movq [x_ptr+x_stride+8], mm6
206    movq mm2, mm7    movq mm2, mm7
207    movq mm3, mm7    movq mm3, mm7
208    movq mm6, mm7    movq mm6, mm7
# Line 236  Line 210 
210    punpckhbw mm3, mm0            ; [yvyu|yvyu]   ; y row 0 + 8    punpckhbw mm3, mm0            ; [yvyu|yvyu]   ; y row 0 + 8
211    punpcklbw mm6, mm5            ; [yvyu|yvyu]   ; y row 1 + 0    punpcklbw mm6, mm5            ; [yvyu|yvyu]   ; y row 1 + 0
212    punpckhbw mm7, mm5            ; [yvyu|yvyu]   ; y row 1 + 8    punpckhbw mm7, mm5            ; [yvyu|yvyu]   ; y row 1 + 8
213    movq [edi    +16], mm2    movq [x_ptr    +16], mm2
214    movq [edi    +24], mm3    movq [x_ptr    +24], mm3
215    movq [edi+edx+16], mm6    movq [x_ptr+x_stride+16], mm6
216    movq [edi+edx+24], mm7    movq [x_ptr+x_stride+24], mm7
217  %endif  %endif
218  %endmacro  %endmacro
219    
# Line 255  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 305  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 324  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 337  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    

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

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