411 lines · 10.0 KB · Assembly
RawDownload
;*!;* \copy;*     Copyright (c)  2010-2013, Cisco Systems;*     All rights reserved.;*;*     Redistribution and use in source and binary forms, with or without;*     modification, are permitted provided that the following conditions;*     are met:;*;*        * Redistributions of source code must retain the above copyright;*          notice, this list of conditions and the following disclaimer.;*;*        * Redistributions in binary form must reproduce the above copyright;*          notice, this list of conditions and the following disclaimer in;*          the documentation and/or other materials provided with the;*          distribution.;*;*     THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS;*     "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT;*     LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS;*     FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE;*     COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,;*     INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,;*     BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;;*     LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER;*     CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT;*     LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN;*     ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE;*     POSSIBILITY OF SUCH DAMAGE.;*;*;*  vaa.asm;*;*  Abstract;*      sse2 for pVaa routines;*;*  History;*      04/14/2010  Created;*      06/07/2010  Added AnalysisVaaInfoIntra_sse2(ssse3);*      06/10/2010  Tune rc_sad_frame_sse2 and got about 40% improvement;*      08/11/2010  Added abs_difference_mbrow_sse2 & sum_sqrsum_mbrow_sse2;*;*************************************************************************/%include "asm_inc.asm"  ;***********************************************************************; Macros and other preprocessor constants;*********************************************************************** ; by comparing it outperforms than phaddw(SSSE3) sets%macro SUM_WORD_8x2_SSE2    2   ; dst(pSrc), tmp    ; @sum_8x2 begin    pshufd %2, %1, 04Eh ; 01001110 B    paddw %1, %2    pshuflw %2, %1, 04Eh    ; 01001110 B    paddw %1, %2    pshuflw %2, %1, 0B1h    ; 10110001 B    paddw %1, %2    ; end of @sum_8x2%endmacro   ; END of SUM_WORD_8x2_SSE2  %macro VAA_AVG_BLOCK_SSE2 6 ; dst, t0, t1, t2, t3, t4    movdqa %1, [r0    ] ; line 0    movdqa %2, [r0+r1]  ; line 1    movdqa %3, %1    punpcklbw %1, xmm7    punpckhbw %3, xmm7    movdqa %4, %2    punpcklbw %4, xmm7    punpckhbw %2, xmm7    paddw %1, %4    paddw %2, %3    movdqa %3, [r0+r2]  ; line 2    movdqa %4, [r0+r3]  ; line 3    movdqa %5, %3    punpcklbw %3, xmm7    punpckhbw %5, xmm7    movdqa %6, %4    punpcklbw %6, xmm7    punpckhbw %4, xmm7    paddw %3, %6    paddw %4, %5    paddw %1, %3    ; block 0, 1    paddw %2, %4    ; block 2, 3    pshufd %3, %1, 0B1h    pshufd %4, %2, 0B1h    paddw %1, %3    paddw %2, %4    movdqa %3, %1    movdqa %4, %2    pshuflw %5, %1, 0B1h    pshufhw %6, %3, 0B1h    paddw %1, %5    paddw %3, %6    pshuflw %5, %2, 0B1h    pshufhw %6, %4, 0B1h    paddw %2, %5    paddw %4, %6    punpcklwd %1, %2    punpckhwd %3, %4    punpcklwd %1, %3    psraw %1, $04%endmacro %macro VAA_AVG_BLOCK_SSSE3 6 ; dst, t0, t1, t2, t3, t4    movdqa %1, [r0    ] ; line 0    movdqa %2, [r0+r1]  ; line 1    movdqa %3, %1    punpcklbw %1, xmm7    punpckhbw %3, xmm7    movdqa %4, %2    punpcklbw %4, xmm7    punpckhbw %2, xmm7    paddw %1, %4    paddw %2, %3    movdqa %3, [r0+r2]  ; line 2    movdqa %4, [r0+r3]  ; line 3    movdqa %5, %3    punpcklbw %3, xmm7    punpckhbw %5, xmm7    movdqa %6, %4    punpcklbw %6, xmm7    punpckhbw %4, xmm7    paddw %3, %6    paddw %4, %5    paddw %1, %3    ; block 0, 1    paddw %2, %4    ; block 2, 3    phaddw %1, %2   ; block[0]: 0-15, 16-31; block[1]: 32-47, 48-63; ..    phaddw %1, xmm7 ; block[0]: 0-15; block[1]: 16-31; block[2]: 32-47; block[3]: 48-63; ....    psraw %1, $04%endmacro   ;***********************************************************************; Code;*********************************************************************** SECTION .text ; , 6/7/2010 ;***********************************************************************;   int32_t AnalysisVaaInfoIntra_sse2(  uint8_t *pDataY, const int32_t iLineSize );;***********************************************************************WELS_EXTERN AnalysisVaaInfoIntra_sse2     %assign push_num 0    LOAD_2_PARA    PUSH_XMM 8    SIGN_EXTENSION r1,r1d %ifdef X86_32    push r3    push r4    push r5    push r6    %assign push_num push_num+4%endif     mov  r5,r7    and  r5,0fh    sub  r7,r5    sub  r7,32      mov r2,r1    sal r2,$01   ;r2 = 2*iLineSize    mov r3,r2    add r3,r1   ;r3 = 3*iLineSize     mov r4,r2    sal r4,$01   ;r4 = 4*iLineSize     pxor xmm7, xmm7     ; loops    VAA_AVG_BLOCK_SSE2 xmm0, xmm1, xmm2, xmm3, xmm4, xmm5    movq [r7], xmm0     lea r0, [r0+r4]    VAA_AVG_BLOCK_SSE2 xmm0, xmm1, xmm2, xmm3, xmm4, xmm5    movq [r7+8], xmm0     lea r0, [r0+r4]    VAA_AVG_BLOCK_SSE2 xmm0, xmm1, xmm2, xmm3, xmm4, xmm5    movq [r7+16], xmm0     lea r0, [r0+r4]    VAA_AVG_BLOCK_SSE2 xmm0, xmm1, xmm2, xmm3, xmm4, xmm5    movq [r7+24], xmm0     movdqa xmm0, [r7]       ; block 0~7    movdqa xmm1, [r7+16]    ; block 8~15    movdqa xmm2, xmm0    paddw xmm0, xmm1    SUM_WORD_8x2_SSE2 xmm0, xmm3     pmullw xmm1, xmm1    pmullw xmm2, xmm2    movdqa xmm3, xmm1    movdqa xmm4, xmm2    punpcklwd xmm1, xmm7    punpckhwd xmm3, xmm7    punpcklwd xmm2, xmm7    punpckhwd xmm4, xmm7    paddd xmm1, xmm2    paddd xmm3, xmm4    paddd xmm1, xmm3    pshufd xmm2, xmm1, 01Bh    paddd xmm1, xmm2    pshufd xmm2, xmm1, 0B1h    paddd xmm1, xmm2       movd r2d, xmm0    and r2, 0ffffh      ; effective low work truncated    mov r3, r2    imul r2, r3    sar r2, $04    movd retrd, xmm1    sub retrd, r2d     add r7,32    add r7,r5 %ifdef X86_32    pop r6    pop r5    pop r4    pop r3%endif    POP_XMM     ret ;***********************************************************************;   int32_t AnalysisVaaInfoIntra_ssse3( uint8_t *pDataY, const int32_t iLineSize );;***********************************************************************WELS_EXTERN AnalysisVaaInfoIntra_ssse3     %assign push_num 0    LOAD_2_PARA    PUSH_XMM 8    SIGN_EXTENSION r1,r1d %ifdef X86_32    push r3    push r4    push r5    push r6    %assign push_num push_num+4%endif     mov  r5,r7    and  r5,0fh    sub  r7,r5    sub  r7,32      mov r2,r1    sal r2,$01   ;r2 = 2*iLineSize    mov r3,r2    add r3,r1   ;r3 = 3*iLineSize     mov r4,r2    sal r4,$01   ;r4 = 4*iLineSize     pxor xmm7, xmm7     ; loops    VAA_AVG_BLOCK_SSSE3 xmm0, xmm1, xmm2, xmm3, xmm4, xmm5    movq [r7],xmm0     lea r0,[r0+r4]    VAA_AVG_BLOCK_SSSE3 xmm1, xmm2, xmm3, xmm4, xmm5, xmm6    movq [r7+8],xmm1      lea r0,[r0+r4]    VAA_AVG_BLOCK_SSSE3 xmm0, xmm1, xmm2, xmm3, xmm4, xmm5    movq [r7+16],xmm0     lea r0,[r0+r4]    VAA_AVG_BLOCK_SSSE3 xmm1, xmm2, xmm3, xmm4, xmm5, xmm6    movq [r7+24],xmm1      movdqa xmm0,[r7]    movdqa xmm1,[r7+16]    movdqa xmm2, xmm0    paddw xmm0, xmm1    SUM_WORD_8x2_SSE2 xmm0, xmm3    ; better performance than that of phaddw sets     pmullw xmm1, xmm1    pmullw xmm2, xmm2    movdqa xmm3, xmm1    movdqa xmm4, xmm2    punpcklwd xmm1, xmm7    punpckhwd xmm3, xmm7    punpcklwd xmm2, xmm7    punpckhwd xmm4, xmm7    paddd xmm1, xmm2    paddd xmm3, xmm4    paddd xmm1, xmm3    pshufd xmm2, xmm1, 01Bh    paddd xmm1, xmm2    pshufd xmm2, xmm1, 0B1h    paddd xmm1, xmm2      movd r2d, xmm0    and r2, 0ffffh          ; effective low work truncated    mov r3, r2    imul r2, r3    sar r2, $04    movd retrd, xmm1    sub retrd, r2d     add r7,32    add r7,r5%ifdef X86_32    pop r6    pop r5    pop r4    pop r3%endif    POP_XMM     ret ;***********************************************************************;   uint8_t MdInterAnalysisVaaInfo_sse41( int32_t *pSad8x8 );***********************************************************************WELS_EXTERN MdInterAnalysisVaaInfo_sse41    %assign push_num 0    LOAD_1_PARA    movdqa xmm0,[r0]    pshufd xmm1, xmm0, 01Bh    paddd xmm1, xmm0    pshufd xmm2, xmm1, 0B1h    paddd xmm1, xmm2    psrad xmm1, 02h     ; iAverageSad    movdqa xmm2, xmm1    psrad xmm2, 06h    movdqa xmm3, xmm0   ; iSadBlock    psrad xmm3, 06h    psubd xmm3, xmm2    pmulld xmm3, xmm3   ; [comment]: pmulld from SSE4.1 instruction sets    pshufd xmm4, xmm3, 01Bh    paddd xmm4, xmm3    pshufd xmm3, xmm4, 0B1h    paddd xmm3, xmm4    movd r0d, xmm3    cmp r0d, 20 ; INTER_VARIANCE_SAD_THRESHOLD     jb near .threshold_exit    pshufd xmm0, xmm0, 01Bh    pcmpgtd xmm0, xmm1  ; iSadBlock > iAverageSad    movmskps retrd, xmm0    ret.threshold_exit:    mov retrd, 15    ret ;***********************************************************************;   uint8_t MdInterAnalysisVaaInfo_sse2( int32_t *pSad8x8 );***********************************************************************WELS_EXTERN MdInterAnalysisVaaInfo_sse2    %assign push_num 0    LOAD_1_PARA    movdqa xmm0, [r0]    pshufd xmm1, xmm0, 01Bh    paddd xmm1, xmm0    pshufd xmm2, xmm1, 0B1h    paddd xmm1, xmm2    psrad xmm1, 02h     ; iAverageSad    movdqa xmm2, xmm1    psrad xmm2, 06h    movdqa xmm3, xmm0   ; iSadBlock    psrad xmm3, 06h    psubd xmm3, xmm2     ; to replace pmulld functionality as below    movdqa xmm2, xmm3    pmuludq xmm2, xmm3    pshufd xmm4, xmm3, 0B1h    pmuludq xmm4, xmm4    movdqa xmm5, xmm2    punpckldq xmm5, xmm4    punpckhdq xmm2, xmm4    punpcklqdq xmm5, xmm2     pshufd xmm4, xmm5, 01Bh    paddd xmm4, xmm5    pshufd xmm5, xmm4, 0B1h    paddd xmm5, xmm4     movd r0d, xmm5    cmp r0d, 20 ; INTER_VARIANCE_SAD_THRESHOLD    jb near .threshold_exit    pshufd xmm0, xmm0, 01Bh    pcmpgtd xmm0, xmm1  ; iSadBlock > iAverageSad    movmskps retrd, xmm0    ret.threshold_exit:    mov retrd, 15    ret

Keyboard shortcuts

General

Show keyboard shortcuts
?
Focus the current search
/

Issues and pull requests

Open filters
f

Issues, pull requests and Inbox

Select next item
j↓
Select previous item
k↑
Open selected item
Enter
Dismiss filters or clear selection
Esc

Repository code

Go to file
t