Commit f1214763 authored by Michael Niedermayer's avatar Michael Niedermayer

avcodec/x86/lossless_audiodsp: Move order&8 fallback into C code

This is simpler and more robust, and fixes mismatching XMM save restore
mismatches
Signed-off-by: 's avatarMichael Niedermayer <michaelni@gmx.at>
parent d41b66a1
......@@ -26,12 +26,6 @@ SECTION_TEXT
; int ff_scalarproduct_and_madd_int16(int16_t *v1, int16_t *v2, int16_t *v3,
; int order, int mul)
cglobal scalarproduct_and_madd_int16, 4,4,8, v1, v2, v3, order, mul
%if mmsize == 16
test orderq, 8
jnz scalarproduct_and_madd_int16_fallback
%else
scalarproduct_and_madd_int16_fallback
%endif
shl orderq, 1
movd m7, mulm
%if mmsize == 16
......@@ -123,8 +117,6 @@ align 16
; int order, int mul)
INIT_XMM ssse3
cglobal scalarproduct_and_madd_int16, 4,4,10, v1, v2, v3, order, mul
test orderq, 8
jnz scalarproduct_and_madd_int16_fallback
shl orderq, 1
movd m7, mulm
pshuflw m7, m7, 0
......
......@@ -31,6 +31,30 @@ int32_t ff_scalarproduct_and_madd_int16_ssse3(int16_t *v1, const int16_t *v2,
const int16_t *v3,
int order, int mul);
static int32_t scalarproduct_and_madd_int16_sse2(int16_t *v1, const int16_t *v2,
const int16_t *v3,
int order, int mul)
{
#if HAVE_SSE2_EXTERNAL
if (order & 8)
return ff_scalarproduct_and_madd_int16_mmxext(v1, v2, v3, order, mul);
else
return ff_scalarproduct_and_madd_int16_sse2(v1, v2, v3, order, mul);
#endif
}
static int32_t scalarproduct_and_madd_int16_ssse3(int16_t *v1, const int16_t *v2,
const int16_t *v3,
int order, int mul)
{
#if HAVE_SSSE3_EXTERNAL
if (order & 8)
return ff_scalarproduct_and_madd_int16_mmxext(v1, v2, v3, order, mul);
else
return ff_scalarproduct_and_madd_int16_ssse3(v1, v2, v3, order, mul);
#endif
}
av_cold void ff_llauddsp_init_x86(LLAudDSPContext *c)
{
int cpu_flags = av_get_cpu_flags();
......@@ -39,9 +63,9 @@ av_cold void ff_llauddsp_init_x86(LLAudDSPContext *c)
c->scalarproduct_and_madd_int16 = ff_scalarproduct_and_madd_int16_mmxext;
if (EXTERNAL_SSE2(cpu_flags))
c->scalarproduct_and_madd_int16 = ff_scalarproduct_and_madd_int16_sse2;
c->scalarproduct_and_madd_int16 = scalarproduct_and_madd_int16_sse2;
if (EXTERNAL_SSSE3(cpu_flags) &&
!(cpu_flags & (AV_CPU_FLAG_SSE42 | AV_CPU_FLAG_3DNOW))) // cachesplit
c->scalarproduct_and_madd_int16 = ff_scalarproduct_and_madd_int16_ssse3;
c->scalarproduct_and_madd_int16 = scalarproduct_and_madd_int16_ssse3;
}
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment