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

📄 skl_mb_qpel_mmx.asm

📁 mpeg4编解码器
💻 ASM
📖 第 1 页 / 共 2 页
字号:
;/********************************************************; * Some code. Copyright (C) 2003 by Pascal Massimino.   *; * All Rights Reserved.      (http://skal.planet-d.net) *; * For Educational/Academic use ONLY. See 'LICENSE.TXT'.*; ********************************************************/;//////////////////////////////////////////////////////////////////////;// Quarter-pixel interpolation;//////////////////////////////////////////////////////////////////////; [BITS 32]%include "../../include/skl_syst/skl_nasm.h"%define USE_TABLES;//////////////////////////////////////////////////////////////////////globl Skl_H_Pass_16_Copy_Rnd0_MMXglobl Skl_H_Pass_Avrg_16_Copy_Rnd0_MMXglobl Skl_H_Pass_Avrg_Up_16_Copy_Rnd0_MMXglobl Skl_V_Pass_16_Copy_Rnd0_MMXglobl Skl_V_Pass_Avrg_16_Copy_Rnd0_MMXglobl Skl_V_Pass_Avrg_Up_16_Copy_Rnd0_MMXglobl Skl_H_Pass_8_Copy_Rnd0_MMXglobl Skl_H_Pass_Avrg_8_Copy_Rnd0_MMXglobl Skl_H_Pass_Avrg_Up_8_Copy_Rnd0_MMXglobl Skl_V_Pass_8_Copy_Rnd0_MMXglobl Skl_V_Pass_Avrg_8_Copy_Rnd0_MMXglobl Skl_V_Pass_Avrg_Up_8_Copy_Rnd0_MMXglobl Skl_H_Pass_16_Copy_Rnd1_MMXglobl Skl_H_Pass_Avrg_16_Copy_Rnd1_MMXglobl Skl_H_Pass_Avrg_Up_16_Copy_Rnd1_MMXglobl Skl_V_Pass_16_Copy_Rnd1_MMXglobl Skl_V_Pass_Avrg_16_Copy_Rnd1_MMXglobl Skl_V_Pass_Avrg_Up_16_Copy_Rnd1_MMXglobl Skl_H_Pass_8_Copy_Rnd1_MMXglobl Skl_H_Pass_Avrg_8_Copy_Rnd1_MMXglobl Skl_H_Pass_Avrg_Up_8_Copy_Rnd1_MMXglobl Skl_V_Pass_8_Copy_Rnd1_MMXglobl Skl_V_Pass_Avrg_8_Copy_Rnd1_MMXglobl Skl_V_Pass_Avrg_Up_8_Copy_Rnd1_MMXglobl Skl_H_Pass_16_Add_Rnd0_MMXglobl Skl_H_Pass_Avrg_16_Add_Rnd0_MMXglobl Skl_H_Pass_Avrg_Up_16_Add_Rnd0_MMXglobl Skl_V_Pass_16_Add_Rnd0_MMXglobl Skl_V_Pass_Avrg_16_Add_Rnd0_MMXglobl Skl_V_Pass_Avrg_Up_16_Add_Rnd0_MMXglobl Skl_H_Pass_8_Add_Rnd0_MMXglobl Skl_H_Pass_Avrg_8_Add_Rnd0_MMXglobl Skl_H_Pass_Avrg_Up_8_Add_Rnd0_MMXglobl Skl_V_Pass_8_Add_Rnd0_MMXglobl Skl_V_Pass_Avrg_8_Add_Rnd0_MMXglobl Skl_V_Pass_Avrg_Up_8_Add_Rnd0_MMXextrn Skl_MMX_Expand%ifdef USE_TABLESextrn Skl_FIR_1_0_0_0extrn Skl_FIR_3_1_0_0extrn Skl_FIR_6_3_1_0extrn Skl_FIR_14_3_2_1extrn Skl_FIR_20_6_3_1extrn Skl_FIR_20_20_6_3extrn Skl_FIR_23_19_6_3extrn Skl_FIR_7_20_20_6extrn Skl_FIR_6_20_20_6extrn Skl_FIR_6_20_20_7extrn Skl_FIR_3_6_20_20extrn Skl_FIR_3_6_19_23extrn Skl_FIR_1_3_6_20extrn Skl_FIR_1_2_3_14extrn Skl_FIR_0_1_3_6extrn Skl_FIR_0_0_1_3extrn Skl_FIR_0_0_0_1%endif;////////////////////////////////////////////////////////////////////// DATAalign 16Rounder1_MMX:times 4 dw 1Rounder0_MMX:times 4 dw 0align 16Rounder_QP_MMXtimes 4 dw 16times 4 dw 15%ifndef USE_TABLESalign 16  ; H-Pass table shared by 16x? and 8x? filtersFIR_R0:  dw 14, -3,  2, -1align 16FIR_R1:  dw 23, 19, -6,  3,   -1,  0,  0,  0FIR_R2:  dw -7, 20, 20, -6,    3, -1,  0,  0FIR_R3:  dw  3, -6, 20, 20,   -6,  3, -1,  0FIR_R4:  dw -1,  3, -6, 20,   20, -6,  3, -1FIR_R5:  dw  0, -1,  3, -6,   20, 20, -6,  3,   -1,  0,  0,  0align 16FIR_R6:  dw  0,  0, -1,  3,   -6, 20, 20, -6,    3, -1,  0,  0align 16FIR_R7:  dw  0,  0,  0, -1,    3, -6, 20, 20,   -6,  3, -1,  0align 16FIR_R8:  dw                   -1,  3, -6, 20,   20, -6,  3, -1FIR_R9:  dw                    0, -1,  3, -6,   20, 20, -6,  3,   -1,  0,  0,  0align 16FIR_R10: dw                    0,  0, -1,  3,   -6, 20, 20, -6,    3, -1,  0,  0align 16FIR_R11: dw                    0,  0,  0, -1,    3, -6, 20, 20,   -6,  3, -1,  0align 16FIR_R12: dw                                     -1,  3, -6, 20,   20, -6,  3, -1FIR_R13: dw                                      0, -1,  3, -6,   20, 20, -6,  3FIR_R14: dw                                      0,  0, -1,  3,   -6, 20, 20, -7FIR_R15: dw                                      0,  0,  0, -1,    3, -6, 19, 23FIR_R16: dw                                                       -1,  2, -3, 14%endif  ; !USE_TABLES  ; V-Pass tapsalign 16FIR_Cm7: times 4 dw -7FIR_Cm6: times 4 dw -6FIR_Cm3: times 4 dw -3FIR_Cm1: times 4 dw -1FIR_C2:  times 4 dw  2FIR_C3:  times 4 dw  3FIR_C14: times 4 dw 14FIR_C19: times 4 dw 19FIR_C20: times 4 dw 20FIR_C23: times 4 dw 23TEXT;//////////////////////////////////////////////////////////////////////;// Here we go with the Q-Pel mess.;//  For horizontal passes, we process 4 *output* pixel in parallel;//  For vertical ones, we process 4 *input* pixel in parallel.;//////////////////////////////////////////////////////////////////////%macro PROLOG_NO_AVRG 1   ; %1:Rounder  push esi  push edi  push ebp  mov edi, [esp+16 + 0*4] ; Dst  mov esi, [esp+16 + 1*4] ; Src  mov ecx, [esp+16 + 2*4] ; Size  mov ebp, [esp+16 + 3*4] ; BpS  movq mm7, [Rounder_QP_MMX+%1*8]  ; rounder%endmacro%macro EPILOG_NO_AVRG 0  pop ebp  pop edi  pop esi  ret%endmacro%macro PROLOG_AVRG 1   ; %1:Rounder  push ebx  push esi  push edi  push ebp  mov edi, [esp+20 + 0*4] ; Dst  mov esi, [esp+20 + 1*4] ; Src  mov ecx, [esp+20 + 2*4] ; Size  mov ebp, [esp+20 + 3*4] ; BpS  movq mm7, [Rounder_QP_MMX+%1*8]  ; rounder  lea ebx, [Rounder1_MMX+%1*8]     ; *Rounder2%endmacro%macro EPILOG_AVRG 0  pop ebp  pop edi  pop esi  pop ebx  ret%endmacro;//////////////////////////////////////////////////////////////////////;//;// All horizontal passes;//;//////////////////////////////////////////////////////////////////////  ; macros for USE_TABLES%macro TLOAD 2     ; %1,%2: src pixels  movzx eax, byte [esi+%1]  movzx edx, byte [esi+%2]  movq mm0, [Skl_FIR_14_3_2_1 + eax*8 ]  movq mm3, [Skl_FIR_1_2_3_14 + edx*8 ]  paddw mm0, mm7  paddw mm3, mm7%endmacro%macro TACCUM2 5   ;%1:src pixel/%2-%3:Taps tables/ %4-%5:dst regs  movzx eax, byte [esi+%1]  paddw %4, [%2 + eax*8]  paddw %5, [%3 + eax*8]%endmacro%macro TACCUM3 7   ;%1:src pixel/%2-%4:Taps tables/%5-%7:dst regs  movzx eax, byte [esi+%1]  paddw %5, [%2 + eax*8]  paddw %6, [%3 + eax*8]  paddw %7, [%4 + eax*8]%endmacro;//////////////////////////////////////////////////////////////////////%macro LOAD 2     ; %1,%2: src pixels  movzx eax, byte [esi+%1]  movzx edx, byte [esi+%2]  movq mm0, [Skl_MMX_Expand + eax*8]  movq mm3, [Skl_MMX_Expand + edx*8]  pmullw mm0, [FIR_R0 ]  pmullw mm3, [FIR_R16]  paddw mm0, mm7  paddw mm3, mm7%endmacro%macro ACCUM2 4   ;src pixel/Taps/dst regs #1-#2  movzx eax, byte [esi+%1]  movq mm4, [Skl_MMX_Expand + eax*8]  movq mm5, mm4  pmullw mm4, [%2]  pmullw mm5, [%2+8]  paddw %3, mm4  paddw %4, mm5%endmacro%macro ACCUM3 5   ;src pixel/Taps/dst regs #1-#2-#3  movzx eax, byte [esi+%1]  movq mm4, [Skl_MMX_Expand + eax*8]  movq mm5, mm4  movq mm6, mm5  pmullw mm4, [%2   ]  pmullw mm5, [%2+ 8]  pmullw mm6, [%2+16]  paddw %3, mm4  paddw %4, mm5  paddw %5, mm6%endmacro;//////////////////////////////////////////////////////////////////////%macro MIX 3   ; %1:reg, %2:src, %3:rounder  movq mm4, [%2]  pxor mm6, mm6  movq mm1, %1  movq mm5, mm4  punpcklbw %1, mm6  punpcklbw mm4, mm6  punpckhbw mm1, mm6  punpckhbw mm5, mm6  movq mm6, [%3]   ; rounder #2  paddusw %1, mm6  paddusw mm1, mm6  paddusw %1, mm4  paddusw mm1, mm5  psrlw %1, 1  psrlw mm1, 1  packuswb %1, mm1%endmacro;//////////////////////////////////////////////////////////////////////  ; 1406c/1657c/1673c/1912c  ; -> 1218c    (min:1100c?)%macro H_PASS_16  3   ; %1:src-op (0=NONE,1=AVRG,2=AVRG-UP), %2:dst-op (NONE/AVRG), %3:rounder%if (%2==0) && (%1==0)   PROLOG_NO_AVRG %3%else   PROLOG_AVRG %3%endif;  SKL_RDTSC_IN.Loop    ;  mm0..mm3 serves as a 4x4 delay line%ifndef USE_TABLES  LOAD 0, 16  ; special case for 1rst/last pixel  movq mm1, mm7  movq mm2, mm7  ACCUM2 1,    FIR_R1, mm0, mm1  ACCUM2 2,    FIR_R2, mm0, mm1  ACCUM2 3,    FIR_R3, mm0, mm1  ACCUM2 4,    FIR_R4, mm0, mm1  ACCUM3 5,    FIR_R5, mm0, mm1, mm2  ACCUM3 6,    FIR_R6, mm0, mm1, mm2  ACCUM3 7,    FIR_R7, mm0, mm1, mm2  ACCUM2 8,    FIR_R8, mm1, mm2  ACCUM3 9,    FIR_R9, mm1, mm2, mm3  ACCUM3 10,   FIR_R10,mm1, mm2, mm3  ACCUM3 11,   FIR_R11,mm1, mm2, mm3  ACCUM2 12,   FIR_R12, mm2, mm3  ACCUM2 13,   FIR_R13, mm2, mm3  ACCUM2 14,   FIR_R14, mm2, mm3  ACCUM2 15,   FIR_R15, mm2, mm3%else  TLOAD 0, 16  ; special case for 1rst/last pixel  movq mm1, mm7  movq mm2, mm7  TACCUM2 1,    Skl_FIR_23_19_6_3, Skl_FIR_1_0_0_0 , mm0, mm1  TACCUM2 2,    Skl_FIR_7_20_20_6, Skl_FIR_3_1_0_0 , mm0, mm1  TACCUM2 3,    Skl_FIR_3_6_20_20, Skl_FIR_6_3_1_0 , mm0, mm1  TACCUM2 4,    Skl_FIR_1_3_6_20 , Skl_FIR_20_6_3_1, mm0, mm1  TACCUM3 5,    Skl_FIR_0_1_3_6  , Skl_FIR_20_20_6_3, Skl_FIR_1_0_0_0  , mm0, mm1, mm2  TACCUM3 6,    Skl_FIR_0_0_1_3  , Skl_FIR_6_20_20_6, Skl_FIR_3_1_0_0  , mm0, mm1, mm2  TACCUM3 7,    Skl_FIR_0_0_0_1  , Skl_FIR_3_6_20_20, Skl_FIR_6_3_1_0  , mm0, mm1, mm2  TACCUM2 8,                       Skl_FIR_1_3_6_20 , Skl_FIR_20_6_3_1 ,      mm1, mm2  TACCUM3 9,                       Skl_FIR_0_1_3_6  , Skl_FIR_20_20_6_3, Skl_FIR_1_0_0_0,  mm1, mm2, mm3  TACCUM3 10,                      Skl_FIR_0_0_1_3  , Skl_FIR_6_20_20_6, Skl_FIR_3_1_0_0,  mm1, mm2, mm3  TACCUM3 11,                      Skl_FIR_0_0_0_1  , Skl_FIR_3_6_20_20, Skl_FIR_6_3_1_0,  mm1, mm2, mm3  TACCUM2 12,  Skl_FIR_1_3_6_20, Skl_FIR_20_6_3_1 , mm2, mm3  TACCUM2 13,  Skl_FIR_0_1_3_6 , Skl_FIR_20_20_6_3, mm2, mm3  TACCUM2 14,  Skl_FIR_0_0_1_3 , Skl_FIR_6_20_20_7, mm2, mm3  TACCUM2 15,  Skl_FIR_0_0_0_1 , Skl_FIR_3_6_19_23, mm2, mm3%endif  psraw mm0, 5  psraw mm1, 5  psraw mm2, 5  psraw mm3, 5  packuswb mm0, mm1  packuswb mm2, mm3%if (%1==1)  MIX mm0, esi, ebx%elif (%1==2)  MIX mm0, esi+1, ebx%endif%if (%2==1)  MIX mm0, edi, Rounder1_MMX%endif%if (%1==1)  MIX mm2, esi+8, ebx%elif (%1==2)  MIX mm2, esi+9, ebx%endif%if (%2==1)  MIX mm2, edi+8, Rounder1_MMX%endif  lea esi, [esi+ebp]  movq [edi+0], mm0  movq [edi+8], mm2  add edi, ebp  dec ecx  jg .Loop;  SKL_RDTSC_OUT%if (%2==0) && (%1==0)  EPILOG_NO_AVRG%else  EPILOG_AVRG%endif%endmacro;//////////////////////////////////////////////////////////////////////  ; 338c /...  -> 221c/294...%macro H_PASS_8  3   ; %1:src-op (0=NONE,1=AVRG,2=AVRG-UP), %2:dst-op (NONE/AVRG), %3:rounder%if (%2==0) && (%1==0)  PROLOG_NO_AVRG %3%else  PROLOG_AVRG %3%endif;  SKL_RDTSC_IN.Loop    ;  mm0..mm3 serves as a 4x4 delay line%ifndef USE_TABLES  LOAD 0, 8  ; special case for 1rst/last pixel  ACCUM2 1,  FIR_R1,  mm0, mm3  ACCUM2 2,  FIR_R2,  mm0, mm3  ACCUM2 3,  FIR_R3,  mm0, mm3  ACCUM2 4,  FIR_R4,  mm0, mm3  ACCUM2 5,  FIR_R13,  mm0, mm3  ACCUM2 6,  FIR_R14,  mm0, mm3  ACCUM2 7,  FIR_R15,  mm0, mm3%else%if 0   ; no unrolling  TLOAD 0, 8  ; special case for 1rst/last pixel  TACCUM2 1,  Skl_FIR_23_19_6_3, Skl_FIR_1_0_0_0  , mm0, mm3  TACCUM2 2,  Skl_FIR_7_20_20_6, Skl_FIR_3_1_0_0  , mm0, mm3  TACCUM2 3,  Skl_FIR_3_6_20_20, Skl_FIR_6_3_1_0  , mm0, mm3  TACCUM2 4,  Skl_FIR_1_3_6_20 , Skl_FIR_20_6_3_1 , mm0, mm3  TACCUM2 5,  Skl_FIR_0_1_3_6  , Skl_FIR_20_20_6_3, mm0, mm3  TACCUM2 6,  Skl_FIR_0_0_1_3  , Skl_FIR_6_20_20_7, mm0, mm3  TACCUM2 7,  Skl_FIR_0_0_0_1  , Skl_FIR_3_6_19_23, mm0, mm3%else  ; unrolling of above  movzx eax, byte [esi]  movzx edx, byte [esi+8]  movq mm0, [Skl_FIR_14_3_2_1 + eax*8 ]  movzx eax, byte [esi+1]  movq mm3, [Skl_FIR_1_2_3_14 + edx*8 ]    paddw mm0, mm7  paddw mm3, mm7  movzx edx, byte [esi+2]  paddw mm0, [Skl_FIR_23_19_6_3 + eax*8]  paddw mm3, [Skl_FIR_1_0_0_0 + eax*8]  movzx eax, byte [esi+3]  paddw mm0, [Skl_FIR_7_20_20_6 + edx*8]  paddw mm3, [Skl_FIR_3_1_0_0 + edx*8]  movzx edx, byte [esi+4]  paddw mm0, [Skl_FIR_3_6_20_20 + eax*8]  paddw mm3, [Skl_FIR_6_3_1_0 + eax*8]  movzx eax, byte [esi+5]  paddw mm0, [Skl_FIR_1_3_6_20 + edx*8]  paddw mm3, [Skl_FIR_20_6_3_1 + edx*8]  movzx edx, byte [esi+6]  paddw mm0, [Skl_FIR_0_1_3_6 + eax*8]  paddw mm3, [Skl_FIR_20_20_6_3 + eax*8]  movzx eax, byte [esi+7]  paddw mm0, [Skl_FIR_0_0_1_3 + edx*8]  paddw mm3, [Skl_FIR_6_20_20_7 + edx*8]  paddw mm0, [Skl_FIR_0_0_0_1 + eax*8]  paddw mm3, [Skl_FIR_3_6_19_23 + eax*8]%endif%endif    ; !USE_TABLES  psraw mm0, 5  psraw mm3, 5  packuswb mm0, mm3%if (%1==1)  MIX mm0, esi, ebx%elif (%1==2)  MIX mm0, esi+1, ebx%endif%if (%2==1)  MIX mm0, edi, Rounder1_MMX%endif  movq [edi], mm0  add edi, ebp  add esi, ebp  dec ecx  jg .Loop;  SKL_RDTSC_OUT%if (%2==0) && (%1==0)  EPILOG_NO_AVRG%else  EPILOG_AVRG%endif%endmacro;//////////////////////////////////////////////////////////////////////;// 16x? copy FunctionsSkl_H_Pass_16_Copy_Rnd1_MMX:  H_PASS_16 0, 0, 1Skl_H_Pass_Avrg_16_Copy_Rnd1_MMX:  H_PASS_16 1, 0, 1Skl_H_Pass_Avrg_Up_16_Copy_Rnd1_MMX:  H_PASS_16 2, 0, 1Skl_H_Pass_16_Copy_Rnd0_MMX:  H_PASS_16 0, 0, 0Skl_H_Pass_Avrg_16_Copy_Rnd0_MMX:

⌨️ 快捷键说明

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