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

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

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

revision 1.1.2.1, Sun Nov 3 04:51:33 2002 UTC revision 1.10, Wed Nov 26 01:04:34 2008 UTC
# Line 1  Line 1 
1  ;/**************************************************************************  ;/*****************************************************************************
2  ; *  ; *
3  ; *     XVID MPEG-4 VIDEO CODEC  ; *     XVID MPEG-4 VIDEO CODEC
4  ; *     colorspace  ; *  - RGB colorspace conversions -
5    ; *
6    ; *  Copyright(C) 2002-2008 Michael Militzer <michael@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  ; *     History:  ; ****************************************************************************/
 ; *  
 ; *     10.10.2001      initial version; (c)2002 peter ross <pross@xvid.org>  
 ; *  
 ; *************************************************************************/  
24    
25    %include "nasm.inc"
26    
27  bits 32  ;=============================================================================
28    ; Some constants
29    ;=============================================================================
30    
31  %macro cglobal 1  ;-----------------------------------------------------------------------------
         %ifdef PREFIX  
                 global _%1  
                 %define %1 _%1  
         %else  
                 global %1  
         %endif  
 %endmacro  
   
   
 section .data  
 align 16  
   
 ;===========================================================================  
32  ; RGB->YV12 yuv constants  ; RGB->YV12 yuv constants
33  ;===========================================================================  ;-----------------------------------------------------------------------------
34    
35  %define Y_R             0.257  %define Y_R             0.257
36  %define Y_G             0.504  %define Y_G             0.504
37  %define Y_B             0.098  %define Y_B             0.098
# Line 61  Line 47 
47  %define V_B             0.071  %define V_B             0.071
48  %define V_ADD   128  %define V_ADD   128
49    
50  ;===========================================================================  ; Scaling used during conversion
51  ; 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  
52    
53    ;=============================================================================
54    ; Read only data
55    ;=============================================================================
56    
57  ;===========================================================================  DATA
58  ; YV12->RGB data  
59  ;===========================================================================  ALIGN SECTION_ALIGN
 %define SCALEBITS 6  
 Y_SUB           dw  16,  16,  16,  16  
 U_SUB           dw 128, 128, 128, 128  
 V_SUB           dw 128, 128, 128, 128  
60    
61  Y_MUL           dw  74,  74,  74,  74  ;-----------------------------------------------------------------------------
62    ; RGB->YV12 multiplication matrices
63    ;-----------------------------------------------------------------------------
64    ;         FIX(Y_B)      FIX(Y_G)        FIX(Y_R) Ignored
65    
66  UG_MUL          dw  25,  25,  25,  25  bgr_y_mul: dw    25,      129,        66,      0
67  VG_MUL          dw  52,  52,  52,  52  bgr_u_mul: dw   112,      -74,       -38,      0
68    bgr_v_mul: dw   -18,      -94,       112,      0
69    
70    ;-----------------------------------------------------------------------------
71    ; BGR->YV12 multiplication matrices
72    ;-----------------------------------------------------------------------------
73    ;         FIX(Y_R)      FIX(Y_G)        FIX(Y_B) Ignored
74    
75    rgb_y_mul: dw    66,      129,        25,      0
76    rgb_u_mul: dw   -38,      -74,       112,      0
77    rgb_v_mul: dw   112,      -94,       -18,      0
78    
79  UB_MUL          dw 129, 129, 129, 129  ;-----------------------------------------------------------------------------
80  VR_MUL          dw 102, 102, 102, 102  ; YV12->RGB data
81    ;-----------------------------------------------------------------------------
82    
83    Y_SUB: dw  16,  16,  16,  16
84    U_SUB: dw 128, 128, 128, 128
85    V_SUB: dw 128, 128, 128, 128
86    
87    Y_MUL: dw  74,  74,  74,  74
88    
89  section .text  UG_MUL: dw  25,  25,  25,  25
90    VG_MUL: dw  52,  52,  52,  52
91    
92  %include "colorspace_mmx.inc"  UB_MUL: dw 129, 129, 129, 129
93    VR_MUL: dw 102, 102, 102, 102
94    
95    BRIGHT: db 128, 128, 128, 128, 128, 128, 128, 128
96    
97    ;=============================================================================
98    ; Helper macros used with the colorspace_mmx.inc file
99    ;=============================================================================
100    
101  ;------------------------------------------------------------------------------  ;------------------------------------------------------------------------------
102  ; RGB_TO_YV12( BYTES )  ; BGR_TO_YV12( BYTES )
103  ;  ;
104  ; BYTES         3=rgb24, 4=rgb32  ; BYTES         3=bgr(24bit), 4=bgra(32-bit)
105  ;  ;
106  ; bytes=3/4, pixels = 2, vpixels=2  ; bytes=3/4, pixels = 2, vpixels=2
107  ;------------------------------------------------------------------------------  ;------------------------------------------------------------------------------
108  %macro RGB_TO_YV12_INIT         2  
109                  movq mm7, [y_mul]  %macro BGR_TO_YV12_INIT         2
110      movq mm7, [bgr_y_mul]
111  %endmacro  %endmacro
112    
113    
114  %macro RGB_TO_YV12                      2  %macro BGR_TO_YV12                      2
115                  ; y_out                  ; y_out
116    
117                  pxor mm4, mm4                  pxor mm4, mm4
118                  pxor mm5, mm5                  pxor mm5, mm5
119                  movd mm0, [edi]                 ; x_ptr[0...]    movd mm0, [x_ptr]               ; x_ptr[0...]
120                  movd mm2, [edi+edx]             ; x_ptr[x_stride...]    movd mm2, [x_ptr+x_stride]           ; x_ptr[x_stride...]
121                  punpcklbw mm0, mm4              ; [  |b |g |r ]                  punpcklbw mm0, mm4              ; [  |b |g |r ]
122                  punpcklbw mm2, mm5              ; [  |b |g |r ]                  punpcklbw mm2, mm5              ; [  |b |g |r ]
123                  movq mm6, mm0                   ; = [  |b4|g4|r4]                  movq mm6, mm0                   ; = [  |b4|g4|r4]
# Line 126  Line 133 
133    
134                  pxor mm4, mm4                  pxor mm4, mm4
135                  pxor mm5, mm5                  pxor mm5, mm5
136                  movd mm1, [edi+%1]              ; src[%1...]    movd mm1, [x_ptr+%1]            ; src[%1...]
137                  movd mm3, [edi+edx+%1]  ; src[x_stride+%1...]    movd mm3, [x_ptr+x_stride+%1]        ; src[x_stride+%1...]
138                  punpcklbw mm1, mm4              ; [  |b |g |r ]                  punpcklbw mm1, mm4              ; [  |b |g |r ]
139                  punpcklbw mm3, mm5              ; [  |b |g |r ]                  punpcklbw mm3, mm5              ; [  |b |g |r ]
140                  paddw mm6, mm1                  ; +[  |b4|g4|r4]                  paddw mm6, mm1                  ; +[  |b4|g4|r4]
# Line 141  Line 148 
148                  paddd mm1, mm4                  ; +[b]                  paddd mm1, mm4                  ; +[b]
149                  paddd mm3, mm5                  ; +[b]                  paddd mm3, mm5                  ; +[b]
150    
151                  push    edx    push x_stride
152    
153                  movd edx, mm0    movd x_stride_d, mm0
154                  shr edx, 8    shr x_stride, 8
155                  add edx, Y_ADD    add x_stride, Y_ADD
156                  mov [esi], dl                   ; y_ptr[0]    mov [y_ptr], dl                 ; y_ptr[0]
157    
158                  movd edx, mm1    movd x_stride_d, mm1
159                  shr edx, 8    shr x_stride, 8
160                  add edx, Y_ADD    add x_stride, Y_ADD
161                  mov [esi + 1], dl               ; y_ptr[1]    mov [y_ptr + 1], dl             ; y_ptr[1]
162    
163                  movd edx, mm2    movd x_stride_d, mm2
164                  shr edx, 8    shr x_stride, 8
165                  add edx, Y_ADD    add x_stride, Y_ADD
166                  mov [esi + eax + 0], dl                 ; y_ptr[y_stride + 0]    mov [y_ptr + y_stride + 0], dl       ; y_ptr[y_stride + 0]
167    
168                  movd edx, mm3    movd x_stride_d, mm3
169                  shr edx, 8    shr x_stride, 8
170                  add edx, Y_ADD    add x_stride, Y_ADD
171                  mov [esi + eax + 1], dl                 ; y_ptr[y_stride + 1]    mov [y_ptr + y_stride + 1], dl       ; y_ptr[y_stride + 1]
172    
173                  ; u_ptr, v_ptr                  ; u_ptr, v_ptr
   
174                  movq mm0, mm6                   ; = [  |b4|g4|r4]                  movq mm0, mm6                   ; = [  |b4|g4|r4]
175                  pmaddwd mm6, [v_mul]            ; *= V_MUL    pmaddwd mm6, [bgr_v_mul]          ; *= V_MUL
176                  pmaddwd mm0, [u_mul]            ; *= U_MUL    pmaddwd mm0, [bgr_u_mul]          ; *= U_MUL
177                  movq mm1, mm0                  movq mm1, mm0
178                  movq mm2, mm6                  movq mm2, mm6
179                  psrlq mm1, 32                  psrlq mm1, 32
# Line 175  Line 181 
181                  paddd mm0, mm1                  paddd mm0, mm1
182                  paddd mm2, mm6                  paddd mm2, mm6
183    
184                  movd edx, mm0    movd x_stride_d, mm0
185                  shr edx, 10    shr x_stride, 10
186                  add edx, U_ADD    add x_stride, U_ADD
187                  mov [ebx], dl    mov [u_ptr], dl
188    
189                  movd edx, mm2    movd x_stride_d, mm2
190                  shr edx, 10    shr x_stride, 10
191                  add edx, V_ADD    add x_stride, V_ADD
192                  mov [ecx], dl    mov [v_ptr], dl
193    
194                  pop edx    pop x_stride
195  %endmacro  %endmacro
196    
197    ;------------------------------------------------------------------------------
198    ; RGB_TO_YV12( BYTES )
199    ;
200    ; BYTES         3=rgb(24bit), 4=rgba(32-bit)
201    ;
202    ; bytes=3/4, pixels = 2, vpixels=2
203  ;------------------------------------------------------------------------------  ;------------------------------------------------------------------------------
204    
205    %macro RGB_TO_YV12_INIT         2
206      movq mm7, [rgb_y_mul]
207    %endmacro
208    
209    
210    %macro RGB_TO_YV12                      2
211        ; y_out
212      pxor mm4, mm4
213      pxor mm5, mm5
214      movd mm0, [x_ptr]             ; x_ptr[0...]
215      movd mm2, [x_ptr+x_stride]    ; x_ptr[x_stride...]
216      punpcklbw mm0, mm4            ; [  |b |g |r ]
217      punpcklbw mm2, mm5            ; [  |b |g |r ]
218      movq mm6, mm0                 ; = [  |b4|g4|r4]
219      paddw mm6, mm2                ; +[  |b4|g4|r4]
220      pmaddwd mm0, mm7              ; *= Y_MUL
221      pmaddwd mm2, mm7              ; *= Y_MUL
222      movq mm4, mm0                 ; [r]
223      movq mm5, mm2                 ; [r]
224      psrlq mm4, 32                 ; +[g]
225      psrlq mm5, 32                 ; +[g]
226      paddd mm0, mm4                ; +[b]
227      paddd mm2, mm5                ; +[b]
228    
229      pxor mm4, mm4
230      pxor mm5, mm5
231      movd mm1, [x_ptr+%1]          ; src[%1...]
232      movd mm3, [x_ptr+x_stride+%1] ; src[x_stride+%1...]
233      punpcklbw mm1, mm4            ; [  |b |g |r ]
234      punpcklbw mm3, mm5            ; [  |b |g |r ]
235      paddw mm6, mm1                ; +[  |b4|g4|r4]
236      paddw mm6, mm3                ; +[  |b4|g4|r4]
237      pmaddwd mm1, mm7              ; *= Y_MUL
238      pmaddwd mm3, mm7              ; *= Y_MUL
239      movq mm4, mm1                 ; [r]
240      movq mm5, mm3                 ; [r]
241      psrlq mm4, 32                 ; +[g]
242      psrlq mm5, 32                 ; +[g]
243      paddd mm1, mm4                ; +[b]
244      paddd mm3, mm5                ; +[b]
245    
246      push x_stride
247    
248      movd x_stride_d, mm0
249      shr x_stride, 8
250      add x_stride, Y_ADD
251      mov [y_ptr], dl                 ; y_ptr[0]
252    
253      movd x_stride_d, mm1
254      shr x_stride, 8
255      add x_stride, Y_ADD
256      mov [y_ptr + 1], dl             ; y_ptr[1]
257    
258      movd x_stride_d, mm2
259      shr x_stride, 8
260      add x_stride, Y_ADD
261      mov [y_ptr + y_stride + 0], dl       ; y_ptr[y_stride + 0]
262    
263      movd x_stride_d, mm3
264      shr x_stride, 8
265      add x_stride, Y_ADD
266      mov [y_ptr + y_stride + 1], dl       ; y_ptr[y_stride + 1]
267    
268      ; u_ptr, v_ptr
269      movq mm0, mm6                 ; = [  |b4|g4|r4]
270      pmaddwd mm6, [rgb_v_mul]          ; *= V_MUL
271      pmaddwd mm0, [rgb_u_mul]          ; *= U_MUL
272      movq mm1, mm0
273      movq mm2, mm6
274      psrlq mm1, 32
275      psrlq mm2, 32
276      paddd mm0, mm1
277      paddd mm2, mm6
278    
279      movd x_stride_d, mm0
280      shr x_stride, 10
281      add x_stride, U_ADD
282      mov [u_ptr], dl
283    
284      movd x_stride_d, mm2
285      shr x_stride, 10
286      add x_stride, V_ADD
287      mov [v_ptr], dl
288    
289      pop x_stride
290    %endmacro
291    
292  ;------------------------------------------------------------------------------  ;------------------------------------------------------------------------------
293  ; YV12_TO_RGB( BYTES )  ; YV12_TO_BGR( BYTES )
294  ;  ;
295  ; BYTES         3=rgb24, 4=rgb32  ; BYTES         3=bgr(24-bit), 4=bgra(32-bit)
296  ;  ;
297  ; bytes=3/4, pixels = 8, vpixels=2  ; bytes=3/4, pixels = 8, vpixels=2
298  ;------------------------------------------------------------------------------  ;------------------------------------------------------------------------------
299  %macro YV12_TO_RGB_INIT         2  
300    %macro YV12_TO_BGR_INIT         2
301                  pxor mm7, mm7                   ; clear mm7                  pxor mm7, mm7                   ; clear mm7
302  %endmacro  %endmacro
303    
304    %macro YV12_TO_BGR                      2
305    %define TEMP_Y1  _ESP
306    %define TEMP_Y2  _ESP + 8
307    %define TEMP_G1  _ESP + 16
308    %define TEMP_G2  _ESP + 24
309    %define TEMP_B1  _ESP + 32
310    %define TEMP_B2  _ESP + 40
311    
312  %macro YV12_TO_RGB                      2    movd mm2, [u_ptr]           ; u_ptr[0]
313  %define TEMP_Y1  esp    movd mm3, [v_ptr]           ; v_ptr[0]
 %define TEMP_Y2  esp + 8  
 %define TEMP_G1  esp + 16  
 %define TEMP_G2  esp + 24  
 %define TEMP_B1  esp + 32  
 %define TEMP_B2  esp + 40  
         movd mm2, [ebx]         ; u_ptr[0]  
         movd mm3, [ecx]         ; v_ptr[0]  
   
314          punpcklbw mm2, mm7              ; u3u2u1u0 -> mm2          punpcklbw mm2, mm7              ; u3u2u1u0 -> mm2
315          punpcklbw mm3, mm7              ; v3v2v1v0 -> mm3          punpcklbw mm3, mm7              ; v3v2v1v0 -> mm3
   
316          psubsw mm2, [U_SUB]             ; U - 128          psubsw mm2, [U_SUB]             ; U - 128
317          psubsw mm3, [V_SUB]             ; V - 128          psubsw mm3, [V_SUB]             ; V - 128
   
318          movq mm4, mm2          movq mm4, mm2
319          movq mm5, mm3          movq mm5, mm3
   
320          pmullw mm2, [UG_MUL]          pmullw mm2, [UG_MUL]
321          pmullw mm3, [VG_MUL]          pmullw mm3, [VG_MUL]
   
322          movq mm6, mm2                   ; u3u2u1u0 -> mm6          movq mm6, mm2                   ; u3u2u1u0 -> mm6
323          punpckhwd mm2, mm2              ; u3u3u2u2 -> mm2          punpckhwd mm2, mm2              ; u3u3u2u2 -> mm2
324          punpcklwd mm6, mm6              ; u1u1u0u0 -> mm6          punpcklwd mm6, mm6              ; u1u1u0u0 -> mm6
   
325          pmullw mm4, [UB_MUL]            ; B_ADD -> mm4          pmullw mm4, [UB_MUL]            ; B_ADD -> mm4
   
326          movq mm0, mm3          movq mm0, mm3
327          punpckhwd mm3, mm3              ; v3v3v2v2 -> mm2          punpckhwd mm3, mm3              ; v3v3v2v2 -> mm2
328          punpcklwd mm0, mm0              ; v1v1v0v0 -> mm6          punpcklwd mm0, mm0              ; v1v1v0v0 -> mm6
   
329          paddsw mm2, mm3          paddsw mm2, mm3
330          paddsw mm6, mm0          paddsw mm6, mm0
   
331          pmullw mm5, [VR_MUL]            ; R_ADD -> mm5          pmullw mm5, [VR_MUL]            ; R_ADD -> mm5
332      movq mm0, [y_ptr]           ; y7y6y5y4y3y2y1y0 -> mm0
         movq mm0, [esi]                 ; y7y6y5y4y3y2y1y0 -> mm0  
   
333          movq mm1, mm0          movq mm1, mm0
334          punpckhbw mm1, mm7              ; y7y6y5y4 -> mm1          punpckhbw mm1, mm7              ; y7y6y5y4 -> mm1
335          punpcklbw mm0, mm7              ; y3y2y1y0 -> mm0          punpcklbw mm0, mm7              ; y3y2y1y0 -> mm0
   
336          psubsw mm0, [Y_SUB]             ; Y - Y_SUB          psubsw mm0, [Y_SUB]             ; Y - Y_SUB
337          psubsw mm1, [Y_SUB]             ; Y - Y_SUB          psubsw mm1, [Y_SUB]             ; Y - Y_SUB
   
338          pmullw mm1, [Y_MUL]          pmullw mm1, [Y_MUL]
339          pmullw mm0, [Y_MUL]          pmullw mm0, [Y_MUL]
   
340          movq [TEMP_Y2], mm1             ; y7y6y5y4 -> mm3          movq [TEMP_Y2], mm1             ; y7y6y5y4 -> mm3
341          movq [TEMP_Y1], mm0             ; y3y2y1y0 -> mm7          movq [TEMP_Y1], mm0             ; y3y2y1y0 -> mm7
   
342          psubsw mm1, mm2                 ; g7g6g5g4 -> mm1          psubsw mm1, mm2                 ; g7g6g5g4 -> mm1
343          psubsw mm0, mm6                 ; g3g2g1g0 -> mm0          psubsw mm0, mm6                 ; g3g2g1g0 -> mm0
   
344          psraw mm1, SCALEBITS          psraw mm1, SCALEBITS
345          psraw mm0, SCALEBITS          psraw mm0, SCALEBITS
   
346          packuswb mm0, mm1               ;g7g6g5g4g3g2g1g0 -> mm0          packuswb mm0, mm1               ;g7g6g5g4g3g2g1g0 -> mm0
   
347          movq [TEMP_G1], mm0          movq [TEMP_G1], mm0
348      movq mm0, [y_ptr+y_stride]       ; y7y6y5y4y3y2y1y0 -> mm0
         movq mm0, [esi+eax]                     ; y7y6y5y4y3y2y1y0 -> mm0  
   
349          movq mm1, mm0          movq mm1, mm0
   
350          punpckhbw mm1, mm7              ; y7y6y5y4 -> mm1          punpckhbw mm1, mm7              ; y7y6y5y4 -> mm1
351          punpcklbw mm0, mm7              ; y3y2y1y0 -> mm0          punpcklbw mm0, mm7              ; y3y2y1y0 -> mm0
   
352          psubsw mm0, [Y_SUB]             ; Y - Y_SUB          psubsw mm0, [Y_SUB]             ; Y - Y_SUB
353          psubsw mm1, [Y_SUB]             ; Y - Y_SUB          psubsw mm1, [Y_SUB]             ; Y - Y_SUB
   
354          pmullw mm1, [Y_MUL]          pmullw mm1, [Y_MUL]
355          pmullw mm0, [Y_MUL]          pmullw mm0, [Y_MUL]
   
356          movq mm3, mm1          movq mm3, mm1
357          psubsw mm1, mm2                 ; g7g6g5g4 -> mm1          psubsw mm1, mm2                 ; g7g6g5g4 -> mm1
   
358          movq mm2, mm0          movq mm2, mm0
359          psubsw mm0, mm6                 ; g3g2g1g0 -> mm0          psubsw mm0, mm6                 ; g3g2g1g0 -> mm0
   
360          psraw mm1, SCALEBITS          psraw mm1, SCALEBITS
361          psraw mm0, SCALEBITS          psraw mm0, SCALEBITS
   
362          packuswb mm0, mm1               ; g7g6g5g4g3g2g1g0 -> mm0          packuswb mm0, mm1               ; g7g6g5g4g3g2g1g0 -> mm0
   
363          movq [TEMP_G2], mm0          movq [TEMP_G2], mm0
   
364          movq mm0, mm4          movq mm0, mm4
365          punpckhwd mm4, mm4              ; u3u3u2u2 -> mm2          punpckhwd mm4, mm4              ; u3u3u2u2 -> mm2
366          punpcklwd mm0, mm0              ; u1u1u0u0 -> mm6          punpcklwd mm0, mm0              ; u1u1u0u0 -> mm6
   
367          movq mm1, mm3                   ; y7y6y5y4 -> mm1          movq mm1, mm3                   ; y7y6y5y4 -> mm1
368          paddsw mm3, mm4                 ; b7b6b5b4 -> mm3          paddsw mm3, mm4                 ; b7b6b5b4 -> mm3
   
369          movq mm7, mm2                   ; y3y2y1y0 -> mm7          movq mm7, mm2                   ; y3y2y1y0 -> mm7
   
370          paddsw mm2, mm0                 ; b3b2b1b0 -> mm2          paddsw mm2, mm0                 ; b3b2b1b0 -> mm2
   
371          psraw mm3, SCALEBITS          psraw mm3, SCALEBITS
372          psraw mm2, SCALEBITS          psraw mm2, SCALEBITS
   
373          packuswb mm2, mm3               ; b7b6b5b4b3b2b1b0 -> mm2          packuswb mm2, mm3               ; b7b6b5b4b3b2b1b0 -> mm2
   
374          movq [TEMP_B2], mm2          movq [TEMP_B2], mm2
   
375          movq mm3, [TEMP_Y2]          movq mm3, [TEMP_Y2]
376          movq mm2, [TEMP_Y1]          movq mm2, [TEMP_Y1]
   
377          movq mm6, mm3                   ; TEMP_Y2 -> mm6          movq mm6, mm3                   ; TEMP_Y2 -> mm6
378          paddsw mm3, mm4                 ; b7b6b5b4 -> mm3          paddsw mm3, mm4                 ; b7b6b5b4 -> mm3
   
379          movq mm4, mm2                   ; TEMP_Y1 -> mm4          movq mm4, mm2                   ; TEMP_Y1 -> mm4
380          paddsw mm2, mm0                 ; b3b2b1b0 -> mm2          paddsw mm2, mm0                 ; b3b2b1b0 -> mm2
   
381          psraw mm3, SCALEBITS          psraw mm3, SCALEBITS
382          psraw mm2, SCALEBITS          psraw mm2, SCALEBITS
   
383          packuswb mm2, mm3               ; b7b6b5b4b3b2b1b0 -> mm2          packuswb mm2, mm3               ; b7b6b5b4b3b2b1b0 -> mm2
   
384          movq [TEMP_B1], mm2          movq [TEMP_B1], mm2
   
385          movq mm0, mm5          movq mm0, mm5
386          punpckhwd mm5, mm5              ; v3v3v2v2 -> mm5          punpckhwd mm5, mm5              ; v3v3v2v2 -> mm5
387          punpcklwd mm0, mm0              ; v1v1v0v0 -> mm0          punpcklwd mm0, mm0              ; v1v1v0v0 -> mm0
   
388          paddsw mm1, mm5                 ; r7r6r5r4 -> mm1          paddsw mm1, mm5                 ; r7r6r5r4 -> mm1
389          paddsw mm7, mm0                 ; r3r2r1r0 -> mm7          paddsw mm7, mm0                 ; r3r2r1r0 -> mm7
   
390          psraw mm1, SCALEBITS          psraw mm1, SCALEBITS
391          psraw mm7, SCALEBITS          psraw mm7, SCALEBITS
   
392          packuswb mm7, mm1               ; r7r6r5r4r3r2r1r0 -> mm7 (TEMP_R2)          packuswb mm7, mm1               ; r7r6r5r4r3r2r1r0 -> mm7 (TEMP_R2)
   
393          paddsw mm6, mm5                 ; r7r6r5r4 -> mm6          paddsw mm6, mm5                 ; r7r6r5r4 -> mm6
394          paddsw mm4, mm0                 ; r3r2r1r0 -> mm4          paddsw mm4, mm0                 ; r3r2r1r0 -> mm4
   
395          psraw mm6, SCALEBITS          psraw mm6, SCALEBITS
396          psraw mm4, SCALEBITS          psraw mm4, SCALEBITS
   
397          packuswb mm4, mm6               ; r7r6r5r4r3r2r1r0 -> mm4 (TEMP_R1)          packuswb mm4, mm6               ; r7r6r5r4r3r2r1r0 -> mm4 (TEMP_R1)
   
398          movq mm0, [TEMP_B1]          movq mm0, [TEMP_B1]
399          movq mm1, [TEMP_G1]          movq mm1, [TEMP_G1]
   
400          movq mm6, mm7          movq mm6, mm7
   
401          movq mm2, mm0          movq mm2, mm0
402          punpcklbw mm2, mm4              ; r3b3r2b2r1b1r0b0 -> mm2          punpcklbw mm2, mm4              ; r3b3r2b2r1b1r0b0 -> mm2
403          punpckhbw mm0, mm4              ; r7b7r6b6r5b5r4b4 -> mm0          punpckhbw mm0, mm4              ; r7b7r6b6r5b5r4b4 -> mm0
   
404          pxor mm7, mm7          pxor mm7, mm7
   
405          movq mm3, mm1          movq mm3, mm1
406          punpcklbw mm1, mm7              ; 0g30g20g10g0 -> mm1          punpcklbw mm1, mm7              ; 0g30g20g10g0 -> mm1
407          punpckhbw mm3, mm7              ; 0g70g60g50g4 -> mm3          punpckhbw mm3, mm7              ; 0g70g60g50g4 -> mm3
   
408          movq mm4, mm2          movq mm4, mm2
409          punpcklbw mm2, mm1              ; 0r1g1b10r0g0b0 -> mm2          punpcklbw mm2, mm1              ; 0r1g1b10r0g0b0 -> mm2
410          punpckhbw mm4, mm1              ; 0r3g3b30r2g2b2 -> mm4          punpckhbw mm4, mm1              ; 0r3g3b30r2g2b2 -> mm4
   
411          movq mm5, mm0          movq mm5, mm0
412          punpcklbw mm0, mm3              ; 0r5g5b50r4g4b4 -> mm0          punpcklbw mm0, mm3              ; 0r5g5b50r4g4b4 -> mm0
413          punpckhbw mm5, mm3              ; 0r7g7b70r6g6b6 -> mm5          punpckhbw mm5, mm3              ; 0r7g7b70r6g6b6 -> mm5
414    %if %1 == 3     ; BGR (24-bit)
415  %if %1 == 3             ; RGB24    movd [x_ptr], mm2
         movd [edi], mm2  
416          psrlq mm2, 32          psrlq mm2, 32
417      movd [x_ptr + 3], mm2
418          movd [edi + 3], mm2    movd [x_ptr + 6], mm4
         movd [edi + 6], mm4  
   
419          psrlq mm4, 32          psrlq mm4, 32
420      movd [x_ptr + 9], mm4
421          movd [edi + 9], mm4    movd [x_ptr + 12], mm0
         movd [edi + 12], mm0  
   
422          psrlq mm0, 32          psrlq mm0, 32
423      movd [x_ptr + 15], mm0
424          movd [edi + 15], mm0    movq mm2, mm5
425          movd [edi + 18], mm5    psrlq mm0, 8              ; 000000r5g5 -> mm0
426      psllq mm2, 32             ; 0r6g6b60000 -> mm2
427          psrlq mm5, 32    psrlq mm5, 32             ; 00000r7g7b7 -> mm5
428      psrlq mm2, 16             ; 000r6g6b600 -> mm2
429          movd [edi + 21], mm5    por mm0, mm2              ; 000r6g6b6r5g5 -> mm0
430      psllq mm5, 40             ; r7g7b700000 -> mm5
431      por mm5, mm0              ; r7g7b7r6g6b6r5g5 -> mm5
432      movq [x_ptr + 16], mm5
433          movq mm0, [TEMP_B2]          movq mm0, [TEMP_B2]
434          movq mm1, [TEMP_G2]          movq mm1, [TEMP_G2]
   
435          movq mm2, mm0          movq mm2, mm0
436          punpcklbw mm2, mm6              ; r3b3r2b2r1b1r0b0 -> mm2          punpcklbw mm2, mm6              ; r3b3r2b2r1b1r0b0 -> mm2
437          punpckhbw mm0, mm6              ; r7b7r6b6r5b5r4b4 -> mm0          punpckhbw mm0, mm6              ; r7b7r6b6r5b5r4b4 -> mm0
   
438          movq mm3, mm1          movq mm3, mm1
439          punpcklbw mm1, mm7              ; 0g30g20g10g0 -> mm1          punpcklbw mm1, mm7              ; 0g30g20g10g0 -> mm1
440          punpckhbw mm3, mm7              ; 0g70g60g50g4 -> mm3          punpckhbw mm3, mm7              ; 0g70g60g50g4 -> mm3
   
441          movq mm4, mm2          movq mm4, mm2
442          punpcklbw mm2, mm1              ; 0r1g1b10r0g0b0 -> mm2          punpcklbw mm2, mm1              ; 0r1g1b10r0g0b0 -> mm2
443          punpckhbw mm4, mm1              ; 0r3g3b30r2g2b2 -> mm4          punpckhbw mm4, mm1              ; 0r3g3b30r2g2b2 -> mm4
   
444          movq mm5, mm0          movq mm5, mm0
445          punpcklbw mm0, mm3              ; 0r5g5b50r4g4b4 -> mm0          punpcklbw mm0, mm3              ; 0r5g5b50r4g4b4 -> mm0
446          punpckhbw mm5, mm3              ; 0r7g7b70r6g6b6 -> mm5          punpckhbw mm5, mm3              ; 0r7g7b70r6g6b6 -> mm5
447      movd [x_ptr+x_stride], mm2
         movd [edi+edx], mm2  
448          psrlq mm2, 32          psrlq mm2, 32
449      movd [x_ptr+x_stride + 3], mm2
450          movd [edi+edx + 3], mm2    movd [x_ptr+x_stride + 6], mm4
         movd [edi+edx + 6], mm4  
   
451          psrlq mm4, 32          psrlq mm4, 32
452      movd [x_ptr+x_stride + 9], mm4
453          movd [edi+edx + 9], mm4    movd [x_ptr+x_stride + 12], mm0
         movd [edi+edx + 12], mm0  
   
454          psrlq mm0, 32          psrlq mm0, 32
455      movd [x_ptr+x_stride + 15], mm0
456          movd [edi+edx + 15], mm0    movq mm2, mm5
457          movd [edi+edx + 18], mm5    psrlq mm0, 8              ; 000000r5g5 -> mm0
458      psllq mm2, 32             ; 0r6g6b60000 -> mm2
459          psrlq mm5, 32    psrlq mm5, 32             ; 00000r7g7b7 -> mm5
460      psrlq mm2, 16             ; 000r6g6b600 -> mm2
461          movd [edi+edx + 21], mm5    por mm0, mm2              ; 000r6g6b6r5g5 -> mm0
462      psllq mm5, 40             ; r7g7b700000 -> mm5
463  %else           ; RGB32    por mm5, mm0              ; r7g7b7r6g6b6r5g5 -> mm5
464          movq [edi], mm2    movq [x_ptr + x_stride + 16], mm5
465          movq [edi + 8], mm4  
466          movq [edi + 16], mm0  %else       ; BGRA (32-bit)
467          movq [edi + 24], mm5    movq [x_ptr], mm2
468      movq [x_ptr + 8], mm4
469      movq [x_ptr + 16], mm0
470      movq [x_ptr + 24], mm5
471          movq mm0, [TEMP_B2]          movq mm0, [TEMP_B2]
472          movq mm1, [TEMP_G2]          movq mm1, [TEMP_G2]
   
473          movq mm2, mm0          movq mm2, mm0
474          punpcklbw mm2, mm6              ; r3b3r2b2r1b1r0b0 -> mm2          punpcklbw mm2, mm6              ; r3b3r2b2r1b1r0b0 -> mm2
475          punpckhbw mm0, mm6              ; r7b7r6b6r5b5r4b4 -> mm0          punpckhbw mm0, mm6              ; r7b7r6b6r5b5r4b4 -> mm0
   
476          movq mm3, mm1          movq mm3, mm1
477          punpcklbw mm1, mm7              ; 0g30g20g10g0 -> mm1          punpcklbw mm1, mm7              ; 0g30g20g10g0 -> mm1
478          punpckhbw mm3, mm7              ; 0g70g60g50g4 -> mm3          punpckhbw mm3, mm7              ; 0g70g60g50g4 -> mm3
   
479          movq mm4, mm2          movq mm4, mm2
480          punpcklbw mm2, mm1              ; 0r1g1b10r0g0b0 -> mm2          punpcklbw mm2, mm1              ; 0r1g1b10r0g0b0 -> mm2
481          punpckhbw mm4, mm1              ; 0r3g3b30r2g2b2 -> mm4          punpckhbw mm4, mm1              ; 0r3g3b30r2g2b2 -> mm4
   
482          movq mm5, mm0          movq mm5, mm0
483          punpcklbw mm0, mm3              ; 0r5g5b50r4g4b4 -> mm0          punpcklbw mm0, mm3              ; 0r5g5b50r4g4b4 -> mm0
484          punpckhbw mm5, mm3              ; 0r7g7b70r6g6b6 -> mm5          punpckhbw mm5, mm3              ; 0r7g7b70r6g6b6 -> mm5
485      movq [x_ptr + x_stride], mm2
486          movq [edi + edx], mm2    movq [x_ptr + x_stride + 8], mm4
487          movq [edi + edx + 8], mm4    movq [x_ptr + x_stride + 16], mm0
488          movq [edi + edx + 16], mm0    movq [x_ptr + x_stride + 24], mm5
         movq [edi + edx + 24], mm5  
489  %endif  %endif
490    
491  %undef TEMP_Y1  %undef TEMP_Y1
# Line 468  Line 495 
495  %undef TEMP_B1  %undef TEMP_B1
496  %undef TEMP_B2  %undef TEMP_B2
497  %endmacro  %endmacro
 ;------------------------------------------------------------------------------  
498    
499    ;=============================================================================
500    ; Code
501    ;=============================================================================
502    
503    SECTION .rotext align=SECTION_ALIGN
504    
505    %include "colorspace_mmx.inc"
506    
507  ; input  ; input
508    MAKE_COLORSPACE  bgr_to_yv12_mmx,0,    3,2,2,  BGR_TO_YV12,  3, -1
509  MAKE_COLORSPACE  rgb24_to_yv12_mmx,0,   3,2,2,  RGB_TO_YV12,  3, -1  MAKE_COLORSPACE  bgra_to_yv12_mmx,0,   4,2,2,  BGR_TO_YV12,  4, -1
510  MAKE_COLORSPACE  rgb32_to_yv12_mmx,0,   4,2,2,  RGB_TO_YV12,  4, -1  MAKE_COLORSPACE  rgb_to_yv12_mmx,0,    3,2,2,  RGB_TO_YV12,  3, -1
511    MAKE_COLORSPACE  rgba_to_yv12_mmx,0,   4,2,2,  RGB_TO_YV12,  4, -1
512    
513  ; output  ; output
514    MAKE_COLORSPACE  yv12_to_bgr_mmx,48,   3,8,2,  YV12_TO_BGR,  3, -1
515    MAKE_COLORSPACE  yv12_to_bgra_mmx,48,  4,8,2,  YV12_TO_BGR,  4, -1
516    
517  MAKE_COLORSPACE  yv12_to_rgb24_mmx,48,  3,8,2,  YV12_TO_RGB,  3, -1  
518  MAKE_COLORSPACE  yv12_to_rgb32_mmx,48,  4,8,2,  YV12_TO_RGB,  4, -1  %ifidn __OUTPUT_FORMAT__,elf
519    section ".note.GNU-stack" noalloc noexec nowrite progbits
520    %endif
521    

Legend:
Removed from v.1.1.2.1  
changed lines
  Added in v.1.10

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