191037db265ecdd914a26e056cf69207b4f50924ehkuang;
291037db265ecdd914a26e056cf69207b4f50924ehkuang;   Copyright (c) 2013 The WebM project authors. All Rights Reserved.
391037db265ecdd914a26e056cf69207b4f50924ehkuang;
491037db265ecdd914a26e056cf69207b4f50924ehkuang;   Use of this source code is governed by a BSD-style license
591037db265ecdd914a26e056cf69207b4f50924ehkuang;   that can be found in the LICENSE file in the root of the source
691037db265ecdd914a26e056cf69207b4f50924ehkuang;   tree. An additional intellectual property rights grant can be found
791037db265ecdd914a26e056cf69207b4f50924ehkuang;   in the file PATENTS.  All contributing project authors may
891037db265ecdd914a26e056cf69207b4f50924ehkuang;   be found in the AUTHORS file in the root of the source tree.
991037db265ecdd914a26e056cf69207b4f50924ehkuang;
1091037db265ecdd914a26e056cf69207b4f50924ehkuang
1191037db265ecdd914a26e056cf69207b4f50924ehkuang    EXPORT |vp9_add_constant_residual_8x8_neon|
1291037db265ecdd914a26e056cf69207b4f50924ehkuang    EXPORT |vp9_add_constant_residual_16x16_neon|
1391037db265ecdd914a26e056cf69207b4f50924ehkuang    EXPORT |vp9_add_constant_residual_32x32_neon|
1491037db265ecdd914a26e056cf69207b4f50924ehkuang    ARM
1591037db265ecdd914a26e056cf69207b4f50924ehkuang
1691037db265ecdd914a26e056cf69207b4f50924ehkuang    AREA ||.text||, CODE, READONLY, ALIGN=2
1791037db265ecdd914a26e056cf69207b4f50924ehkuang
1891037db265ecdd914a26e056cf69207b4f50924ehkuang    MACRO
1991037db265ecdd914a26e056cf69207b4f50924ehkuang    LD_16x8 $src, $stride
2091037db265ecdd914a26e056cf69207b4f50924ehkuang    vld1.8              {q8},       [$src],     $stride
2191037db265ecdd914a26e056cf69207b4f50924ehkuang    vld1.8              {q9},       [$src],     $stride
2291037db265ecdd914a26e056cf69207b4f50924ehkuang    vld1.8              {q10},      [$src],     $stride
2391037db265ecdd914a26e056cf69207b4f50924ehkuang    vld1.8              {q11},      [$src],     $stride
2491037db265ecdd914a26e056cf69207b4f50924ehkuang    vld1.8              {q12},      [$src],     $stride
2591037db265ecdd914a26e056cf69207b4f50924ehkuang    vld1.8              {q13},      [$src],     $stride
2691037db265ecdd914a26e056cf69207b4f50924ehkuang    vld1.8              {q14},      [$src],     $stride
2791037db265ecdd914a26e056cf69207b4f50924ehkuang    vld1.8              {q15},      [$src],     $stride
2891037db265ecdd914a26e056cf69207b4f50924ehkuang    MEND
2991037db265ecdd914a26e056cf69207b4f50924ehkuang
3091037db265ecdd914a26e056cf69207b4f50924ehkuang    MACRO
3191037db265ecdd914a26e056cf69207b4f50924ehkuang    ADD_DIFF_16x8 $diff
3291037db265ecdd914a26e056cf69207b4f50924ehkuang    vqadd.u8            q8,         q8,         $diff
3391037db265ecdd914a26e056cf69207b4f50924ehkuang    vqadd.u8            q9,         q9,         $diff
3491037db265ecdd914a26e056cf69207b4f50924ehkuang    vqadd.u8            q10,        q10,        $diff
3591037db265ecdd914a26e056cf69207b4f50924ehkuang    vqadd.u8            q11,        q11,        $diff
3691037db265ecdd914a26e056cf69207b4f50924ehkuang    vqadd.u8            q12,        q12,        $diff
3791037db265ecdd914a26e056cf69207b4f50924ehkuang    vqadd.u8            q13,        q13,        $diff
3891037db265ecdd914a26e056cf69207b4f50924ehkuang    vqadd.u8            q14,        q14,        $diff
3991037db265ecdd914a26e056cf69207b4f50924ehkuang    vqadd.u8            q15,        q15,        $diff
4091037db265ecdd914a26e056cf69207b4f50924ehkuang    MEND
4191037db265ecdd914a26e056cf69207b4f50924ehkuang
4291037db265ecdd914a26e056cf69207b4f50924ehkuang    MACRO
4391037db265ecdd914a26e056cf69207b4f50924ehkuang    SUB_DIFF_16x8 $diff
4491037db265ecdd914a26e056cf69207b4f50924ehkuang    vqsub.u8            q8,         q8,         $diff
4591037db265ecdd914a26e056cf69207b4f50924ehkuang    vqsub.u8            q9,         q9,         $diff
4691037db265ecdd914a26e056cf69207b4f50924ehkuang    vqsub.u8            q10,        q10,        $diff
4791037db265ecdd914a26e056cf69207b4f50924ehkuang    vqsub.u8            q11,        q11,        $diff
4891037db265ecdd914a26e056cf69207b4f50924ehkuang    vqsub.u8            q12,        q12,        $diff
4991037db265ecdd914a26e056cf69207b4f50924ehkuang    vqsub.u8            q13,        q13,        $diff
5091037db265ecdd914a26e056cf69207b4f50924ehkuang    vqsub.u8            q14,        q14,        $diff
5191037db265ecdd914a26e056cf69207b4f50924ehkuang    vqsub.u8            q15,        q15,        $diff
5291037db265ecdd914a26e056cf69207b4f50924ehkuang    MEND
5391037db265ecdd914a26e056cf69207b4f50924ehkuang
5491037db265ecdd914a26e056cf69207b4f50924ehkuang    MACRO
5591037db265ecdd914a26e056cf69207b4f50924ehkuang    ST_16x8 $dst, $stride
5691037db265ecdd914a26e056cf69207b4f50924ehkuang    vst1.8              {q8},       [$dst],     $stride
5791037db265ecdd914a26e056cf69207b4f50924ehkuang    vst1.8              {q9},       [$dst],     $stride
5891037db265ecdd914a26e056cf69207b4f50924ehkuang    vst1.8              {q10},      [$dst],     $stride
5991037db265ecdd914a26e056cf69207b4f50924ehkuang    vst1.8              {q11},      [$dst],     $stride
6091037db265ecdd914a26e056cf69207b4f50924ehkuang    vst1.8              {q12},      [$dst],     $stride
6191037db265ecdd914a26e056cf69207b4f50924ehkuang    vst1.8              {q13},      [$dst],     $stride
6291037db265ecdd914a26e056cf69207b4f50924ehkuang    vst1.8              {q14},      [$dst],     $stride
6391037db265ecdd914a26e056cf69207b4f50924ehkuang    vst1.8              {q15},      [$dst],     $stride
6491037db265ecdd914a26e056cf69207b4f50924ehkuang    MEND
6591037db265ecdd914a26e056cf69207b4f50924ehkuang
6691037db265ecdd914a26e056cf69207b4f50924ehkuang; void add_constant_residual(const int16_t diff, uint8_t *dest, int stride,
6791037db265ecdd914a26e056cf69207b4f50924ehkuang;                             int width, int height) {
6891037db265ecdd914a26e056cf69207b4f50924ehkuang;  int r, c;
6991037db265ecdd914a26e056cf69207b4f50924ehkuang;
7091037db265ecdd914a26e056cf69207b4f50924ehkuang;  for (r = 0; r < height; r++) {
7191037db265ecdd914a26e056cf69207b4f50924ehkuang;    for (c = 0; c < width; c++)
7291037db265ecdd914a26e056cf69207b4f50924ehkuang;      dest[c] = clip_pixel(diff + dest[c]);
7391037db265ecdd914a26e056cf69207b4f50924ehkuang;
7491037db265ecdd914a26e056cf69207b4f50924ehkuang;    dest += stride;
7591037db265ecdd914a26e056cf69207b4f50924ehkuang;  }
7691037db265ecdd914a26e056cf69207b4f50924ehkuang;}
7791037db265ecdd914a26e056cf69207b4f50924ehkuang;void vp9_add_constant_residual_8x8_c(const int16_t diff, uint8_t *dest,
7891037db265ecdd914a26e056cf69207b4f50924ehkuang;                                     int stride) {
7991037db265ecdd914a26e056cf69207b4f50924ehkuang;  add_constant_residual(diff, dest, stride, 8, 8);
8091037db265ecdd914a26e056cf69207b4f50924ehkuang;}
8191037db265ecdd914a26e056cf69207b4f50924ehkuang;       r0      : const int16_t diff
8291037db265ecdd914a26e056cf69207b4f50924ehkuang;       r1      : const uint8_t *dest
8391037db265ecdd914a26e056cf69207b4f50924ehkuang;       r2      : int stride
8491037db265ecdd914a26e056cf69207b4f50924ehkuang;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
8591037db265ecdd914a26e056cf69207b4f50924ehkuang|vp9_add_constant_residual_8x8_neon| PROC
8691037db265ecdd914a26e056cf69207b4f50924ehkuang    mov                 r3,         r1                      ; r3: save dest to r3
8791037db265ecdd914a26e056cf69207b4f50924ehkuang    vld1.8              {d0},       [r1],       r2
8891037db265ecdd914a26e056cf69207b4f50924ehkuang    vld1.8              {d1},       [r1],       r2
8991037db265ecdd914a26e056cf69207b4f50924ehkuang    vld1.8              {d2},       [r1],       r2
9091037db265ecdd914a26e056cf69207b4f50924ehkuang    vld1.8              {d3},       [r1],       r2
9191037db265ecdd914a26e056cf69207b4f50924ehkuang    vld1.8              {d4},       [r1],       r2
9291037db265ecdd914a26e056cf69207b4f50924ehkuang    vld1.8              {d5},       [r1],       r2
9391037db265ecdd914a26e056cf69207b4f50924ehkuang    vld1.8              {d6},       [r1],       r2
9491037db265ecdd914a26e056cf69207b4f50924ehkuang    vld1.8              {d7},       [r1],       r2
9591037db265ecdd914a26e056cf69207b4f50924ehkuang    cmp                 r0,         #0
9691037db265ecdd914a26e056cf69207b4f50924ehkuang    bge                 DIFF_POSITIVE_8x8
9791037db265ecdd914a26e056cf69207b4f50924ehkuang
9891037db265ecdd914a26e056cf69207b4f50924ehkuangDIFF_NEGATIVE_8x8                                           ; diff < 0
9991037db265ecdd914a26e056cf69207b4f50924ehkuang    neg                 r0,         r0
10091037db265ecdd914a26e056cf69207b4f50924ehkuang    usat                r0,         #8,         r0
10191037db265ecdd914a26e056cf69207b4f50924ehkuang    vdup.u8             q8,         r0
10291037db265ecdd914a26e056cf69207b4f50924ehkuang
10391037db265ecdd914a26e056cf69207b4f50924ehkuang    vqsub.u8            q0,         q0,         q8
10491037db265ecdd914a26e056cf69207b4f50924ehkuang    vqsub.u8            q1,         q1,         q8
10591037db265ecdd914a26e056cf69207b4f50924ehkuang    vqsub.u8            q2,         q2,         q8
10691037db265ecdd914a26e056cf69207b4f50924ehkuang    vqsub.u8            q3,         q3,         q8
10791037db265ecdd914a26e056cf69207b4f50924ehkuang    b                   DIFF_SAVE_8x8
10891037db265ecdd914a26e056cf69207b4f50924ehkuang
10991037db265ecdd914a26e056cf69207b4f50924ehkuangDIFF_POSITIVE_8x8                                           ; diff >= 0
11091037db265ecdd914a26e056cf69207b4f50924ehkuang    usat                r0,         #8,         r0
11191037db265ecdd914a26e056cf69207b4f50924ehkuang    vdup.u8             q8,         r0
11291037db265ecdd914a26e056cf69207b4f50924ehkuang
11391037db265ecdd914a26e056cf69207b4f50924ehkuang    vqadd.u8            q0,         q0,         q8
11491037db265ecdd914a26e056cf69207b4f50924ehkuang    vqadd.u8            q1,         q1,         q8
11591037db265ecdd914a26e056cf69207b4f50924ehkuang    vqadd.u8            q2,         q2,         q8
11691037db265ecdd914a26e056cf69207b4f50924ehkuang    vqadd.u8            q3,         q3,         q8
11791037db265ecdd914a26e056cf69207b4f50924ehkuang
11891037db265ecdd914a26e056cf69207b4f50924ehkuangDIFF_SAVE_8x8
11991037db265ecdd914a26e056cf69207b4f50924ehkuang    vst1.8              {d0},       [r3],       r2
12091037db265ecdd914a26e056cf69207b4f50924ehkuang    vst1.8              {d1},       [r3],       r2
12191037db265ecdd914a26e056cf69207b4f50924ehkuang    vst1.8              {d2},       [r3],       r2
12291037db265ecdd914a26e056cf69207b4f50924ehkuang    vst1.8              {d3},       [r3],       r2
12391037db265ecdd914a26e056cf69207b4f50924ehkuang    vst1.8              {d4},       [r3],       r2
12491037db265ecdd914a26e056cf69207b4f50924ehkuang    vst1.8              {d5},       [r3],       r2
12591037db265ecdd914a26e056cf69207b4f50924ehkuang    vst1.8              {d6},       [r3],       r2
12691037db265ecdd914a26e056cf69207b4f50924ehkuang    vst1.8              {d7},       [r3],       r2
12791037db265ecdd914a26e056cf69207b4f50924ehkuang
12891037db265ecdd914a26e056cf69207b4f50924ehkuang    bx                  lr
12991037db265ecdd914a26e056cf69207b4f50924ehkuang    ENDP
13091037db265ecdd914a26e056cf69207b4f50924ehkuang
13191037db265ecdd914a26e056cf69207b4f50924ehkuang;void vp9_add_constant_residual_16x16_c(const int16_t diff, uint8_t *dest,
13291037db265ecdd914a26e056cf69207b4f50924ehkuang;                                       int stride) {
13391037db265ecdd914a26e056cf69207b4f50924ehkuang;  add_constant_residual(diff, dest, stride, 16, 16);
13491037db265ecdd914a26e056cf69207b4f50924ehkuang;}
13591037db265ecdd914a26e056cf69207b4f50924ehkuang;       r0      : const int16_t diff
13691037db265ecdd914a26e056cf69207b4f50924ehkuang;       r1      : const uint8_t *dest
13791037db265ecdd914a26e056cf69207b4f50924ehkuang;       r2      : int stride
13891037db265ecdd914a26e056cf69207b4f50924ehkuang;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
13991037db265ecdd914a26e056cf69207b4f50924ehkuang|vp9_add_constant_residual_16x16_neon| PROC
14091037db265ecdd914a26e056cf69207b4f50924ehkuang    mov                 r3,         r1
14191037db265ecdd914a26e056cf69207b4f50924ehkuang    LD_16x8             r1,         r2
14291037db265ecdd914a26e056cf69207b4f50924ehkuang    cmp                 r0,         #0
14391037db265ecdd914a26e056cf69207b4f50924ehkuang    bge                 DIFF_POSITIVE_16x16
14491037db265ecdd914a26e056cf69207b4f50924ehkuang
14591037db265ecdd914a26e056cf69207b4f50924ehkuang|DIFF_NEGATIVE_16x16|
14691037db265ecdd914a26e056cf69207b4f50924ehkuang    neg                 r0,         r0
14791037db265ecdd914a26e056cf69207b4f50924ehkuang    usat                r0,         #8,         r0
14891037db265ecdd914a26e056cf69207b4f50924ehkuang    vdup.u8             q0,         r0
14991037db265ecdd914a26e056cf69207b4f50924ehkuang
15091037db265ecdd914a26e056cf69207b4f50924ehkuang    SUB_DIFF_16x8       q0
15191037db265ecdd914a26e056cf69207b4f50924ehkuang    ST_16x8             r3,         r2
15291037db265ecdd914a26e056cf69207b4f50924ehkuang    LD_16x8             r1,         r2
15391037db265ecdd914a26e056cf69207b4f50924ehkuang    SUB_DIFF_16x8       q0
15491037db265ecdd914a26e056cf69207b4f50924ehkuang    b                   DIFF_SAVE_16x16
15591037db265ecdd914a26e056cf69207b4f50924ehkuang
15691037db265ecdd914a26e056cf69207b4f50924ehkuang|DIFF_POSITIVE_16x16|
15791037db265ecdd914a26e056cf69207b4f50924ehkuang    usat                r0,         #8,         r0
15891037db265ecdd914a26e056cf69207b4f50924ehkuang    vdup.u8             q0,         r0
15991037db265ecdd914a26e056cf69207b4f50924ehkuang
16091037db265ecdd914a26e056cf69207b4f50924ehkuang    ADD_DIFF_16x8       q0
16191037db265ecdd914a26e056cf69207b4f50924ehkuang    ST_16x8             r3,         r2
16291037db265ecdd914a26e056cf69207b4f50924ehkuang    LD_16x8             r1,         r2
16391037db265ecdd914a26e056cf69207b4f50924ehkuang    ADD_DIFF_16x8       q0
16491037db265ecdd914a26e056cf69207b4f50924ehkuang
16591037db265ecdd914a26e056cf69207b4f50924ehkuang|DIFF_SAVE_16x16|
16691037db265ecdd914a26e056cf69207b4f50924ehkuang    ST_16x8             r3,         r2
16791037db265ecdd914a26e056cf69207b4f50924ehkuang    bx                  lr
16891037db265ecdd914a26e056cf69207b4f50924ehkuang    ENDP
16991037db265ecdd914a26e056cf69207b4f50924ehkuang
17091037db265ecdd914a26e056cf69207b4f50924ehkuang;void vp9_add_constant_residual_32x32_c(const int16_t diff, uint8_t *dest,
17191037db265ecdd914a26e056cf69207b4f50924ehkuang;                                       int stride) {
17291037db265ecdd914a26e056cf69207b4f50924ehkuang;  add_constant_residual(diff, dest, stride, 32, 32);
17391037db265ecdd914a26e056cf69207b4f50924ehkuang;}
17491037db265ecdd914a26e056cf69207b4f50924ehkuang;       r0      : const int16_t diff
17591037db265ecdd914a26e056cf69207b4f50924ehkuang;       r1      : const uint8_t *dest
17691037db265ecdd914a26e056cf69207b4f50924ehkuang;       r2      : int stride
17791037db265ecdd914a26e056cf69207b4f50924ehkuang;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
17891037db265ecdd914a26e056cf69207b4f50924ehkuang|vp9_add_constant_residual_32x32_neon| PROC
17991037db265ecdd914a26e056cf69207b4f50924ehkuang    push                {r4,lr}
18091037db265ecdd914a26e056cf69207b4f50924ehkuang    pld                 [r1]
18191037db265ecdd914a26e056cf69207b4f50924ehkuang    mov                 r3,         r1
18291037db265ecdd914a26e056cf69207b4f50924ehkuang    add                 r4,         r1,         #16         ; r4 dest + 16 for second loop
18391037db265ecdd914a26e056cf69207b4f50924ehkuang    cmp                 r0,         #0
18491037db265ecdd914a26e056cf69207b4f50924ehkuang    bge                 DIFF_POSITIVE_32x32
18591037db265ecdd914a26e056cf69207b4f50924ehkuang
18691037db265ecdd914a26e056cf69207b4f50924ehkuang|DIFF_NEGATIVE_32x32|
18791037db265ecdd914a26e056cf69207b4f50924ehkuang    neg                 r0,         r0
18891037db265ecdd914a26e056cf69207b4f50924ehkuang    usat                r0,         #8,         r0
18991037db265ecdd914a26e056cf69207b4f50924ehkuang    vdup.u8             q0,         r0
19091037db265ecdd914a26e056cf69207b4f50924ehkuang    mov                 r0,         #4
19191037db265ecdd914a26e056cf69207b4f50924ehkuang
19291037db265ecdd914a26e056cf69207b4f50924ehkuang|DIFF_NEGATIVE_32x32_LOOP|
19391037db265ecdd914a26e056cf69207b4f50924ehkuang    sub                 r0,         #1
19491037db265ecdd914a26e056cf69207b4f50924ehkuang    LD_16x8             r1,         r2
19591037db265ecdd914a26e056cf69207b4f50924ehkuang    SUB_DIFF_16x8       q0
19691037db265ecdd914a26e056cf69207b4f50924ehkuang    ST_16x8             r3,         r2
19791037db265ecdd914a26e056cf69207b4f50924ehkuang
19891037db265ecdd914a26e056cf69207b4f50924ehkuang    LD_16x8             r1,         r2
19991037db265ecdd914a26e056cf69207b4f50924ehkuang    SUB_DIFF_16x8       q0
20091037db265ecdd914a26e056cf69207b4f50924ehkuang    ST_16x8             r3,         r2
20191037db265ecdd914a26e056cf69207b4f50924ehkuang    cmp                 r0,         #2
20291037db265ecdd914a26e056cf69207b4f50924ehkuang    moveq               r1,         r4
20391037db265ecdd914a26e056cf69207b4f50924ehkuang    moveq               r3,         r4
20491037db265ecdd914a26e056cf69207b4f50924ehkuang    cmp                 r0,         #0
20591037db265ecdd914a26e056cf69207b4f50924ehkuang    bne                 DIFF_NEGATIVE_32x32_LOOP
20691037db265ecdd914a26e056cf69207b4f50924ehkuang    pop                 {r4,pc}
20791037db265ecdd914a26e056cf69207b4f50924ehkuang
20891037db265ecdd914a26e056cf69207b4f50924ehkuang|DIFF_POSITIVE_32x32|
20991037db265ecdd914a26e056cf69207b4f50924ehkuang    usat                r0,         #8,         r0
21091037db265ecdd914a26e056cf69207b4f50924ehkuang    vdup.u8             q0,         r0
21191037db265ecdd914a26e056cf69207b4f50924ehkuang    mov                 r0,         #4
21291037db265ecdd914a26e056cf69207b4f50924ehkuang
21391037db265ecdd914a26e056cf69207b4f50924ehkuang|DIFF_POSITIVE_32x32_LOOP|
21491037db265ecdd914a26e056cf69207b4f50924ehkuang    sub                 r0,         #1
21591037db265ecdd914a26e056cf69207b4f50924ehkuang    LD_16x8             r1,         r2
21691037db265ecdd914a26e056cf69207b4f50924ehkuang    ADD_DIFF_16x8       q0
21791037db265ecdd914a26e056cf69207b4f50924ehkuang    ST_16x8             r3,         r2
21891037db265ecdd914a26e056cf69207b4f50924ehkuang
21991037db265ecdd914a26e056cf69207b4f50924ehkuang    LD_16x8             r1,         r2
22091037db265ecdd914a26e056cf69207b4f50924ehkuang    ADD_DIFF_16x8       q0
22191037db265ecdd914a26e056cf69207b4f50924ehkuang    ST_16x8             r3,         r2
22291037db265ecdd914a26e056cf69207b4f50924ehkuang    cmp                 r0,         #2
22391037db265ecdd914a26e056cf69207b4f50924ehkuang    moveq               r1,         r4
22491037db265ecdd914a26e056cf69207b4f50924ehkuang    moveq               r3,         r4
22591037db265ecdd914a26e056cf69207b4f50924ehkuang    cmp                 r0,         #0
22691037db265ecdd914a26e056cf69207b4f50924ehkuang    bne                 DIFF_POSITIVE_32x32_LOOP
22791037db265ecdd914a26e056cf69207b4f50924ehkuang    pop                 {r4,pc}
22891037db265ecdd914a26e056cf69207b4f50924ehkuang    ENDP
22991037db265ecdd914a26e056cf69207b4f50924ehkuang
23091037db265ecdd914a26e056cf69207b4f50924ehkuang    END
231