---
libavresample/x86/audio_convert.asm | 114 ++++++++++++++++++++++++++++++++
libavresample/x86/audio_convert_init.c | 11 +++
2 files changed, 125 insertions(+), 0 deletions(-)
diff --git a/libavresample/x86/audio_convert.asm
b/libavresample/x86/audio_convert.asm
index 8d352a2..17c9f22 100644
--- a/libavresample/x86/audio_convert.asm
+++ b/libavresample/x86/audio_convert.asm
@@ -475,6 +475,120 @@ cglobal conv_fltp_to_s16_2ch, 3,4,3, dst, src0, len, src1
js .loop
REP_RET
+;------------------------------------------------------------------------------
+; void ff_conv_fltp_to_s16_6ch(int16_t *dst, float *const *src, int len,
+; int channels);
+;------------------------------------------------------------------------------
+
+%macro CONV_FLTP_TO_S16_6CH 0
+cglobal conv_fltp_to_s16_6ch, 2,8,7, dst, src, src1, src2, src3, src4, src5,
len
+%if ARCH_X86_64
+ mov lend, r2d
+%else
+ %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]
+ ALIGN 16
+.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
+ ; unpack dwords:
+ punpckhdq m3, m0, m2 ; m3 = 12, 13, 14, 15, 18, 19, 20, 21
+ punpckldq m2, m1 ; m2 = 2, 3, 4, 5, 8, 9, 10, 11
+ ; shuffle qwords:
+ movhlps m4, m2 ; m4 = 8, 9, 10, 11, x, x, x, x
+ movlhps m4, m3 ; m4 = 8, 9, 10, 11, 12, 13, 14, 15 (final)
+ movlhps m2, m0 ; m2 = 2, 3, 4, 5, 0, 1, 6, 7
+ movhlps m3, m1 ; m3 = 16, 17, 22, 23, 18, 19, 20, 21
+ ; shuffle dwords:
+ pshufd m2, m2, q3102 ; m2 = 0, 1, 2, 3, 4, 5, 6, 7 (final)
+ pshufd m3, m3, q1320 ; m3 = 16, 17, 18, 19, 20, 21, 22, 23 (final)
+ mova [dstq ], m2
+ mova [dstq+16], m4
+ mova [dstq+32], m3
+%else ; sse
+ mova xmm0, [srcq ]
+ mova xmm1, [srcq+src1q]
+ mova xmm2, [srcq+src2q]
+ mova xmm3, [srcq+src3q]
+ mova xmm4, [srcq+src4q]
+ mova xmm5, [srcq+src5q]
+ mulps xmm0, xmm6
+ mulps xmm1, xmm6
+ mulps xmm2, xmm6
+ mulps xmm3, xmm6
+ mulps xmm4, xmm6
+ mulps xmm5, xmm6
+ cvtps2pi m0, xmm0
+ cvtps2pi m1, xmm1
+ cvtps2pi m2, xmm2
+ cvtps2pi m3, xmm3
+ cvtps2pi m4, xmm4
+ cvtps2pi m5, xmm5
+ packssdw m0, m3 ; m0 = 0, 6, 3, 9
+ packssdw m1, m4 ; m1 = 1, 7, 4, 10
+ packssdw m2, m5 ; m2 = 2, 8, 5, 11
+ ; unpack words
+ pshufw m3, m0, q1032 ; m3 = 3, 9, 0, 6
+ punpcklwd m0, m1 ; m0 = 0, 1, 6, 7
+ punpckhwd m1, m2 ; m1 = 4, 5, 10, 11
+ punpcklwd m2, m3 ; m2 = 2, 3, 8, 9
+ ; unpack dwords
+ pshufw m3, m0, q1032 ; m3 = 6, 7, 0, 1
+ punpckldq m0, m2 ; m0 = 0, 1, 2, 3 (final)
+ punpckhdq m2, m1 ; m2 = 8, 9, 10, 11 (final)
+ punpckldq m1, m3 ; m1 = 4, 5, 6, 7 (final)
+ mova [dstq ], m0
+ mova [dstq+ 8], m1
+ mova [dstq+16], m2
+%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
+
;-----------------------------------------------------------------------------
; void ff_conv_fltp_to_flt_6ch(float *dst, float *const *src, int len,
; int channels);
diff --git a/libavresample/x86/audio_convert_init.c
b/libavresample/x86/audio_convert_init.c
index 178cbba..72c78bd 100644
--- a/libavresample/x86/audio_convert_init.c
+++ b/libavresample/x86/audio_convert_init.c
@@ -57,6 +57,11 @@ extern void ff_conv_s16p_to_flt_6ch_sse2(float *dst, int16_t
*const *src,
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_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_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,
@@ -75,6 +80,10 @@ 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);
+ }
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,
@@ -100,6 +109,8 @@ av_cold void ff_audio_convert_init_x86(AudioConvert *ac)
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_S16, AV_SAMPLE_FMT_FLTP,
+ 6, 16, 4, "SSE2",
ff_conv_fltp_to_s16_6ch_sse2);
}
if (mm_flags & AV_CPU_FLAG_SSE4 && HAVE_SSE) {
ff_audio_convert_set_func(ac, AV_SAMPLE_FMT_FLT, AV_SAMPLE_FMT_S16,
--
1.7.1
_______________________________________________
libav-devel mailing list
[email protected]
https://lists.libav.org/mailman/listinfo/libav-devel