[svn] / trunk / xvidcore / src / motion / x86_asm / sad_mmx.asm Repository:
ViewVC logotype

Diff of /trunk/xvidcore/src/motion/x86_asm/sad_mmx.asm

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

revision 262, Sun Jul 7 09:45:40 2002 UTC revision 851, Sat Feb 15 15:22:19 2003 UTC
# Line 32  Line 32 
32  bits 32  bits 32
33    
34  %macro cglobal 1  %macro cglobal 1
35            %ifdef PREFIX
36                  global _%1                  global _%1
37                  %define %1 _%1                  %define %1 _%1
38          %else          %else
# Line 47  Line 48 
48  section .text  section .text
49    
50  cglobal  sad16_mmx  cglobal  sad16_mmx
51    cglobal  sad16v_mmx
52  cglobal  sad8_mmx  cglobal  sad8_mmx
53  cglobal  sad16bi_mmx  cglobal  sad16bi_mmx
54  cglobal  sad8bi_mmx  cglobal  sad8bi_mmx
# Line 57  Line 59 
59  ; uint32_t sad16_mmx(const uint8_t * const cur,  ; uint32_t sad16_mmx(const uint8_t * const cur,
60  ;                                        const uint8_t * const ref,  ;                                        const uint8_t * const ref,
61  ;                                        const uint32_t stride,  ;                                        const uint32_t stride,
62    ;                                        const uint32_t best_sad);
63    ;
64  ; (early termination ignore; slows this down)  ; (early termination ignore; slows this down)
65  ;  ;
66  ;===========================================================================  ;===========================================================================
# Line 199  Line 203 
203      ret      ret
204    
205    
206    ;===========================================================================
207    ;
208    ; uint32_t sad16v_mmx(const uint8_t * const cur,
209    ;                                     const uint8_t * const ref,
210    ;                                         const uint32_t stride,
211    ;                                         int32_t *sad);
212    ;
213    ;===========================================================================
214    
215    %macro SADV_16x16_MMX 0
216        movq mm0, [eax]
217        movq mm1, [edx]
218    
219        movq mm2, [eax+8]
220        movq mm3, [edx+8]
221    
222        movq mm4, mm0
223        psubusb mm0, mm1
224    
225        psubusb mm1, mm4
226        por mm0, mm1
227        lea eax,[eax+ecx]
228    
229        movq mm4, mm2
230        psubusb mm2, mm3
231    
232        psubusb mm3, mm4
233        por mm2, mm3
234        lea edx,[edx+ecx]
235    
236        movq mm1,mm0
237        movq mm3,mm2
238    
239        punpcklbw mm0,mm7
240        punpckhbw mm1,mm7
241        punpcklbw mm2,mm7
242        punpckhbw mm3,mm7
243    
244        paddusw mm0,mm1
245        paddusw mm2,mm3
246    
247            paddusw mm5, mm0
248            paddusw mm6, mm2
249    %endmacro
250    
251    align 16
252    sad16v_mmx:
253    
254            push ebx
255            push edi
256    
257        mov eax, [esp + 8 + 4] ; Src1
258        mov edx, [esp + 8 + 8] ; Src2
259        mov ecx, [esp + 8 + 12] ; Stride
260        mov ebx, [esp + 8 + 16] ; sad ptr
261    
262            pxor mm5, mm5 ; accum
263        pxor mm6, mm6 ; accum
264        pxor mm7, mm7 ; zero
265    
266        SADV_16x16_MMX
267        SADV_16x16_MMX
268        SADV_16x16_MMX
269        SADV_16x16_MMX
270        SADV_16x16_MMX
271        SADV_16x16_MMX
272        SADV_16x16_MMX
273        SADV_16x16_MMX
274    
275        pmaddwd mm5, [mmx_one] ; collapse
276        pmaddwd mm6, [mmx_one] ; collapse
277    
278        movq mm2, mm5
279        movq mm3, mm6
280    
281        psrlq mm2, 32
282        psrlq mm3, 32
283    
284        paddd mm5, mm2
285        paddd mm6, mm3
286    
287            movd [ebx], mm5
288            movd [ebx + 4], mm6
289    
290            paddd mm5, mm6
291    
292            movd edi, mm5
293    
294            pxor mm5, mm5
295            pxor mm6, mm6
296    
297        SADV_16x16_MMX
298        SADV_16x16_MMX
299        SADV_16x16_MMX
300        SADV_16x16_MMX
301        SADV_16x16_MMX
302        SADV_16x16_MMX
303        SADV_16x16_MMX
304        SADV_16x16_MMX
305    
306        pmaddwd mm5, [mmx_one] ; collapse
307        pmaddwd mm6, [mmx_one] ; collapse
308    
309        movq mm2, mm5
310        movq mm3, mm6
311    
312        psrlq mm2, 32
313        psrlq mm3, 32
314    
315        paddd mm5, mm2
316        paddd mm6, mm3
317    
318            movd [ebx + 8], mm5
319            movd [ebx + 12], mm6
320    
321            paddd mm5, mm6
322    
323            movd eax, mm5
324    
325        add eax, edi
326    
327            pop edi
328        pop ebx
329            ret
330    
331    
332    
# Line 206  Line 334 
334  ;  ;
335  ; uint32_t sad16bi_mmx(const uint8_t * const cur,  ; uint32_t sad16bi_mmx(const uint8_t * const cur,
336  ; const uint8_t * const ref1,  ; const uint8_t * const ref1,
337    ; const uint8_t * const ref2,
338    ; const uint32_t stride);
339    ;
340    ;===========================================================================
341    %macro SADBI_16x16_MMX 2    ; SADBI_16x16_MMX( int_ptr_offset, bool_increment_ptr );
342    
343       movq mm0, [edx+%1]
344       movq mm2, [ebx+%1]
345       movq mm1, mm0
346       movq mm3, mm2
347    
348    %if %2 != 0
349       add edx, ecx
350    %endif
351    
352       punpcklbw mm0, mm7
353       punpckhbw mm1, mm7
354    punpcklbw mm2, mm7
355    punpckhbw mm3, mm7
356    
357    %if %2 != 0
358       add ebx, ecx
359    %endif
360    
361    paddusw mm0, mm2    ; mm01 = ref1 + ref2
362    paddusw mm1, mm3
363    paddusw mm0, [mmx_one] ; mm01 += 1
364    paddusw mm1, [mmx_one]
365    psrlw mm0, 1     ; mm01 >>= 1
366    psrlw mm1, 1
367    
368       movq mm2, [eax+%1]
369       movq mm3, mm2
370       punpcklbw mm2, mm7          ; mm23 = src
371       punpckhbw mm3, mm7
372    
373    %if %2 != 0
374       add eax, ecx
375    %endif
376    
377       movq mm4, mm0
378       movq mm5, mm1
379       psubusw mm0, mm2
380       psubusw mm1, mm3
381       psubusw mm2, mm4
382       psubusw mm3, mm5
383       por mm0, mm2                ; mm01 = ABS(mm01 - mm23)
384       por mm1, mm3
385    
386       paddusw mm6,mm0             ; mm6 += mm01
387       paddusw mm6,mm1
388    
389    %endmacro
390    
391    align 16
392    sad16bi_mmx:
393       push ebx
394       mov eax, [esp+4+ 4] ; Src
395       mov edx, [esp+4+ 8] ; Ref1
396       mov ebx, [esp+4+12] ; Ref2
397       mov ecx, [esp+4+16] ; Stride
398    
399       pxor mm6, mm6 ; accum2
400    pxor mm7, mm7
401    .Loop
402       SADBI_16x16_MMX 0, 0
403       SADBI_16x16_MMX 8, 1
404       SADBI_16x16_MMX 0, 0
405       SADBI_16x16_MMX 8, 1
406       SADBI_16x16_MMX 0, 0
407       SADBI_16x16_MMX 8, 1
408       SADBI_16x16_MMX 0, 0
409       SADBI_16x16_MMX 8, 1
410       SADBI_16x16_MMX 0, 0
411       SADBI_16x16_MMX 8, 1
412       SADBI_16x16_MMX 0, 0
413       SADBI_16x16_MMX 8, 1
414       SADBI_16x16_MMX 0, 0
415       SADBI_16x16_MMX 8, 1
416       SADBI_16x16_MMX 0, 0
417       SADBI_16x16_MMX 8, 1
418    
419       SADBI_16x16_MMX 0, 0
420       SADBI_16x16_MMX 8, 1
421       SADBI_16x16_MMX 0, 0
422       SADBI_16x16_MMX 8, 1
423       SADBI_16x16_MMX 0, 0
424       SADBI_16x16_MMX 8, 1
425       SADBI_16x16_MMX 0, 0
426       SADBI_16x16_MMX 8, 1
427       SADBI_16x16_MMX 0, 0
428       SADBI_16x16_MMX 8, 1
429       SADBI_16x16_MMX 0, 0
430       SADBI_16x16_MMX 8, 1
431       SADBI_16x16_MMX 0, 0
432       SADBI_16x16_MMX 8, 1
433       SADBI_16x16_MMX 0, 0
434       SADBI_16x16_MMX 8, 1
435    
436       pmaddwd mm6, [mmx_one] ; collapse
437       movq mm7, mm6
438       psrlq mm7, 32
439       paddd mm6, mm7
440    
441       movd eax, mm6
442       pop ebx
443       ret
444    
445    ;===========================================================================
446    ;
447    ; uint32_t sad8bi_mmx(const uint8_t * const cur,
448    ; const uint8_t * const ref1,
449    ; const uint8_t * const ref2,
450    ; const uint32_t stride);
451    ;
452    ;===========================================================================
453    align 16
454    sad8bi_mmx:
455       push ebx
456       mov eax, [esp+4+ 4] ; Src
457       mov edx, [esp+4+ 8] ; Ref1
458       mov ebx, [esp+4+12] ; Ref2
459       mov ecx, [esp+4+16] ; Stride
460    
461       pxor mm6, mm6 ; accum2
462    pxor mm7, mm7
463    .Loop
464       SADBI_16x16_MMX 0, 1
465       SADBI_16x16_MMX 0, 1
466       SADBI_16x16_MMX 0, 1
467       SADBI_16x16_MMX 0, 1
468       SADBI_16x16_MMX 0, 1
469       SADBI_16x16_MMX 0, 1
470       SADBI_16x16_MMX 0, 1
471       SADBI_16x16_MMX 0, 1
472    
473       pmaddwd mm6, [mmx_one] ; collapse
474       movq mm7, mm6
475       psrlq mm7, 32
476       paddd mm6, mm7
477    
478       movd eax, mm6
479       pop ebx
480       ret
481    
482    
483    
484    
485    ;===========================================================================
486    ;
487    ; uint32_t dev16_mmx(const uint8_t * const cur,
488    ;                                       const uint32_t stride);
489    ;
490    ;===========================================================================
491    
492    %macro MEAN_16x16_MMX 0
493      movq mm0, [eax]      movq mm0, [eax]
494      movq mm2, [eax+8]      movq mm2, [eax+8]
495      lea eax,[eax+ecx]      lea eax,[eax+ecx]

Legend:
Removed from v.262  
changed lines
  Added in v.851

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