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

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

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

revision 1.18, Tue Sep 13 12:12:15 2005 UTC revision 1.25, Wed Sep 16 17:07:58 2009 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  
                 %else  
                         global _%1  
                         %define %1 _%1  
                 %endif  
         %else  
                 %ifdef MARK_FUNCS  
                         global %1:function %1.endfunc-%1  
                 %else  
                         global %1  
                 %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 99  Line 77 
77  ; Code  ; Code
78  ;=============================================================================  ;=============================================================================
79    
80  SECTION .text  TEXT
81    
82  cglobal interpolate8x8_halfpel_h_mmx  cglobal interpolate8x8_halfpel_h_mmx
83  cglobal interpolate8x8_halfpel_v_mmx  cglobal interpolate8x8_halfpel_v_mmx
# Line 144  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 155  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 185  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    
167    
168  ;-----------------------------------------------------------------------------  ;-----------------------------------------------------------------------------
# Line 202  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 213  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 245  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    
221    
222  ;-----------------------------------------------------------------------------  ;-----------------------------------------------------------------------------
# Line 264  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 279  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 303  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]
   mov eax, [esp + 8 + 16]   ; rounding  
285    
286    movq mm7, [rounding2_mmx + eax * 8]    mov _EAX, prm1    ; dst
287      mov TMP0, prm2    ; src
   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 337  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    
305  ;-----------------------------------------------------------------------------  ;-----------------------------------------------------------------------------
306  ;  ;
# Line 352  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 372  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    
335    
336  ;-----------------------------------------------------------------------------  ;-----------------------------------------------------------------------------
# Line 388  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 410  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    
367    
368  ;-----------------------------------------------------------------------------  ;-----------------------------------------------------------------------------
# Line 427  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  
   
   movq mm7, [rounding2_mmx + eax * 8]  
   
   mov edi, [esp + 8 + 4]    ; dst  
   mov esi, [esp + 8 + 8]    ; src  
384    
385    mov eax, 8    mov _EAX, prm1    ; dst
386      mov TMP0, prm2    ; src
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    
400  ;-----------------------------------------------------------------------------  ;-----------------------------------------------------------------------------
401  ;  ;
# Line 469  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 508  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 555  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, prm5d   ; 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, prm6d   ; height -> _EAX
514    sub eax, 8    sub _EAX, 8
515    test eax, eax  
516      mov TMP0, prm1   ; dst -> edi
517    mov ecx, [esp + 4 + 4]    ; dst -> edi    mov _EAX, prm2   ; src1 -> esi
518    mov eax, [esp + 4 + 8]    ; src1 -> esi    mov TMP1, prm4   ; stride -> TMP1
519    mov ebx, [esp + 4 + 12]   ; src2 -> eax  
520    mov edx, [esp + 4 + 16]   ; stride -> edx    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    movq mm7, [mmx_one]    movq mm7, [mmx_one]
528    
529    jz near .start0    jz near .start0
530    
531    AVG2_MMX_RND0    AVG2_MMX_RND0
532    lea ecx, [ecx+2*edx]    lea TMP0, [TMP0+2*TMP1]
533    
534  .start0  .start0:
535    
536    AVG2_MMX_RND0    AVG2_MMX_RND0
537    lea ecx, [ecx+2*edx]    lea TMP0, [TMP0+2*TMP1]
538    AVG2_MMX_RND0    AVG2_MMX_RND0
539    lea ecx, [ecx+2*edx]    lea TMP0, [TMP0+2*TMP1]
540    AVG2_MMX_RND0    AVG2_MMX_RND0
541    lea ecx, [ecx+2*edx]    lea TMP0, [TMP0+2*TMP1]
542    AVG2_MMX_RND0    AVG2_MMX_RND0
543    
544    pop ebx    pop _EBX
545    ret    ret
546    
547  .rounding1  .rounding1:
548    mov eax, [esp + 4 + 24]       ; height -> eax    mov eax, prm6d        ; height -> _EAX
549    sub eax, 8    sub _EAX, 8
550    test eax, eax  
551      mov TMP0, prm1        ; dst -> edi
552    mov ecx, [esp + 4 + 4]        ; dst -> edi    mov _EAX, prm2        ; src1 -> esi
553    mov eax, [esp + 4 + 8]        ; src1 -> esi    mov TMP1, prm4        ; stride -> TMP1
554    mov ebx, [esp + 4 + 12]       ; src2 -> eax  
555    mov edx, [esp + 4 + 16]       ; stride -> edx    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    movq mm7, [mmx_one]    movq mm7, [mmx_one]
563    
564    jz near .start1    jz near .start1
565    
566    AVG2_MMX_RND1    AVG2_MMX_RND1
567    lea ecx, [ecx+2*edx]    lea TMP0, [TMP0+2*TMP1]
568    
569  .start1  .start1:
570    
571    AVG2_MMX_RND1    AVG2_MMX_RND1
572    lea ecx, [ecx+2*edx]    lea TMP0, [TMP0+2*TMP1]
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    
579    pop ebx    pop _EBX
580    ret    ret
581  .endfunc  ENDFUNC
582    
583    
584  ;-----------------------------------------------------------------------------  ;-----------------------------------------------------------------------------
# Line 646  Line 594 
594  ;-----------------------------------------------------------------------------  ;-----------------------------------------------------------------------------
595    
596  %macro AVG4_MMX_RND0 0  %macro AVG4_MMX_RND0 0
597    movq mm0, [eax]           ; src1 -> mm0    movq mm0, [_EAX]           ; src1 -> mm0
598    movq mm1, [ebx]           ; src2 -> mm1    movq mm1, [_EBX]           ; src2 -> mm1
599    
600    movq mm2, mm0    movq mm2, mm0
601    movq mm3, mm1    movq mm3, mm1
# Line 661  Line 609 
609    psrlq mm0, 2    psrlq mm0, 2
610    psrlq mm1, 2    psrlq mm1, 2
611    
612    lea eax, [eax+edx]    lea _EAX, [_EAX+TMP1]
613    lea ebx, [ebx+edx]    lea _EBX, [_EBX+TMP1]
614    
615    paddb mm0, mm1    paddb mm0, mm1
616    paddb mm2, mm3    paddb mm2, mm3
617    
618    movq mm4, [esi]           ; src3 -> mm0    movq mm4, [_ESI]           ; src3 -> mm0
619    movq mm5, [edi]           ; src4 -> mm1    movq mm5, [_EDI]           ; src4 -> mm1
620    
621    movq mm1, mm4    movq mm1, mm4
622    movq mm3, mm5    movq mm3, mm5
# Line 694  Line 642 
642    psrlq mm2, 2    psrlq mm2, 2
643    paddb mm0, mm2    paddb mm0, mm2
644    
645    lea esi, [esi+edx]    lea _ESI, [_ESI+TMP1]
646    lea edi, [edi+edx]    lea _EDI, [_EDI+TMP1]
647    
648    movq [ecx], mm0           ; (src1 + src2 + src3 + src4 + 2) / 4 -> dst    movq [TMP0], mm0           ; (src1 + src2 + src3 + src4 + 2) / 4 -> dst
649  %endmacro  %endmacro
650    
651  %macro AVG4_MMX_RND1 0  %macro AVG4_MMX_RND1 0
652    movq mm0, [eax]           ; src1 -> mm0    movq mm0, [_EAX]           ; src1 -> mm0
653    movq mm1, [ebx]           ; src2 -> mm1    movq mm1, [_EBX]           ; src2 -> mm1
654    
655    movq mm2, mm0    movq mm2, mm0
656    movq mm3, mm1    movq mm3, mm1
# Line 716  Line 664 
664    psrlq mm0, 2    psrlq mm0, 2
665    psrlq mm1, 2    psrlq mm1, 2
666    
667    lea eax,[eax+edx]    lea _EAX,[_EAX+TMP1]
668    lea ebx,[ebx+edx]    lea _EBX,[_EBX+TMP1]
669    
670    paddb mm0, mm1    paddb mm0, mm1
671    paddb mm2, mm3    paddb mm2, mm3
672    
673    movq mm4, [esi]           ; src3 -> mm0    movq mm4, [_ESI]           ; src3 -> mm0
674    movq mm5, [edi]           ; src4 -> mm1    movq mm5, [_EDI]           ; src4 -> mm1
675    
676    movq mm1, mm4    movq mm1, mm4
677    movq mm3, mm5    movq mm3, mm5
# Line 749  Line 697 
697    psrlq mm2, 2    psrlq mm2, 2
698    paddb mm0, mm2    paddb mm0, mm2
699    
700    lea esi,[esi+edx]    lea _ESI,[_ESI+TMP1]
701    lea edi,[edi+edx]    lea _EDI,[_EDI+TMP1]
702    
703    movq [ecx], mm0           ; (src1 + src2 + src3 + src4 + 2) / 4 -> dst    movq [TMP0], mm0           ; (src1 + src2 + src3 + src4 + 2) / 4 -> dst
704  %endmacro  %endmacro
705    
706  ALIGN 16  ALIGN SECTION_ALIGN
707  interpolate8x8_avg4_mmx:  interpolate8x8_avg4_mmx:
708    
709    push ebx    mov eax, prm7d      ; rounding
710    push edi    test _EAX, _EAX
711    push esi  
712      mov TMP0, prm1      ; dst -> edi
713    mov eax, [esp + 12 + 28]      ; rounding    mov _EAX, prm5      ; src4 -> edi
714      mov TMP1d, prm6d    ; stride -> TMP1
715    test eax, eax  
716    
717    mov ecx, [esp + 12 + 4]       ; dst -> edi    push _EBX
718    mov eax, [esp + 12 + 8]       ; src1 -> esi    push _EDI
719    mov ebx, [esp + 12 + 12]      ; src2 -> eax    push _ESI
720    mov esi, [esp + 12 + 16]      ; src3 -> esi  
721    mov edi, [esp + 12 + 20]      ; src4 -> edi    mov _EDI, _EAX
722    mov edx, [esp + 12 + 24]      ; stride -> edx  
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    movq mm7, [mmx_one]    movq mm7, [mmx_one]
734    
735    jnz near .rounding1    jnz near .rounding1
736    
737    AVG4_MMX_RND0    AVG4_MMX_RND0
738    lea ecx, [ecx+edx]    lea TMP0, [TMP0+TMP1]
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    
753    pop esi    pop _ESI
754    pop edi    pop _EDI
755    pop ebx    pop _EBX
756    ret    ret
757    
758  .rounding1  .rounding1:
759    AVG4_MMX_RND1    AVG4_MMX_RND1
760    lea ecx, [ecx+edx]    lea TMP0, [TMP0+TMP1]
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    
775    pop esi    pop _ESI
776    pop edi    pop _EDI
777    pop ebx    pop _EBX
778    ret    ret
779  .endfunc  ENDFUNC
780    
781    
782  ;-----------------------------------------------------------------------------  ;-----------------------------------------------------------------------------
# Line 832  Line 789 
789  ;-----------------------------------------------------------------------------  ;-----------------------------------------------------------------------------
790    
791  %macro LOWPASS_6TAP_H_MMX 0  %macro LOWPASS_6TAP_H_MMX 0
792    movq mm0, [eax]    movq mm0, [_EAX]
793    movq mm2, [eax+1]    movq mm2, [_EAX+1]
794    
795    movq mm1, mm0    movq mm1, mm0
796    movq mm3, mm2    movq mm3, mm2
# Line 850  Line 807 
807    psllw mm0, 2    psllw mm0, 2
808    psllw mm1, 2    psllw mm1, 2
809    
810    movq mm2, [eax-1]    movq mm2, [_EAX-1]
811    movq mm4, [eax+2]    movq mm4, [_EAX+2]
812    
813    movq mm3, mm2    movq mm3, mm2
814    movq mm5, mm4    movq mm5, mm4
# Line 871  Line 828 
828    pmullw mm0, [mmx_five]    pmullw mm0, [mmx_five]
829    pmullw mm1, [mmx_five]    pmullw mm1, [mmx_five]
830    
831    movq mm2, [eax-2]    movq mm2, [_EAX-2]
832    movq mm4, [eax+3]    movq mm4, [_EAX+3]
833    
834    movq mm3, mm2    movq mm3, mm2
835    movq mm5, mm4    movq mm5, mm4
# Line 895  Line 852 
852    psraw mm0, 5    psraw mm0, 5
853    psraw mm1, 5    psraw mm1, 5
854    
855    lea eax, [eax+edx]    lea _EAX, [_EAX+TMP1]
856    packuswb mm0, mm1    packuswb mm0, mm1
857    movq [ecx], mm0    movq [TMP0], mm0
858  %endmacro  %endmacro
859    
860  ALIGN 16  ALIGN SECTION_ALIGN
861  interpolate8x8_6tap_lowpass_h_mmx:  interpolate8x8_6tap_lowpass_h_mmx:
862    
863    mov eax, [esp + 16]           ; rounding    mov _EAX, prm4           ; rounding
864    
865    movq mm6, [rounding_lowpass_mmx + eax * 8]    lea TMP0, [rounding_lowpass_mmx]
866      movq mm6, [TMP0 + _EAX * 8]
867    
868    mov ecx, [esp + 4]            ; dst -> edi    mov TMP0, prm1           ; dst -> edi
869    mov eax, [esp + 8]            ; src -> esi    mov _EAX, prm2           ; src -> esi
870    mov edx, [esp + 12]           ; stride -> edx    mov TMP1, prm3           ; stride -> edx
871    
872    pxor mm7, mm7    pxor mm7, mm7
873    
874    LOWPASS_6TAP_H_MMX    LOWPASS_6TAP_H_MMX
875    lea ecx, [ecx+edx]    lea TMP0, [TMP0+TMP1]
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    
890    ret    ret
891  .endfunc  ENDFUNC
892    
893  ;-----------------------------------------------------------------------------  ;-----------------------------------------------------------------------------
894  ;  ;
# Line 942  Line 900 
900  ;-----------------------------------------------------------------------------  ;-----------------------------------------------------------------------------
901    
902  %macro LOWPASS_6TAP_V_MMX 0  %macro LOWPASS_6TAP_V_MMX 0
903    movq mm0, [eax]    movq mm0, [_EAX]
904    movq mm2, [eax+edx]    movq mm2, [_EAX+TMP1]
905    
906    movq mm1, mm0    movq mm1, mm0
907    movq mm3, mm2    movq mm3, mm2
# Line 960  Line 918 
918    psllw mm0, 2    psllw mm0, 2
919    psllw mm1, 2    psllw mm1, 2
920    
921    movq mm4, [eax+2*edx]    movq mm4, [_EAX+2*TMP1]
922    sub eax, ebx    sub _EAX, _EBX
923    movq mm2, [eax+2*edx]    movq mm2, [_EAX+2*TMP1]
924    
925    movq mm3, mm2    movq mm3, mm2
926    movq mm5, mm4    movq mm5, mm4
# Line 982  Line 940 
940    pmullw mm0, [mmx_five]    pmullw mm0, [mmx_five]
941    pmullw mm1, [mmx_five]    pmullw mm1, [mmx_five]
942    
943    movq mm2, [eax+edx]    movq mm2, [_EAX+TMP1]
944    movq mm4, [eax+2*ebx]    movq mm4, [_EAX+2*_EBX]
945    
946    movq mm3, mm2    movq mm3, mm2
947    movq mm5, mm4    movq mm5, mm4
# Line 1006  Line 964 
964    psraw mm0, 5    psraw mm0, 5
965    psraw mm1, 5    psraw mm1, 5
966    
967    lea eax, [eax+4*edx]    lea _EAX, [_EAX+4*TMP1]
968    packuswb mm0, mm1    packuswb mm0, mm1
969    movq [ecx], mm0    movq [TMP0], mm0
970  %endmacro  %endmacro
971    
972  ALIGN 16  ALIGN SECTION_ALIGN
973  interpolate8x8_6tap_lowpass_v_mmx:  interpolate8x8_6tap_lowpass_v_mmx:
974    
975    push ebx    mov _EAX, prm4           ; rounding
   
   mov eax, [esp + 4 + 16]           ; rounding  
976    
977    movq mm6, [rounding_lowpass_mmx + eax * 8]    lea TMP0, [rounding_lowpass_mmx]
978      movq mm6, [TMP0 + _EAX * 8]
979    
980    mov ecx, [esp + 4 + 4]            ; dst -> edi    mov TMP0, prm1           ; dst -> edi
981    mov eax, [esp + 4 + 8]            ; src -> esi    mov _EAX, prm2           ; src -> esi
982    mov edx, [esp + 4 + 12]           ; stride -> edx    mov TMP1, prm3           ; stride -> edx
983    
984    mov ebx, edx    push _EBX
985    shl ebx, 1    lea _EBX, [TMP1+TMP1*2]
   add ebx, edx  
986    
987    pxor mm7, mm7    pxor mm7, mm7
988    
989    LOWPASS_6TAP_V_MMX    LOWPASS_6TAP_V_MMX
990    lea ecx, [ecx+edx]    lea TMP0, [TMP0+TMP1]
991    LOWPASS_6TAP_V_MMX    LOWPASS_6TAP_V_MMX
992    lea ecx, [ecx+edx]    lea TMP0, [TMP0+TMP1]
993    LOWPASS_6TAP_V_MMX    LOWPASS_6TAP_V_MMX
994    lea ecx, [ecx+edx]    lea TMP0, [TMP0+TMP1]
995    LOWPASS_6TAP_V_MMX    LOWPASS_6TAP_V_MMX
996    lea ecx, [ecx+edx]    lea TMP0, [TMP0+TMP1]
997    LOWPASS_6TAP_V_MMX    LOWPASS_6TAP_V_MMX
998    lea ecx, [ecx+edx]    lea TMP0, [TMP0+TMP1]
999    LOWPASS_6TAP_V_MMX    LOWPASS_6TAP_V_MMX
1000    lea ecx, [ecx+edx]    lea TMP0, [TMP0+TMP1]
1001    LOWPASS_6TAP_V_MMX    LOWPASS_6TAP_V_MMX
1002    lea ecx, [ecx+edx]    lea TMP0, [TMP0+TMP1]
1003    LOWPASS_6TAP_V_MMX    LOWPASS_6TAP_V_MMX
1004    
1005    pop ebx    pop _EBX
1006    ret    ret
1007  .endfunc  ENDFUNC
1008    
1009  ;===========================================================================  ;===========================================================================
1010  ;  ;
# Line 1059  Line 1015 
1015  ;===========================================================================  ;===========================================================================
1016    
1017  %macro PROLOG0 0  %macro PROLOG0 0
1018    mov ecx, [esp+ 4] ; Dst    mov TMP0, prm1 ; Dst
1019    mov eax, [esp+ 8] ; Src    mov _EAX, prm2 ; Src
1020    mov edx, [esp+12] ; BpS    mov TMP1, prm3 ; BpS
1021  %endmacro  %endmacro
1022    
1023  %macro PROLOG 2   ; %1: Rounder, %2 load Dst-Rounder  %macro PROLOG 2   ; %1: Rounder, %2 load Dst-Rounder
# Line 1129  Line 1085 
1085  ;===========================================================================  ;===========================================================================
1086    
1087  %macro ADD_FF_MMX 1  %macro ADD_FF_MMX 1
1088    movq mm0, [eax]    movq mm0, [_EAX]
1089    movq mm2, [ecx]    movq mm2, [TMP0]
1090    movq mm1, mm0    movq mm1, mm0
1091    movq mm3, mm2    movq mm3, mm2
1092  %if (%1!=0)  %if (%1!=0)
1093    lea eax,[eax+%1*edx]    lea _EAX,[_EAX+%1*TMP1]
1094  %endif  %endif
1095    MIX    MIX
1096    paddusw mm0, mm5  ; rounder    paddusw mm0, mm5  ; rounder
# Line 1143  Line 1099 
1099    psrlw mm1, 1    psrlw mm1, 1
1100    
1101    packuswb mm0, mm1    packuswb mm0, mm1
1102    movq [ecx], mm0    movq [TMP0], mm0
1103  %if (%1!=0)  %if (%1!=0)
1104    lea ecx,[ecx+%1*edx]    lea TMP0,[TMP0+%1*TMP1]
1105  %endif  %endif
1106  %endmacro  %endmacro
1107    
1108  ALIGN 16  ALIGN SECTION_ALIGN
1109  interpolate8x8_halfpel_add_mmx:  interpolate8x8_halfpel_add_mmx:
1110    PROLOG rounding1_mmx, 1    PROLOG rounding1_mmx, 1
1111    ADD_FF_MMX 1    ADD_FF_MMX 1
# Line 1161  Line 1117 
1117    ADD_FF_MMX 1    ADD_FF_MMX 1
1118    ADD_FF_MMX 0    ADD_FF_MMX 0
1119    ret    ret
1120  .endfunc  ENDFUNC
1121    
1122  ;===========================================================================  ;===========================================================================
1123  ;  ;
# Line 1174  Line 1130 
1130  ;===========================================================================  ;===========================================================================
1131    
1132  %macro ADD_FH_MMX 0  %macro ADD_FH_MMX 0
1133    movq mm0, [eax]    movq mm0, [_EAX]
1134    movq mm2, [eax+1]    movq mm2, [_EAX+1]
1135    movq mm1, mm0    movq mm1, mm0
1136    movq mm3, mm2    movq mm3, mm2
1137    
1138    lea eax,[eax+edx]    lea _EAX,[_EAX+TMP1]
1139    
1140    MIX    MIX
1141    movq mm2, [ecx]   ; prepare mix with Dst[0]    movq mm2, [TMP0]   ; prepare mix with Dst[0]
1142    MIX_DST    MIX_DST
1143    movq [ecx], mm0    movq [TMP0], mm0
1144  %endmacro  %endmacro
1145    
1146  ALIGN 16  ALIGN SECTION_ALIGN
1147  interpolate8x8_halfpel_h_add_mmx:  interpolate8x8_halfpel_h_add_mmx:
1148    PROLOG rounding1_mmx, 1    PROLOG rounding1_mmx, 1
1149    
1150    ADD_FH_MMX    ADD_FH_MMX
1151    lea ecx,[ecx+edx]    lea TMP0,[TMP0+TMP1]
1152    ADD_FH_MMX    ADD_FH_MMX
1153    lea ecx,[ecx+edx]    lea TMP0,[TMP0+TMP1]
1154    ADD_FH_MMX    ADD_FH_MMX
1155    lea ecx,[ecx+edx]    lea TMP0,[TMP0+TMP1]
1156    ADD_FH_MMX    ADD_FH_MMX
1157    lea ecx,[ecx+edx]    lea TMP0,[TMP0+TMP1]
1158    ADD_FH_MMX    ADD_FH_MMX
1159    lea ecx,[ecx+edx]    lea TMP0,[TMP0+TMP1]
1160    ADD_FH_MMX    ADD_FH_MMX
1161    lea ecx,[ecx+edx]    lea TMP0,[TMP0+TMP1]
1162    ADD_FH_MMX    ADD_FH_MMX
1163    lea ecx,[ecx+edx]    lea TMP0,[TMP0+TMP1]
1164    ADD_FH_MMX    ADD_FH_MMX
1165    ret    ret
1166  .endfunc  ENDFUNC
1167    
1168  ;===========================================================================  ;===========================================================================
1169  ;  ;
# Line 1220  Line 1176 
1176  ;===========================================================================  ;===========================================================================
1177    
1178  %macro ADD_HF_MMX 0  %macro ADD_HF_MMX 0
1179    movq mm0, [eax]    movq mm0, [_EAX]
1180    movq mm2, [eax+edx]    movq mm2, [_EAX+TMP1]
1181    movq mm1, mm0    movq mm1, mm0
1182    movq mm3, mm2    movq mm3, mm2
1183    
1184    lea eax,[eax+edx]    lea _EAX,[_EAX+TMP1]
1185    
1186    MIX    MIX
1187    movq mm2, [ecx]   ; prepare mix with Dst[0]    movq mm2, [TMP0]   ; prepare mix with Dst[0]
1188    MIX_DST    MIX_DST
1189    movq [ecx], mm0    movq [TMP0], mm0
1190    
1191  %endmacro  %endmacro
1192    
1193  ALIGN 16  ALIGN SECTION_ALIGN
1194  interpolate8x8_halfpel_v_add_mmx:  interpolate8x8_halfpel_v_add_mmx:
1195    PROLOG rounding1_mmx, 1    PROLOG rounding1_mmx, 1
1196    
1197    ADD_HF_MMX    ADD_HF_MMX
1198    lea ecx,[ecx+edx]    lea TMP0,[TMP0+TMP1]
1199    ADD_HF_MMX    ADD_HF_MMX
1200    lea ecx,[ecx+edx]    lea TMP0,[TMP0+TMP1]
1201    ADD_HF_MMX    ADD_HF_MMX
1202    lea ecx,[ecx+edx]    lea TMP0,[TMP0+TMP1]
1203    ADD_HF_MMX    ADD_HF_MMX
1204    lea ecx,[ecx+edx]    lea TMP0,[TMP0+TMP1]
1205    ADD_HF_MMX    ADD_HF_MMX
1206    lea ecx,[ecx+edx]    lea TMP0,[TMP0+TMP1]
1207    ADD_HF_MMX    ADD_HF_MMX
1208    lea ecx,[ecx+edx]    lea TMP0,[TMP0+TMP1]
1209    ADD_HF_MMX    ADD_HF_MMX
1210    lea ecx,[ecx+edx]    lea TMP0,[TMP0+TMP1]
1211    ADD_HF_MMX    ADD_HF_MMX
1212    ret    ret
1213  .endfunc  ENDFUNC
1214    
1215  ; The trick is to correct the result of 'pavgb' with some combination of the  ; 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).  ; lsb's of the 4 input values i,j,k,l, and their intermediate 'pavgb' (s and t).
# Line 1278  Line 1234 
1234  ;===========================================================================  ;===========================================================================
1235    
1236  %macro ADD_HH_MMX 0  %macro ADD_HH_MMX 0
1237    lea eax,[eax+edx]    lea _EAX,[_EAX+TMP1]
1238    
1239      ; transfert prev line to mm0/mm1      ; transfert prev line to mm0/mm1
1240    movq mm0, mm2    movq mm0, mm2
1241    movq mm1, mm3    movq mm1, mm3
1242    
1243      ; load new line in mm2/mm3      ; load new line in mm2/mm3
1244    movq mm2, [eax]    movq mm2, [_EAX]
1245    movq mm4, [eax+1]    movq mm4, [_EAX+1]
1246    movq mm3, mm2    movq mm3, mm2
1247    movq mm5, mm4    movq mm5, mm4
1248    
# Line 1303  Line 1259 
1259    paddusw mm0, mm2    paddusw mm0, mm2
1260    paddusw mm1, mm3    paddusw mm1, mm3
1261    
1262    movq mm4, [ecx]   ; prepare mix with Dst[0]    movq mm4, [TMP0]   ; prepare mix with Dst[0]
1263    movq mm5, mm4    movq mm5, mm4
1264    
1265    paddusw mm0, mm7  ; finish mixing current line    paddusw mm0, mm7  ; finish mixing current line
# Line 1326  Line 1282 
1282    
1283    packuswb mm0, mm1    packuswb mm0, mm1
1284    
1285    movq [ecx], mm0    movq [TMP0], mm0
1286  %endmacro  %endmacro
1287    
1288  ALIGN 16  ALIGN SECTION_ALIGN
1289  interpolate8x8_halfpel_hv_add_mmx:  interpolate8x8_halfpel_hv_add_mmx:
1290    PROLOG rounding2_mmx, 0    ; mm5 is busy. Don't load dst-rounder    PROLOG rounding2_mmx, 0    ; mm5 is busy. Don't load dst-rounder
1291    
1292      ; preprocess first line      ; preprocess first line
1293    movq mm0, [eax]    movq mm0, [_EAX]
1294    movq mm2, [eax+1]    movq mm2, [_EAX+1]
1295    movq mm1, mm0    movq mm1, mm0
1296    movq mm3, mm2    movq mm3, mm2
1297    
# Line 1349  Line 1305 
1305     ; 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
1306    
1307    ADD_HH_MMX    ADD_HH_MMX
1308    lea ecx,[ecx+edx]    lea TMP0,[TMP0+TMP1]
1309    ADD_HH_MMX    ADD_HH_MMX
1310    lea ecx,[ecx+edx]    lea TMP0,[TMP0+TMP1]
1311    ADD_HH_MMX    ADD_HH_MMX
1312    lea ecx,[ecx+edx]    lea TMP0,[TMP0+TMP1]
1313    ADD_HH_MMX    ADD_HH_MMX
1314    lea ecx,[ecx+edx]    lea TMP0,[TMP0+TMP1]
1315    ADD_HH_MMX    ADD_HH_MMX
1316    lea ecx,[ecx+edx]    lea TMP0,[TMP0+TMP1]
1317    ADD_HH_MMX    ADD_HH_MMX
1318    lea ecx,[ecx+edx]    lea TMP0,[TMP0+TMP1]
1319    ADD_HH_MMX    ADD_HH_MMX
1320    lea ecx,[ecx+edx]    lea TMP0,[TMP0+TMP1]
1321    ADD_HH_MMX    ADD_HH_MMX
1322    
1323    ret    ret
1324  .endfunc  ENDFUNC
1325    
1326    NON_EXEC_STACK

Legend:
Removed from v.1.18  
changed lines
  Added in v.1.25

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