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

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

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