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