[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 1844 - (view) (download)

1 : edgomez 1382 ;/*****************************************************************************
2 : edgomez 851 ; *
3 : edgomez 1382 ; * XVID MPEG-4 VIDEO CODEC
4 :     ; * - RGB colorspace conversions -
5 : edgomez 851 ; *
6 : Isibaar 1795 ; * Copyright(C) 2002-2008 Michael Militzer <michael@xvid.org>
7 : edgomez 1382 ; * 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 : Isibaar 1795 %include "nasm.inc"
26 : edgomez 851
27 : edgomez 1382 ;=============================================================================
28 :     ; Some constants
29 :     ;=============================================================================
30 : edgomez 851
31 : edgomez 1382 ;-----------------------------------------------------------------------------
32 : edgomez 851 ; RGB->YV12 yuv constants
33 : edgomez 1382 ;-----------------------------------------------------------------------------
34 :    
35 : edgomez 851 %define Y_R 0.257
36 :     %define Y_G 0.504
37 :     %define Y_B 0.098
38 :     %define Y_ADD 16
39 :    
40 :     %define U_R 0.148
41 :     %define U_G 0.291
42 :     %define U_B 0.439
43 :     %define U_ADD 128
44 :    
45 :     %define V_R 0.439
46 :     %define V_G 0.368
47 :     %define V_B 0.071
48 :     %define V_ADD 128
49 :    
50 : edgomez 1382 ; Scaling used during conversion
51 :     %define SCALEBITS 6
52 : edgomez 851
53 : edgomez 1382 ;=============================================================================
54 :     ; Read only data
55 :     ;=============================================================================
56 : edgomez 851
57 : Isibaar 1795 DATA
58 : edgomez 851
59 : Isibaar 1795 ALIGN SECTION_ALIGN
60 :    
61 : edgomez 1382 ;-----------------------------------------------------------------------------
62 :     ; RGB->YV12 multiplication matrices
63 :     ;-----------------------------------------------------------------------------
64 :     ; FIX(Y_B) FIX(Y_G) FIX(Y_R) Ignored
65 : edgomez 851
66 : chl 1763 bgr_y_mul: dw 25, 129, 66, 0
67 :     bgr_u_mul: dw 112, -74, -38, 0
68 :     bgr_v_mul: dw -18, -94, 112, 0
69 : edgomez 851
70 : chl 1763 ;-----------------------------------------------------------------------------
71 :     ; BGR->YV12 multiplication matrices
72 :     ;-----------------------------------------------------------------------------
73 :     ; FIX(Y_R) FIX(Y_G) FIX(Y_B) Ignored
74 : edgomez 851
75 : chl 1763 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 : edgomez 1382 ;-----------------------------------------------------------------------------
80 :     ; YV12->RGB data
81 :     ;-----------------------------------------------------------------------------
82 : edgomez 851
83 : edgomez 1382 Y_SUB: dw 16, 16, 16, 16
84 :     U_SUB: dw 128, 128, 128, 128
85 :     V_SUB: dw 128, 128, 128, 128
86 : edgomez 851
87 : edgomez 1382 Y_MUL: dw 74, 74, 74, 74
88 : edgomez 851
89 : edgomez 1382 UG_MUL: dw 25, 25, 25, 25
90 :     VG_MUL: dw 52, 52, 52, 52
91 : edgomez 851
92 : edgomez 1382 UB_MUL: dw 129, 129, 129, 129
93 :     VR_MUL: dw 102, 102, 102, 102
94 : edgomez 851
95 : edgomez 1382 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 : edgomez 851 ;------------------------------------------------------------------------------
102 :     ; BGR_TO_YV12( BYTES )
103 :     ;
104 :     ; BYTES 3=bgr(24bit), 4=bgra(32-bit)
105 :     ;
106 :     ; bytes=3/4, pixels = 2, vpixels=2
107 :     ;------------------------------------------------------------------------------
108 : edgomez 1382
109 : edgomez 851 %macro BGR_TO_YV12_INIT 2
110 : chl 1763 movq mm7, [bgr_y_mul]
111 : edgomez 851 %endmacro
112 :    
113 :    
114 :     %macro BGR_TO_YV12 2
115 : edgomez 1382 ; y_out
116 : Isibaar 1795
117 : edgomez 1382 pxor mm4, mm4
118 :     pxor mm5, mm5
119 : Isibaar 1795 movd mm0, [x_ptr] ; x_ptr[0...]
120 :     movd mm2, [x_ptr+x_stride] ; x_ptr[x_stride...]
121 : edgomez 1382 punpcklbw mm0, mm4 ; [ |b |g |r ]
122 :     punpcklbw mm2, mm5 ; [ |b |g |r ]
123 :     movq mm6, mm0 ; = [ |b4|g4|r4]
124 :     paddw mm6, mm2 ; +[ |b4|g4|r4]
125 :     pmaddwd mm0, mm7 ; *= Y_MUL
126 :     pmaddwd mm2, mm7 ; *= Y_MUL
127 :     movq mm4, mm0 ; [r]
128 :     movq mm5, mm2 ; [r]
129 :     psrlq mm4, 32 ; +[g]
130 :     psrlq mm5, 32 ; +[g]
131 :     paddd mm0, mm4 ; +[b]
132 :     paddd mm2, mm5 ; +[b]
133 : edgomez 851
134 : edgomez 1382 pxor mm4, mm4
135 :     pxor mm5, mm5
136 : Isibaar 1795 movd mm1, [x_ptr+%1] ; src[%1...]
137 :     movd mm3, [x_ptr+x_stride+%1] ; src[x_stride+%1...]
138 : edgomez 1382 punpcklbw mm1, mm4 ; [ |b |g |r ]
139 :     punpcklbw mm3, mm5 ; [ |b |g |r ]
140 :     paddw mm6, mm1 ; +[ |b4|g4|r4]
141 :     paddw mm6, mm3 ; +[ |b4|g4|r4]
142 :     pmaddwd mm1, mm7 ; *= Y_MUL
143 :     pmaddwd mm3, mm7 ; *= Y_MUL
144 :     movq mm4, mm1 ; [r]
145 :     movq mm5, mm3 ; [r]
146 :     psrlq mm4, 32 ; +[g]
147 :     psrlq mm5, 32 ; +[g]
148 :     paddd mm1, mm4 ; +[b]
149 :     paddd mm3, mm5 ; +[b]
150 : edgomez 851
151 : Isibaar 1795 push x_stride
152 : edgomez 851
153 : Isibaar 1795 movd x_stride_d, mm0
154 :     shr x_stride, 8
155 :     add x_stride, Y_ADD
156 :     mov [y_ptr], dl ; y_ptr[0]
157 : edgomez 851
158 : Isibaar 1795 movd x_stride_d, mm1
159 :     shr x_stride, 8
160 :     add x_stride, Y_ADD
161 :     mov [y_ptr + 1], dl ; y_ptr[1]
162 : edgomez 851
163 : Isibaar 1795 movd x_stride_d, mm2
164 :     shr x_stride, 8
165 :     add x_stride, Y_ADD
166 :     mov [y_ptr + y_stride + 0], dl ; y_ptr[y_stride + 0]
167 : edgomez 851
168 : Isibaar 1795 movd x_stride_d, mm3
169 :     shr x_stride, 8
170 :     add x_stride, Y_ADD
171 :     mov [y_ptr + y_stride + 1], dl ; y_ptr[y_stride + 1]
172 : edgomez 851
173 : edgomez 1382 ; u_ptr, v_ptr
174 :     movq mm0, mm6 ; = [ |b4|g4|r4]
175 : chl 1763 pmaddwd mm6, [bgr_v_mul] ; *= V_MUL
176 :     pmaddwd mm0, [bgr_u_mul] ; *= U_MUL
177 : edgomez 1382 movq mm1, mm0
178 :     movq mm2, mm6
179 :     psrlq mm1, 32
180 :     psrlq mm2, 32
181 :     paddd mm0, mm1
182 :     paddd mm2, mm6
183 : edgomez 851
184 : Isibaar 1795 movd x_stride_d, mm0
185 :     shr x_stride, 10
186 :     add x_stride, U_ADD
187 :     mov [u_ptr], dl
188 : edgomez 851
189 : Isibaar 1795 movd x_stride_d, mm2
190 :     shr x_stride, 10
191 :     add x_stride, V_ADD
192 :     mov [v_ptr], dl
193 : edgomez 851
194 : Isibaar 1795 pop x_stride
195 : edgomez 851 %endmacro
196 :    
197 :     ;------------------------------------------------------------------------------
198 : chl 1763 ; 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 : Isibaar 1795 movd mm0, [x_ptr] ; x_ptr[0...]
215 :     movd mm2, [x_ptr+x_stride] ; x_ptr[x_stride...]
216 : chl 1763 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 : Isibaar 1795 movd mm1, [x_ptr+%1] ; src[%1...]
232 :     movd mm3, [x_ptr+x_stride+%1] ; src[x_stride+%1...]
233 : chl 1763 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 : Isibaar 1795 push x_stride
247 : chl 1763
248 : Isibaar 1795 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 : chl 1763
253 : Isibaar 1795 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 : chl 1763
258 : Isibaar 1795 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 : chl 1763
263 : Isibaar 1795 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 : chl 1763
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 : Isibaar 1795 movd x_stride_d, mm0
280 :     shr x_stride, 10
281 :     add x_stride, U_ADD
282 :     mov [u_ptr], dl
283 : chl 1763
284 : Isibaar 1795 movd x_stride_d, mm2
285 :     shr x_stride, 10
286 :     add x_stride, V_ADD
287 :     mov [v_ptr], dl
288 : chl 1763
289 : Isibaar 1795 pop x_stride
290 : chl 1763 %endmacro
291 :    
292 :     ;------------------------------------------------------------------------------
293 : edgomez 851 ; YV12_TO_BGR( BYTES )
294 :     ;
295 :     ; BYTES 3=bgr(24-bit), 4=bgra(32-bit)
296 :     ;
297 :     ; bytes=3/4, pixels = 8, vpixels=2
298 :     ;------------------------------------------------------------------------------
299 : edgomez 1382
300 : edgomez 851 %macro YV12_TO_BGR_INIT 2
301 : edgomez 1382 pxor mm7, mm7 ; clear mm7
302 : edgomez 851 %endmacro
303 :    
304 :     %macro YV12_TO_BGR 2
305 : Isibaar 1795 %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 : edgomez 851
312 : Isibaar 1795 movd mm2, [u_ptr] ; u_ptr[0]
313 :     movd mm3, [v_ptr] ; v_ptr[0]
314 : edgomez 1382 punpcklbw mm2, mm7 ; u3u2u1u0 -> mm2
315 :     punpcklbw mm3, mm7 ; v3v2v1v0 -> mm3
316 :     psubsw mm2, [U_SUB] ; U - 128
317 :     psubsw mm3, [V_SUB] ; V - 128
318 :     movq mm4, mm2
319 :     movq mm5, mm3
320 :     pmullw mm2, [UG_MUL]
321 :     pmullw mm3, [VG_MUL]
322 :     movq mm6, mm2 ; u3u2u1u0 -> mm6
323 :     punpckhwd mm2, mm2 ; u3u3u2u2 -> mm2
324 :     punpcklwd mm6, mm6 ; u1u1u0u0 -> mm6
325 :     pmullw mm4, [UB_MUL] ; B_ADD -> mm4
326 :     movq mm0, mm3
327 :     punpckhwd mm3, mm3 ; v3v3v2v2 -> mm2
328 :     punpcklwd mm0, mm0 ; v1v1v0v0 -> mm6
329 :     paddsw mm2, mm3
330 :     paddsw mm6, mm0
331 :     pmullw mm5, [VR_MUL] ; R_ADD -> mm5
332 : Isibaar 1795 movq mm0, [y_ptr] ; y7y6y5y4y3y2y1y0 -> mm0
333 : edgomez 1382 movq mm1, mm0
334 :     punpckhbw mm1, mm7 ; y7y6y5y4 -> mm1
335 :     punpcklbw mm0, mm7 ; y3y2y1y0 -> mm0
336 :     psubsw mm0, [Y_SUB] ; Y - Y_SUB
337 :     psubsw mm1, [Y_SUB] ; Y - Y_SUB
338 :     pmullw mm1, [Y_MUL]
339 :     pmullw mm0, [Y_MUL]
340 :     movq [TEMP_Y2], mm1 ; y7y6y5y4 -> mm3
341 :     movq [TEMP_Y1], mm0 ; y3y2y1y0 -> mm7
342 :     psubsw mm1, mm2 ; g7g6g5g4 -> mm1
343 :     psubsw mm0, mm6 ; g3g2g1g0 -> mm0
344 :     psraw mm1, SCALEBITS
345 :     psraw mm0, SCALEBITS
346 :     packuswb mm0, mm1 ;g7g6g5g4g3g2g1g0 -> mm0
347 :     movq [TEMP_G1], mm0
348 : Isibaar 1795 movq mm0, [y_ptr+y_stride] ; y7y6y5y4y3y2y1y0 -> mm0
349 : edgomez 1382 movq mm1, mm0
350 :     punpckhbw mm1, mm7 ; y7y6y5y4 -> mm1
351 :     punpcklbw mm0, mm7 ; y3y2y1y0 -> mm0
352 :     psubsw mm0, [Y_SUB] ; Y - Y_SUB
353 :     psubsw mm1, [Y_SUB] ; Y - Y_SUB
354 :     pmullw mm1, [Y_MUL]
355 :     pmullw mm0, [Y_MUL]
356 :     movq mm3, mm1
357 :     psubsw mm1, mm2 ; g7g6g5g4 -> mm1
358 :     movq mm2, mm0
359 :     psubsw mm0, mm6 ; g3g2g1g0 -> mm0
360 :     psraw mm1, SCALEBITS
361 :     psraw mm0, SCALEBITS
362 :     packuswb mm0, mm1 ; g7g6g5g4g3g2g1g0 -> mm0
363 :     movq [TEMP_G2], mm0
364 :     movq mm0, mm4
365 :     punpckhwd mm4, mm4 ; u3u3u2u2 -> mm2
366 :     punpcklwd mm0, mm0 ; u1u1u0u0 -> mm6
367 :     movq mm1, mm3 ; y7y6y5y4 -> mm1
368 :     paddsw mm3, mm4 ; b7b6b5b4 -> mm3
369 :     movq mm7, mm2 ; y3y2y1y0 -> mm7
370 :     paddsw mm2, mm0 ; b3b2b1b0 -> mm2
371 :     psraw mm3, SCALEBITS
372 :     psraw mm2, SCALEBITS
373 :     packuswb mm2, mm3 ; b7b6b5b4b3b2b1b0 -> mm2
374 :     movq [TEMP_B2], mm2
375 :     movq mm3, [TEMP_Y2]
376 :     movq mm2, [TEMP_Y1]
377 :     movq mm6, mm3 ; TEMP_Y2 -> mm6
378 :     paddsw mm3, mm4 ; b7b6b5b4 -> mm3
379 :     movq mm4, mm2 ; TEMP_Y1 -> mm4
380 :     paddsw mm2, mm0 ; b3b2b1b0 -> mm2
381 :     psraw mm3, SCALEBITS
382 :     psraw mm2, SCALEBITS
383 :     packuswb mm2, mm3 ; b7b6b5b4b3b2b1b0 -> mm2
384 :     movq [TEMP_B1], mm2
385 :     movq mm0, mm5
386 :     punpckhwd mm5, mm5 ; v3v3v2v2 -> mm5
387 :     punpcklwd mm0, mm0 ; v1v1v0v0 -> mm0
388 :     paddsw mm1, mm5 ; r7r6r5r4 -> mm1
389 :     paddsw mm7, mm0 ; r3r2r1r0 -> mm7
390 :     psraw mm1, SCALEBITS
391 :     psraw mm7, SCALEBITS
392 :     packuswb mm7, mm1 ; r7r6r5r4r3r2r1r0 -> mm7 (TEMP_R2)
393 :     paddsw mm6, mm5 ; r7r6r5r4 -> mm6
394 :     paddsw mm4, mm0 ; r3r2r1r0 -> mm4
395 :     psraw mm6, SCALEBITS
396 :     psraw mm4, SCALEBITS
397 :     packuswb mm4, mm6 ; r7r6r5r4r3r2r1r0 -> mm4 (TEMP_R1)
398 :     movq mm0, [TEMP_B1]
399 :     movq mm1, [TEMP_G1]
400 :     movq mm6, mm7
401 :     movq mm2, mm0
402 :     punpcklbw mm2, mm4 ; r3b3r2b2r1b1r0b0 -> mm2
403 :     punpckhbw mm0, mm4 ; r7b7r6b6r5b5r4b4 -> mm0
404 :     pxor mm7, mm7
405 :     movq mm3, mm1
406 :     punpcklbw mm1, mm7 ; 0g30g20g10g0 -> mm1
407 :     punpckhbw mm3, mm7 ; 0g70g60g50g4 -> mm3
408 :     movq mm4, mm2
409 :     punpcklbw mm2, mm1 ; 0r1g1b10r0g0b0 -> mm2
410 :     punpckhbw mm4, mm1 ; 0r3g3b30r2g2b2 -> mm4
411 :     movq mm5, mm0
412 :     punpcklbw mm0, mm3 ; 0r5g5b50r4g4b4 -> mm0
413 :     punpckhbw mm5, mm3 ; 0r7g7b70r6g6b6 -> mm5
414 :     %if %1 == 3 ; BGR (24-bit)
415 : Isibaar 1795 movd [x_ptr], mm2
416 : edgomez 1382 psrlq mm2, 32
417 : Isibaar 1795 movd [x_ptr + 3], mm2
418 :     movd [x_ptr + 6], mm4
419 : edgomez 1382 psrlq mm4, 32
420 : Isibaar 1795 movd [x_ptr + 9], mm4
421 :     movd [x_ptr + 12], mm0
422 : edgomez 1382 psrlq mm0, 32
423 : Isibaar 1795 movd [x_ptr + 15], mm0
424 : edgomez 1382 movq mm2, mm5
425 :     psrlq mm0, 8 ; 000000r5g5 -> mm0
426 :     psllq mm2, 32 ; 0r6g6b60000 -> mm2
427 :     psrlq mm5, 32 ; 00000r7g7b7 -> mm5
428 :     psrlq mm2, 16 ; 000r6g6b600 -> mm2
429 :     por mm0, mm2 ; 000r6g6b6r5g5 -> mm0
430 :     psllq mm5, 40 ; r7g7b700000 -> mm5
431 :     por mm5, mm0 ; r7g7b7r6g6b6r5g5 -> mm5
432 : Isibaar 1795 movq [x_ptr + 16], mm5
433 : edgomez 1382 movq mm0, [TEMP_B2]
434 :     movq mm1, [TEMP_G2]
435 :     movq mm2, mm0
436 :     punpcklbw mm2, mm6 ; r3b3r2b2r1b1r0b0 -> mm2
437 :     punpckhbw mm0, mm6 ; r7b7r6b6r5b5r4b4 -> mm0
438 :     movq mm3, mm1
439 :     punpcklbw mm1, mm7 ; 0g30g20g10g0 -> mm1
440 :     punpckhbw mm3, mm7 ; 0g70g60g50g4 -> mm3
441 :     movq mm4, mm2
442 :     punpcklbw mm2, mm1 ; 0r1g1b10r0g0b0 -> mm2
443 :     punpckhbw mm4, mm1 ; 0r3g3b30r2g2b2 -> mm4
444 :     movq mm5, mm0
445 :     punpcklbw mm0, mm3 ; 0r5g5b50r4g4b4 -> mm0
446 :     punpckhbw mm5, mm3 ; 0r7g7b70r6g6b6 -> mm5
447 : Isibaar 1795 movd [x_ptr+x_stride], mm2
448 : edgomez 1382 psrlq mm2, 32
449 : Isibaar 1795 movd [x_ptr+x_stride + 3], mm2
450 :     movd [x_ptr+x_stride + 6], mm4
451 : edgomez 1382 psrlq mm4, 32
452 : Isibaar 1795 movd [x_ptr+x_stride + 9], mm4
453 :     movd [x_ptr+x_stride + 12], mm0
454 : edgomez 1382 psrlq mm0, 32
455 : Isibaar 1795 movd [x_ptr+x_stride + 15], mm0
456 : edgomez 1382 movq mm2, mm5
457 :     psrlq mm0, 8 ; 000000r5g5 -> mm0
458 :     psllq mm2, 32 ; 0r6g6b60000 -> mm2
459 :     psrlq mm5, 32 ; 00000r7g7b7 -> mm5
460 :     psrlq mm2, 16 ; 000r6g6b600 -> mm2
461 :     por mm0, mm2 ; 000r6g6b6r5g5 -> mm0
462 :     psllq mm5, 40 ; r7g7b700000 -> mm5
463 :     por mm5, mm0 ; r7g7b7r6g6b6r5g5 -> mm5
464 : Isibaar 1795 movq [x_ptr + x_stride + 16], mm5
465 : edgomez 851
466 : edgomez 1382 %else ; BGRA (32-bit)
467 : Isibaar 1795 movq [x_ptr], mm2
468 :     movq [x_ptr + 8], mm4
469 :     movq [x_ptr + 16], mm0
470 :     movq [x_ptr + 24], mm5
471 : edgomez 1382 movq mm0, [TEMP_B2]
472 :     movq mm1, [TEMP_G2]
473 :     movq mm2, mm0
474 :     punpcklbw mm2, mm6 ; r3b3r2b2r1b1r0b0 -> mm2
475 :     punpckhbw mm0, mm6 ; r7b7r6b6r5b5r4b4 -> mm0
476 :     movq mm3, mm1
477 :     punpcklbw mm1, mm7 ; 0g30g20g10g0 -> mm1
478 :     punpckhbw mm3, mm7 ; 0g70g60g50g4 -> mm3
479 :     movq mm4, mm2
480 :     punpcklbw mm2, mm1 ; 0r1g1b10r0g0b0 -> mm2
481 :     punpckhbw mm4, mm1 ; 0r3g3b30r2g2b2 -> mm4
482 :     movq mm5, mm0
483 :     punpcklbw mm0, mm3 ; 0r5g5b50r4g4b4 -> mm0
484 :     punpckhbw mm5, mm3 ; 0r7g7b70r6g6b6 -> mm5
485 : Isibaar 1795 movq [x_ptr + x_stride], mm2
486 :     movq [x_ptr + x_stride + 8], mm4
487 :     movq [x_ptr + x_stride + 16], mm0
488 :     movq [x_ptr + x_stride + 24], mm5
489 : edgomez 851 %endif
490 :    
491 :     %undef TEMP_Y1
492 :     %undef TEMP_Y2
493 :     %undef TEMP_G1
494 :     %undef TEMP_G2
495 :     %undef TEMP_B1
496 :     %undef TEMP_B2
497 :     %endmacro
498 :    
499 : edgomez 1382 ;=============================================================================
500 :     ; Code
501 :     ;=============================================================================
502 : edgomez 851
503 : Isibaar 1844 TEXT
504 : edgomez 851
505 : edgomez 1382 %include "colorspace_mmx.inc"
506 : edgomez 851
507 :     ; input
508 :     MAKE_COLORSPACE bgr_to_yv12_mmx,0, 3,2,2, BGR_TO_YV12, 3, -1
509 :     MAKE_COLORSPACE bgra_to_yv12_mmx,0, 4,2,2, BGR_TO_YV12, 4, -1
510 : chl 1763 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 : edgomez 851
513 :     ; 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 : Isibaar 1790
518 :     %ifidn __OUTPUT_FORMAT__,elf
519 :     section ".note.GNU-stack" noalloc noexec nowrite progbits
520 :     %endif
521 :    

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