[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 2112 - (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 : Isibaar 1857 %define SCALEBITS_OUT 6
52 :     %define SCALEBITS_IN 13
53 : edgomez 851
54 : Isibaar 1857 %define FIX_ROUND (1<<(SCALEBITS_IN-1))
55 :    
56 : edgomez 1382 ;=============================================================================
57 :     ; Read only data
58 :     ;=============================================================================
59 : edgomez 851
60 : Isibaar 1795 DATA
61 : edgomez 851
62 : Isibaar 1795 ALIGN SECTION_ALIGN
63 :    
64 : edgomez 1382 ;-----------------------------------------------------------------------------
65 :     ; RGB->YV12 multiplication matrices
66 :     ;-----------------------------------------------------------------------------
67 :     ; FIX(Y_B) FIX(Y_G) FIX(Y_R) Ignored
68 : edgomez 851
69 : Isibaar 1857 bgr_y_mul: dw 803, 4129, 2105, 0
70 :     bgr_u_mul: dw 3596, -2384, -1212, 0
71 :     bgr_v_mul: dw -582, -3015, 3596, 0
72 : edgomez 851
73 : chl 1763 ;-----------------------------------------------------------------------------
74 :     ; BGR->YV12 multiplication matrices
75 :     ;-----------------------------------------------------------------------------
76 :     ; FIX(Y_R) FIX(Y_G) FIX(Y_B) Ignored
77 : edgomez 851
78 : Isibaar 1857 rgb_y_mul: dw 2105, 4129, 803, 0
79 :     rgb_u_mul: dw -1212, -2384, 3596, 0
80 :     rgb_v_mul: dw 3596, -3015, -582, 0
81 : chl 1763
82 : edgomez 1382 ;-----------------------------------------------------------------------------
83 :     ; YV12->RGB data
84 :     ;-----------------------------------------------------------------------------
85 : edgomez 851
86 : edgomez 1382 Y_SUB: dw 16, 16, 16, 16
87 :     U_SUB: dw 128, 128, 128, 128
88 :     V_SUB: dw 128, 128, 128, 128
89 : edgomez 851
90 : edgomez 1382 Y_MUL: dw 74, 74, 74, 74
91 : edgomez 851
92 : edgomez 1382 UG_MUL: dw 25, 25, 25, 25
93 :     VG_MUL: dw 52, 52, 52, 52
94 : edgomez 851
95 : edgomez 1382 UB_MUL: dw 129, 129, 129, 129
96 :     VR_MUL: dw 102, 102, 102, 102
97 : edgomez 851
98 : edgomez 1382 BRIGHT: db 128, 128, 128, 128, 128, 128, 128, 128
99 :    
100 :     ;=============================================================================
101 :     ; Helper macros used with the colorspace_mmx.inc file
102 :     ;=============================================================================
103 :    
104 : edgomez 851 ;------------------------------------------------------------------------------
105 :     ; BGR_TO_YV12( BYTES )
106 :     ;
107 :     ; BYTES 3=bgr(24bit), 4=bgra(32-bit)
108 :     ;
109 :     ; bytes=3/4, pixels = 2, vpixels=2
110 :     ;------------------------------------------------------------------------------
111 : edgomez 1382
112 : edgomez 851 %macro BGR_TO_YV12_INIT 2
113 : chl 1763 movq mm7, [bgr_y_mul]
114 : edgomez 851 %endmacro
115 :    
116 :    
117 :     %macro BGR_TO_YV12 2
118 : edgomez 1382 ; y_out
119 : Isibaar 1795
120 : edgomez 1382 pxor mm4, mm4
121 :     pxor mm5, mm5
122 : Isibaar 2112 movd mm0, [x_ptr] ; x_ptr[0...]
123 :     movd mm2, [x_ptr+x_stride] ; x_ptr[x_stride...]
124 : edgomez 1382 punpcklbw mm0, mm4 ; [ |b |g |r ]
125 :     punpcklbw mm2, mm5 ; [ |b |g |r ]
126 :     movq mm6, mm0 ; = [ |b4|g4|r4]
127 :     paddw mm6, mm2 ; +[ |b4|g4|r4]
128 :     pmaddwd mm0, mm7 ; *= Y_MUL
129 :     pmaddwd mm2, mm7 ; *= Y_MUL
130 :     movq mm4, mm0 ; [r]
131 :     movq mm5, mm2 ; [r]
132 :     psrlq mm4, 32 ; +[g]
133 :     psrlq mm5, 32 ; +[g]
134 :     paddd mm0, mm4 ; +[b]
135 :     paddd mm2, mm5 ; +[b]
136 : edgomez 851
137 : edgomez 1382 pxor mm4, mm4
138 :     pxor mm5, mm5
139 : Isibaar 2112 %if %1 == 3 ; BGR (24-bit)
140 :     movd mm1, [x_ptr+2]
141 :     movd mm3, [x_ptr+x_stride+2]
142 :     psrlq mm1, 8 ; src[%1...]
143 :     psrlq mm3, 8 ; src[x_stride+%1...]
144 :     %else
145 :     movd mm1, [x_ptr+%1] ; src[%1...]
146 :     movd mm3, [x_ptr+x_stride+%1] ; src[x_stride+%1...]
147 :     %endif
148 : edgomez 1382 punpcklbw mm1, mm4 ; [ |b |g |r ]
149 :     punpcklbw mm3, mm5 ; [ |b |g |r ]
150 :     paddw mm6, mm1 ; +[ |b4|g4|r4]
151 :     paddw mm6, mm3 ; +[ |b4|g4|r4]
152 :     pmaddwd mm1, mm7 ; *= Y_MUL
153 :     pmaddwd mm3, mm7 ; *= Y_MUL
154 :     movq mm4, mm1 ; [r]
155 :     movq mm5, mm3 ; [r]
156 :     psrlq mm4, 32 ; +[g]
157 :     psrlq mm5, 32 ; +[g]
158 :     paddd mm1, mm4 ; +[b]
159 :     paddd mm3, mm5 ; +[b]
160 : edgomez 851
161 : Isibaar 1795 push x_stride
162 : edgomez 851
163 : Isibaar 1795 movd x_stride_d, mm0
164 : Isibaar 1857 add x_stride, FIX_ROUND
165 :     shr x_stride, SCALEBITS_IN
166 : Isibaar 1795 add x_stride, Y_ADD
167 :     mov [y_ptr], dl ; y_ptr[0]
168 : edgomez 851
169 : Isibaar 1795 movd x_stride_d, mm1
170 : Isibaar 1857 add x_stride, FIX_ROUND
171 :     shr x_stride, SCALEBITS_IN
172 : Isibaar 1795 add x_stride, Y_ADD
173 :     mov [y_ptr + 1], dl ; y_ptr[1]
174 : edgomez 851
175 : Isibaar 1795 movd x_stride_d, mm2
176 : Isibaar 1857 add x_stride, FIX_ROUND
177 :     shr x_stride, SCALEBITS_IN
178 : Isibaar 1795 add x_stride, Y_ADD
179 :     mov [y_ptr + y_stride + 0], dl ; y_ptr[y_stride + 0]
180 : edgomez 851
181 : Isibaar 1795 movd x_stride_d, mm3
182 : Isibaar 1857 add x_stride, FIX_ROUND
183 :     shr x_stride, SCALEBITS_IN
184 : Isibaar 1795 add x_stride, Y_ADD
185 :     mov [y_ptr + y_stride + 1], dl ; y_ptr[y_stride + 1]
186 : edgomez 851
187 : edgomez 1382 ; u_ptr, v_ptr
188 :     movq mm0, mm6 ; = [ |b4|g4|r4]
189 : chl 1763 pmaddwd mm6, [bgr_v_mul] ; *= V_MUL
190 :     pmaddwd mm0, [bgr_u_mul] ; *= U_MUL
191 : edgomez 1382 movq mm1, mm0
192 :     movq mm2, mm6
193 :     psrlq mm1, 32
194 :     psrlq mm2, 32
195 :     paddd mm0, mm1
196 :     paddd mm2, mm6
197 : edgomez 851
198 : Isibaar 1795 movd x_stride_d, mm0
199 : Isibaar 1857 add x_stride, 4*FIX_ROUND
200 :     shr x_stride, (SCALEBITS_IN+2)
201 : Isibaar 1795 add x_stride, U_ADD
202 :     mov [u_ptr], dl
203 : edgomez 851
204 : Isibaar 1795 movd x_stride_d, mm2
205 : Isibaar 1857 add x_stride, 4*FIX_ROUND
206 :     shr x_stride, (SCALEBITS_IN+2)
207 : Isibaar 1795 add x_stride, V_ADD
208 :     mov [v_ptr], dl
209 : edgomez 851
210 : Isibaar 1795 pop x_stride
211 : edgomez 851 %endmacro
212 :    
213 :     ;------------------------------------------------------------------------------
214 : chl 1763 ; RGB_TO_YV12( BYTES )
215 :     ;
216 :     ; BYTES 3=rgb(24bit), 4=rgba(32-bit)
217 :     ;
218 :     ; bytes=3/4, pixels = 2, vpixels=2
219 :     ;------------------------------------------------------------------------------
220 :    
221 :     %macro RGB_TO_YV12_INIT 2
222 :     movq mm7, [rgb_y_mul]
223 :     %endmacro
224 :    
225 :    
226 :     %macro RGB_TO_YV12 2
227 :     ; y_out
228 :     pxor mm4, mm4
229 :     pxor mm5, mm5
230 : Isibaar 1795 movd mm0, [x_ptr] ; x_ptr[0...]
231 :     movd mm2, [x_ptr+x_stride] ; x_ptr[x_stride...]
232 : chl 1763 punpcklbw mm0, mm4 ; [ |b |g |r ]
233 :     punpcklbw mm2, mm5 ; [ |b |g |r ]
234 :     movq mm6, mm0 ; = [ |b4|g4|r4]
235 :     paddw mm6, mm2 ; +[ |b4|g4|r4]
236 :     pmaddwd mm0, mm7 ; *= Y_MUL
237 :     pmaddwd mm2, mm7 ; *= Y_MUL
238 :     movq mm4, mm0 ; [r]
239 :     movq mm5, mm2 ; [r]
240 :     psrlq mm4, 32 ; +[g]
241 :     psrlq mm5, 32 ; +[g]
242 :     paddd mm0, mm4 ; +[b]
243 :     paddd mm2, mm5 ; +[b]
244 :    
245 :     pxor mm4, mm4
246 :     pxor mm5, mm5
247 : Isibaar 2112 %if %1 == 3 ; BGR (24-bit)
248 :     movd mm1, [x_ptr+2]
249 :     movd mm3, [x_ptr+x_stride+2]
250 :     psrlq mm1, 8 ; src[%1...]
251 :     psrlq mm3, 8 ; src[x_stride+%1...]
252 :     %else
253 : Isibaar 1795 movd mm1, [x_ptr+%1] ; src[%1...]
254 :     movd mm3, [x_ptr+x_stride+%1] ; src[x_stride+%1...]
255 : Isibaar 2112 %endif
256 : chl 1763 punpcklbw mm1, mm4 ; [ |b |g |r ]
257 :     punpcklbw mm3, mm5 ; [ |b |g |r ]
258 :     paddw mm6, mm1 ; +[ |b4|g4|r4]
259 :     paddw mm6, mm3 ; +[ |b4|g4|r4]
260 :     pmaddwd mm1, mm7 ; *= Y_MUL
261 :     pmaddwd mm3, mm7 ; *= Y_MUL
262 :     movq mm4, mm1 ; [r]
263 :     movq mm5, mm3 ; [r]
264 :     psrlq mm4, 32 ; +[g]
265 :     psrlq mm5, 32 ; +[g]
266 :     paddd mm1, mm4 ; +[b]
267 :     paddd mm3, mm5 ; +[b]
268 :    
269 : Isibaar 1795 push x_stride
270 : chl 1763
271 : Isibaar 1795 movd x_stride_d, mm0
272 : Isibaar 1857 add x_stride, FIX_ROUND
273 :     shr x_stride, SCALEBITS_IN
274 : Isibaar 1795 add x_stride, Y_ADD
275 :     mov [y_ptr], dl ; y_ptr[0]
276 : chl 1763
277 : Isibaar 1795 movd x_stride_d, mm1
278 : Isibaar 1857 add x_stride, FIX_ROUND
279 :     shr x_stride, SCALEBITS_IN
280 : Isibaar 1795 add x_stride, Y_ADD
281 :     mov [y_ptr + 1], dl ; y_ptr[1]
282 : chl 1763
283 : Isibaar 1795 movd x_stride_d, mm2
284 : Isibaar 1857 add x_stride, FIX_ROUND
285 :     shr x_stride, SCALEBITS_IN
286 : Isibaar 1795 add x_stride, Y_ADD
287 :     mov [y_ptr + y_stride + 0], dl ; y_ptr[y_stride + 0]
288 : chl 1763
289 : Isibaar 1795 movd x_stride_d, mm3
290 : Isibaar 1857 add x_stride, FIX_ROUND
291 :     shr x_stride, SCALEBITS_IN
292 : Isibaar 1795 add x_stride, Y_ADD
293 :     mov [y_ptr + y_stride + 1], dl ; y_ptr[y_stride + 1]
294 : chl 1763
295 :     ; u_ptr, v_ptr
296 :     movq mm0, mm6 ; = [ |b4|g4|r4]
297 :     pmaddwd mm6, [rgb_v_mul] ; *= V_MUL
298 :     pmaddwd mm0, [rgb_u_mul] ; *= U_MUL
299 :     movq mm1, mm0
300 :     movq mm2, mm6
301 :     psrlq mm1, 32
302 :     psrlq mm2, 32
303 :     paddd mm0, mm1
304 :     paddd mm2, mm6
305 :    
306 : Isibaar 1795 movd x_stride_d, mm0
307 : Isibaar 1857 add x_stride, 4*FIX_ROUND
308 :     shr x_stride, (SCALEBITS_IN+2)
309 : Isibaar 1795 add x_stride, U_ADD
310 :     mov [u_ptr], dl
311 : chl 1763
312 : Isibaar 1795 movd x_stride_d, mm2
313 : Isibaar 1857 add x_stride, 4*FIX_ROUND
314 :     shr x_stride, (SCALEBITS_IN+2)
315 : Isibaar 1795 add x_stride, V_ADD
316 :     mov [v_ptr], dl
317 : chl 1763
318 : Isibaar 1795 pop x_stride
319 : chl 1763 %endmacro
320 :    
321 :     ;------------------------------------------------------------------------------
322 : edgomez 851 ; YV12_TO_BGR( BYTES )
323 :     ;
324 :     ; BYTES 3=bgr(24-bit), 4=bgra(32-bit)
325 :     ;
326 :     ; bytes=3/4, pixels = 8, vpixels=2
327 :     ;------------------------------------------------------------------------------
328 : edgomez 1382
329 : edgomez 851 %macro YV12_TO_BGR_INIT 2
330 : edgomez 1382 pxor mm7, mm7 ; clear mm7
331 : edgomez 851 %endmacro
332 :    
333 :     %macro YV12_TO_BGR 2
334 : Isibaar 1795 %define TEMP_Y1 _ESP
335 :     %define TEMP_Y2 _ESP + 8
336 :     %define TEMP_G1 _ESP + 16
337 :     %define TEMP_G2 _ESP + 24
338 :     %define TEMP_B1 _ESP + 32
339 :     %define TEMP_B2 _ESP + 40
340 : edgomez 851
341 : Isibaar 1795 movd mm2, [u_ptr] ; u_ptr[0]
342 :     movd mm3, [v_ptr] ; v_ptr[0]
343 : edgomez 1382 punpcklbw mm2, mm7 ; u3u2u1u0 -> mm2
344 :     punpcklbw mm3, mm7 ; v3v2v1v0 -> mm3
345 :     psubsw mm2, [U_SUB] ; U - 128
346 :     psubsw mm3, [V_SUB] ; V - 128
347 :     movq mm4, mm2
348 :     movq mm5, mm3
349 :     pmullw mm2, [UG_MUL]
350 :     pmullw mm3, [VG_MUL]
351 :     movq mm6, mm2 ; u3u2u1u0 -> mm6
352 :     punpckhwd mm2, mm2 ; u3u3u2u2 -> mm2
353 :     punpcklwd mm6, mm6 ; u1u1u0u0 -> mm6
354 :     pmullw mm4, [UB_MUL] ; B_ADD -> mm4
355 :     movq mm0, mm3
356 :     punpckhwd mm3, mm3 ; v3v3v2v2 -> mm2
357 :     punpcklwd mm0, mm0 ; v1v1v0v0 -> mm6
358 :     paddsw mm2, mm3
359 :     paddsw mm6, mm0
360 :     pmullw mm5, [VR_MUL] ; R_ADD -> mm5
361 : Isibaar 1795 movq mm0, [y_ptr] ; y7y6y5y4y3y2y1y0 -> mm0
362 : edgomez 1382 movq mm1, mm0
363 :     punpckhbw mm1, mm7 ; y7y6y5y4 -> mm1
364 :     punpcklbw mm0, mm7 ; y3y2y1y0 -> mm0
365 :     psubsw mm0, [Y_SUB] ; Y - Y_SUB
366 :     psubsw mm1, [Y_SUB] ; Y - Y_SUB
367 :     pmullw mm1, [Y_MUL]
368 :     pmullw mm0, [Y_MUL]
369 :     movq [TEMP_Y2], mm1 ; y7y6y5y4 -> mm3
370 :     movq [TEMP_Y1], mm0 ; y3y2y1y0 -> mm7
371 :     psubsw mm1, mm2 ; g7g6g5g4 -> mm1
372 :     psubsw mm0, mm6 ; g3g2g1g0 -> mm0
373 : Isibaar 1857 psraw mm1, SCALEBITS_OUT
374 :     psraw mm0, SCALEBITS_OUT
375 : edgomez 1382 packuswb mm0, mm1 ;g7g6g5g4g3g2g1g0 -> mm0
376 :     movq [TEMP_G1], mm0
377 : Isibaar 1795 movq mm0, [y_ptr+y_stride] ; y7y6y5y4y3y2y1y0 -> mm0
378 : edgomez 1382 movq mm1, mm0
379 :     punpckhbw mm1, mm7 ; y7y6y5y4 -> mm1
380 :     punpcklbw mm0, mm7 ; y3y2y1y0 -> mm0
381 :     psubsw mm0, [Y_SUB] ; Y - Y_SUB
382 :     psubsw mm1, [Y_SUB] ; Y - Y_SUB
383 :     pmullw mm1, [Y_MUL]
384 :     pmullw mm0, [Y_MUL]
385 :     movq mm3, mm1
386 :     psubsw mm1, mm2 ; g7g6g5g4 -> mm1
387 :     movq mm2, mm0
388 :     psubsw mm0, mm6 ; g3g2g1g0 -> mm0
389 : Isibaar 1857 psraw mm1, SCALEBITS_OUT
390 :     psraw mm0, SCALEBITS_OUT
391 : edgomez 1382 packuswb mm0, mm1 ; g7g6g5g4g3g2g1g0 -> mm0
392 :     movq [TEMP_G2], mm0
393 :     movq mm0, mm4
394 :     punpckhwd mm4, mm4 ; u3u3u2u2 -> mm2
395 :     punpcklwd mm0, mm0 ; u1u1u0u0 -> mm6
396 :     movq mm1, mm3 ; y7y6y5y4 -> mm1
397 :     paddsw mm3, mm4 ; b7b6b5b4 -> mm3
398 :     movq mm7, mm2 ; y3y2y1y0 -> mm7
399 :     paddsw mm2, mm0 ; b3b2b1b0 -> mm2
400 : Isibaar 1857 psraw mm3, SCALEBITS_OUT
401 :     psraw mm2, SCALEBITS_OUT
402 : edgomez 1382 packuswb mm2, mm3 ; b7b6b5b4b3b2b1b0 -> mm2
403 :     movq [TEMP_B2], mm2
404 :     movq mm3, [TEMP_Y2]
405 :     movq mm2, [TEMP_Y1]
406 :     movq mm6, mm3 ; TEMP_Y2 -> mm6
407 :     paddsw mm3, mm4 ; b7b6b5b4 -> mm3
408 :     movq mm4, mm2 ; TEMP_Y1 -> mm4
409 :     paddsw mm2, mm0 ; b3b2b1b0 -> mm2
410 : Isibaar 1857 psraw mm3, SCALEBITS_OUT
411 :     psraw mm2, SCALEBITS_OUT
412 : edgomez 1382 packuswb mm2, mm3 ; b7b6b5b4b3b2b1b0 -> mm2
413 :     movq [TEMP_B1], mm2
414 :     movq mm0, mm5
415 :     punpckhwd mm5, mm5 ; v3v3v2v2 -> mm5
416 :     punpcklwd mm0, mm0 ; v1v1v0v0 -> mm0
417 :     paddsw mm1, mm5 ; r7r6r5r4 -> mm1
418 :     paddsw mm7, mm0 ; r3r2r1r0 -> mm7
419 : Isibaar 1857 psraw mm1, SCALEBITS_OUT
420 :     psraw mm7, SCALEBITS_OUT
421 : edgomez 1382 packuswb mm7, mm1 ; r7r6r5r4r3r2r1r0 -> mm7 (TEMP_R2)
422 :     paddsw mm6, mm5 ; r7r6r5r4 -> mm6
423 :     paddsw mm4, mm0 ; r3r2r1r0 -> mm4
424 : Isibaar 1857 psraw mm6, SCALEBITS_OUT
425 :     psraw mm4, SCALEBITS_OUT
426 : edgomez 1382 packuswb mm4, mm6 ; r7r6r5r4r3r2r1r0 -> mm4 (TEMP_R1)
427 :     movq mm0, [TEMP_B1]
428 :     movq mm1, [TEMP_G1]
429 :     movq mm6, mm7
430 :     movq mm2, mm0
431 :     punpcklbw mm2, mm4 ; r3b3r2b2r1b1r0b0 -> mm2
432 :     punpckhbw mm0, mm4 ; r7b7r6b6r5b5r4b4 -> mm0
433 :     pxor mm7, mm7
434 :     movq mm3, mm1
435 :     punpcklbw mm1, mm7 ; 0g30g20g10g0 -> mm1
436 :     punpckhbw mm3, mm7 ; 0g70g60g50g4 -> mm3
437 :     movq mm4, mm2
438 :     punpcklbw mm2, mm1 ; 0r1g1b10r0g0b0 -> mm2
439 :     punpckhbw mm4, mm1 ; 0r3g3b30r2g2b2 -> mm4
440 :     movq mm5, mm0
441 :     punpcklbw mm0, mm3 ; 0r5g5b50r4g4b4 -> mm0
442 :     punpckhbw mm5, mm3 ; 0r7g7b70r6g6b6 -> mm5
443 :     %if %1 == 3 ; BGR (24-bit)
444 : Isibaar 1795 movd [x_ptr], mm2
445 : edgomez 1382 psrlq mm2, 32
446 : Isibaar 1795 movd [x_ptr + 3], mm2
447 :     movd [x_ptr + 6], mm4
448 : edgomez 1382 psrlq mm4, 32
449 : Isibaar 1795 movd [x_ptr + 9], mm4
450 :     movd [x_ptr + 12], mm0
451 : edgomez 1382 psrlq mm0, 32
452 : Isibaar 1795 movd [x_ptr + 15], mm0
453 : edgomez 1382 movq mm2, mm5
454 :     psrlq mm0, 8 ; 000000r5g5 -> mm0
455 :     psllq mm2, 32 ; 0r6g6b60000 -> mm2
456 :     psrlq mm5, 32 ; 00000r7g7b7 -> mm5
457 :     psrlq mm2, 16 ; 000r6g6b600 -> mm2
458 :     por mm0, mm2 ; 000r6g6b6r5g5 -> mm0
459 :     psllq mm5, 40 ; r7g7b700000 -> mm5
460 :     por mm5, mm0 ; r7g7b7r6g6b6r5g5 -> mm5
461 : Isibaar 1795 movq [x_ptr + 16], mm5
462 : edgomez 1382 movq mm0, [TEMP_B2]
463 :     movq mm1, [TEMP_G2]
464 :     movq mm2, mm0
465 :     punpcklbw mm2, mm6 ; r3b3r2b2r1b1r0b0 -> mm2
466 :     punpckhbw mm0, mm6 ; r7b7r6b6r5b5r4b4 -> mm0
467 :     movq mm3, mm1
468 :     punpcklbw mm1, mm7 ; 0g30g20g10g0 -> mm1
469 :     punpckhbw mm3, mm7 ; 0g70g60g50g4 -> mm3
470 :     movq mm4, mm2
471 :     punpcklbw mm2, mm1 ; 0r1g1b10r0g0b0 -> mm2
472 :     punpckhbw mm4, mm1 ; 0r3g3b30r2g2b2 -> mm4
473 :     movq mm5, mm0
474 :     punpcklbw mm0, mm3 ; 0r5g5b50r4g4b4 -> mm0
475 :     punpckhbw mm5, mm3 ; 0r7g7b70r6g6b6 -> mm5
476 : Isibaar 1795 movd [x_ptr+x_stride], mm2
477 : edgomez 1382 psrlq mm2, 32
478 : Isibaar 1795 movd [x_ptr+x_stride + 3], mm2
479 :     movd [x_ptr+x_stride + 6], mm4
480 : edgomez 1382 psrlq mm4, 32
481 : Isibaar 1795 movd [x_ptr+x_stride + 9], mm4
482 :     movd [x_ptr+x_stride + 12], mm0
483 : edgomez 1382 psrlq mm0, 32
484 : Isibaar 1795 movd [x_ptr+x_stride + 15], mm0
485 : edgomez 1382 movq mm2, mm5
486 :     psrlq mm0, 8 ; 000000r5g5 -> mm0
487 :     psllq mm2, 32 ; 0r6g6b60000 -> mm2
488 :     psrlq mm5, 32 ; 00000r7g7b7 -> mm5
489 :     psrlq mm2, 16 ; 000r6g6b600 -> mm2
490 :     por mm0, mm2 ; 000r6g6b6r5g5 -> mm0
491 :     psllq mm5, 40 ; r7g7b700000 -> mm5
492 :     por mm5, mm0 ; r7g7b7r6g6b6r5g5 -> mm5
493 : Isibaar 1795 movq [x_ptr + x_stride + 16], mm5
494 : edgomez 851
495 : edgomez 1382 %else ; BGRA (32-bit)
496 : Isibaar 1795 movq [x_ptr], mm2
497 :     movq [x_ptr + 8], mm4
498 :     movq [x_ptr + 16], mm0
499 :     movq [x_ptr + 24], mm5
500 : edgomez 1382 movq mm0, [TEMP_B2]
501 :     movq mm1, [TEMP_G2]
502 :     movq mm2, mm0
503 :     punpcklbw mm2, mm6 ; r3b3r2b2r1b1r0b0 -> mm2
504 :     punpckhbw mm0, mm6 ; r7b7r6b6r5b5r4b4 -> mm0
505 :     movq mm3, mm1
506 :     punpcklbw mm1, mm7 ; 0g30g20g10g0 -> mm1
507 :     punpckhbw mm3, mm7 ; 0g70g60g50g4 -> mm3
508 :     movq mm4, mm2
509 :     punpcklbw mm2, mm1 ; 0r1g1b10r0g0b0 -> mm2
510 :     punpckhbw mm4, mm1 ; 0r3g3b30r2g2b2 -> mm4
511 :     movq mm5, mm0
512 :     punpcklbw mm0, mm3 ; 0r5g5b50r4g4b4 -> mm0
513 :     punpckhbw mm5, mm3 ; 0r7g7b70r6g6b6 -> mm5
514 : Isibaar 1795 movq [x_ptr + x_stride], mm2
515 :     movq [x_ptr + x_stride + 8], mm4
516 :     movq [x_ptr + x_stride + 16], mm0
517 :     movq [x_ptr + x_stride + 24], mm5
518 : edgomez 851 %endif
519 :    
520 :     %undef TEMP_Y1
521 :     %undef TEMP_Y2
522 :     %undef TEMP_G1
523 :     %undef TEMP_G2
524 :     %undef TEMP_B1
525 :     %undef TEMP_B2
526 :     %endmacro
527 :    
528 : edgomez 1382 ;=============================================================================
529 :     ; Code
530 :     ;=============================================================================
531 : edgomez 851
532 : Isibaar 1844 TEXT
533 : edgomez 851
534 : edgomez 1382 %include "colorspace_mmx.inc"
535 : edgomez 851
536 :     ; input
537 :     MAKE_COLORSPACE bgr_to_yv12_mmx,0, 3,2,2, BGR_TO_YV12, 3, -1
538 :     MAKE_COLORSPACE bgra_to_yv12_mmx,0, 4,2,2, BGR_TO_YV12, 4, -1
539 : chl 1763 MAKE_COLORSPACE rgb_to_yv12_mmx,0, 3,2,2, RGB_TO_YV12, 3, -1
540 :     MAKE_COLORSPACE rgba_to_yv12_mmx,0, 4,2,2, RGB_TO_YV12, 4, -1
541 : edgomez 851
542 :     ; output
543 :     MAKE_COLORSPACE yv12_to_bgr_mmx,48, 3,8,2, YV12_TO_BGR, 3, -1
544 :     MAKE_COLORSPACE yv12_to_bgra_mmx,48, 4,8,2, YV12_TO_BGR, 4, -1
545 :    
546 : Isibaar 1877 NON_EXEC_STACK

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