If someone has an idea on how to do this cleaner, its welcome Signed-off-by: Michael Niedermayer <michaelni@gmx.at>tags/n0.11
@@ -23,18 +23,26 @@ | |||||
SECTION .text | SECTION .text | ||||
%macro INT16_TO_INT32 0 | |||||
%macro INT16_TO_INT32 1 | |||||
cglobal int16_to_int32_%1, 3, 3, 0, dst, src, len | cglobal int16_to_int32_%1, 3, 3, 0, dst, src, len | ||||
mov srcq, [srcq] | mov srcq, [srcq] | ||||
mov dstq, [dstq] | mov dstq, [dstq] | ||||
%ifidn %1, a | |||||
test dstq, mmsize-1 | |||||
jne int16_to_int32_u_int %+ SUFFIX | |||||
test srcq, mmsize-1 | |||||
jne int16_to_int32_u_int %+ SUFFIX | |||||
%else | |||||
int16_to_int32_u_int %+ SUFFIX | |||||
%endif | |||||
.next | .next | ||||
movu m4, [srcq] | |||||
mov%1 m4, [srcq] | |||||
pxor m0, m0 | pxor m0, m0 | ||||
pxor m1, m1 | pxor m1, m1 | ||||
punpcklwd m0, m4 | punpcklwd m0, m4 | ||||
punpckhwd m1, m4 | punpckhwd m1, m4 | ||||
movu [ dstq], m0 | |||||
movu [mmsize + dstq], m1 | |||||
mov%1 [ dstq], m0 | |||||
mov%1 [mmsize + dstq], m1 | |||||
add srcq, mmsize | add srcq, mmsize | ||||
add dstq, 2*mmsize | add dstq, 2*mmsize | ||||
sub lenq, 2*mmsize | sub lenq, 2*mmsize | ||||
@@ -46,7 +54,9 @@ cglobal int16_to_int32_%1, 3, 3, 0, dst, src, len | |||||
%endmacro | %endmacro | ||||
INIT_MMX mmx | INIT_MMX mmx | ||||
INT16_TO_INT32 | |||||
INT16_TO_INT32 u | |||||
INT16_TO_INT32 a | |||||
INIT_XMM sse | INIT_XMM sse | ||||
INT16_TO_INT32 | |||||
INT16_TO_INT32 u | |||||
INT16_TO_INT32 a |
@@ -22,7 +22,7 @@ | |||||
#include "libswresample/audioconvert.h" | #include "libswresample/audioconvert.h" | ||||
#define MULTI_CAPS_FUNC_DECL(cap) \ | #define MULTI_CAPS_FUNC_DECL(cap) \ | ||||
void ff_int16_to_int32_ ## cap(uint8_t **dst, const uint8_t **src, int len); | |||||
void ff_int16_to_int32_a_ ## cap(uint8_t **dst, const uint8_t **src, int len); | |||||
MULTI_CAPS_FUNC_DECL(mmx) | MULTI_CAPS_FUNC_DECL(mmx) | ||||
MULTI_CAPS_FUNC_DECL(sse) | MULTI_CAPS_FUNC_DECL(sse) | ||||
@@ -39,7 +39,7 @@ void swri_audio_convert_init_x86(struct AudioConvert *ac, | |||||
#define MULTI_CAPS_FUNC(flag, cap) \ | #define MULTI_CAPS_FUNC(flag, cap) \ | ||||
if (mm_flags & flag) {\ | if (mm_flags & flag) {\ | ||||
if( out_fmt == AV_SAMPLE_FMT_S32 && in_fmt == AV_SAMPLE_FMT_S16 || out_fmt == AV_SAMPLE_FMT_S32P && in_fmt == AV_SAMPLE_FMT_S16P)\ | if( out_fmt == AV_SAMPLE_FMT_S32 && in_fmt == AV_SAMPLE_FMT_S16 || out_fmt == AV_SAMPLE_FMT_S32P && in_fmt == AV_SAMPLE_FMT_S16P)\ | ||||
ac->simd_f = ff_int16_to_int32_ ## cap;\ | |||||
ac->simd_f = ff_int16_to_int32_a_ ## cap;\ | |||||
} | } | ||||
MULTI_CAPS_FUNC(AV_CPU_FLAG_MMX, mmx) | MULTI_CAPS_FUNC(AV_CPU_FLAG_MMX, mmx) | ||||