[svn] / branches / release-1_3-branch / xvidcore / src / image / x86_asm / colorspace_rgb_mmx.asm Repository:
ViewVC logotype

Annotation of /branches/release-1_3-branch/xvidcore/src/image/x86_asm/colorspace_rgb_mmx.asm

Parent Directory Parent Directory | Revision Log Revision Log


Revision 1790 - (view) (download)
Original Path: trunk/xvidcore/src/image/x86_asm/colorspace_rgb_mmx.asm

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

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