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

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

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

revision 851, Sat Feb 15 15:22:19 2003 UTC revision 1793, Tue Nov 11 20:46:24 2008 UTC
# Line 1  Line 1 
1  ;/**************************************************************************  ;/*****************************************************************************
2  ; *  ; *
3  ; *     XVID MPEG-4 VIDEO CODEC  ; *     XVID MPEG-4 VIDEO CODEC
4  ; *     colorspace rgb  ; *  - RGB colorspace conversions -
5    ; *
6    ; *  Copyright(C) 2002-2003 Michael Militzer <isibaar@xvid.org>
7    ; *               2002-2003 Peter Ross <pross@xvid.org>
8  ; *  ; *
9  ; *     This program is free software; you can redistribute it and/or modify  ; *     This program is free software; you can redistribute it and/or modify
10  ; *     it under the terms of the GNU General Public License as published by  ; *     it under the terms of the GNU General Public License as published by
# Line 15  Line 18 
18  ; *  ; *
19  ; *     You should have received a copy of the GNU General Public License  ; *     You should have received a copy of the GNU General Public License
20  ; *     along with this program; if not, write to the Free Software  ; *     along with this program; if not, write to the Free Software
21  ; *     Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.  ; *  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307 USA
22  ; *  ; *
23  ; *************************************************************************/  ; ****************************************************************************/
24    
25  ;/**************************************************************************  BITS 32
 ; *  
 ; *     History:  
 ; *  
 ; *     10.10.2001      initial version; (c)2002 peter ross <pross@xvid.org>  
 ; *  
 ; *************************************************************************/  
   
   
 bits 32  
26    
27  %macro cglobal 1  %macro cglobal 1
28          %ifdef PREFIX          %ifdef PREFIX
29                    %ifdef MARK_FUNCS
30                            global _%1:function %1.endfunc-%1
31                            %define %1 _%1:function %1.endfunc-%1
32                            %define ENDFUNC .endfunc
33                    %else
34                  global _%1                  global _%1
35                  %define %1 _%1                  %define %1 _%1
36                            %define ENDFUNC
37                    %endif
38            %else
39                    %ifdef MARK_FUNCS
40                            global %1:function %1.endfunc-%1
41                            %define ENDFUNC .endfunc
42          %else          %else
43                  global %1                  global %1
44                            %define ENDFUNC
45                    %endif
46          %endif          %endif
47  %endmacro  %endmacro
48    
49    ;=============================================================================
50    ; Some constants
51    ;=============================================================================
52    
53  section .data  ;-----------------------------------------------------------------------------
 align 16  
   
 ;===========================================================================  
54  ; RGB->YV12 yuv constants  ; RGB->YV12 yuv constants
55  ;===========================================================================  ;-----------------------------------------------------------------------------
56    
57  %define Y_R             0.257  %define Y_R             0.257
58  %define Y_G             0.504  %define Y_G             0.504
59  %define Y_B             0.098  %define Y_B             0.098
# Line 61  Line 69 
69  %define V_B             0.071  %define V_B             0.071
70  %define V_ADD   128  %define V_ADD   128
71    
72  ;===========================================================================  ; Scaling used during conversion
73  ; RGB->YV12 multiplication matrices  %define SCALEBITS 6
 ;===========================================================================  
 ;                               FIX(Y_B)        FIX(Y_G)        FIX(Y_R)  
 y_mul   dw               25,             129,            66,                    0  
 u_mul   dw               112,           -74,            -38,                    0  
 v_mul   dw              -18,            -94,             112,                   0  
74    
75    ;=============================================================================
76    ; Read only data
77    ;=============================================================================
78    
79  ;===========================================================================  %ifdef FORMAT_COFF
80  ; YV12->RGB data  SECTION .rodata
81  ;===========================================================================  %else
82  %define SCALEBITS 6  SECTION .rodata align=16
83  Y_SUB           dw  16,  16,  16,  16  %endif
84  U_SUB           dw 128, 128, 128, 128  ALIGN 16
85  V_SUB           dw 128, 128, 128, 128  
86    ;-----------------------------------------------------------------------------
87    ; RGB->YV12 multiplication matrices
88    ;-----------------------------------------------------------------------------
89    ;         FIX(Y_B)      FIX(Y_G)        FIX(Y_R) Ignored
90    
91  Y_MUL           dw  74,  74,  74,  74  bgr_y_mul: dw    25,      129,        66,      0
92    bgr_u_mul: dw   112,      -74,       -38,      0
93    bgr_v_mul: dw   -18,      -94,       112,      0
94    
95    ;-----------------------------------------------------------------------------
96    ; BGR->YV12 multiplication matrices
97    ;-----------------------------------------------------------------------------
98    ;         FIX(Y_R)      FIX(Y_G)        FIX(Y_B) Ignored
99    
100    rgb_y_mul: dw    66,      129,        25,      0
101    rgb_u_mul: dw   -38,      -74,       112,      0
102    rgb_v_mul: dw   112,      -94,       -18,      0
103    
104  UG_MUL          dw  25,  25,  25,  25  ;-----------------------------------------------------------------------------
105  VG_MUL          dw  52,  52,  52,  52  ; YV12->RGB data
106    ;-----------------------------------------------------------------------------
107    
108  UB_MUL          dw 129, 129, 129, 129  Y_SUB: dw  16,  16,  16,  16
109  VR_MUL          dw 102, 102, 102, 102  U_SUB: dw 128, 128, 128, 128
110    V_SUB: dw 128, 128, 128, 128
111    
112    Y_MUL: dw  74,  74,  74,  74
113    
114    UG_MUL: dw  25,  25,  25,  25
115    VG_MUL: dw  52,  52,  52,  52
116    
117  section .text  UB_MUL: dw 129, 129, 129, 129
118    VR_MUL: dw 102, 102, 102, 102
119    
120  %include "colorspace_mmx.inc"  BRIGHT: db 128, 128, 128, 128, 128, 128, 128, 128
121    
122    ;=============================================================================
123    ; Helper macros used with the colorspace_mmx.inc file
124    ;=============================================================================
125    
126  ;------------------------------------------------------------------------------  ;------------------------------------------------------------------------------
127  ; BGR_TO_YV12( BYTES )  ; BGR_TO_YV12( BYTES )
# Line 100  Line 130 
130  ;  ;
131  ; bytes=3/4, pixels = 2, vpixels=2  ; bytes=3/4, pixels = 2, vpixels=2
132  ;------------------------------------------------------------------------------  ;------------------------------------------------------------------------------
133    
134  %macro BGR_TO_YV12_INIT         2  %macro BGR_TO_YV12_INIT         2
135                  movq mm7, [y_mul]    movq mm7, [bgr_y_mul]
136  %endmacro  %endmacro
137    
138    
# Line 164  Line 195 
195                  mov [esi + eax + 1], dl                 ; y_ptr[y_stride + 1]                  mov [esi + eax + 1], dl                 ; y_ptr[y_stride + 1]
196    
197                  ; u_ptr, v_ptr                  ; u_ptr, v_ptr
   
198                  movq mm0, mm6                   ; = [  |b4|g4|r4]                  movq mm0, mm6                   ; = [  |b4|g4|r4]
199                  pmaddwd mm6, [v_mul]            ; *= V_MUL    pmaddwd mm6, [bgr_v_mul]          ; *= V_MUL
200                  pmaddwd mm0, [u_mul]            ; *= U_MUL    pmaddwd mm0, [bgr_u_mul]          ; *= U_MUL
201                  movq mm1, mm0                  movq mm1, mm0
202                  movq mm2, mm6                  movq mm2, mm6
203                  psrlq mm1, 32                  psrlq mm1, 32
# Line 187  Line 217 
217    
218                  pop edx                  pop edx
219  %endmacro  %endmacro
220    
221  ;------------------------------------------------------------------------------  ;------------------------------------------------------------------------------
222    ; RGB_TO_YV12( BYTES )
223    ;
224    ; BYTES         3=rgb(24bit), 4=rgba(32-bit)
225    ;
226    ; bytes=3/4, pixels = 2, vpixels=2
227    ;------------------------------------------------------------------------------
228    
229    %macro RGB_TO_YV12_INIT         2
230      movq mm7, [rgb_y_mul]
231    %endmacro
232    
233    
234    %macro RGB_TO_YV12                      2
235        ; y_out
236      pxor mm4, mm4
237      pxor mm5, mm5
238      movd mm0, [edi]               ; x_ptr[0...]
239      movd mm2, [edi+edx]           ; x_ptr[x_stride...]
240      punpcklbw mm0, mm4            ; [  |b |g |r ]
241      punpcklbw mm2, mm5            ; [  |b |g |r ]
242      movq mm6, mm0                 ; = [  |b4|g4|r4]
243      paddw mm6, mm2                ; +[  |b4|g4|r4]
244      pmaddwd mm0, mm7              ; *= Y_MUL
245      pmaddwd mm2, mm7              ; *= Y_MUL
246      movq mm4, mm0                 ; [r]
247      movq mm5, mm2                 ; [r]
248      psrlq mm4, 32                 ; +[g]
249      psrlq mm5, 32                 ; +[g]
250      paddd mm0, mm4                ; +[b]
251      paddd mm2, mm5                ; +[b]
252    
253      pxor mm4, mm4
254      pxor mm5, mm5
255      movd mm1, [edi+%1]            ; src[%1...]
256      movd mm3, [edi+edx+%1]        ; src[x_stride+%1...]
257      punpcklbw mm1, mm4            ; [  |b |g |r ]
258      punpcklbw mm3, mm5            ; [  |b |g |r ]
259      paddw mm6, mm1                ; +[  |b4|g4|r4]
260      paddw mm6, mm3                ; +[  |b4|g4|r4]
261      pmaddwd mm1, mm7              ; *= Y_MUL
262      pmaddwd mm3, mm7              ; *= Y_MUL
263      movq mm4, mm1                 ; [r]
264      movq mm5, mm3                 ; [r]
265      psrlq mm4, 32                 ; +[g]
266      psrlq mm5, 32                 ; +[g]
267      paddd mm1, mm4                ; +[b]
268      paddd mm3, mm5                ; +[b]
269    
270      push edx
271    
272      movd edx, mm0
273      shr edx, 8
274      add edx, Y_ADD
275      mov [esi], dl                 ; y_ptr[0]
276    
277      movd edx, mm1
278      shr edx, 8
279      add edx, Y_ADD
280      mov [esi + 1], dl             ; y_ptr[1]
281    
282      movd edx, mm2
283      shr edx, 8
284      add edx, Y_ADD
285      mov [esi + eax + 0], dl       ; y_ptr[y_stride + 0]
286    
287      movd edx, mm3
288      shr edx, 8
289      add edx, Y_ADD
290      mov [esi + eax + 1], dl       ; y_ptr[y_stride + 1]
291    
292      ; u_ptr, v_ptr
293      movq mm0, mm6                 ; = [  |b4|g4|r4]
294      pmaddwd mm6, [rgb_v_mul]          ; *= V_MUL
295      pmaddwd mm0, [rgb_u_mul]          ; *= U_MUL
296      movq mm1, mm0
297      movq mm2, mm6
298      psrlq mm1, 32
299      psrlq mm2, 32
300      paddd mm0, mm1
301      paddd mm2, mm6
302    
303      movd edx, mm0
304      shr edx, 10
305      add edx, U_ADD
306      mov [ebx], dl
307    
308      movd edx, mm2
309      shr edx, 10
310      add edx, V_ADD
311      mov [ecx], dl
312    
313      pop edx
314    %endmacro
315    
316  ;------------------------------------------------------------------------------  ;------------------------------------------------------------------------------
317  ; YV12_TO_BGR( BYTES )  ; YV12_TO_BGR( BYTES )
# Line 200  Line 320 
320  ;  ;
321  ; bytes=3/4, pixels = 8, vpixels=2  ; bytes=3/4, pixels = 8, vpixels=2
322  ;------------------------------------------------------------------------------  ;------------------------------------------------------------------------------
323    
324  %macro YV12_TO_BGR_INIT         2  %macro YV12_TO_BGR_INIT         2
325                  pxor mm7, mm7                   ; clear mm7                  pxor mm7, mm7                   ; clear mm7
326  %endmacro  %endmacro
327    
   
328  %macro YV12_TO_BGR                      2  %macro YV12_TO_BGR                      2
329  %define TEMP_Y1  esp  %define TEMP_Y1  esp
330  %define TEMP_Y2  esp + 8  %define TEMP_Y2  esp + 8
# Line 212  Line 332 
332  %define TEMP_G2  esp + 24  %define TEMP_G2  esp + 24
333  %define TEMP_B1  esp + 32  %define TEMP_B1  esp + 32
334  %define TEMP_B2  esp + 40  %define TEMP_B2  esp + 40
335    
336          movd mm2, [ebx]         ; u_ptr[0]          movd mm2, [ebx]         ; u_ptr[0]
337          movd mm3, [ecx]         ; v_ptr[0]          movd mm3, [ecx]         ; v_ptr[0]
   
338          punpcklbw mm2, mm7              ; u3u2u1u0 -> mm2          punpcklbw mm2, mm7              ; u3u2u1u0 -> mm2
339          punpcklbw mm3, mm7              ; v3v2v1v0 -> mm3          punpcklbw mm3, mm7              ; v3v2v1v0 -> mm3
   
340          psubsw mm2, [U_SUB]             ; U - 128          psubsw mm2, [U_SUB]             ; U - 128
341          psubsw mm3, [V_SUB]             ; V - 128          psubsw mm3, [V_SUB]             ; V - 128
   
342          movq mm4, mm2          movq mm4, mm2
343          movq mm5, mm3          movq mm5, mm3
   
344          pmullw mm2, [UG_MUL]          pmullw mm2, [UG_MUL]
345          pmullw mm3, [VG_MUL]          pmullw mm3, [VG_MUL]
   
346          movq mm6, mm2                   ; u3u2u1u0 -> mm6          movq mm6, mm2                   ; u3u2u1u0 -> mm6
347          punpckhwd mm2, mm2              ; u3u3u2u2 -> mm2          punpckhwd mm2, mm2              ; u3u3u2u2 -> mm2
348          punpcklwd mm6, mm6              ; u1u1u0u0 -> mm6          punpcklwd mm6, mm6              ; u1u1u0u0 -> mm6
   
349          pmullw mm4, [UB_MUL]            ; B_ADD -> mm4          pmullw mm4, [UB_MUL]            ; B_ADD -> mm4
   
350          movq mm0, mm3          movq mm0, mm3
351          punpckhwd mm3, mm3              ; v3v3v2v2 -> mm2          punpckhwd mm3, mm3              ; v3v3v2v2 -> mm2
352          punpcklwd mm0, mm0              ; v1v1v0v0 -> mm6          punpcklwd mm0, mm0              ; v1v1v0v0 -> mm6
   
353          paddsw mm2, mm3          paddsw mm2, mm3
354          paddsw mm6, mm0          paddsw mm6, mm0
   
355          pmullw mm5, [VR_MUL]            ; R_ADD -> mm5          pmullw mm5, [VR_MUL]            ; R_ADD -> mm5
   
356          movq mm0, [esi]                 ; y7y6y5y4y3y2y1y0 -> mm0          movq mm0, [esi]                 ; y7y6y5y4y3y2y1y0 -> mm0
   
357          movq mm1, mm0          movq mm1, mm0
358          punpckhbw mm1, mm7              ; y7y6y5y4 -> mm1          punpckhbw mm1, mm7              ; y7y6y5y4 -> mm1
359          punpcklbw mm0, mm7              ; y3y2y1y0 -> mm0          punpcklbw mm0, mm7              ; y3y2y1y0 -> mm0
   
360          psubsw mm0, [Y_SUB]             ; Y - Y_SUB          psubsw mm0, [Y_SUB]             ; Y - Y_SUB
361          psubsw mm1, [Y_SUB]             ; Y - Y_SUB          psubsw mm1, [Y_SUB]             ; Y - Y_SUB
   
362          pmullw mm1, [Y_MUL]          pmullw mm1, [Y_MUL]
363          pmullw mm0, [Y_MUL]          pmullw mm0, [Y_MUL]
   
364          movq [TEMP_Y2], mm1             ; y7y6y5y4 -> mm3          movq [TEMP_Y2], mm1             ; y7y6y5y4 -> mm3
365          movq [TEMP_Y1], mm0             ; y3y2y1y0 -> mm7          movq [TEMP_Y1], mm0             ; y3y2y1y0 -> mm7
   
366          psubsw mm1, mm2                 ; g7g6g5g4 -> mm1          psubsw mm1, mm2                 ; g7g6g5g4 -> mm1
367          psubsw mm0, mm6                 ; g3g2g1g0 -> mm0          psubsw mm0, mm6                 ; g3g2g1g0 -> mm0
   
368          psraw mm1, SCALEBITS          psraw mm1, SCALEBITS
369          psraw mm0, SCALEBITS          psraw mm0, SCALEBITS
   
370          packuswb mm0, mm1               ;g7g6g5g4g3g2g1g0 -> mm0          packuswb mm0, mm1               ;g7g6g5g4g3g2g1g0 -> mm0
   
371          movq [TEMP_G1], mm0          movq [TEMP_G1], mm0
   
372          movq mm0, [esi+eax]                     ; y7y6y5y4y3y2y1y0 -> mm0          movq mm0, [esi+eax]                     ; y7y6y5y4y3y2y1y0 -> mm0
   
373          movq mm1, mm0          movq mm1, mm0
   
374          punpckhbw mm1, mm7              ; y7y6y5y4 -> mm1          punpckhbw mm1, mm7              ; y7y6y5y4 -> mm1
375          punpcklbw mm0, mm7              ; y3y2y1y0 -> mm0          punpcklbw mm0, mm7              ; y3y2y1y0 -> mm0
   
376          psubsw mm0, [Y_SUB]             ; Y - Y_SUB          psubsw mm0, [Y_SUB]             ; Y - Y_SUB
377          psubsw mm1, [Y_SUB]             ; Y - Y_SUB          psubsw mm1, [Y_SUB]             ; Y - Y_SUB
   
378          pmullw mm1, [Y_MUL]          pmullw mm1, [Y_MUL]
379          pmullw mm0, [Y_MUL]          pmullw mm0, [Y_MUL]
   
380          movq mm3, mm1          movq mm3, mm1
381          psubsw mm1, mm2                 ; g7g6g5g4 -> mm1          psubsw mm1, mm2                 ; g7g6g5g4 -> mm1
   
382          movq mm2, mm0          movq mm2, mm0
383          psubsw mm0, mm6                 ; g3g2g1g0 -> mm0          psubsw mm0, mm6                 ; g3g2g1g0 -> mm0
   
384          psraw mm1, SCALEBITS          psraw mm1, SCALEBITS
385          psraw mm0, SCALEBITS          psraw mm0, SCALEBITS
   
386          packuswb mm0, mm1               ; g7g6g5g4g3g2g1g0 -> mm0          packuswb mm0, mm1               ; g7g6g5g4g3g2g1g0 -> mm0
   
387          movq [TEMP_G2], mm0          movq [TEMP_G2], mm0
   
388          movq mm0, mm4          movq mm0, mm4
389          punpckhwd mm4, mm4              ; u3u3u2u2 -> mm2          punpckhwd mm4, mm4              ; u3u3u2u2 -> mm2
390          punpcklwd mm0, mm0              ; u1u1u0u0 -> mm6          punpcklwd mm0, mm0              ; u1u1u0u0 -> mm6
   
391          movq mm1, mm3                   ; y7y6y5y4 -> mm1          movq mm1, mm3                   ; y7y6y5y4 -> mm1
392          paddsw mm3, mm4                 ; b7b6b5b4 -> mm3          paddsw mm3, mm4                 ; b7b6b5b4 -> mm3
   
393          movq mm7, mm2                   ; y3y2y1y0 -> mm7          movq mm7, mm2                   ; y3y2y1y0 -> mm7
   
394          paddsw mm2, mm0                 ; b3b2b1b0 -> mm2          paddsw mm2, mm0                 ; b3b2b1b0 -> mm2
   
395          psraw mm3, SCALEBITS          psraw mm3, SCALEBITS
396          psraw mm2, SCALEBITS          psraw mm2, SCALEBITS
   
397          packuswb mm2, mm3               ; b7b6b5b4b3b2b1b0 -> mm2          packuswb mm2, mm3               ; b7b6b5b4b3b2b1b0 -> mm2
   
398          movq [TEMP_B2], mm2          movq [TEMP_B2], mm2
   
399          movq mm3, [TEMP_Y2]          movq mm3, [TEMP_Y2]
400          movq mm2, [TEMP_Y1]          movq mm2, [TEMP_Y1]
   
401          movq mm6, mm3                   ; TEMP_Y2 -> mm6          movq mm6, mm3                   ; TEMP_Y2 -> mm6
402          paddsw mm3, mm4                 ; b7b6b5b4 -> mm3          paddsw mm3, mm4                 ; b7b6b5b4 -> mm3
   
403          movq mm4, mm2                   ; TEMP_Y1 -> mm4          movq mm4, mm2                   ; TEMP_Y1 -> mm4
404          paddsw mm2, mm0                 ; b3b2b1b0 -> mm2          paddsw mm2, mm0                 ; b3b2b1b0 -> mm2
   
405          psraw mm3, SCALEBITS          psraw mm3, SCALEBITS
406          psraw mm2, SCALEBITS          psraw mm2, SCALEBITS
   
407          packuswb mm2, mm3               ; b7b6b5b4b3b2b1b0 -> mm2          packuswb mm2, mm3               ; b7b6b5b4b3b2b1b0 -> mm2
   
408          movq [TEMP_B1], mm2          movq [TEMP_B1], mm2
   
409          movq mm0, mm5          movq mm0, mm5
410          punpckhwd mm5, mm5              ; v3v3v2v2 -> mm5          punpckhwd mm5, mm5              ; v3v3v2v2 -> mm5
411          punpcklwd mm0, mm0              ; v1v1v0v0 -> mm0          punpcklwd mm0, mm0              ; v1v1v0v0 -> mm0
   
412          paddsw mm1, mm5                 ; r7r6r5r4 -> mm1          paddsw mm1, mm5                 ; r7r6r5r4 -> mm1
413          paddsw mm7, mm0                 ; r3r2r1r0 -> mm7          paddsw mm7, mm0                 ; r3r2r1r0 -> mm7
   
414          psraw mm1, SCALEBITS          psraw mm1, SCALEBITS
415          psraw mm7, SCALEBITS          psraw mm7, SCALEBITS
   
416          packuswb mm7, mm1               ; r7r6r5r4r3r2r1r0 -> mm7 (TEMP_R2)          packuswb mm7, mm1               ; r7r6r5r4r3r2r1r0 -> mm7 (TEMP_R2)
   
417          paddsw mm6, mm5                 ; r7r6r5r4 -> mm6          paddsw mm6, mm5                 ; r7r6r5r4 -> mm6
418          paddsw mm4, mm0                 ; r3r2r1r0 -> mm4          paddsw mm4, mm0                 ; r3r2r1r0 -> mm4
   
419          psraw mm6, SCALEBITS          psraw mm6, SCALEBITS
420          psraw mm4, SCALEBITS          psraw mm4, SCALEBITS
   
421          packuswb mm4, mm6               ; r7r6r5r4r3r2r1r0 -> mm4 (TEMP_R1)          packuswb mm4, mm6               ; r7r6r5r4r3r2r1r0 -> mm4 (TEMP_R1)
   
422          movq mm0, [TEMP_B1]          movq mm0, [TEMP_B1]
423          movq mm1, [TEMP_G1]          movq mm1, [TEMP_G1]
   
424          movq mm6, mm7          movq mm6, mm7
   
425          movq mm2, mm0          movq mm2, mm0
426          punpcklbw mm2, mm4              ; r3b3r2b2r1b1r0b0 -> mm2          punpcklbw mm2, mm4              ; r3b3r2b2r1b1r0b0 -> mm2
427          punpckhbw mm0, mm4              ; r7b7r6b6r5b5r4b4 -> mm0          punpckhbw mm0, mm4              ; r7b7r6b6r5b5r4b4 -> mm0
   
428          pxor mm7, mm7          pxor mm7, mm7
   
429          movq mm3, mm1          movq mm3, mm1
430          punpcklbw mm1, mm7              ; 0g30g20g10g0 -> mm1          punpcklbw mm1, mm7              ; 0g30g20g10g0 -> mm1
431          punpckhbw mm3, mm7              ; 0g70g60g50g4 -> mm3          punpckhbw mm3, mm7              ; 0g70g60g50g4 -> mm3
   
432          movq mm4, mm2          movq mm4, mm2
433          punpcklbw mm2, mm1              ; 0r1g1b10r0g0b0 -> mm2          punpcklbw mm2, mm1              ; 0r1g1b10r0g0b0 -> mm2
434          punpckhbw mm4, mm1              ; 0r3g3b30r2g2b2 -> mm4          punpckhbw mm4, mm1              ; 0r3g3b30r2g2b2 -> mm4
   
435          movq mm5, mm0          movq mm5, mm0
436          punpcklbw mm0, mm3              ; 0r5g5b50r4g4b4 -> mm0          punpcklbw mm0, mm3              ; 0r5g5b50r4g4b4 -> mm0
437          punpckhbw mm5, mm3              ; 0r7g7b70r6g6b6 -> mm5          punpckhbw mm5, mm3              ; 0r7g7b70r6g6b6 -> mm5
   
438  %if %1 == 3             ; BGR (24-bit)  %if %1 == 3             ; BGR (24-bit)
439          movd [edi], mm2          movd [edi], mm2
440          psrlq mm2, 32          psrlq mm2, 32
   
441          movd [edi + 3], mm2          movd [edi + 3], mm2
442          movd [edi + 6], mm4          movd [edi + 6], mm4
   
443          psrlq mm4, 32          psrlq mm4, 32
   
444          movd [edi + 9], mm4          movd [edi + 9], mm4
445          movd [edi + 12], mm0          movd [edi + 12], mm0
   
446          psrlq mm0, 32          psrlq mm0, 32
   
447          movd [edi + 15], mm0          movd [edi + 15], mm0
448          movd [edi + 18], mm5    movq mm2, mm5
449      psrlq mm0, 8              ; 000000r5g5 -> mm0
450          psrlq mm5, 32    psllq mm2, 32             ; 0r6g6b60000 -> mm2
451      psrlq mm5, 32             ; 00000r7g7b7 -> mm5
452          movd [edi + 21], mm5    psrlq mm2, 16             ; 000r6g6b600 -> mm2
453      por mm0, mm2              ; 000r6g6b6r5g5 -> mm0
454      psllq mm5, 40             ; r7g7b700000 -> mm5
455      por mm5, mm0              ; r7g7b7r6g6b6r5g5 -> mm5
456      movq [edi + 16], mm5
457          movq mm0, [TEMP_B2]          movq mm0, [TEMP_B2]
458          movq mm1, [TEMP_G2]          movq mm1, [TEMP_G2]
   
459          movq mm2, mm0          movq mm2, mm0
460          punpcklbw mm2, mm6              ; r3b3r2b2r1b1r0b0 -> mm2          punpcklbw mm2, mm6              ; r3b3r2b2r1b1r0b0 -> mm2
461          punpckhbw mm0, mm6              ; r7b7r6b6r5b5r4b4 -> mm0          punpckhbw mm0, mm6              ; r7b7r6b6r5b5r4b4 -> mm0
   
462          movq mm3, mm1          movq mm3, mm1
463          punpcklbw mm1, mm7              ; 0g30g20g10g0 -> mm1          punpcklbw mm1, mm7              ; 0g30g20g10g0 -> mm1
464          punpckhbw mm3, mm7              ; 0g70g60g50g4 -> mm3          punpckhbw mm3, mm7              ; 0g70g60g50g4 -> mm3
   
465          movq mm4, mm2          movq mm4, mm2
466          punpcklbw mm2, mm1              ; 0r1g1b10r0g0b0 -> mm2          punpcklbw mm2, mm1              ; 0r1g1b10r0g0b0 -> mm2
467          punpckhbw mm4, mm1              ; 0r3g3b30r2g2b2 -> mm4          punpckhbw mm4, mm1              ; 0r3g3b30r2g2b2 -> mm4
   
468          movq mm5, mm0          movq mm5, mm0
469          punpcklbw mm0, mm3              ; 0r5g5b50r4g4b4 -> mm0          punpcklbw mm0, mm3              ; 0r5g5b50r4g4b4 -> mm0
470          punpckhbw mm5, mm3              ; 0r7g7b70r6g6b6 -> mm5          punpckhbw mm5, mm3              ; 0r7g7b70r6g6b6 -> mm5
   
471          movd [edi+edx], mm2          movd [edi+edx], mm2
472          psrlq mm2, 32          psrlq mm2, 32
   
473          movd [edi+edx + 3], mm2          movd [edi+edx + 3], mm2
474          movd [edi+edx + 6], mm4          movd [edi+edx + 6], mm4
   
475          psrlq mm4, 32          psrlq mm4, 32
   
476          movd [edi+edx + 9], mm4          movd [edi+edx + 9], mm4
477          movd [edi+edx + 12], mm0          movd [edi+edx + 12], mm0
   
478          psrlq mm0, 32          psrlq mm0, 32
   
479          movd [edi+edx + 15], mm0          movd [edi+edx + 15], mm0
480          movd [edi+edx + 18], mm5    movq mm2, mm5
481      psrlq mm0, 8              ; 000000r5g5 -> mm0
482          psrlq mm5, 32    psllq mm2, 32             ; 0r6g6b60000 -> mm2
483      psrlq mm5, 32             ; 00000r7g7b7 -> mm5
484          movd [edi+edx + 21], mm5    psrlq mm2, 16             ; 000r6g6b600 -> mm2
485      por mm0, mm2              ; 000r6g6b6r5g5 -> mm0
486      psllq mm5, 40             ; r7g7b700000 -> mm5
487      por mm5, mm0              ; r7g7b7r6g6b6r5g5 -> mm5
488      movq [edi + edx + 16], mm5
489    
490  %else           ; BGRA (32-bit)  %else           ; BGRA (32-bit)
491          movq [edi], mm2          movq [edi], mm2
492          movq [edi + 8], mm4          movq [edi + 8], mm4
493          movq [edi + 16], mm0          movq [edi + 16], mm0
494          movq [edi + 24], mm5          movq [edi + 24], mm5
   
495          movq mm0, [TEMP_B2]          movq mm0, [TEMP_B2]
496          movq mm1, [TEMP_G2]          movq mm1, [TEMP_G2]
   
497          movq mm2, mm0          movq mm2, mm0
498          punpcklbw mm2, mm6              ; r3b3r2b2r1b1r0b0 -> mm2          punpcklbw mm2, mm6              ; r3b3r2b2r1b1r0b0 -> mm2
499          punpckhbw mm0, mm6              ; r7b7r6b6r5b5r4b4 -> mm0          punpckhbw mm0, mm6              ; r7b7r6b6r5b5r4b4 -> mm0
   
500          movq mm3, mm1          movq mm3, mm1
501          punpcklbw mm1, mm7              ; 0g30g20g10g0 -> mm1          punpcklbw mm1, mm7              ; 0g30g20g10g0 -> mm1
502          punpckhbw mm3, mm7              ; 0g70g60g50g4 -> mm3          punpckhbw mm3, mm7              ; 0g70g60g50g4 -> mm3
   
503          movq mm4, mm2          movq mm4, mm2
504          punpcklbw mm2, mm1              ; 0r1g1b10r0g0b0 -> mm2          punpcklbw mm2, mm1              ; 0r1g1b10r0g0b0 -> mm2
505          punpckhbw mm4, mm1              ; 0r3g3b30r2g2b2 -> mm4          punpckhbw mm4, mm1              ; 0r3g3b30r2g2b2 -> mm4
   
506          movq mm5, mm0          movq mm5, mm0
507          punpcklbw mm0, mm3              ; 0r5g5b50r4g4b4 -> mm0          punpcklbw mm0, mm3              ; 0r5g5b50r4g4b4 -> mm0
508          punpckhbw mm5, mm3              ; 0r7g7b70r6g6b6 -> mm5          punpckhbw mm5, mm3              ; 0r7g7b70r6g6b6 -> mm5
   
509          movq [edi + edx], mm2          movq [edi + edx], mm2
510          movq [edi + edx + 8], mm4          movq [edi + edx + 8], mm4
511          movq [edi + edx + 16], mm0          movq [edi + edx + 16], mm0
# Line 468  Line 519 
519  %undef TEMP_B1  %undef TEMP_B1
520  %undef TEMP_B2  %undef TEMP_B2
521  %endmacro  %endmacro
 ;------------------------------------------------------------------------------  
522    
523    ;=============================================================================
524    ; Code
525    ;=============================================================================
526    
527    SECTION .text
528    
529    %include "colorspace_mmx.inc"
530    
531  ; input  ; input
   
532  MAKE_COLORSPACE  bgr_to_yv12_mmx,0,    3,2,2,  BGR_TO_YV12,  3, -1  MAKE_COLORSPACE  bgr_to_yv12_mmx,0,    3,2,2,  BGR_TO_YV12,  3, -1
533  MAKE_COLORSPACE  bgra_to_yv12_mmx,0,   4,2,2,  BGR_TO_YV12,  4, -1  MAKE_COLORSPACE  bgra_to_yv12_mmx,0,   4,2,2,  BGR_TO_YV12,  4, -1
534    MAKE_COLORSPACE  rgb_to_yv12_mmx,0,    3,2,2,  RGB_TO_YV12,  3, -1
535    MAKE_COLORSPACE  rgba_to_yv12_mmx,0,   4,2,2,  RGB_TO_YV12,  4, -1
536    
537  ; output  ; output
   
538  MAKE_COLORSPACE  yv12_to_bgr_mmx,48,   3,8,2,  YV12_TO_BGR,  3, -1  MAKE_COLORSPACE  yv12_to_bgr_mmx,48,   3,8,2,  YV12_TO_BGR,  3, -1
539  MAKE_COLORSPACE  yv12_to_bgra_mmx,48,  4,8,2,  YV12_TO_BGR,  4, -1  MAKE_COLORSPACE  yv12_to_bgra_mmx,48,  4,8,2,  YV12_TO_BGR,  4, -1
540    
541    
542    %ifidn __OUTPUT_FORMAT__,elf
543    section ".note.GNU-stack" noalloc noexec nowrite progbits
544    %endif
545    

Legend:
Removed from v.851  
changed lines
  Added in v.1793

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