[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 1795 - (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 : Isibaar 1795 ; * 2002-2008 Michael Militzer <michael@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 : Isibaar 1795 %include "nasm.inc"
26 : edgomez 851
27 : edgomez 1382 ;=============================================================================
28 :     ; Read only data
29 :     ;=============================================================================
30 : Isibaar 262
31 : Isibaar 1795 DATA
32 : Isibaar 262
33 : edgomez 1382 ;-----------------------------------------------------------------------------
34 : edgomez 851 ; (16 - r) rounding table
35 : edgomez 1382 ;-----------------------------------------------------------------------------
36 : edgomez 851
37 : Isibaar 1795 ALIGN SECTION_ALIGN
38 : edgomez 1382 rounding_lowpass_mmx:
39 :     times 4 dw 16
40 :     times 4 dw 15
41 : edgomez 851
42 : edgomez 1382 ;-----------------------------------------------------------------------------
43 : Isibaar 262 ; (1 - r) rounding table
44 : edgomez 1382 ;-----------------------------------------------------------------------------
45 : Isibaar 262
46 : edgomez 1382 rounding1_mmx:
47 :     times 4 dw 1
48 :     times 4 dw 0
49 : Isibaar 262
50 : edgomez 1382 ;-----------------------------------------------------------------------------
51 :     ; (2 - r) rounding table
52 :     ;-----------------------------------------------------------------------------
53 : Isibaar 262
54 : edgomez 1382 rounding2_mmx:
55 :     times 4 dw 2
56 :     times 4 dw 1
57 : Isibaar 262
58 : edgomez 1382 mmx_one:
59 :     times 8 db 1
60 : Isibaar 262
61 : edgomez 1382 mmx_two:
62 :     times 8 db 2
63 : edgomez 851
64 : edgomez 1382 mmx_three:
65 :     times 8 db 3
66 : edgomez 851
67 : edgomez 1382 mmx_five:
68 :     times 4 dw 5
69 : edgomez 851
70 : edgomez 1382 mmx_mask:
71 :     times 8 db 254
72 : edgomez 851
73 : edgomez 1382 mmx_mask2:
74 :     times 8 db 252
75 : edgomez 851
76 : edgomez 1382 ;=============================================================================
77 :     ; Code
78 :     ;=============================================================================
79 : Isibaar 262
80 : Isibaar 1795 SECTION .rotext align=SECTION_ALIGN
81 : edgomez 1382
82 :     cglobal interpolate8x8_halfpel_h_mmx
83 :     cglobal interpolate8x8_halfpel_v_mmx
84 :     cglobal interpolate8x8_halfpel_hv_mmx
85 : edgomez 1530
86 : suxen_drol 1632 cglobal interpolate8x4_halfpel_h_mmx
87 :     cglobal interpolate8x4_halfpel_v_mmx
88 :     cglobal interpolate8x4_halfpel_hv_mmx
89 :    
90 : edgomez 1382 cglobal interpolate8x8_avg4_mmx
91 :     cglobal interpolate8x8_avg2_mmx
92 : edgomez 1530
93 : edgomez 1382 cglobal interpolate8x8_6tap_lowpass_h_mmx
94 :     cglobal interpolate8x8_6tap_lowpass_v_mmx
95 :    
96 : edgomez 1530 cglobal interpolate8x8_halfpel_add_mmx
97 :     cglobal interpolate8x8_halfpel_h_add_mmx
98 :     cglobal interpolate8x8_halfpel_v_add_mmx
99 :     cglobal interpolate8x8_halfpel_hv_add_mmx
100 :    
101 : Isibaar 262 %macro CALC_AVG 6
102 : edgomez 1382 punpcklbw %3, %6
103 :     punpckhbw %4, %6
104 : Isibaar 262
105 : edgomez 1382 paddusw %1, %3 ; mm01 += mm23
106 :     paddusw %2, %4
107 :     paddusw %1, %5 ; mm01 += rounding
108 :     paddusw %2, %5
109 : Isibaar 262
110 : edgomez 1382 psrlw %1, 1 ; mm01 >>= 1
111 :     psrlw %2, 1
112 : Isibaar 262 %endmacro
113 :    
114 :    
115 : edgomez 1382 ;-----------------------------------------------------------------------------
116 : Isibaar 262 ;
117 :     ; void interpolate8x8_halfpel_h_mmx(uint8_t * const dst,
118 : edgomez 1382 ; const uint8_t * const src,
119 :     ; const uint32_t stride,
120 :     ; const uint32_t rounding);
121 : Isibaar 262 ;
122 : edgomez 1382 ;-----------------------------------------------------------------------------
123 : Isibaar 262
124 :     %macro COPY_H_MMX 0
125 : Isibaar 1795 movq mm0, [TMP0]
126 :     movq mm2, [TMP0 + 1]
127 : edgomez 1382 movq mm1, mm0
128 :     movq mm3, mm2
129 : Isibaar 262
130 : edgomez 1382 punpcklbw mm0, mm6 ; mm01 = [src]
131 :     punpckhbw mm1, mm6 ; mm23 = [src + 1]
132 : Isibaar 262
133 : edgomez 1382 CALC_AVG mm0, mm1, mm2, mm3, mm7, mm6
134 : Isibaar 262
135 : edgomez 1382 packuswb mm0, mm1
136 : Isibaar 1795 movq [_EAX], mm0 ; [dst] = mm01
137 : Isibaar 262
138 : Isibaar 1795 add TMP0, TMP1 ; src += stride
139 :     add _EAX, TMP1 ; dst += stride
140 : Isibaar 262 %endmacro
141 :    
142 : Isibaar 1795 ALIGN SECTION_ALIGN
143 : edgomez 1382 interpolate8x8_halfpel_h_mmx:
144 : Isibaar 262
145 : Isibaar 1795 mov _EAX, prm4 ; rounding
146 :     lea TMP0, [rounding1_mmx]
147 :     movq mm7, [TMP0 + _EAX * 8]
148 : Isibaar 262
149 : Isibaar 1795 mov _EAX, prm1 ; dst
150 :     mov TMP0, prm2 ; src
151 :     mov TMP1, prm3 ; stride
152 : Isibaar 262
153 : Isibaar 1795 pxor mm6, mm6 ; zero
154 : Isibaar 262
155 : edgomez 1382 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 1382 ret
165 : Isibaar 1793 ENDFUNC
166 : Isibaar 262
167 :    
168 : edgomez 1382 ;-----------------------------------------------------------------------------
169 : Isibaar 262 ;
170 :     ; void interpolate8x8_halfpel_v_mmx(uint8_t * const dst,
171 : edgomez 1382 ; const uint8_t * const src,
172 :     ; const uint32_t stride,
173 :     ; const uint32_t rounding);
174 : Isibaar 262 ;
175 : edgomez 1382 ;-----------------------------------------------------------------------------
176 : Isibaar 262
177 :     %macro COPY_V_MMX 0
178 : Isibaar 1795 movq mm0, [TMP0]
179 :     movq mm2, [TMP0 + TMP1]
180 : edgomez 1382 movq mm1, mm0
181 :     movq mm3, mm2
182 : Isibaar 262
183 : edgomez 1382 punpcklbw mm0, mm6 ; mm01 = [src]
184 :     punpckhbw mm1, mm6 ; mm23 = [src + 1]
185 : Isibaar 262
186 : edgomez 1382 CALC_AVG mm0, mm1, mm2, mm3, mm7, mm6
187 : Isibaar 262
188 : edgomez 1382 packuswb mm0, mm1
189 : Isibaar 1795 movq [_EAX], mm0 ; [dst] = mm01
190 : Isibaar 262
191 : Isibaar 1795 add TMP0, TMP1 ; src += stride
192 :     add _EAX, TMP1 ; dst += stride
193 : Isibaar 262 %endmacro
194 :    
195 : Isibaar 1795 ALIGN SECTION_ALIGN
196 : edgomez 1382 interpolate8x8_halfpel_v_mmx:
197 : Isibaar 262
198 : Isibaar 1795 mov _EAX, prm4 ; rounding
199 :     lea TMP0, [rounding1_mmx]
200 :     movq mm7, [TMP0 + _EAX * 8]
201 : Isibaar 262
202 : Isibaar 1795 mov _EAX, prm1 ; dst
203 :     mov TMP0, prm2 ; src
204 :     mov TMP1, prm3 ; stride
205 : Isibaar 262
206 : Isibaar 1795 pxor mm6, mm6 ; zero
207 : Isibaar 262
208 :    
209 : edgomez 1382 COPY_V_MMX
210 :     COPY_V_MMX
211 :     COPY_V_MMX
212 :     COPY_V_MMX
213 :     COPY_V_MMX
214 :     COPY_V_MMX
215 :     COPY_V_MMX
216 :     COPY_V_MMX
217 : Isibaar 262
218 : edgomez 1382 ret
219 : Isibaar 1793 ENDFUNC
220 : Isibaar 262
221 : edgomez 1382
222 :     ;-----------------------------------------------------------------------------
223 : Isibaar 262 ;
224 :     ; void interpolate8x8_halfpel_hv_mmx(uint8_t * const dst,
225 : edgomez 1382 ; const uint8_t * const src,
226 :     ; const uint32_t stride,
227 :     ; const uint32_t rounding);
228 : Isibaar 262 ;
229 :     ;
230 : edgomez 1382 ;-----------------------------------------------------------------------------
231 : Isibaar 262
232 :     %macro COPY_HV_MMX 0
233 : edgomez 1382 ; current row
234 : Isibaar 1795 movq mm0, [TMP0]
235 :     movq mm2, [TMP0 + 1]
236 : Isibaar 262
237 : edgomez 1382 movq mm1, mm0
238 :     movq mm3, mm2
239 : Isibaar 262
240 : edgomez 1382 punpcklbw mm0, mm6 ; mm01 = [src]
241 :     punpcklbw mm2, mm6 ; mm23 = [src + 1]
242 :     punpckhbw mm1, mm6
243 :     punpckhbw mm3, mm6
244 : Isibaar 262
245 : edgomez 1382 paddusw mm0, mm2 ; mm01 += mm23
246 :     paddusw mm1, mm3
247 : Isibaar 262
248 : edgomez 1382 ; next row
249 : Isibaar 1795 movq mm4, [TMP0 + TMP1]
250 :     movq mm2, [TMP0 + TMP1 + 1]
251 : Isibaar 262
252 : edgomez 1382 movq mm5, mm4
253 :     movq mm3, mm2
254 : Isibaar 262
255 : edgomez 1382 punpcklbw mm4, mm6 ; mm45 = [src + stride]
256 :     punpcklbw mm2, mm6 ; mm23 = [src + stride + 1]
257 :     punpckhbw mm5, mm6
258 :     punpckhbw mm3, mm6
259 : Isibaar 262
260 : edgomez 1382 paddusw mm4, mm2 ; mm45 += mm23
261 :     paddusw mm5, mm3
262 : Isibaar 262
263 : edgomez 1382 ; add current + next row
264 :     paddusw mm0, mm4 ; mm01 += mm45
265 :     paddusw mm1, mm5
266 :     paddusw mm0, mm7 ; mm01 += rounding2
267 :     paddusw mm1, mm7
268 : Isibaar 262
269 : edgomez 1382 psrlw mm0, 2 ; mm01 >>= 2
270 :     psrlw mm1, 2
271 : Isibaar 262
272 : edgomez 1382 packuswb mm0, mm1
273 : Isibaar 1795 movq [_EAX], mm0 ; [dst] = mm01
274 : Isibaar 262
275 : Isibaar 1795 add TMP0, TMP1 ; src += stride
276 :     add _EAX, TMP1 ; dst += stride
277 : Isibaar 262 %endmacro
278 :    
279 : Isibaar 1795 ALIGN SECTION_ALIGN
280 : edgomez 1382 interpolate8x8_halfpel_hv_mmx:
281 : Isibaar 262
282 : Isibaar 1795 mov _EAX, prm4 ; rounding
283 :     lea TMP0, [rounding2_mmx]
284 :     movq mm7, [TMP0 + _EAX * 8]
285 : Isibaar 262
286 : Isibaar 1795 mov _EAX, prm1 ; dst
287 :     mov TMP0, prm2 ; src
288 : Isibaar 262
289 : Isibaar 1795 pxor mm6, mm6 ; zero
290 : Isibaar 262
291 : Isibaar 1795 mov TMP1, prm3 ; stride
292 : Isibaar 262
293 : edgomez 1382 COPY_HV_MMX
294 :     COPY_HV_MMX
295 :     COPY_HV_MMX
296 :     COPY_HV_MMX
297 :     COPY_HV_MMX
298 :     COPY_HV_MMX
299 :     COPY_HV_MMX
300 :     COPY_HV_MMX
301 : edgomez 851
302 : edgomez 1382 ret
303 : Isibaar 1793 ENDFUNC
304 : edgomez 1382
305 :     ;-----------------------------------------------------------------------------
306 : edgomez 851 ;
307 : suxen_drol 1632 ; void interpolate8x4_halfpel_h_mmx(uint8_t * const dst,
308 :     ; const uint8_t * const src,
309 :     ; const uint32_t stride,
310 :     ; const uint32_t rounding);
311 :     ;
312 :     ;-----------------------------------------------------------------------------
313 :    
314 : Isibaar 1795 ALIGN SECTION_ALIGN
315 : suxen_drol 1632 interpolate8x4_halfpel_h_mmx:
316 :    
317 : Isibaar 1795 mov _EAX, prm4 ; rounding
318 :     lea TMP0, [rounding1_mmx]
319 :     movq mm7, [TMP0 + _EAX * 8]
320 : suxen_drol 1632
321 : Isibaar 1795 mov _EAX, prm1 ; dst
322 :     mov TMP0, prm2 ; src
323 :     mov TMP1, prm3 ; stride
324 : suxen_drol 1632
325 : Isibaar 1795 pxor mm6, mm6 ; zero
326 : suxen_drol 1632
327 :     COPY_H_MMX
328 :     COPY_H_MMX
329 :     COPY_H_MMX
330 :     COPY_H_MMX
331 :    
332 :     ret
333 : Isibaar 1793 ENDFUNC
334 : suxen_drol 1632
335 :    
336 :     ;-----------------------------------------------------------------------------
337 :     ;
338 :     ; void interpolate8x4_halfpel_v_mmx(uint8_t * const dst,
339 :     ; const uint8_t * const src,
340 :     ; const uint32_t stride,
341 :     ; const uint32_t rounding);
342 :     ;
343 :     ;-----------------------------------------------------------------------------
344 :    
345 : Isibaar 1795 ALIGN SECTION_ALIGN
346 : suxen_drol 1632 interpolate8x4_halfpel_v_mmx:
347 :    
348 : Isibaar 1795 mov _EAX, prm4 ; rounding
349 :     lea TMP0, [rounding1_mmx]
350 :     movq mm7, [TMP0 + _EAX * 8]
351 : suxen_drol 1632
352 : Isibaar 1795 mov _EAX, prm1 ; dst
353 :     mov TMP0, prm2 ; src
354 :     mov TMP1, prm3 ; stride
355 : suxen_drol 1632
356 : Isibaar 1795 pxor mm6, mm6 ; zero
357 : suxen_drol 1632
358 :    
359 :     COPY_V_MMX
360 :     COPY_V_MMX
361 :     COPY_V_MMX
362 :     COPY_V_MMX
363 :    
364 :     ret
365 : Isibaar 1793 ENDFUNC
366 : suxen_drol 1632
367 :    
368 :     ;-----------------------------------------------------------------------------
369 :     ;
370 :     ; void interpolate8x4_halfpel_hv_mmx(uint8_t * const dst,
371 :     ; const uint8_t * const src,
372 :     ; const uint32_t stride,
373 :     ; const uint32_t rounding);
374 :     ;
375 :     ;
376 :     ;-----------------------------------------------------------------------------
377 :    
378 : Isibaar 1795 ALIGN SECTION_ALIGN
379 : suxen_drol 1632 interpolate8x4_halfpel_hv_mmx:
380 :    
381 : Isibaar 1795 mov _EAX, prm4 ; rounding
382 :     lea TMP0, [rounding2_mmx]
383 :     movq mm7, [TMP0 + _EAX * 8]
384 : suxen_drol 1632
385 : Isibaar 1795 mov _EAX, prm1 ; dst
386 :     mov TMP0, prm2 ; src
387 : suxen_drol 1632
388 : Isibaar 1795 pxor mm6, mm6 ; zero
389 : suxen_drol 1632
390 : Isibaar 1795 mov TMP1, prm3 ; stride
391 : suxen_drol 1632
392 :     COPY_HV_MMX
393 :     COPY_HV_MMX
394 :     COPY_HV_MMX
395 :     COPY_HV_MMX
396 :    
397 :     ret
398 : Isibaar 1793 ENDFUNC
399 : suxen_drol 1632
400 :     ;-----------------------------------------------------------------------------
401 :     ;
402 : edgomez 851 ; void interpolate8x8_avg2_mmx(uint8_t const *dst,
403 : edgomez 1382 ; const uint8_t * const src1,
404 :     ; const uint8_t * const src2,
405 :     ; const uint32_t stride,
406 :     ; const uint32_t rounding,
407 :     ; const uint32_t height);
408 : edgomez 851 ;
409 : edgomez 1382 ;-----------------------------------------------------------------------------
410 : edgomez 851
411 :     %macro AVG2_MMX_RND0 0
412 : Isibaar 1795 movq mm0, [_EAX] ; src1 -> mm0
413 :     movq mm1, [_EBX] ; src2 -> mm1
414 : edgomez 851
415 : Isibaar 1795 movq mm4, [_EAX+TMP1]
416 :     movq mm5, [_EBX+TMP1]
417 : edgomez 851
418 : edgomez 1382 movq mm2, mm0 ; src1 -> mm2
419 :     movq mm3, mm1 ; src2 -> mm3
420 : edgomez 851
421 : edgomez 1382 pand mm2, mm7 ; isolate the lsb
422 :     pand mm3, mm7 ; isolate the lsb
423 : edgomez 851
424 : edgomez 1382 por mm2, mm3 ; ODD(src1) OR ODD(src2) -> mm2
425 : edgomez 851
426 : edgomez 1382 movq mm3, mm4
427 :     movq mm6, mm5
428 : edgomez 851
429 : edgomez 1382 pand mm3, mm7
430 :     pand mm6, mm7
431 : edgomez 851
432 : edgomez 1382 por mm3, mm6
433 : edgomez 851
434 : edgomez 1382 pand mm0, [mmx_mask]
435 :     pand mm1, [mmx_mask]
436 :     pand mm4, [mmx_mask]
437 :     pand mm5, [mmx_mask]
438 : edgomez 851
439 : edgomez 1382 psrlq mm0, 1 ; src1 / 2
440 :     psrlq mm1, 1 ; src2 / 2
441 : edgomez 851
442 : edgomez 1382 psrlq mm4, 1
443 :     psrlq mm5, 1
444 : edgomez 851
445 : edgomez 1382 paddb mm0, mm1 ; src1/2 + src2/2 -> mm0
446 :     paddb mm0, mm2 ; correct rounding error
447 : edgomez 851
448 : edgomez 1382 paddb mm4, mm5
449 :     paddb mm4, mm3
450 : edgomez 851
451 : Isibaar 1795 lea _EAX, [_EAX+2*TMP1]
452 :     lea _EBX, [_EBX+2*TMP1]
453 : edgomez 1382
454 : Isibaar 1795 movq [TMP0], mm0 ; (src1 + src2 + 1) / 2 -> dst
455 :     movq [TMP0+TMP1], mm4
456 : edgomez 851 %endmacro
457 :    
458 :     %macro AVG2_MMX_RND1 0
459 : Isibaar 1795 movq mm0, [_EAX] ; src1 -> mm0
460 :     movq mm1, [_EBX] ; src2 -> mm1
461 : edgomez 851
462 : Isibaar 1795 movq mm4, [_EAX+TMP1]
463 :     movq mm5, [_EBX+TMP1]
464 : edgomez 851
465 : edgomez 1382 movq mm2, mm0 ; src1 -> mm2
466 :     movq mm3, mm1 ; src2 -> mm3
467 : edgomez 851
468 : edgomez 1382 pand mm2, mm7 ; isolate the lsb
469 :     pand mm3, mm7 ; isolate the lsb
470 : edgomez 851
471 : edgomez 1382 pand mm2, mm3 ; ODD(src1) AND ODD(src2) -> mm2
472 : edgomez 851
473 : edgomez 1382 movq mm3, mm4
474 :     movq mm6, mm5
475 : edgomez 851
476 : edgomez 1382 pand mm3, mm7
477 :     pand mm6, mm7
478 : edgomez 851
479 : edgomez 1382 pand mm3, mm6
480 : edgomez 851
481 : edgomez 1382 pand mm0, [mmx_mask]
482 :     pand mm1, [mmx_mask]
483 :     pand mm4, [mmx_mask]
484 :     pand mm5, [mmx_mask]
485 : edgomez 851
486 : edgomez 1382 psrlq mm0, 1 ; src1 / 2
487 :     psrlq mm1, 1 ; src2 / 2
488 : edgomez 851
489 : edgomez 1382 psrlq mm4, 1
490 :     psrlq mm5, 1
491 : edgomez 851
492 : edgomez 1382 paddb mm0, mm1 ; src1/2 + src2/2 -> mm0
493 :     paddb mm0, mm2 ; correct rounding error
494 : edgomez 851
495 : edgomez 1382 paddb mm4, mm5
496 :     paddb mm4, mm3
497 :    
498 : Isibaar 1795 lea _EAX, [_EAX+2*TMP1]
499 :     lea _EBX, [_EBX+2*TMP1]
500 : edgomez 1382
501 : Isibaar 1795 movq [TMP0], mm0 ; (src1 + src2 + 1) / 2 -> dst
502 :     movq [TMP0+TMP1], mm4
503 : edgomez 851 %endmacro
504 :    
505 : Isibaar 1795 ALIGN SECTION_ALIGN
506 : edgomez 1382 interpolate8x8_avg2_mmx:
507 : edgomez 851
508 : Isibaar 1795 mov _EAX, prm5 ; rounding
509 :     test _EAX, _EAX
510 : edgomez 851
511 : edgomez 1382 jnz near .rounding1
512 : edgomez 851
513 : Isibaar 1795 mov _EAX, prm6 ; height -> _EAX
514 :     sub _EAX, 8
515 :     test _EAX, _EAX
516 : edgomez 851
517 : Isibaar 1795 mov TMP0, prm1 ; dst -> edi
518 :     mov _EAX, prm2 ; src1 -> esi
519 :     mov TMP1, prm4 ; stride -> TMP1
520 : edgomez 851
521 : Isibaar 1795 push _EBX
522 :     %ifdef ARCH_IS_X86_64
523 :     mov _EBX, prm3
524 :     %else
525 :     mov _EBX, [esp + 4 + 12] ; src2 -> eax
526 :     %endif
527 :    
528 : edgomez 1382 movq mm7, [mmx_one]
529 : edgomez 851
530 : edgomez 1382 jz near .start0
531 : edgomez 851
532 : edgomez 1382 AVG2_MMX_RND0
533 : Isibaar 1795 lea TMP0, [TMP0+2*TMP1]
534 : edgomez 1382
535 : Isibaar 1793 .start0:
536 : edgomez 851
537 : edgomez 1382 AVG2_MMX_RND0
538 : Isibaar 1795 lea TMP0, [TMP0+2*TMP1]
539 : edgomez 1382 AVG2_MMX_RND0
540 : Isibaar 1795 lea TMP0, [TMP0+2*TMP1]
541 : edgomez 1382 AVG2_MMX_RND0
542 : Isibaar 1795 lea TMP0, [TMP0+2*TMP1]
543 : edgomez 1382 AVG2_MMX_RND0
544 : edgomez 851
545 : Isibaar 1795 pop _EBX
546 : edgomez 1382 ret
547 :    
548 : Isibaar 1793 .rounding1:
549 : Isibaar 1795 mov _EAX, prm6 ; height -> _EAX
550 :     sub _EAX, 8
551 :     test _EAX, _EAX
552 : edgomez 851
553 : Isibaar 1795 mov TMP0, prm1 ; dst -> edi
554 :     mov _EAX, prm2 ; src1 -> esi
555 :     mov TMP1, prm4 ; stride -> TMP1
556 : edgomez 851
557 : Isibaar 1795 push _EBX
558 :     %ifdef ARCH_IS_X86_64
559 :     mov _EBX, prm3
560 :     %else
561 :     mov _EBX, [esp + 4 + 12] ; src2 -> eax
562 :     %endif
563 :    
564 : edgomez 1382 movq mm7, [mmx_one]
565 : edgomez 851
566 : edgomez 1382 jz near .start1
567 : edgomez 851
568 : edgomez 1382 AVG2_MMX_RND1
569 : Isibaar 1795 lea TMP0, [TMP0+2*TMP1]
570 : edgomez 851
571 : Isibaar 1793 .start1:
572 : edgomez 851
573 : edgomez 1382 AVG2_MMX_RND1
574 : Isibaar 1795 lea TMP0, [TMP0+2*TMP1]
575 : edgomez 1382 AVG2_MMX_RND1
576 : Isibaar 1795 lea TMP0, [TMP0+2*TMP1]
577 : edgomez 1382 AVG2_MMX_RND1
578 : Isibaar 1795 lea TMP0, [TMP0+2*TMP1]
579 : edgomez 1382 AVG2_MMX_RND1
580 : edgomez 851
581 : Isibaar 1795 pop _EBX
582 : edgomez 1382 ret
583 : Isibaar 1793 ENDFUNC
584 : edgomez 851
585 :    
586 : edgomez 1382 ;-----------------------------------------------------------------------------
587 : edgomez 851 ;
588 :     ; void interpolate8x8_avg4_mmx(uint8_t const *dst,
589 : edgomez 1382 ; const uint8_t * const src1,
590 :     ; const uint8_t * const src2,
591 :     ; const uint8_t * const src3,
592 :     ; const uint8_t * const src4,
593 :     ; const uint32_t stride,
594 :     ; const uint32_t rounding);
595 : edgomez 851 ;
596 : edgomez 1382 ;-----------------------------------------------------------------------------
597 : edgomez 851
598 :     %macro AVG4_MMX_RND0 0
599 : Isibaar 1795 movq mm0, [_EAX] ; src1 -> mm0
600 :     movq mm1, [_EBX] ; src2 -> mm1
601 : edgomez 851
602 : edgomez 1382 movq mm2, mm0
603 :     movq mm3, mm1
604 : edgomez 851
605 : edgomez 1382 pand mm2, [mmx_three]
606 :     pand mm3, [mmx_three]
607 : edgomez 851
608 : edgomez 1382 pand mm0, [mmx_mask2]
609 :     pand mm1, [mmx_mask2]
610 : edgomez 851
611 : edgomez 1382 psrlq mm0, 2
612 :     psrlq mm1, 2
613 : edgomez 851
614 : Isibaar 1795 lea _EAX, [_EAX+TMP1]
615 :     lea _EBX, [_EBX+TMP1]
616 : edgomez 851
617 : edgomez 1382 paddb mm0, mm1
618 :     paddb mm2, mm3
619 : edgomez 851
620 : Isibaar 1795 movq mm4, [_ESI] ; src3 -> mm0
621 :     movq mm5, [_EDI] ; src4 -> mm1
622 : edgomez 851
623 : edgomez 1382 movq mm1, mm4
624 :     movq mm3, mm5
625 : edgomez 851
626 : edgomez 1382 pand mm1, [mmx_three]
627 :     pand mm3, [mmx_three]
628 : edgomez 851
629 : edgomez 1382 pand mm4, [mmx_mask2]
630 :     pand mm5, [mmx_mask2]
631 : edgomez 851
632 : edgomez 1382 psrlq mm4, 2
633 :     psrlq mm5, 2
634 : edgomez 851
635 : edgomez 1382 paddb mm4, mm5
636 :     paddb mm0, mm4
637 : edgomez 851
638 : edgomez 1382 paddb mm1, mm3
639 :     paddb mm2, mm1
640 :    
641 :     paddb mm2, [mmx_two]
642 :     pand mm2, [mmx_mask2]
643 :    
644 :     psrlq mm2, 2
645 :     paddb mm0, mm2
646 :    
647 : Isibaar 1795 lea _ESI, [_ESI+TMP1]
648 :     lea _EDI, [_EDI+TMP1]
649 : edgomez 1382
650 : Isibaar 1795 movq [TMP0], mm0 ; (src1 + src2 + src3 + src4 + 2) / 4 -> dst
651 : edgomez 851 %endmacro
652 :    
653 :     %macro AVG4_MMX_RND1 0
654 : Isibaar 1795 movq mm0, [_EAX] ; src1 -> mm0
655 :     movq mm1, [_EBX] ; src2 -> mm1
656 : edgomez 851
657 : edgomez 1382 movq mm2, mm0
658 :     movq mm3, mm1
659 : edgomez 851
660 : edgomez 1382 pand mm2, [mmx_three]
661 :     pand mm3, [mmx_three]
662 : edgomez 851
663 : edgomez 1382 pand mm0, [mmx_mask2]
664 :     pand mm1, [mmx_mask2]
665 : edgomez 851
666 : edgomez 1382 psrlq mm0, 2
667 :     psrlq mm1, 2
668 : edgomez 851
669 : Isibaar 1795 lea _EAX,[_EAX+TMP1]
670 :     lea _EBX,[_EBX+TMP1]
671 : edgomez 851
672 : edgomez 1382 paddb mm0, mm1
673 :     paddb mm2, mm3
674 : edgomez 851
675 : Isibaar 1795 movq mm4, [_ESI] ; src3 -> mm0
676 :     movq mm5, [_EDI] ; src4 -> mm1
677 : edgomez 851
678 : edgomez 1382 movq mm1, mm4
679 :     movq mm3, mm5
680 : edgomez 851
681 : edgomez 1382 pand mm1, [mmx_three]
682 :     pand mm3, [mmx_three]
683 : edgomez 851
684 : edgomez 1382 pand mm4, [mmx_mask2]
685 :     pand mm5, [mmx_mask2]
686 : edgomez 851
687 : edgomez 1382 psrlq mm4, 2
688 :     psrlq mm5, 2
689 : edgomez 851
690 : edgomez 1382 paddb mm4, mm5
691 :     paddb mm0, mm4
692 : edgomez 851
693 : edgomez 1382 paddb mm1, mm3
694 :     paddb mm2, mm1
695 :    
696 :     paddb mm2, [mmx_one]
697 :     pand mm2, [mmx_mask2]
698 :    
699 :     psrlq mm2, 2
700 :     paddb mm0, mm2
701 :    
702 : Isibaar 1795 lea _ESI,[_ESI+TMP1]
703 :     lea _EDI,[_EDI+TMP1]
704 : edgomez 1382
705 : Isibaar 1795 movq [TMP0], mm0 ; (src1 + src2 + src3 + src4 + 2) / 4 -> dst
706 : edgomez 851 %endmacro
707 :    
708 : Isibaar 1795 ALIGN SECTION_ALIGN
709 : edgomez 1382 interpolate8x8_avg4_mmx:
710 : edgomez 851
711 : Isibaar 1795 mov _EAX, prm7 ; rounding
712 :     test _EAX, _EAX
713 : edgomez 851
714 : Isibaar 1795 mov TMP0, prm1 ; dst -> edi
715 :     mov _EAX, prm5 ; src4 -> edi
716 :     mov TMP1, prm6 ; stride -> TMP1
717 : edgomez 851
718 :    
719 : Isibaar 1795 push _EBX
720 :     push _EDI
721 :     push _ESI
722 : edgomez 851
723 : Isibaar 1795 mov _EDI, _EAX
724 :    
725 :     %ifdef ARCH_IS_X86_64
726 :     mov _EAX, prm2
727 :     mov _EBX, prm3
728 :     mov _ESI, prm4
729 :     %else
730 :     mov _EAX, [esp + 12 + 8] ; src1 -> esi
731 :     mov _EBX, [esp + 12 + 12] ; src2 -> _EAX
732 :     mov _ESI, [esp + 12 + 16] ; src3 -> esi
733 :     %endif
734 :    
735 : edgomez 1382 movq mm7, [mmx_one]
736 : edgomez 851
737 : edgomez 1382 jnz near .rounding1
738 : edgomez 851
739 : edgomez 1382 AVG4_MMX_RND0
740 : Isibaar 1795 lea TMP0, [TMP0+TMP1]
741 : edgomez 1382 AVG4_MMX_RND0
742 : Isibaar 1795 lea TMP0, [TMP0+TMP1]
743 : edgomez 1382 AVG4_MMX_RND0
744 : Isibaar 1795 lea TMP0, [TMP0+TMP1]
745 : edgomez 1382 AVG4_MMX_RND0
746 : Isibaar 1795 lea TMP0, [TMP0+TMP1]
747 : edgomez 1382 AVG4_MMX_RND0
748 : Isibaar 1795 lea TMP0, [TMP0+TMP1]
749 : edgomez 1382 AVG4_MMX_RND0
750 : Isibaar 1795 lea TMP0, [TMP0+TMP1]
751 : edgomez 1382 AVG4_MMX_RND0
752 : Isibaar 1795 lea TMP0, [TMP0+TMP1]
753 : edgomez 1382 AVG4_MMX_RND0
754 :    
755 : Isibaar 1795 pop _ESI
756 :     pop _EDI
757 :     pop _EBX
758 : edgomez 1382 ret
759 :    
760 : Isibaar 1793 .rounding1:
761 : edgomez 1382 AVG4_MMX_RND1
762 : Isibaar 1795 lea TMP0, [TMP0+TMP1]
763 : edgomez 1382 AVG4_MMX_RND1
764 : Isibaar 1795 lea TMP0, [TMP0+TMP1]
765 : edgomez 1382 AVG4_MMX_RND1
766 : Isibaar 1795 lea TMP0, [TMP0+TMP1]
767 : edgomez 1382 AVG4_MMX_RND1
768 : Isibaar 1795 lea TMP0, [TMP0+TMP1]
769 : edgomez 1382 AVG4_MMX_RND1
770 : Isibaar 1795 lea TMP0, [TMP0+TMP1]
771 : edgomez 1382 AVG4_MMX_RND1
772 : Isibaar 1795 lea TMP0, [TMP0+TMP1]
773 : edgomez 1382 AVG4_MMX_RND1
774 : Isibaar 1795 lea TMP0, [TMP0+TMP1]
775 : edgomez 1382 AVG4_MMX_RND1
776 : edgomez 851
777 : Isibaar 1795 pop _ESI
778 :     pop _EDI
779 :     pop _EBX
780 : edgomez 1382 ret
781 : Isibaar 1793 ENDFUNC
782 : edgomez 851
783 :    
784 : edgomez 1382 ;-----------------------------------------------------------------------------
785 : edgomez 851 ;
786 :     ; void interpolate8x8_6tap_lowpass_h_mmx(uint8_t const *dst,
787 : edgomez 1382 ; const uint8_t * const src,
788 :     ; const uint32_t stride,
789 :     ; const uint32_t rounding);
790 : edgomez 851 ;
791 : edgomez 1382 ;-----------------------------------------------------------------------------
792 : edgomez 851
793 :     %macro LOWPASS_6TAP_H_MMX 0
794 : Isibaar 1795 movq mm0, [_EAX]
795 :     movq mm2, [_EAX+1]
796 : edgomez 851
797 : edgomez 1382 movq mm1, mm0
798 :     movq mm3, mm2
799 : edgomez 851
800 : edgomez 1382 punpcklbw mm0, mm7
801 :     punpcklbw mm2, mm7
802 : edgomez 851
803 : edgomez 1382 punpckhbw mm1, mm7
804 :     punpckhbw mm3, mm7
805 : edgomez 851
806 : edgomez 1382 paddw mm0, mm2
807 :     paddw mm1, mm3
808 : edgomez 851
809 : edgomez 1382 psllw mm0, 2
810 :     psllw mm1, 2
811 : edgomez 851
812 : Isibaar 1795 movq mm2, [_EAX-1]
813 :     movq mm4, [_EAX+2]
814 : edgomez 851
815 : edgomez 1382 movq mm3, mm2
816 :     movq mm5, mm4
817 : edgomez 851
818 : edgomez 1382 punpcklbw mm2, mm7
819 :     punpcklbw mm4, mm7
820 : edgomez 851
821 : edgomez 1382 punpckhbw mm3, mm7
822 :     punpckhbw mm5, mm7
823 : edgomez 851
824 : edgomez 1382 paddw mm2, mm4
825 :     paddw mm3, mm5
826 : edgomez 851
827 : edgomez 1382 psubsw mm0, mm2
828 :     psubsw mm1, mm3
829 : edgomez 851
830 : edgomez 1382 pmullw mm0, [mmx_five]
831 :     pmullw mm1, [mmx_five]
832 : edgomez 851
833 : Isibaar 1795 movq mm2, [_EAX-2]
834 :     movq mm4, [_EAX+3]
835 : edgomez 851
836 : edgomez 1382 movq mm3, mm2
837 :     movq mm5, mm4
838 : edgomez 851
839 : edgomez 1382 punpcklbw mm2, mm7
840 :     punpcklbw mm4, mm7
841 : edgomez 851
842 : edgomez 1382 punpckhbw mm3, mm7
843 :     punpckhbw mm5, mm7
844 : edgomez 851
845 : edgomez 1382 paddw mm2, mm4
846 :     paddw mm3, mm5
847 : edgomez 851
848 : edgomez 1382 paddsw mm0, mm2
849 :     paddsw mm1, mm3
850 : edgomez 851
851 : edgomez 1382 paddsw mm0, mm6
852 :     paddsw mm1, mm6
853 : edgomez 851
854 : edgomez 1382 psraw mm0, 5
855 :     psraw mm1, 5
856 : edgomez 851
857 : Isibaar 1795 lea _EAX, [_EAX+TMP1]
858 : edgomez 1382 packuswb mm0, mm1
859 : Isibaar 1795 movq [TMP0], mm0
860 : edgomez 851 %endmacro
861 :    
862 : Isibaar 1795 ALIGN SECTION_ALIGN
863 : edgomez 1382 interpolate8x8_6tap_lowpass_h_mmx:
864 : edgomez 851
865 : Isibaar 1795 mov _EAX, prm4 ; rounding
866 : edgomez 851
867 : Isibaar 1795 lea TMP0, [rounding_lowpass_mmx]
868 :     movq mm6, [TMP0 + _EAX * 8]
869 : edgomez 851
870 : Isibaar 1795 mov TMP0, prm1 ; dst -> edi
871 :     mov _EAX, prm2 ; src -> esi
872 :     mov TMP1, prm3 ; stride -> edx
873 : edgomez 851
874 : edgomez 1382 pxor mm7, mm7
875 : edgomez 851
876 : edgomez 1382 LOWPASS_6TAP_H_MMX
877 : Isibaar 1795 lea TMP0, [TMP0+TMP1]
878 : edgomez 1382 LOWPASS_6TAP_H_MMX
879 : Isibaar 1795 lea TMP0, [TMP0+TMP1]
880 : edgomez 1382 LOWPASS_6TAP_H_MMX
881 : Isibaar 1795 lea TMP0, [TMP0+TMP1]
882 : edgomez 1382 LOWPASS_6TAP_H_MMX
883 : Isibaar 1795 lea TMP0, [TMP0+TMP1]
884 : edgomez 1382 LOWPASS_6TAP_H_MMX
885 : Isibaar 1795 lea TMP0, [TMP0+TMP1]
886 : edgomez 1382 LOWPASS_6TAP_H_MMX
887 : Isibaar 1795 lea TMP0, [TMP0+TMP1]
888 : edgomez 1382 LOWPASS_6TAP_H_MMX
889 : Isibaar 1795 lea TMP0, [TMP0+TMP1]
890 : edgomez 1382 LOWPASS_6TAP_H_MMX
891 : edgomez 851
892 : edgomez 1382 ret
893 : Isibaar 1793 ENDFUNC
894 : edgomez 1382
895 :     ;-----------------------------------------------------------------------------
896 : edgomez 851 ;
897 :     ; void interpolate8x8_6tap_lowpass_v_mmx(uint8_t const *dst,
898 : edgomez 1382 ; const uint8_t * const src,
899 :     ; const uint32_t stride,
900 :     ; const uint32_t rounding);
901 : edgomez 851 ;
902 : edgomez 1382 ;-----------------------------------------------------------------------------
903 : edgomez 851
904 :     %macro LOWPASS_6TAP_V_MMX 0
905 : Isibaar 1795 movq mm0, [_EAX]
906 :     movq mm2, [_EAX+TMP1]
907 : edgomez 851
908 : edgomez 1382 movq mm1, mm0
909 :     movq mm3, mm2
910 : edgomez 851
911 : edgomez 1382 punpcklbw mm0, mm7
912 :     punpcklbw mm2, mm7
913 : edgomez 851
914 : edgomez 1382 punpckhbw mm1, mm7
915 :     punpckhbw mm3, mm7
916 : edgomez 851
917 : edgomez 1382 paddw mm0, mm2
918 :     paddw mm1, mm3
919 : edgomez 851
920 : edgomez 1382 psllw mm0, 2
921 :     psllw mm1, 2
922 : edgomez 851
923 : Isibaar 1795 movq mm4, [_EAX+2*TMP1]
924 :     sub _EAX, _EBX
925 :     movq mm2, [_EAX+2*TMP1]
926 : edgomez 851
927 : edgomez 1382 movq mm3, mm2
928 :     movq mm5, mm4
929 : edgomez 851
930 : edgomez 1382 punpcklbw mm2, mm7
931 :     punpcklbw mm4, mm7
932 : edgomez 851
933 : edgomez 1382 punpckhbw mm3, mm7
934 :     punpckhbw mm5, mm7
935 : edgomez 851
936 : edgomez 1382 paddw mm2, mm4
937 :     paddw mm3, mm5
938 : edgomez 851
939 : edgomez 1382 psubsw mm0, mm2
940 :     psubsw mm1, mm3
941 : edgomez 851
942 : edgomez 1382 pmullw mm0, [mmx_five]
943 :     pmullw mm1, [mmx_five]
944 : edgomez 851
945 : Isibaar 1795 movq mm2, [_EAX+TMP1]
946 :     movq mm4, [_EAX+2*_EBX]
947 : edgomez 851
948 : edgomez 1382 movq mm3, mm2
949 :     movq mm5, mm4
950 : edgomez 851
951 : edgomez 1382 punpcklbw mm2, mm7
952 :     punpcklbw mm4, mm7
953 : edgomez 851
954 : edgomez 1382 punpckhbw mm3, mm7
955 :     punpckhbw mm5, mm7
956 : edgomez 851
957 : edgomez 1382 paddw mm2, mm4
958 :     paddw mm3, mm5
959 : edgomez 851
960 : edgomez 1382 paddsw mm0, mm2
961 :     paddsw mm1, mm3
962 : edgomez 851
963 : edgomez 1382 paddsw mm0, mm6
964 :     paddsw mm1, mm6
965 : edgomez 851
966 : edgomez 1382 psraw mm0, 5
967 :     psraw mm1, 5
968 : edgomez 851
969 : Isibaar 1795 lea _EAX, [_EAX+4*TMP1]
970 : edgomez 1382 packuswb mm0, mm1
971 : Isibaar 1795 movq [TMP0], mm0
972 : edgomez 851 %endmacro
973 :    
974 : Isibaar 1795 ALIGN SECTION_ALIGN
975 : edgomez 1382 interpolate8x8_6tap_lowpass_v_mmx:
976 : edgomez 851
977 : Isibaar 1795 mov _EAX, prm4 ; rounding
978 : edgomez 851
979 : Isibaar 1795 lea TMP0, [rounding_lowpass_mmx]
980 :     movq mm6, [TMP0 + _EAX * 8]
981 : edgomez 851
982 : Isibaar 1795 mov TMP0, prm1 ; dst -> edi
983 :     mov _EAX, prm2 ; src -> esi
984 :     mov TMP1, prm3 ; stride -> edx
985 : edgomez 851
986 : Isibaar 1795 push _EBX
987 : edgomez 851
988 : Isibaar 1795 mov _EBX, TMP1
989 :     shl _EBX, 1
990 :     add _EBX, TMP1
991 : edgomez 851
992 : edgomez 1382 pxor mm7, mm7
993 : edgomez 851
994 : edgomez 1382 LOWPASS_6TAP_V_MMX
995 : Isibaar 1795 lea TMP0, [TMP0+TMP1]
996 : edgomez 1382 LOWPASS_6TAP_V_MMX
997 : Isibaar 1795 lea TMP0, [TMP0+TMP1]
998 : edgomez 1382 LOWPASS_6TAP_V_MMX
999 : Isibaar 1795 lea TMP0, [TMP0+TMP1]
1000 : edgomez 1382 LOWPASS_6TAP_V_MMX
1001 : Isibaar 1795 lea TMP0, [TMP0+TMP1]
1002 : edgomez 1382 LOWPASS_6TAP_V_MMX
1003 : Isibaar 1795 lea TMP0, [TMP0+TMP1]
1004 : edgomez 1382 LOWPASS_6TAP_V_MMX
1005 : Isibaar 1795 lea TMP0, [TMP0+TMP1]
1006 : edgomez 1382 LOWPASS_6TAP_V_MMX
1007 : Isibaar 1795 lea TMP0, [TMP0+TMP1]
1008 : edgomez 1382 LOWPASS_6TAP_V_MMX
1009 : edgomez 851
1010 : Isibaar 1795 pop _EBX
1011 : edgomez 1382 ret
1012 : Isibaar 1793 ENDFUNC
1013 : edgomez 1530
1014 :     ;===========================================================================
1015 :     ;
1016 :     ; The next functions combine both source halfpel interpolation step and the
1017 :     ; averaging (with rouding) step to avoid wasting memory bandwidth computing
1018 :     ; intermediate halfpel images and then averaging them.
1019 :     ;
1020 :     ;===========================================================================
1021 :    
1022 :     %macro PROLOG0 0
1023 : Isibaar 1795 mov TMP0, prm1 ; Dst
1024 :     mov _EAX, prm2 ; Src
1025 :     mov TMP1, prm3 ; BpS
1026 : edgomez 1530 %endmacro
1027 :    
1028 :     %macro PROLOG 2 ; %1: Rounder, %2 load Dst-Rounder
1029 :     pxor mm6, mm6
1030 :     movq mm7, [%1] ; TODO: dangerous! (eax isn't checked)
1031 :     %if %2
1032 :     movq mm5, [rounding1_mmx]
1033 :     %endif
1034 :    
1035 :     PROLOG0
1036 :     %endmacro
1037 :    
1038 :     ; performs: mm0 == (mm0+mm2) mm1 == (mm1+mm3)
1039 :     %macro MIX 0
1040 :     punpcklbw mm0, mm6
1041 :     punpcklbw mm2, mm6
1042 :     punpckhbw mm1, mm6
1043 :     punpckhbw mm3, mm6
1044 :     paddusw mm0, mm2
1045 :     paddusw mm1, mm3
1046 :     %endmacro
1047 :    
1048 :     %macro MIX_DST 0
1049 :     movq mm3, mm2
1050 :     paddusw mm0, mm7 ; rounder
1051 :     paddusw mm1, mm7 ; rounder
1052 :     punpcklbw mm2, mm6
1053 :     punpckhbw mm3, mm6
1054 :     psrlw mm0, 1
1055 :     psrlw mm1, 1
1056 :    
1057 :     paddusw mm0, mm2 ; mix Src(mm0/mm1) with Dst(mm2/mm3)
1058 :     paddusw mm1, mm3
1059 :     paddusw mm0, mm5
1060 :     paddusw mm1, mm5
1061 :     psrlw mm0, 1
1062 :     psrlw mm1, 1
1063 :    
1064 :     packuswb mm0, mm1
1065 :     %endmacro
1066 :    
1067 :     %macro MIX2 0
1068 :     punpcklbw mm0, mm6
1069 :     punpcklbw mm2, mm6
1070 :     paddusw mm0, mm2
1071 :     paddusw mm0, mm7
1072 :     punpckhbw mm1, mm6
1073 :     punpckhbw mm3, mm6
1074 :     paddusw mm1, mm7
1075 :     paddusw mm1, mm3
1076 :     psrlw mm0, 1
1077 :     psrlw mm1, 1
1078 :    
1079 :     packuswb mm0, mm1
1080 :     %endmacro
1081 :    
1082 :     ;===========================================================================
1083 :     ;
1084 :     ; void interpolate8x8_halfpel_add_mmx(uint8_t * const dst,
1085 :     ; const uint8_t * const src,
1086 :     ; const uint32_t stride,
1087 :     ; const uint32_t rounding);
1088 :     ;
1089 :     ;
1090 :     ;===========================================================================
1091 :    
1092 :     %macro ADD_FF_MMX 1
1093 : Isibaar 1795 movq mm0, [_EAX]
1094 :     movq mm2, [TMP0]
1095 : edgomez 1530 movq mm1, mm0
1096 :     movq mm3, mm2
1097 :     %if (%1!=0)
1098 : Isibaar 1795 lea _EAX,[_EAX+%1*TMP1]
1099 : edgomez 1530 %endif
1100 :     MIX
1101 :     paddusw mm0, mm5 ; rounder
1102 :     paddusw mm1, mm5 ; rounder
1103 :     psrlw mm0, 1
1104 :     psrlw mm1, 1
1105 :    
1106 :     packuswb mm0, mm1
1107 : Isibaar 1795 movq [TMP0], mm0
1108 : edgomez 1530 %if (%1!=0)
1109 : Isibaar 1795 lea TMP0,[TMP0+%1*TMP1]
1110 : edgomez 1530 %endif
1111 :     %endmacro
1112 :    
1113 : Isibaar 1795 ALIGN SECTION_ALIGN
1114 : edgomez 1530 interpolate8x8_halfpel_add_mmx:
1115 :     PROLOG rounding1_mmx, 1
1116 :     ADD_FF_MMX 1
1117 :     ADD_FF_MMX 1
1118 :     ADD_FF_MMX 1
1119 :     ADD_FF_MMX 1
1120 :     ADD_FF_MMX 1
1121 :     ADD_FF_MMX 1
1122 :     ADD_FF_MMX 1
1123 :     ADD_FF_MMX 0
1124 :     ret
1125 : Isibaar 1793 ENDFUNC
1126 : edgomez 1530
1127 :     ;===========================================================================
1128 :     ;
1129 :     ; void interpolate8x8_halfpel_h_add_mmx(uint8_t * const dst,
1130 :     ; const uint8_t * const src,
1131 :     ; const uint32_t stride,
1132 :     ; const uint32_t rounding);
1133 :     ;
1134 :     ;
1135 :     ;===========================================================================
1136 :    
1137 :     %macro ADD_FH_MMX 0
1138 : Isibaar 1795 movq mm0, [_EAX]
1139 :     movq mm2, [_EAX+1]
1140 : edgomez 1530 movq mm1, mm0
1141 :     movq mm3, mm2
1142 :    
1143 : Isibaar 1795 lea _EAX,[_EAX+TMP1]
1144 : edgomez 1530
1145 :     MIX
1146 : Isibaar 1795 movq mm2, [TMP0] ; prepare mix with Dst[0]
1147 : edgomez 1530 MIX_DST
1148 : Isibaar 1795 movq [TMP0], mm0
1149 : edgomez 1530 %endmacro
1150 :    
1151 : Isibaar 1795 ALIGN SECTION_ALIGN
1152 : edgomez 1530 interpolate8x8_halfpel_h_add_mmx:
1153 :     PROLOG rounding1_mmx, 1
1154 :    
1155 :     ADD_FH_MMX
1156 : Isibaar 1795 lea TMP0,[TMP0+TMP1]
1157 : edgomez 1530 ADD_FH_MMX
1158 : Isibaar 1795 lea TMP0,[TMP0+TMP1]
1159 : edgomez 1530 ADD_FH_MMX
1160 : Isibaar 1795 lea TMP0,[TMP0+TMP1]
1161 : edgomez 1530 ADD_FH_MMX
1162 : Isibaar 1795 lea TMP0,[TMP0+TMP1]
1163 : edgomez 1530 ADD_FH_MMX
1164 : Isibaar 1795 lea TMP0,[TMP0+TMP1]
1165 : edgomez 1530 ADD_FH_MMX
1166 : Isibaar 1795 lea TMP0,[TMP0+TMP1]
1167 : edgomez 1530 ADD_FH_MMX
1168 : Isibaar 1795 lea TMP0,[TMP0+TMP1]
1169 : edgomez 1530 ADD_FH_MMX
1170 :     ret
1171 : Isibaar 1793 ENDFUNC
1172 : edgomez 1530
1173 :     ;===========================================================================
1174 :     ;
1175 :     ; void interpolate8x8_halfpel_v_add_mmx(uint8_t * const dst,
1176 :     ; const uint8_t * const src,
1177 :     ; const uint32_t stride,
1178 :     ; const uint32_t rounding);
1179 :     ;
1180 :     ;
1181 :     ;===========================================================================
1182 :    
1183 :     %macro ADD_HF_MMX 0
1184 : Isibaar 1795 movq mm0, [_EAX]
1185 :     movq mm2, [_EAX+TMP1]
1186 : edgomez 1530 movq mm1, mm0
1187 :     movq mm3, mm2
1188 :    
1189 : Isibaar 1795 lea _EAX,[_EAX+TMP1]
1190 : edgomez 1530
1191 :     MIX
1192 : Isibaar 1795 movq mm2, [TMP0] ; prepare mix with Dst[0]
1193 : edgomez 1530 MIX_DST
1194 : Isibaar 1795 movq [TMP0], mm0
1195 : edgomez 1530
1196 :     %endmacro
1197 :    
1198 : Isibaar 1795 ALIGN SECTION_ALIGN
1199 : edgomez 1530 interpolate8x8_halfpel_v_add_mmx:
1200 :     PROLOG rounding1_mmx, 1
1201 :    
1202 :     ADD_HF_MMX
1203 : Isibaar 1795 lea TMP0,[TMP0+TMP1]
1204 : edgomez 1530 ADD_HF_MMX
1205 : Isibaar 1795 lea TMP0,[TMP0+TMP1]
1206 : edgomez 1530 ADD_HF_MMX
1207 : Isibaar 1795 lea TMP0,[TMP0+TMP1]
1208 : edgomez 1530 ADD_HF_MMX
1209 : Isibaar 1795 lea TMP0,[TMP0+TMP1]
1210 : edgomez 1530 ADD_HF_MMX
1211 : Isibaar 1795 lea TMP0,[TMP0+TMP1]
1212 : edgomez 1530 ADD_HF_MMX
1213 : Isibaar 1795 lea TMP0,[TMP0+TMP1]
1214 : edgomez 1530 ADD_HF_MMX
1215 : Isibaar 1795 lea TMP0,[TMP0+TMP1]
1216 : edgomez 1530 ADD_HF_MMX
1217 :     ret
1218 : Isibaar 1793 ENDFUNC
1219 : edgomez 1530
1220 :     ; The trick is to correct the result of 'pavgb' with some combination of the
1221 :     ; lsb's of the 4 input values i,j,k,l, and their intermediate 'pavgb' (s and t).
1222 :     ; The boolean relations are:
1223 :     ; (i+j+k+l+3)/4 = (s+t+1)/2 - (ij&kl)&st
1224 :     ; (i+j+k+l+2)/4 = (s+t+1)/2 - (ij|kl)&st
1225 :     ; (i+j+k+l+1)/4 = (s+t+1)/2 - (ij&kl)|st
1226 :     ; (i+j+k+l+0)/4 = (s+t+1)/2 - (ij|kl)|st
1227 :     ; with s=(i+j+1)/2, t=(k+l+1)/2, ij = i^j, kl = k^l, st = s^t.
1228 :    
1229 :     ; Moreover, we process 2 lines at a times, for better overlapping (~15% faster).
1230 :    
1231 :     ;===========================================================================
1232 :     ;
1233 :     ; void interpolate8x8_halfpel_hv_add_mmx(uint8_t * const dst,
1234 :     ; const uint8_t * const src,
1235 :     ; const uint32_t stride,
1236 :     ; const uint32_t rounding);
1237 :     ;
1238 :     ;
1239 :     ;===========================================================================
1240 :    
1241 :     %macro ADD_HH_MMX 0
1242 : Isibaar 1795 lea _EAX,[_EAX+TMP1]
1243 : edgomez 1530
1244 :     ; transfert prev line to mm0/mm1
1245 :     movq mm0, mm2
1246 :     movq mm1, mm3
1247 :    
1248 :     ; load new line in mm2/mm3
1249 : Isibaar 1795 movq mm2, [_EAX]
1250 :     movq mm4, [_EAX+1]
1251 : edgomez 1530 movq mm3, mm2
1252 :     movq mm5, mm4
1253 :    
1254 :     punpcklbw mm2, mm6
1255 :     punpcklbw mm4, mm6
1256 :     paddusw mm2, mm4
1257 :     punpckhbw mm3, mm6
1258 :     punpckhbw mm5, mm6
1259 :     paddusw mm3, mm5
1260 :    
1261 :     ; mix current line (mm2/mm3) with previous (mm0,mm1);
1262 :     ; we'll preserve mm2/mm3 for next line...
1263 :    
1264 :     paddusw mm0, mm2
1265 :     paddusw mm1, mm3
1266 :    
1267 : Isibaar 1795 movq mm4, [TMP0] ; prepare mix with Dst[0]
1268 : edgomez 1530 movq mm5, mm4
1269 :    
1270 :     paddusw mm0, mm7 ; finish mixing current line
1271 :     paddusw mm1, mm7
1272 :    
1273 :     punpcklbw mm4, mm6
1274 :     punpckhbw mm5, mm6
1275 :    
1276 :     psrlw mm0, 2
1277 :     psrlw mm1, 2
1278 :    
1279 :     paddusw mm0, mm4 ; mix Src(mm0/mm1) with Dst(mm2/mm3)
1280 :     paddusw mm1, mm5
1281 :    
1282 :     paddusw mm0, [rounding1_mmx]
1283 :     paddusw mm1, [rounding1_mmx]
1284 :    
1285 :     psrlw mm0, 1
1286 :     psrlw mm1, 1
1287 :    
1288 :     packuswb mm0, mm1
1289 :    
1290 : Isibaar 1795 movq [TMP0], mm0
1291 : edgomez 1530 %endmacro
1292 :    
1293 : Isibaar 1795 ALIGN SECTION_ALIGN
1294 : edgomez 1530 interpolate8x8_halfpel_hv_add_mmx:
1295 :     PROLOG rounding2_mmx, 0 ; mm5 is busy. Don't load dst-rounder
1296 :    
1297 :     ; preprocess first line
1298 : Isibaar 1795 movq mm0, [_EAX]
1299 :     movq mm2, [_EAX+1]
1300 : edgomez 1530 movq mm1, mm0
1301 :     movq mm3, mm2
1302 :    
1303 :     punpcklbw mm0, mm6
1304 :     punpcklbw mm2, mm6
1305 :     punpckhbw mm1, mm6
1306 :     punpckhbw mm3, mm6
1307 :     paddusw mm2, mm0
1308 :     paddusw mm3, mm1
1309 :    
1310 :     ; Input: mm2/mm3 contains the value (Src[0]+Src[1]) of previous line
1311 :    
1312 :     ADD_HH_MMX
1313 : Isibaar 1795 lea TMP0,[TMP0+TMP1]
1314 : edgomez 1530 ADD_HH_MMX
1315 : Isibaar 1795 lea TMP0,[TMP0+TMP1]
1316 : edgomez 1530 ADD_HH_MMX
1317 : Isibaar 1795 lea TMP0,[TMP0+TMP1]
1318 : edgomez 1530 ADD_HH_MMX
1319 : Isibaar 1795 lea TMP0,[TMP0+TMP1]
1320 : edgomez 1530 ADD_HH_MMX
1321 : Isibaar 1795 lea TMP0,[TMP0+TMP1]
1322 : edgomez 1530 ADD_HH_MMX
1323 : Isibaar 1795 lea TMP0,[TMP0+TMP1]
1324 : edgomez 1530 ADD_HH_MMX
1325 : Isibaar 1795 lea TMP0,[TMP0+TMP1]
1326 : edgomez 1530 ADD_HH_MMX
1327 :    
1328 :     ret
1329 : Isibaar 1793 ENDFUNC
1330 : edgomez 1530
1331 : Isibaar 1790
1332 :     %ifidn __OUTPUT_FORMAT__,elf
1333 :     section ".note.GNU-stack" noalloc noexec nowrite progbits
1334 :     %endif
1335 :    

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