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