You've already forked FFmpeg
mirror of
https://github.com/FFmpeg/FFmpeg.git
synced 2025-10-06 05:47:18 +02:00
avcodec/x86/h263_loopfilter: Port loop filter to SSE2
Old benchmarks: h263dsp.h_loop_filter_c: 41.2 ( 1.00x) h263dsp.h_loop_filter_mmx: 39.5 ( 1.04x) h263dsp.v_loop_filter_c: 43.5 ( 1.00x) h263dsp.v_loop_filter_mmx: 16.9 ( 2.57x) New benchmarks: h263dsp.h_loop_filter_c: 41.6 ( 1.00x) h263dsp.h_loop_filter_sse2: 28.2 ( 1.48x) h263dsp.v_loop_filter_c: 42.4 ( 1.00x) h263dsp.v_loop_filter_sse2: 15.1 ( 2.81x) Signed-off-by: Andreas Rheinhardt <andreas.rheinhardt@outlook.com>
This commit is contained in:
committed by
James Almer
parent
a8a16c15c8
commit
ab7d1c64c9
@@ -75,7 +75,7 @@ DECLARE_ALIGNED(32, const ymm_reg, ff_pb_80) = { 0x8080808080808080ULL, 0x808
|
|||||||
0x8080808080808080ULL, 0x8080808080808080ULL };
|
0x8080808080808080ULL, 0x8080808080808080ULL };
|
||||||
DECLARE_ALIGNED(32, const ymm_reg, ff_pb_FE) = { 0xFEFEFEFEFEFEFEFEULL, 0xFEFEFEFEFEFEFEFEULL,
|
DECLARE_ALIGNED(32, const ymm_reg, ff_pb_FE) = { 0xFEFEFEFEFEFEFEFEULL, 0xFEFEFEFEFEFEFEFEULL,
|
||||||
0xFEFEFEFEFEFEFEFEULL, 0xFEFEFEFEFEFEFEFEULL };
|
0xFEFEFEFEFEFEFEFEULL, 0xFEFEFEFEFEFEFEFEULL };
|
||||||
DECLARE_ALIGNED(8, const uint64_t, ff_pb_FC) = 0xFCFCFCFCFCFCFCFCULL;
|
DECLARE_ALIGNED(16, const xmm_reg, ff_pb_FC) = { 0xFCFCFCFCFCFCFCFCULL, 0xFCFCFCFCFCFCFCFCULL };
|
||||||
|
|
||||||
DECLARE_ALIGNED(16, const xmm_reg, ff_ps_neg) = { 0x8000000080000000ULL, 0x8000000080000000ULL };
|
DECLARE_ALIGNED(16, const xmm_reg, ff_ps_neg) = { 0x8000000080000000ULL, 0x8000000080000000ULL };
|
||||||
|
|
||||||
|
@@ -56,8 +56,8 @@ extern const ymm_reg ff_pb_1;
|
|||||||
extern const ymm_reg ff_pb_2;
|
extern const ymm_reg ff_pb_2;
|
||||||
extern const ymm_reg ff_pb_3;
|
extern const ymm_reg ff_pb_3;
|
||||||
extern const ymm_reg ff_pb_80;
|
extern const ymm_reg ff_pb_80;
|
||||||
|
extern const xmm_reg ff_pb_FC;
|
||||||
extern const ymm_reg ff_pb_FE;
|
extern const ymm_reg ff_pb_FE;
|
||||||
extern const uint64_t ff_pb_FC;
|
|
||||||
|
|
||||||
extern const xmm_reg ff_ps_neg;
|
extern const xmm_reg ff_ps_neg;
|
||||||
|
|
||||||
|
@@ -1,5 +1,5 @@
|
|||||||
;******************************************************************************
|
;******************************************************************************
|
||||||
;* MMX-optimized H.263 loop filter
|
;* SSE2-optimized H.263 loop filter
|
||||||
;* Copyright (c) 2003-2013 Michael Niedermayer
|
;* Copyright (c) 2003-2013 Michael Niedermayer
|
||||||
;* Copyright (c) 2013 Daniel Kang
|
;* Copyright (c) 2013 Daniel Kang
|
||||||
;*
|
;*
|
||||||
@@ -22,7 +22,6 @@
|
|||||||
|
|
||||||
%include "libavutil/x86/x86util.asm"
|
%include "libavutil/x86/x86util.asm"
|
||||||
|
|
||||||
SECTION_RODATA
|
|
||||||
cextern pb_FC
|
cextern pb_FC
|
||||||
cextern h263_loop_filter_strength
|
cextern h263_loop_filter_strength
|
||||||
|
|
||||||
@@ -30,60 +29,45 @@ SECTION .text
|
|||||||
|
|
||||||
%macro H263_LOOP_FILTER 5
|
%macro H263_LOOP_FILTER 5
|
||||||
pxor m7, m7
|
pxor m7, m7
|
||||||
mova m0, [%1]
|
movq m0, [%1]
|
||||||
mova m1, [%1]
|
movq m6, [%4]
|
||||||
mova m2, [%4]
|
mova m5, m0
|
||||||
mova m3, [%4]
|
|
||||||
punpcklbw m0, m7
|
punpcklbw m0, m7
|
||||||
punpckhbw m1, m7
|
punpcklbw m6, m7
|
||||||
|
psubw m0, m6
|
||||||
|
movq m2, [%2]
|
||||||
|
movq m1, [%3]
|
||||||
|
mova m3, m2
|
||||||
|
mova m4, m1
|
||||||
punpcklbw m2, m7
|
punpcklbw m2, m7
|
||||||
punpckhbw m3, m7
|
punpcklbw m1, m7
|
||||||
psubw m0, m2
|
psubw m1, m2
|
||||||
psubw m1, m3
|
psllw m1, 2
|
||||||
mova m2, [%2]
|
paddw m1, m0
|
||||||
mova m3, [%2]
|
|
||||||
mova m4, [%3]
|
|
||||||
mova m5, [%3]
|
|
||||||
punpcklbw m2, m7
|
|
||||||
punpckhbw m3, m7
|
|
||||||
punpcklbw m4, m7
|
|
||||||
punpckhbw m5, m7
|
|
||||||
psubw m4, m2
|
|
||||||
psubw m5, m3
|
|
||||||
psllw m4, 2
|
|
||||||
psllw m5, 2
|
|
||||||
paddw m4, m0
|
|
||||||
paddw m5, m1
|
|
||||||
pxor m6, m6
|
pxor m6, m6
|
||||||
pcmpgtw m6, m4
|
pcmpgtw m6, m1
|
||||||
pcmpgtw m7, m5
|
pxor m1, m6
|
||||||
pxor m4, m6
|
psubw m1, m6
|
||||||
pxor m5, m7
|
psrlw m1, 3
|
||||||
psubw m4, m6
|
packuswb m1, m7
|
||||||
psubw m5, m7
|
|
||||||
psrlw m4, 3
|
|
||||||
psrlw m5, 3
|
|
||||||
packuswb m4, m5
|
|
||||||
packsswb m6, m7
|
packsswb m6, m7
|
||||||
pxor m7, m7
|
|
||||||
movd m2, %5
|
movd m2, %5
|
||||||
punpcklbw m2, m2
|
punpcklbw m2, m2
|
||||||
punpcklbw m2, m2
|
punpcklbw m2, m2
|
||||||
punpcklbw m2, m2
|
punpcklbw m2, m2
|
||||||
psubusb m2, m4
|
psubusb m2, m1
|
||||||
mova m3, m2
|
mova m7, m2
|
||||||
psubusb m3, m4
|
psubusb m7, m1
|
||||||
psubb m2, m3
|
psubb m2, m7
|
||||||
mova m3, [%2]
|
|
||||||
mova m4, [%3]
|
|
||||||
pxor m3, m6
|
pxor m3, m6
|
||||||
pxor m4, m6
|
pxor m4, m6
|
||||||
paddusb m3, m2
|
paddusb m3, m2
|
||||||
psubusb m4, m2
|
psubusb m4, m2
|
||||||
|
pxor m7, m7
|
||||||
pxor m3, m6
|
pxor m3, m6
|
||||||
pxor m4, m6
|
pxor m4, m6
|
||||||
paddusb m2, m2
|
paddusb m2, m2
|
||||||
packsswb m0, m1
|
packsswb m0, m7
|
||||||
pcmpgtb m7, m0
|
pcmpgtb m7, m0
|
||||||
pxor m0, m7
|
pxor m0, m7
|
||||||
psubb m0, m7
|
psubb m0, m7
|
||||||
@@ -94,22 +78,20 @@ SECTION .text
|
|||||||
psrlw m1, 2
|
psrlw m1, 2
|
||||||
pxor m1, m7
|
pxor m1, m7
|
||||||
psubb m1, m7
|
psubb m1, m7
|
||||||
mova m5, [%1]
|
movq m6, [%4]
|
||||||
mova m6, [%4]
|
|
||||||
psubb m5, m1
|
psubb m5, m1
|
||||||
paddb m6, m1
|
paddb m6, m1
|
||||||
%endmacro
|
%endmacro
|
||||||
|
|
||||||
INIT_MMX mmx
|
INIT_XMM sse2
|
||||||
; void ff_h263_v_loop_filter_mmx(uint8_t *src, int stride, int qscale)
|
; void ff_h263_v_loop_filter_sse2(uint8_t *src, int stride, int qscale)
|
||||||
cglobal h263_v_loop_filter, 3,5
|
cglobal h263_v_loop_filter, 3,5,8
|
||||||
movsxdifnidn r1, r1d
|
movsxdifnidn r1, r1d
|
||||||
movsxdifnidn r2, r2d
|
movsxdifnidn r2, r2d
|
||||||
|
|
||||||
lea r4, [h263_loop_filter_strength]
|
lea r3, [h263_loop_filter_strength]
|
||||||
movzx r3d, BYTE [r4+r2]
|
movzx r2d, BYTE [r3+r2]
|
||||||
movsx r2, r3b
|
shl r2d, 1
|
||||||
shl r2, 1
|
|
||||||
|
|
||||||
mov r3, r0
|
mov r3, r0
|
||||||
sub r3, r1
|
sub r3, r1
|
||||||
@@ -117,73 +99,64 @@ cglobal h263_v_loop_filter, 3,5
|
|||||||
sub r4, r1
|
sub r4, r1
|
||||||
H263_LOOP_FILTER r4, r3, r0, r0+r1, r2d
|
H263_LOOP_FILTER r4, r3, r0, r0+r1, r2d
|
||||||
|
|
||||||
mova [r3], m3
|
movq [r3], m3
|
||||||
mova [r0], m4
|
movq [r0], m4
|
||||||
mova [r4], m5
|
movq [r4], m5
|
||||||
mova [r0+r1], m6
|
movq [r0+r1], m6
|
||||||
RET
|
RET
|
||||||
|
|
||||||
%macro TRANSPOSE4X4 2
|
%macro TRANSPOSE4X4 2
|
||||||
movd m0, [%1]
|
movd %1, [%2]
|
||||||
movd m1, [%1+r1]
|
movd m2, [%2+r1]
|
||||||
movd m2, [%1+r1*2]
|
movd m3, [%2+r1*2]
|
||||||
movd m3, [%1+r3]
|
movd m4, [%2+r3]
|
||||||
punpcklbw m0, m1
|
punpcklbw %1, m2
|
||||||
punpcklbw m2, m3
|
punpcklbw m3, m4
|
||||||
mova m1, m0
|
punpcklwd %1, m3
|
||||||
punpcklwd m0, m2
|
|
||||||
punpckhwd m1, m2
|
|
||||||
movd [%2+ 0], m0
|
|
||||||
punpckhdq m0, m0
|
|
||||||
movd [%2+ 8], m0
|
|
||||||
movd [%2+16], m1
|
|
||||||
punpckhdq m1, m1
|
|
||||||
movd [%2+24], m1
|
|
||||||
%endmacro
|
%endmacro
|
||||||
|
|
||||||
|
|
||||||
; void ff_h263_h_loop_filter_mmx(uint8_t *src, int stride, int qscale)
|
; void ff_h263_h_loop_filter_sse2(uint8_t *src, int stride, int qscale)
|
||||||
INIT_MMX mmx
|
INIT_XMM sse2
|
||||||
cglobal h263_h_loop_filter, 3,5,0,32
|
cglobal h263_h_loop_filter, 3,5,8,32
|
||||||
movsxdifnidn r1, r1d
|
movsxdifnidn r1, r1d
|
||||||
movsxdifnidn r2, r2d
|
movsxdifnidn r2, r2d
|
||||||
|
|
||||||
lea r4, [h263_loop_filter_strength]
|
lea r4, [h263_loop_filter_strength]
|
||||||
movzx r3d, BYTE [r4+r2]
|
movzx r2d, BYTE [r4+r2]
|
||||||
movsx r2, r3b
|
shl r2d, 1
|
||||||
shl r2, 1
|
|
||||||
|
|
||||||
sub r0, 2
|
sub r0, 2
|
||||||
lea r3, [r1*3]
|
lea r3, [r1*3]
|
||||||
|
|
||||||
TRANSPOSE4X4 r0, rsp
|
|
||||||
lea r4, [r0+r1*4]
|
lea r4, [r0+r1*4]
|
||||||
TRANSPOSE4X4 r4, rsp+4
|
|
||||||
|
TRANSPOSE4X4 m0, r0
|
||||||
|
TRANSPOSE4X4 m1, r4
|
||||||
|
mova m2, m0
|
||||||
|
punpckldq m0, m1
|
||||||
|
mova [rsp], m0
|
||||||
|
punpckhdq m2, m1
|
||||||
|
mova [rsp+16], m2
|
||||||
|
|
||||||
H263_LOOP_FILTER rsp, rsp+8, rsp+16, rsp+24, r2d
|
H263_LOOP_FILTER rsp, rsp+8, rsp+16, rsp+24, r2d
|
||||||
|
|
||||||
mova m1, m5
|
|
||||||
mova m0, m4
|
|
||||||
punpcklbw m5, m3
|
punpcklbw m5, m3
|
||||||
punpcklbw m4, m6
|
punpcklbw m4, m6
|
||||||
punpckhbw m1, m3
|
mova m0, m5
|
||||||
punpckhbw m0, m6
|
|
||||||
mova m3, m5
|
|
||||||
mova m6, m1
|
|
||||||
punpcklwd m5, m4
|
punpcklwd m5, m4
|
||||||
punpcklwd m1, m0
|
punpckhwd m0, m4
|
||||||
punpckhwd m3, m4
|
|
||||||
punpckhwd m6, m0
|
|
||||||
movd [r0], m5
|
movd [r0], m5
|
||||||
|
movd [r4], m0
|
||||||
|
pshufd m1, m5, 0x1
|
||||||
|
pshufd m2, m0, 0x1
|
||||||
|
movd [r0+r1*1], m1
|
||||||
|
movd [r4+r1*1], m2
|
||||||
punpckhdq m5, m5
|
punpckhdq m5, m5
|
||||||
movd [r0+r1*1], m5
|
punpckhdq m0, m0
|
||||||
movd [r0+r1*2], m3
|
movd [r0+r1*2], m5
|
||||||
punpckhdq m3, m3
|
movd [r4+r1*2], m0
|
||||||
movd [r0+r3], m3
|
punpckhdq m5, m5
|
||||||
movd [r4], m1
|
punpckhdq m0, m0
|
||||||
punpckhdq m1, m1
|
movd [r0+r3], m5
|
||||||
movd [r4+r1*1], m1
|
movd [r4+r3], m0
|
||||||
movd [r4+r1*2], m6
|
|
||||||
punpckhdq m6, m6
|
|
||||||
movd [r4+r3], m6
|
|
||||||
RET
|
RET
|
||||||
|
@@ -25,15 +25,15 @@
|
|||||||
#include "libavutil/x86/cpu.h"
|
#include "libavutil/x86/cpu.h"
|
||||||
#include "libavcodec/h263dsp.h"
|
#include "libavcodec/h263dsp.h"
|
||||||
|
|
||||||
void ff_h263_h_loop_filter_mmx(uint8_t *src, int stride, int qscale);
|
void ff_h263_h_loop_filter_sse2(uint8_t *src, int stride, int qscale);
|
||||||
void ff_h263_v_loop_filter_mmx(uint8_t *src, int stride, int qscale);
|
void ff_h263_v_loop_filter_sse2(uint8_t *src, int stride, int qscale);
|
||||||
|
|
||||||
av_cold void ff_h263dsp_init_x86(H263DSPContext *c)
|
av_cold void ff_h263dsp_init_x86(H263DSPContext *c)
|
||||||
{
|
{
|
||||||
int cpu_flags = av_get_cpu_flags();
|
int cpu_flags = av_get_cpu_flags();
|
||||||
|
|
||||||
if (EXTERNAL_MMX(cpu_flags)) {
|
if (EXTERNAL_SSE2(cpu_flags)) {
|
||||||
c->h263_h_loop_filter = ff_h263_h_loop_filter_mmx;
|
c->h263_h_loop_filter = ff_h263_h_loop_filter_sse2;
|
||||||
c->h263_v_loop_filter = ff_h263_v_loop_filter_mmx;
|
c->h263_v_loop_filter = ff_h263_v_loop_filter_sse2;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@@ -34,7 +34,7 @@ static void check_loop_filter(char dim, filter func)
|
|||||||
LOCAL_ALIGNED_16(uint8_t, buf1, [32 * 32]);
|
LOCAL_ALIGNED_16(uint8_t, buf1, [32 * 32]);
|
||||||
int qscale = rnd() % 32;
|
int qscale = rnd() % 32;
|
||||||
|
|
||||||
declare_func_emms(AV_CPU_FLAG_MMX, void, uint8_t *, int, int);
|
declare_func(void, uint8_t *, int, int);
|
||||||
|
|
||||||
for (size_t y = 0; y < 32; y++)
|
for (size_t y = 0; y < 32; y++)
|
||||||
for (size_t x = 0; x < 32; x++)
|
for (size_t x = 0; x < 32; x++)
|
||||||
|
Reference in New Issue
Block a user