summaryrefslogtreecommitdiff
path: root/libavresample
diff options
context:
space:
mode:
authorMichael Niedermayer <michaelni@gmx.at>2012-08-24 14:22:38 +0200
committerMichael Niedermayer <michaelni@gmx.at>2012-08-24 14:30:40 +0200
commitbec180e1127f6753b5af1e6e5242020e0de12366 (patch)
treeb27493eb57b5a484bde3cbc5740d9e60f06f9776 /libavresample
parent6b72615c32d7f3bc53a6d6075042aee626d07412 (diff)
parenta1bcc76e6036e78f25cbb7323c145056cfca9d93 (diff)
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>
Diffstat (limited to 'libavresample')
-rw-r--r--libavresample/x86/audio_convert.asm957
-rw-r--r--libavresample/x86/audio_convert_init.c174
-rw-r--r--libavresample/x86/util.asm6
3 files changed, 1137 insertions, 0 deletions
diff --git a/libavresample/x86/audio_convert.asm b/libavresample/x86/audio_convert.asm
index 244c4d1b08..3db64d2f9b 100644
--- a/libavresample/x86/audio_convert.asm
+++ b/libavresample/x86/audio_convert.asm
@@ -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
diff --git a/libavresample/x86/audio_convert_init.c b/libavresample/x86/audio_convert_init.c
index 2de49709c2..a3589c6957 100644
--- a/libavresample/x86/audio_convert_init.c
+++ b/libavresample/x86/audio_convert_init.c
@@ -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
}
diff --git a/libavresample/x86/util.asm b/libavresample/x86/util.asm
index ca7fde513a..0ce953159c 100644
--- a/libavresample/x86/util.asm
+++ b/libavresample/x86/util.asm
@@ -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