summaryrefslogtreecommitdiff
path: root/libavcodec/x86/lossless_audiodsp_init.c
diff options
context:
space:
mode:
authorMichael Niedermayer <michaelni@gmx.at>2015-02-06 01:57:23 +0100
committerMichael Niedermayer <michaelni@gmx.at>2015-02-06 02:18:54 +0100
commitf1214763af1abf5d7f49b98f88c06e13b98932a6 (patch)
treecb9cf187a3b8295934b215369fe11f2404ff21f6 /libavcodec/x86/lossless_audiodsp_init.c
parentd41b66a1a216956964077b383e6e234d518f17d7 (diff)
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: Michael Niedermayer <michaelni@gmx.at>
Diffstat (limited to 'libavcodec/x86/lossless_audiodsp_init.c')
-rw-r--r--libavcodec/x86/lossless_audiodsp_init.c28
1 files changed, 26 insertions, 2 deletions
diff --git a/libavcodec/x86/lossless_audiodsp_init.c b/libavcodec/x86/lossless_audiodsp_init.c
index 4879dff1de..2c13e1e31c 100644
--- a/libavcodec/x86/lossless_audiodsp_init.c
+++ b/libavcodec/x86/lossless_audiodsp_init.c
@@ -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;
}