363 lines · 10.9 KB · Assembly
RawDownload
;*!;* \copy;*     Copyright (c)  2009-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.;*;*;*  score.asm;*;*  Abstract;*      scan/score/count of sse2;*;*  History;*      8/21/2009 Created;*;*;*************************************************************************/ %include "asm_inc.asm" ;***********************************************************************; Macros;*********************************************************************** ;***********************************************************************; Local Data (Read Only);***********************************************************************%ifdef X86_32_PICASMSECTION .text align=16%elseSECTION .rodata align=16%endif ;align 16;se2_2 dw 2, 2, 2, 2, 2, 2, 2, 2align 16sse2_1: dw 1, 1, 1, 1, 1, 1, 1, 1align 16sse2_b1: db 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1i_ds_table: db 3, 2, 2, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0align 16sse2_plane_inc_minus: dw -7, -6, -5, -4, -3, -2, -1, 0align 16sse2_plane_inc: dw 1, 2, 3, 4, 5, 6, 7, 8align 16sse2_plane_dec: dw 8, 7, 6, 5, 4, 3, 2, 1align 16pb_scanacdc_maska:db 0,1,2,3,8,9,14,15,10,11,4,5,6,7,12,13align 16pb_scanacdc_maskb:db 2,3,8,9,10,11,4,5,0,1,6,7,12,13,14,15align 16pb_scandc_maska:db 2,3,8,9,14,15,10,11,4,5,6,7,12,13,0,1align 16pb_scandc_maskb:db 8,9,10,11,4,5,0,1,6,7,12,13,14,15,128,128 align 16nozero_count_table:db  0,1,1,2,1,2,2,3,1,2db  2,3,2,3,3,4,1,2,2,3db  2,3,3,4,2,3,3,4,3,4db  4,5,1,2,2,3,2,3,3,4db  2,3,3,4,3,4,4,5,2,3db  3,4,3,4,4,5,3,4,4,5db  4,5,5,6,1,2,2,3,2,3db  3,4,2,3,3,4,3,4,4,5db  2,3,3,4,3,4,4,5,3,4db  4,5,4,5,5,6,2,3,3,4db  3,4,4,5,3,4,4,5,4,5db  5,6,3,4,4,5,4,5,5,6db  4,5,5,6,5,6,6,7,1,2db  2,3,2,3,3,4,2,3,3,4db  3,4,4,5,2,3,3,4,3,4db  4,5,3,4,4,5,4,5,5,6db  2,3,3,4,3,4,4,5,3,4db  4,5,4,5,5,6,3,4,4,5db  4,5,5,6,4,5,5,6,5,6db  6,7,2,3,3,4,3,4,4,5db  3,4,4,5,4,5,5,6,3,4db  4,5,4,5,5,6,4,5,5,6db  5,6,6,7,3,4,4,5,4,5db  5,6,4,5,5,6,5,6,6,7db  4,5,5,6,5,6,6,7,5,6db  6,7,6,7,7,8 align 16high_mask_table:    db  0, 0, 0, 3, 0, 2, 3, 6, 0, 2    db  2, 5, 3, 5, 6, 9, 0, 1, 2, 5    db  2, 4, 5, 8, 3, 5, 5, 8, 6, 8    db  9,12, 0, 1, 1, 4, 2, 4, 5, 8    db  2, 4, 4, 7, 5, 7, 8,11, 3, 4    db  5, 8, 5, 7, 8,11, 6, 8, 8,11    db  9,11,12,15, 0, 1, 1, 4, 1, 3    db  4, 7, 2, 4, 4, 7, 5, 7, 8,11    db  2, 3, 4, 7, 4, 6, 7,10, 5, 7    db  7,10, 8,10,11,14, 3, 4, 4, 7    db  5, 7, 8,11, 5, 7, 7,10, 8,10    db 11,14, 6, 7, 8,11, 8,10,11,14    db  9,11,11,14,12,14,15,18, 0, 0    db  1, 4, 1, 3, 4, 7, 1, 3, 3, 6    db  4, 6, 7,10, 2, 3, 4, 7, 4, 6    db  7,10, 5, 7, 7,10, 8,10,11,14    db  2, 3, 3, 6, 4, 6, 7,10, 4, 6    db  6, 9, 7, 9,10,13, 5, 6, 7,10    db  7, 9,10,13, 8,10,10,13,11,13    db 14,17, 3, 4, 4, 7, 4, 6, 7,10    db  5, 7, 7,10, 8,10,11,14, 5, 6    db  7,10, 7, 9,10,13, 8,10,10,13    db 11,13,14,17, 6, 7, 7,10, 8,10    db 11,14, 8,10,10,13,11,13,14,17    db  9,10,11,14,11,13,14,17,12,14    db 14,17,15,17,18,21 align 16low_mask_table:    db  0, 3, 2, 6, 2, 5, 5, 9, 1, 5    db  4, 8, 5, 8, 8,12, 1, 4, 4, 8    db  4, 7, 7,11, 4, 8, 7,11, 8,11    db 11,15, 1, 4, 3, 7, 4, 7, 7,11    db  3, 7, 6,10, 7,10,10,14, 4, 7    db  7,11, 7,10,10,14, 7,11,10,14    db 11,14,14,18, 0, 4, 3, 7, 3, 6    db  6,10, 3, 7, 6,10, 7,10,10,14    db  3, 6, 6,10, 6, 9, 9,13, 6,10    db  9,13,10,13,13,17, 4, 7, 6,10    db  7,10,10,14, 6,10, 9,13,10,13    db 13,17, 7,10,10,14,10,13,13,17    db 10,14,13,17,14,17,17,21, 0, 3    db  3, 7, 3, 6, 6,10, 2, 6, 5, 9    db  6, 9, 9,13, 3, 6, 6,10, 6, 9    db  9,13, 6,10, 9,13,10,13,13,17    db  3, 6, 5, 9, 6, 9, 9,13, 5, 9    db  8,12, 9,12,12,16, 6, 9, 9,13    db  9,12,12,16, 9,13,12,16,13,16    db 16,20, 3, 7, 6,10, 6, 9, 9,13    db  6,10, 9,13,10,13,13,17, 6, 9    db  9,13, 9,12,12,16, 9,13,12,16    db 13,16,16,20, 7,10, 9,13,10,13    db 13,17, 9,13,12,16,13,16,16,20    db 10,13,13,17,13,16,16,20,13,17    db 16,20,17,20,20,24  SECTION .text ;***********************************************************************;void WelsScan4x4DcAc_sse2( int16_t level[16], int16_t *pDct );***********************************************************************WELS_EXTERN WelsScan4x4DcAc_sse2    %ifdef X86_32    push r3    %assign push_num 1    %else    %assign push_num 0    %endif    LOAD_2_PARA    movdqa     xmm0, [r1]           ; 7 6 5 4 3 2 1 0    movdqa     xmm1, [r1+16]        ; f e d c b a 9 8    pextrw     r2d, xmm0, 7         ; ecx = 7    pextrw     r3d, xmm1, 2         ; edx = a    pextrw     r1d, xmm0, 5         ; eax = 5    pinsrw     xmm1, r2d, 2         ; f e d c b 7 9 8    pinsrw     xmm0, r1d, 7         ; 5 6 5 4 3 2 1 0    pextrw     r2d, xmm1, 0         ; ecx = 8    pinsrw     xmm0, r2d, 5         ; 5 6 8 4 3 2 1 0    pinsrw     xmm1, r3d, 0         ; f e d c b 7 9 a    pshufd     xmm2, xmm0, 0xd8     ; 5 6 3 2 8 4 1 0    pshufd     xmm3, xmm1, 0xd8     ; f e b 7 d c 9 a    pshufhw    xmm0, xmm2, 0x93     ; 6 3 2 5 8 4 1 0    pshuflw    xmm1, xmm3, 0x39     ; f e b 7 a d c 9    movdqa     [r0],xmm0    movdqa     [r0+16], xmm1    %ifdef X86_32    pop r3    %endif    ret ;***********************************************************************;void WelsScan4x4DcAc_ssse3( int16_t level[16], int16_t *pDct );***********************************************************************WELS_EXTERN WelsScan4x4DcAc_ssse3    %assign push_num 0    INIT_X86_32_PIC r3    LOAD_2_PARA    movdqa     xmm0, [r1]    movdqa     xmm1, [r1+16]    pextrw      r2d,  xmm0, 7           ; ecx = [7]    pextrw      r1d,  xmm1, 0           ; eax = [8]    pinsrw      xmm0, r1d, 7            ; xmm0[7]   =   [8]    pinsrw      xmm1, r2d, 0            ; xmm1[0]   =   [7]    pshufb      xmm1, [pic(pb_scanacdc_maskb)]    pshufb      xmm0, [pic(pb_scanacdc_maska)]     movdqa     [r0],xmm0    movdqa     [r0+16], xmm1    DEINIT_X86_32_PIC    ret;***********************************************************************;void WelsScan4x4Ac_sse2( int16_t* zig_value, int16_t* pDct );***********************************************************************WELS_EXTERN WelsScan4x4Ac_sse2    %assign push_num 0    LOAD_2_PARA    movdqa     xmm0, [r1]    movdqa     xmm1, [r1+16]    movdqa     xmm2, xmm0    punpcklqdq xmm0, xmm1    punpckhqdq xmm2, xmm1     movdqa     xmm3, xmm0    punpckldq  xmm0, xmm2    punpckhdq  xmm3, xmm2    pextrw     r1d , xmm0, 3    pextrw     r2d , xmm0, 7    pinsrw     xmm0, r1d,  7    pextrw     r1d,  xmm3, 4    pinsrw     xmm3, r2d,  4    pextrw     r2d,  xmm3, 0    pinsrw     xmm3, r1d,  0    pinsrw     xmm0, r2d,  3     pshufhw    xmm1, xmm0, 0x93    pshuflw    xmm2, xmm3, 0x39     movdqa     xmm3, xmm2    psrldq     xmm1, 2    pslldq     xmm3, 14    por        xmm1, xmm3    psrldq     xmm2, 2    movdqa     [r0],xmm1    movdqa     [r0+16], xmm2    ret  ;***********************************************************************;void int32_t WelsCalculateSingleCtr4x4_sse2( int16_t *pDct );;***********************************************************************WELS_EXTERN WelsCalculateSingleCtr4x4_sse2    %ifdef X86_32    push r3    %assign push_num 1    %else    %assign push_num 0    %endif    INIT_X86_32_PIC r4    LOAD_1_PARA    movdqa    xmm0, [r0]    movdqa    xmm1, [r0+16]     packsswb  xmm0, xmm1    ; below is the register map: r0 - eax, r1 - ebx, r2 - ecx, r3 - edx    xor r3, r3    pxor      xmm3, xmm3    pcmpeqb   xmm0, xmm3    pmovmskb  r3d,  xmm0     xor       r3,  0xffff     xor       r0,  r0    mov       r2,  7    mov       r1,  8.loop_low8_find1:    bt        r3,  r2    jc        .loop_high8_find1    dec       r2    jnz      .loop_low8_find1.loop_high8_find1:    bt        r3, r1    jc        .find1end    inc       r1    cmp       r1,16    jb        .loop_high8_find1.find1end:    sub       r1, r2    sub       r1, 1    lea   r2,  [pic(i_ds_table)]    add       r0b,  [r2+r1]    mov       r1, r3    and       r3, 0xff    shr       r1, 8    and       r1, 0xff    lea   r2 , [pic(low_mask_table)]    add       r0b,  [r2 +r3]    lea   r2, [pic(high_mask_table)]    add       r0b,  [r2+r1]    DEINIT_X86_32_PIC    %ifdef X86_32    pop r3    %else    mov retrd, r0d    %endif    ret  ;***********************************************************************; int32_t WelsGetNoneZeroCount_sse2(int16_t* level);;***********************************************************************WELS_EXTERN WelsGetNoneZeroCount_sse2    %assign push_num 0    INIT_X86_32_PIC r3    LOAD_1_PARA    movdqa    xmm0, [r0]    movdqa    xmm1, [r0+16]    pxor      xmm2, xmm2    pcmpeqw   xmm0, xmm2    pcmpeqw   xmm1, xmm2    packsswb  xmm1, xmm0    xor r1, r1    pmovmskb  r1d,  xmm1    xor       r1d,  0xffff    mov       r2,  r1    and       r1,  0xff    shr       r2,  8;   and       ecx,  0xff    ; we do not need this due to high 16bits equal to 0 yet;   xor       retr,  retr    ;add       al,  [nozero_count_table+r2]    lea       r0 , [pic(nozero_count_table)]    movzx     r2, byte [r0+r2]    movzx     r1,   byte [r0+r1]    mov   retrq, r2    add   retrq, r1    ;add       al,  [nozero_count_table+r1]    DEINIT_X86_32_PIC    ret ;***********************************************************************; int32_t WelsGetNoneZeroCount_sse42(int16_t* level);;***********************************************************************WELS_EXTERN WelsGetNoneZeroCount_sse42    %assign push_num 0    LOAD_1_PARA    movdqa          xmm0, [r0]    packsswb        xmm0, [r0 + 16]    pxor            xmm1, xmm1    pcmpeqb         xmm0, xmm1    pmovmskb        retrd, xmm0    xor             retrd, 0FFFFh    popcnt          retrd, retrd    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