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