Merge commit 'a1bcc76e6036e78f25cbb7323c145056cfca9d93'

* commit 'a1bcc76e6036e78f25cbb7323c145056cfca9d93': (21 commits)
  cmdutils: fix a memleak when specifying an option twice.
  x86: mpegvideo: more sensible names for optimization file and init function
  x86: mpegvideoenc: Split optimizations off into a separate file
  dnxhdenc: x86: more sensible names for optimization file and init function
  svq1/svq3: Move common code out of SVQ1 decoder-specific file
  dirac: add Comments and references to the standard
  lavr: x86: optimized 6-channel flt to fltp conversion
  lavr: x86: optimized 2-channel flt to fltp conversion
  lavr: x86: optimized 6-channel flt to s16p conversion
  lavr: x86: optimized 2-channel flt to s16p conversion
  lavr: x86: optimized 6-channel s16 to fltp conversion
  lavr: x86: optimized 2-channel s16 to fltp conversion
  lavr: x86: optimized 6-channel s16 to s16p conversion
  lavr: x86: optimized 2-channel s16 to s16p conversion
  lavr: x86: optimized 2-channel fltp to flt conversion
  lavr: x86: optimized 6-channel fltp to s16 conversion
  lavr: x86: optimized 2-channel fltp to s16 conversion
  lavr: x86: optimized 6-channel s16p to flt conversion
  lavr: x86: optimized 2-channel s16p to flt conversion
  lavr: x86: optimized 6-channel s16p to s16 conversion
  ...

Conflicts:
	libavcodec/dirac.c
	libavcodec/mpegvideo.h
	libavcodec/x86/Makefile

Merged-by: Michael Niedermayer <michaelni@gmx.at>
This commit is contained in:
Michael Niedermayer
2012-08-24 14:22:38 +02:00
19 changed files with 1397 additions and 180 deletions

View File

@@ -30,6 +30,11 @@ pf_s32_inv_scale: times 8 dd 0x30000000
pf_s32_scale: times 8 dd 0x4f000000
pf_s16_inv_scale: times 4 dd 0x38000000
pf_s16_scale: times 4 dd 0x47000000
pb_shuf_unpack_even: db -1, -1, 0, 1, -1, -1, 2, 3, -1, -1, 8, 9, -1, -1, 10, 11
pb_shuf_unpack_odd: db -1, -1, 4, 5, -1, -1, 6, 7, -1, -1, 12, 13, -1, -1, 14, 15
pb_interleave_words: SHUFFLE_MASK_W 0, 4, 1, 5, 2, 6, 3, 7
pb_deinterleave_words: SHUFFLE_MASK_W 0, 2, 4, 6, 1, 3, 5, 7
pw_zero_even: times 4 dw 0x0000, 0xffff
SECTION_TEXT
@@ -223,6 +228,512 @@ INIT_YMM avx
CONV_FLT_TO_S32
%endif
;------------------------------------------------------------------------------
; void ff_conv_s16p_to_s16_2ch(int16_t *dst, int16_t *const *src, int len,
; int channels);
;------------------------------------------------------------------------------
%macro CONV_S16P_TO_S16_2CH 0
cglobal conv_s16p_to_s16_2ch, 3,4,5, dst, src0, len, src1
mov src1q, [src0q+gprsize]
mov src0q, [src0q ]
lea lenq, [2*lend]
add src0q, lenq
add src1q, lenq
lea dstq, [dstq+2*lenq]
neg lenq
.loop
mova m0, [src0q+lenq ]
mova m1, [src1q+lenq ]
mova m2, [src0q+lenq+mmsize]
mova m3, [src1q+lenq+mmsize]
SBUTTERFLY2 wd, 0, 1, 4
SBUTTERFLY2 wd, 2, 3, 4
mova [dstq+2*lenq+0*mmsize], m0
mova [dstq+2*lenq+1*mmsize], m1
mova [dstq+2*lenq+2*mmsize], m2
mova [dstq+2*lenq+3*mmsize], m3
add lenq, 2*mmsize
jl .loop
REP_RET
%endmacro
INIT_XMM sse2
CONV_S16P_TO_S16_2CH
%if HAVE_AVX
INIT_XMM avx
CONV_S16P_TO_S16_2CH
%endif
;------------------------------------------------------------------------------
; void ff_conv_s16p_to_s16_6ch(int16_t *dst, int16_t *const *src, int len,
; int channels);
;------------------------------------------------------------------------------
;------------------------------------------------------------------------------
; NOTE: In the 6-channel functions, len could be used as an index on x86-64
; instead of just a counter, which would avoid incrementing the
; pointers, but the extra complexity and amount of code is not worth
; the small gain. On x86-32 there are not enough registers to use len
; as an index without keeping two of the pointers on the stack and
; loading them in each iteration.
;------------------------------------------------------------------------------
%macro CONV_S16P_TO_S16_6CH 0
%if ARCH_X86_64
cglobal conv_s16p_to_s16_6ch, 3,8,7, dst, src0, len, src1, src2, src3, src4, src5
%else
cglobal conv_s16p_to_s16_6ch, 2,7,7, dst, src0, src1, src2, src3, src4, src5
%define lend dword r2m
%endif
mov src1q, [src0q+1*gprsize]
mov src2q, [src0q+2*gprsize]
mov src3q, [src0q+3*gprsize]
mov src4q, [src0q+4*gprsize]
mov src5q, [src0q+5*gprsize]
mov src0q, [src0q]
sub src1q, src0q
sub src2q, src0q
sub src3q, src0q
sub src4q, src0q
sub src5q, src0q
.loop:
%if cpuflag(sse2slow)
movq m0, [src0q ] ; m0 = 0, 6, 12, 18, x, x, x, x
movq m1, [src0q+src1q] ; m1 = 1, 7, 13, 19, x, x, x, x
movq m2, [src0q+src2q] ; m2 = 2, 8, 14, 20, x, x, x, x
movq m3, [src0q+src3q] ; m3 = 3, 9, 15, 21, x, x, x, x
movq m4, [src0q+src4q] ; m4 = 4, 10, 16, 22, x, x, x, x
movq m5, [src0q+src5q] ; m5 = 5, 11, 17, 23, x, x, x, x
; unpack words:
punpcklwd m0, m1 ; m0 = 0, 1, 6, 7, 12, 13, 18, 19
punpcklwd m2, m3 ; m2 = 4, 5, 10, 11, 16, 17, 22, 23
punpcklwd m4, m5 ; m4 = 2, 3, 8, 9, 14, 15, 20, 21
; blend dwords
shufps m1, m0, m2, q2020 ; m1 = 0, 1, 12, 13, 2, 3, 14, 15
shufps m0, m4, q2031 ; m0 = 6, 7, 18, 19, 4, 5, 16, 17
shufps m2, m4, q3131 ; m2 = 8, 9, 20, 21, 10, 11, 22, 23
; shuffle dwords
pshufd m0, m0, q1302 ; m0 = 4, 5, 6, 7, 16, 17, 18, 19
pshufd m1, m1, q3120 ; m1 = 0, 1, 2, 3, 12, 13, 14, 15
pshufd m2, m2, q3120 ; m2 = 8, 9, 10, 11, 20, 21, 22, 23
movq [dstq+0*mmsize/2], m1
movq [dstq+1*mmsize/2], m0
movq [dstq+2*mmsize/2], m2
movhps [dstq+3*mmsize/2], m1
movhps [dstq+4*mmsize/2], m0
movhps [dstq+5*mmsize/2], m2
add src0q, mmsize/2
add dstq, mmsize*3
sub lend, mmsize/4
%else
mova m0, [src0q ] ; m0 = 0, 6, 12, 18, 24, 30, 36, 42
mova m1, [src0q+src1q] ; m1 = 1, 7, 13, 19, 25, 31, 37, 43
mova m2, [src0q+src2q] ; m2 = 2, 8, 14, 20, 26, 32, 38, 44
mova m3, [src0q+src3q] ; m3 = 3, 9, 15, 21, 27, 33, 39, 45
mova m4, [src0q+src4q] ; m4 = 4, 10, 16, 22, 28, 34, 40, 46
mova m5, [src0q+src5q] ; m5 = 5, 11, 17, 23, 29, 35, 41, 47
; unpack words:
SBUTTERFLY2 wd, 0, 1, 6 ; m0 = 0, 1, 6, 7, 12, 13, 18, 19
; m1 = 24, 25, 30, 31, 36, 37, 42, 43
SBUTTERFLY2 wd, 2, 3, 6 ; m2 = 2, 3, 8, 9, 14, 15, 20, 21
; m3 = 26, 27, 32, 33, 38, 39, 44, 45
SBUTTERFLY2 wd, 4, 5, 6 ; m4 = 4, 5, 10, 11, 16, 17, 22, 23
; m5 = 28, 29, 34, 35, 40, 41, 46, 47
; blend dwords
shufps m6, m0, m2, q2020 ; m6 = 0, 1, 12, 13, 2, 3, 14, 15
shufps m0, m4, q2031 ; m0 = 6, 7, 18, 19, 4, 5, 16, 17
shufps m2, m4, q3131 ; m2 = 8, 9, 20, 21, 10, 11, 22, 23
SWAP 4,6 ; m4 = 0, 1, 12, 13, 2, 3, 14, 15
shufps m6, m1, m3, q2020 ; m6 = 24, 25, 36, 37, 26, 27, 38, 39
shufps m1, m5, q2031 ; m1 = 30, 31, 42, 43, 28, 29, 40, 41
shufps m3, m5, q3131 ; m3 = 32, 33, 44, 45, 34, 35, 46, 47
SWAP 5,6 ; m5 = 24, 25, 36, 37, 26, 27, 38, 39
; shuffle dwords
pshufd m0, m0, q1302 ; m0 = 4, 5, 6, 7, 16, 17, 18, 19
pshufd m2, m2, q3120 ; m2 = 8, 9, 10, 11, 20, 21, 22, 23
pshufd m4, m4, q3120 ; m4 = 0, 1, 2, 3, 12, 13, 14, 15
pshufd m1, m1, q1302 ; m1 = 28, 29, 30, 31, 40, 41, 42, 43
pshufd m3, m3, q3120 ; m3 = 32, 33, 34, 35, 44, 45, 46, 47
pshufd m5, m5, q3120 ; m5 = 24, 25, 26, 27, 36, 37, 38, 39
; shuffle qwords
punpcklqdq m6, m4, m0 ; m6 = 0, 1, 2, 3, 4, 5, 6, 7
punpckhqdq m0, m2 ; m0 = 16, 17, 18, 19, 20, 21, 22, 23
shufps m2, m4, q3210 ; m2 = 8, 9, 10, 11, 12, 13, 14, 15
SWAP 4,6 ; m4 = 0, 1, 2, 3, 4, 5, 6, 7
punpcklqdq m6, m5, m1 ; m6 = 24, 25, 26, 27, 28, 29, 30, 31
punpckhqdq m1, m3 ; m1 = 40, 41, 42, 43, 44, 45, 46, 47
shufps m3, m5, q3210 ; m3 = 32, 33, 34, 35, 36, 37, 38, 39
SWAP 5,6 ; m5 = 24, 25, 26, 27, 28, 29, 30, 31
mova [dstq+0*mmsize], m4
mova [dstq+1*mmsize], m2
mova [dstq+2*mmsize], m0
mova [dstq+3*mmsize], m5
mova [dstq+4*mmsize], m3
mova [dstq+5*mmsize], m1
add src0q, mmsize
add dstq, mmsize*6
sub lend, mmsize/2
%endif
jg .loop
REP_RET
%endmacro
INIT_XMM sse2
CONV_S16P_TO_S16_6CH
INIT_XMM sse2slow
CONV_S16P_TO_S16_6CH
%if HAVE_AVX
INIT_XMM avx
CONV_S16P_TO_S16_6CH
%endif
;------------------------------------------------------------------------------
; void ff_conv_s16p_to_flt_2ch(float *dst, int16_t *const *src, int len,
; int channels);
;------------------------------------------------------------------------------
%macro CONV_S16P_TO_FLT_2CH 0
cglobal conv_s16p_to_flt_2ch, 3,4,6, dst, src0, len, src1
lea lenq, [2*lend]
mov src1q, [src0q+gprsize]
mov src0q, [src0q ]
lea dstq, [dstq+4*lenq]
add src0q, lenq
add src1q, lenq
neg lenq
mova m5, [pf_s32_inv_scale]
.loop:
mova m2, [src0q+lenq] ; m2 = 0, 2, 4, 6, 8, 10, 12, 14
mova m4, [src1q+lenq] ; m4 = 1, 3, 5, 7, 9, 11, 13, 15
SBUTTERFLY2 wd, 2, 4, 3 ; m2 = 0, 1, 2, 3, 4, 5, 6, 7
; m4 = 8, 9, 10, 11, 12, 13, 14, 15
pxor m3, m3
punpcklwd m0, m3, m2 ; m0 = 0, 1, 2, 3
punpckhwd m1, m3, m2 ; m1 = 4, 5, 6, 7
punpcklwd m2, m3, m4 ; m2 = 8, 9, 10, 11
punpckhwd m3, m4 ; m3 = 12, 13, 14, 15
cvtdq2ps m0, m0
cvtdq2ps m1, m1
cvtdq2ps m2, m2
cvtdq2ps m3, m3
mulps m0, m5
mulps m1, m5
mulps m2, m5
mulps m3, m5
mova [dstq+4*lenq ], m0
mova [dstq+4*lenq+ mmsize], m1
mova [dstq+4*lenq+2*mmsize], m2
mova [dstq+4*lenq+3*mmsize], m3
add lenq, mmsize
jl .loop
REP_RET
%endmacro
INIT_XMM sse2
CONV_S16P_TO_FLT_2CH
%if HAVE_AVX
INIT_XMM avx
CONV_S16P_TO_FLT_2CH
%endif
;------------------------------------------------------------------------------
; void ff_conv_s16p_to_flt_6ch(float *dst, int16_t *const *src, int len,
; int channels);
;------------------------------------------------------------------------------
%macro CONV_S16P_TO_FLT_6CH 0
%if ARCH_X86_64
cglobal conv_s16p_to_flt_6ch, 3,8,8, dst, src, len, src1, src2, src3, src4, src5
%else
cglobal conv_s16p_to_flt_6ch, 2,7,8, dst, src, src1, src2, src3, src4, src5
%define lend dword r2m
%endif
mov src1q, [srcq+1*gprsize]
mov src2q, [srcq+2*gprsize]
mov src3q, [srcq+3*gprsize]
mov src4q, [srcq+4*gprsize]
mov src5q, [srcq+5*gprsize]
mov srcq, [srcq]
sub src1q, srcq
sub src2q, srcq
sub src3q, srcq
sub src4q, srcq
sub src5q, srcq
mova m7, [pf_s32_inv_scale]
%if cpuflag(ssse3)
%define unpack_even m6
mova m6, [pb_shuf_unpack_even]
%if ARCH_X86_64
%define unpack_odd m8
mova m8, [pb_shuf_unpack_odd]
%else
%define unpack_odd [pb_shuf_unpack_odd]
%endif
%endif
.loop:
movq m0, [srcq ] ; m0 = 0, 6, 12, 18, x, x, x, x
movq m1, [srcq+src1q] ; m1 = 1, 7, 13, 19, x, x, x, x
movq m2, [srcq+src2q] ; m2 = 2, 8, 14, 20, x, x, x, x
movq m3, [srcq+src3q] ; m3 = 3, 9, 15, 21, x, x, x, x
movq m4, [srcq+src4q] ; m4 = 4, 10, 16, 22, x, x, x, x
movq m5, [srcq+src5q] ; m5 = 5, 11, 17, 23, x, x, x, x
; unpack words:
punpcklwd m0, m1 ; m0 = 0, 1, 6, 7, 12, 13, 18, 19
punpcklwd m2, m3 ; m2 = 2, 3, 8, 9, 14, 15, 20, 21
punpcklwd m4, m5 ; m4 = 4, 5, 10, 11, 16, 17, 22, 23
; blend dwords
shufps m1, m4, m0, q3120 ; m1 = 4, 5, 16, 17, 6, 7, 18, 19
shufps m0, m2, q2020 ; m0 = 0, 1, 12, 13, 2, 3, 14, 15
shufps m2, m4, q3131 ; m2 = 8, 9, 20, 21, 10, 11, 22, 23
%if cpuflag(ssse3)
pshufb m3, m0, unpack_odd ; m3 = 12, 13, 14, 15
pshufb m0, unpack_even ; m0 = 0, 1, 2, 3
pshufb m4, m1, unpack_odd ; m4 = 16, 17, 18, 19
pshufb m1, unpack_even ; m1 = 4, 5, 6, 7
pshufb m5, m2, unpack_odd ; m5 = 20, 21, 22, 23
pshufb m2, unpack_even ; m2 = 8, 9, 10, 11
%else
; shuffle dwords
pshufd m0, m0, q3120 ; m0 = 0, 1, 2, 3, 12, 13, 14, 15
pshufd m1, m1, q3120 ; m1 = 4, 5, 6, 7, 16, 17, 18, 19
pshufd m2, m2, q3120 ; m2 = 8, 9, 10, 11, 20, 21, 22, 23
pxor m6, m6 ; convert s16 in m0-m2 to s32 in m0-m5
punpcklwd m3, m6, m0 ; m3 = 0, 1, 2, 3
punpckhwd m4, m6, m0 ; m4 = 12, 13, 14, 15
punpcklwd m0, m6, m1 ; m0 = 4, 5, 6, 7
punpckhwd m5, m6, m1 ; m5 = 16, 17, 18, 19
punpcklwd m1, m6, m2 ; m1 = 8, 9, 10, 11
punpckhwd m6, m2 ; m6 = 20, 21, 22, 23
SWAP 6,2,1,0,3,4,5 ; swap registers 3,0,1,4,5,6 to 0,1,2,3,4,5
%endif
cvtdq2ps m0, m0 ; convert s32 to float
cvtdq2ps m1, m1
cvtdq2ps m2, m2
cvtdq2ps m3, m3
cvtdq2ps m4, m4
cvtdq2ps m5, m5
mulps m0, m7 ; scale float from s32 range to [-1.0,1.0]
mulps m1, m7
mulps m2, m7
mulps m3, m7
mulps m4, m7
mulps m5, m7
mova [dstq ], m0
mova [dstq+ mmsize], m1
mova [dstq+2*mmsize], m2
mova [dstq+3*mmsize], m3
mova [dstq+4*mmsize], m4
mova [dstq+5*mmsize], m5
add srcq, mmsize/2
add dstq, mmsize*6
sub lend, mmsize/4
jg .loop
REP_RET
%endmacro
INIT_XMM sse2
CONV_S16P_TO_FLT_6CH
INIT_XMM ssse3
CONV_S16P_TO_FLT_6CH
%if HAVE_AVX
INIT_XMM avx
CONV_S16P_TO_FLT_6CH
%endif
;------------------------------------------------------------------------------
; void ff_conv_fltp_to_s16_2ch(int16_t *dst, float *const *src, int len,
; int channels);
;------------------------------------------------------------------------------
%macro CONV_FLTP_TO_S16_2CH 0
cglobal conv_fltp_to_s16_2ch, 3,4,3, dst, src0, len, src1
lea lenq, [4*lend]
mov src1q, [src0q+gprsize]
mov src0q, [src0q ]
add dstq, lenq
add src0q, lenq
add src1q, lenq
neg lenq
mova m2, [pf_s16_scale]
%if cpuflag(ssse3)
mova m3, [pb_interleave_words]
%endif
.loop:
mulps m0, m2, [src0q+lenq] ; m0 = 0, 2, 4, 6
mulps m1, m2, [src1q+lenq] ; m1 = 1, 3, 5, 7
cvtps2dq m0, m0
cvtps2dq m1, m1
%if cpuflag(ssse3)
packssdw m0, m1 ; m0 = 0, 2, 4, 6, 1, 3, 5, 7
pshufb m0, m3 ; m0 = 0, 1, 2, 3, 4, 5, 6, 7
%else
packssdw m0, m0 ; m0 = 0, 2, 4, 6, x, x, x, x
packssdw m1, m1 ; m1 = 1, 3, 5, 7, x, x, x, x
punpcklwd m0, m1 ; m0 = 0, 1, 2, 3, 4, 5, 6, 7
%endif
mova [dstq+lenq], m0
add lenq, mmsize
jl .loop
REP_RET
%endmacro
INIT_XMM sse2
CONV_FLTP_TO_S16_2CH
INIT_XMM ssse3
CONV_FLTP_TO_S16_2CH
;------------------------------------------------------------------------------
; void ff_conv_fltp_to_s16_6ch(int16_t *dst, float *const *src, int len,
; int channels);
;------------------------------------------------------------------------------
%macro CONV_FLTP_TO_S16_6CH 0
%if ARCH_X86_64
cglobal conv_fltp_to_s16_6ch, 3,8,7, dst, src, len, src1, src2, src3, src4, src5
%else
cglobal conv_fltp_to_s16_6ch, 2,7,7, dst, src, src1, src2, src3, src4, src5
%define lend dword r2m
%endif
mov src1q, [srcq+1*gprsize]
mov src2q, [srcq+2*gprsize]
mov src3q, [srcq+3*gprsize]
mov src4q, [srcq+4*gprsize]
mov src5q, [srcq+5*gprsize]
mov srcq, [srcq]
sub src1q, srcq
sub src2q, srcq
sub src3q, srcq
sub src4q, srcq
sub src5q, srcq
movaps xmm6, [pf_s16_scale]
.loop:
%if cpuflag(sse2)
mulps m0, m6, [srcq ]
mulps m1, m6, [srcq+src1q]
mulps m2, m6, [srcq+src2q]
mulps m3, m6, [srcq+src3q]
mulps m4, m6, [srcq+src4q]
mulps m5, m6, [srcq+src5q]
cvtps2dq m0, m0
cvtps2dq m1, m1
cvtps2dq m2, m2
cvtps2dq m3, m3
cvtps2dq m4, m4
cvtps2dq m5, m5
packssdw m0, m3 ; m0 = 0, 6, 12, 18, 3, 9, 15, 21
packssdw m1, m4 ; m1 = 1, 7, 13, 19, 4, 10, 16, 22
packssdw m2, m5 ; m2 = 2, 8, 14, 20, 5, 11, 17, 23
; unpack words:
movhlps m3, m0 ; m3 = 3, 9, 15, 21, x, x, x, x
punpcklwd m0, m1 ; m0 = 0, 1, 6, 7, 12, 13, 18, 19
punpckhwd m1, m2 ; m1 = 4, 5, 10, 11, 16, 17, 22, 23
punpcklwd m2, m3 ; m2 = 2, 3, 8, 9, 14, 15, 20, 21
; blend dwords:
shufps m3, m0, m2, q2020 ; m3 = 0, 1, 12, 13, 2, 3, 14, 15
shufps m0, m1, q2031 ; m0 = 6, 7, 18, 19, 4, 5, 16, 17
shufps m2, m1, q3131 ; m2 = 8, 9, 20, 21, 10, 11, 22, 23
; shuffle dwords:
shufps m1, m2, m3, q3120 ; m1 = 8, 9, 10, 11, 12, 13, 14, 15
shufps m3, m0, q0220 ; m3 = 0, 1, 2, 3, 4, 5, 6, 7
shufps m0, m2, q3113 ; m0 = 16, 17, 18, 19, 20, 21, 22, 23
mova [dstq+0*mmsize], m3
mova [dstq+1*mmsize], m1
mova [dstq+2*mmsize], m0
%else ; sse
movlps xmm0, [srcq ]
movlps xmm1, [srcq+src1q]
movlps xmm2, [srcq+src2q]
movlps xmm3, [srcq+src3q]
movlps xmm4, [srcq+src4q]
movlps xmm5, [srcq+src5q]
mulps xmm0, xmm6
mulps xmm1, xmm6
mulps xmm2, xmm6
mulps xmm3, xmm6
mulps xmm4, xmm6
mulps xmm5, xmm6
cvtps2pi mm0, xmm0
cvtps2pi mm1, xmm1
cvtps2pi mm2, xmm2
cvtps2pi mm3, xmm3
cvtps2pi mm4, xmm4
cvtps2pi mm5, xmm5
packssdw mm0, mm3 ; m0 = 0, 6, 3, 9
packssdw mm1, mm4 ; m1 = 1, 7, 4, 10
packssdw mm2, mm5 ; m2 = 2, 8, 5, 11
; unpack words
pshufw mm3, mm0, q1032 ; m3 = 3, 9, 0, 6
punpcklwd mm0, mm1 ; m0 = 0, 1, 6, 7
punpckhwd mm1, mm2 ; m1 = 4, 5, 10, 11
punpcklwd mm2, mm3 ; m2 = 2, 3, 8, 9
; unpack dwords
pshufw mm3, mm0, q1032 ; m3 = 6, 7, 0, 1
punpckldq mm0, mm2 ; m0 = 0, 1, 2, 3 (final)
punpckhdq mm2, mm1 ; m2 = 8, 9, 10, 11 (final)
punpckldq mm1, mm3 ; m1 = 4, 5, 6, 7 (final)
mova [dstq+0*mmsize], mm0
mova [dstq+1*mmsize], mm1
mova [dstq+2*mmsize], mm2
%endif
add srcq, mmsize
add dstq, mmsize*3
sub lend, mmsize/4
jg .loop
%if mmsize == 8
emms
RET
%else
REP_RET
%endif
%endmacro
INIT_MMX sse
CONV_FLTP_TO_S16_6CH
INIT_XMM sse2
CONV_FLTP_TO_S16_6CH
%if HAVE_AVX
INIT_XMM avx
CONV_FLTP_TO_S16_6CH
%endif
;------------------------------------------------------------------------------
; void ff_conv_fltp_to_flt_2ch(float *dst, float *const *src, int len,
; int channels);
;------------------------------------------------------------------------------
%macro CONV_FLTP_TO_FLT_2CH 0
cglobal conv_fltp_to_flt_2ch, 3,4,5, dst, src0, len, src1
mov src1q, [src0q+gprsize]
mov src0q, [src0q]
lea lenq, [4*lend]
add src0q, lenq
add src1q, lenq
lea dstq, [dstq+2*lenq]
neg lenq
.loop
mova m0, [src0q+lenq ]
mova m1, [src1q+lenq ]
mova m2, [src0q+lenq+mmsize]
mova m3, [src1q+lenq+mmsize]
SBUTTERFLYPS 0, 1, 4
SBUTTERFLYPS 2, 3, 4
mova [dstq+2*lenq+0*mmsize], m0
mova [dstq+2*lenq+1*mmsize], m1
mova [dstq+2*lenq+2*mmsize], m2
mova [dstq+2*lenq+3*mmsize], m3
add lenq, 2*mmsize
jl .loop
REP_RET
%endmacro
INIT_XMM sse
CONV_FLTP_TO_FLT_2CH
%if HAVE_AVX
INIT_XMM avx
CONV_FLTP_TO_FLT_2CH
%endif
;-----------------------------------------------------------------------------
; void ff_conv_fltp_to_flt_6ch(float *dst, float *const *src, int len,
; int channels);
@@ -303,3 +814,449 @@ CONV_FLTP_TO_FLT_6CH
INIT_XMM avx
CONV_FLTP_TO_FLT_6CH
%endif
;------------------------------------------------------------------------------
; void ff_conv_s16_to_s16p_2ch(int16_t *const *dst, int16_t *src, int len,
; int channels);
;------------------------------------------------------------------------------
%macro CONV_S16_TO_S16P_2CH 0
cglobal conv_s16_to_s16p_2ch, 3,4,4, dst0, src, len, dst1
lea lenq, [2*lend]
mov dst1q, [dst0q+gprsize]
mov dst0q, [dst0q ]
lea srcq, [srcq+2*lenq]
add dst0q, lenq
add dst1q, lenq
neg lenq
%if cpuflag(ssse3)
mova m3, [pb_deinterleave_words]
%endif
.loop:
mova m0, [srcq+2*lenq ] ; m0 = 0, 1, 2, 3, 4, 5, 6, 7
mova m1, [srcq+2*lenq+mmsize] ; m1 = 8, 9, 10, 11, 12, 13, 14, 15
%if cpuflag(ssse3)
pshufb m0, m3 ; m0 = 0, 2, 4, 6, 1, 3, 5, 7
pshufb m1, m3 ; m1 = 8, 10, 12, 14, 9, 11, 13, 15
SBUTTERFLY2 qdq, 0, 1, 2 ; m0 = 0, 2, 4, 6, 8, 10, 12, 14
; m1 = 1, 3, 5, 7, 9, 11, 13, 15
%else ; sse2
pshuflw m0, m0, q3120 ; m0 = 0, 2, 1, 3, 4, 5, 6, 7
pshufhw m0, m0, q3120 ; m0 = 0, 2, 1, 3, 4, 6, 5, 7
pshuflw m1, m1, q3120 ; m1 = 8, 10, 9, 11, 12, 13, 14, 15
pshufhw m1, m1, q3120 ; m1 = 8, 10, 9, 11, 12, 14, 13, 15
DEINT2_PS 0, 1, 2 ; m0 = 0, 2, 4, 6, 8, 10, 12, 14
; m1 = 1, 3, 5, 7, 9, 11, 13, 15
%endif
mova [dst0q+lenq], m0
mova [dst1q+lenq], m1
add lenq, mmsize
jl .loop
REP_RET
%endmacro
INIT_XMM sse2
CONV_S16_TO_S16P_2CH
INIT_XMM ssse3
CONV_S16_TO_S16P_2CH
%if HAVE_AVX
INIT_XMM avx
CONV_S16_TO_S16P_2CH
%endif
;------------------------------------------------------------------------------
; void ff_conv_s16_to_s16p_6ch(int16_t *const *dst, int16_t *src, int len,
; int channels);
;------------------------------------------------------------------------------
%macro CONV_S16_TO_S16P_6CH 0
%if ARCH_X86_64
cglobal conv_s16_to_s16p_6ch, 3,8,5, dst, src, len, dst1, dst2, dst3, dst4, dst5
%else
cglobal conv_s16_to_s16p_6ch, 2,7,5, dst, src, dst1, dst2, dst3, dst4, dst5
%define lend dword r2m
%endif
mov dst1q, [dstq+ gprsize]
mov dst2q, [dstq+2*gprsize]
mov dst3q, [dstq+3*gprsize]
mov dst4q, [dstq+4*gprsize]
mov dst5q, [dstq+5*gprsize]
mov dstq, [dstq ]
sub dst1q, dstq
sub dst2q, dstq
sub dst3q, dstq
sub dst4q, dstq
sub dst5q, dstq
.loop:
mova m0, [srcq+0*mmsize] ; m0 = 0, 1, 2, 3, 4, 5, 6, 7
mova m3, [srcq+1*mmsize] ; m3 = 8, 9, 10, 11, 12, 13, 14, 15
mova m2, [srcq+2*mmsize] ; m2 = 16, 17, 18, 19, 20, 21, 22, 23
PALIGNR m1, m3, m0, 12, m4 ; m1 = 6, 7, 8, 9, 10, 11, x, x
shufps m3, m2, q1032 ; m3 = 12, 13, 14, 15, 16, 17, 18, 19
psrldq m2, 4 ; m2 = 18, 19, 20, 21, 22, 23, x, x
SBUTTERFLY2 wd, 0, 1, 4 ; m0 = 0, 6, 1, 7, 2, 8, 3, 9
; m1 = 4, 10, 5, 11, x, x, x, x
SBUTTERFLY2 wd, 3, 2, 4 ; m3 = 12, 18, 13, 19, 14, 20, 15, 21
; m2 = 16, 22, 17, 23, x, x, x, x
SBUTTERFLY2 dq, 0, 3, 4 ; m0 = 0, 6, 12, 18, 1, 7, 13, 19
; m3 = 2, 8, 14, 20, 3, 9, 15, 21
punpckldq m1, m2 ; m1 = 4, 10, 16, 22, 5, 11, 17, 23
movq [dstq ], m0
movhps [dstq+dst1q], m0
movq [dstq+dst2q], m3
movhps [dstq+dst3q], m3
movq [dstq+dst4q], m1
movhps [dstq+dst5q], m1
add srcq, mmsize*3
add dstq, mmsize/2
sub lend, mmsize/4
jg .loop
REP_RET
%endmacro
%define PALIGNR PALIGNR_MMX
INIT_XMM sse2
CONV_S16_TO_S16P_6CH
%define PALIGNR PALIGNR_SSSE3
INIT_XMM ssse3
CONV_S16_TO_S16P_6CH
%if HAVE_AVX
INIT_XMM avx
CONV_S16_TO_S16P_6CH
%endif
;------------------------------------------------------------------------------
; void ff_conv_s16_to_fltp_2ch(float *const *dst, int16_t *src, int len,
; int channels);
;------------------------------------------------------------------------------
%macro CONV_S16_TO_FLTP_2CH 0
cglobal conv_s16_to_fltp_2ch, 3,4,5, dst0, src, len, dst1
lea lenq, [4*lend]
mov dst1q, [dst0q+gprsize]
mov dst0q, [dst0q ]
add srcq, lenq
add dst0q, lenq
add dst1q, lenq
neg lenq
mova m3, [pf_s32_inv_scale]
mova m4, [pw_zero_even]
.loop:
mova m1, [srcq+lenq]
pslld m0, m1, 16
pand m1, m4
cvtdq2ps m0, m0
cvtdq2ps m1, m1
mulps m0, m0, m3
mulps m1, m1, m3
mova [dst0q+lenq], m0
mova [dst1q+lenq], m1
add lenq, mmsize
jl .loop
REP_RET
%endmacro
INIT_XMM sse2
CONV_S16_TO_FLTP_2CH
%if HAVE_AVX
INIT_XMM avx
CONV_S16_TO_FLTP_2CH
%endif
;------------------------------------------------------------------------------
; void ff_conv_s16_to_fltp_6ch(float *const *dst, int16_t *src, int len,
; int channels);
;------------------------------------------------------------------------------
%macro CONV_S16_TO_FLTP_6CH 0
%if ARCH_X86_64
cglobal conv_s16_to_fltp_6ch, 3,8,7, dst, src, len, dst1, dst2, dst3, dst4, dst5
%else
cglobal conv_s16_to_fltp_6ch, 2,7,7, dst, src, dst1, dst2, dst3, dst4, dst5
%define lend dword r2m
%endif
mov dst1q, [dstq+ gprsize]
mov dst2q, [dstq+2*gprsize]
mov dst3q, [dstq+3*gprsize]
mov dst4q, [dstq+4*gprsize]
mov dst5q, [dstq+5*gprsize]
mov dstq, [dstq ]
sub dst1q, dstq
sub dst2q, dstq
sub dst3q, dstq
sub dst4q, dstq
sub dst5q, dstq
mova m6, [pf_s16_inv_scale]
.loop:
mova m0, [srcq+0*mmsize] ; m0 = 0, 1, 2, 3, 4, 5, 6, 7
mova m3, [srcq+1*mmsize] ; m3 = 8, 9, 10, 11, 12, 13, 14, 15
mova m2, [srcq+2*mmsize] ; m2 = 16, 17, 18, 19, 20, 21, 22, 23
PALIGNR m1, m3, m0, 12, m4 ; m1 = 6, 7, 8, 9, 10, 11, x, x
shufps m3, m2, q1032 ; m3 = 12, 13, 14, 15, 16, 17, 18, 19
psrldq m2, 4 ; m2 = 18, 19, 20, 21, 22, 23, x, x
SBUTTERFLY2 wd, 0, 1, 4 ; m0 = 0, 6, 1, 7, 2, 8, 3, 9
; m1 = 4, 10, 5, 11, x, x, x, x
SBUTTERFLY2 wd, 3, 2, 4 ; m3 = 12, 18, 13, 19, 14, 20, 15, 21
; m2 = 16, 22, 17, 23, x, x, x, x
SBUTTERFLY2 dq, 0, 3, 4 ; m0 = 0, 6, 12, 18, 1, 7, 13, 19
; m3 = 2, 8, 14, 20, 3, 9, 15, 21
punpckldq m1, m2 ; m1 = 4, 10, 16, 22, 5, 11, 17, 23
S16_TO_S32_SX 0, 2 ; m0 = 0, 6, 12, 18
; m2 = 1, 7, 13, 19
S16_TO_S32_SX 3, 4 ; m3 = 2, 8, 14, 20
; m4 = 3, 9, 15, 21
S16_TO_S32_SX 1, 5 ; m1 = 4, 10, 16, 22
; m5 = 5, 11, 17, 23
SWAP 1,2,3,4
cvtdq2ps m0, m0
cvtdq2ps m1, m1
cvtdq2ps m2, m2
cvtdq2ps m3, m3
cvtdq2ps m4, m4
cvtdq2ps m5, m5
mulps m0, m6
mulps m1, m6
mulps m2, m6
mulps m3, m6
mulps m4, m6
mulps m5, m6
mova [dstq ], m0
mova [dstq+dst1q], m1
mova [dstq+dst2q], m2
mova [dstq+dst3q], m3
mova [dstq+dst4q], m4
mova [dstq+dst5q], m5
add srcq, mmsize*3
add dstq, mmsize
sub lend, mmsize/4
jg .loop
REP_RET
%endmacro
%define PALIGNR PALIGNR_MMX
INIT_XMM sse2
CONV_S16_TO_FLTP_6CH
%define PALIGNR PALIGNR_SSSE3
INIT_XMM ssse3
CONV_S16_TO_FLTP_6CH
INIT_XMM sse4
CONV_S16_TO_FLTP_6CH
%if HAVE_AVX
INIT_XMM avx
CONV_S16_TO_FLTP_6CH
%endif
;------------------------------------------------------------------------------
; void ff_conv_flt_to_s16p_2ch(int16_t *const *dst, float *src, int len,
; int channels);
;------------------------------------------------------------------------------
%macro CONV_FLT_TO_S16P_2CH 0
cglobal conv_flt_to_s16p_2ch, 3,4,6, dst0, src, len, dst1
lea lenq, [2*lend]
mov dst1q, [dst0q+gprsize]
mov dst0q, [dst0q ]
lea srcq, [srcq+4*lenq]
add dst0q, lenq
add dst1q, lenq
neg lenq
mova m5, [pf_s16_scale]
.loop:
mova m0, [srcq+4*lenq ]
mova m1, [srcq+4*lenq+ mmsize]
mova m2, [srcq+4*lenq+2*mmsize]
mova m3, [srcq+4*lenq+3*mmsize]
DEINT2_PS 0, 1, 4
DEINT2_PS 2, 3, 4
mulps m0, m0, m5
mulps m1, m1, m5
mulps m2, m2, m5
mulps m3, m3, m5
cvtps2dq m0, m0
cvtps2dq m1, m1
cvtps2dq m2, m2
cvtps2dq m3, m3
packssdw m0, m2
packssdw m1, m3
mova [dst0q+lenq], m0
mova [dst1q+lenq], m1
add lenq, mmsize
jl .loop
REP_RET
%endmacro
INIT_XMM sse2
CONV_FLT_TO_S16P_2CH
%if HAVE_AVX
INIT_XMM avx
CONV_FLT_TO_S16P_2CH
%endif
;------------------------------------------------------------------------------
; void ff_conv_flt_to_s16p_6ch(int16_t *const *dst, float *src, int len,
; int channels);
;------------------------------------------------------------------------------
%macro CONV_FLT_TO_S16P_6CH 0
%if ARCH_X86_64
cglobal conv_flt_to_s16p_6ch, 3,8,7, dst, src, len, dst1, dst2, dst3, dst4, dst5
%else
cglobal conv_flt_to_s16p_6ch, 2,7,7, dst, src, dst1, dst2, dst3, dst4, dst5
%define lend dword r2m
%endif
mov dst1q, [dstq+ gprsize]
mov dst2q, [dstq+2*gprsize]
mov dst3q, [dstq+3*gprsize]
mov dst4q, [dstq+4*gprsize]
mov dst5q, [dstq+5*gprsize]
mov dstq, [dstq ]
sub dst1q, dstq
sub dst2q, dstq
sub dst3q, dstq
sub dst4q, dstq
sub dst5q, dstq
mova m6, [pf_s16_scale]
.loop:
mulps m0, m6, [srcq+0*mmsize]
mulps m3, m6, [srcq+1*mmsize]
mulps m1, m6, [srcq+2*mmsize]
mulps m4, m6, [srcq+3*mmsize]
mulps m2, m6, [srcq+4*mmsize]
mulps m5, m6, [srcq+5*mmsize]
cvtps2dq m0, m0
cvtps2dq m1, m1
cvtps2dq m2, m2
cvtps2dq m3, m3
cvtps2dq m4, m4
cvtps2dq m5, m5
packssdw m0, m3 ; m0 = 0, 1, 2, 3, 4, 5, 6, 7
packssdw m1, m4 ; m1 = 8, 9, 10, 11, 12, 13, 14, 15
packssdw m2, m5 ; m2 = 16, 17, 18, 19, 20, 21, 22, 23
PALIGNR m3, m1, m0, 12, m4 ; m3 = 6, 7, 8, 9, 10, 11, x, x
shufps m1, m2, q1032 ; m1 = 12, 13, 14, 15, 16, 17, 18, 19
psrldq m2, 4 ; m2 = 18, 19, 20, 21, 22, 23, x, x
SBUTTERFLY2 wd, 0, 3, 4 ; m0 = 0, 6, 1, 7, 2, 8, 3, 9
; m3 = 4, 10, 5, 11, x, x, x, x
SBUTTERFLY2 wd, 1, 2, 4 ; m1 = 12, 18, 13, 19, 14, 20, 15, 21
; m2 = 16, 22, 17, 23, x, x, x, x
SBUTTERFLY2 dq, 0, 1, 4 ; m0 = 0, 6, 12, 18, 1, 7, 13, 19
; m1 = 2, 8, 14, 20, 3, 9, 15, 21
punpckldq m3, m2 ; m3 = 4, 10, 16, 22, 5, 11, 17, 23
movq [dstq ], m0
movhps [dstq+dst1q], m0
movq [dstq+dst2q], m1
movhps [dstq+dst3q], m1
movq [dstq+dst4q], m3
movhps [dstq+dst5q], m3
add srcq, mmsize*6
add dstq, mmsize/2
sub lend, mmsize/4
jg .loop
REP_RET
%endmacro
%define PALIGNR PALIGNR_MMX
INIT_XMM sse2
CONV_FLT_TO_S16P_6CH
%define PALIGNR PALIGNR_SSSE3
INIT_XMM ssse3
CONV_FLT_TO_S16P_6CH
%if HAVE_AVX
INIT_XMM avx
CONV_FLT_TO_S16P_6CH
%endif
;------------------------------------------------------------------------------
; void ff_conv_flt_to_fltp_2ch(float *const *dst, float *src, int len,
; int channels);
;------------------------------------------------------------------------------
%macro CONV_FLT_TO_FLTP_2CH 0
cglobal conv_flt_to_fltp_2ch, 3,4,3, dst0, src, len, dst1
lea lenq, [4*lend]
mov dst1q, [dst0q+gprsize]
mov dst0q, [dst0q ]
lea srcq, [srcq+2*lenq]
add dst0q, lenq
add dst1q, lenq
neg lenq
.loop:
mova m0, [srcq+2*lenq ]
mova m1, [srcq+2*lenq+mmsize]
DEINT2_PS 0, 1, 2
mova [dst0q+lenq], m0
mova [dst1q+lenq], m1
add lenq, mmsize
jl .loop
REP_RET
%endmacro
INIT_XMM sse
CONV_FLT_TO_FLTP_2CH
%if HAVE_AVX
INIT_XMM avx
CONV_FLT_TO_FLTP_2CH
%endif
;------------------------------------------------------------------------------
; void ff_conv_flt_to_fltp_6ch(float *const *dst, float *src, int len,
; int channels);
;------------------------------------------------------------------------------
%macro CONV_FLT_TO_FLTP_6CH 0
%if ARCH_X86_64
cglobal conv_flt_to_fltp_6ch, 3,8,7, dst, src, len, dst1, dst2, dst3, dst4, dst5
%else
cglobal conv_flt_to_fltp_6ch, 2,7,7, dst, src, dst1, dst2, dst3, dst4, dst5
%define lend dword r2m
%endif
mov dst1q, [dstq+ gprsize]
mov dst2q, [dstq+2*gprsize]
mov dst3q, [dstq+3*gprsize]
mov dst4q, [dstq+4*gprsize]
mov dst5q, [dstq+5*gprsize]
mov dstq, [dstq ]
sub dst1q, dstq
sub dst2q, dstq
sub dst3q, dstq
sub dst4q, dstq
sub dst5q, dstq
.loop:
mova m0, [srcq+0*mmsize] ; m0 = 0, 1, 2, 3
mova m1, [srcq+1*mmsize] ; m1 = 4, 5, 6, 7
mova m2, [srcq+2*mmsize] ; m2 = 8, 9, 10, 11
mova m3, [srcq+3*mmsize] ; m3 = 12, 13, 14, 15
mova m4, [srcq+4*mmsize] ; m4 = 16, 17, 18, 19
mova m5, [srcq+5*mmsize] ; m5 = 20, 21, 22, 23
SBUTTERFLY2 dq, 0, 3, 6 ; m0 = 0, 12, 1, 13
; m3 = 2, 14, 3, 15
SBUTTERFLY2 dq, 1, 4, 6 ; m1 = 4, 16, 5, 17
; m4 = 6, 18, 7, 19
SBUTTERFLY2 dq, 2, 5, 6 ; m2 = 8, 20, 9, 21
; m5 = 10, 22, 11, 23
SBUTTERFLY2 dq, 0, 4, 6 ; m0 = 0, 6, 12, 18
; m4 = 1, 7, 13, 19
SBUTTERFLY2 dq, 3, 2, 6 ; m3 = 2, 8, 14, 20
; m2 = 3, 9, 15, 21
SBUTTERFLY2 dq, 1, 5, 6 ; m1 = 4, 10, 16, 22
; m5 = 5, 11, 17, 23
mova [dstq ], m0
mova [dstq+dst1q], m4
mova [dstq+dst2q], m3
mova [dstq+dst3q], m2
mova [dstq+dst4q], m1
mova [dstq+dst5q], m5
add srcq, mmsize*6
add dstq, mmsize
sub lend, mmsize/4
jg .loop
REP_RET
%endmacro
INIT_XMM sse2
CONV_FLT_TO_FLTP_6CH
%if HAVE_AVX
INIT_XMM avx
CONV_FLT_TO_FLTP_6CH
%endif

View File

@@ -22,6 +22,8 @@
#include "libavutil/cpu.h"
#include "libavresample/audio_convert.h"
/* flat conversions */
extern void ff_conv_s16_to_s32_sse2(int16_t *dst, const int32_t *src, int len);
extern void ff_conv_s16_to_flt_sse2(float *dst, const int16_t *src, int len);
@@ -38,6 +40,49 @@ extern void ff_conv_flt_to_s16_sse2(int16_t *dst, const float *src, int len);
extern void ff_conv_flt_to_s32_sse2(int32_t *dst, const float *src, int len);
extern void ff_conv_flt_to_s32_avx (int32_t *dst, const float *src, int len);
/* interleave conversions */
extern void ff_conv_s16p_to_s16_2ch_sse2(int16_t *dst, int16_t *const *src,
int len, int channels);
extern void ff_conv_s16p_to_s16_2ch_avx (int16_t *dst, int16_t *const *src,
int len, int channels);
extern void ff_conv_s16p_to_s16_6ch_sse2(int16_t *dst, int16_t *const *src,
int len, int channels);
extern void ff_conv_s16p_to_s16_6ch_sse2slow(int16_t *dst, int16_t *const *src,
int len, int channels);
extern void ff_conv_s16p_to_s16_6ch_avx (int16_t *dst, int16_t *const *src,
int len, int channels);
extern void ff_conv_s16p_to_flt_2ch_sse2(float *dst, int16_t *const *src,
int len, int channels);
extern void ff_conv_s16p_to_flt_2ch_avx (float *dst, int16_t *const *src,
int len, int channels);
extern void ff_conv_s16p_to_flt_6ch_sse2 (float *dst, int16_t *const *src,
int len, int channels);
extern void ff_conv_s16p_to_flt_6ch_ssse3(float *dst, int16_t *const *src,
int len, int channels);
extern void ff_conv_s16p_to_flt_6ch_avx (float *dst, int16_t *const *src,
int len, int channels);
extern void ff_conv_fltp_to_s16_2ch_sse2 (int16_t *dst, float *const *src,
int len, int channels);
extern void ff_conv_fltp_to_s16_2ch_ssse3(int16_t *dst, float *const *src,
int len, int channels);
extern void ff_conv_fltp_to_s16_6ch_sse (int16_t *dst, float *const *src,
int len, int channels);
extern void ff_conv_fltp_to_s16_6ch_sse2(int16_t *dst, float *const *src,
int len, int channels);
extern void ff_conv_fltp_to_s16_6ch_avx (int16_t *dst, float *const *src,
int len, int channels);
extern void ff_conv_fltp_to_flt_2ch_sse(float *dst, float *const *src, int len,
int channels);
extern void ff_conv_fltp_to_flt_2ch_avx(float *dst, float *const *src, int len,
int channels);
extern void ff_conv_fltp_to_flt_6ch_mmx (float *dst, float *const *src, int len,
int channels);
extern void ff_conv_fltp_to_flt_6ch_sse4(float *dst, float *const *src, int len,
@@ -45,6 +90,58 @@ extern void ff_conv_fltp_to_flt_6ch_sse4(float *dst, float *const *src, int len,
extern void ff_conv_fltp_to_flt_6ch_avx (float *dst, float *const *src, int len,
int channels);
/* deinterleave conversions */
extern void ff_conv_s16_to_s16p_2ch_sse2(int16_t *const *dst, int16_t *src,
int len, int channels);
extern void ff_conv_s16_to_s16p_2ch_ssse3(int16_t *const *dst, int16_t *src,
int len, int channels);
extern void ff_conv_s16_to_s16p_2ch_avx (int16_t *const *dst, int16_t *src,
int len, int channels);
extern void ff_conv_s16_to_s16p_6ch_sse2 (int16_t *const *dst, int16_t *src,
int len, int channels);
extern void ff_conv_s16_to_s16p_6ch_ssse3(int16_t *const *dst, int16_t *src,
int len, int channels);
extern void ff_conv_s16_to_s16p_6ch_avx (int16_t *const *dst, int16_t *src,
int len, int channels);
extern void ff_conv_s16_to_fltp_2ch_sse2(float *const *dst, int16_t *src,
int len, int channels);
extern void ff_conv_s16_to_fltp_2ch_avx (float *const *dst, int16_t *src,
int len, int channels);
extern void ff_conv_s16_to_fltp_6ch_sse2 (float *const *dst, int16_t *src,
int len, int channels);
extern void ff_conv_s16_to_fltp_6ch_ssse3(float *const *dst, int16_t *src,
int len, int channels);
extern void ff_conv_s16_to_fltp_6ch_sse4 (float *const *dst, int16_t *src,
int len, int channels);
extern void ff_conv_s16_to_fltp_6ch_avx (float *const *dst, int16_t *src,
int len, int channels);
extern void ff_conv_flt_to_s16p_2ch_sse2(int16_t *const *dst, float *src,
int len, int channels);
extern void ff_conv_flt_to_s16p_2ch_avx (int16_t *const *dst, float *src,
int len, int channels);
extern void ff_conv_flt_to_s16p_6ch_sse2 (int16_t *const *dst, float *src,
int len, int channels);
extern void ff_conv_flt_to_s16p_6ch_ssse3(int16_t *const *dst, float *src,
int len, int channels);
extern void ff_conv_flt_to_s16p_6ch_avx (int16_t *const *dst, float *src,
int len, int channels);
extern void ff_conv_flt_to_fltp_2ch_sse(float *const *dst, float *src, int len,
int channels);
extern void ff_conv_flt_to_fltp_2ch_avx(float *const *dst, float *src, int len,
int channels);
extern void ff_conv_flt_to_fltp_6ch_sse2(float *const *dst, float *src, int len,
int channels);
extern void ff_conv_flt_to_fltp_6ch_avx (float *const *dst, float *src, int len,
int channels);
av_cold void ff_audio_convert_init_x86(AudioConvert *ac)
{
#if HAVE_YASM
@@ -56,10 +153,25 @@ av_cold void ff_audio_convert_init_x86(AudioConvert *ac)
ff_audio_convert_set_func(ac, AV_SAMPLE_FMT_FLT, AV_SAMPLE_FMT_FLTP,
6, 1, 4, "MMX", ff_conv_fltp_to_flt_6ch_mmx);
}
if (mm_flags & AV_CPU_FLAG_SSE && HAVE_SSE) {
ff_audio_convert_set_func(ac, AV_SAMPLE_FMT_S16, AV_SAMPLE_FMT_FLTP,
6, 1, 2, "SSE", ff_conv_fltp_to_s16_6ch_sse);
ff_audio_convert_set_func(ac, AV_SAMPLE_FMT_FLT, AV_SAMPLE_FMT_FLTP,
2, 16, 8, "SSE", ff_conv_fltp_to_flt_2ch_sse);
ff_audio_convert_set_func(ac, AV_SAMPLE_FMT_FLTP, AV_SAMPLE_FMT_FLT,
2, 16, 4, "SSE", ff_conv_flt_to_fltp_2ch_sse);
}
if (mm_flags & AV_CPU_FLAG_SSE2 && HAVE_SSE) {
if (!(mm_flags & AV_CPU_FLAG_SSE2SLOW)) {
ff_audio_convert_set_func(ac, AV_SAMPLE_FMT_S16, AV_SAMPLE_FMT_S32,
0, 16, 16, "SSE2", ff_conv_s32_to_s16_sse2);
ff_audio_convert_set_func(ac, AV_SAMPLE_FMT_S16, AV_SAMPLE_FMT_S16P,
6, 16, 8, "SSE2", ff_conv_s16p_to_s16_6ch_sse2);
ff_audio_convert_set_func(ac, AV_SAMPLE_FMT_S16, AV_SAMPLE_FMT_FLTP,
6, 16, 4, "SSE2", ff_conv_fltp_to_s16_6ch_sse2);
} else {
ff_audio_convert_set_func(ac, AV_SAMPLE_FMT_S16, AV_SAMPLE_FMT_S16P,
6, 1, 4, "SSE2SLOW", ff_conv_s16p_to_s16_6ch_sse2slow);
}
ff_audio_convert_set_func(ac, AV_SAMPLE_FMT_S32, AV_SAMPLE_FMT_S16,
0, 16, 8, "SSE2", ff_conv_s16_to_s32_sse2);
@@ -71,6 +183,42 @@ av_cold void ff_audio_convert_init_x86(AudioConvert *ac)
0, 16, 16, "SSE2", ff_conv_flt_to_s16_sse2);
ff_audio_convert_set_func(ac, AV_SAMPLE_FMT_S32, AV_SAMPLE_FMT_FLT,
0, 16, 16, "SSE2", ff_conv_flt_to_s32_sse2);
ff_audio_convert_set_func(ac, AV_SAMPLE_FMT_S16, AV_SAMPLE_FMT_S16P,
2, 16, 16, "SSE2", ff_conv_s16p_to_s16_2ch_sse2);
ff_audio_convert_set_func(ac, AV_SAMPLE_FMT_FLT, AV_SAMPLE_FMT_S16P,
2, 16, 8, "SSE2", ff_conv_s16p_to_flt_2ch_sse2);
ff_audio_convert_set_func(ac, AV_SAMPLE_FMT_FLT, AV_SAMPLE_FMT_S16P,
6, 16, 4, "SSE2", ff_conv_s16p_to_flt_6ch_sse2);
ff_audio_convert_set_func(ac, AV_SAMPLE_FMT_S16, AV_SAMPLE_FMT_FLTP,
2, 16, 4, "SSE2", ff_conv_fltp_to_s16_2ch_sse2);
ff_audio_convert_set_func(ac, AV_SAMPLE_FMT_S16P, AV_SAMPLE_FMT_S16,
2, 16, 8, "SSE2", ff_conv_s16_to_s16p_2ch_sse2);
ff_audio_convert_set_func(ac, AV_SAMPLE_FMT_S16P, AV_SAMPLE_FMT_S16,
6, 16, 4, "SSE2", ff_conv_s16_to_s16p_6ch_sse2);
ff_audio_convert_set_func(ac, AV_SAMPLE_FMT_FLTP, AV_SAMPLE_FMT_S16,
2, 16, 8, "SSE2", ff_conv_s16_to_fltp_2ch_sse2);
ff_audio_convert_set_func(ac, AV_SAMPLE_FMT_FLTP, AV_SAMPLE_FMT_S16,
6, 16, 4, "SSE2", ff_conv_s16_to_fltp_6ch_sse2);
ff_audio_convert_set_func(ac, AV_SAMPLE_FMT_S16P, AV_SAMPLE_FMT_FLT,
2, 16, 8, "SSE2", ff_conv_flt_to_s16p_2ch_sse2);
ff_audio_convert_set_func(ac, AV_SAMPLE_FMT_S16P, AV_SAMPLE_FMT_FLT,
6, 16, 4, "SSE2", ff_conv_flt_to_s16p_6ch_sse2);
ff_audio_convert_set_func(ac, AV_SAMPLE_FMT_FLTP, AV_SAMPLE_FMT_FLT,
6, 16, 4, "SSE2", ff_conv_flt_to_fltp_6ch_sse2);
}
if (mm_flags & AV_CPU_FLAG_SSSE3 && HAVE_SSE) {
ff_audio_convert_set_func(ac, AV_SAMPLE_FMT_FLT, AV_SAMPLE_FMT_S16P,
6, 16, 4, "SSSE3", ff_conv_s16p_to_flt_6ch_ssse3);
ff_audio_convert_set_func(ac, AV_SAMPLE_FMT_S16, AV_SAMPLE_FMT_FLTP,
2, 16, 4, "SSSE3", ff_conv_fltp_to_s16_2ch_ssse3);
ff_audio_convert_set_func(ac, AV_SAMPLE_FMT_S16P, AV_SAMPLE_FMT_S16,
2, 16, 8, "SSSE3", ff_conv_s16_to_s16p_2ch_ssse3);
ff_audio_convert_set_func(ac, AV_SAMPLE_FMT_S16P, AV_SAMPLE_FMT_S16,
6, 16, 4, "SSSE3", ff_conv_s16_to_s16p_6ch_ssse3);
ff_audio_convert_set_func(ac, AV_SAMPLE_FMT_FLTP, AV_SAMPLE_FMT_S16,
6, 16, 4, "SSSE3", ff_conv_s16_to_fltp_6ch_ssse3);
ff_audio_convert_set_func(ac, AV_SAMPLE_FMT_S16P, AV_SAMPLE_FMT_FLT,
6, 16, 4, "SSSE3", ff_conv_flt_to_s16p_6ch_ssse3);
}
if (mm_flags & AV_CPU_FLAG_SSE4 && HAVE_SSE) {
ff_audio_convert_set_func(ac, AV_SAMPLE_FMT_FLT, AV_SAMPLE_FMT_S16,
@@ -83,8 +231,34 @@ av_cold void ff_audio_convert_init_x86(AudioConvert *ac)
0, 32, 16, "AVX", ff_conv_s32_to_flt_avx);
ff_audio_convert_set_func(ac, AV_SAMPLE_FMT_S32, AV_SAMPLE_FMT_FLT,
0, 32, 32, "AVX", ff_conv_flt_to_s32_avx);
ff_audio_convert_set_func(ac, AV_SAMPLE_FMT_S16, AV_SAMPLE_FMT_S16P,
2, 16, 16, "AVX", ff_conv_s16p_to_s16_2ch_avx);
ff_audio_convert_set_func(ac, AV_SAMPLE_FMT_S16, AV_SAMPLE_FMT_S16P,
6, 16, 8, "AVX", ff_conv_s16p_to_s16_6ch_avx);
ff_audio_convert_set_func(ac, AV_SAMPLE_FMT_FLT, AV_SAMPLE_FMT_S16P,
2, 16, 8, "AVX", ff_conv_s16p_to_flt_2ch_avx);
ff_audio_convert_set_func(ac, AV_SAMPLE_FMT_FLT, AV_SAMPLE_FMT_S16P,
6, 16, 4, "AVX", ff_conv_s16p_to_flt_6ch_avx);
ff_audio_convert_set_func(ac, AV_SAMPLE_FMT_S16, AV_SAMPLE_FMT_FLTP,
6, 16, 4, "AVX", ff_conv_fltp_to_s16_6ch_avx);
ff_audio_convert_set_func(ac, AV_SAMPLE_FMT_FLT, AV_SAMPLE_FMT_FLTP,
6, 16, 4, "AVX", ff_conv_fltp_to_flt_6ch_avx);
ff_audio_convert_set_func(ac, AV_SAMPLE_FMT_S16P, AV_SAMPLE_FMT_S16,
2, 16, 8, "AVX", ff_conv_s16_to_s16p_2ch_avx);
ff_audio_convert_set_func(ac, AV_SAMPLE_FMT_S16P, AV_SAMPLE_FMT_S16,
6, 16, 4, "AVX", ff_conv_s16_to_s16p_6ch_avx);
ff_audio_convert_set_func(ac, AV_SAMPLE_FMT_FLTP, AV_SAMPLE_FMT_S16,
2, 16, 8, "AVX", ff_conv_s16_to_fltp_2ch_avx);
ff_audio_convert_set_func(ac, AV_SAMPLE_FMT_FLTP, AV_SAMPLE_FMT_S16,
6, 16, 4, "AVX", ff_conv_s16_to_fltp_6ch_avx);
ff_audio_convert_set_func(ac, AV_SAMPLE_FMT_S16P, AV_SAMPLE_FMT_FLT,
2, 16, 8, "AVX", ff_conv_flt_to_s16p_2ch_avx);
ff_audio_convert_set_func(ac, AV_SAMPLE_FMT_S16P, AV_SAMPLE_FMT_FLT,
6, 16, 4, "AVX", ff_conv_flt_to_s16p_6ch_avx);
ff_audio_convert_set_func(ac, AV_SAMPLE_FMT_FLTP, AV_SAMPLE_FMT_FLT,
2, 16, 4, "AVX", ff_conv_flt_to_fltp_2ch_avx);
ff_audio_convert_set_func(ac, AV_SAMPLE_FMT_FLTP, AV_SAMPLE_FMT_FLT,
6, 16, 4, "AVX", ff_conv_flt_to_fltp_6ch_avx);
}
#endif
}

View File

@@ -33,3 +33,9 @@
psrad m%1, 16
%endif
%endmacro
%macro DEINT2_PS 3 ; src0/even dst, src1/odd dst, temp
shufps m%3, m%1, m%2, q3131
shufps m%1, m%2, q2020
SWAP %2,%3
%endmacro