1456 lines · 41.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.;*;*;*  intra_pred.asm;*;*  Abstract;*      sse2 and mmx function for intra predict operations(decoder);*;*  History;*      18/09/2009 Created;*      19/11/2010 Added;*                  WelsDecoderI16x16LumaPredDcTop_sse2, WelsDecoderI16x16LumaPredDcNA_sse2,;*                  WelsDecoderIChromaPredDcLeft_mmx, WelsDecoderIChromaPredDcTop_sse2;*                  and WelsDecoderIChromaPredDcNA_mmx;*;*;*************************************************************************/ %include "asm_inc.asm";*******************************************************************************; Local Data (Read Only);******************************************************************************* %ifdef X86_32_PICASMSECTION .text align=16%elseSECTION .rodata align=16%endif align 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, 1 ; for chroma plane modesse2_plane_inc_c dw 1, 2, 3, 4sse2_plane_dec_c dw 4, 3, 2, 1align 16sse2_plane_mul_b_c dw -3, -2, -1, 0, 1, 2, 3, 4 align 16mmx_01bytes:        times 16    db 1 align 16mmx_0x02: dw 0x02, 0x00, 0x00, 0x00 align 16sse2_dc_0x80: times 16 db 0x80align 16sse2_wd_0x02: times 8 dw 0x02 ;*******************************************************************************; macros;*******************************************************************************;xmm0, xmm1, xmm2, eax, ecx;lower 64 bits of xmm0 save the result%macro SSE2_PRED_H_4X4_TWO_LINE 5    movd        %1, [%4-1]    movdqa      %3, %1    punpcklbw   %1, %3    movdqa      %3, %1    punpcklbw   %1, %3     ;add            %4, %5    movd        %2, [%4+%5-1]    movdqa      %3, %2    punpcklbw   %2, %3    movdqa      %3, %2    punpcklbw   %2, %3    punpckldq   %1, %2%endmacro  %macro LOAD_COLUMN 6    movd    %1, [%5]    movd    %2, [%5+%6]    punpcklbw %1,   %2    lea     %5, [%5+2*%6]    movd    %3, [%5]    movd    %2, [%5+%6]    punpcklbw %3,   %2    punpcklwd %1,   %3    lea     %5, [%5+2*%6]    movd    %4, [%5]    movd    %2, [%5+%6]    punpcklbw %4,   %2    lea     %5, [%5+2*%6]    movd    %3, [%5]    movd    %2, [%5+%6]    lea     %5, [%5+2*%6]    punpcklbw %3,   %2    punpcklwd %4,   %3    punpckhdq %1,   %4%endmacro %macro SUMW_HORIZON 3    movhlps     %2, %1          ; x2 = xx xx xx xx d7 d6 d5 d4    paddw       %1, %2          ; x1 = xx xx xx xx d37 d26 d15 d04    punpcklwd   %1, %3          ; x1 =  d37  d26 d15 d04    movhlps     %2, %1          ; x2 = xxxx xxxx d37 d26    paddd       %1, %2          ; x1 = xxxx xxxx d1357 d0246    pshuflw     %2, %1, 0x4e    ; x2 = xxxx xxxx d0246 d1357    paddd       %1, %2          ; x1 = xxxx xxxx xxxx  d01234567%endmacro %macro COPY_16_TIMES 2    movdqa      %2, [%1-16]    psrldq      %2, 15    pmuludq     %2, [pic(mmx_01bytes)]    pshufd      %2, %2, 0%endmacro %macro COPY_16_TIMESS 3    movdqa      %2, [%1+%3-16]    psrldq      %2, 15    pmuludq     %2, [pic(mmx_01bytes)]    pshufd      %2, %2, 0%endmacro %macro LOAD_COLUMN_C 6    movd    %1, [%5]    movd    %2, [%5+%6]    punpcklbw %1,%2    lea     %5, [%5+2*%6]    movd    %3, [%5]    movd    %2, [%5+%6]    punpcklbw %3,   %2    punpckhwd %1,   %3    lea     %5, [%5+2*%6]%endmacro %macro LOAD_2_LEFT_AND_ADD 0    lea         r0, [r0+2*r1]    movzx       r3, byte [r0-0x01]    add         r2, r3    movzx       r3, byte [r0+r1-0x01]    add         r2, r3%endmacro ;*******************************************************************************; Code;******************************************************************************* SECTION .text  ;*******************************************************************************;   void WelsDecoderI4x4LumaPredH_sse2(uint8_t *pPred, const int32_t kiStride);;   pPred must align to 16;*******************************************************************************WELS_EXTERN WelsDecoderI4x4LumaPredH_sse2    %assign push_num 0    INIT_X86_32_PIC r3    LOAD_2_PARA    SIGN_EXTENSION r1, r1d     movzx       r2, byte [r0-1]    movd        xmm0,   r2d    pmuludq     xmm0,   [pic(mmx_01bytes)]     movzx       r2, byte [r0+r1-1]    movd        xmm1,   r2d    pmuludq     xmm1,   [pic(mmx_01bytes)]     lea         r0, [r0+r1]    movzx       r2, byte [r0+r1-1]    movd        xmm2,   r2d    pmuludq     xmm2,   [pic(mmx_01bytes)]     movzx       r2, byte [r0+2*r1-1]    movd        xmm3,   r2d    pmuludq     xmm3,   [pic(mmx_01bytes)]     sub         r0,    r1    movd        [r0], xmm0    movd        [r0+r1], xmm1    lea         r0, [r0+2*r1]    movd        [r0], xmm2    movd        [r0+r1], xmm3     DEINIT_X86_32_PIC    ret ;*******************************************************************************; void WelsDecoderI16x16LumaPredPlane_sse2(uint8_t *pPred, const int32_t kiStride);;*******************************************************************************WELS_EXTERN WelsDecoderI16x16LumaPredPlane_sse2    push r3    push r4    %assign push_num 2    INIT_X86_32_PIC r5    LOAD_2_PARA    PUSH_XMM 8    SIGN_EXTENSION r1, r1d    mov r4, r0 ; save r0 in r4    sub     r0, 1    sub     r0, r1     ;for H    pxor    xmm7,   xmm7    movq    xmm0,   [r0]    movdqa  xmm5,   [pic(sse2_plane_dec)]    punpcklbw xmm0, xmm7    pmullw  xmm0,   xmm5    movq    xmm1,   [r0 + 9]    movdqa  xmm6,   [pic(sse2_plane_inc)]    punpcklbw xmm1, xmm7    pmullw  xmm1,   xmm6    psubw   xmm1,   xmm0     SUMW_HORIZON    xmm1,xmm0,xmm2    movd    r2d,    xmm1        ; H += (i + 1) * (top[8 + i] - top[6 - i]);    movsx   r2, r2w    imul    r2, 5    add     r2, 32    sar     r2, 6           ; b = (5 * H + 32) >> 6;    SSE2_Copy8Times xmm1, r2d   ; xmm1 = b,b,b,b,b,b,b,b     movzx   r3, BYTE [r0+16]    sub r0, 3    LOAD_COLUMN     xmm0, xmm2, xmm3, xmm4, r0, r1     add     r0, 3    movzx   r2, BYTE [r0+8*r1]    add     r3, r2    shl     r3, 4           ;   a = (left[15*kiStride] + top[15]) << 4;     sub r0, 3    add     r0, r1    LOAD_COLUMN     xmm7, xmm2, xmm3, xmm4, r0, r1    pxor    xmm4,   xmm4    punpckhbw xmm0, xmm4    pmullw  xmm0,   xmm5    punpckhbw xmm7, xmm4    pmullw  xmm7,   xmm6    psubw   xmm7,   xmm0     ; Indicate that xmm2 is fully initialized. Its actual value doesn't    ; matter in SUMW_HORIZON below, but after being used in LOAD_COLUMN above,    ; valgrind thinks that xmm2 contains uninitalized data (if the columns outside    ; of the left are uninitialized, such as in DecUT_IntraPrediction), which taints    ; r2d below, even if actually isn't based on the uninitialized data.    pxor xmm2, xmm2     SUMW_HORIZON   xmm7,xmm0,xmm2    movd    r2d,   xmm7         ; V    movsx   r2, r2w     imul    r2, 5    add     r2, 32    sar     r2, 6               ; c = (5 * V + 32) >> 6;    SSE2_Copy8Times xmm4, r2d       ; xmm4 = c,c,c,c,c,c,c,c     mov r0, r4    add     r3, 16    imul    r2, -7    add     r3, r2      ; s = a + 16 + (-7)*c    SSE2_Copy8Times xmm0, r3d       ; xmm0 = s,s,s,s,s,s,s,s     xor     r2, r2    movdqa  xmm5,   [pic(sse2_plane_inc_minus)] get_i16x16_luma_pred_plane_sse2_1:    movdqa  xmm2,   xmm1    pmullw  xmm2,   xmm5    paddw   xmm2,   xmm0    psraw   xmm2,   5    movdqa  xmm3,   xmm1    pmullw  xmm3,   xmm6    paddw   xmm3,   xmm0    psraw   xmm3,   5    packuswb xmm2,  xmm3    movdqa  [r0],   xmm2    paddw   xmm0,   xmm4    add     r0, r1    inc     r2    cmp     r2, 16    jnz get_i16x16_luma_pred_plane_sse2_1     POP_XMM    DEINIT_X86_32_PIC    pop r4    pop r3    ret   ;*******************************************************************************; void WelsDecoderI16x16LumaPredH_sse2(uint8_t *pPred, const int32_t kiStride);;******************************************************************************* %macro SSE2_PRED_H_16X16_TWO_LINE_DEC 2    lea     %1, [%1+%2*2]     COPY_16_TIMES %1,   xmm0    movdqa  [%1],   xmm0    COPY_16_TIMESS %1,  xmm0,   %2    movdqa  [%1+%2],    xmm0%endmacro WELS_EXTERN WelsDecoderI16x16LumaPredH_sse2    %assign push_num 0    INIT_X86_32_PIC_NOPRESERVE r2    LOAD_2_PARA    SIGN_EXTENSION r1, r1d     COPY_16_TIMES r0,   xmm0    movdqa  [r0],       xmm0    COPY_16_TIMESS r0,  xmm0,   r1    movdqa  [r0+r1],    xmm0     SSE2_PRED_H_16X16_TWO_LINE_DEC r0, r1    SSE2_PRED_H_16X16_TWO_LINE_DEC r0, r1    SSE2_PRED_H_16X16_TWO_LINE_DEC r0, r1    SSE2_PRED_H_16X16_TWO_LINE_DEC r0, r1    SSE2_PRED_H_16X16_TWO_LINE_DEC r0, r1    SSE2_PRED_H_16X16_TWO_LINE_DEC r0, r1    SSE2_PRED_H_16X16_TWO_LINE_DEC r0, r1     DEINIT_X86_32_PIC    ret ;*******************************************************************************; void WelsDecoderI16x16LumaPredV_sse2(uint8_t *pPred, const int32_t kiStride);;*******************************************************************************WELS_EXTERN WelsDecoderI16x16LumaPredV_sse2    %assign push_num 0    LOAD_2_PARA    SIGN_EXTENSION r1, r1d     sub     r0, r1    movdqa  xmm0, [r0]     movdqa  [r0+r1], xmm0    lea     r0, [r0+2*r1]    movdqa  [r0],     xmm0    movdqa  [r0+r1], xmm0    lea     r0, [r0+2*r1]    movdqa  [r0],     xmm0    movdqa  [r0+r1], xmm0    lea     r0, [r0+2*r1]    movdqa  [r0],     xmm0    movdqa  [r0+r1], xmm0    lea     r0, [r0+2*r1]    movdqa  [r0],     xmm0    movdqa  [r0+r1], xmm0    lea     r0, [r0+2*r1]    movdqa  [r0],     xmm0    movdqa  [r0+r1], xmm0    lea     r0, [r0+2*r1]    movdqa  [r0],     xmm0    movdqa  [r0+r1], xmm0    lea     r0, [r0+2*r1]    movdqa  [r0],     xmm0    movdqa  [r0+r1], xmm0    lea     r0, [r0+2*r1]    movdqa  [r0],     xmm0     ret ;*******************************************************************************; void WelsDecoderIChromaPredPlane_sse2(uint8_t *pPred, const int32_t kiStride);;*******************************************************************************WELS_EXTERN WelsDecoderIChromaPredPlane_sse2    push r3    push r4    %assign push_num 2    INIT_X86_32_PIC r5    LOAD_2_PARA    PUSH_XMM 8    SIGN_EXTENSION r1, r1d    mov r4, r0    sub     r0, 1    sub     r0, r1     pxor    mm7,    mm7    movq    mm0,    [r0]    movq    mm5,    [pic(sse2_plane_dec_c)]    punpcklbw mm0,  mm7    pmullw  mm0,    mm5    movq    mm1,    [r0 + 5]    movq    mm6,    [pic(sse2_plane_inc_c)]    punpcklbw mm1,  mm7    pmullw  mm1,    mm6    psubw   mm1,    mm0     movq2dq xmm1,   mm1    pxor    xmm2,   xmm2    SUMW_HORIZON    xmm1,xmm0,xmm2    movd    r2d,    xmm1    movsx   r2, r2w    imul    r2, 17    add     r2, 16    sar     r2, 5           ; b = (17 * H + 16) >> 5;    SSE2_Copy8Times xmm1, r2d   ; mm1 = b,b,b,b,b,b,b,b     movzx   r3, BYTE [r0+8]    sub r0, 3    LOAD_COLUMN_C   mm0, mm2, mm3, mm4, r0, r1     add     r0, 3    movzx   r2, BYTE [r0+4*r1]    add     r3, r2    shl     r3, 4           ; a = (left[7*kiStride] + top[7]) << 4;     sub r0, 3    add     r0, r1    LOAD_COLUMN_C   mm7, mm2, mm3, mm4, r0, r1    pxor    mm4,    mm4    punpckhbw mm0,  mm4    pmullw  mm0,    mm5    punpckhbw mm7,  mm4    pmullw  mm7,    mm6    psubw   mm7,    mm0     movq2dq xmm7,   mm7    pxor    xmm2,   xmm2    SUMW_HORIZON    xmm7,xmm0,xmm2    movd    r2d,    xmm7            ; V    movsx   r2, r2w     imul    r2, 17    add     r2, 16    sar     r2, 5               ; c = (17 * V + 16) >> 5;    SSE2_Copy8Times xmm4, r2d       ; mm4 = c,c,c,c,c,c,c,c     mov     r0, r4    add     r3, 16    imul    r2, -3    add     r3, r2              ; s = a + 16 + (-3)*c    SSE2_Copy8Times xmm0, r3d       ; xmm0 = s,s,s,s,s,s,s,s     xor     r2, r2    movdqa  xmm5,   [pic(sse2_plane_mul_b_c)] get_i_chroma_pred_plane_sse2_1:    movdqa  xmm2,   xmm1    pmullw  xmm2,   xmm5    paddw   xmm2,   xmm0    psraw   xmm2,   5    packuswb xmm2,  xmm2    movq    [r0],   xmm2    paddw   xmm0,   xmm4    add     r0, r1    inc     r2    cmp     r2, 8    jnz get_i_chroma_pred_plane_sse2_1     POP_XMM    DEINIT_X86_32_PIC    pop r4    pop r3    WELSEMMS    ret ;*******************************************************************************;   0 |1 |2 |3 |4 |;   6 |7 |8 |9 |10|;   11|12|13|14|15|;   16|17|18|19|20|;   21|22|23|24|25|;   7 is the start pixel of current 4x4 block;   pPred[7] = ([6]+[0]*2+[1]+2)/4;;   void WelsDecoderI4x4LumaPredDDR_mmx(uint8_t *pPred, const int32_t kiStride);;*******************************************************************************WELS_EXTERN WelsDecoderI4x4LumaPredDDR_mmx    %assign push_num 0

Lines 1–500 of 1456.

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