;*!;* \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 0Lines 1–500 of 1456. Load more
;*! ;* \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_PICASM SECTION .text align=16 %else SECTION .rodata align=16 %endif align 16 sse2_plane_inc_minus dw -7, -6, -5, -4, -3, -2, -1, 0 align 16 sse2_plane_inc dw 1, 2, 3, 4, 5, 6, 7, 8 align 16 sse2_plane_dec dw 8, 7, 6, 5, 4, 3, 2, 1 ; for chroma plane mode sse2_plane_inc_c dw 1, 2, 3, 4 sse2_plane_dec_c dw 4, 3, 2, 1 align 16 sse2_plane_mul_b_c dw -3, -2, -1, 0, 1, 2, 3, 4 align 16 mmx_01bytes: times 16 db 1 align 16 mmx_0x02: dw 0x02, 0x00, 0x00, 0x00 align 16 sse2_dc_0x80: times 16 db 0x80 align 16 sse2_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