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

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