Commit b3b3b1bfe4 for ffmpeg
commit b3b3b1bfe49698a36b2dd76e1db1b5822d1fed51
Author: Patryk Darmofalski <darpat039@gmail.com>
Date: Mon Oct 12 13:55:46 2026 +0200
avutil/aarch64/float_dsp: add NEON scalarproduct_double
Four accumulators, as in scalarproduct_float. Eight were not faster at len 256.
checkasm --bench on Apple M4:
scalarproduct_double_c: 80.3
scalarproduct_double_neon: 21.8 ( 3.68x)
Signed-off-by: Patryk Darmofalski <darpat039@gmail.com>
diff --git a/libavutil/aarch64/float_dsp_init.c b/libavutil/aarch64/float_dsp_init.c
index 4325071821..0423602303 100644
--- a/libavutil/aarch64/float_dsp_init.c
+++ b/libavutil/aarch64/float_dsp_init.c
@@ -51,12 +51,16 @@ void ff_butterflies_float_neon(float *v1, float *v2, int len);
float ff_scalarproduct_float_neon(const float *v1, const float *v2, int len);
+double ff_scalarproduct_double_neon(const double *v1, const double *v2,
+ size_t len);
+
av_cold void ff_float_dsp_init_aarch64(AVFloatDSPContext *fdsp)
{
int cpu_flags = av_get_cpu_flags();
if (have_neon(cpu_flags)) {
fdsp->butterflies_float = ff_butterflies_float_neon;
+ fdsp->scalarproduct_double = ff_scalarproduct_double_neon;
fdsp->scalarproduct_float = ff_scalarproduct_float_neon;
fdsp->vector_dmul_scalar = ff_vector_dmul_scalar_neon;
fdsp->vector_fmul = ff_vector_fmul_neon;
diff --git a/libavutil/aarch64/float_dsp_neon.S b/libavutil/aarch64/float_dsp_neon.S
index aa6b5189f5..d2bc4df7b8 100644
--- a/libavutil/aarch64/float_dsp_neon.S
+++ b/libavutil/aarch64/float_dsp_neon.S
@@ -233,3 +233,26 @@ function ff_scalarproduct_float_neon, export=1
faddp s0, v0.2s
ret
endfunc
+
+function ff_scalarproduct_double_neon, export=1
+ movi v0.2d, #0
+ movi v1.2d, #0
+ movi v2.2d, #0
+ movi v3.2d, #0
+1:
+ ld1 {v4.2d, v5.2d}, [x0], #32
+ ld1 {v6.2d, v7.2d}, [x1], #32
+ ld1 {v16.2d, v17.2d}, [x0], #32
+ ld1 {v18.2d, v19.2d}, [x1], #32
+ subs x2, x2, #8
+ fmla v0.2d, v4.2d, v6.2d
+ fmla v1.2d, v5.2d, v7.2d
+ fmla v2.2d, v16.2d, v18.2d
+ fmla v3.2d, v17.2d, v19.2d
+ b.gt 1b
+ fadd v0.2d, v0.2d, v1.2d
+ fadd v2.2d, v2.2d, v3.2d
+ fadd v0.2d, v0.2d, v2.2d
+ faddp d0, v0.2d
+ ret
+endfunc