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