Mercurial > libavcodec.hg
comparison arm/h264idct_neon.S @ 12368:ba14e3adeccd libavcodec
ARM: NEON H264 8x8 IDCT
Parts by David Conrad.
author | mru |
---|---|
date | Thu, 05 Aug 2010 19:45:57 +0000 |
parents | 361a5fcb4393 |
children | 8e7fd2d2193f |
comparison
equal
deleted
inserted
replaced
12367:06bdd447f4f7 | 12368:ba14e3adeccd |
---|---|
167 add r1, r1, #32 | 167 add r1, r1, #32 |
168 bne 1b | 168 bne 1b |
169 pop {r4-r10,pc} | 169 pop {r4-r10,pc} |
170 endfunc | 170 endfunc |
171 | 171 |
172 .macro idct8x8_cols pass | |
173 .if \pass == 0 | |
174 qa .req q2 | |
175 qb .req q14 | |
176 vshr.s16 q2, q10, #1 | |
177 vadd.i16 q0, q8, q12 | |
178 vld1.16 {q14-q15},[r1,:128]! | |
179 vsub.i16 q1, q8, q12 | |
180 vshr.s16 q3, q14, #1 | |
181 vsub.i16 q2, q2, q14 | |
182 vadd.i16 q3, q3, q10 | |
183 .else | |
184 qa .req q14 | |
185 qb .req q2 | |
186 vtrn.32 q8, q10 | |
187 vtrn.16 q12, q13 | |
188 vtrn.32 q9, q11 | |
189 vtrn.32 q12, q2 | |
190 vtrn.32 q13, q15 | |
191 vswp d21, d4 | |
192 vshr.s16 q14, q10, #1 | |
193 vswp d17, d24 | |
194 vshr.s16 q3, q2, #1 | |
195 vswp d19, d26 | |
196 vadd.i16 q0, q8, q12 | |
197 vswp d23, d30 | |
198 vsub.i16 q1, q8, q12 | |
199 vsub.i16 q14, q14, q2 | |
200 vadd.i16 q3, q3, q10 | |
201 .endif | |
202 vadd.i16 q10, q1, qa | |
203 vsub.i16 q12, q1, qa | |
204 vadd.i16 q8, q0, q3 | |
205 vsub.i16 qb, q0, q3 | |
206 vsub.i16 q0, q13, q11 | |
207 vadd.i16 q1, q15, q9 | |
208 vsub.i16 qa, q15, q9 | |
209 vadd.i16 q3, q13, q11 | |
210 vsub.i16 q0, q0, q15 | |
211 vsub.i16 q1, q1, q11 | |
212 vadd.i16 qa, qa, q13 | |
213 vadd.i16 q3, q3, q9 | |
214 vshr.s16 q9, q9, #1 | |
215 vshr.s16 q11, q11, #1 | |
216 vshr.s16 q13, q13, #1 | |
217 vshr.s16 q15, q15, #1 | |
218 vsub.i16 q0, q0, q15 | |
219 vsub.i16 q1, q1, q11 | |
220 vadd.i16 qa, qa, q13 | |
221 vadd.i16 q3, q3, q9 | |
222 vshr.s16 q9, q0, #2 | |
223 vshr.s16 q11, q1, #2 | |
224 vshr.s16 q13, qa, #2 | |
225 vshr.s16 q15, q3, #2 | |
226 vsub.i16 q3, q3, q9 | |
227 vsub.i16 qa, q11, qa | |
228 vadd.i16 q1, q1, q13 | |
229 vadd.i16 q0, q0, q15 | |
230 .if \pass == 0 | |
231 vsub.i16 q15, q8, q3 | |
232 vadd.i16 q8, q8, q3 | |
233 vadd.i16 q9, q10, q2 | |
234 vsub.i16 q2, q10, q2 | |
235 vtrn.16 q8, q9 | |
236 vadd.i16 q10, q12, q1 | |
237 vtrn.16 q2, q15 | |
238 vadd.i16 q11, q14, q0 | |
239 vsub.i16 q13, q12, q1 | |
240 vtrn.16 q10, q11 | |
241 vsub.i16 q12, q14, q0 | |
242 .else | |
243 vsub.i16 q15, q8, q3 | |
244 vadd.i16 q8, q8, q3 | |
245 vadd.i16 q9, q10, q14 | |
246 vsub.i16 q14, q10, q14 | |
247 vadd.i16 q10, q12, q1 | |
248 vsub.i16 q13, q12, q1 | |
249 vadd.i16 q11, q2, q0 | |
250 vsub.i16 q12, q2, q0 | |
251 .endif | |
252 .unreq qa | |
253 .unreq qb | |
254 .endm | |
255 | |
256 function ff_h264_idct8_add_neon, export=1 | |
257 vld1.16 {q8-q9}, [r1,:128]! | |
258 vld1.16 {q10-q11},[r1,:128]! | |
259 vld1.16 {q12-q13},[r1,:128]! | |
260 | |
261 idct8x8_cols 0 | |
262 idct8x8_cols 1 | |
263 | |
264 mov r3, r0 | |
265 vrshr.s16 q8, q8, #6 | |
266 vld1.8 {d0}, [r0,:64], r2 | |
267 vrshr.s16 q9, q9, #6 | |
268 vld1.8 {d1}, [r0,:64], r2 | |
269 vrshr.s16 q10, q10, #6 | |
270 vld1.8 {d2}, [r0,:64], r2 | |
271 vrshr.s16 q11, q11, #6 | |
272 vld1.8 {d3}, [r0,:64], r2 | |
273 vrshr.s16 q12, q12, #6 | |
274 vld1.8 {d4}, [r0,:64], r2 | |
275 vrshr.s16 q13, q13, #6 | |
276 vld1.8 {d5}, [r0,:64], r2 | |
277 vrshr.s16 q14, q14, #6 | |
278 vld1.8 {d6}, [r0,:64], r2 | |
279 vrshr.s16 q15, q15, #6 | |
280 vld1.8 {d7}, [r0,:64], r2 | |
281 vaddw.u8 q8, q8, d0 | |
282 vaddw.u8 q9, q9, d1 | |
283 vaddw.u8 q10, q10, d2 | |
284 vqmovun.s16 d0, q8 | |
285 vaddw.u8 q11, q11, d3 | |
286 vqmovun.s16 d1, q9 | |
287 vaddw.u8 q12, q12, d4 | |
288 vqmovun.s16 d2, q10 | |
289 vst1.8 {d0}, [r3,:64], r2 | |
290 vaddw.u8 q13, q13, d5 | |
291 vqmovun.s16 d3, q11 | |
292 vst1.8 {d1}, [r3,:64], r2 | |
293 vaddw.u8 q14, q14, d6 | |
294 vqmovun.s16 d4, q12 | |
295 vst1.8 {d2}, [r3,:64], r2 | |
296 vaddw.u8 q15, q15, d7 | |
297 vqmovun.s16 d5, q13 | |
298 vst1.8 {d3}, [r3,:64], r2 | |
299 vqmovun.s16 d6, q14 | |
300 vqmovun.s16 d7, q15 | |
301 vst1.8 {d4}, [r3,:64], r2 | |
302 vst1.8 {d5}, [r3,:64], r2 | |
303 vst1.8 {d6}, [r3,:64], r2 | |
304 vst1.8 {d7}, [r3,:64], r2 | |
305 | |
306 sub r1, r1, #128 | |
307 bx lr | |
308 endfunc | |
309 | |
310 function ff_h264_idct8_dc_add_neon, export=1 | |
311 vld1.16 {d30[],d31[]},[r1,:16] | |
312 vld1.32 {d0}, [r0,:64], r2 | |
313 vrshr.s16 q15, q15, #6 | |
314 vld1.32 {d1}, [r0,:64], r2 | |
315 vld1.32 {d2}, [r0,:64], r2 | |
316 vaddw.u8 q8, q15, d0 | |
317 vld1.32 {d3}, [r0,:64], r2 | |
318 vaddw.u8 q9, q15, d1 | |
319 vld1.32 {d4}, [r0,:64], r2 | |
320 vaddw.u8 q10, q15, d2 | |
321 vld1.32 {d5}, [r0,:64], r2 | |
322 vaddw.u8 q11, q15, d3 | |
323 vld1.32 {d6}, [r0,:64], r2 | |
324 vaddw.u8 q12, q15, d4 | |
325 vld1.32 {d7}, [r0,:64], r2 | |
326 vaddw.u8 q13, q15, d5 | |
327 vaddw.u8 q14, q15, d6 | |
328 vaddw.u8 q15, q15, d7 | |
329 vqmovun.s16 d0, q8 | |
330 vqmovun.s16 d1, q9 | |
331 vqmovun.s16 d2, q10 | |
332 vqmovun.s16 d3, q11 | |
333 sub r0, r0, r2, lsl #3 | |
334 vst1.32 {d0}, [r0,:64], r2 | |
335 vqmovun.s16 d4, q12 | |
336 vst1.32 {d1}, [r0,:64], r2 | |
337 vqmovun.s16 d5, q13 | |
338 vst1.32 {d2}, [r0,:64], r2 | |
339 vqmovun.s16 d6, q14 | |
340 vst1.32 {d3}, [r0,:64], r2 | |
341 vqmovun.s16 d7, q15 | |
342 vst1.32 {d4}, [r0,:64], r2 | |
343 vst1.32 {d5}, [r0,:64], r2 | |
344 vst1.32 {d6}, [r0,:64], r2 | |
345 vst1.32 {d7}, [r0,:64], r2 | |
346 bx lr | |
347 endfunc | |
348 | |
349 function ff_h264_idct8_add4_neon, export=1 | |
350 push {r4-r8,lr} | |
351 mov r4, r0 | |
352 mov r5, r1 | |
353 mov r1, r2 | |
354 mov r2, r3 | |
355 ldr r6, [sp, #24] | |
356 movrel r7, scan8 | |
357 mov r12, #16 | |
358 1: ldrb r8, [r7], #4 | |
359 ldr r0, [r5], #16 | |
360 ldrb r8, [r6, r8] | |
361 subs r8, r8, #1 | |
362 blt 2f | |
363 ldrsh lr, [r1] | |
364 add r0, r0, r4 | |
365 movne lr, #0 | |
366 cmp lr, #0 | |
367 adrne lr, ff_h264_idct8_dc_add_neon | |
368 adreq lr, ff_h264_idct8_add_neon | |
369 blx lr | |
370 2: subs r12, r12, #4 | |
371 add r1, r1, #128 | |
372 bne 1b | |
373 pop {r4-r8,pc} | |
374 endfunc | |
375 | |
172 .section .rodata | 376 .section .rodata |
173 scan8: .byte 4+1*8, 5+1*8, 4+2*8, 5+2*8 | 377 scan8: .byte 4+1*8, 5+1*8, 4+2*8, 5+2*8 |
174 .byte 6+1*8, 7+1*8, 6+2*8, 7+2*8 | 378 .byte 6+1*8, 7+1*8, 6+2*8, 7+2*8 |
175 .byte 4+3*8, 5+3*8, 4+4*8, 5+4*8 | 379 .byte 4+3*8, 5+3*8, 4+4*8, 5+4*8 |
176 .byte 6+3*8, 7+3*8, 6+4*8, 7+4*8 | 380 .byte 6+3*8, 7+3*8, 6+4*8, 7+4*8 |