--- trunk/xvidcore/src/motion/x86_asm/sad_3dn.asm 2004/08/29 10:02:38 1540 +++ trunk/xvidcore/src/motion/x86_asm/sad_3dn.asm 2008/12/04 14:41:50 1844 @@ -19,41 +19,19 @@ ; * along with this program; if not, write to the Free Software ; * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA ; * -; * $Id: sad_3dn.asm,v 1.9 2004-08-29 10:02:38 edgomez Exp $ +; * $Id: sad_3dn.asm,v 1.13 2008-12-04 14:41:50 Isibaar Exp $ ; * ; ***************************************************************************/ -BITS 32 - -%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 +%include "nasm.inc" ;============================================================================= ; Read only data ;============================================================================= -%ifdef FORMAT_COFF -SECTION .rodata -%else -SECTION .rodata align=16 -%endif +DATA -ALIGN 16 +ALIGN SECTION_ALIGN mmx_one: times 4 dw 1 @@ -61,18 +39,18 @@ ; Helper macros ;============================================================================= %macro SADBI_16x16_3DN 0 - movq mm0, [eax] ; src - movq mm2, [eax+8] + movq mm0, [_EAX] ; src + movq mm2, [_EAX+8] - movq mm1, [edx] ; ref1 - movq mm3, [edx+8] - pavgusb mm1, [ebx] ; ref2 - lea edx, [edx+ecx] - pavgusb mm3, [ebx+8] - lea ebx, [ebx+ecx] + movq mm1, [TMP1] ; ref1 + movq mm3, [TMP1+8] + pavgusb mm1, [_EBX] ; ref2 + lea TMP1, [TMP1+TMP0] + pavgusb mm3, [_EBX+8] + lea _EBX, [_EBX+TMP0] movq mm4, mm0 - lea eax, [eax+ecx] + lea _EAX, [_EAX+TMP0] psubusb mm0, mm1 movq mm5, mm2 psubusb mm2, mm3 @@ -97,18 +75,18 @@ %endmacro %macro SADBI_8x8_3DN 0 - movq mm0, [eax] ; src - movq mm2, [eax+ecx] + movq mm0, [_EAX] ; src + movq mm2, [_EAX+TMP0] - movq mm1, [edx] ; ref1 - movq mm3, [edx+ecx] - pavgusb mm1, [ebx] ; ref2 - lea edx, [edx+2*ecx] - pavgusb mm3, [ebx+ecx] - lea ebx, [ebx+2*ecx] + movq mm1, [TMP1] ; ref1 + movq mm3, [TMP1+TMP0] + pavgusb mm1, [_EBX] ; ref2 + lea TMP1, [TMP1+2*TMP0] + pavgusb mm3, [_EBX+TMP0] + lea _EBX, [_EBX+2*TMP0] movq mm4, mm0 - lea eax, [eax+2*ecx] + lea _EAX, [_EAX+2*TMP0] psubusb mm0, mm1 movq mm5, mm2 psubusb mm2, mm3 @@ -136,7 +114,7 @@ ; Code ;============================================================================= -SECTION .text +TEXT cglobal sad16bi_3dn cglobal sad8bi_3dn @@ -150,17 +128,22 @@ ; ;----------------------------------------------------------------------------- -ALIGN 16 +ALIGN SECTION_ALIGN sad16bi_3dn: - push ebx - mov eax, [esp+4+ 4] ; Src - mov edx, [esp+4+ 8] ; Ref1 - mov ebx, [esp+4+12] ; Ref2 - mov ecx, [esp+4+16] ; Stride + mov _EAX, prm1 ; Src + mov TMP1, prm2 ; Ref1 + mov TMP0, prm4 ; Stride + + push _EBX +%ifdef ARCH_IS_X86_64 + mov _EBX, prm3 +%else + mov _EBX, [_ESP+4+12] ; Ref2 +%endif pxor mm6, mm6 ; accum2 pxor mm7, mm7 -.Loop +.Loop: SADBI_16x16_3DN SADBI_16x16_3DN SADBI_16x16_3DN @@ -186,10 +169,10 @@ movd eax, mm6 - pop ebx + pop _EBX ret -.endfunc +ENDFUNC ;----------------------------------------------------------------------------- ; @@ -200,17 +183,22 @@ ; ;----------------------------------------------------------------------------- -ALIGN 16 +ALIGN SECTION_ALIGN sad8bi_3dn: - push ebx - mov eax, [esp+4+ 4] ; Src - mov edx, [esp+4+ 8] ; Ref1 - mov ebx, [esp+4+12] ; Ref2 - mov ecx, [esp+4+16] ; Stride + mov _EAX, prm1 ; Src + mov TMP1, prm2 ; Ref1 + mov TMP0, prm4 ; Stride + + push _EBX +%ifdef ARCH_IS_X86_64 + mov _EBX, prm3 +%else + mov _EBX, [_ESP+4+12] ; Ref2 +%endif pxor mm6, mm6 ; accum2 pxor mm7, mm7 -.Loop +.Loop: SADBI_8x8_3DN SADBI_8x8_3DN SADBI_8x8_3DN @@ -223,8 +211,13 @@ movd eax, mm6 - pop ebx + pop _EBX ret -.endfunc +ENDFUNC + + +%ifidn __OUTPUT_FORMAT__,elf +section ".note.GNU-stack" noalloc noexec nowrite progbits +%endif