Files
FFmpeg/libavcodec/x86/sbcdsp.asm
Andreas Rheinhardt bb65b54f2f avcodec/x86/sbcdsp: Port MMX sbc_calc_scalefactors to SSE4
Besides giving a nice speedup over the MMX version,
it also avoids processing unnecessarily much input and
touching unnecessarily much output in the 2ch-4subbands case.

calc_scalefactors_1ch_4subbands_c:                     106.9 ( 1.00x)
calc_scalefactors_1ch_4subbands_mmx:                    46.7 ( 2.29x)
calc_scalefactors_1ch_4subbands_sse4:                   11.8 ( 9.05x)
calc_scalefactors_1ch_8subbands_c:                     220.5 ( 1.00x)
calc_scalefactors_1ch_8subbands_mmx:                    92.3 ( 2.39x)
calc_scalefactors_1ch_8subbands_sse4:                   23.8 ( 9.28x)
calc_scalefactors_2ch_4subbands_c:                     222.5 ( 1.00x)
calc_scalefactors_2ch_4subbands_mmx:                   139.3 ( 1.60x)
calc_scalefactors_2ch_4subbands_sse4:                   23.6 ( 9.41x)
calc_scalefactors_2ch_8subbands_c:                     440.3 ( 1.00x)
calc_scalefactors_2ch_8subbands_mmx:                   196.8 ( 2.24x)
calc_scalefactors_2ch_8subbands_sse4:                   46.5 ( 9.48x)

The MMX version has been removed.

Signed-off-by: Andreas Rheinhardt <andreas.rheinhardt@outlook.com>
2026-03-28 11:25:38 +01:00

168 lines
5.7 KiB
NASM

;******************************************************************************
;* SIMD optimized SBC encoder DSP functions
;*
;* Copyright (C) 2017 Aurelien Jacobs <aurel@gnuage.org>
;* Copyright (C) 2008-2010 Nokia Corporation
;* Copyright (C) 2004-2010 Marcel Holtmann <marcel@holtmann.org>
;* Copyright (C) 2004-2005 Henryk Ploetz <henryk@ploetzli.ch>
;* Copyright (C) 2005-2006 Brad Midgley <bmidgley@xmission.com>
;*
;* This file is part of FFmpeg.
;*
;* FFmpeg is free software; you can redistribute it and/or
;* modify it under the terms of the GNU Lesser General Public
;* License as published by the Free Software Foundation; either
;* version 2.1 of the License, or (at your option) any later version.
;*
;* FFmpeg 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
;* Lesser General Public License for more details.
;*
;* You should have received a copy of the GNU Lesser General Public
;* License along with FFmpeg; if not, write to the Free Software
;* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
;******************************************************************************
%include "libavutil/x86/x86util.asm"
SECTION .text
%macro NIDN 3
%ifnidn %2, %3
%1 %2, %3
%endif
%endmacro
%macro ANALYZE_MAC 6 ; out1, out2, tmp1, tmp2, offset, aligned
mov%6 %3, [inq+%5]
mov%6 %4, [inq+%5+mmsize]
%if %5 == 0
pcmpeqd m0, m0
psrld m0, 31
%endif
pmaddwd %3, [constsq+%5]
pmaddwd %4, [constsq+%5+mmsize]
%if %5 == 0
pslld m0, 15 ; 1 << (SBC_PROTO_FIXED_SCALE - 1) as dword
%endif
NIDN paddd, %1, %3
NIDN paddd, %2, %4
%endmacro
;*******************************************************************
;void ff_sbc_analyze_4(const int16_t *in, int32_t *out, const int16_t *consts);
;*******************************************************************
INIT_XMM sse2
cglobal sbc_analyze_4, 3, 3, 5, in, out, consts
ANALYZE_MAC m1, m2, m1, m2, 0, u
ANALYZE_MAC m1, m2, m3, m4, 32, u
movu m3, [inq+64]
paddd m1, m0
pmaddwd m3, [constsq+64]
paddd m1, m2
paddd m1, m3
psrad m1, 16
packssdw m1, m1
pshufd m2, m1, q0000
pmaddwd m2, [constsq+80]
pshufd m1, m1, q1111
pmaddwd m1, [constsq+96]
paddd m1, m2
mova [outq], m1
RET
;*******************************************************************
;void ff_sbc_analyze_8(const int16_t *in, int32_t *out, const int16_t *consts);
;*******************************************************************
INIT_XMM sse2
cglobal sbc_analyze_8, 3, 3, 6, in, out, consts
ANALYZE_MAC m1, m2, m1, m2, 0, a
ANALYZE_MAC m1, m2, m3, m4, 32, a
paddd m1, m0
ANALYZE_MAC m1, m2, m3, m4, 64, a
ANALYZE_MAC m1, m2, m3, m4, 96, a
paddd m2, m0
ANALYZE_MAC m1, m2, m3, m4, 128, a
psrad m1, 16
psrad m2, 16
packssdw m1, m2
pshufd m2, m1, q0000
pmaddwd m0, m2, [constsq+160]
pshufd m3, m1, q1111
pmaddwd m2, [constsq+176]
pmaddwd m4, m3, [constsq+192]
pshufd m5, m1, q2222
pmaddwd m3, [constsq+208]
paddd m0, m4
pmaddwd m4, m5, [constsq+224]
pshufd m1, m1, q3333
pmaddwd m5, [constsq+240]
paddd m2, m3
pmaddwd m3, m1, [constsq+256]
paddd m0, m4
pmaddwd m1, [constsq+272]
paddd m0, m3
paddd m2, m5
mova [outq], m0
paddd m2, m1
mova [outq+16], m2
RET
;*******************************************************************
;void ff_sbc_calc_scalefactors(const int32_t sb_sample_f[16][2][8],
; uint32_t scale_factor[2][8],
; int blocks, int channels, int subbands)
;*******************************************************************
INIT_XMM sse4
cglobal sbc_calc_scalefactors, 5, 6, 5, sb_sample_f, scale_factor, blocks, channels, subbands, step
shl blocksd, 6
pcmpeqd m3, m3
shl subbandsd, 2
mov stepd, 48
add sb_sample_fq, blocksq
psrld m4, m3, 25 ; pd_127
neg blocksq
shl channelsd, 5
sub stepd, subbandsd ; step = subbands == 4 ? 32 : 16
pxor m2, m2
.loop_1:
lea subbandsq, [blocksq+64]
pabsd m0, [sb_sample_fq+blocksq]
.loop_2:
pabsd m1, [sb_sample_fq+subbandsq]
pmaxud m0, m1
add subbandsq, 64
js .loop_2
paddd m0, m3 ; max - 1, representable as signed value
pmaxsd m0, m2
; We have to calculate log2(x|(1<<15))-15. This equals log2(x>>15) for x >= 2^15
; and x>>15 is exactly representable as a float, so one can get the log2
; by converting to float and subtracting 127 from the exponent.
; For x < 2^15 the result is correct when using saturated subtraction.
psrld m0, 15
cvtdq2ps m0, m0
add sb_sample_fq, stepq
psrld m0, 23 ; exponent
psubusw m0, m4 ; same as saturated dword subtraction
mova [scale_factorq], m0
add scale_factorq, stepq
sub channelsd, stepd
jg .loop_1
RET