1cabdff1aSopenharmony_ci/*
2cabdff1aSopenharmony_ci * Bluetooth low-complexity, subband codec (SBC)
3cabdff1aSopenharmony_ci *
4cabdff1aSopenharmony_ci * Copyright (C) 2017  Aurelien Jacobs <aurel@gnuage.org>
5cabdff1aSopenharmony_ci * Copyright (C) 2008-2010  Nokia Corporation
6cabdff1aSopenharmony_ci * Copyright (C) 2004-2010  Marcel Holtmann <marcel@holtmann.org>
7cabdff1aSopenharmony_ci * Copyright (C) 2004-2005  Henryk Ploetz <henryk@ploetzli.ch>
8cabdff1aSopenharmony_ci * Copyright (C) 2005-2006  Brad Midgley <bmidgley@xmission.com>
9cabdff1aSopenharmony_ci *
10cabdff1aSopenharmony_ci * This file is part of FFmpeg.
11cabdff1aSopenharmony_ci *
12cabdff1aSopenharmony_ci * FFmpeg is free software; you can redistribute it and/or
13cabdff1aSopenharmony_ci * modify it under the terms of the GNU Lesser General Public
14cabdff1aSopenharmony_ci * License as published by the Free Software Foundation; either
15cabdff1aSopenharmony_ci * version 2.1 of the License, or (at your option) any later version.
16cabdff1aSopenharmony_ci *
17cabdff1aSopenharmony_ci * FFmpeg is distributed in the hope that it will be useful,
18cabdff1aSopenharmony_ci * but WITHOUT ANY WARRANTY; without even the implied warranty of
19cabdff1aSopenharmony_ci * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
20cabdff1aSopenharmony_ci * Lesser General Public License for more details.
21cabdff1aSopenharmony_ci *
22cabdff1aSopenharmony_ci * You should have received a copy of the GNU Lesser General Public
23cabdff1aSopenharmony_ci * License along with FFmpeg; if not, write to the Free Software
24cabdff1aSopenharmony_ci * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
25cabdff1aSopenharmony_ci */
26cabdff1aSopenharmony_ci
27cabdff1aSopenharmony_ci/**
28cabdff1aSopenharmony_ci * @file
29cabdff1aSopenharmony_ci * SBC ARMv6 optimizations. The instructions are scheduled for ARM11 pipeline.
30cabdff1aSopenharmony_ci */
31cabdff1aSopenharmony_ci
32cabdff1aSopenharmony_ci#include "libavutil/arm/asm.S"
33cabdff1aSopenharmony_ci
34cabdff1aSopenharmony_cifunction ff_sbc_analyze_4_armv6, export=1
35cabdff1aSopenharmony_ci        @ r0 = in, r1 = out, r2 = consts
36cabdff1aSopenharmony_ci        push            {r1, r3-r7, lr}
37cabdff1aSopenharmony_ci        push            {r8-r12, r14}
38cabdff1aSopenharmony_ci        ldrd            r4,  r5,  [r0, #0]
39cabdff1aSopenharmony_ci        ldrd            r6,  r7,  [r2, #0]
40cabdff1aSopenharmony_ci        ldrd            r8,  r9,  [r0, #16]
41cabdff1aSopenharmony_ci        ldrd            r10, r11, [r2, #16]
42cabdff1aSopenharmony_ci        mov             r14, #0x8000
43cabdff1aSopenharmony_ci        smlad           r3,  r4,  r6,  r14
44cabdff1aSopenharmony_ci        smlad           r12, r5,  r7,  r14
45cabdff1aSopenharmony_ci        ldrd            r4,  r5,  [r0, #32]
46cabdff1aSopenharmony_ci        ldrd            r6,  r7,  [r2, #32]
47cabdff1aSopenharmony_ci        smlad           r3,  r8,  r10, r3
48cabdff1aSopenharmony_ci        smlad           r12, r9,  r11, r12
49cabdff1aSopenharmony_ci        ldrd            r8,  r9,  [r0, #48]
50cabdff1aSopenharmony_ci        ldrd            r10, r11, [r2, #48]
51cabdff1aSopenharmony_ci        smlad           r3,  r4,  r6,  r3
52cabdff1aSopenharmony_ci        smlad           r12, r5,  r7,  r12
53cabdff1aSopenharmony_ci        ldrd            r4,  r5,  [r0, #64]
54cabdff1aSopenharmony_ci        ldrd            r6,  r7,  [r2, #64]
55cabdff1aSopenharmony_ci        smlad           r3,  r8,  r10, r3
56cabdff1aSopenharmony_ci        smlad           r12, r9,  r11, r12
57cabdff1aSopenharmony_ci        ldrd            r8,  r9,  [r0, #8]
58cabdff1aSopenharmony_ci        ldrd            r10, r11, [r2, #8]
59cabdff1aSopenharmony_ci        smlad           r3,  r4,  r6,  r3        @ t1[0] is done
60cabdff1aSopenharmony_ci        smlad           r12, r5,  r7,  r12       @ t1[1] is done
61cabdff1aSopenharmony_ci        ldrd            r4,  r5,  [r0, #24]
62cabdff1aSopenharmony_ci        ldrd            r6,  r7,  [r2, #24]
63cabdff1aSopenharmony_ci        pkhtb           r3,  r12, r3, asr #16    @ combine t1[0] and t1[1]
64cabdff1aSopenharmony_ci        smlad           r12, r8,  r10, r14
65cabdff1aSopenharmony_ci        smlad           r14, r9,  r11, r14
66cabdff1aSopenharmony_ci        ldrd            r8,  r9,  [r0, #40]
67cabdff1aSopenharmony_ci        ldrd            r10, r11, [r2, #40]
68cabdff1aSopenharmony_ci        smlad           r12, r4,  r6,  r12
69cabdff1aSopenharmony_ci        smlad           r14, r5,  r7,  r14
70cabdff1aSopenharmony_ci        ldrd            r4,  r5,  [r0, #56]
71cabdff1aSopenharmony_ci        ldrd            r6,  r7,  [r2, #56]
72cabdff1aSopenharmony_ci        smlad           r12, r8,  r10, r12
73cabdff1aSopenharmony_ci        smlad           r14, r9,  r11, r14
74cabdff1aSopenharmony_ci        ldrd            r8,  r9,  [r0, #72]
75cabdff1aSopenharmony_ci        ldrd            r10, r11, [r2, #72]
76cabdff1aSopenharmony_ci        smlad           r12, r4,  r6,  r12
77cabdff1aSopenharmony_ci        smlad           r14, r5,  r7,  r14
78cabdff1aSopenharmony_ci        ldrd            r4,  r5,  [r2, #80]      @ start loading cos table
79cabdff1aSopenharmony_ci        smlad           r12, r8,  r10, r12       @ t1[2] is done
80cabdff1aSopenharmony_ci        smlad           r14, r9,  r11, r14       @ t1[3] is done
81cabdff1aSopenharmony_ci        ldrd            r6,  r7,  [r2, #88]
82cabdff1aSopenharmony_ci        ldrd            r8,  r9,  [r2, #96]
83cabdff1aSopenharmony_ci        ldrd            r10, r11, [r2, #104]     @ cos table fully loaded
84cabdff1aSopenharmony_ci        pkhtb           r12, r14, r12, asr #16   @ combine t1[2] and t1[3]
85cabdff1aSopenharmony_ci        smuad           r4,  r3,  r4
86cabdff1aSopenharmony_ci        smuad           r5,  r3,  r5
87cabdff1aSopenharmony_ci        smlad           r4,  r12, r8,  r4
88cabdff1aSopenharmony_ci        smlad           r5,  r12, r9,  r5
89cabdff1aSopenharmony_ci        smuad           r6,  r3,  r6
90cabdff1aSopenharmony_ci        smuad           r7,  r3,  r7
91cabdff1aSopenharmony_ci        smlad           r6,  r12, r10, r6
92cabdff1aSopenharmony_ci        smlad           r7,  r12, r11, r7
93cabdff1aSopenharmony_ci        pop             {r8-r12, r14}
94cabdff1aSopenharmony_ci        stmia           r1, {r4, r5, r6, r7}
95cabdff1aSopenharmony_ci        pop             {r1, r3-r7, pc}
96cabdff1aSopenharmony_ciendfunc
97cabdff1aSopenharmony_ci
98cabdff1aSopenharmony_cifunction ff_sbc_analyze_8_armv6, export=1
99cabdff1aSopenharmony_ci        @ r0 = in, r1 = out, r2 = consts
100cabdff1aSopenharmony_ci        push            {r1, r3-r7, lr}
101cabdff1aSopenharmony_ci        push            {r8-r12, r14}
102cabdff1aSopenharmony_ci        ldrd            r4,  r5,  [r0, #24]
103cabdff1aSopenharmony_ci        ldrd            r6,  r7,  [r2, #24]
104cabdff1aSopenharmony_ci        ldrd            r8,  r9,  [r0, #56]
105cabdff1aSopenharmony_ci        ldrd            r10, r11, [r2, #56]
106cabdff1aSopenharmony_ci        mov             r14, #0x8000
107cabdff1aSopenharmony_ci        smlad           r3,  r4,  r6,  r14
108cabdff1aSopenharmony_ci        smlad           r12, r5,  r7,  r14
109cabdff1aSopenharmony_ci        ldrd            r4,  r5,  [r0, #88]
110cabdff1aSopenharmony_ci        ldrd            r6,  r7,  [r2, #88]
111cabdff1aSopenharmony_ci        smlad           r3,  r8,  r10, r3
112cabdff1aSopenharmony_ci        smlad           r12, r9,  r11, r12
113cabdff1aSopenharmony_ci        ldrd            r8,  r9,  [r0, #120]
114cabdff1aSopenharmony_ci        ldrd            r10, r11, [r2, #120]
115cabdff1aSopenharmony_ci        smlad           r3,  r4,  r6,  r3
116cabdff1aSopenharmony_ci        smlad           r12, r5,  r7,  r12
117cabdff1aSopenharmony_ci        ldrd            r4,  r5,  [r0, #152]
118cabdff1aSopenharmony_ci        ldrd            r6,  r7,  [r2, #152]
119cabdff1aSopenharmony_ci        smlad           r3,  r8,  r10, r3
120cabdff1aSopenharmony_ci        smlad           r12, r9,  r11, r12
121cabdff1aSopenharmony_ci        ldrd            r8,  r9,  [r0, #16]
122cabdff1aSopenharmony_ci        ldrd            r10, r11, [r2, #16]
123cabdff1aSopenharmony_ci        smlad           r3,  r4,  r6,  r3        @ t1[6] is done
124cabdff1aSopenharmony_ci        smlad           r12, r5,  r7,  r12       @ t1[7] is done
125cabdff1aSopenharmony_ci        ldrd            r4,  r5,  [r0, #48]
126cabdff1aSopenharmony_ci        ldrd            r6,  r7,  [r2, #48]
127cabdff1aSopenharmony_ci        pkhtb           r3,  r12, r3, asr #16    @ combine t1[6] and t1[7]
128cabdff1aSopenharmony_ci        str             r3,  [sp, #-4]!          @ save to stack
129cabdff1aSopenharmony_ci        smlad           r3,  r8,  r10, r14
130cabdff1aSopenharmony_ci        smlad           r12, r9,  r11, r14
131cabdff1aSopenharmony_ci        ldrd            r8,  r9,  [r0, #80]
132cabdff1aSopenharmony_ci        ldrd            r10, r11, [r2, #80]
133cabdff1aSopenharmony_ci        smlad           r3,  r4,  r6,  r3
134cabdff1aSopenharmony_ci        smlad           r12, r5,  r7,  r12
135cabdff1aSopenharmony_ci        ldrd            r4,  r5,  [r0, #112]
136cabdff1aSopenharmony_ci        ldrd            r6,  r7,  [r2, #112]
137cabdff1aSopenharmony_ci        smlad           r3,  r8,  r10, r3
138cabdff1aSopenharmony_ci        smlad           r12, r9,  r11, r12
139cabdff1aSopenharmony_ci        ldrd            r8,  r9,  [r0, #144]
140cabdff1aSopenharmony_ci        ldrd            r10, r11, [r2, #144]
141cabdff1aSopenharmony_ci        smlad           r3,  r4,  r6,  r3
142cabdff1aSopenharmony_ci        smlad           r12, r5,  r7,  r12
143cabdff1aSopenharmony_ci        ldrd            r4,  r5,  [r0, #0]
144cabdff1aSopenharmony_ci        ldrd            r6,  r7,  [r2, #0]
145cabdff1aSopenharmony_ci        smlad           r3,  r8,  r10, r3        @ t1[4] is done
146cabdff1aSopenharmony_ci        smlad           r12, r9,  r11, r12       @ t1[5] is done
147cabdff1aSopenharmony_ci        ldrd            r8,  r9,  [r0, #32]
148cabdff1aSopenharmony_ci        ldrd            r10, r11, [r2, #32]
149cabdff1aSopenharmony_ci        pkhtb           r3,  r12, r3, asr #16    @ combine t1[4] and t1[5]
150cabdff1aSopenharmony_ci        str             r3,  [sp, #-4]!          @ save to stack
151cabdff1aSopenharmony_ci        smlad           r3,  r4,  r6,  r14
152cabdff1aSopenharmony_ci        smlad           r12, r5,  r7,  r14
153cabdff1aSopenharmony_ci        ldrd            r4,  r5,  [r0, #64]
154cabdff1aSopenharmony_ci        ldrd            r6,  r7,  [r2, #64]
155cabdff1aSopenharmony_ci        smlad           r3,  r8,  r10, r3
156cabdff1aSopenharmony_ci        smlad           r12, r9,  r11, r12
157cabdff1aSopenharmony_ci        ldrd            r8,  r9,  [r0, #96]
158cabdff1aSopenharmony_ci        ldrd            r10, r11, [r2, #96]
159cabdff1aSopenharmony_ci        smlad           r3,  r4,  r6,  r3
160cabdff1aSopenharmony_ci        smlad           r12, r5,  r7,  r12
161cabdff1aSopenharmony_ci        ldrd            r4,  r5,  [r0, #128]
162cabdff1aSopenharmony_ci        ldrd            r6,  r7,  [r2, #128]
163cabdff1aSopenharmony_ci        smlad           r3,  r8,  r10, r3
164cabdff1aSopenharmony_ci        smlad           r12, r9,  r11, r12
165cabdff1aSopenharmony_ci        ldrd            r8,  r9,  [r0, #8]
166cabdff1aSopenharmony_ci        ldrd            r10, r11, [r2, #8]
167cabdff1aSopenharmony_ci        smlad           r3,  r4,  r6,  r3        @ t1[0] is done
168cabdff1aSopenharmony_ci        smlad           r12, r5,  r7,  r12       @ t1[1] is done
169cabdff1aSopenharmony_ci        ldrd            r4,  r5,  [r0, #40]
170cabdff1aSopenharmony_ci        ldrd            r6,  r7,  [r2, #40]
171cabdff1aSopenharmony_ci        pkhtb           r3,  r12, r3, asr #16    @ combine t1[0] and t1[1]
172cabdff1aSopenharmony_ci        smlad           r12, r8,  r10, r14
173cabdff1aSopenharmony_ci        smlad           r14, r9,  r11, r14
174cabdff1aSopenharmony_ci        ldrd            r8,  r9,  [r0, #72]
175cabdff1aSopenharmony_ci        ldrd            r10, r11, [r2, #72]
176cabdff1aSopenharmony_ci        smlad           r12, r4,  r6,  r12
177cabdff1aSopenharmony_ci        smlad           r14, r5,  r7,  r14
178cabdff1aSopenharmony_ci        ldrd            r4,  r5,  [r0, #104]
179cabdff1aSopenharmony_ci        ldrd            r6,  r7,  [r2, #104]
180cabdff1aSopenharmony_ci        smlad           r12, r8,  r10, r12
181cabdff1aSopenharmony_ci        smlad           r14, r9,  r11, r14
182cabdff1aSopenharmony_ci        ldrd            r8,  r9,  [r0, #136]
183cabdff1aSopenharmony_ci        ldrd            r10, r11, [r2, #136]!
184cabdff1aSopenharmony_ci        smlad           r12, r4,  r6,  r12
185cabdff1aSopenharmony_ci        smlad           r14, r5,  r7,  r14
186cabdff1aSopenharmony_ci        ldrd            r4,  r5,  [r2, #(160 - 136 + 0)]
187cabdff1aSopenharmony_ci        smlad           r12, r8,  r10, r12       @ t1[2] is done
188cabdff1aSopenharmony_ci        smlad           r14, r9,  r11, r14       @ t1[3] is done
189cabdff1aSopenharmony_ci        ldrd            r6,  r7,  [r2, #(160 - 136 + 8)]
190cabdff1aSopenharmony_ci        smuad           r4,  r3,  r4
191cabdff1aSopenharmony_ci        smuad           r5,  r3,  r5
192cabdff1aSopenharmony_ci        pkhtb           r12, r14, r12, asr #16   @ combine t1[2] and t1[3]
193cabdff1aSopenharmony_ci                                                 @ r3  = t2[0:1]
194cabdff1aSopenharmony_ci                                                 @ r12 = t2[2:3]
195cabdff1aSopenharmony_ci        pop             {r0, r14}                @ t2[4:5], t2[6:7]
196cabdff1aSopenharmony_ci        ldrd            r8,  r9,  [r2, #(160 - 136 + 32)]
197cabdff1aSopenharmony_ci        smuad           r6,  r3,  r6
198cabdff1aSopenharmony_ci        smuad           r7,  r3,  r7
199cabdff1aSopenharmony_ci        ldrd            r10, r11, [r2, #(160 - 136 + 40)]
200cabdff1aSopenharmony_ci        smlad           r4,  r12, r8,  r4
201cabdff1aSopenharmony_ci        smlad           r5,  r12, r9,  r5
202cabdff1aSopenharmony_ci        ldrd            r8,  r9,  [r2, #(160 - 136 + 64)]
203cabdff1aSopenharmony_ci        smlad           r6,  r12, r10, r6
204cabdff1aSopenharmony_ci        smlad           r7,  r12, r11, r7
205cabdff1aSopenharmony_ci        ldrd            r10, r11, [r2, #(160 - 136 + 72)]
206cabdff1aSopenharmony_ci        smlad           r4,  r0,  r8,  r4
207cabdff1aSopenharmony_ci        smlad           r5,  r0,  r9,  r5
208cabdff1aSopenharmony_ci        ldrd            r8,  r9,  [r2, #(160 - 136 + 96)]
209cabdff1aSopenharmony_ci        smlad           r6,  r0,  r10, r6
210cabdff1aSopenharmony_ci        smlad           r7,  r0,  r11, r7
211cabdff1aSopenharmony_ci        ldrd            r10, r11, [r2, #(160 - 136 + 104)]
212cabdff1aSopenharmony_ci        smlad           r4,  r14, r8,  r4
213cabdff1aSopenharmony_ci        smlad           r5,  r14, r9,  r5
214cabdff1aSopenharmony_ci        ldrd            r8,  r9,  [r2, #(160 - 136 + 16 + 0)]
215cabdff1aSopenharmony_ci        smlad           r6,  r14, r10, r6
216cabdff1aSopenharmony_ci        smlad           r7,  r14, r11, r7
217cabdff1aSopenharmony_ci        ldrd            r10, r11, [r2, #(160 - 136 + 16 + 8)]
218cabdff1aSopenharmony_ci        stmia           r1!, {r4, r5}
219cabdff1aSopenharmony_ci        smuad           r4,  r3,  r8
220cabdff1aSopenharmony_ci        smuad           r5,  r3,  r9
221cabdff1aSopenharmony_ci        ldrd            r8,  r9,  [r2, #(160 - 136 + 16 + 32)]
222cabdff1aSopenharmony_ci        stmia           r1!, {r6, r7}
223cabdff1aSopenharmony_ci        smuad           r6,  r3,  r10
224cabdff1aSopenharmony_ci        smuad           r7,  r3,  r11
225cabdff1aSopenharmony_ci        ldrd            r10, r11, [r2, #(160 - 136 + 16 + 40)]
226cabdff1aSopenharmony_ci        smlad           r4,  r12, r8,  r4
227cabdff1aSopenharmony_ci        smlad           r5,  r12, r9,  r5
228cabdff1aSopenharmony_ci        ldrd            r8,  r9,  [r2, #(160 - 136 + 16 + 64)]
229cabdff1aSopenharmony_ci        smlad           r6,  r12, r10, r6
230cabdff1aSopenharmony_ci        smlad           r7,  r12, r11, r7
231cabdff1aSopenharmony_ci        ldrd            r10, r11, [r2, #(160 - 136 + 16 + 72)]
232cabdff1aSopenharmony_ci        smlad           r4,  r0,  r8,  r4
233cabdff1aSopenharmony_ci        smlad           r5,  r0,  r9,  r5
234cabdff1aSopenharmony_ci        ldrd            r8,  r9,  [r2, #(160 - 136 + 16 + 96)]
235cabdff1aSopenharmony_ci        smlad           r6,  r0,  r10, r6
236cabdff1aSopenharmony_ci        smlad           r7,  r0,  r11, r7
237cabdff1aSopenharmony_ci        ldrd            r10, r11, [r2, #(160 - 136 + 16 + 104)]
238cabdff1aSopenharmony_ci        smlad           r4,  r14, r8,  r4
239cabdff1aSopenharmony_ci        smlad           r5,  r14, r9,  r5
240cabdff1aSopenharmony_ci        smlad           r6,  r14, r10, r6
241cabdff1aSopenharmony_ci        smlad           r7,  r14, r11, r7
242cabdff1aSopenharmony_ci        pop             {r8-r12, r14}
243cabdff1aSopenharmony_ci        stmia           r1!, {r4, r5, r6, r7}
244cabdff1aSopenharmony_ci        pop             {r1, r3-r7, pc}
245cabdff1aSopenharmony_ciendfunc
246