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