[svn] / branches / dev-api-4 / xvidcore / src / image / x86_asm / interpolate8x8_mmx.asm Repository:
ViewVC logotype

Annotation of /branches/dev-api-4/xvidcore/src/image/x86_asm/interpolate8x8_mmx.asm

Parent Directory Parent Directory | Revision Log Revision Log


Revision 1192 - (view) (download)

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

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