www.pudn.com > T264-src-0.02.zip > sad.asm
;/***************************************************************************** ; * ; * T264 AVC CODEC ; * ; * Copyright(C) 2004-2005 llcc; * 2004-2005 visionany ; * ; * This program is free software ; you can redistribute it and/or modify ; * it under the terms of the GNU General Public License as published by ; * the Free Software Foundation ; either version 2 of the License, or ; * (at your option) any later version. ; * ; * This program is distributed in the hope that it will be useful, ; * but WITHOUT ANY WARRANTY ; without even the implied warranty of ; * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ; * GNU General Public License for more details. ; * ; * You should have received a copy of the GNU General Public License ; * along with this program ; if not, write to the Free Software ; * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA ; * ; ****************************************************************************/ bits 32 ; ideal from xvid %macro cglobal 1 global _%1 %define %1 _%1 %endmacro ; %1 = src, %2 = dst, %3 = sad, %4 = xmm tmp, %5 = xmm tmp, %6 = xmm tmp, %7 = src stride, % 8 = dst stride, %9 = sum sad %macro sad16b 9 movdqu %4, [%1] movdqu %5, [%2] psadbw %4, %5 add %1, %7 ; src + src_stride add %2, %8 ; dst + dst_stride movdqa %6, %4 psrldq %4, 8 paddd %4, %6 movd %3, %4 add %9, %3 %endmacro ; %1 = src, %2 = dst, %3 = sad, %4 = xmm tmp, %5 = xmm tmp, %6 = xmm tmp, %7 = src stride, % 8 = dst stride, %9 = sum sad %macro sad8b 9 movq %4, [%1] movq %5, [%2] psadbw %4, %5 add %1, %7 ; src + src_stride add %2, %8 ; dst + dst_stride movd %3, %4 add %9, %3 %endmacro ; %1 = src, %2 = dst, %3 = sad, %4 = xmm tmp, %5 = xmm tmp, %6 = xmm tmp, %7 = src stride, % 8 = dst stride, %9 = sum sad %macro sad4b 9 movq %4, [%1] movq %5, [%2] ; we only need low 4 bytes pand %4, %6 pand %5, %6 psadbw %4, %5 add %1, %7 ; src + src_stride add %2, %8 ; dst + dst_stride movd %3, %4 add %9, %3 %endmacro section .rodata data align=16 align 16 mmx_mask01 db 0xff, 0xff, 0xff, 0xff, 0, 0, 0, 0 section .text ;====================================================== ; ; uint32_t ; T264_sad_u_16x16_sse2(uint8_t* src, int32_t src_stride, uint8_t* data, int32_t dst_stride); ; ;====================================================== align 16 cglobal T264_sad_u_16x16_sse2 T264_sad_u_16x16_sse2 push ebx push esi push edi mov esi, [esp + 4 + 12] ; src mov ebx, [esp + 8 + 12] ; src_stride mov edi, [esp + 12+ 12] ; data mov edx, [esp + 16+ 12] ; dst_stride xor eax, eax ; %1 = src, %2 = dst, %3 = sad, %4 = xmm tmp, %5 = xmm tmp, %6 = xmm tmp, %7 = src stride, % 8 = dst stride sad16b esi, edi, ecx, xmm0, xmm1, xmm2, ebx, edx, eax sad16b esi, edi, ecx, xmm0, xmm1, xmm2, ebx, edx, eax sad16b esi, edi, ecx, xmm0, xmm1, xmm2, ebx, edx, eax sad16b esi, edi, ecx, xmm0, xmm1, xmm2, ebx, edx, eax sad16b esi, edi, ecx, xmm0, xmm1, xmm2, ebx, edx, eax sad16b esi, edi, ecx, xmm0, xmm1, xmm2, ebx, edx, eax sad16b esi, edi, ecx, xmm0, xmm1, xmm2, ebx, edx, eax sad16b esi, edi, ecx, xmm0, xmm1, xmm2, ebx, edx, eax sad16b esi, edi, ecx, xmm0, xmm1, xmm2, ebx, edx, eax sad16b esi, edi, ecx, xmm0, xmm1, xmm2, ebx, edx, eax sad16b esi, edi, ecx, xmm0, xmm1, xmm2, ebx, edx, eax sad16b esi, edi, ecx, xmm0, xmm1, xmm2, ebx, edx, eax sad16b esi, edi, ecx, xmm0, xmm1, xmm2, ebx, edx, eax sad16b esi, edi, ecx, xmm0, xmm1, xmm2, ebx, edx, eax sad16b esi, edi, ecx, xmm0, xmm1, xmm2, ebx, edx, eax sad16b esi, edi, ecx, xmm0, xmm1, xmm2, ebx, edx, eax pop edi pop esi pop ebx ret ;====================================================== ; ; uint32_t ; T264_sad_u_16x8_sse2(uint8_t* src, int32_t src_stride, uint8_t* data, int32_t dst_stride); ; ;====================================================== align 16 cglobal T264_sad_u_16x8_sse2 T264_sad_u_16x8_sse2 push ebx push esi push edi mov esi, [esp + 4 + 12] ; src mov ebx, [esp + 8 + 12] ; src_stride mov edi, [esp + 12+ 12] ; data mov edx, [esp + 16+ 12] ; dst_stride xor eax, eax ; %1 = src, %2 = dst, %3 = sad, %4 = xmm tmp, %5 = xmm tmp, %6 = xmm tmp, %7 = src stride, % 8 = dst stride sad16b esi, edi, ecx, xmm0, xmm1, xmm2, ebx, edx, eax sad16b esi, edi, ecx, xmm0, xmm1, xmm2, ebx, edx, eax sad16b esi, edi, ecx, xmm0, xmm1, xmm2, ebx, edx, eax sad16b esi, edi, ecx, xmm0, xmm1, xmm2, ebx, edx, eax sad16b esi, edi, ecx, xmm0, xmm1, xmm2, ebx, edx, eax sad16b esi, edi, ecx, xmm0, xmm1, xmm2, ebx, edx, eax sad16b esi, edi, ecx, xmm0, xmm1, xmm2, ebx, edx, eax sad16b esi, edi, ecx, xmm0, xmm1, xmm2, ebx, edx, eax pop edi pop esi pop ebx ret ;====================================================== ; ; uint32_t ; T264_sad_u_8x16_sse(uint8_t* src, int32_t src_stride, uint8_t* data, int32_t dst_stride); ; ;====================================================== align 16 cglobal T264_sad_u_8x16_sse T264_sad_u_8x16_sse push ebx push esi push edi mov esi, [esp + 4 + 12] ; src mov ebx, [esp + 8 + 12] ; src_stride mov edi, [esp + 12+ 12] ; data mov edx, [esp + 16+ 12] ; dst_stride xor eax, eax ; %1 = src, %2 = dst, %3 = sad, %4 = xmm tmp, %5 = xmm tmp, %6 = xmm tmp, %7 = src stride, % 8 = dst stride sad8b esi, edi, ecx, mm0, mm1, mm2, ebx, edx, eax sad8b esi, edi, ecx, mm0, mm1, mm2, ebx, edx, eax sad8b esi, edi, ecx, mm0, mm1, mm2, ebx, edx, eax sad8b esi, edi, ecx, mm0, mm1, mm2, ebx, edx, eax sad8b esi, edi, ecx, mm0, mm1, mm2, ebx, edx, eax sad8b esi, edi, ecx, mm0, mm1, mm2, ebx, edx, eax sad8b esi, edi, ecx, mm0, mm1, mm2, ebx, edx, eax sad8b esi, edi, ecx, mm0, mm1, mm2, ebx, edx, eax sad8b esi, edi, ecx, mm0, mm1, mm2, ebx, edx, eax sad8b esi, edi, ecx, mm0, mm1, mm2, ebx, edx, eax sad8b esi, edi, ecx, mm0, mm1, mm2, ebx, edx, eax sad8b esi, edi, ecx, mm0, mm1, mm2, ebx, edx, eax sad8b esi, edi, ecx, mm0, mm1, mm2, ebx, edx, eax sad8b esi, edi, ecx, mm0, mm1, mm2, ebx, edx, eax sad8b esi, edi, ecx, mm0, mm1, mm2, ebx, edx, eax sad8b esi, edi, ecx, mm0, mm1, mm2, ebx, edx, eax pop edi pop esi pop ebx ret ;====================================================== ; ; uint32_t ; T264_sad_u_8x8_sse(uint8_t* src, int32_t src_stride, uint8_t* data, int32_t dst_stride); ; ;====================================================== align 16 cglobal T264_sad_u_8x8_sse T264_sad_u_8x8_sse push ebx push esi push edi mov esi, [esp + 4 + 12] ; src mov ebx, [esp + 8 + 12] ; src_stride mov edi, [esp + 12+ 12] ; data mov edx, [esp + 16+ 12] ; dst_stride xor eax, eax ; %1 = src, %2 = dst, %3 = sad, %4 = xmm tmp, %5 = xmm tmp, %6 = xmm tmp, %7 = src stride, % 8 = dst stride sad8b esi, edi, ecx, mm0, mm1, mm2, ebx, edx, eax sad8b esi, edi, ecx, mm0, mm1, mm2, ebx, edx, eax sad8b esi, edi, ecx, mm0, mm1, mm2, ebx, edx, eax sad8b esi, edi, ecx, mm0, mm1, mm2, ebx, edx, eax sad8b esi, edi, ecx, mm0, mm1, mm2, ebx, edx, eax sad8b esi, edi, ecx, mm0, mm1, mm2, ebx, edx, eax sad8b esi, edi, ecx, mm0, mm1, mm2, ebx, edx, eax sad8b esi, edi, ecx, mm0, mm1, mm2, ebx, edx, eax pop edi pop esi pop ebx ret ;====================================================== ; ; uint32_t ; T264_sad_u_8x4_sse(uint8_t* src, int32_t src_stride, uint8_t* data, int32_t dst_stride); ; ;====================================================== align 16 cglobal T264_sad_u_8x4_sse T264_sad_u_8x4_sse push ebx push esi push edi mov esi, [esp + 4 + 12] ; src mov ebx, [esp + 8 + 12] ; src_stride mov edi, [esp + 12+ 12] ; data mov edx, [esp + 16+ 12] ; dst_stride xor eax, eax ; %1 = src, %2 = dst, %3 = sad, %4 = xmm tmp, %5 = xmm tmp, %6 = xmm tmp, %7 = src stride, % 8 = dst stride sad8b esi, edi, ecx, mm0, mm1, mm2, ebx, edx, eax sad8b esi, edi, ecx, mm0, mm1, mm2, ebx, edx, eax sad8b esi, edi, ecx, mm0, mm1, mm2, ebx, edx, eax sad8b esi, edi, ecx, mm0, mm1, mm2, ebx, edx, eax pop edi pop esi pop ebx ret ;====================================================== ; ; uint32_t ; T264_sad_u_4x8_sse(uint8_t* src, int32_t src_stride, uint8_t* data, int32_t dst_stride); ; ;====================================================== align 16 cglobal T264_sad_u_4x8_sse T264_sad_u_4x8_sse push ebx push esi push edi mov esi, [esp + 4 + 12] ; src mov ebx, [esp + 8 + 12] ; src_stride mov edi, [esp + 12+ 12] ; data mov edx, [esp + 16+ 12] ; dst_stride movq mm2, [mmx_mask01] xor eax, eax ; %1 = src, %2 = dst, %3 = sad, %4 = xmm tmp, %5 = xmm tmp, %6 = xmm tmp, %7 = src stride, % 8 = dst stride sad4b esi, edi, ecx, mm0, mm1, mm2, ebx, edx, eax sad4b esi, edi, ecx, mm0, mm1, mm2, ebx, edx, eax sad4b esi, edi, ecx, mm0, mm1, mm2, ebx, edx, eax sad4b esi, edi, ecx, mm0, mm1, mm2, ebx, edx, eax sad4b esi, edi, ecx, mm0, mm1, mm2, ebx, edx, eax sad4b esi, edi, ecx, mm0, mm1, mm2, ebx, edx, eax sad4b esi, edi, ecx, mm0, mm1, mm2, ebx, edx, eax sad4b esi, edi, ecx, mm0, mm1, mm2, ebx, edx, eax pop edi pop esi pop ebx ret ;====================================================== ; ; uint32_t ; T264_sad_u_4x4_sse(uint8_t* src, int32_t src_stride, uint8_t* data, int32_t dst_stride); ; ;====================================================== align 16 cglobal T264_sad_u_4x4_sse T264_sad_u_4x4_sse push ebx push esi push edi mov esi, [esp + 4 + 12] ; src mov ebx, [esp + 8 + 12] ; src_stride mov edi, [esp + 12+ 12] ; data mov edx, [esp + 16+ 12] ; dst_stride movq mm2, [mmx_mask01] xor eax, eax ; %1 = src, %2 = dst, %3 = sad, %4 = xmm tmp, %5 = xmm tmp, %6 = xmm tmp, %7 = src stride, % 8 = dst stride sad4b esi, edi, ecx, mm0, mm1, mm2, ebx, edx, eax sad4b esi, edi, ecx, mm0, mm1, mm2, ebx, edx, eax sad4b esi, edi, ecx, mm0, mm1, mm2, ebx, edx, eax sad4b esi, edi, ecx, mm0, mm1, mm2, ebx, edx, eax pop edi pop esi pop ebx ret