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

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

Parent Directory Parent Directory | Revision Log Revision Log | View Patch Patch

revision 1794, Fri Nov 14 15:43:28 2008 UTC revision 1795, Wed Nov 26 01:04:34 2008 UTC
# Line 4  Line 4 
4  ; *  - mmx 8x8 block-based halfpel interpolation -  ; *  - mmx 8x8 block-based halfpel interpolation -
5  ; *  ; *
6  ; *  Copyright(C) 2001 Peter Ross <pross@xvid.org>  ; *  Copyright(C) 2001 Peter Ross <pross@xvid.org>
7  ; *               2002 Michael Militzer <isibaar@xvid.org>  ; *               2002-2008 Michael Militzer <michael@xvid.org>
8  ; *  ; *
9  ; *  This program is free software ; you can redistribute it and/or modify  ; *  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  ; *  it under the terms of the GNU General Public License as published by
# Line 22  Line 22 
22  ; *  ; *
23  ; ****************************************************************************/  ; ****************************************************************************/
24    
25  BITS 32  %include "nasm.inc"
   
 %macro cglobal 1  
         %ifdef PREFIX  
                 %ifdef MARK_FUNCS  
                         global _%1:function %1.endfunc-%1  
                         %define %1 _%1:function %1.endfunc-%1  
                         %define ENDFUNC .endfunc  
                 %else  
                         global _%1  
                         %define %1 _%1  
                         %define ENDFUNC  
                 %endif  
         %else  
                 %ifdef MARK_FUNCS  
                         global %1:function %1.endfunc-%1  
                         %define ENDFUNC .endfunc  
                 %else  
                         global %1  
                         %define ENDFUNC  
                 %endif  
         %endif  
 %endmacro  
26    
27  ;=============================================================================  ;=============================================================================
28  ; Read only data  ; Read only data
29  ;=============================================================================  ;=============================================================================
30    
31  %ifdef FORMAT_COFF  DATA
 SECTION .rodata  
 %else  
 SECTION .rodata align=16  
 %endif  
32    
33  ;-----------------------------------------------------------------------------  ;-----------------------------------------------------------------------------
34  ; (16 - r) rounding table  ; (16 - r) rounding table
35  ;-----------------------------------------------------------------------------  ;-----------------------------------------------------------------------------
36    
37  ALIGN 16  ALIGN SECTION_ALIGN
38  rounding_lowpass_mmx:  rounding_lowpass_mmx:
39          times 4 dw 16          times 4 dw 16
40          times 4 dw 15          times 4 dw 15
# Line 103  Line 77 
77  ; Code  ; Code
78  ;=============================================================================  ;=============================================================================
79    
80  SECTION .text  SECTION .rotext align=SECTION_ALIGN
81    
82  cglobal interpolate8x8_halfpel_h_mmx  cglobal interpolate8x8_halfpel_h_mmx
83  cglobal interpolate8x8_halfpel_v_mmx  cglobal interpolate8x8_halfpel_v_mmx
# Line 148  Line 122 
122  ;-----------------------------------------------------------------------------  ;-----------------------------------------------------------------------------
123    
124  %macro COPY_H_MMX 0  %macro COPY_H_MMX 0
125    movq mm0, [esi]    movq mm0, [TMP0]
126    movq mm2, [esi + 1]    movq mm2, [TMP0 + 1]
127    movq mm1, mm0    movq mm1, mm0
128    movq mm3, mm2    movq mm3, mm2
129    
# Line 159  Line 133 
133    CALC_AVG mm0, mm1, mm2, mm3, mm7, mm6    CALC_AVG mm0, mm1, mm2, mm3, mm7, mm6
134    
135    packuswb mm0, mm1    packuswb mm0, mm1
136    movq [edi], mm0           ; [dst] = mm01    movq [_EAX], mm0           ; [dst] = mm01
137    
138    add esi, edx              ; src += stride    add TMP0, TMP1              ; src += stride
139    add edi, edx              ; dst += stride    add _EAX, TMP1              ; dst += stride
140  %endmacro  %endmacro
141    
142  ALIGN 16  ALIGN SECTION_ALIGN
143  interpolate8x8_halfpel_h_mmx:  interpolate8x8_halfpel_h_mmx:
144    
145    push esi    mov _EAX, prm4       ; rounding
146    push edi    lea TMP0, [rounding1_mmx]
147    mov eax, [esp + 8 + 16]       ; rounding    movq mm7, [TMP0 + _EAX * 8]
148    
149    movq mm7, [rounding1_mmx + eax * 8]    mov _EAX, prm1        ; dst
150      mov TMP0, prm2        ; src
151    mov edi, [esp + 8 + 4]        ; dst    mov TMP1, prm3        ; stride
   mov esi, [esp + 8 + 8]        ; src  
   mov edx, [esp + 8 + 12]       ; stride  
152    
153    pxor mm6, mm6                 ; zero    pxor mm6, mm6                 ; zero
154    
# Line 189  Line 161 
161    COPY_H_MMX    COPY_H_MMX
162    COPY_H_MMX    COPY_H_MMX
163    
   pop edi  
   pop esi  
   
164    ret    ret
165  ENDFUNC  ENDFUNC
166    
# Line 206  Line 175 
175  ;-----------------------------------------------------------------------------  ;-----------------------------------------------------------------------------
176    
177  %macro COPY_V_MMX 0  %macro COPY_V_MMX 0
178    movq mm0, [esi]    movq mm0, [TMP0]
179    movq mm2, [esi + edx]    movq mm2, [TMP0 + TMP1]
180    movq mm1, mm0    movq mm1, mm0
181    movq mm3, mm2    movq mm3, mm2
182    
# Line 217  Line 186 
186    CALC_AVG mm0, mm1, mm2, mm3, mm7, mm6    CALC_AVG mm0, mm1, mm2, mm3, mm7, mm6
187    
188    packuswb mm0, mm1    packuswb mm0, mm1
189    movq [edi], mm0       ; [dst] = mm01    movq [_EAX], mm0      ; [dst] = mm01
190    
191    add esi, edx          ; src += stride    add TMP0, TMP1        ; src += stride
192    add edi, edx          ; dst += stride    add _EAX, TMP1        ; dst += stride
193  %endmacro  %endmacro
194    
195  ALIGN 16  ALIGN SECTION_ALIGN
196  interpolate8x8_halfpel_v_mmx:  interpolate8x8_halfpel_v_mmx:
197    
198    push esi    mov _EAX, prm4       ; rounding
199    push edi    lea TMP0, [rounding1_mmx]
200      movq mm7, [TMP0 + _EAX * 8]
201    mov eax, [esp + 8 + 16]       ; rounding  
202      mov _EAX, prm1       ; dst
203    movq mm7, [rounding1_mmx + eax * 8]    mov TMP0, prm2       ; src
204      mov TMP1, prm3       ; stride
   mov edi, [esp + 8 + 4]        ; dst  
   mov esi, [esp + 8 + 8]        ; src  
   mov edx, [esp + 8 + 12]       ; stride  
205    
206    pxor mm6, mm6                 ; zero    pxor mm6, mm6                 ; zero
207    
# Line 249  Line 215 
215    COPY_V_MMX    COPY_V_MMX
216    COPY_V_MMX    COPY_V_MMX
217    
   pop edi  
   pop esi  
   
218    ret    ret
219  ENDFUNC  ENDFUNC
220    
# Line 268  Line 231 
231    
232  %macro COPY_HV_MMX 0  %macro COPY_HV_MMX 0
233      ; current row      ; current row
234    movq mm0, [esi]    movq mm0, [TMP0]
235    movq mm2, [esi + 1]    movq mm2, [TMP0 + 1]
236    
237    movq mm1, mm0    movq mm1, mm0
238    movq mm3, mm2    movq mm3, mm2
# Line 283  Line 246 
246    paddusw mm1, mm3    paddusw mm1, mm3
247    
248      ; next row      ; next row
249    movq mm4, [esi + edx]    movq mm4, [TMP0 + TMP1]
250    movq mm2, [esi + edx + 1]    movq mm2, [TMP0 + TMP1 + 1]
251    
252    movq mm5, mm4    movq mm5, mm4
253    movq mm3, mm2    movq mm3, mm2
# Line 307  Line 270 
270    psrlw mm1, 2    psrlw mm1, 2
271    
272    packuswb mm0, mm1    packuswb mm0, mm1
273    movq [edi], mm0           ; [dst] = mm01    movq [_EAX], mm0           ; [dst] = mm01
274    
275    add esi, edx              ; src += stride    add TMP0, TMP1             ; src += stride
276    add edi, edx              ; dst += stride    add _EAX, TMP1             ; dst += stride
277  %endmacro  %endmacro
278    
279  ALIGN 16  ALIGN SECTION_ALIGN
280  interpolate8x8_halfpel_hv_mmx:  interpolate8x8_halfpel_hv_mmx:
281    
282    push esi    mov _EAX, prm4    ; rounding
283    push edi    lea TMP0, [rounding2_mmx]
284      movq mm7, [TMP0 + _EAX * 8]
285    
286    mov eax, [esp + 8 + 16]   ; rounding    mov _EAX, prm1    ; dst
287      mov TMP0, prm2    ; src
   movq mm7, [rounding2_mmx + eax * 8]  
   
   mov edi, [esp + 8 + 4]    ; dst  
   mov esi, [esp + 8 + 8]    ; src  
   
   mov eax, 8  
288    
289    pxor mm6, mm6             ; zero    pxor mm6, mm6             ; zero
290    
291    mov edx, [esp + 8 + 12]   ; stride    mov TMP1, prm3    ; stride
292    
293    COPY_HV_MMX    COPY_HV_MMX
294    COPY_HV_MMX    COPY_HV_MMX
# Line 341  Line 299 
299    COPY_HV_MMX    COPY_HV_MMX
300    COPY_HV_MMX    COPY_HV_MMX
301    
   pop edi  
   pop esi  
   
302    ret    ret
303  ENDFUNC  ENDFUNC
304    
# Line 356  Line 311 
311  ;  ;
312  ;-----------------------------------------------------------------------------  ;-----------------------------------------------------------------------------
313    
314  ALIGN 16  ALIGN SECTION_ALIGN
315  interpolate8x4_halfpel_h_mmx:  interpolate8x4_halfpel_h_mmx:
316    
317    push esi    mov _EAX, prm4        ; rounding
318    push edi    lea TMP0, [rounding1_mmx]
319    mov eax, [esp + 8 + 16]       ; rounding    movq mm7, [TMP0 + _EAX * 8]
320    
321    movq mm7, [rounding1_mmx + eax * 8]    mov _EAX, prm1        ; dst
322      mov TMP0, prm2        ; src
323    mov edi, [esp + 8 + 4]        ; dst    mov TMP1, prm3        ; stride
   mov esi, [esp + 8 + 8]        ; src  
   mov edx, [esp + 8 + 12]       ; stride  
324    
325    pxor mm6, mm6                 ; zero    pxor mm6, mm6                 ; zero
326    
# Line 376  Line 329 
329    COPY_H_MMX    COPY_H_MMX
330    COPY_H_MMX    COPY_H_MMX
331    
   pop edi  
   pop esi  
   
332    ret    ret
333  ENDFUNC  ENDFUNC
334    
# Line 392  Line 342 
342  ;  ;
343  ;-----------------------------------------------------------------------------  ;-----------------------------------------------------------------------------
344    
345  ALIGN 16  ALIGN SECTION_ALIGN
346  interpolate8x4_halfpel_v_mmx:  interpolate8x4_halfpel_v_mmx:
347    
348    push esi    mov _EAX, prm4       ; rounding
349    push edi    lea TMP0, [rounding1_mmx]
350      movq mm7, [TMP0 + _EAX * 8]
351    mov eax, [esp + 8 + 16]       ; rounding  
352      mov _EAX, prm1       ; dst
353    movq mm7, [rounding1_mmx + eax * 8]    mov TMP0, prm2       ; src
354      mov TMP1, prm3       ; stride
   mov edi, [esp + 8 + 4]        ; dst  
   mov esi, [esp + 8 + 8]        ; src  
   mov edx, [esp + 8 + 12]       ; stride  
355    
356    pxor mm6, mm6                 ; zero    pxor mm6, mm6                 ; zero
357    
# Line 414  Line 361 
361    COPY_V_MMX    COPY_V_MMX
362    COPY_V_MMX    COPY_V_MMX
363    
   pop edi  
   pop esi  
   
364    ret    ret
365  ENDFUNC  ENDFUNC
366    
# Line 431  Line 375 
375  ;  ;
376  ;-----------------------------------------------------------------------------  ;-----------------------------------------------------------------------------
377    
378  ALIGN 16  ALIGN SECTION_ALIGN
379  interpolate8x4_halfpel_hv_mmx:  interpolate8x4_halfpel_hv_mmx:
380    
381    push esi    mov _EAX, prm4    ; rounding
382    push edi    lea TMP0, [rounding2_mmx]
383      movq mm7, [TMP0 + _EAX * 8]
   mov eax, [esp + 8 + 16]   ; rounding  
384    
385    movq mm7, [rounding2_mmx + eax * 8]    mov _EAX, prm1    ; dst
386      mov TMP0, prm2    ; src
   mov edi, [esp + 8 + 4]    ; dst  
   mov esi, [esp + 8 + 8]    ; src  
   
   mov eax, 8  
387    
388    pxor mm6, mm6             ; zero    pxor mm6, mm6             ; zero
389    
390    mov edx, [esp + 8 + 12]   ; stride    mov TMP1, prm3    ; stride
391    
392    COPY_HV_MMX    COPY_HV_MMX
393    COPY_HV_MMX    COPY_HV_MMX
394    COPY_HV_MMX    COPY_HV_MMX
395    COPY_HV_MMX    COPY_HV_MMX
396    
   pop edi  
   pop esi  
   
397    ret    ret
398  ENDFUNC  ENDFUNC
399    
# Line 473  Line 409 
409  ;-----------------------------------------------------------------------------  ;-----------------------------------------------------------------------------
410    
411  %macro AVG2_MMX_RND0 0  %macro AVG2_MMX_RND0 0
412    movq mm0, [eax]           ; src1 -> mm0    movq mm0, [_EAX]           ; src1 -> mm0
413    movq mm1, [ebx]           ; src2 -> mm1    movq mm1, [_EBX]           ; src2 -> mm1
414    
415    movq mm4, [eax+edx]    movq mm4, [_EAX+TMP1]
416    movq mm5, [ebx+edx]    movq mm5, [_EBX+TMP1]
417    
418    movq mm2, mm0             ; src1 -> mm2    movq mm2, mm0             ; src1 -> mm2
419    movq mm3, mm1             ; src2 -> mm3    movq mm3, mm1             ; src2 -> mm3
# Line 512  Line 448 
448    paddb mm4, mm5    paddb mm4, mm5
449    paddb mm4, mm3    paddb mm4, mm3
450    
451    lea eax, [eax+2*edx]    lea _EAX, [_EAX+2*TMP1]
452    lea ebx, [ebx+2*edx]    lea _EBX, [_EBX+2*TMP1]
453    
454    movq [ecx], mm0           ; (src1 + src2 + 1) / 2 -> dst    movq [TMP0], mm0           ; (src1 + src2 + 1) / 2 -> dst
455    movq [ecx+edx], mm4    movq [TMP0+TMP1], mm4
456  %endmacro  %endmacro
457    
458  %macro AVG2_MMX_RND1 0  %macro AVG2_MMX_RND1 0
459    movq mm0, [eax]           ; src1 -> mm0    movq mm0, [_EAX]           ; src1 -> mm0
460    movq mm1, [ebx]           ; src2 -> mm1    movq mm1, [_EBX]           ; src2 -> mm1
461    
462    movq mm4, [eax+edx]    movq mm4, [_EAX+TMP1]
463    movq mm5, [ebx+edx]    movq mm5, [_EBX+TMP1]
464    
465    movq mm2, mm0             ; src1 -> mm2    movq mm2, mm0             ; src1 -> mm2
466    movq mm3, mm1             ; src2 -> mm3    movq mm3, mm1             ; src2 -> mm3
# Line 559  Line 495 
495    paddb mm4, mm5    paddb mm4, mm5
496    paddb mm4, mm3    paddb mm4, mm3
497    
498    lea eax, [eax+2*edx]    lea _EAX, [_EAX+2*TMP1]
499    lea ebx, [ebx+2*edx]    lea _EBX, [_EBX+2*TMP1]
500    
501    movq [ecx], mm0           ; (src1 + src2 + 1) / 2 -> dst    movq [TMP0], mm0           ; (src1 + src2 + 1) / 2 -> dst
502    movq [ecx+edx], mm4    movq [TMP0+TMP1], mm4
503  %endmacro  %endmacro
504    
505  ALIGN 16  ALIGN SECTION_ALIGN
506  interpolate8x8_avg2_mmx:  interpolate8x8_avg2_mmx:
507    
508    push ebx    mov _EAX, prm5   ; rounding
509      test _EAX, _EAX
   mov eax, [esp + 4 + 20]   ; rounding  
   test eax, eax  
510    
511    jnz near .rounding1    jnz near .rounding1
512    
513    mov eax, [esp + 4 + 24]   ; height -> eax    mov _EAX, prm6   ; height -> _EAX
514    sub eax, 8    sub _EAX, 8
515    test eax, eax    test _EAX, _EAX
516    
517    mov ecx, [esp + 4 + 4]    ; dst -> edi    mov TMP0, prm1   ; dst -> edi
518    mov eax, [esp + 4 + 8]    ; src1 -> esi    mov _EAX, prm2   ; src1 -> esi
519    mov ebx, [esp + 4 + 12]   ; src2 -> eax    mov TMP1, prm4   ; stride -> TMP1
520    mov edx, [esp + 4 + 16]   ; stride -> edx  
521      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    movq mm7, [mmx_one]    movq mm7, [mmx_one]
529    
530    jz near .start0    jz near .start0
531    
532    AVG2_MMX_RND0    AVG2_MMX_RND0
533    lea ecx, [ecx+2*edx]    lea TMP0, [TMP0+2*TMP1]
534    
535  .start0:  .start0:
536    
537    AVG2_MMX_RND0    AVG2_MMX_RND0
538    lea ecx, [ecx+2*edx]    lea TMP0, [TMP0+2*TMP1]
539    AVG2_MMX_RND0    AVG2_MMX_RND0
540    lea ecx, [ecx+2*edx]    lea TMP0, [TMP0+2*TMP1]
541    AVG2_MMX_RND0    AVG2_MMX_RND0
542    lea ecx, [ecx+2*edx]    lea TMP0, [TMP0+2*TMP1]
543    AVG2_MMX_RND0    AVG2_MMX_RND0
544    
545    pop ebx    pop _EBX
546    ret    ret
547    
548  .rounding1:  .rounding1:
549    mov eax, [esp + 4 + 24]       ; height -> eax    mov _EAX, prm6        ; height -> _EAX
550    sub eax, 8    sub _EAX, 8
551    test eax, eax    test _EAX, _EAX
552    
553    mov ecx, [esp + 4 + 4]        ; dst -> edi    mov TMP0, prm1        ; dst -> edi
554    mov eax, [esp + 4 + 8]        ; src1 -> esi    mov _EAX, prm2        ; src1 -> esi
555    mov ebx, [esp + 4 + 12]       ; src2 -> eax    mov TMP1, prm4        ; stride -> TMP1
556    mov edx, [esp + 4 + 16]       ; stride -> edx  
557      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    movq mm7, [mmx_one]    movq mm7, [mmx_one]
565    
566    jz near .start1    jz near .start1
567    
568    AVG2_MMX_RND1    AVG2_MMX_RND1
569    lea ecx, [ecx+2*edx]    lea TMP0, [TMP0+2*TMP1]
570    
571  .start1:  .start1:
572    
573    AVG2_MMX_RND1    AVG2_MMX_RND1
574    lea ecx, [ecx+2*edx]    lea TMP0, [TMP0+2*TMP1]
575    AVG2_MMX_RND1    AVG2_MMX_RND1
576    lea ecx, [ecx+2*edx]    lea TMP0, [TMP0+2*TMP1]
577    AVG2_MMX_RND1    AVG2_MMX_RND1
578    lea ecx, [ecx+2*edx]    lea TMP0, [TMP0+2*TMP1]
579    AVG2_MMX_RND1    AVG2_MMX_RND1
580    
581    pop ebx    pop _EBX
582    ret    ret
583  ENDFUNC  ENDFUNC
584    
# Line 650  Line 596 
596  ;-----------------------------------------------------------------------------  ;-----------------------------------------------------------------------------
597    
598  %macro AVG4_MMX_RND0 0  %macro AVG4_MMX_RND0 0
599    movq mm0, [eax]           ; src1 -> mm0    movq mm0, [_EAX]           ; src1 -> mm0
600    movq mm1, [ebx]           ; src2 -> mm1    movq mm1, [_EBX]           ; src2 -> mm1
601    
602    movq mm2, mm0    movq mm2, mm0
603    movq mm3, mm1    movq mm3, mm1
# Line 665  Line 611 
611    psrlq mm0, 2    psrlq mm0, 2
612    psrlq mm1, 2    psrlq mm1, 2
613    
614    lea eax, [eax+edx]    lea _EAX, [_EAX+TMP1]
615    lea ebx, [ebx+edx]    lea _EBX, [_EBX+TMP1]
616    
617    paddb mm0, mm1    paddb mm0, mm1
618    paddb mm2, mm3    paddb mm2, mm3
619    
620    movq mm4, [esi]           ; src3 -> mm0    movq mm4, [_ESI]           ; src3 -> mm0
621    movq mm5, [edi]           ; src4 -> mm1    movq mm5, [_EDI]           ; src4 -> mm1
622    
623    movq mm1, mm4    movq mm1, mm4
624    movq mm3, mm5    movq mm3, mm5
# Line 698  Line 644 
644    psrlq mm2, 2    psrlq mm2, 2
645    paddb mm0, mm2    paddb mm0, mm2
646    
647    lea esi, [esi+edx]    lea _ESI, [_ESI+TMP1]
648    lea edi, [edi+edx]    lea _EDI, [_EDI+TMP1]
649    
650    movq [ecx], mm0           ; (src1 + src2 + src3 + src4 + 2) / 4 -> dst    movq [TMP0], mm0           ; (src1 + src2 + src3 + src4 + 2) / 4 -> dst
651  %endmacro  %endmacro
652    
653  %macro AVG4_MMX_RND1 0  %macro AVG4_MMX_RND1 0
654    movq mm0, [eax]           ; src1 -> mm0    movq mm0, [_EAX]           ; src1 -> mm0
655    movq mm1, [ebx]           ; src2 -> mm1    movq mm1, [_EBX]           ; src2 -> mm1
656    
657    movq mm2, mm0    movq mm2, mm0
658    movq mm3, mm1    movq mm3, mm1
# Line 720  Line 666 
666    psrlq mm0, 2    psrlq mm0, 2
667    psrlq mm1, 2    psrlq mm1, 2
668    
669    lea eax,[eax+edx]    lea _EAX,[_EAX+TMP1]
670    lea ebx,[ebx+edx]    lea _EBX,[_EBX+TMP1]
671    
672    paddb mm0, mm1    paddb mm0, mm1
673    paddb mm2, mm3    paddb mm2, mm3
674    
675    movq mm4, [esi]           ; src3 -> mm0    movq mm4, [_ESI]           ; src3 -> mm0
676    movq mm5, [edi]           ; src4 -> mm1    movq mm5, [_EDI]           ; src4 -> mm1
677    
678    movq mm1, mm4    movq mm1, mm4
679    movq mm3, mm5    movq mm3, mm5
# Line 753  Line 699 
699    psrlq mm2, 2    psrlq mm2, 2
700    paddb mm0, mm2    paddb mm0, mm2
701    
702    lea esi,[esi+edx]    lea _ESI,[_ESI+TMP1]
703    lea edi,[edi+edx]    lea _EDI,[_EDI+TMP1]
704    
705    movq [ecx], mm0           ; (src1 + src2 + src3 + src4 + 2) / 4 -> dst    movq [TMP0], mm0           ; (src1 + src2 + src3 + src4 + 2) / 4 -> dst
706  %endmacro  %endmacro
707    
708  ALIGN 16  ALIGN SECTION_ALIGN
709  interpolate8x8_avg4_mmx:  interpolate8x8_avg4_mmx:
710    
711    push ebx    mov _EAX, prm7      ; rounding
712    push edi    test _EAX, _EAX
713    push esi  
714      mov TMP0, prm1      ; dst -> edi
715    mov eax, [esp + 12 + 28]      ; rounding    mov _EAX, prm5      ; src4 -> edi
716      mov TMP1, prm6      ; stride -> TMP1
717    test eax, eax  
718    
719    mov ecx, [esp + 12 + 4]       ; dst -> edi    push _EBX
720    mov eax, [esp + 12 + 8]       ; src1 -> esi    push _EDI
721    mov ebx, [esp + 12 + 12]      ; src2 -> eax    push _ESI
722    mov esi, [esp + 12 + 16]      ; src3 -> esi  
723    mov edi, [esp + 12 + 20]      ; src4 -> edi    mov _EDI, _EAX
724    mov edx, [esp + 12 + 24]      ; stride -> edx  
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    movq mm7, [mmx_one]    movq mm7, [mmx_one]
736    
737    jnz near .rounding1    jnz near .rounding1
738    
739    AVG4_MMX_RND0    AVG4_MMX_RND0
740    lea ecx, [ecx+edx]    lea TMP0, [TMP0+TMP1]
741    AVG4_MMX_RND0    AVG4_MMX_RND0
742    lea ecx, [ecx+edx]    lea TMP0, [TMP0+TMP1]
743    AVG4_MMX_RND0    AVG4_MMX_RND0
744    lea ecx, [ecx+edx]    lea TMP0, [TMP0+TMP1]
745    AVG4_MMX_RND0    AVG4_MMX_RND0
746    lea ecx, [ecx+edx]    lea TMP0, [TMP0+TMP1]
747    AVG4_MMX_RND0    AVG4_MMX_RND0
748    lea ecx, [ecx+edx]    lea TMP0, [TMP0+TMP1]
749    AVG4_MMX_RND0    AVG4_MMX_RND0
750    lea ecx, [ecx+edx]    lea TMP0, [TMP0+TMP1]
751    AVG4_MMX_RND0    AVG4_MMX_RND0
752    lea ecx, [ecx+edx]    lea TMP0, [TMP0+TMP1]
753    AVG4_MMX_RND0    AVG4_MMX_RND0
754    
755    pop esi    pop _ESI
756    pop edi    pop _EDI
757    pop ebx    pop _EBX
758    ret    ret
759    
760  .rounding1:  .rounding1:
761    AVG4_MMX_RND1    AVG4_MMX_RND1
762    lea ecx, [ecx+edx]    lea TMP0, [TMP0+TMP1]
763    AVG4_MMX_RND1    AVG4_MMX_RND1
764    lea ecx, [ecx+edx]    lea TMP0, [TMP0+TMP1]
765    AVG4_MMX_RND1    AVG4_MMX_RND1
766    lea ecx, [ecx+edx]    lea TMP0, [TMP0+TMP1]
767    AVG4_MMX_RND1    AVG4_MMX_RND1
768    lea ecx, [ecx+edx]    lea TMP0, [TMP0+TMP1]
769    AVG4_MMX_RND1    AVG4_MMX_RND1
770    lea ecx, [ecx+edx]    lea TMP0, [TMP0+TMP1]
771    AVG4_MMX_RND1    AVG4_MMX_RND1
772    lea ecx, [ecx+edx]    lea TMP0, [TMP0+TMP1]
773    AVG4_MMX_RND1    AVG4_MMX_RND1
774    lea ecx, [ecx+edx]    lea TMP0, [TMP0+TMP1]
775    AVG4_MMX_RND1    AVG4_MMX_RND1
776    
777    pop esi    pop _ESI
778    pop edi    pop _EDI
779    pop ebx    pop _EBX
780    ret    ret
781  ENDFUNC  ENDFUNC
782    
# Line 836  Line 791 
791  ;-----------------------------------------------------------------------------  ;-----------------------------------------------------------------------------
792    
793  %macro LOWPASS_6TAP_H_MMX 0  %macro LOWPASS_6TAP_H_MMX 0
794    movq mm0, [eax]    movq mm0, [_EAX]
795    movq mm2, [eax+1]    movq mm2, [_EAX+1]
796    
797    movq mm1, mm0    movq mm1, mm0
798    movq mm3, mm2    movq mm3, mm2
# Line 854  Line 809 
809    psllw mm0, 2    psllw mm0, 2
810    psllw mm1, 2    psllw mm1, 2
811    
812    movq mm2, [eax-1]    movq mm2, [_EAX-1]
813    movq mm4, [eax+2]    movq mm4, [_EAX+2]
814    
815    movq mm3, mm2    movq mm3, mm2
816    movq mm5, mm4    movq mm5, mm4
# Line 875  Line 830 
830    pmullw mm0, [mmx_five]    pmullw mm0, [mmx_five]
831    pmullw mm1, [mmx_five]    pmullw mm1, [mmx_five]
832    
833    movq mm2, [eax-2]    movq mm2, [_EAX-2]
834    movq mm4, [eax+3]    movq mm4, [_EAX+3]
835    
836    movq mm3, mm2    movq mm3, mm2
837    movq mm5, mm4    movq mm5, mm4
# Line 899  Line 854 
854    psraw mm0, 5    psraw mm0, 5
855    psraw mm1, 5    psraw mm1, 5
856    
857    lea eax, [eax+edx]    lea _EAX, [_EAX+TMP1]
858    packuswb mm0, mm1    packuswb mm0, mm1
859    movq [ecx], mm0    movq [TMP0], mm0
860  %endmacro  %endmacro
861    
862  ALIGN 16  ALIGN SECTION_ALIGN
863  interpolate8x8_6tap_lowpass_h_mmx:  interpolate8x8_6tap_lowpass_h_mmx:
864    
865    mov eax, [esp + 16]           ; rounding    mov _EAX, prm4           ; rounding
866    
867    movq mm6, [rounding_lowpass_mmx + eax * 8]    lea TMP0, [rounding_lowpass_mmx]
868      movq mm6, [TMP0 + _EAX * 8]
869    
870    mov ecx, [esp + 4]            ; dst -> edi    mov TMP0, prm1           ; dst -> edi
871    mov eax, [esp + 8]            ; src -> esi    mov _EAX, prm2           ; src -> esi
872    mov edx, [esp + 12]           ; stride -> edx    mov TMP1, prm3           ; stride -> edx
873    
874    pxor mm7, mm7    pxor mm7, mm7
875    
876    LOWPASS_6TAP_H_MMX    LOWPASS_6TAP_H_MMX
877    lea ecx, [ecx+edx]    lea TMP0, [TMP0+TMP1]
878    LOWPASS_6TAP_H_MMX    LOWPASS_6TAP_H_MMX
879    lea ecx, [ecx+edx]    lea TMP0, [TMP0+TMP1]
880    LOWPASS_6TAP_H_MMX    LOWPASS_6TAP_H_MMX
881    lea ecx, [ecx+edx]    lea TMP0, [TMP0+TMP1]
882    LOWPASS_6TAP_H_MMX    LOWPASS_6TAP_H_MMX
883    lea ecx, [ecx+edx]    lea TMP0, [TMP0+TMP1]
884    LOWPASS_6TAP_H_MMX    LOWPASS_6TAP_H_MMX
885    lea ecx, [ecx+edx]    lea TMP0, [TMP0+TMP1]
886    LOWPASS_6TAP_H_MMX    LOWPASS_6TAP_H_MMX
887    lea ecx, [ecx+edx]    lea TMP0, [TMP0+TMP1]
888    LOWPASS_6TAP_H_MMX    LOWPASS_6TAP_H_MMX
889    lea ecx, [ecx+edx]    lea TMP0, [TMP0+TMP1]
890    LOWPASS_6TAP_H_MMX    LOWPASS_6TAP_H_MMX
891    
892    ret    ret
# Line 946  Line 902 
902  ;-----------------------------------------------------------------------------  ;-----------------------------------------------------------------------------
903    
904  %macro LOWPASS_6TAP_V_MMX 0  %macro LOWPASS_6TAP_V_MMX 0
905    movq mm0, [eax]    movq mm0, [_EAX]
906    movq mm2, [eax+edx]    movq mm2, [_EAX+TMP1]
907    
908    movq mm1, mm0    movq mm1, mm0
909    movq mm3, mm2    movq mm3, mm2
# Line 964  Line 920 
920    psllw mm0, 2    psllw mm0, 2
921    psllw mm1, 2    psllw mm1, 2
922    
923    movq mm4, [eax+2*edx]    movq mm4, [_EAX+2*TMP1]
924    sub eax, ebx    sub _EAX, _EBX
925    movq mm2, [eax+2*edx]    movq mm2, [_EAX+2*TMP1]
926    
927    movq mm3, mm2    movq mm3, mm2
928    movq mm5, mm4    movq mm5, mm4
# Line 986  Line 942 
942    pmullw mm0, [mmx_five]    pmullw mm0, [mmx_five]
943    pmullw mm1, [mmx_five]    pmullw mm1, [mmx_five]
944    
945    movq mm2, [eax+edx]    movq mm2, [_EAX+TMP1]
946    movq mm4, [eax+2*ebx]    movq mm4, [_EAX+2*_EBX]
947    
948    movq mm3, mm2    movq mm3, mm2
949    movq mm5, mm4    movq mm5, mm4
# Line 1010  Line 966 
966    psraw mm0, 5    psraw mm0, 5
967    psraw mm1, 5    psraw mm1, 5
968    
969    lea eax, [eax+4*edx]    lea _EAX, [_EAX+4*TMP1]
970    packuswb mm0, mm1    packuswb mm0, mm1
971    movq [ecx], mm0    movq [TMP0], mm0
972  %endmacro  %endmacro
973    
974  ALIGN 16  ALIGN SECTION_ALIGN
975  interpolate8x8_6tap_lowpass_v_mmx:  interpolate8x8_6tap_lowpass_v_mmx:
976    
977    push ebx    mov _EAX, prm4           ; rounding
978    
979    mov eax, [esp + 4 + 16]           ; rounding    lea TMP0, [rounding_lowpass_mmx]
980      movq mm6, [TMP0 + _EAX * 8]
981    
982    movq mm6, [rounding_lowpass_mmx + eax * 8]    mov TMP0, prm1           ; dst -> edi
983      mov _EAX, prm2           ; src -> esi
984      mov TMP1, prm3           ; stride -> edx
985    
986    mov ecx, [esp + 4 + 4]            ; dst -> edi    push _EBX
   mov eax, [esp + 4 + 8]            ; src -> esi  
   mov edx, [esp + 4 + 12]           ; stride -> edx  
987    
988    mov ebx, edx    mov _EBX, TMP1
989    shl ebx, 1    shl _EBX, 1
990    add ebx, edx    add _EBX, TMP1
991    
992    pxor mm7, mm7    pxor mm7, mm7
993    
994    LOWPASS_6TAP_V_MMX    LOWPASS_6TAP_V_MMX
995    lea ecx, [ecx+edx]    lea TMP0, [TMP0+TMP1]
996    LOWPASS_6TAP_V_MMX    LOWPASS_6TAP_V_MMX
997    lea ecx, [ecx+edx]    lea TMP0, [TMP0+TMP1]
998    LOWPASS_6TAP_V_MMX    LOWPASS_6TAP_V_MMX
999    lea ecx, [ecx+edx]    lea TMP0, [TMP0+TMP1]
1000    LOWPASS_6TAP_V_MMX    LOWPASS_6TAP_V_MMX
1001    lea ecx, [ecx+edx]    lea TMP0, [TMP0+TMP1]
1002    LOWPASS_6TAP_V_MMX    LOWPASS_6TAP_V_MMX
1003    lea ecx, [ecx+edx]    lea TMP0, [TMP0+TMP1]
1004    LOWPASS_6TAP_V_MMX    LOWPASS_6TAP_V_MMX
1005    lea ecx, [ecx+edx]    lea TMP0, [TMP0+TMP1]
1006    LOWPASS_6TAP_V_MMX    LOWPASS_6TAP_V_MMX
1007    lea ecx, [ecx+edx]    lea TMP0, [TMP0+TMP1]
1008    LOWPASS_6TAP_V_MMX    LOWPASS_6TAP_V_MMX
1009    
1010    pop ebx    pop _EBX
1011    ret    ret
1012  ENDFUNC  ENDFUNC
1013    
# Line 1063  Line 1020 
1020  ;===========================================================================  ;===========================================================================
1021    
1022  %macro PROLOG0 0  %macro PROLOG0 0
1023    mov ecx, [esp+ 4] ; Dst    mov TMP0, prm1 ; Dst
1024    mov eax, [esp+ 8] ; Src    mov _EAX, prm2 ; Src
1025    mov edx, [esp+12] ; BpS    mov TMP1, prm3 ; BpS
1026  %endmacro  %endmacro
1027    
1028  %macro PROLOG 2   ; %1: Rounder, %2 load Dst-Rounder  %macro PROLOG 2   ; %1: Rounder, %2 load Dst-Rounder
# Line 1133  Line 1090 
1090  ;===========================================================================  ;===========================================================================
1091    
1092  %macro ADD_FF_MMX 1  %macro ADD_FF_MMX 1
1093    movq mm0, [eax]    movq mm0, [_EAX]
1094    movq mm2, [ecx]    movq mm2, [TMP0]
1095    movq mm1, mm0    movq mm1, mm0
1096    movq mm3, mm2    movq mm3, mm2
1097  %if (%1!=0)  %if (%1!=0)
1098    lea eax,[eax+%1*edx]    lea _EAX,[_EAX+%1*TMP1]
1099  %endif  %endif
1100    MIX    MIX
1101    paddusw mm0, mm5  ; rounder    paddusw mm0, mm5  ; rounder
# Line 1147  Line 1104 
1104    psrlw mm1, 1    psrlw mm1, 1
1105    
1106    packuswb mm0, mm1    packuswb mm0, mm1
1107    movq [ecx], mm0    movq [TMP0], mm0
1108  %if (%1!=0)  %if (%1!=0)
1109    lea ecx,[ecx+%1*edx]    lea TMP0,[TMP0+%1*TMP1]
1110  %endif  %endif
1111  %endmacro  %endmacro
1112    
1113  ALIGN 16  ALIGN SECTION_ALIGN
1114  interpolate8x8_halfpel_add_mmx:  interpolate8x8_halfpel_add_mmx:
1115    PROLOG rounding1_mmx, 1    PROLOG rounding1_mmx, 1
1116    ADD_FF_MMX 1    ADD_FF_MMX 1
# Line 1178  Line 1135 
1135  ;===========================================================================  ;===========================================================================
1136    
1137  %macro ADD_FH_MMX 0  %macro ADD_FH_MMX 0
1138    movq mm0, [eax]    movq mm0, [_EAX]
1139    movq mm2, [eax+1]    movq mm2, [_EAX+1]
1140    movq mm1, mm0    movq mm1, mm0
1141    movq mm3, mm2    movq mm3, mm2
1142    
1143    lea eax,[eax+edx]    lea _EAX,[_EAX+TMP1]
1144    
1145    MIX    MIX
1146    movq mm2, [ecx]   ; prepare mix with Dst[0]    movq mm2, [TMP0]   ; prepare mix with Dst[0]
1147    MIX_DST    MIX_DST
1148    movq [ecx], mm0    movq [TMP0], mm0
1149  %endmacro  %endmacro
1150    
1151  ALIGN 16  ALIGN SECTION_ALIGN
1152  interpolate8x8_halfpel_h_add_mmx:  interpolate8x8_halfpel_h_add_mmx:
1153    PROLOG rounding1_mmx, 1    PROLOG rounding1_mmx, 1
1154    
1155    ADD_FH_MMX    ADD_FH_MMX
1156    lea ecx,[ecx+edx]    lea TMP0,[TMP0+TMP1]
1157    ADD_FH_MMX    ADD_FH_MMX
1158    lea ecx,[ecx+edx]    lea TMP0,[TMP0+TMP1]
1159    ADD_FH_MMX    ADD_FH_MMX
1160    lea ecx,[ecx+edx]    lea TMP0,[TMP0+TMP1]
1161    ADD_FH_MMX    ADD_FH_MMX
1162    lea ecx,[ecx+edx]    lea TMP0,[TMP0+TMP1]
1163    ADD_FH_MMX    ADD_FH_MMX
1164    lea ecx,[ecx+edx]    lea TMP0,[TMP0+TMP1]
1165    ADD_FH_MMX    ADD_FH_MMX
1166    lea ecx,[ecx+edx]    lea TMP0,[TMP0+TMP1]
1167    ADD_FH_MMX    ADD_FH_MMX
1168    lea ecx,[ecx+edx]    lea TMP0,[TMP0+TMP1]
1169    ADD_FH_MMX    ADD_FH_MMX
1170    ret    ret
1171  ENDFUNC  ENDFUNC
# Line 1224  Line 1181 
1181  ;===========================================================================  ;===========================================================================
1182    
1183  %macro ADD_HF_MMX 0  %macro ADD_HF_MMX 0
1184    movq mm0, [eax]    movq mm0, [_EAX]
1185    movq mm2, [eax+edx]    movq mm2, [_EAX+TMP1]
1186    movq mm1, mm0    movq mm1, mm0
1187    movq mm3, mm2    movq mm3, mm2
1188    
1189    lea eax,[eax+edx]    lea _EAX,[_EAX+TMP1]
1190    
1191    MIX    MIX
1192    movq mm2, [ecx]   ; prepare mix with Dst[0]    movq mm2, [TMP0]   ; prepare mix with Dst[0]
1193    MIX_DST    MIX_DST
1194    movq [ecx], mm0    movq [TMP0], mm0
1195    
1196  %endmacro  %endmacro
1197    
1198  ALIGN 16  ALIGN SECTION_ALIGN
1199  interpolate8x8_halfpel_v_add_mmx:  interpolate8x8_halfpel_v_add_mmx:
1200    PROLOG rounding1_mmx, 1    PROLOG rounding1_mmx, 1
1201    
1202    ADD_HF_MMX    ADD_HF_MMX
1203    lea ecx,[ecx+edx]    lea TMP0,[TMP0+TMP1]
1204    ADD_HF_MMX    ADD_HF_MMX
1205    lea ecx,[ecx+edx]    lea TMP0,[TMP0+TMP1]
1206    ADD_HF_MMX    ADD_HF_MMX
1207    lea ecx,[ecx+edx]    lea TMP0,[TMP0+TMP1]
1208    ADD_HF_MMX    ADD_HF_MMX
1209    lea ecx,[ecx+edx]    lea TMP0,[TMP0+TMP1]
1210    ADD_HF_MMX    ADD_HF_MMX
1211    lea ecx,[ecx+edx]    lea TMP0,[TMP0+TMP1]
1212    ADD_HF_MMX    ADD_HF_MMX
1213    lea ecx,[ecx+edx]    lea TMP0,[TMP0+TMP1]
1214    ADD_HF_MMX    ADD_HF_MMX
1215    lea ecx,[ecx+edx]    lea TMP0,[TMP0+TMP1]
1216    ADD_HF_MMX    ADD_HF_MMX
1217    ret    ret
1218  ENDFUNC  ENDFUNC
# Line 1282  Line 1239 
1239  ;===========================================================================  ;===========================================================================
1240    
1241  %macro ADD_HH_MMX 0  %macro ADD_HH_MMX 0
1242    lea eax,[eax+edx]    lea _EAX,[_EAX+TMP1]
1243    
1244      ; transfert prev line to mm0/mm1      ; transfert prev line to mm0/mm1
1245    movq mm0, mm2    movq mm0, mm2
1246    movq mm1, mm3    movq mm1, mm3
1247    
1248      ; load new line in mm2/mm3      ; load new line in mm2/mm3
1249    movq mm2, [eax]    movq mm2, [_EAX]
1250    movq mm4, [eax+1]    movq mm4, [_EAX+1]
1251    movq mm3, mm2    movq mm3, mm2
1252    movq mm5, mm4    movq mm5, mm4
1253    
# Line 1307  Line 1264 
1264    paddusw mm0, mm2    paddusw mm0, mm2
1265    paddusw mm1, mm3    paddusw mm1, mm3
1266    
1267    movq mm4, [ecx]   ; prepare mix with Dst[0]    movq mm4, [TMP0]   ; prepare mix with Dst[0]
1268    movq mm5, mm4    movq mm5, mm4
1269    
1270    paddusw mm0, mm7  ; finish mixing current line    paddusw mm0, mm7  ; finish mixing current line
# Line 1330  Line 1287 
1287    
1288    packuswb mm0, mm1    packuswb mm0, mm1
1289    
1290    movq [ecx], mm0    movq [TMP0], mm0
1291  %endmacro  %endmacro
1292    
1293  ALIGN 16  ALIGN SECTION_ALIGN
1294  interpolate8x8_halfpel_hv_add_mmx:  interpolate8x8_halfpel_hv_add_mmx:
1295    PROLOG rounding2_mmx, 0    ; mm5 is busy. Don't load dst-rounder    PROLOG rounding2_mmx, 0    ; mm5 is busy. Don't load dst-rounder
1296    
1297      ; preprocess first line      ; preprocess first line
1298    movq mm0, [eax]    movq mm0, [_EAX]
1299    movq mm2, [eax+1]    movq mm2, [_EAX+1]
1300    movq mm1, mm0    movq mm1, mm0
1301    movq mm3, mm2    movq mm3, mm2
1302    
# Line 1353  Line 1310 
1310     ; Input: mm2/mm3 contains the value (Src[0]+Src[1]) of previous line     ; Input: mm2/mm3 contains the value (Src[0]+Src[1]) of previous line
1311    
1312    ADD_HH_MMX    ADD_HH_MMX
1313    lea ecx,[ecx+edx]    lea TMP0,[TMP0+TMP1]
1314    ADD_HH_MMX    ADD_HH_MMX
1315    lea ecx,[ecx+edx]    lea TMP0,[TMP0+TMP1]
1316    ADD_HH_MMX    ADD_HH_MMX
1317    lea ecx,[ecx+edx]    lea TMP0,[TMP0+TMP1]
1318    ADD_HH_MMX    ADD_HH_MMX
1319    lea ecx,[ecx+edx]    lea TMP0,[TMP0+TMP1]
1320    ADD_HH_MMX    ADD_HH_MMX
1321    lea ecx,[ecx+edx]    lea TMP0,[TMP0+TMP1]
1322    ADD_HH_MMX    ADD_HH_MMX
1323    lea ecx,[ecx+edx]    lea TMP0,[TMP0+TMP1]
1324    ADD_HH_MMX    ADD_HH_MMX
1325    lea ecx,[ecx+edx]    lea TMP0,[TMP0+TMP1]
1326    ADD_HH_MMX    ADD_HH_MMX
1327    
1328    ret    ret

Legend:
Removed from v.1794  
changed lines
  Added in v.1795

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