?? skl_mb_qpel_mmx.asm
字號:
;/********************************************************; * 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 + -