aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorKrzysztof Pyrkosz <ffmpeg@szaka.eu>2025-02-28 22:21:50 +0100
committerMartin Storsjö <martin@martin.st>2025-03-02 01:17:53 +0200
commite8d4c559871ef93fc94a8efb8144f1738eba4c62 (patch)
tree5825c03dfa1a205177ceb5a8508924738758b5b7
parent38929b824bcc4b3307af3e0711c5c03b823a83e3 (diff)
downloadffmpeg-e8d4c559871ef93fc94a8efb8144f1738eba4c62.tar.gz
avcodec/aarch64/ac3dsp_neon.S: Optimize ac3_sum_square_butterfly_int32_neon
Instead of calculating a^2, b^2, (a+b)^2 and (a-b)^2, calculate only a^2, b^2 and 2*a*b in each iteration and derive the latter parts from these three at the end. Before and after: A78 ac3_sum_square_bufferfly_int32_neon: 484.8 ( 2.00x) ac3_sum_square_bufferfly_int32_neon: 468.2 ( 2.08x) A72 ac3_sum_square_bufferfly_int32_neon: 793.6 ( 1.26x) ac3_sum_square_bufferfly_int32_neon: 527.3 ( 1.92x) Signed-off-by: Martin Storsjö <martin@martin.st>
-rw-r--r--libavcodec/aarch64/ac3dsp_neon.S15
1 files changed, 7 insertions, 8 deletions
diff --git a/libavcodec/aarch64/ac3dsp_neon.S b/libavcodec/aarch64/ac3dsp_neon.S
index 7e97cc39f7..c28e2082a9 100644
--- a/libavcodec/aarch64/ac3dsp_neon.S
+++ b/libavcodec/aarch64/ac3dsp_neon.S
@@ -69,21 +69,20 @@ function ff_ac3_sum_square_butterfly_int32_neon, export=1
movi v0.2d, #0
movi v1.2d, #0
movi v2.2d, #0
- movi v3.2d, #0
1: ld1 {v4.2s}, [x1], #8
ld1 {v5.2s}, [x2], #8
- add v6.2s, v4.2s, v5.2s
- sub v7.2s, v4.2s, v5.2s
- smlal v0.2d, v4.2s, v4.2s
- smlal v1.2d, v5.2s, v5.2s
- smlal v2.2d, v6.2s, v6.2s
- smlal v3.2d, v7.2s, v7.2s
subs w3, w3, #2
+ smlal v0.2d, v4.2s, v4.2s // sum of a^2
+ smlal v1.2d, v5.2s, v5.2s // sum of b^2
+ sqdmlal v2.2d, v4.2s, v5.2s // sum of 2ab
b.gt 1b
addp d0, v0.2d
addp d1, v1.2d
addp d2, v2.2d
- addp d3, v3.2d
+ sub d3, d0, d2 // a^2 + b^2 - 2ab
+ add d2, d0, d2
+ add d3, d3, d1 // a^2 + b^2 + 2ab
+ add d2, d2, d1
st1 {v0.1d-v3.1d}, [x0]
ret
endfunc