1cabdff1aSopenharmony_ci/*
2cabdff1aSopenharmony_ci * Copyright (c) 2009 Mans Rullgard <mans@mansr.com>
3cabdff1aSopenharmony_ci *
4cabdff1aSopenharmony_ci * This file is part of FFmpeg.
5cabdff1aSopenharmony_ci *
6cabdff1aSopenharmony_ci * FFmpeg is free software; you can redistribute it and/or
7cabdff1aSopenharmony_ci * modify it under the terms of the GNU Lesser General Public
8cabdff1aSopenharmony_ci * License as published by the Free Software Foundation; either
9cabdff1aSopenharmony_ci * version 2.1 of the License, or (at your option) any later version.
10cabdff1aSopenharmony_ci *
11cabdff1aSopenharmony_ci * FFmpeg is distributed in the hope that it will be useful,
12cabdff1aSopenharmony_ci * but WITHOUT ANY WARRANTY; without even the implied warranty of
13cabdff1aSopenharmony_ci * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
14cabdff1aSopenharmony_ci * Lesser General Public License for more details.
15cabdff1aSopenharmony_ci *
16cabdff1aSopenharmony_ci * You should have received a copy of the GNU Lesser General Public
17cabdff1aSopenharmony_ci * License along with FFmpeg; if not, write to the Free Software
18cabdff1aSopenharmony_ci * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
19cabdff1aSopenharmony_ci */
20cabdff1aSopenharmony_ci
21cabdff1aSopenharmony_ci#include "libavutil/arm/asm.S"
22cabdff1aSopenharmony_ci
23cabdff1aSopenharmony_cifunction ff_pix_abs16_armv6, export=1
24cabdff1aSopenharmony_ci        ldr             r0,  [sp]
25cabdff1aSopenharmony_ci        push            {r4-r9, lr}
26cabdff1aSopenharmony_ci        mov             r12, #0
27cabdff1aSopenharmony_ci        mov             lr,  #0
28cabdff1aSopenharmony_ci        ldm             r1,  {r4-r7}
29cabdff1aSopenharmony_ci        ldr             r8,  [r2]
30cabdff1aSopenharmony_ci1:
31cabdff1aSopenharmony_ci        ldr             r9,  [r2, #4]
32cabdff1aSopenharmony_ci        pld             [r1, r3]
33cabdff1aSopenharmony_ci        usada8          r12, r4,  r8,  r12
34cabdff1aSopenharmony_ci        ldr             r8,  [r2, #8]
35cabdff1aSopenharmony_ci        pld             [r2, r3]
36cabdff1aSopenharmony_ci        usada8          lr,  r5,  r9,  lr
37cabdff1aSopenharmony_ci        ldr             r9,  [r2, #12]
38cabdff1aSopenharmony_ci        usada8          r12, r6,  r8,  r12
39cabdff1aSopenharmony_ci        subs            r0,  r0,  #1
40cabdff1aSopenharmony_ci        usada8          lr,  r7,  r9,  lr
41cabdff1aSopenharmony_ci        beq             2f
42cabdff1aSopenharmony_ci        add             r1,  r1,  r3
43cabdff1aSopenharmony_ci        ldm             r1,  {r4-r7}
44cabdff1aSopenharmony_ci        add             r2,  r2,  r3
45cabdff1aSopenharmony_ci        ldr             r8,  [r2]
46cabdff1aSopenharmony_ci        b               1b
47cabdff1aSopenharmony_ci2:
48cabdff1aSopenharmony_ci        add             r0,  r12, lr
49cabdff1aSopenharmony_ci        pop             {r4-r9, pc}
50cabdff1aSopenharmony_ciendfunc
51cabdff1aSopenharmony_ci
52cabdff1aSopenharmony_cifunction ff_pix_abs16_x2_armv6, export=1
53cabdff1aSopenharmony_ci        ldr             r12, [sp]
54cabdff1aSopenharmony_ci        push            {r4-r11, lr}
55cabdff1aSopenharmony_ci        mov             r0,  #0
56cabdff1aSopenharmony_ci        mov             lr,  #1
57cabdff1aSopenharmony_ci        orr             lr,  lr,  lr,  lsl #8
58cabdff1aSopenharmony_ci        orr             lr,  lr,  lr,  lsl #16
59cabdff1aSopenharmony_ci1:
60cabdff1aSopenharmony_ci        ldr             r8,  [r2]
61cabdff1aSopenharmony_ci        ldr             r9,  [r2, #4]
62cabdff1aSopenharmony_ci        lsr             r10, r8,  #8
63cabdff1aSopenharmony_ci        ldr             r4,  [r1]
64cabdff1aSopenharmony_ci        lsr             r6,  r9,  #8
65cabdff1aSopenharmony_ci        orr             r10, r10, r9,  lsl #24
66cabdff1aSopenharmony_ci        ldr             r5,  [r2, #8]
67cabdff1aSopenharmony_ci        eor             r11, r8,  r10
68cabdff1aSopenharmony_ci        uhadd8          r7,  r8,  r10
69cabdff1aSopenharmony_ci        orr             r6,  r6,  r5,  lsl #24
70cabdff1aSopenharmony_ci        and             r11, r11, lr
71cabdff1aSopenharmony_ci        uadd8           r7,  r7,  r11
72cabdff1aSopenharmony_ci        ldr             r8,  [r1, #4]
73cabdff1aSopenharmony_ci        usada8          r0,  r4,  r7,  r0
74cabdff1aSopenharmony_ci        eor             r7,  r9,  r6
75cabdff1aSopenharmony_ci        lsr             r10, r5,  #8
76cabdff1aSopenharmony_ci        and             r7,  r7,  lr
77cabdff1aSopenharmony_ci        uhadd8          r4,  r9,  r6
78cabdff1aSopenharmony_ci        ldr             r6,  [r2, #12]
79cabdff1aSopenharmony_ci        uadd8           r4,  r4,  r7
80cabdff1aSopenharmony_ci        pld             [r1, r3]
81cabdff1aSopenharmony_ci        orr             r10, r10, r6,  lsl #24
82cabdff1aSopenharmony_ci        usada8          r0,  r8,  r4,  r0
83cabdff1aSopenharmony_ci        ldr             r4,  [r1, #8]
84cabdff1aSopenharmony_ci        eor             r11, r5,  r10
85cabdff1aSopenharmony_ci        ldrb            r7,  [r2, #16]
86cabdff1aSopenharmony_ci        and             r11, r11, lr
87cabdff1aSopenharmony_ci        uhadd8          r8,  r5,  r10
88cabdff1aSopenharmony_ci        ldr             r5,  [r1, #12]
89cabdff1aSopenharmony_ci        uadd8           r8,  r8,  r11
90cabdff1aSopenharmony_ci        pld             [r2, r3]
91cabdff1aSopenharmony_ci        lsr             r10, r6,  #8
92cabdff1aSopenharmony_ci        usada8          r0,  r4,  r8,  r0
93cabdff1aSopenharmony_ci        orr             r10, r10, r7,  lsl #24
94cabdff1aSopenharmony_ci        subs            r12,  r12,  #1
95cabdff1aSopenharmony_ci        eor             r11, r6,  r10
96cabdff1aSopenharmony_ci        add             r1,  r1,  r3
97cabdff1aSopenharmony_ci        uhadd8          r9,  r6,  r10
98cabdff1aSopenharmony_ci        and             r11, r11, lr
99cabdff1aSopenharmony_ci        uadd8           r9,  r9,  r11
100cabdff1aSopenharmony_ci        add             r2,  r2,  r3
101cabdff1aSopenharmony_ci        usada8          r0,  r5,  r9,  r0
102cabdff1aSopenharmony_ci        bgt             1b
103cabdff1aSopenharmony_ci
104cabdff1aSopenharmony_ci        pop             {r4-r11, pc}
105cabdff1aSopenharmony_ciendfunc
106cabdff1aSopenharmony_ci
107cabdff1aSopenharmony_ci.macro  usad_y2         p0,  p1,  p2,  p3,  n0,  n1,  n2,  n3
108cabdff1aSopenharmony_ci        ldr             \n0, [r2]
109cabdff1aSopenharmony_ci        eor             \n1, \p0, \n0
110cabdff1aSopenharmony_ci        uhadd8          \p0, \p0, \n0
111cabdff1aSopenharmony_ci        and             \n1, \n1, lr
112cabdff1aSopenharmony_ci        ldr             \n2, [r1]
113cabdff1aSopenharmony_ci        uadd8           \p0, \p0, \n1
114cabdff1aSopenharmony_ci        ldr             \n1, [r2, #4]
115cabdff1aSopenharmony_ci        usada8          r0,  \p0, \n2, r0
116cabdff1aSopenharmony_ci        pld             [r1,  r3]
117cabdff1aSopenharmony_ci        eor             \n3, \p1, \n1
118cabdff1aSopenharmony_ci        uhadd8          \p1, \p1, \n1
119cabdff1aSopenharmony_ci        and             \n3, \n3, lr
120cabdff1aSopenharmony_ci        ldr             \p0, [r1, #4]
121cabdff1aSopenharmony_ci        uadd8           \p1, \p1, \n3
122cabdff1aSopenharmony_ci        ldr             \n2, [r2, #8]
123cabdff1aSopenharmony_ci        usada8          r0,  \p1, \p0, r0
124cabdff1aSopenharmony_ci        pld             [r2,  r3]
125cabdff1aSopenharmony_ci        eor             \p0, \p2, \n2
126cabdff1aSopenharmony_ci        uhadd8          \p2, \p2, \n2
127cabdff1aSopenharmony_ci        and             \p0, \p0, lr
128cabdff1aSopenharmony_ci        ldr             \p1, [r1, #8]
129cabdff1aSopenharmony_ci        uadd8           \p2, \p2, \p0
130cabdff1aSopenharmony_ci        ldr             \n3, [r2, #12]
131cabdff1aSopenharmony_ci        usada8          r0,  \p2, \p1, r0
132cabdff1aSopenharmony_ci        eor             \p1, \p3, \n3
133cabdff1aSopenharmony_ci        uhadd8          \p3, \p3, \n3
134cabdff1aSopenharmony_ci        and             \p1, \p1, lr
135cabdff1aSopenharmony_ci        ldr             \p0,  [r1, #12]
136cabdff1aSopenharmony_ci        uadd8           \p3, \p3, \p1
137cabdff1aSopenharmony_ci        add             r1,  r1,  r3
138cabdff1aSopenharmony_ci        usada8          r0,  \p3, \p0,  r0
139cabdff1aSopenharmony_ci        add             r2,  r2,  r3
140cabdff1aSopenharmony_ci.endm
141cabdff1aSopenharmony_ci
142cabdff1aSopenharmony_cifunction ff_pix_abs16_y2_armv6, export=1
143cabdff1aSopenharmony_ci        pld             [r1]
144cabdff1aSopenharmony_ci        pld             [r2]
145cabdff1aSopenharmony_ci        ldr             r12, [sp]
146cabdff1aSopenharmony_ci        push            {r4-r11, lr}
147cabdff1aSopenharmony_ci        mov             r0,  #0
148cabdff1aSopenharmony_ci        mov             lr,  #1
149cabdff1aSopenharmony_ci        orr             lr,  lr,  lr,  lsl #8
150cabdff1aSopenharmony_ci        orr             lr,  lr,  lr,  lsl #16
151cabdff1aSopenharmony_ci        ldr             r4,  [r2]
152cabdff1aSopenharmony_ci        ldr             r5,  [r2, #4]
153cabdff1aSopenharmony_ci        ldr             r6,  [r2, #8]
154cabdff1aSopenharmony_ci        ldr             r7,  [r2, #12]
155cabdff1aSopenharmony_ci        add             r2,  r2,  r3
156cabdff1aSopenharmony_ci1:
157cabdff1aSopenharmony_ci        usad_y2         r4,  r5,  r6,  r7,  r8,  r9,  r10, r11
158cabdff1aSopenharmony_ci        subs            r12, r12, #2
159cabdff1aSopenharmony_ci        usad_y2         r8,  r9,  r10, r11, r4,  r5,  r6,  r7
160cabdff1aSopenharmony_ci        bgt             1b
161cabdff1aSopenharmony_ci
162cabdff1aSopenharmony_ci        pop             {r4-r11, pc}
163cabdff1aSopenharmony_ciendfunc
164cabdff1aSopenharmony_ci
165cabdff1aSopenharmony_cifunction ff_pix_abs8_armv6, export=1
166cabdff1aSopenharmony_ci        pld             [r2, r3]
167cabdff1aSopenharmony_ci        ldr             r12, [sp]
168cabdff1aSopenharmony_ci        push            {r4-r9, lr}
169cabdff1aSopenharmony_ci        mov             r0,  #0
170cabdff1aSopenharmony_ci        mov             lr,  #0
171cabdff1aSopenharmony_ci        ldrd_post       r4,  r5,  r1,  r3
172cabdff1aSopenharmony_ci1:
173cabdff1aSopenharmony_ci        subs            r12, r12, #2
174cabdff1aSopenharmony_ci        ldr             r7,  [r2, #4]
175cabdff1aSopenharmony_ci        ldr_post        r6,  r2,  r3
176cabdff1aSopenharmony_ci        ldrd_post       r8,  r9,  r1,  r3
177cabdff1aSopenharmony_ci        usada8          r0,  r4,  r6,  r0
178cabdff1aSopenharmony_ci        pld             [r2, r3]
179cabdff1aSopenharmony_ci        usada8          lr,  r5,  r7,  lr
180cabdff1aSopenharmony_ci        ldr             r7,  [r2, #4]
181cabdff1aSopenharmony_ci        ldr_post        r6,  r2,  r3
182cabdff1aSopenharmony_ci        beq             2f
183cabdff1aSopenharmony_ci        ldrd_post       r4,  r5,  r1,  r3
184cabdff1aSopenharmony_ci        usada8          r0,  r8,  r6,  r0
185cabdff1aSopenharmony_ci        pld             [r2, r3]
186cabdff1aSopenharmony_ci        usada8          lr,  r9,  r7,  lr
187cabdff1aSopenharmony_ci        b               1b
188cabdff1aSopenharmony_ci2:
189cabdff1aSopenharmony_ci        usada8          r0,  r8,  r6,  r0
190cabdff1aSopenharmony_ci        usada8          lr,  r9,  r7,  lr
191cabdff1aSopenharmony_ci        add             r0,  r0,  lr
192cabdff1aSopenharmony_ci        pop             {r4-r9, pc}
193cabdff1aSopenharmony_ciendfunc
194cabdff1aSopenharmony_ci
195cabdff1aSopenharmony_cifunction ff_sse16_armv6, export=1
196cabdff1aSopenharmony_ci        ldr             r12, [sp]
197cabdff1aSopenharmony_ci        push            {r4-r9, lr}
198cabdff1aSopenharmony_ci        mov             r0,  #0
199cabdff1aSopenharmony_ci1:
200cabdff1aSopenharmony_ci        ldrd            r4,  r5,  [r1]
201cabdff1aSopenharmony_ci        ldr             r8,  [r2]
202cabdff1aSopenharmony_ci        uxtb16          lr,  r4
203cabdff1aSopenharmony_ci        uxtb16          r4,  r4,  ror #8
204cabdff1aSopenharmony_ci        uxtb16          r9,  r8
205cabdff1aSopenharmony_ci        uxtb16          r8,  r8,  ror #8
206cabdff1aSopenharmony_ci        ldr             r7,  [r2, #4]
207cabdff1aSopenharmony_ci        usub16          lr,  lr,  r9
208cabdff1aSopenharmony_ci        usub16          r4,  r4,  r8
209cabdff1aSopenharmony_ci        smlad           r0,  lr,  lr,  r0
210cabdff1aSopenharmony_ci        uxtb16          r6,  r5
211cabdff1aSopenharmony_ci        uxtb16          lr,  r5,  ror #8
212cabdff1aSopenharmony_ci        uxtb16          r8,  r7
213cabdff1aSopenharmony_ci        uxtb16          r9,  r7,  ror #8
214cabdff1aSopenharmony_ci        smlad           r0,  r4,  r4,  r0
215cabdff1aSopenharmony_ci        ldrd            r4,  r5,  [r1, #8]
216cabdff1aSopenharmony_ci        usub16          r6,  r6,  r8
217cabdff1aSopenharmony_ci        usub16          r8,  lr,  r9
218cabdff1aSopenharmony_ci        ldr             r7,  [r2, #8]
219cabdff1aSopenharmony_ci        smlad           r0,  r6,  r6,  r0
220cabdff1aSopenharmony_ci        uxtb16          lr,  r4
221cabdff1aSopenharmony_ci        uxtb16          r4,  r4,  ror #8
222cabdff1aSopenharmony_ci        uxtb16          r9,  r7
223cabdff1aSopenharmony_ci        uxtb16          r7,  r7, ror #8
224cabdff1aSopenharmony_ci        smlad           r0,  r8,  r8,  r0
225cabdff1aSopenharmony_ci        ldr             r8,  [r2, #12]
226cabdff1aSopenharmony_ci        usub16          lr,  lr,  r9
227cabdff1aSopenharmony_ci        usub16          r4,  r4,  r7
228cabdff1aSopenharmony_ci        smlad           r0,  lr,  lr,  r0
229cabdff1aSopenharmony_ci        uxtb16          r6,  r5
230cabdff1aSopenharmony_ci        uxtb16          r5,  r5,  ror #8
231cabdff1aSopenharmony_ci        uxtb16          r9,  r8
232cabdff1aSopenharmony_ci        uxtb16          r8,  r8,  ror #8
233cabdff1aSopenharmony_ci        smlad           r0,  r4,  r4,  r0
234cabdff1aSopenharmony_ci        usub16          r6,  r6,  r9
235cabdff1aSopenharmony_ci        usub16          r5,  r5,  r8
236cabdff1aSopenharmony_ci        smlad           r0,  r6,  r6,  r0
237cabdff1aSopenharmony_ci        add             r1,  r1,  r3
238cabdff1aSopenharmony_ci        add             r2,  r2,  r3
239cabdff1aSopenharmony_ci        subs            r12, r12, #1
240cabdff1aSopenharmony_ci        smlad           r0,  r5,  r5,  r0
241cabdff1aSopenharmony_ci        bgt             1b
242cabdff1aSopenharmony_ci
243cabdff1aSopenharmony_ci        pop             {r4-r9, pc}
244cabdff1aSopenharmony_ciendfunc
245