mirror of
https://github.com/FFmpeg/FFmpeg.git
synced 2024-12-23 12:43:46 +02:00
x86/blockdsp: add sse2 and avx2 versions of fill_block_tab
blockdsp.fill_block_tab[0]_c: 34.1 blockdsp.fill_block_tab[0]_sse2: 11.1 blockdsp.fill_block_tab[0]_avx2: 10.1 blockdsp.fill_block_tab[1]_c: 10.1 blockdsp.fill_block_tab[1]_sse2: 6.1 blockdsp.fill_block_tab[1]_avx2: 5.6 Signed-off-by: James Almer <jamrial@gmail.com>
This commit is contained in:
parent
b6054e57cb
commit
214cbe29dc
@ -80,3 +80,36 @@ INIT_XMM sse
|
||||
CLEAR_BLOCKS 1
|
||||
INIT_YMM avx
|
||||
CLEAR_BLOCKS 1
|
||||
|
||||
;-----------------------------------------
|
||||
; void ff_fill_block_tab_%1(uint8_t *block, uint8_t value,
|
||||
; ptrdiff_t line_size, int h);
|
||||
;-----------------------------------------
|
||||
%macro FILL_BLOCK_TAB 2
|
||||
cglobal fill_block_tab_%1, 4, 5, 1, block, value, stride, h, stride3
|
||||
lea stride3q, [strideq + strideq * 2]
|
||||
%if cpuflag(avx2)
|
||||
movd m0, valued
|
||||
vpbroadcastb m0, m0
|
||||
%else
|
||||
SPLATB_REG m0, value, x
|
||||
%endif
|
||||
.loop:
|
||||
mov%2 [blockq], m0
|
||||
mov%2 [blockq + strideq], m0
|
||||
mov%2 [blockq + strideq * 2], m0
|
||||
mov%2 [blockq + stride3q], m0
|
||||
lea blockq, [blockq + strideq * 4]
|
||||
sub hd, 4
|
||||
jg .loop
|
||||
RET
|
||||
%endmacro
|
||||
|
||||
INIT_XMM sse2
|
||||
FILL_BLOCK_TAB 8, q
|
||||
FILL_BLOCK_TAB 16, a
|
||||
%if HAVE_AVX2_EXTERNAL
|
||||
INIT_XMM avx2
|
||||
FILL_BLOCK_TAB 8, q
|
||||
FILL_BLOCK_TAB 16, a
|
||||
%endif
|
||||
|
@ -29,6 +29,11 @@ void ff_clear_block_avx(int16_t *block);
|
||||
void ff_clear_blocks_sse(int16_t *blocks);
|
||||
void ff_clear_blocks_avx(int16_t *blocks);
|
||||
|
||||
void ff_fill_block_tab_16_sse2(uint8_t *block, uint8_t value, ptrdiff_t line_size, int h);
|
||||
void ff_fill_block_tab_8_sse2(uint8_t *block, uint8_t value, ptrdiff_t line_size, int h);
|
||||
void ff_fill_block_tab_16_avx2(uint8_t *block, uint8_t value, ptrdiff_t line_size, int h);
|
||||
void ff_fill_block_tab_8_avx2(uint8_t *block, uint8_t value, ptrdiff_t line_size, int h);
|
||||
|
||||
av_cold void ff_blockdsp_init_x86(BlockDSPContext *c)
|
||||
{
|
||||
#if HAVE_X86ASM
|
||||
@ -38,9 +43,17 @@ av_cold void ff_blockdsp_init_x86(BlockDSPContext *c)
|
||||
c->clear_block = ff_clear_block_sse;
|
||||
c->clear_blocks = ff_clear_blocks_sse;
|
||||
}
|
||||
if (EXTERNAL_SSE2(cpu_flags)) {
|
||||
c->fill_block_tab[0] = ff_fill_block_tab_16_sse2;
|
||||
c->fill_block_tab[1] = ff_fill_block_tab_8_sse2;
|
||||
}
|
||||
if (EXTERNAL_AVX_FAST(cpu_flags)) {
|
||||
c->clear_block = ff_clear_block_avx;
|
||||
c->clear_blocks = ff_clear_blocks_avx;
|
||||
}
|
||||
if (EXTERNAL_AVX2(cpu_flags)) {
|
||||
c->fill_block_tab[0] = ff_fill_block_tab_16_avx2;
|
||||
c->fill_block_tab[1] = ff_fill_block_tab_8_avx2;
|
||||
}
|
||||
#endif /* HAVE_X86ASM */
|
||||
}
|
||||
|
Loading…
Reference in New Issue
Block a user