[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 1877 - (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 1844 TEXT
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 1803 mov eax, prm5d ; rounding
509 : Isibaar 1795 test _EAX, _EAX
510 : edgomez 851
511 : edgomez 1382 jnz near .rounding1
512 : edgomez 851
513 : Isibaar 1803 mov eax, prm6d ; height -> _EAX
514 : Isibaar 1795 sub _EAX, 8
515 : edgomez 851
516 : Isibaar 1795 mov TMP0, prm1 ; dst -> edi
517 :     mov _EAX, prm2 ; src1 -> esi
518 :     mov TMP1, prm4 ; stride -> TMP1
519 : edgomez 851
520 : Isibaar 1795 push _EBX
521 :     %ifdef ARCH_IS_X86_64
522 :     mov _EBX, prm3
523 :     %else
524 :     mov _EBX, [esp + 4 + 12] ; src2 -> eax
525 :     %endif
526 :    
527 : edgomez 1382 movq mm7, [mmx_one]
528 : edgomez 851
529 : edgomez 1382 jz near .start0
530 : edgomez 851
531 : edgomez 1382 AVG2_MMX_RND0
532 : Isibaar 1795 lea TMP0, [TMP0+2*TMP1]
533 : edgomez 1382
534 : Isibaar 1793 .start0:
535 : edgomez 851
536 : edgomez 1382 AVG2_MMX_RND0
537 : Isibaar 1795 lea TMP0, [TMP0+2*TMP1]
538 : edgomez 1382 AVG2_MMX_RND0
539 : Isibaar 1795 lea TMP0, [TMP0+2*TMP1]
540 : edgomez 1382 AVG2_MMX_RND0
541 : Isibaar 1795 lea TMP0, [TMP0+2*TMP1]
542 : edgomez 1382 AVG2_MMX_RND0
543 : edgomez 851
544 : Isibaar 1795 pop _EBX
545 : edgomez 1382 ret
546 :    
547 : Isibaar 1793 .rounding1:
548 : Isibaar 1803 mov eax, prm6d ; height -> _EAX
549 : Isibaar 1795 sub _EAX, 8
550 : edgomez 851
551 : Isibaar 1795 mov TMP0, prm1 ; dst -> edi
552 :     mov _EAX, prm2 ; src1 -> esi
553 :     mov TMP1, prm4 ; stride -> TMP1
554 : edgomez 851
555 : Isibaar 1795 push _EBX
556 :     %ifdef ARCH_IS_X86_64
557 :     mov _EBX, prm3
558 :     %else
559 :     mov _EBX, [esp + 4 + 12] ; src2 -> eax
560 :     %endif
561 :    
562 : edgomez 1382 movq mm7, [mmx_one]
563 : edgomez 851
564 : edgomez 1382 jz near .start1
565 : edgomez 851
566 : edgomez 1382 AVG2_MMX_RND1
567 : Isibaar 1795 lea TMP0, [TMP0+2*TMP1]
568 : edgomez 851
569 : Isibaar 1793 .start1:
570 : edgomez 851
571 : edgomez 1382 AVG2_MMX_RND1
572 : Isibaar 1795 lea TMP0, [TMP0+2*TMP1]
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 : edgomez 851
579 : Isibaar 1795 pop _EBX
580 : edgomez 1382 ret
581 : Isibaar 1793 ENDFUNC
582 : edgomez 851
583 :    
584 : edgomez 1382 ;-----------------------------------------------------------------------------
585 : edgomez 851 ;
586 :     ; void interpolate8x8_avg4_mmx(uint8_t const *dst,
587 : edgomez 1382 ; const uint8_t * const src1,
588 :     ; const uint8_t * const src2,
589 :     ; const uint8_t * const src3,
590 :     ; const uint8_t * const src4,
591 :     ; const uint32_t stride,
592 :     ; const uint32_t rounding);
593 : edgomez 851 ;
594 : edgomez 1382 ;-----------------------------------------------------------------------------
595 : edgomez 851
596 :     %macro AVG4_MMX_RND0 0
597 : Isibaar 1795 movq mm0, [_EAX] ; src1 -> mm0
598 :     movq mm1, [_EBX] ; src2 -> mm1
599 : edgomez 851
600 : edgomez 1382 movq mm2, mm0
601 :     movq mm3, mm1
602 : edgomez 851
603 : edgomez 1382 pand mm2, [mmx_three]
604 :     pand mm3, [mmx_three]
605 : edgomez 851
606 : edgomez 1382 pand mm0, [mmx_mask2]
607 :     pand mm1, [mmx_mask2]
608 : edgomez 851
609 : edgomez 1382 psrlq mm0, 2
610 :     psrlq mm1, 2
611 : edgomez 851
612 : Isibaar 1795 lea _EAX, [_EAX+TMP1]
613 :     lea _EBX, [_EBX+TMP1]
614 : edgomez 851
615 : edgomez 1382 paddb mm0, mm1
616 :     paddb mm2, mm3
617 : edgomez 851
618 : Isibaar 1795 movq mm4, [_ESI] ; src3 -> mm0
619 :     movq mm5, [_EDI] ; src4 -> mm1
620 : edgomez 851
621 : edgomez 1382 movq mm1, mm4
622 :     movq mm3, mm5
623 : edgomez 851
624 : edgomez 1382 pand mm1, [mmx_three]
625 :     pand mm3, [mmx_three]
626 : edgomez 851
627 : edgomez 1382 pand mm4, [mmx_mask2]
628 :     pand mm5, [mmx_mask2]
629 : edgomez 851
630 : edgomez 1382 psrlq mm4, 2
631 :     psrlq mm5, 2
632 : edgomez 851
633 : edgomez 1382 paddb mm4, mm5
634 :     paddb mm0, mm4
635 : edgomez 851
636 : edgomez 1382 paddb mm1, mm3
637 :     paddb mm2, mm1
638 :    
639 :     paddb mm2, [mmx_two]
640 :     pand mm2, [mmx_mask2]
641 :    
642 :     psrlq mm2, 2
643 :     paddb mm0, mm2
644 :    
645 : Isibaar 1795 lea _ESI, [_ESI+TMP1]
646 :     lea _EDI, [_EDI+TMP1]
647 : edgomez 1382
648 : Isibaar 1795 movq [TMP0], mm0 ; (src1 + src2 + src3 + src4 + 2) / 4 -> dst
649 : edgomez 851 %endmacro
650 :    
651 :     %macro AVG4_MMX_RND1 0
652 : Isibaar 1795 movq mm0, [_EAX] ; src1 -> mm0
653 :     movq mm1, [_EBX] ; src2 -> mm1
654 : edgomez 851
655 : edgomez 1382 movq mm2, mm0
656 :     movq mm3, mm1
657 : edgomez 851
658 : edgomez 1382 pand mm2, [mmx_three]
659 :     pand mm3, [mmx_three]
660 : edgomez 851
661 : edgomez 1382 pand mm0, [mmx_mask2]
662 :     pand mm1, [mmx_mask2]
663 : edgomez 851
664 : edgomez 1382 psrlq mm0, 2
665 :     psrlq mm1, 2
666 : edgomez 851
667 : Isibaar 1795 lea _EAX,[_EAX+TMP1]
668 :     lea _EBX,[_EBX+TMP1]
669 : edgomez 851
670 : edgomez 1382 paddb mm0, mm1
671 :     paddb mm2, mm3
672 : edgomez 851
673 : Isibaar 1795 movq mm4, [_ESI] ; src3 -> mm0
674 :     movq mm5, [_EDI] ; src4 -> mm1
675 : edgomez 851
676 : edgomez 1382 movq mm1, mm4
677 :     movq mm3, mm5
678 : edgomez 851
679 : edgomez 1382 pand mm1, [mmx_three]
680 :     pand mm3, [mmx_three]
681 : edgomez 851
682 : edgomez 1382 pand mm4, [mmx_mask2]
683 :     pand mm5, [mmx_mask2]
684 : edgomez 851
685 : edgomez 1382 psrlq mm4, 2
686 :     psrlq mm5, 2
687 : edgomez 851
688 : edgomez 1382 paddb mm4, mm5
689 :     paddb mm0, mm4
690 : edgomez 851
691 : edgomez 1382 paddb mm1, mm3
692 :     paddb mm2, mm1
693 :    
694 :     paddb mm2, [mmx_one]
695 :     pand mm2, [mmx_mask2]
696 :    
697 :     psrlq mm2, 2
698 :     paddb mm0, mm2
699 :    
700 : Isibaar 1795 lea _ESI,[_ESI+TMP1]
701 :     lea _EDI,[_EDI+TMP1]
702 : edgomez 1382
703 : Isibaar 1795 movq [TMP0], mm0 ; (src1 + src2 + src3 + src4 + 2) / 4 -> dst
704 : edgomez 851 %endmacro
705 :    
706 : Isibaar 1795 ALIGN SECTION_ALIGN
707 : edgomez 1382 interpolate8x8_avg4_mmx:
708 : edgomez 851
709 : Isibaar 1803 mov eax, prm7d ; rounding
710 : Isibaar 1795 test _EAX, _EAX
711 : edgomez 851
712 : Isibaar 1795 mov TMP0, prm1 ; dst -> edi
713 :     mov _EAX, prm5 ; src4 -> edi
714 : Isibaar 1803 mov TMP1d, prm6d ; stride -> TMP1
715 : edgomez 851
716 :    
717 : Isibaar 1795 push _EBX
718 :     push _EDI
719 :     push _ESI
720 : edgomez 851
721 : Isibaar 1795 mov _EDI, _EAX
722 :    
723 :     %ifdef ARCH_IS_X86_64
724 :     mov _EAX, prm2
725 :     mov _EBX, prm3
726 :     mov _ESI, prm4
727 :     %else
728 :     mov _EAX, [esp + 12 + 8] ; src1 -> esi
729 :     mov _EBX, [esp + 12 + 12] ; src2 -> _EAX
730 :     mov _ESI, [esp + 12 + 16] ; src3 -> esi
731 :     %endif
732 :    
733 : edgomez 1382 movq mm7, [mmx_one]
734 : edgomez 851
735 : edgomez 1382 jnz near .rounding1
736 : edgomez 851
737 : edgomez 1382 AVG4_MMX_RND0
738 : Isibaar 1795 lea TMP0, [TMP0+TMP1]
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 :    
753 : Isibaar 1795 pop _ESI
754 :     pop _EDI
755 :     pop _EBX
756 : edgomez 1382 ret
757 :    
758 : Isibaar 1793 .rounding1:
759 : edgomez 1382 AVG4_MMX_RND1
760 : Isibaar 1795 lea TMP0, [TMP0+TMP1]
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 : edgomez 851
775 : Isibaar 1795 pop _ESI
776 :     pop _EDI
777 :     pop _EBX
778 : edgomez 1382 ret
779 : Isibaar 1793 ENDFUNC
780 : edgomez 851
781 :    
782 : edgomez 1382 ;-----------------------------------------------------------------------------
783 : edgomez 851 ;
784 :     ; void interpolate8x8_6tap_lowpass_h_mmx(uint8_t const *dst,
785 : edgomez 1382 ; const uint8_t * const src,
786 :     ; const uint32_t stride,
787 :     ; const uint32_t rounding);
788 : edgomez 851 ;
789 : edgomez 1382 ;-----------------------------------------------------------------------------
790 : edgomez 851
791 :     %macro LOWPASS_6TAP_H_MMX 0
792 : Isibaar 1795 movq mm0, [_EAX]
793 :     movq mm2, [_EAX+1]
794 : edgomez 851
795 : edgomez 1382 movq mm1, mm0
796 :     movq mm3, mm2
797 : edgomez 851
798 : edgomez 1382 punpcklbw mm0, mm7
799 :     punpcklbw mm2, mm7
800 : edgomez 851
801 : edgomez 1382 punpckhbw mm1, mm7
802 :     punpckhbw mm3, mm7
803 : edgomez 851
804 : edgomez 1382 paddw mm0, mm2
805 :     paddw mm1, mm3
806 : edgomez 851
807 : edgomez 1382 psllw mm0, 2
808 :     psllw mm1, 2
809 : edgomez 851
810 : Isibaar 1795 movq mm2, [_EAX-1]
811 :     movq mm4, [_EAX+2]
812 : edgomez 851
813 : edgomez 1382 movq mm3, mm2
814 :     movq mm5, mm4
815 : edgomez 851
816 : edgomez 1382 punpcklbw mm2, mm7
817 :     punpcklbw mm4, mm7
818 : edgomez 851
819 : edgomez 1382 punpckhbw mm3, mm7
820 :     punpckhbw mm5, mm7
821 : edgomez 851
822 : edgomez 1382 paddw mm2, mm4
823 :     paddw mm3, mm5
824 : edgomez 851
825 : edgomez 1382 psubsw mm0, mm2
826 :     psubsw mm1, mm3
827 : edgomez 851
828 : edgomez 1382 pmullw mm0, [mmx_five]
829 :     pmullw mm1, [mmx_five]
830 : edgomez 851
831 : Isibaar 1795 movq mm2, [_EAX-2]
832 :     movq mm4, [_EAX+3]
833 : edgomez 851
834 : edgomez 1382 movq mm3, mm2
835 :     movq mm5, mm4
836 : edgomez 851
837 : edgomez 1382 punpcklbw mm2, mm7
838 :     punpcklbw mm4, mm7
839 : edgomez 851
840 : edgomez 1382 punpckhbw mm3, mm7
841 :     punpckhbw mm5, mm7
842 : edgomez 851
843 : edgomez 1382 paddw mm2, mm4
844 :     paddw mm3, mm5
845 : edgomez 851
846 : edgomez 1382 paddsw mm0, mm2
847 :     paddsw mm1, mm3
848 : edgomez 851
849 : edgomez 1382 paddsw mm0, mm6
850 :     paddsw mm1, mm6
851 : edgomez 851
852 : edgomez 1382 psraw mm0, 5
853 :     psraw mm1, 5
854 : edgomez 851
855 : Isibaar 1795 lea _EAX, [_EAX+TMP1]
856 : edgomez 1382 packuswb mm0, mm1
857 : Isibaar 1795 movq [TMP0], mm0
858 : edgomez 851 %endmacro
859 :    
860 : Isibaar 1795 ALIGN SECTION_ALIGN
861 : edgomez 1382 interpolate8x8_6tap_lowpass_h_mmx:
862 : edgomez 851
863 : Isibaar 1795 mov _EAX, prm4 ; rounding
864 : edgomez 851
865 : Isibaar 1795 lea TMP0, [rounding_lowpass_mmx]
866 :     movq mm6, [TMP0 + _EAX * 8]
867 : edgomez 851
868 : Isibaar 1795 mov TMP0, prm1 ; dst -> edi
869 :     mov _EAX, prm2 ; src -> esi
870 :     mov TMP1, prm3 ; stride -> edx
871 : edgomez 851
872 : edgomez 1382 pxor mm7, mm7
873 : edgomez 851
874 : edgomez 1382 LOWPASS_6TAP_H_MMX
875 : Isibaar 1795 lea TMP0, [TMP0+TMP1]
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 : edgomez 851
890 : edgomez 1382 ret
891 : Isibaar 1793 ENDFUNC
892 : edgomez 1382
893 :     ;-----------------------------------------------------------------------------
894 : edgomez 851 ;
895 :     ; void interpolate8x8_6tap_lowpass_v_mmx(uint8_t const *dst,
896 : edgomez 1382 ; const uint8_t * const src,
897 :     ; const uint32_t stride,
898 :     ; const uint32_t rounding);
899 : edgomez 851 ;
900 : edgomez 1382 ;-----------------------------------------------------------------------------
901 : edgomez 851
902 :     %macro LOWPASS_6TAP_V_MMX 0
903 : Isibaar 1795 movq mm0, [_EAX]
904 :     movq mm2, [_EAX+TMP1]
905 : edgomez 851
906 : edgomez 1382 movq mm1, mm0
907 :     movq mm3, mm2
908 : edgomez 851
909 : edgomez 1382 punpcklbw mm0, mm7
910 :     punpcklbw mm2, mm7
911 : edgomez 851
912 : edgomez 1382 punpckhbw mm1, mm7
913 :     punpckhbw mm3, mm7
914 : edgomez 851
915 : edgomez 1382 paddw mm0, mm2
916 :     paddw mm1, mm3
917 : edgomez 851
918 : edgomez 1382 psllw mm0, 2
919 :     psllw mm1, 2
920 : edgomez 851
921 : Isibaar 1795 movq mm4, [_EAX+2*TMP1]
922 :     sub _EAX, _EBX
923 :     movq mm2, [_EAX+2*TMP1]
924 : edgomez 851
925 : edgomez 1382 movq mm3, mm2
926 :     movq mm5, mm4
927 : edgomez 851
928 : edgomez 1382 punpcklbw mm2, mm7
929 :     punpcklbw mm4, mm7
930 : edgomez 851
931 : edgomez 1382 punpckhbw mm3, mm7
932 :     punpckhbw mm5, mm7
933 : edgomez 851
934 : edgomez 1382 paddw mm2, mm4
935 :     paddw mm3, mm5
936 : edgomez 851
937 : edgomez 1382 psubsw mm0, mm2
938 :     psubsw mm1, mm3
939 : edgomez 851
940 : edgomez 1382 pmullw mm0, [mmx_five]
941 :     pmullw mm1, [mmx_five]
942 : edgomez 851
943 : Isibaar 1795 movq mm2, [_EAX+TMP1]
944 :     movq mm4, [_EAX+2*_EBX]
945 : edgomez 851
946 : edgomez 1382 movq mm3, mm2
947 :     movq mm5, mm4
948 : edgomez 851
949 : edgomez 1382 punpcklbw mm2, mm7
950 :     punpcklbw mm4, mm7
951 : edgomez 851
952 : edgomez 1382 punpckhbw mm3, mm7
953 :     punpckhbw mm5, mm7
954 : edgomez 851
955 : edgomez 1382 paddw mm2, mm4
956 :     paddw mm3, mm5
957 : edgomez 851
958 : edgomez 1382 paddsw mm0, mm2
959 :     paddsw mm1, mm3
960 : edgomez 851
961 : edgomez 1382 paddsw mm0, mm6
962 :     paddsw mm1, mm6
963 : edgomez 851
964 : edgomez 1382 psraw mm0, 5
965 :     psraw mm1, 5
966 : edgomez 851
967 : Isibaar 1795 lea _EAX, [_EAX+4*TMP1]
968 : edgomez 1382 packuswb mm0, mm1
969 : Isibaar 1795 movq [TMP0], mm0
970 : edgomez 851 %endmacro
971 :    
972 : Isibaar 1795 ALIGN SECTION_ALIGN
973 : edgomez 1382 interpolate8x8_6tap_lowpass_v_mmx:
974 : edgomez 851
975 : Isibaar 1795 mov _EAX, prm4 ; rounding
976 : edgomez 851
977 : Isibaar 1795 lea TMP0, [rounding_lowpass_mmx]
978 :     movq mm6, [TMP0 + _EAX * 8]
979 : edgomez 851
980 : Isibaar 1795 mov TMP0, prm1 ; dst -> edi
981 :     mov _EAX, prm2 ; src -> esi
982 :     mov TMP1, prm3 ; stride -> edx
983 : edgomez 851
984 : Isibaar 1795 push _EBX
985 : Isibaar 1834 lea _EBX, [TMP1+TMP1*2]
986 : edgomez 851
987 : edgomez 1382 pxor mm7, mm7
988 : edgomez 851
989 : edgomez 1382 LOWPASS_6TAP_V_MMX
990 : Isibaar 1795 lea TMP0, [TMP0+TMP1]
991 : edgomez 1382 LOWPASS_6TAP_V_MMX
992 : Isibaar 1795 lea TMP0, [TMP0+TMP1]
993 : edgomez 1382 LOWPASS_6TAP_V_MMX
994 : Isibaar 1795 lea TMP0, [TMP0+TMP1]
995 : edgomez 1382 LOWPASS_6TAP_V_MMX
996 : Isibaar 1795 lea TMP0, [TMP0+TMP1]
997 : edgomez 1382 LOWPASS_6TAP_V_MMX
998 : Isibaar 1795 lea TMP0, [TMP0+TMP1]
999 : edgomez 1382 LOWPASS_6TAP_V_MMX
1000 : Isibaar 1795 lea TMP0, [TMP0+TMP1]
1001 : edgomez 1382 LOWPASS_6TAP_V_MMX
1002 : Isibaar 1795 lea TMP0, [TMP0+TMP1]
1003 : edgomez 1382 LOWPASS_6TAP_V_MMX
1004 : edgomez 851
1005 : Isibaar 1795 pop _EBX
1006 : edgomez 1382 ret
1007 : Isibaar 1793 ENDFUNC
1008 : edgomez 1530
1009 :     ;===========================================================================
1010 :     ;
1011 :     ; The next functions combine both source halfpel interpolation step and the
1012 :     ; averaging (with rouding) step to avoid wasting memory bandwidth computing
1013 :     ; intermediate halfpel images and then averaging them.
1014 :     ;
1015 :     ;===========================================================================
1016 :    
1017 :     %macro PROLOG0 0
1018 : Isibaar 1795 mov TMP0, prm1 ; Dst
1019 :     mov _EAX, prm2 ; Src
1020 :     mov TMP1, prm3 ; BpS
1021 : edgomez 1530 %endmacro
1022 :    
1023 :     %macro PROLOG 2 ; %1: Rounder, %2 load Dst-Rounder
1024 :     pxor mm6, mm6
1025 :     movq mm7, [%1] ; TODO: dangerous! (eax isn't checked)
1026 :     %if %2
1027 :     movq mm5, [rounding1_mmx]
1028 :     %endif
1029 :    
1030 :     PROLOG0
1031 :     %endmacro
1032 :    
1033 :     ; performs: mm0 == (mm0+mm2) mm1 == (mm1+mm3)
1034 :     %macro MIX 0
1035 :     punpcklbw mm0, mm6
1036 :     punpcklbw mm2, mm6
1037 :     punpckhbw mm1, mm6
1038 :     punpckhbw mm3, mm6
1039 :     paddusw mm0, mm2
1040 :     paddusw mm1, mm3
1041 :     %endmacro
1042 :    
1043 :     %macro MIX_DST 0
1044 :     movq mm3, mm2
1045 :     paddusw mm0, mm7 ; rounder
1046 :     paddusw mm1, mm7 ; rounder
1047 :     punpcklbw mm2, mm6
1048 :     punpckhbw mm3, mm6
1049 :     psrlw mm0, 1
1050 :     psrlw mm1, 1
1051 :    
1052 :     paddusw mm0, mm2 ; mix Src(mm0/mm1) with Dst(mm2/mm3)
1053 :     paddusw mm1, mm3
1054 :     paddusw mm0, mm5
1055 :     paddusw mm1, mm5
1056 :     psrlw mm0, 1
1057 :     psrlw mm1, 1
1058 :    
1059 :     packuswb mm0, mm1
1060 :     %endmacro
1061 :    
1062 :     %macro MIX2 0
1063 :     punpcklbw mm0, mm6
1064 :     punpcklbw mm2, mm6
1065 :     paddusw mm0, mm2
1066 :     paddusw mm0, mm7
1067 :     punpckhbw mm1, mm6
1068 :     punpckhbw mm3, mm6
1069 :     paddusw mm1, mm7
1070 :     paddusw mm1, mm3
1071 :     psrlw mm0, 1
1072 :     psrlw mm1, 1
1073 :    
1074 :     packuswb mm0, mm1
1075 :     %endmacro
1076 :    
1077 :     ;===========================================================================
1078 :     ;
1079 :     ; void interpolate8x8_halfpel_add_mmx(uint8_t * const dst,
1080 :     ; const uint8_t * const src,
1081 :     ; const uint32_t stride,
1082 :     ; const uint32_t rounding);
1083 :     ;
1084 :     ;
1085 :     ;===========================================================================
1086 :    
1087 :     %macro ADD_FF_MMX 1
1088 : Isibaar 1795 movq mm0, [_EAX]
1089 :     movq mm2, [TMP0]
1090 : edgomez 1530 movq mm1, mm0
1091 :     movq mm3, mm2
1092 :     %if (%1!=0)
1093 : Isibaar 1795 lea _EAX,[_EAX+%1*TMP1]
1094 : edgomez 1530 %endif
1095 :     MIX
1096 :     paddusw mm0, mm5 ; rounder
1097 :     paddusw mm1, mm5 ; rounder
1098 :     psrlw mm0, 1
1099 :     psrlw mm1, 1
1100 :    
1101 :     packuswb mm0, mm1
1102 : Isibaar 1795 movq [TMP0], mm0
1103 : edgomez 1530 %if (%1!=0)
1104 : Isibaar 1795 lea TMP0,[TMP0+%1*TMP1]
1105 : edgomez 1530 %endif
1106 :     %endmacro
1107 :    
1108 : Isibaar 1795 ALIGN SECTION_ALIGN
1109 : edgomez 1530 interpolate8x8_halfpel_add_mmx:
1110 :     PROLOG rounding1_mmx, 1
1111 :     ADD_FF_MMX 1
1112 :     ADD_FF_MMX 1
1113 :     ADD_FF_MMX 1
1114 :     ADD_FF_MMX 1
1115 :     ADD_FF_MMX 1
1116 :     ADD_FF_MMX 1
1117 :     ADD_FF_MMX 1
1118 :     ADD_FF_MMX 0
1119 :     ret
1120 : Isibaar 1793 ENDFUNC
1121 : edgomez 1530
1122 :     ;===========================================================================
1123 :     ;
1124 :     ; void interpolate8x8_halfpel_h_add_mmx(uint8_t * const dst,
1125 :     ; const uint8_t * const src,
1126 :     ; const uint32_t stride,
1127 :     ; const uint32_t rounding);
1128 :     ;
1129 :     ;
1130 :     ;===========================================================================
1131 :    
1132 :     %macro ADD_FH_MMX 0
1133 : Isibaar 1795 movq mm0, [_EAX]
1134 :     movq mm2, [_EAX+1]
1135 : edgomez 1530 movq mm1, mm0
1136 :     movq mm3, mm2
1137 :    
1138 : Isibaar 1795 lea _EAX,[_EAX+TMP1]
1139 : edgomez 1530
1140 :     MIX
1141 : Isibaar 1795 movq mm2, [TMP0] ; prepare mix with Dst[0]
1142 : edgomez 1530 MIX_DST
1143 : Isibaar 1795 movq [TMP0], mm0
1144 : edgomez 1530 %endmacro
1145 :    
1146 : Isibaar 1795 ALIGN SECTION_ALIGN
1147 : edgomez 1530 interpolate8x8_halfpel_h_add_mmx:
1148 :     PROLOG rounding1_mmx, 1
1149 :    
1150 :     ADD_FH_MMX
1151 : Isibaar 1795 lea TMP0,[TMP0+TMP1]
1152 : edgomez 1530 ADD_FH_MMX
1153 : Isibaar 1795 lea TMP0,[TMP0+TMP1]
1154 : edgomez 1530 ADD_FH_MMX
1155 : Isibaar 1795 lea TMP0,[TMP0+TMP1]
1156 : edgomez 1530 ADD_FH_MMX
1157 : Isibaar 1795 lea TMP0,[TMP0+TMP1]
1158 : edgomez 1530 ADD_FH_MMX
1159 : Isibaar 1795 lea TMP0,[TMP0+TMP1]
1160 : edgomez 1530 ADD_FH_MMX
1161 : Isibaar 1795 lea TMP0,[TMP0+TMP1]
1162 : edgomez 1530 ADD_FH_MMX
1163 : Isibaar 1795 lea TMP0,[TMP0+TMP1]
1164 : edgomez 1530 ADD_FH_MMX
1165 :     ret
1166 : Isibaar 1793 ENDFUNC
1167 : edgomez 1530
1168 :     ;===========================================================================
1169 :     ;
1170 :     ; void interpolate8x8_halfpel_v_add_mmx(uint8_t * const dst,
1171 :     ; const uint8_t * const src,
1172 :     ; const uint32_t stride,
1173 :     ; const uint32_t rounding);
1174 :     ;
1175 :     ;
1176 :     ;===========================================================================
1177 :    
1178 :     %macro ADD_HF_MMX 0
1179 : Isibaar 1795 movq mm0, [_EAX]
1180 :     movq mm2, [_EAX+TMP1]
1181 : edgomez 1530 movq mm1, mm0
1182 :     movq mm3, mm2
1183 :    
1184 : Isibaar 1795 lea _EAX,[_EAX+TMP1]
1185 : edgomez 1530
1186 :     MIX
1187 : Isibaar 1795 movq mm2, [TMP0] ; prepare mix with Dst[0]
1188 : edgomez 1530 MIX_DST
1189 : Isibaar 1795 movq [TMP0], mm0
1190 : edgomez 1530
1191 :     %endmacro
1192 :    
1193 : Isibaar 1795 ALIGN SECTION_ALIGN
1194 : edgomez 1530 interpolate8x8_halfpel_v_add_mmx:
1195 :     PROLOG rounding1_mmx, 1
1196 :    
1197 :     ADD_HF_MMX
1198 : Isibaar 1795 lea TMP0,[TMP0+TMP1]
1199 : edgomez 1530 ADD_HF_MMX
1200 : Isibaar 1795 lea TMP0,[TMP0+TMP1]
1201 : edgomez 1530 ADD_HF_MMX
1202 : Isibaar 1795 lea TMP0,[TMP0+TMP1]
1203 : edgomez 1530 ADD_HF_MMX
1204 : Isibaar 1795 lea TMP0,[TMP0+TMP1]
1205 : edgomez 1530 ADD_HF_MMX
1206 : Isibaar 1795 lea TMP0,[TMP0+TMP1]
1207 : edgomez 1530 ADD_HF_MMX
1208 : Isibaar 1795 lea TMP0,[TMP0+TMP1]
1209 : edgomez 1530 ADD_HF_MMX
1210 : Isibaar 1795 lea TMP0,[TMP0+TMP1]
1211 : edgomez 1530 ADD_HF_MMX
1212 :     ret
1213 : Isibaar 1793 ENDFUNC
1214 : edgomez 1530
1215 :     ; The trick is to correct the result of 'pavgb' with some combination of the
1216 :     ; lsb's of the 4 input values i,j,k,l, and their intermediate 'pavgb' (s and t).
1217 :     ; The boolean relations are:
1218 :     ; (i+j+k+l+3)/4 = (s+t+1)/2 - (ij&kl)&st
1219 :     ; (i+j+k+l+2)/4 = (s+t+1)/2 - (ij|kl)&st
1220 :     ; (i+j+k+l+1)/4 = (s+t+1)/2 - (ij&kl)|st
1221 :     ; (i+j+k+l+0)/4 = (s+t+1)/2 - (ij|kl)|st
1222 :     ; with s=(i+j+1)/2, t=(k+l+1)/2, ij = i^j, kl = k^l, st = s^t.
1223 :    
1224 :     ; Moreover, we process 2 lines at a times, for better overlapping (~15% faster).
1225 :    
1226 :     ;===========================================================================
1227 :     ;
1228 :     ; void interpolate8x8_halfpel_hv_add_mmx(uint8_t * const dst,
1229 :     ; const uint8_t * const src,
1230 :     ; const uint32_t stride,
1231 :     ; const uint32_t rounding);
1232 :     ;
1233 :     ;
1234 :     ;===========================================================================
1235 :    
1236 :     %macro ADD_HH_MMX 0
1237 : Isibaar 1795 lea _EAX,[_EAX+TMP1]
1238 : edgomez 1530
1239 :     ; transfert prev line to mm0/mm1
1240 :     movq mm0, mm2
1241 :     movq mm1, mm3
1242 :    
1243 :     ; load new line in mm2/mm3
1244 : Isibaar 1795 movq mm2, [_EAX]
1245 :     movq mm4, [_EAX+1]
1246 : edgomez 1530 movq mm3, mm2
1247 :     movq mm5, mm4
1248 :    
1249 :     punpcklbw mm2, mm6
1250 :     punpcklbw mm4, mm6
1251 :     paddusw mm2, mm4
1252 :     punpckhbw mm3, mm6
1253 :     punpckhbw mm5, mm6
1254 :     paddusw mm3, mm5
1255 :    
1256 :     ; mix current line (mm2/mm3) with previous (mm0,mm1);
1257 :     ; we'll preserve mm2/mm3 for next line...
1258 :    
1259 :     paddusw mm0, mm2
1260 :     paddusw mm1, mm3
1261 :    
1262 : Isibaar 1795 movq mm4, [TMP0] ; prepare mix with Dst[0]
1263 : edgomez 1530 movq mm5, mm4
1264 :    
1265 :     paddusw mm0, mm7 ; finish mixing current line
1266 :     paddusw mm1, mm7
1267 :    
1268 :     punpcklbw mm4, mm6
1269 :     punpckhbw mm5, mm6
1270 :    
1271 :     psrlw mm0, 2
1272 :     psrlw mm1, 2
1273 :    
1274 :     paddusw mm0, mm4 ; mix Src(mm0/mm1) with Dst(mm2/mm3)
1275 :     paddusw mm1, mm5
1276 :    
1277 :     paddusw mm0, [rounding1_mmx]
1278 :     paddusw mm1, [rounding1_mmx]
1279 :    
1280 :     psrlw mm0, 1
1281 :     psrlw mm1, 1
1282 :    
1283 :     packuswb mm0, mm1
1284 :    
1285 : Isibaar 1795 movq [TMP0], mm0
1286 : edgomez 1530 %endmacro
1287 :    
1288 : Isibaar 1795 ALIGN SECTION_ALIGN
1289 : edgomez 1530 interpolate8x8_halfpel_hv_add_mmx:
1290 :     PROLOG rounding2_mmx, 0 ; mm5 is busy. Don't load dst-rounder
1291 :    
1292 :     ; preprocess first line
1293 : Isibaar 1795 movq mm0, [_EAX]
1294 :     movq mm2, [_EAX+1]
1295 : edgomez 1530 movq mm1, mm0
1296 :     movq mm3, mm2
1297 :    
1298 :     punpcklbw mm0, mm6
1299 :     punpcklbw mm2, mm6
1300 :     punpckhbw mm1, mm6
1301 :     punpckhbw mm3, mm6
1302 :     paddusw mm2, mm0
1303 :     paddusw mm3, mm1
1304 :    
1305 :     ; Input: mm2/mm3 contains the value (Src[0]+Src[1]) of previous line
1306 :    
1307 :     ADD_HH_MMX
1308 : Isibaar 1795 lea TMP0,[TMP0+TMP1]
1309 : edgomez 1530 ADD_HH_MMX
1310 : Isibaar 1795 lea TMP0,[TMP0+TMP1]
1311 : edgomez 1530 ADD_HH_MMX
1312 : Isibaar 1795 lea TMP0,[TMP0+TMP1]
1313 : edgomez 1530 ADD_HH_MMX
1314 : Isibaar 1795 lea TMP0,[TMP0+TMP1]
1315 : edgomez 1530 ADD_HH_MMX
1316 : Isibaar 1795 lea TMP0,[TMP0+TMP1]
1317 : edgomez 1530 ADD_HH_MMX
1318 : Isibaar 1795 lea TMP0,[TMP0+TMP1]
1319 : edgomez 1530 ADD_HH_MMX
1320 : Isibaar 1795 lea TMP0,[TMP0+TMP1]
1321 : edgomez 1530 ADD_HH_MMX
1322 :    
1323 :     ret
1324 : Isibaar 1793 ENDFUNC
1325 : edgomez 1530
1326 : Isibaar 1877 NON_EXEC_STACK

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