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

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

Parent Directory Parent Directory | Revision Log Revision Log


Revision 1382 - (view) (download)

1 : edgomez 1382 ;/*****************************************************************************
2 : Isibaar 262 ; *
3 : edgomez 1382 ; * XVID MPEG-4 VIDEO CODEC
4 :     ; * - mmx 8x8 block-based halfpel interpolation -
5 : Isibaar 262 ; *
6 : edgomez 1382 ; * Copyright(C) 2001 Peter Ross <pross@xvid.org>
7 :     ; * 2002 Michael Militzer <isibaar@xvid.org>
8 : Isibaar 262 ; *
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 : Isibaar 262 ; *
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 : Isibaar 262 ; *
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 : Isibaar 262 ; *
23 : edgomez 1382 ; ****************************************************************************/
24 : Isibaar 262
25 : edgomez 1382 BITS 32
26 : edgomez 851
27 : edgomez 1382 %macro cglobal 1
28 : Isibaar 262 %ifdef PREFIX
29 : edgomez 1382 global _%1
30 : Isibaar 262 %define %1 _%1
31 :     %else
32 :     global %1
33 :     %endif
34 :     %endmacro
35 :    
36 : edgomez 1382 ;=============================================================================
37 :     ; Read only data
38 :     ;=============================================================================
39 : Isibaar 262
40 : edgomez 1382 %ifdef FORMAT_COFF
41 :     SECTION .rodata data
42 :     %else
43 :     SECTION .rodata data align=16
44 :     %endif
45 : Isibaar 262
46 : edgomez 1382 ;-----------------------------------------------------------------------------
47 : edgomez 851 ; (16 - r) rounding table
48 : edgomez 1382 ;-----------------------------------------------------------------------------
49 : edgomez 851
50 : edgomez 1382 ALIGN 16
51 :     rounding_lowpass_mmx:
52 :     times 4 dw 16
53 :     times 4 dw 15
54 : edgomez 851
55 : edgomez 1382 ;-----------------------------------------------------------------------------
56 : Isibaar 262 ; (1 - r) rounding table
57 : edgomez 1382 ;-----------------------------------------------------------------------------
58 : Isibaar 262
59 : edgomez 1382 rounding1_mmx:
60 :     times 4 dw 1
61 :     times 4 dw 0
62 : Isibaar 262
63 : edgomez 1382 ;-----------------------------------------------------------------------------
64 :     ; (2 - r) rounding table
65 :     ;-----------------------------------------------------------------------------
66 : Isibaar 262
67 : edgomez 1382 rounding2_mmx:
68 :     times 4 dw 2
69 :     times 4 dw 1
70 : Isibaar 262
71 : edgomez 1382 mmx_one:
72 :     times 8 db 1
73 : Isibaar 262
74 : edgomez 1382 mmx_two:
75 :     times 8 db 2
76 : edgomez 851
77 : edgomez 1382 mmx_three:
78 :     times 8 db 3
79 : edgomez 851
80 : edgomez 1382 mmx_five:
81 :     times 4 dw 5
82 : edgomez 851
83 : edgomez 1382 mmx_mask:
84 :     times 8 db 254
85 : edgomez 851
86 : edgomez 1382 mmx_mask2:
87 :     times 8 db 252
88 : edgomez 851
89 : edgomez 1382 ;=============================================================================
90 :     ; Code
91 :     ;=============================================================================
92 : Isibaar 262
93 : edgomez 1382 SECTION .text
94 :    
95 :     cglobal interpolate8x8_halfpel_h_mmx
96 :     cglobal interpolate8x8_halfpel_v_mmx
97 :     cglobal interpolate8x8_halfpel_hv_mmx
98 :     cglobal interpolate8x8_avg4_mmx
99 :     cglobal interpolate8x8_avg2_mmx
100 :     cglobal interpolate8x8_6tap_lowpass_h_mmx
101 :     cglobal interpolate8x8_6tap_lowpass_v_mmx
102 :    
103 : Isibaar 262 %macro CALC_AVG 6
104 : edgomez 1382 punpcklbw %3, %6
105 :     punpckhbw %4, %6
106 : Isibaar 262
107 : edgomez 1382 paddusw %1, %3 ; mm01 += mm23
108 :     paddusw %2, %4
109 :     paddusw %1, %5 ; mm01 += rounding
110 :     paddusw %2, %5
111 : Isibaar 262
112 : edgomez 1382 psrlw %1, 1 ; mm01 >>= 1
113 :     psrlw %2, 1
114 : Isibaar 262 %endmacro
115 :    
116 :    
117 : edgomez 1382 ;-----------------------------------------------------------------------------
118 : Isibaar 262 ;
119 :     ; void interpolate8x8_halfpel_h_mmx(uint8_t * const dst,
120 : edgomez 1382 ; const uint8_t * const src,
121 :     ; const uint32_t stride,
122 :     ; const uint32_t rounding);
123 : Isibaar 262 ;
124 : edgomez 1382 ;-----------------------------------------------------------------------------
125 : Isibaar 262
126 :     %macro COPY_H_MMX 0
127 : edgomez 1382 movq mm0, [esi]
128 :     movq mm2, [esi + 1]
129 :     movq mm1, mm0
130 :     movq mm3, mm2
131 : Isibaar 262
132 : edgomez 1382 punpcklbw mm0, mm6 ; mm01 = [src]
133 :     punpckhbw mm1, mm6 ; mm23 = [src + 1]
134 : Isibaar 262
135 : edgomez 1382 CALC_AVG mm0, mm1, mm2, mm3, mm7, mm6
136 : Isibaar 262
137 : edgomez 1382 packuswb mm0, mm1
138 :     movq [edi], mm0 ; [dst] = mm01
139 : Isibaar 262
140 : edgomez 1382 add esi, edx ; src += stride
141 :     add edi, edx ; dst += stride
142 : Isibaar 262 %endmacro
143 :    
144 : edgomez 1382 ALIGN 16
145 :     interpolate8x8_halfpel_h_mmx:
146 : Isibaar 262
147 : edgomez 1382 push esi
148 :     push edi
149 :     mov eax, [esp + 8 + 16] ; rounding
150 : Isibaar 262
151 : edgomez 1382 movq mm7, [rounding1_mmx + eax * 8]
152 : Isibaar 262
153 : edgomez 1382 mov edi, [esp + 8 + 4] ; dst
154 :     mov esi, [esp + 8 + 8] ; src
155 :     mov edx, [esp + 8 + 12] ; stride
156 : Isibaar 262
157 : edgomez 1382 pxor mm6, mm6 ; zero
158 : Isibaar 262
159 : edgomez 1382 COPY_H_MMX
160 :     COPY_H_MMX
161 :     COPY_H_MMX
162 :     COPY_H_MMX
163 :     COPY_H_MMX
164 :     COPY_H_MMX
165 :     COPY_H_MMX
166 :     COPY_H_MMX
167 : Isibaar 262
168 : edgomez 1382 pop edi
169 :     pop esi
170 : Isibaar 262
171 : edgomez 1382 ret
172 : Isibaar 262
173 :    
174 : edgomez 1382 ;-----------------------------------------------------------------------------
175 : Isibaar 262 ;
176 :     ; void interpolate8x8_halfpel_v_mmx(uint8_t * const dst,
177 : edgomez 1382 ; const uint8_t * const src,
178 :     ; const uint32_t stride,
179 :     ; const uint32_t rounding);
180 : Isibaar 262 ;
181 : edgomez 1382 ;-----------------------------------------------------------------------------
182 : Isibaar 262
183 :     %macro COPY_V_MMX 0
184 : edgomez 1382 movq mm0, [esi]
185 :     movq mm2, [esi + edx]
186 :     movq mm1, mm0
187 :     movq mm3, mm2
188 : Isibaar 262
189 : edgomez 1382 punpcklbw mm0, mm6 ; mm01 = [src]
190 :     punpckhbw mm1, mm6 ; mm23 = [src + 1]
191 : Isibaar 262
192 : edgomez 1382 CALC_AVG mm0, mm1, mm2, mm3, mm7, mm6
193 : Isibaar 262
194 : edgomez 1382 packuswb mm0, mm1
195 :     movq [edi], mm0 ; [dst] = mm01
196 : Isibaar 262
197 : edgomez 1382 add esi, edx ; src += stride
198 :     add edi, edx ; dst += stride
199 : Isibaar 262 %endmacro
200 :    
201 : edgomez 1382 ALIGN 16
202 :     interpolate8x8_halfpel_v_mmx:
203 : Isibaar 262
204 : edgomez 1382 push esi
205 :     push edi
206 : Isibaar 262
207 : edgomez 1382 mov eax, [esp + 8 + 16] ; rounding
208 : Isibaar 262
209 : edgomez 1382 movq mm7, [rounding1_mmx + eax * 8]
210 : Isibaar 262
211 : edgomez 1382 mov edi, [esp + 8 + 4] ; dst
212 :     mov esi, [esp + 8 + 8] ; src
213 :     mov edx, [esp + 8 + 12] ; stride
214 : Isibaar 262
215 : edgomez 1382 pxor mm6, mm6 ; zero
216 : Isibaar 262
217 :    
218 : edgomez 1382 COPY_V_MMX
219 :     COPY_V_MMX
220 :     COPY_V_MMX
221 :     COPY_V_MMX
222 :     COPY_V_MMX
223 :     COPY_V_MMX
224 :     COPY_V_MMX
225 :     COPY_V_MMX
226 : Isibaar 262
227 : edgomez 1382 pop edi
228 :     pop esi
229 : Isibaar 262
230 : edgomez 1382 ret
231 : Isibaar 262
232 : edgomez 1382
233 :     ;-----------------------------------------------------------------------------
234 : Isibaar 262 ;
235 :     ; void interpolate8x8_halfpel_hv_mmx(uint8_t * const dst,
236 : edgomez 1382 ; const uint8_t * const src,
237 :     ; const uint32_t stride,
238 :     ; const uint32_t rounding);
239 : Isibaar 262 ;
240 :     ;
241 : edgomez 1382 ;-----------------------------------------------------------------------------
242 : Isibaar 262
243 :     %macro COPY_HV_MMX 0
244 : edgomez 1382 ; current row
245 :     movq mm0, [esi]
246 :     movq mm2, [esi + 1]
247 : Isibaar 262
248 : edgomez 1382 movq mm1, mm0
249 :     movq mm3, mm2
250 : Isibaar 262
251 : edgomez 1382 punpcklbw mm0, mm6 ; mm01 = [src]
252 :     punpcklbw mm2, mm6 ; mm23 = [src + 1]
253 :     punpckhbw mm1, mm6
254 :     punpckhbw mm3, mm6
255 : Isibaar 262
256 : edgomez 1382 paddusw mm0, mm2 ; mm01 += mm23
257 :     paddusw mm1, mm3
258 : Isibaar 262
259 : edgomez 1382 ; next row
260 :     movq mm4, [esi + edx]
261 :     movq mm2, [esi + edx + 1]
262 : Isibaar 262
263 : edgomez 1382 movq mm5, mm4
264 :     movq mm3, mm2
265 : Isibaar 262
266 : edgomez 1382 punpcklbw mm4, mm6 ; mm45 = [src + stride]
267 :     punpcklbw mm2, mm6 ; mm23 = [src + stride + 1]
268 :     punpckhbw mm5, mm6
269 :     punpckhbw mm3, mm6
270 : Isibaar 262
271 : edgomez 1382 paddusw mm4, mm2 ; mm45 += mm23
272 :     paddusw mm5, mm3
273 : Isibaar 262
274 : edgomez 1382 ; add current + next row
275 :     paddusw mm0, mm4 ; mm01 += mm45
276 :     paddusw mm1, mm5
277 :     paddusw mm0, mm7 ; mm01 += rounding2
278 :     paddusw mm1, mm7
279 : Isibaar 262
280 : edgomez 1382 psrlw mm0, 2 ; mm01 >>= 2
281 :     psrlw mm1, 2
282 : Isibaar 262
283 : edgomez 1382 packuswb mm0, mm1
284 :     movq [edi], mm0 ; [dst] = mm01
285 : Isibaar 262
286 : edgomez 1382 add esi, edx ; src += stride
287 :     add edi, edx ; dst += stride
288 : Isibaar 262 %endmacro
289 :    
290 : edgomez 1382 ALIGN 16
291 :     interpolate8x8_halfpel_hv_mmx:
292 : Isibaar 262
293 : edgomez 1382 push esi
294 :     push edi
295 : Isibaar 262
296 : edgomez 1382 mov eax, [esp + 8 + 16] ; rounding
297 : Isibaar 262
298 : edgomez 1382 movq mm7, [rounding2_mmx + eax * 8]
299 : Isibaar 262
300 : edgomez 1382 mov edi, [esp + 8 + 4] ; dst
301 :     mov esi, [esp + 8 + 8] ; src
302 : Isibaar 262
303 : edgomez 1382 mov eax, 8
304 : Isibaar 262
305 : edgomez 1382 pxor mm6, mm6 ; zero
306 : Isibaar 262
307 : edgomez 1382 mov edx, [esp + 8 + 12] ; stride
308 : Isibaar 262
309 : edgomez 1382 COPY_HV_MMX
310 :     COPY_HV_MMX
311 :     COPY_HV_MMX
312 :     COPY_HV_MMX
313 :     COPY_HV_MMX
314 :     COPY_HV_MMX
315 :     COPY_HV_MMX
316 :     COPY_HV_MMX
317 : edgomez 851
318 : edgomez 1382 pop edi
319 :     pop esi
320 :    
321 :     ret
322 :    
323 :     ;-----------------------------------------------------------------------------
324 : edgomez 851 ;
325 :     ; void interpolate8x8_avg2_mmx(uint8_t const *dst,
326 : edgomez 1382 ; const uint8_t * const src1,
327 :     ; const uint8_t * const src2,
328 :     ; const uint32_t stride,
329 :     ; const uint32_t rounding,
330 :     ; const uint32_t height);
331 : edgomez 851 ;
332 : edgomez 1382 ;-----------------------------------------------------------------------------
333 : edgomez 851
334 :     %macro AVG2_MMX_RND0 0
335 : edgomez 1382 movq mm0, [eax] ; src1 -> mm0
336 :     movq mm1, [ebx] ; src2 -> mm1
337 : edgomez 851
338 : edgomez 1382 movq mm4, [eax+edx]
339 :     movq mm5, [ebx+edx]
340 : edgomez 851
341 : edgomez 1382 movq mm2, mm0 ; src1 -> mm2
342 :     movq mm3, mm1 ; src2 -> mm3
343 : edgomez 851
344 : edgomez 1382 pand mm2, mm7 ; isolate the lsb
345 :     pand mm3, mm7 ; isolate the lsb
346 : edgomez 851
347 : edgomez 1382 por mm2, mm3 ; ODD(src1) OR ODD(src2) -> mm2
348 : edgomez 851
349 : edgomez 1382 movq mm3, mm4
350 :     movq mm6, mm5
351 : edgomez 851
352 : edgomez 1382 pand mm3, mm7
353 :     pand mm6, mm7
354 : edgomez 851
355 : edgomez 1382 por mm3, mm6
356 : edgomez 851
357 : edgomez 1382 pand mm0, [mmx_mask]
358 :     pand mm1, [mmx_mask]
359 :     pand mm4, [mmx_mask]
360 :     pand mm5, [mmx_mask]
361 : edgomez 851
362 : edgomez 1382 psrlq mm0, 1 ; src1 / 2
363 :     psrlq mm1, 1 ; src2 / 2
364 : edgomez 851
365 : edgomez 1382 psrlq mm4, 1
366 :     psrlq mm5, 1
367 : edgomez 851
368 : edgomez 1382 paddb mm0, mm1 ; src1/2 + src2/2 -> mm0
369 :     paddb mm0, mm2 ; correct rounding error
370 : edgomez 851
371 : edgomez 1382 paddb mm4, mm5
372 :     paddb mm4, mm3
373 : edgomez 851
374 : edgomez 1382 lea eax, [eax+2*edx]
375 :     lea ebx, [ebx+2*edx]
376 :    
377 :     movq [ecx], mm0 ; (src1 + src2 + 1) / 2 -> dst
378 :     movq [ecx+edx], mm4
379 : edgomez 851 %endmacro
380 :    
381 :     %macro AVG2_MMX_RND1 0
382 : edgomez 1382 movq mm0, [eax] ; src1 -> mm0
383 :     movq mm1, [ebx] ; src2 -> mm1
384 : edgomez 851
385 : edgomez 1382 movq mm4, [eax+edx]
386 :     movq mm5, [ebx+edx]
387 : edgomez 851
388 : edgomez 1382 movq mm2, mm0 ; src1 -> mm2
389 :     movq mm3, mm1 ; src2 -> mm3
390 : edgomez 851
391 : edgomez 1382 pand mm2, mm7 ; isolate the lsb
392 :     pand mm3, mm7 ; isolate the lsb
393 : edgomez 851
394 : edgomez 1382 pand mm2, mm3 ; ODD(src1) AND ODD(src2) -> mm2
395 : edgomez 851
396 : edgomez 1382 movq mm3, mm4
397 :     movq mm6, mm5
398 : edgomez 851
399 : edgomez 1382 pand mm3, mm7
400 :     pand mm6, mm7
401 : edgomez 851
402 : edgomez 1382 pand mm3, mm6
403 : edgomez 851
404 : edgomez 1382 pand mm0, [mmx_mask]
405 :     pand mm1, [mmx_mask]
406 :     pand mm4, [mmx_mask]
407 :     pand mm5, [mmx_mask]
408 : edgomez 851
409 : edgomez 1382 psrlq mm0, 1 ; src1 / 2
410 :     psrlq mm1, 1 ; src2 / 2
411 : edgomez 851
412 : edgomez 1382 psrlq mm4, 1
413 :     psrlq mm5, 1
414 : edgomez 851
415 : edgomez 1382 paddb mm0, mm1 ; src1/2 + src2/2 -> mm0
416 :     paddb mm0, mm2 ; correct rounding error
417 : edgomez 851
418 : edgomez 1382 paddb mm4, mm5
419 :     paddb mm4, mm3
420 :    
421 :     lea eax, [eax+2*edx]
422 :     lea ebx, [ebx+2*edx]
423 :    
424 :     movq [ecx], mm0 ; (src1 + src2 + 1) / 2 -> dst
425 :     movq [ecx+edx], mm4
426 : edgomez 851 %endmacro
427 :    
428 : edgomez 1382 ALIGN 16
429 :     interpolate8x8_avg2_mmx:
430 : edgomez 851
431 : edgomez 1382 push ebx
432 : edgomez 851
433 : edgomez 1382 mov eax, [esp + 4 + 20] ; rounding
434 :     test eax, eax
435 : edgomez 851
436 : edgomez 1382 jnz near .rounding1
437 : edgomez 851
438 : edgomez 1382 mov eax, [esp + 4 + 24] ; height -> eax
439 :     sub eax, 8
440 :     test eax, eax
441 : edgomez 851
442 : edgomez 1382 mov ecx, [esp + 4 + 4] ; dst -> edi
443 :     mov eax, [esp + 4 + 8] ; src1 -> esi
444 :     mov ebx, [esp + 4 + 12] ; src2 -> eax
445 :     mov edx, [esp + 4 + 16] ; stride -> edx
446 : edgomez 851
447 : edgomez 1382 movq mm7, [mmx_one]
448 : edgomez 851
449 : edgomez 1382 jz near .start0
450 : edgomez 851
451 : edgomez 1382 AVG2_MMX_RND0
452 :     lea ecx, [ecx+2*edx]
453 :    
454 : edgomez 851 .start0
455 :    
456 : edgomez 1382 AVG2_MMX_RND0
457 :     lea ecx, [ecx+2*edx]
458 :     AVG2_MMX_RND0
459 :     lea ecx, [ecx+2*edx]
460 :     AVG2_MMX_RND0
461 :     lea ecx, [ecx+2*edx]
462 :     AVG2_MMX_RND0
463 : edgomez 851
464 : edgomez 1382 pop ebx
465 :     ret
466 :    
467 : edgomez 851 .rounding1
468 : edgomez 1382 mov eax, [esp + 4 + 24] ; height -> eax
469 :     sub eax, 8
470 :     test eax, eax
471 : edgomez 851
472 : edgomez 1382 mov ecx, [esp + 4 + 4] ; dst -> edi
473 :     mov eax, [esp + 4 + 8] ; src1 -> esi
474 :     mov ebx, [esp + 4 + 12] ; src2 -> eax
475 :     mov edx, [esp + 4 + 16] ; stride -> edx
476 : edgomez 851
477 : edgomez 1382 movq mm7, [mmx_one]
478 : edgomez 851
479 : edgomez 1382 jz near .start1
480 : edgomez 851
481 : edgomez 1382 AVG2_MMX_RND1
482 :     lea ecx, [ecx+2*edx]
483 : edgomez 851
484 :     .start1
485 :    
486 : edgomez 1382 AVG2_MMX_RND1
487 :     lea ecx, [ecx+2*edx]
488 :     AVG2_MMX_RND1
489 :     lea ecx, [ecx+2*edx]
490 :     AVG2_MMX_RND1
491 :     lea ecx, [ecx+2*edx]
492 :     AVG2_MMX_RND1
493 : edgomez 851
494 : edgomez 1382 pop ebx
495 :     ret
496 : edgomez 851
497 :    
498 : edgomez 1382 ;-----------------------------------------------------------------------------
499 : edgomez 851 ;
500 :     ; void interpolate8x8_avg4_mmx(uint8_t const *dst,
501 : edgomez 1382 ; const uint8_t * const src1,
502 :     ; const uint8_t * const src2,
503 :     ; const uint8_t * const src3,
504 :     ; const uint8_t * const src4,
505 :     ; const uint32_t stride,
506 :     ; const uint32_t rounding);
507 : edgomez 851 ;
508 : edgomez 1382 ;-----------------------------------------------------------------------------
509 : edgomez 851
510 :     %macro AVG4_MMX_RND0 0
511 : edgomez 1382 movq mm0, [eax] ; src1 -> mm0
512 :     movq mm1, [ebx] ; src2 -> mm1
513 : edgomez 851
514 : edgomez 1382 movq mm2, mm0
515 :     movq mm3, mm1
516 : edgomez 851
517 : edgomez 1382 pand mm2, [mmx_three]
518 :     pand mm3, [mmx_three]
519 : edgomez 851
520 : edgomez 1382 pand mm0, [mmx_mask2]
521 :     pand mm1, [mmx_mask2]
522 : edgomez 851
523 : edgomez 1382 psrlq mm0, 2
524 :     psrlq mm1, 2
525 : edgomez 851
526 : edgomez 1382 lea eax, [eax+edx]
527 :     lea ebx, [ebx+edx]
528 : edgomez 851
529 : edgomez 1382 paddb mm0, mm1
530 :     paddb mm2, mm3
531 : edgomez 851
532 : edgomez 1382 movq mm4, [esi] ; src3 -> mm0
533 :     movq mm5, [edi] ; src4 -> mm1
534 : edgomez 851
535 : edgomez 1382 movq mm1, mm4
536 :     movq mm3, mm5
537 : edgomez 851
538 : edgomez 1382 pand mm1, [mmx_three]
539 :     pand mm3, [mmx_three]
540 : edgomez 851
541 : edgomez 1382 pand mm4, [mmx_mask2]
542 :     pand mm5, [mmx_mask2]
543 : edgomez 851
544 : edgomez 1382 psrlq mm4, 2
545 :     psrlq mm5, 2
546 : edgomez 851
547 : edgomez 1382 paddb mm4, mm5
548 :     paddb mm0, mm4
549 : edgomez 851
550 : edgomez 1382 paddb mm1, mm3
551 :     paddb mm2, mm1
552 :    
553 :     paddb mm2, [mmx_two]
554 :     pand mm2, [mmx_mask2]
555 :    
556 :     psrlq mm2, 2
557 :     paddb mm0, mm2
558 :    
559 :     lea esi, [esi+edx]
560 :     lea edi, [edi+edx]
561 :    
562 :     movq [ecx], mm0 ; (src1 + src2 + src3 + src4 + 2) / 4 -> dst
563 : edgomez 851 %endmacro
564 :    
565 :     %macro AVG4_MMX_RND1 0
566 : edgomez 1382 movq mm0, [eax] ; src1 -> mm0
567 :     movq mm1, [ebx] ; src2 -> mm1
568 : edgomez 851
569 : edgomez 1382 movq mm2, mm0
570 :     movq mm3, mm1
571 : edgomez 851
572 : edgomez 1382 pand mm2, [mmx_three]
573 :     pand mm3, [mmx_three]
574 : edgomez 851
575 : edgomez 1382 pand mm0, [mmx_mask2]
576 :     pand mm1, [mmx_mask2]
577 : edgomez 851
578 : edgomez 1382 psrlq mm0, 2
579 :     psrlq mm1, 2
580 : edgomez 851
581 : edgomez 1382 lea eax,[eax+edx]
582 :     lea ebx,[ebx+edx]
583 : edgomez 851
584 : edgomez 1382 paddb mm0, mm1
585 :     paddb mm2, mm3
586 : edgomez 851
587 : edgomez 1382 movq mm4, [esi] ; src3 -> mm0
588 :     movq mm5, [edi] ; src4 -> mm1
589 : edgomez 851
590 : edgomez 1382 movq mm1, mm4
591 :     movq mm3, mm5
592 : edgomez 851
593 : edgomez 1382 pand mm1, [mmx_three]
594 :     pand mm3, [mmx_three]
595 : edgomez 851
596 : edgomez 1382 pand mm4, [mmx_mask2]
597 :     pand mm5, [mmx_mask2]
598 : edgomez 851
599 : edgomez 1382 psrlq mm4, 2
600 :     psrlq mm5, 2
601 : edgomez 851
602 : edgomez 1382 paddb mm4, mm5
603 :     paddb mm0, mm4
604 : edgomez 851
605 : edgomez 1382 paddb mm1, mm3
606 :     paddb mm2, mm1
607 :    
608 :     paddb mm2, [mmx_one]
609 :     pand mm2, [mmx_mask2]
610 :    
611 :     psrlq mm2, 2
612 :     paddb mm0, mm2
613 :    
614 :     lea esi,[esi+edx]
615 :     lea edi,[edi+edx]
616 :    
617 :     movq [ecx], mm0 ; (src1 + src2 + src3 + src4 + 2) / 4 -> dst
618 : edgomez 851 %endmacro
619 :    
620 : edgomez 1382 ALIGN 16
621 :     interpolate8x8_avg4_mmx:
622 : edgomez 851
623 : edgomez 1382 push ebx
624 :     push edi
625 :     push esi
626 : edgomez 851
627 : edgomez 1382 mov eax, [esp + 12 + 28] ; rounding
628 : edgomez 851
629 : edgomez 1382 test eax, eax
630 : edgomez 851
631 : edgomez 1382 mov ecx, [esp + 12 + 4] ; dst -> edi
632 :     mov eax, [esp + 12 + 8] ; src1 -> esi
633 :     mov ebx, [esp + 12 + 12] ; src2 -> eax
634 :     mov esi, [esp + 12 + 16] ; src3 -> esi
635 :     mov edi, [esp + 12 + 20] ; src4 -> edi
636 :     mov edx, [esp + 12 + 24] ; stride -> edx
637 : edgomez 851
638 : edgomez 1382 movq mm7, [mmx_one]
639 : edgomez 851
640 : edgomez 1382 jnz near .rounding1
641 : edgomez 851
642 : edgomez 1382 AVG4_MMX_RND0
643 :     lea ecx, [ecx+edx]
644 :     AVG4_MMX_RND0
645 :     lea ecx, [ecx+edx]
646 :     AVG4_MMX_RND0
647 :     lea ecx, [ecx+edx]
648 :     AVG4_MMX_RND0
649 :     lea ecx, [ecx+edx]
650 :     AVG4_MMX_RND0
651 :     lea ecx, [ecx+edx]
652 :     AVG4_MMX_RND0
653 :     lea ecx, [ecx+edx]
654 :     AVG4_MMX_RND0
655 :     lea ecx, [ecx+edx]
656 :     AVG4_MMX_RND0
657 :    
658 :     pop esi
659 :     pop edi
660 :     pop ebx
661 :     ret
662 :    
663 : edgomez 851 .rounding1
664 : edgomez 1382 AVG4_MMX_RND1
665 :     lea ecx, [ecx+edx]
666 :     AVG4_MMX_RND1
667 :     lea ecx, [ecx+edx]
668 :     AVG4_MMX_RND1
669 :     lea ecx, [ecx+edx]
670 :     AVG4_MMX_RND1
671 :     lea ecx, [ecx+edx]
672 :     AVG4_MMX_RND1
673 :     lea ecx, [ecx+edx]
674 :     AVG4_MMX_RND1
675 :     lea ecx, [ecx+edx]
676 :     AVG4_MMX_RND1
677 :     lea ecx, [ecx+edx]
678 :     AVG4_MMX_RND1
679 : edgomez 851
680 : edgomez 1382 pop esi
681 :     pop edi
682 :     pop ebx
683 :     ret
684 : edgomez 851
685 :    
686 : edgomez 1382 ;-----------------------------------------------------------------------------
687 : edgomez 851 ;
688 :     ; void interpolate8x8_6tap_lowpass_h_mmx(uint8_t const *dst,
689 : edgomez 1382 ; const uint8_t * const src,
690 :     ; const uint32_t stride,
691 :     ; const uint32_t rounding);
692 : edgomez 851 ;
693 : edgomez 1382 ;-----------------------------------------------------------------------------
694 : edgomez 851
695 :     %macro LOWPASS_6TAP_H_MMX 0
696 : edgomez 1382 movq mm0, [eax]
697 :     movq mm2, [eax+1]
698 : edgomez 851
699 : edgomez 1382 movq mm1, mm0
700 :     movq mm3, mm2
701 : edgomez 851
702 : edgomez 1382 punpcklbw mm0, mm7
703 :     punpcklbw mm2, mm7
704 : edgomez 851
705 : edgomez 1382 punpckhbw mm1, mm7
706 :     punpckhbw mm3, mm7
707 : edgomez 851
708 : edgomez 1382 paddw mm0, mm2
709 :     paddw mm1, mm3
710 : edgomez 851
711 : edgomez 1382 psllw mm0, 2
712 :     psllw mm1, 2
713 : edgomez 851
714 : edgomez 1382 movq mm2, [eax-1]
715 :     movq mm4, [eax+2]
716 : edgomez 851
717 : edgomez 1382 movq mm3, mm2
718 :     movq mm5, mm4
719 : edgomez 851
720 : edgomez 1382 punpcklbw mm2, mm7
721 :     punpcklbw mm4, mm7
722 : edgomez 851
723 : edgomez 1382 punpckhbw mm3, mm7
724 :     punpckhbw mm5, mm7
725 : edgomez 851
726 : edgomez 1382 paddw mm2, mm4
727 :     paddw mm3, mm5
728 : edgomez 851
729 : edgomez 1382 psubsw mm0, mm2
730 :     psubsw mm1, mm3
731 : edgomez 851
732 : edgomez 1382 pmullw mm0, [mmx_five]
733 :     pmullw mm1, [mmx_five]
734 : edgomez 851
735 : edgomez 1382 movq mm2, [eax-2]
736 :     movq mm4, [eax+3]
737 : edgomez 851
738 : edgomez 1382 movq mm3, mm2
739 :     movq mm5, mm4
740 : edgomez 851
741 : edgomez 1382 punpcklbw mm2, mm7
742 :     punpcklbw mm4, mm7
743 : edgomez 851
744 : edgomez 1382 punpckhbw mm3, mm7
745 :     punpckhbw mm5, mm7
746 : edgomez 851
747 : edgomez 1382 paddw mm2, mm4
748 :     paddw mm3, mm5
749 : edgomez 851
750 : edgomez 1382 paddsw mm0, mm2
751 :     paddsw mm1, mm3
752 : edgomez 851
753 : edgomez 1382 paddsw mm0, mm6
754 :     paddsw mm1, mm6
755 : edgomez 851
756 : edgomez 1382 psraw mm0, 5
757 :     psraw mm1, 5
758 : edgomez 851
759 : edgomez 1382 lea eax, [eax+edx]
760 :     packuswb mm0, mm1
761 :     movq [ecx], mm0
762 : edgomez 851 %endmacro
763 :    
764 : edgomez 1382 ALIGN 16
765 :     interpolate8x8_6tap_lowpass_h_mmx:
766 : edgomez 851
767 : edgomez 1382 mov eax, [esp + 16] ; rounding
768 : edgomez 851
769 : edgomez 1382 movq mm6, [rounding_lowpass_mmx + eax * 8]
770 : edgomez 851
771 : edgomez 1382 mov ecx, [esp + 4] ; dst -> edi
772 :     mov eax, [esp + 8] ; src -> esi
773 :     mov edx, [esp + 12] ; stride -> edx
774 : edgomez 851
775 : edgomez 1382 pxor mm7, mm7
776 : edgomez 851
777 : edgomez 1382 LOWPASS_6TAP_H_MMX
778 :     lea ecx, [ecx+edx]
779 :     LOWPASS_6TAP_H_MMX
780 :     lea ecx, [ecx+edx]
781 :     LOWPASS_6TAP_H_MMX
782 :     lea ecx, [ecx+edx]
783 :     LOWPASS_6TAP_H_MMX
784 :     lea ecx, [ecx+edx]
785 :     LOWPASS_6TAP_H_MMX
786 :     lea ecx, [ecx+edx]
787 :     LOWPASS_6TAP_H_MMX
788 :     lea ecx, [ecx+edx]
789 :     LOWPASS_6TAP_H_MMX
790 :     lea ecx, [ecx+edx]
791 :     LOWPASS_6TAP_H_MMX
792 : edgomez 851
793 : edgomez 1382 ret
794 :    
795 :     ;-----------------------------------------------------------------------------
796 : edgomez 851 ;
797 :     ; void interpolate8x8_6tap_lowpass_v_mmx(uint8_t const *dst,
798 : edgomez 1382 ; const uint8_t * const src,
799 :     ; const uint32_t stride,
800 :     ; const uint32_t rounding);
801 : edgomez 851 ;
802 : edgomez 1382 ;-----------------------------------------------------------------------------
803 : edgomez 851
804 :     %macro LOWPASS_6TAP_V_MMX 0
805 : edgomez 1382 movq mm0, [eax]
806 :     movq mm2, [eax+edx]
807 : edgomez 851
808 : edgomez 1382 movq mm1, mm0
809 :     movq mm3, mm2
810 : edgomez 851
811 : edgomez 1382 punpcklbw mm0, mm7
812 :     punpcklbw mm2, mm7
813 : edgomez 851
814 : edgomez 1382 punpckhbw mm1, mm7
815 :     punpckhbw mm3, mm7
816 : edgomez 851
817 : edgomez 1382 paddw mm0, mm2
818 :     paddw mm1, mm3
819 : edgomez 851
820 : edgomez 1382 psllw mm0, 2
821 :     psllw mm1, 2
822 : edgomez 851
823 : edgomez 1382 movq mm4, [eax+2*edx]
824 :     sub eax, ebx
825 :     movq mm2, [eax+2*edx]
826 : edgomez 851
827 : edgomez 1382 movq mm3, mm2
828 :     movq mm5, mm4
829 : edgomez 851
830 : edgomez 1382 punpcklbw mm2, mm7
831 :     punpcklbw mm4, mm7
832 : edgomez 851
833 : edgomez 1382 punpckhbw mm3, mm7
834 :     punpckhbw mm5, mm7
835 : edgomez 851
836 : edgomez 1382 paddw mm2, mm4
837 :     paddw mm3, mm5
838 : edgomez 851
839 : edgomez 1382 psubsw mm0, mm2
840 :     psubsw mm1, mm3
841 : edgomez 851
842 : edgomez 1382 pmullw mm0, [mmx_five]
843 :     pmullw mm1, [mmx_five]
844 : edgomez 851
845 : edgomez 1382 movq mm2, [eax+edx]
846 :     movq mm4, [eax+2*ebx]
847 : edgomez 851
848 : edgomez 1382 movq mm3, mm2
849 :     movq mm5, mm4
850 : edgomez 851
851 : edgomez 1382 punpcklbw mm2, mm7
852 :     punpcklbw mm4, mm7
853 : edgomez 851
854 : edgomez 1382 punpckhbw mm3, mm7
855 :     punpckhbw mm5, mm7
856 : edgomez 851
857 : edgomez 1382 paddw mm2, mm4
858 :     paddw mm3, mm5
859 : edgomez 851
860 : edgomez 1382 paddsw mm0, mm2
861 :     paddsw mm1, mm3
862 : edgomez 851
863 : edgomez 1382 paddsw mm0, mm6
864 :     paddsw mm1, mm6
865 : edgomez 851
866 : edgomez 1382 psraw mm0, 5
867 :     psraw mm1, 5
868 : edgomez 851
869 : edgomez 1382 lea eax, [eax+4*edx]
870 :     packuswb mm0, mm1
871 :     movq [ecx], mm0
872 : edgomez 851 %endmacro
873 :    
874 : edgomez 1382 ALIGN 16
875 :     interpolate8x8_6tap_lowpass_v_mmx:
876 : edgomez 851
877 : edgomez 1382 push ebx
878 : edgomez 851
879 : edgomez 1382 mov eax, [esp + 4 + 16] ; rounding
880 : edgomez 851
881 : edgomez 1382 movq mm6, [rounding_lowpass_mmx + eax * 8]
882 : edgomez 851
883 : edgomez 1382 mov ecx, [esp + 4 + 4] ; dst -> edi
884 :     mov eax, [esp + 4 + 8] ; src -> esi
885 :     mov edx, [esp + 4 + 12] ; stride -> edx
886 : edgomez 851
887 : edgomez 1382 mov ebx, edx
888 :     shl ebx, 1
889 :     add ebx, edx
890 : edgomez 851
891 : edgomez 1382 pxor mm7, mm7
892 : edgomez 851
893 : edgomez 1382 LOWPASS_6TAP_V_MMX
894 :     lea ecx, [ecx+edx]
895 :     LOWPASS_6TAP_V_MMX
896 :     lea ecx, [ecx+edx]
897 :     LOWPASS_6TAP_V_MMX
898 :     lea ecx, [ecx+edx]
899 :     LOWPASS_6TAP_V_MMX
900 :     lea ecx, [ecx+edx]
901 :     LOWPASS_6TAP_V_MMX
902 :     lea ecx, [ecx+edx]
903 :     LOWPASS_6TAP_V_MMX
904 :     lea ecx, [ecx+edx]
905 :     LOWPASS_6TAP_V_MMX
906 :     lea ecx, [ecx+edx]
907 :     LOWPASS_6TAP_V_MMX
908 : edgomez 851
909 : edgomez 1382 pop ebx
910 :     ret

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