⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 sad-a.asm

📁 从服务器上下的x264编码器C源码……希望对大家有帮助……这个是09年4月的
💻 ASM
📖 第 1 页 / 共 3 页
字号:
;*****************************************************************************;* sad-a.asm: h264 encoder library;*****************************************************************************;* Copyright (C) 2003-2008 x264 project;*;* Authors: Loren Merritt <lorenm@u.washington.edu>;*          Jason Garrett-Glaser <darkshikari@gmail.com>;*          Laurent Aimar <fenrir@via.ecp.fr>;*          Alex Izvorski <aizvorksi@gmail.com>;*;* 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., 51 Franklin Street, Fifth Floor, Boston, MA  02111, USA.;*****************************************************************************%include "x86inc.asm"%include "x86util.asm"SECTION_RODATApb_3: times 16 db 3pw_8: times 4 dw 8pb_shuf8x8c0: db 0,0,0,0,2,2,2,2pb_shuf8x8c1: db 4,4,4,4,6,6,6,6sw_64: dd 64SECTION .text;=============================================================================; SAD MMX;=============================================================================%macro SAD_INC_2x16P 0    movq    mm1,    [r0]    movq    mm2,    [r0+8]    movq    mm3,    [r0+r1]    movq    mm4,    [r0+r1+8]    psadbw  mm1,    [r2]    psadbw  mm2,    [r2+8]    psadbw  mm3,    [r2+r3]    psadbw  mm4,    [r2+r3+8]    lea     r0,     [r0+2*r1]    paddw   mm1,    mm2    paddw   mm3,    mm4    lea     r2,     [r2+2*r3]    paddw   mm0,    mm1    paddw   mm0,    mm3%endmacro%macro SAD_INC_2x8P 0    movq    mm1,    [r0]    movq    mm2,    [r0+r1]    psadbw  mm1,    [r2]    psadbw  mm2,    [r2+r3]    lea     r0,     [r0+2*r1]    paddw   mm0,    mm1    paddw   mm0,    mm2    lea     r2,     [r2+2*r3]%endmacro%macro SAD_INC_2x4P 0    movd    mm1,    [r0]    movd    mm2,    [r2]    punpckldq mm1,  [r0+r1]    punpckldq mm2,  [r2+r3]    psadbw  mm1,    mm2    paddw   mm0,    mm1    lea     r0,     [r0+2*r1]    lea     r2,     [r2+2*r3]%endmacro;-----------------------------------------------------------------------------; int x264_pixel_sad_16x16_mmxext (uint8_t *, int, uint8_t *, int );-----------------------------------------------------------------------------%macro SAD 2cglobal x264_pixel_sad_%1x%2_mmxext, 4,4    pxor    mm0, mm0%rep %2/2    SAD_INC_2x%1P%endrep    movd    eax, mm0    RET%endmacroSAD 16, 16SAD 16,  8SAD  8, 16SAD  8,  8SAD  8,  4SAD  4,  8SAD  4,  4;=============================================================================; SAD XMM;=============================================================================%macro SAD_END_SSE2 0    movhlps m1, m0    paddw   m0, m1    movd   eax, m0    RET%endmacro%macro SAD_W16 1;-----------------------------------------------------------------------------; int x264_pixel_sad_16x16_sse2 (uint8_t *, int, uint8_t *, int );-----------------------------------------------------------------------------cglobal x264_pixel_sad_16x16_%1, 4,4,8    movdqu  m0, [r2]    movdqu  m1, [r2+r3]    lea     r2, [r2+2*r3]    movdqu  m2, [r2]    movdqu  m3, [r2+r3]    lea     r2, [r2+2*r3]    psadbw  m0, [r0]    psadbw  m1, [r0+r1]    lea     r0, [r0+2*r1]    movdqu  m4, [r2]    paddw   m0, m1    psadbw  m2, [r0]    psadbw  m3, [r0+r1]    lea     r0, [r0+2*r1]    movdqu  m5, [r2+r3]    lea     r2, [r2+2*r3]    paddw   m2, m3    movdqu  m6, [r2]    movdqu  m7, [r2+r3]    lea     r2, [r2+2*r3]    paddw   m0, m2    psadbw  m4, [r0]    psadbw  m5, [r0+r1]    lea     r0, [r0+2*r1]    movdqu  m1, [r2]    paddw   m4, m5    psadbw  m6, [r0]    psadbw  m7, [r0+r1]    lea     r0, [r0+2*r1]    movdqu  m2, [r2+r3]    lea     r2, [r2+2*r3]    paddw   m6, m7    movdqu  m3, [r2]    paddw   m0, m4    movdqu  m4, [r2+r3]    lea     r2, [r2+2*r3]    paddw   m0, m6    psadbw  m1, [r0]    psadbw  m2, [r0+r1]    lea     r0, [r0+2*r1]    movdqu  m5, [r2]    paddw   m1, m2    psadbw  m3, [r0]    psadbw  m4, [r0+r1]    lea     r0, [r0+2*r1]    movdqu  m6, [r2+r3]    lea     r2, [r2+2*r3]    paddw   m3, m4    movdqu  m7, [r2]    paddw   m0, m1    movdqu  m1, [r2+r3]    paddw   m0, m3    psadbw  m5, [r0]    psadbw  m6, [r0+r1]    lea     r0, [r0+2*r1]    paddw   m5, m6    psadbw  m7, [r0]    psadbw  m1, [r0+r1]    paddw   m7, m1    paddw   m0, m5    paddw   m0, m7    SAD_END_SSE2;-----------------------------------------------------------------------------; int x264_pixel_sad_16x8_sse2 (uint8_t *, int, uint8_t *, int );-----------------------------------------------------------------------------cglobal x264_pixel_sad_16x8_%1, 4,4    movdqu  m0, [r2]    movdqu  m2, [r2+r3]    lea     r2, [r2+2*r3]    movdqu  m3, [r2]    movdqu  m4, [r2+r3]    psadbw  m0, [r0]    psadbw  m2, [r0+r1]    lea     r0, [r0+2*r1]    psadbw  m3, [r0]    psadbw  m4, [r0+r1]    lea     r0, [r0+2*r1]    lea     r2, [r2+2*r3]    paddw   m0, m2    paddw   m3, m4    paddw   m0, m3    movdqu  m1, [r2]    movdqu  m2, [r2+r3]    lea     r2, [r2+2*r3]    movdqu  m3, [r2]    movdqu  m4, [r2+r3]    psadbw  m1, [r0]    psadbw  m2, [r0+r1]    lea     r0, [r0+2*r1]    psadbw  m3, [r0]    psadbw  m4, [r0+r1]    lea     r0, [r0+2*r1]    lea     r2, [r2+2*r3]    paddw   m1, m2    paddw   m3, m4    paddw   m0, m1    paddw   m0, m3    SAD_END_SSE2%endmacroINIT_XMMSAD_W16 sse2%define movdqu lddquSAD_W16 sse3%define movdqu movdqaSAD_W16 sse2_aligned%undef movdqu%macro SAD_INC_4x8P_SSE 1    movq    m1, [r0]    movq    m2, [r0+r1]    lea     r0, [r0+2*r1]    movq    m3, [r2]    movq    m4, [r2+r3]    lea     r2, [r2+2*r3]    movhps  m1, [r0]    movhps  m2, [r0+r1]    movhps  m3, [r2]    movhps  m4, [r2+r3]    lea     r0, [r0+2*r1]    psadbw  m1, m3    psadbw  m2, m4    lea     r2, [r2+2*r3]%if %1    paddw   m0, m1%else    SWAP    m0, m1%endif    paddw   m0, m2%endmacro;Even on Nehalem, no sizes other than 8x16 benefit from this method.cglobal x264_pixel_sad_8x16_sse2, 4,4    SAD_INC_4x8P_SSE 0    SAD_INC_4x8P_SSE 1    SAD_INC_4x8P_SSE 1    SAD_INC_4x8P_SSE 1    SAD_END_SSE2    RET;-----------------------------------------------------------------------------; void intra_sad_x3_4x4 ( uint8_t *fenc, uint8_t *fdec, int res[3] );;-----------------------------------------------------------------------------cglobal x264_intra_sad_x3_4x4_mmxext, 3,3    pxor      mm7, mm7    movd      mm0, [r1-FDEC_STRIDE]    movd      mm1, [r0+FENC_STRIDE*0]    movd      mm2, [r0+FENC_STRIDE*2]    punpckldq mm0, mm0    punpckldq mm1, [r0+FENC_STRIDE*1]    punpckldq mm2, [r0+FENC_STRIDE*3]    movq      mm6, mm0    movq      mm3, mm1    psadbw    mm3, mm0    psadbw    mm0, mm2    paddw     mm0, mm3    movd     [r2], mm0 ;V prediction cost    movd      mm3, [r1+FDEC_STRIDE*0-4]    movd      mm0, [r1+FDEC_STRIDE*1-4]    movd      mm4, [r1+FDEC_STRIDE*2-4]    movd      mm5, [r1+FDEC_STRIDE*3-4]    punpcklbw mm3, mm0    punpcklbw mm4, mm5    movq      mm5, mm3    punpckhwd mm5, mm4    punpckhdq mm5, mm6    psadbw    mm5, mm7    punpckhbw mm3, mm3    punpckhbw mm4, mm4    punpckhwd mm3, mm3    punpckhwd mm4, mm4    psraw     mm5, 2    pavgw     mm5, mm7    punpcklbw mm5, mm5    pshufw    mm5, mm5, 0x0 ;DC prediction    movq      mm6, mm5    psadbw    mm5, mm1    psadbw    mm6, mm2    psadbw    mm1, mm3    psadbw    mm2, mm4    paddw     mm5, mm6    paddw     mm1, mm2    movd   [r2+8], mm5 ;DC prediction cost    movd   [r2+4], mm1 ;H prediction cost    RET;-----------------------------------------------------------------------------; void intra_sad_x3_8x8 ( uint8_t *fenc, uint8_t edge[33], int res[3]);;-----------------------------------------------------------------------------;m0 = DC;m6 = V;m7 = H;m1 = DC score;m2 = V score;m3 = H score;m5 = pixel row;m4 = temp%macro INTRA_SAD_HVDC_ITER 2    movq      m5, [r0+FENC_STRIDE*%1]    movq      m4, m5    psadbw    m4, m0%if %1    paddw     m1, m4%else    SWAP      m1, m4%endif    movq      m4, m5    psadbw    m4, m6%if %1    paddw     m2, m4%else    SWAP      m2, m4%endif    pshufw    m4, m7, %2    psadbw    m5, m4%if %1    paddw     m3, m5%else    SWAP      m3, m5%endif%endmacroINIT_MMXcglobal x264_intra_sad_x3_8x8_mmxext, 3,3    movq      m7, [r1+7]    pxor      m0, m0    movq      m6, [r1+16]  ;V prediction    pxor      m1, m1    psadbw    m0, m7    psadbw    m1, m6    paddw     m0, m1    paddw     m0, [pw_8 GLOBAL]    psrlw     m0, 4    punpcklbw m0, m0    pshufw    m0, m0, 0x0 ;DC prediction    punpckhbw m7, m7    INTRA_SAD_HVDC_ITER 0, 0xff    INTRA_SAD_HVDC_ITER 1, 0xaa    INTRA_SAD_HVDC_ITER 2, 0x55    INTRA_SAD_HVDC_ITER 3, 0x00    movq      m7, [r1+7]    punpcklbw m7, m7    INTRA_SAD_HVDC_ITER 4, 0xff    INTRA_SAD_HVDC_ITER 5, 0xaa    INTRA_SAD_HVDC_ITER 6, 0x55    INTRA_SAD_HVDC_ITER 7, 0x00    movd  [r2+0], m2    movd  [r2+4], m3    movd  [r2+8], m1    RET;-----------------------------------------------------------------------------; void intra_sad_x3_8x8c ( uint8_t *fenc, uint8_t *fdec, int res[3] );;-----------------------------------------------------------------------------%macro INTRA_SAD_HV_ITER 2%ifidn %2, ssse3    movd        m1, [r1 + FDEC_STRIDE*(%1-4) - 4]    movd        m3, [r1 + FDEC_STRIDE*(%1-3) - 4]    pshufb      m1, m7    pshufb      m3, m7%else    movq        m1, [r1 + FDEC_STRIDE*(%1-4) - 8]    movq        m3, [r1 + FDEC_STRIDE*(%1-3) - 8]    punpckhbw   m1, m1    punpckhbw   m3, m3    pshufw      m1, m1, 0xff    pshufw      m3, m3, 0xff%endif    movq        m4, [r0 + FENC_STRIDE*(%1+0)]    movq        m5, [r0 + FENC_STRIDE*(%1+1)]    psadbw      m1, m4    psadbw      m3, m5    psadbw      m4, m6    psadbw      m5, m6    paddw       m1, m3    paddw       m4, m5%if %1    paddw       m0, m1    paddw       m2, m4%else    SWAP 0,1    SWAP 2,4%endif%endmacro%macro INTRA_SAD_8x8C 1cglobal x264_intra_sad_x3_8x8c_%1, 3,3    movq        m6, [r1 - FDEC_STRIDE]    add         r1, FDEC_STRIDE*4%ifidn %1,ssse3    movq        m7, [pb_3 GLOBAL]%endif    INTRA_SAD_HV_ITER 0, %1    INTRA_SAD_HV_ITER 2, %1    INTRA_SAD_HV_ITER 4, %1    INTRA_SAD_HV_ITER 6, %1    movd    [r2+4], m0    movd    [r2+8], m2    pxor        m7, m7    movq        m2, [r1 + FDEC_STRIDE*-4 - 8]    movq        m4, [r1 + FDEC_STRIDE*-2 - 8]    movq        m3, [r1 + FDEC_STRIDE* 0 - 8]    movq        m5, [r1 + FDEC_STRIDE* 2 - 8]    punpckhbw   m2, [r1 + FDEC_STRIDE*-3 - 8]    punpckhbw   m4, [r1 + FDEC_STRIDE*-1 - 8]    punpckhbw   m3, [r1 + FDEC_STRIDE* 1 - 8]    punpckhbw   m5, [r1 + FDEC_STRIDE* 3 - 8]    punpckhbw   m2, m4    punpckhbw   m3, m5    psrlq       m2, 32    psrlq       m3, 32    psadbw      m2, m7 ; s2    psadbw      m3, m7 ; s3    movq        m1, m6    SWAP        0, 6    punpckldq   m0, m7    punpckhdq   m1, m7    psadbw      m0, m7 ; s0    psadbw      m1, m7 ; s1    punpcklwd   m0, m1    punpcklwd   m2, m3    punpckldq   m0, m2 ;s0 s1 s2 s3    pshufw      m3, m0, 11110110b ;s2,s1,s3,s3    pshufw      m0, m0, 01110100b ;s0,s1,s3,s1    paddw       m0, m3    psrlw       m0, 2    pavgw       m0, m7 ; s0+s2, s1, s3, s1+s3%ifidn %1, ssse3    movq        m1, m0    pshufb      m0, [pb_shuf8x8c0 GLOBAL]    pshufb      m1, [pb_shuf8x8c1 GLOBAL]%else    packuswb    m0, m0    punpcklbw   m0, m0    movq        m1, m0    punpcklbw   m0, m0 ; 4x dc0 4x dc1    punpckhbw   m1, m1 ; 4x dc2 4x dc3%endif    movq        m2, [r0+FENC_STRIDE*0]    movq        m3, [r0+FENC_STRIDE*1]    movq        m4, [r0+FENC_STRIDE*2]    movq        m5, [r0+FENC_STRIDE*3]    movq        m6, [r0+FENC_STRIDE*4]    movq        m7, [r0+FENC_STRIDE*5]    psadbw      m2, m0    psadbw      m3, m0    psadbw      m4, m0    psadbw      m5, m0    movq        m0, [r0+FENC_STRIDE*6]    psadbw      m6, m1    psadbw      m7, m1    psadbw      m0, m1    psadbw      m1, [r0+FENC_STRIDE*7]    paddw       m2, m3    paddw       m4, m5    paddw       m6, m7    paddw       m0, m1    paddw       m2, m4    paddw       m6, m0    paddw       m2, m6    movd      [r2], m2    RET%endmacroINIT_MMXINTRA_SAD_8x8C mmxextINTRA_SAD_8x8C ssse3;-----------------------------------------------------------------------------; void intra_sad_x3_16x16 ( uint8_t *fenc, uint8_t *fdec, int res[3] );;-----------------------------------------------------------------------------;xmm7: DC prediction    xmm6: H prediction  xmm5: V prediction;xmm4: DC pred score    xmm3: H pred score  xmm2: V pred score%macro INTRA_SAD16 1-2 0cglobal x264_intra_sad_x3_16x16_%1,3,5,%2    pxor    mm0, mm0    pxor    mm1, mm1    psadbw  mm0, [r1-FDEC_STRIDE+0]    psadbw  mm1, [r1-FDEC_STRIDE+8]    paddw   mm0, mm1    movd    r3d, mm0%ifidn %1, ssse3    mova  m1, [pb_3 GLOBAL]%endif%assign x 0%rep 16    movzx   r4d, byte [r1-1+FDEC_STRIDE*x]    add     r3d, r4d%assign x x+1%endrep    add     r3d, 16    shr     r3d, 5    imul    r3d, 0x01010101    movd    m7, r3d    mova    m5, [r1-FDEC_STRIDE]%if mmsize==16    pshufd  m7, m7, 0%else    mova    m1, [r1-FDEC_STRIDE+8]    punpckldq m7, m7%endif

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -