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

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

Parent Directory Parent Directory | Revision Log Revision Log


Revision 1793 - (view) (download)

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 : Isibaar 1793 %define ENDFUNC .endfunc
33 : edgomez 1535 %else
34 :     global _%1
35 :     %define %1 _%1
36 : Isibaar 1793 %define ENDFUNC
37 : edgomez 1535 %endif
38 : edgomez 851 %else
39 : edgomez 1535 %ifdef MARK_FUNCS
40 : edgomez 1540 global %1:function %1.endfunc-%1
41 : Isibaar 1793 %define ENDFUNC .endfunc
42 : edgomez 1535 %else
43 :     global %1
44 : Isibaar 1793 %define ENDFUNC
45 : edgomez 1535 %endif
46 : edgomez 851 %endif
47 :     %endmacro
48 :    
49 : edgomez 1382 ;=============================================================================
50 :     ; Some constants
51 :     ;=============================================================================
52 : edgomez 851
53 : edgomez 1382 ;-----------------------------------------------------------------------------
54 : edgomez 851 ; RGB->YV12 yuv constants
55 : edgomez 1382 ;-----------------------------------------------------------------------------
56 :    
57 : edgomez 851 %define Y_R 0.257
58 :     %define Y_G 0.504
59 :     %define Y_B 0.098
60 :     %define Y_ADD 16
61 :    
62 :     %define U_R 0.148
63 :     %define U_G 0.291
64 :     %define U_B 0.439
65 :     %define U_ADD 128
66 :    
67 :     %define V_R 0.439
68 :     %define V_G 0.368
69 :     %define V_B 0.071
70 :     %define V_ADD 128
71 :    
72 : edgomez 1382 ; Scaling used during conversion
73 :     %define SCALEBITS 6
74 : edgomez 851
75 : edgomez 1382 ;=============================================================================
76 :     ; Read only data
77 :     ;=============================================================================
78 : edgomez 851
79 : edgomez 1382 %ifdef FORMAT_COFF
80 : edgomez 1519 SECTION .rodata
81 : edgomez 1382 %else
82 : edgomez 1519 SECTION .rodata align=16
83 : edgomez 1382 %endif
84 :     ALIGN 16
85 : edgomez 851
86 : edgomez 1382 ;-----------------------------------------------------------------------------
87 :     ; RGB->YV12 multiplication matrices
88 :     ;-----------------------------------------------------------------------------
89 :     ; FIX(Y_B) FIX(Y_G) FIX(Y_R) Ignored
90 : edgomez 851
91 : chl 1763 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 : edgomez 851
95 : chl 1763 ;-----------------------------------------------------------------------------
96 :     ; BGR->YV12 multiplication matrices
97 :     ;-----------------------------------------------------------------------------
98 :     ; FIX(Y_R) FIX(Y_G) FIX(Y_B) Ignored
99 : edgomez 851
100 : chl 1763 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 : edgomez 1382 ;-----------------------------------------------------------------------------
105 :     ; YV12->RGB data
106 :     ;-----------------------------------------------------------------------------
107 : edgomez 851
108 : edgomez 1382 Y_SUB: dw 16, 16, 16, 16
109 :     U_SUB: dw 128, 128, 128, 128
110 :     V_SUB: dw 128, 128, 128, 128
111 : edgomez 851
112 : edgomez 1382 Y_MUL: dw 74, 74, 74, 74
113 : edgomez 851
114 : edgomez 1382 UG_MUL: dw 25, 25, 25, 25
115 :     VG_MUL: dw 52, 52, 52, 52
116 : edgomez 851
117 : edgomez 1382 UB_MUL: dw 129, 129, 129, 129
118 :     VR_MUL: dw 102, 102, 102, 102
119 : edgomez 851
120 : edgomez 1382 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 : edgomez 851 ;------------------------------------------------------------------------------
127 :     ; BGR_TO_YV12( BYTES )
128 :     ;
129 :     ; BYTES 3=bgr(24bit), 4=bgra(32-bit)
130 :     ;
131 :     ; bytes=3/4, pixels = 2, vpixels=2
132 :     ;------------------------------------------------------------------------------
133 : edgomez 1382
134 : edgomez 851 %macro BGR_TO_YV12_INIT 2
135 : chl 1763 movq mm7, [bgr_y_mul]
136 : edgomez 851 %endmacro
137 :    
138 :    
139 :     %macro BGR_TO_YV12 2
140 : edgomez 1382 ; y_out
141 :     pxor mm4, mm4
142 :     pxor mm5, mm5
143 :     movd mm0, [edi] ; x_ptr[0...]
144 :     movd mm2, [edi+edx] ; x_ptr[x_stride...]
145 :     punpcklbw mm0, mm4 ; [ |b |g |r ]
146 :     punpcklbw mm2, mm5 ; [ |b |g |r ]
147 :     movq mm6, mm0 ; = [ |b4|g4|r4]
148 :     paddw mm6, mm2 ; +[ |b4|g4|r4]
149 :     pmaddwd mm0, mm7 ; *= Y_MUL
150 :     pmaddwd mm2, mm7 ; *= Y_MUL
151 :     movq mm4, mm0 ; [r]
152 :     movq mm5, mm2 ; [r]
153 :     psrlq mm4, 32 ; +[g]
154 :     psrlq mm5, 32 ; +[g]
155 :     paddd mm0, mm4 ; +[b]
156 :     paddd mm2, mm5 ; +[b]
157 : edgomez 851
158 : edgomez 1382 pxor mm4, mm4
159 :     pxor mm5, mm5
160 :     movd mm1, [edi+%1] ; src[%1...]
161 :     movd mm3, [edi+edx+%1] ; src[x_stride+%1...]
162 :     punpcklbw mm1, mm4 ; [ |b |g |r ]
163 :     punpcklbw mm3, mm5 ; [ |b |g |r ]
164 :     paddw mm6, mm1 ; +[ |b4|g4|r4]
165 :     paddw mm6, mm3 ; +[ |b4|g4|r4]
166 :     pmaddwd mm1, mm7 ; *= Y_MUL
167 :     pmaddwd mm3, mm7 ; *= Y_MUL
168 :     movq mm4, mm1 ; [r]
169 :     movq mm5, mm3 ; [r]
170 :     psrlq mm4, 32 ; +[g]
171 :     psrlq mm5, 32 ; +[g]
172 :     paddd mm1, mm4 ; +[b]
173 :     paddd mm3, mm5 ; +[b]
174 : edgomez 851
175 : edgomez 1382 push edx
176 : edgomez 851
177 : edgomez 1382 movd edx, mm0
178 :     shr edx, 8
179 :     add edx, Y_ADD
180 :     mov [esi], dl ; y_ptr[0]
181 : edgomez 851
182 : edgomez 1382 movd edx, mm1
183 :     shr edx, 8
184 :     add edx, Y_ADD
185 :     mov [esi + 1], dl ; y_ptr[1]
186 : edgomez 851
187 : edgomez 1382 movd edx, mm2
188 :     shr edx, 8
189 :     add edx, Y_ADD
190 :     mov [esi + eax + 0], dl ; y_ptr[y_stride + 0]
191 : edgomez 851
192 : edgomez 1382 movd edx, mm3
193 :     shr edx, 8
194 :     add edx, Y_ADD
195 :     mov [esi + eax + 1], dl ; y_ptr[y_stride + 1]
196 : edgomez 851
197 : edgomez 1382 ; u_ptr, v_ptr
198 :     movq mm0, mm6 ; = [ |b4|g4|r4]
199 : chl 1763 pmaddwd mm6, [bgr_v_mul] ; *= V_MUL
200 :     pmaddwd mm0, [bgr_u_mul] ; *= U_MUL
201 : edgomez 1382 movq mm1, mm0
202 :     movq mm2, mm6
203 :     psrlq mm1, 32
204 :     psrlq mm2, 32
205 :     paddd mm0, mm1
206 :     paddd mm2, mm6
207 : edgomez 851
208 : edgomez 1382 movd edx, mm0
209 :     shr edx, 10
210 :     add edx, U_ADD
211 :     mov [ebx], dl
212 : edgomez 851
213 : edgomez 1382 movd edx, mm2
214 :     shr edx, 10
215 :     add edx, V_ADD
216 :     mov [ecx], dl
217 : edgomez 851
218 : edgomez 1382 pop edx
219 : edgomez 851 %endmacro
220 :    
221 :     ;------------------------------------------------------------------------------
222 : chl 1763 ; 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 : edgomez 851 ; YV12_TO_BGR( BYTES )
318 :     ;
319 :     ; BYTES 3=bgr(24-bit), 4=bgra(32-bit)
320 :     ;
321 :     ; bytes=3/4, pixels = 8, vpixels=2
322 :     ;------------------------------------------------------------------------------
323 : edgomez 1382
324 : edgomez 851 %macro YV12_TO_BGR_INIT 2
325 : edgomez 1382 pxor mm7, mm7 ; clear mm7
326 : edgomez 851 %endmacro
327 :    
328 :     %macro YV12_TO_BGR 2
329 :     %define TEMP_Y1 esp
330 :     %define TEMP_Y2 esp + 8
331 :     %define TEMP_G1 esp + 16
332 :     %define TEMP_G2 esp + 24
333 :     %define TEMP_B1 esp + 32
334 :     %define TEMP_B2 esp + 40
335 :    
336 : edgomez 1382 movd mm2, [ebx] ; u_ptr[0]
337 :     movd mm3, [ecx] ; v_ptr[0]
338 :     punpcklbw mm2, mm7 ; u3u2u1u0 -> mm2
339 :     punpcklbw mm3, mm7 ; v3v2v1v0 -> mm3
340 :     psubsw mm2, [U_SUB] ; U - 128
341 :     psubsw mm3, [V_SUB] ; V - 128
342 :     movq mm4, mm2
343 :     movq mm5, mm3
344 :     pmullw mm2, [UG_MUL]
345 :     pmullw mm3, [VG_MUL]
346 :     movq mm6, mm2 ; u3u2u1u0 -> mm6
347 :     punpckhwd mm2, mm2 ; u3u3u2u2 -> mm2
348 :     punpcklwd mm6, mm6 ; u1u1u0u0 -> mm6
349 :     pmullw mm4, [UB_MUL] ; B_ADD -> mm4
350 :     movq mm0, mm3
351 :     punpckhwd mm3, mm3 ; v3v3v2v2 -> mm2
352 :     punpcklwd mm0, mm0 ; v1v1v0v0 -> mm6
353 :     paddsw mm2, mm3
354 :     paddsw mm6, mm0
355 :     pmullw mm5, [VR_MUL] ; R_ADD -> mm5
356 :     movq mm0, [esi] ; y7y6y5y4y3y2y1y0 -> mm0
357 :     movq mm1, mm0
358 :     punpckhbw mm1, mm7 ; y7y6y5y4 -> mm1
359 :     punpcklbw mm0, mm7 ; y3y2y1y0 -> mm0
360 :     psubsw mm0, [Y_SUB] ; Y - Y_SUB
361 :     psubsw mm1, [Y_SUB] ; Y - Y_SUB
362 :     pmullw mm1, [Y_MUL]
363 :     pmullw mm0, [Y_MUL]
364 :     movq [TEMP_Y2], mm1 ; y7y6y5y4 -> mm3
365 :     movq [TEMP_Y1], mm0 ; y3y2y1y0 -> mm7
366 :     psubsw mm1, mm2 ; g7g6g5g4 -> mm1
367 :     psubsw mm0, mm6 ; g3g2g1g0 -> mm0
368 :     psraw mm1, SCALEBITS
369 :     psraw mm0, SCALEBITS
370 :     packuswb mm0, mm1 ;g7g6g5g4g3g2g1g0 -> mm0
371 :     movq [TEMP_G1], mm0
372 :     movq mm0, [esi+eax] ; y7y6y5y4y3y2y1y0 -> mm0
373 :     movq mm1, mm0
374 :     punpckhbw mm1, mm7 ; y7y6y5y4 -> mm1
375 :     punpcklbw mm0, mm7 ; y3y2y1y0 -> mm0
376 :     psubsw mm0, [Y_SUB] ; Y - Y_SUB
377 :     psubsw mm1, [Y_SUB] ; Y - Y_SUB
378 :     pmullw mm1, [Y_MUL]
379 :     pmullw mm0, [Y_MUL]
380 :     movq mm3, mm1
381 :     psubsw mm1, mm2 ; g7g6g5g4 -> mm1
382 :     movq mm2, mm0
383 :     psubsw mm0, mm6 ; g3g2g1g0 -> mm0
384 :     psraw mm1, SCALEBITS
385 :     psraw mm0, SCALEBITS
386 :     packuswb mm0, mm1 ; g7g6g5g4g3g2g1g0 -> mm0
387 :     movq [TEMP_G2], mm0
388 :     movq mm0, mm4
389 :     punpckhwd mm4, mm4 ; u3u3u2u2 -> mm2
390 :     punpcklwd mm0, mm0 ; u1u1u0u0 -> mm6
391 :     movq mm1, mm3 ; y7y6y5y4 -> mm1
392 :     paddsw mm3, mm4 ; b7b6b5b4 -> mm3
393 :     movq mm7, mm2 ; y3y2y1y0 -> mm7
394 :     paddsw mm2, mm0 ; b3b2b1b0 -> mm2
395 :     psraw mm3, SCALEBITS
396 :     psraw mm2, SCALEBITS
397 :     packuswb mm2, mm3 ; b7b6b5b4b3b2b1b0 -> mm2
398 :     movq [TEMP_B2], mm2
399 :     movq mm3, [TEMP_Y2]
400 :     movq mm2, [TEMP_Y1]
401 :     movq mm6, mm3 ; TEMP_Y2 -> mm6
402 :     paddsw mm3, mm4 ; b7b6b5b4 -> mm3
403 :     movq mm4, mm2 ; TEMP_Y1 -> mm4
404 :     paddsw mm2, mm0 ; b3b2b1b0 -> mm2
405 :     psraw mm3, SCALEBITS
406 :     psraw mm2, SCALEBITS
407 :     packuswb mm2, mm3 ; b7b6b5b4b3b2b1b0 -> mm2
408 :     movq [TEMP_B1], mm2
409 :     movq mm0, mm5
410 :     punpckhwd mm5, mm5 ; v3v3v2v2 -> mm5
411 :     punpcklwd mm0, mm0 ; v1v1v0v0 -> mm0
412 :     paddsw mm1, mm5 ; r7r6r5r4 -> mm1
413 :     paddsw mm7, mm0 ; r3r2r1r0 -> mm7
414 :     psraw mm1, SCALEBITS
415 :     psraw mm7, SCALEBITS
416 :     packuswb mm7, mm1 ; r7r6r5r4r3r2r1r0 -> mm7 (TEMP_R2)
417 :     paddsw mm6, mm5 ; r7r6r5r4 -> mm6
418 :     paddsw mm4, mm0 ; r3r2r1r0 -> mm4
419 :     psraw mm6, SCALEBITS
420 :     psraw mm4, SCALEBITS
421 :     packuswb mm4, mm6 ; r7r6r5r4r3r2r1r0 -> mm4 (TEMP_R1)
422 :     movq mm0, [TEMP_B1]
423 :     movq mm1, [TEMP_G1]
424 :     movq mm6, mm7
425 :     movq mm2, mm0
426 :     punpcklbw mm2, mm4 ; r3b3r2b2r1b1r0b0 -> mm2
427 :     punpckhbw mm0, mm4 ; r7b7r6b6r5b5r4b4 -> mm0
428 :     pxor mm7, mm7
429 :     movq mm3, mm1
430 :     punpcklbw mm1, mm7 ; 0g30g20g10g0 -> mm1
431 :     punpckhbw mm3, mm7 ; 0g70g60g50g4 -> mm3
432 :     movq mm4, mm2
433 :     punpcklbw mm2, mm1 ; 0r1g1b10r0g0b0 -> mm2
434 :     punpckhbw mm4, mm1 ; 0r3g3b30r2g2b2 -> mm4
435 :     movq mm5, mm0
436 :     punpcklbw mm0, mm3 ; 0r5g5b50r4g4b4 -> mm0
437 :     punpckhbw mm5, mm3 ; 0r7g7b70r6g6b6 -> mm5
438 :     %if %1 == 3 ; BGR (24-bit)
439 :     movd [edi], mm2
440 :     psrlq mm2, 32
441 :     movd [edi + 3], mm2
442 :     movd [edi + 6], mm4
443 :     psrlq mm4, 32
444 :     movd [edi + 9], mm4
445 :     movd [edi + 12], mm0
446 :     psrlq mm0, 32
447 :     movd [edi + 15], mm0
448 :     movq mm2, mm5
449 :     psrlq mm0, 8 ; 000000r5g5 -> mm0
450 :     psllq mm2, 32 ; 0r6g6b60000 -> mm2
451 :     psrlq mm5, 32 ; 00000r7g7b7 -> mm5
452 :     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]
458 :     movq mm1, [TEMP_G2]
459 :     movq mm2, mm0
460 :     punpcklbw mm2, mm6 ; r3b3r2b2r1b1r0b0 -> mm2
461 :     punpckhbw mm0, mm6 ; r7b7r6b6r5b5r4b4 -> mm0
462 :     movq mm3, mm1
463 :     punpcklbw mm1, mm7 ; 0g30g20g10g0 -> mm1
464 :     punpckhbw mm3, mm7 ; 0g70g60g50g4 -> mm3
465 :     movq mm4, mm2
466 :     punpcklbw mm2, mm1 ; 0r1g1b10r0g0b0 -> mm2
467 :     punpckhbw mm4, mm1 ; 0r3g3b30r2g2b2 -> mm4
468 :     movq mm5, mm0
469 :     punpcklbw mm0, mm3 ; 0r5g5b50r4g4b4 -> mm0
470 :     punpckhbw mm5, mm3 ; 0r7g7b70r6g6b6 -> mm5
471 :     movd [edi+edx], mm2
472 :     psrlq mm2, 32
473 :     movd [edi+edx + 3], mm2
474 :     movd [edi+edx + 6], mm4
475 :     psrlq mm4, 32
476 :     movd [edi+edx + 9], mm4
477 :     movd [edi+edx + 12], mm0
478 :     psrlq mm0, 32
479 :     movd [edi+edx + 15], mm0
480 :     movq mm2, mm5
481 :     psrlq mm0, 8 ; 000000r5g5 -> mm0
482 :     psllq mm2, 32 ; 0r6g6b60000 -> mm2
483 :     psrlq mm5, 32 ; 00000r7g7b7 -> mm5
484 :     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 : edgomez 851
490 : edgomez 1382 %else ; BGRA (32-bit)
491 :     movq [edi], mm2
492 :     movq [edi + 8], mm4
493 :     movq [edi + 16], mm0
494 :     movq [edi + 24], mm5
495 :     movq mm0, [TEMP_B2]
496 :     movq mm1, [TEMP_G2]
497 :     movq mm2, mm0
498 :     punpcklbw mm2, mm6 ; r3b3r2b2r1b1r0b0 -> mm2
499 :     punpckhbw mm0, mm6 ; r7b7r6b6r5b5r4b4 -> mm0
500 :     movq mm3, mm1
501 :     punpcklbw mm1, mm7 ; 0g30g20g10g0 -> mm1
502 :     punpckhbw mm3, mm7 ; 0g70g60g50g4 -> mm3
503 :     movq mm4, mm2
504 :     punpcklbw mm2, mm1 ; 0r1g1b10r0g0b0 -> mm2
505 :     punpckhbw mm4, mm1 ; 0r3g3b30r2g2b2 -> mm4
506 :     movq mm5, mm0
507 :     punpcklbw mm0, mm3 ; 0r5g5b50r4g4b4 -> mm0
508 :     punpckhbw mm5, mm3 ; 0r7g7b70r6g6b6 -> mm5
509 :     movq [edi + edx], mm2
510 :     movq [edi + edx + 8], mm4
511 :     movq [edi + edx + 16], mm0
512 :     movq [edi + edx + 24], mm5
513 : edgomez 851 %endif
514 :    
515 :     %undef TEMP_Y1
516 :     %undef TEMP_Y2
517 :     %undef TEMP_G1
518 :     %undef TEMP_G2
519 :     %undef TEMP_B1
520 :     %undef TEMP_B2
521 :     %endmacro
522 :    
523 : edgomez 1382 ;=============================================================================
524 :     ; Code
525 :     ;=============================================================================
526 : edgomez 851
527 : edgomez 1382 SECTION .text
528 : edgomez 851
529 : edgomez 1382 %include "colorspace_mmx.inc"
530 : edgomez 851
531 :     ; input
532 :     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
534 : chl 1763 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 : edgomez 851
537 :     ; output
538 :     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
540 :    
541 : Isibaar 1790
542 :     %ifidn __OUTPUT_FORMAT__,elf
543 :     section ".note.GNU-stack" noalloc noexec nowrite progbits
544 :     %endif
545 :    

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