190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber; 2f71323e297a928af368937089d3ed71239786f86Andreas Huber; Copyright (c) 2010 The WebM project authors. All Rights Reserved. 390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber; 4f71323e297a928af368937089d3ed71239786f86Andreas Huber; Use of this source code is governed by a BSD-style license 5f71323e297a928af368937089d3ed71239786f86Andreas Huber; that can be found in the LICENSE file in the root of the source 6f71323e297a928af368937089d3ed71239786f86Andreas Huber; tree. An additional intellectual property rights grant can be found 7f71323e297a928af368937089d3ed71239786f86Andreas Huber; in the file PATENTS. All contributing project authors may 8f71323e297a928af368937089d3ed71239786f86Andreas Huber; be found in the AUTHORS file in the root of the source tree. 990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber; 1090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber 1179f15823c34ae1e423108295e416213200bb280fAndreas Huber EXPORT |vp8_subtract_b_neon| 1290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber EXPORT |vp8_subtract_mby_neon| 1390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber EXPORT |vp8_subtract_mbuv_neon| 1490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber 1579f15823c34ae1e423108295e416213200bb280fAndreas Huber INCLUDE asm_enc_offsets.asm 1679f15823c34ae1e423108295e416213200bb280fAndreas Huber 1790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber ARM 1890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber REQUIRE8 1990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber PRESERVE8 2090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber 2190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber AREA ||.text||, CODE, READONLY, ALIGN=2 2279f15823c34ae1e423108295e416213200bb280fAndreas Huber 2379f15823c34ae1e423108295e416213200bb280fAndreas Huber;void vp8_subtract_b_neon(BLOCK *be, BLOCKD *bd, int pitch) 2479f15823c34ae1e423108295e416213200bb280fAndreas Huber|vp8_subtract_b_neon| PROC 2579f15823c34ae1e423108295e416213200bb280fAndreas Huber 2679f15823c34ae1e423108295e416213200bb280fAndreas Huber stmfd sp!, {r4-r7} 2779f15823c34ae1e423108295e416213200bb280fAndreas Huber 2879f15823c34ae1e423108295e416213200bb280fAndreas Huber ldr r3, [r0, #vp8_block_base_src] 2979f15823c34ae1e423108295e416213200bb280fAndreas Huber ldr r4, [r0, #vp8_block_src] 3079f15823c34ae1e423108295e416213200bb280fAndreas Huber ldr r5, [r0, #vp8_block_src_diff] 3179f15823c34ae1e423108295e416213200bb280fAndreas Huber ldr r3, [r3] 3279f15823c34ae1e423108295e416213200bb280fAndreas Huber ldr r6, [r0, #vp8_block_src_stride] 3379f15823c34ae1e423108295e416213200bb280fAndreas Huber add r3, r3, r4 ; src = *base_src + src 3479f15823c34ae1e423108295e416213200bb280fAndreas Huber ldr r7, [r1, #vp8_blockd_predictor] 3579f15823c34ae1e423108295e416213200bb280fAndreas Huber 3679f15823c34ae1e423108295e416213200bb280fAndreas Huber vld1.8 {d0}, [r3], r6 ;load src 3779f15823c34ae1e423108295e416213200bb280fAndreas Huber vld1.8 {d1}, [r7], r2 ;load pred 3879f15823c34ae1e423108295e416213200bb280fAndreas Huber vld1.8 {d2}, [r3], r6 3979f15823c34ae1e423108295e416213200bb280fAndreas Huber vld1.8 {d3}, [r7], r2 4079f15823c34ae1e423108295e416213200bb280fAndreas Huber vld1.8 {d4}, [r3], r6 4179f15823c34ae1e423108295e416213200bb280fAndreas Huber vld1.8 {d5}, [r7], r2 4279f15823c34ae1e423108295e416213200bb280fAndreas Huber vld1.8 {d6}, [r3], r6 4379f15823c34ae1e423108295e416213200bb280fAndreas Huber vld1.8 {d7}, [r7], r2 4490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber 4590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber vsubl.u8 q10, d0, d1 4690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber vsubl.u8 q11, d2, d3 4790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber vsubl.u8 q12, d4, d5 4890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber vsubl.u8 q13, d6, d7 4990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber 5079f15823c34ae1e423108295e416213200bb280fAndreas Huber mov r2, r2, lsl #1 5190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber 5279f15823c34ae1e423108295e416213200bb280fAndreas Huber vst1.16 {d20}, [r5], r2 ;store diff 5379f15823c34ae1e423108295e416213200bb280fAndreas Huber vst1.16 {d22}, [r5], r2 5479f15823c34ae1e423108295e416213200bb280fAndreas Huber vst1.16 {d24}, [r5], r2 5579f15823c34ae1e423108295e416213200bb280fAndreas Huber vst1.16 {d26}, [r5], r2 5690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber 5779f15823c34ae1e423108295e416213200bb280fAndreas Huber ldmfd sp!, {r4-r7} 5890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber bx lr 5979f15823c34ae1e423108295e416213200bb280fAndreas Huber 6090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber ENDP 6190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber 6279f15823c34ae1e423108295e416213200bb280fAndreas Huber 6390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber;========================================== 6490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber;void vp8_subtract_mby_neon(short *diff, unsigned char *src, unsigned char *pred, int stride) 6590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber|vp8_subtract_mby_neon| PROC 6690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber mov r12, #4 6790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber 6890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Hubersubtract_mby_loop 6990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber vld1.8 {q0}, [r1], r3 ;load src 7090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber vld1.8 {q1}, [r2]! ;load pred 7190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber vld1.8 {q2}, [r1], r3 7290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber vld1.8 {q3}, [r2]! 7390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber vld1.8 {q4}, [r1], r3 7490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber vld1.8 {q5}, [r2]! 7590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber vld1.8 {q6}, [r1], r3 7690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber vld1.8 {q7}, [r2]! 7790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber 7890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber vsubl.u8 q8, d0, d2 7990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber vsubl.u8 q9, d1, d3 8090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber vsubl.u8 q10, d4, d6 8190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber vsubl.u8 q11, d5, d7 8290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber vsubl.u8 q12, d8, d10 8390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber vsubl.u8 q13, d9, d11 8490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber vsubl.u8 q14, d12, d14 8590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber vsubl.u8 q15, d13, d15 8690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber 8790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber vst1.16 {q8}, [r0]! ;store diff 8890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber vst1.16 {q9}, [r0]! 8990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber vst1.16 {q10}, [r0]! 9090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber vst1.16 {q11}, [r0]! 9190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber vst1.16 {q12}, [r0]! 9290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber vst1.16 {q13}, [r0]! 9390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber vst1.16 {q14}, [r0]! 9490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber vst1.16 {q15}, [r0]! 9590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber 9690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber subs r12, r12, #1 9790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber bne subtract_mby_loop 9890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber 9990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber bx lr 10090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber ENDP 10190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber 10290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber;================================= 10390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber;void vp8_subtract_mbuv_neon(short *diff, unsigned char *usrc, unsigned char *vsrc, unsigned char *pred, int stride) 10490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber|vp8_subtract_mbuv_neon| PROC 10590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber ldr r12, [sp] 10690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber 10790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber;u 10890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber add r0, r0, #512 ; short *udiff = diff + 256; 10990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber add r3, r3, #256 ; unsigned char *upred = pred + 256; 11090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber 11190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber vld1.8 {d0}, [r1], r12 ;load src 11290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber vld1.8 {d1}, [r3]! ;load pred 11390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber vld1.8 {d2}, [r1], r12 11490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber vld1.8 {d3}, [r3]! 11590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber vld1.8 {d4}, [r1], r12 11690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber vld1.8 {d5}, [r3]! 11790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber vld1.8 {d6}, [r1], r12 11890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber vld1.8 {d7}, [r3]! 11990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber vld1.8 {d8}, [r1], r12 12090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber vld1.8 {d9}, [r3]! 12190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber vld1.8 {d10}, [r1], r12 12290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber vld1.8 {d11}, [r3]! 12390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber vld1.8 {d12}, [r1], r12 12490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber vld1.8 {d13}, [r3]! 12590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber vld1.8 {d14}, [r1], r12 12690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber vld1.8 {d15}, [r3]! 12790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber 12890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber vsubl.u8 q8, d0, d1 12990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber vsubl.u8 q9, d2, d3 13090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber vsubl.u8 q10, d4, d5 13190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber vsubl.u8 q11, d6, d7 13290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber vsubl.u8 q12, d8, d9 13390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber vsubl.u8 q13, d10, d11 13490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber vsubl.u8 q14, d12, d13 13590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber vsubl.u8 q15, d14, d15 13690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber 13790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber vst1.16 {q8}, [r0]! ;store diff 13890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber vst1.16 {q9}, [r0]! 13990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber vst1.16 {q10}, [r0]! 14090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber vst1.16 {q11}, [r0]! 14190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber vst1.16 {q12}, [r0]! 14290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber vst1.16 {q13}, [r0]! 14390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber vst1.16 {q14}, [r0]! 14490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber vst1.16 {q15}, [r0]! 14590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber 14690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber;v 14790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber vld1.8 {d0}, [r2], r12 ;load src 14890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber vld1.8 {d1}, [r3]! ;load pred 14990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber vld1.8 {d2}, [r2], r12 15090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber vld1.8 {d3}, [r3]! 15190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber vld1.8 {d4}, [r2], r12 15290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber vld1.8 {d5}, [r3]! 15390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber vld1.8 {d6}, [r2], r12 15490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber vld1.8 {d7}, [r3]! 15590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber vld1.8 {d8}, [r2], r12 15690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber vld1.8 {d9}, [r3]! 15790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber vld1.8 {d10}, [r2], r12 15890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber vld1.8 {d11}, [r3]! 15990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber vld1.8 {d12}, [r2], r12 16090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber vld1.8 {d13}, [r3]! 16190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber vld1.8 {d14}, [r2], r12 16290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber vld1.8 {d15}, [r3]! 16390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber 16490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber vsubl.u8 q8, d0, d1 16590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber vsubl.u8 q9, d2, d3 16690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber vsubl.u8 q10, d4, d5 16790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber vsubl.u8 q11, d6, d7 16890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber vsubl.u8 q12, d8, d9 16990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber vsubl.u8 q13, d10, d11 17090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber vsubl.u8 q14, d12, d13 17190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber vsubl.u8 q15, d14, d15 17290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber 17390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber vst1.16 {q8}, [r0]! ;store diff 17490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber vst1.16 {q9}, [r0]! 17590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber vst1.16 {q10}, [r0]! 17690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber vst1.16 {q11}, [r0]! 17790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber vst1.16 {q12}, [r0]! 17890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber vst1.16 {q13}, [r0]! 17990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber vst1.16 {q14}, [r0]! 18090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber vst1.16 {q15}, [r0]! 18190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber 18290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber bx lr 18390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber ENDP 18490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber 18590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber END 186