summaryrefslogtreecommitdiffstats
path: root/common/arm/ih264_inter_pred_luma_horz_hpel_vert_qpel_a9q.s
diff options
context:
space:
mode:
authorHamsalekha S <hamsalekha.s@ittiam.com>2015-03-13 21:24:58 +0530
committerHamsalekha S <hamsalekha.s@ittiam.com>2015-04-02 15:59:02 +0530
commit8d3d303c7942ced6a987a52db8977d768dc3605f (patch)
treecc806c96794356996b13ba9970941d0aed74a97e /common/arm/ih264_inter_pred_luma_horz_hpel_vert_qpel_a9q.s
parent3956d913d37327dcb340f836e604b04bd478b158 (diff)
downloadandroid_external_libavc-8d3d303c7942ced6a987a52db8977d768dc3605f.tar.gz
android_external_libavc-8d3d303c7942ced6a987a52db8977d768dc3605f.tar.bz2
android_external_libavc-8d3d303c7942ced6a987a52db8977d768dc3605f.zip
Initial version
Change-Id: I7efe9a589cd24edf86e8d086b40c27cbbf8b4017
Diffstat (limited to 'common/arm/ih264_inter_pred_luma_horz_hpel_vert_qpel_a9q.s')
-rwxr-xr-xcommon/arm/ih264_inter_pred_luma_horz_hpel_vert_qpel_a9q.s1044
1 files changed, 1044 insertions, 0 deletions
diff --git a/common/arm/ih264_inter_pred_luma_horz_hpel_vert_qpel_a9q.s b/common/arm/ih264_inter_pred_luma_horz_hpel_vert_qpel_a9q.s
new file mode 100755
index 0000000..65a6de7
--- /dev/null
+++ b/common/arm/ih264_inter_pred_luma_horz_hpel_vert_qpel_a9q.s
@@ -0,0 +1,1044 @@
+@/******************************************************************************
+@ *
+@ * Copyright (C) 2015 The Android Open Source Project
+@ *
+@ * Licensed under the Apache License, Version 2.0 (the "License");
+@ * you may not use this file except in compliance with the License.
+@ * You may obtain a copy of the License at:
+@ *
+@ * http://www.apache.org/licenses/LICENSE-2.0
+@ *
+@ * Unless required by applicable law or agreed to in writing, software
+@ * distributed under the License is distributed on an "AS IS" BASIS,
+@ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+@ * See the License for the specific language governing permissions and
+@ * limitations under the License.
+@ *
+@ *****************************************************************************
+@ * Originally developed and contributed by Ittiam Systems Pvt. Ltd, Bangalore
+@*/
+@/**
+@******************************************************************************
+@* @file
+@* ih264_inter_pred_luma_horz_hpel_vert_qpel_a9q.s
+@*
+@* @brief
+@* Contains function definitions for inter prediction interpolation.
+@*
+@* @author
+@* Mohit
+@*
+@* @par List of Functions:
+@*
+@* - ih264_inter_pred_luma_horz_hpel_vert_qpel_a9q()
+@*
+@* @remarks
+@* None
+@*
+@*******************************************************************************
+@*/
+
+@/* All the functions here are replicated from ih264_inter_pred_filters.c
+@
+
+@/**
+@/**
+@/**
+@*******************************************************************************
+@*
+@* @brief
+@* This function implements a two stage cascaded six tap filter. It
+@* applies the six tap filter in the horizontal direction on the
+@* predictor values, followed by applying the same filter in the
+@* vertical direction on the output of the first stage. It then averages
+@* the output of the 1st stage and the output of the 2nd stage to obtain
+@* the quarter pel values. The six tap filtering operation is described
+@* in sec 8.4.2.2.1 titled "Luma sample interpolation process".
+@*
+@* @par Description:
+@* This function is called to obtain pixels lying at the following
+@* location (1/2,1/4) or (1/2,3/4). The function interpolates
+@* the predictors first in the horizontal direction and then in the
+@* vertical direction to output the (1/2,1/2). It then averages
+@* the output of the 2nd stage and (1/2,1/2) value to obtain (1/2,1/4)
+@* or (1/2,3/4) depending on the offset.
+@*
+@* @param[in] pu1_src
+@* UWORD8 pointer to the source
+@*
+@* @param[out] pu1_dst
+@* UWORD8 pointer to the destination
+@*
+@* @param[in] src_strd
+@* integer source stride
+@*
+@* @param[in] dst_strd
+@* integer destination stride
+@*
+@* @param[in] ht
+@* integer height of the array
+@*
+@* @param[in] wd
+@* integer width of the array
+@*
+@* @param[in] pu1_tmp: temporary buffer
+@*
+@* @param[in] dydx: x and y reference offset for qpel calculations
+@*
+@* @returns
+@*
+@* @remarks
+@* None
+@*
+@*******************************************************************************
+@*/;
+
+@void ih264_inter_pred_luma_horz_hpel_vert_qpel(UWORD8 *pu1_src,
+@ UWORD8 *pu1_dst,
+@ WORD32 src_strd,,
+@ WORD32 dst_strd,
+@ WORD32 ht,
+@ WORD32 wd,
+@ UWORD8* pu1_tmp,
+@ UWORD32 dydx)
+
+@**************Variables Vs Registers*****************************************
+@ r0 => *pu1_src
+@ r1 => *pu1_dst
+@ r2 => src_strd
+@ r3 => dst_strd
+@ r4 => ht
+@ r5 => wd
+@ r7 => dydx
+@ r9 => *pu1_tmp
+
+.text
+.p2align 2
+
+ .global ih264_inter_pred_luma_horz_hpel_vert_qpel_a9q
+
+ih264_inter_pred_luma_horz_hpel_vert_qpel_a9q:
+
+ stmfd sp!, {r4-r12, r14} @ store register values to stack
+ vstmdb sp!, {d8-d15} @push neon registers to stack
+ ldr r4, [sp, #104] @ loads ht
+ sub r0, r0, r2, lsl #1 @ pu1_src-2*src_strd
+ sub r0, r0, #2 @ pu1_src-2
+ ldr r5, [sp, #108] @ loads wd
+ ldr r7, [sp, #116] @ loads dydx
+ lsr r7, r7, #3 @ dydx >> 2 followed by dydx & 0x3 and dydx>>1 to obtain the deciding bit
+ ldr r9, [sp, #112] @ pu1_tmp
+ add r7, r7, #2
+ mov r6, #48
+ mla r7, r7, r6, r9
+
+ subs r12, r5, #4 @if wd=4 branch to loop_4
+ beq loop_4_start
+
+ subs r12, r5, #8 @if wd=8 branch to loop_8
+ beq loop_8_start
+
+ @when wd=16
+ vmov.u16 q11, #20 @ Filter coeff 0x14 into Q11
+ vmov.u16 q12, #5 @ Filter coeff 0x5 into Q12
+ add r8, r0, #8
+ add r14, r1, #8
+ add r10, r9, #8
+ mov r12, r4
+ add r11, r7, #8
+
+loop_16_lowhalf_start:
+ vld1.32 {q0}, [r0], r2 @ row -2 load for horizontal filter
+ vext.8 d5, d0, d1, #5
+ vaddl.u8 q3, d0, d5
+
+ vext.8 d2, d0, d1, #2
+ vext.8 d3, d0, d1, #3
+ vaddl.u8 q4, d2, d3
+ vext.8 d4, d0, d1, #4
+ vmla.u16 q3, q4, q11
+ vext.8 d1, d0, d1, #1
+ vaddl.u8 q4, d1, d4
+ vld1.32 {q0}, [r0], r2 @ row -1 load for horizontal filter
+ vmls.u16 q3, q4, q12
+ vext.8 d5, d0, d1, #5
+ vaddl.u8 q4, d0, d5
+ vext.8 d2, d0, d1, #2
+ vext.8 d3, d0, d1, #3
+ vaddl.u8 q5, d2, d3
+
+ vst1.32 {q3}, [r9], r6 @ store temp buffer 0
+
+ vext.8 d4, d0, d1, #4
+ vmla.u16 q4, q5, q11
+ vext.8 d1, d0, d1, #1
+ vaddl.u8 q5, d1, d4
+ vld1.32 {q0}, [r0], r2 @ row 0 load for horizontal filter
+ vmls.u16 q4, q5, q12
+ vext.8 d5, d0, d1, #5
+ vaddl.u8 q5, d0, d5
+ vext.8 d2, d0, d1, #2
+ vext.8 d3, d0, d1, #3
+ vaddl.u8 q6, d2, d3
+
+ vst1.32 {q4}, [r9], r6 @ store temp buffer 1
+
+ vext.8 d4, d0, d1, #4
+ vmla.u16 q5, q6, q11
+ vext.8 d1, d0, d1, #1
+ vaddl.u8 q6, d1, d4
+ vld1.32 {q0}, [r0], r2 @ row 1 load for horizontal filter
+ vmls.u16 q5, q6, q12
+ vext.8 d5, d0, d1, #5
+ vaddl.u8 q6, d0, d5
+ vext.8 d2, d0, d1, #2
+ vext.8 d3, d0, d1, #3
+ vaddl.u8 q7, d2, d3
+
+ vst1.32 {q5}, [r9], r6 @ store temp buffer 2
+
+ vext.8 d4, d0, d1, #4
+ vmla.u16 q6, q7, q11
+ vext.8 d1, d0, d1, #1
+ vaddl.u8 q7, d1, d4
+ vld1.32 {q0}, [r0], r2 @ row 2 load for horizontal filter
+ vmls.u16 q6, q7, q12
+ vext.8 d5, d0, d1, #5
+ vaddl.u8 q7, d0, d5
+ vext.8 d2, d0, d1, #2
+ vext.8 d3, d0, d1, #3
+ vaddl.u8 q8, d2, d3
+
+ vst1.32 {q6}, [r9], r6 @ store temp buffer 3
+
+ vext.8 d4, d0, d1, #4
+ vmla.u16 q7, q8, q11
+ vext.8 d1, d0, d1, #1
+ vaddl.u8 q8, d1, d4
+
+ vmls.u16 q7, q8, q12
+loop_16_lowhalf:
+
+ vld1.32 {q0}, [r0], r2 @ row 3 load for horizontal filter
+ vext.8 d5, d0, d1, #5
+ vext.8 d2, d0, d1, #2
+ vext.8 d3, d0, d1, #3
+ vaddl.u8 q8, d0, d5
+
+ vst1.32 {q7}, [r9], r6 @ store temp buffer 4
+ vaddl.u8 q9, d2, d3
+ vext.8 d4, d0, d1, #4
+ vmla.u16 q8, q9, q11
+ vext.8 d1, d0, d1, #1
+ vadd.s16 q14, q4, q7
+ vaddl.u8 q9, d1, d4
+ vadd.s16 q15, q5, q6
+ vmls.u16 q8, q9, q12
+ vld1.32 {q0}, [r0], r2 @ row 4 load for hoorizontal filter
+ vext.8 d5, d0, d1, #5
+ vext.8 d2, d0, d1, #2
+ vext.8 d3, d0, d1, #3
+ vaddl.u8 q10, d0, d5
+
+ vst1.32 {q8}, [r9], r6 @ store temp buffer r5
+
+ vaddl.s16 q9, d6, d16
+
+ vld1.32 {q13}, [r7], r6 @ load from temp buffer 0
+
+ vaddl.s16 q3, d7, d17
+
+ vqrshrun.s16 d26, q13, #5
+
+ vmlal.s16 q9, d30, d22
+ vmlsl.s16 q9, d28, d24
+ vmlal.s16 q3, d31, d22
+ vmlsl.s16 q3, d29, d24
+ vaddl.u8 q1, d2, d3
+ vext.8 d4, d0, d1, #4
+ vmla.u16 q10, q1, q11
+ vqrshrun.s32 d18, q9, #10
+ vext.8 d1, d0, d1, #1
+ vqrshrun.s32 d19, q3, #10
+ vadd.s16 q14, q5, q8
+ vaddl.u8 q1, d1, d4
+ vadd.s16 q15, q6, q7
+ vmls.u16 q10, q1, q12
+ vqmovn.u16 d18, q9
+ vld1.32 {q0}, [r0], r2 @ row 5 load for horizontal filter
+
+ vrhadd.u8 d26, d18, d26
+
+ vext.8 d5, d0, d1, #5
+ vext.8 d2, d0, d1, #2
+
+ vst1.32 {q10}, [r9], r6 @ store temp buffer r6
+
+ vaddl.s16 q9, d8, d20
+
+ vaddl.s16 q3, d9, d21
+
+ vld1.32 {q4}, [r7], r6 @load from temp buffer 1
+
+
+ vst1.32 d26, [r1], r3 @ store row 0
+
+ vmlal.s16 q9, d30, d22
+ vmlsl.s16 q9, d28, d24
+
+ vqrshrun.s16 d28, q4, #5
+
+ vmlal.s16 q3, d31, d22
+ vmlsl.s16 q3, d29, d24
+ vext.8 d3, d0, d1, #3
+ vaddl.u8 q4, d0, d5
+ vaddl.u8 q1, d2, d3
+ vqrshrun.s32 d18, q9, #10
+ vext.8 d4, d0, d1, #4
+ vqrshrun.s32 d19, q3, #10
+ vmla.u16 q4, q1, q11
+ vext.8 d1, d0, d1, #1
+ vadd.s16 q13, q6, q10
+ vaddl.u8 q1, d1, d4
+ vqmovn.u16 d18, q9
+ vadd.s16 q15, q7, q8
+ vmls.u16 q4, q1, q12
+ vld1.32 {q0}, [r0], r2 @ row 6 load for horizontal filter
+
+ vrhadd.u8 d28, d28, d18
+
+ vext.8 d5, d0, d1, #5
+ vext.8 d2, d0, d1, #2
+ vext.8 d3, d0, d1, #3
+
+ vst1.32 d28, [r1], r3 @ store row 1
+
+ vaddl.u8 q14, d0, d5
+
+ vst1.32 {q4}, [r9], r6 @ store temp buffer r7
+
+ vaddl.s16 q9, d10, d8
+ vaddl.s16 q3, d11, d9
+
+ vld1.32 {q5}, [r7], r6 @ load from temp buffer 2
+
+ vmlal.s16 q9, d30, d22
+ vmlsl.s16 q9, d26, d24
+ vmlal.s16 q3, d31, d22
+
+ vqrshrun.s16 d26, q5, #5
+
+ vmlsl.s16 q3, d27, d24
+ vaddl.u8 q1, d2, d3
+ vext.8 d4, d0, d1, #4
+ vmla.u16 q14, q1, q11
+ vqrshrun.s32 d18, q9, #10
+ vext.8 d1, d0, d1, #1
+ vqrshrun.s32 d19, q3, #10
+ vadd.s16 q5, q7, q4
+ vaddl.u8 q1, d1, d4
+ vadd.s16 q15, q8, q10
+ vmls.u16 q14, q1, q12
+ vqmovn.u16 d27, q9
+
+ vaddl.s16 q9, d12, d28
+ vaddl.s16 q3, d13, d29
+
+ vrhadd.u8 d26, d26, d27
+
+ vmlal.s16 q9, d30, d22
+ vmlsl.s16 q9, d10, d24
+ vmlal.s16 q3, d31, d22
+ vmlsl.s16 q3, d11, d24
+
+ vst1.32 d26, [r1], r3 @ store row 2
+
+ vst1.32 {q14}, [r9]
+
+
+ vqrshrun.s32 d18, q9, #10
+ vmov q5, q10
+ vld1.32 {q15}, [r7], r6 @ load from temp buffer 3
+
+ vqrshrun.s32 d19, q3, #10
+ subs r4, r4, #4
+
+ vqrshrun.s16 d30, q15, #5
+
+ vqmovn.u16 d18, q9
+ vmov q6, q4
+ vmov q3, q7
+ vrhadd.u8 d30, d18, d30
+ vmov q4, q8
+ vmov q7, q14
+ vst1.32 d30, [r1], r3 @ store row 3
+
+ bgt loop_16_lowhalf @ looping if height =16
+
+
+loop_16_highhalf_start:
+ vld1.32 {q0}, [r8], r2
+ vext.8 d5, d0, d1, #5
+ vaddl.u8 q3, d0, d5
+ vext.8 d2, d0, d1, #2
+ vext.8 d3, d0, d1, #3
+ vaddl.u8 q4, d2, d3
+ vext.8 d4, d0, d1, #4
+ vmla.u16 q3, q4, q11
+ vext.8 d1, d0, d1, #1
+ vaddl.u8 q4, d1, d4
+ vld1.32 {q0}, [r8], r2
+ vmls.u16 q3, q4, q12
+ vext.8 d5, d0, d1, #5
+ vaddl.u8 q4, d0, d5
+ vext.8 d2, d0, d1, #2
+ vext.8 d3, d0, d1, #3
+ vaddl.u8 q5, d2, d3
+
+ vst1.32 {q3}, [r10], r6
+
+ vext.8 d4, d0, d1, #4
+ vmla.u16 q4, q5, q11
+ vext.8 d1, d0, d1, #1
+ vaddl.u8 q5, d1, d4
+ vld1.32 {q0}, [r8], r2
+ vmls.u16 q4, q5, q12
+ vext.8 d5, d0, d1, #5
+ vaddl.u8 q5, d0, d5
+ vext.8 d2, d0, d1, #2
+ vext.8 d3, d0, d1, #3
+ vaddl.u8 q6, d2, d3
+
+ vst1.32 {q4}, [r10], r6
+
+ vext.8 d4, d0, d1, #4
+ vmla.u16 q5, q6, q11
+ vext.8 d1, d0, d1, #1
+ vaddl.u8 q6, d1, d4
+ vld1.32 {q0}, [r8], r2
+ vmls.u16 q5, q6, q12
+ vext.8 d5, d0, d1, #5
+ vaddl.u8 q6, d0, d5
+ vext.8 d2, d0, d1, #2
+ vext.8 d3, d0, d1, #3
+ vaddl.u8 q7, d2, d3
+
+ vst1.32 {q5}, [r10], r6
+
+ vext.8 d4, d0, d1, #4
+ vmla.u16 q6, q7, q11
+ vext.8 d1, d0, d1, #1
+ vaddl.u8 q7, d1, d4
+ vld1.32 {q0}, [r8], r2
+ vmls.u16 q6, q7, q12
+ vext.8 d5, d0, d1, #5
+ vaddl.u8 q7, d0, d5
+ vext.8 d2, d0, d1, #2
+ vext.8 d3, d0, d1, #3
+ vaddl.u8 q8, d2, d3
+
+ vst1.32 {q6}, [r10], r6
+
+ vext.8 d4, d0, d1, #4
+ vmla.u16 q7, q8, q11
+ vext.8 d1, d0, d1, #1
+ vaddl.u8 q8, d1, d4
+
+ vmls.u16 q7, q8, q12
+
+loop_16_highhalf:
+
+ vld1.32 {q0}, [r8], r2
+ vext.8 d5, d0, d1, #5
+ vext.8 d2, d0, d1, #2
+ vext.8 d3, d0, d1, #3
+ vaddl.u8 q8, d0, d5
+
+ vst1.32 {q7}, [r10], r6
+
+ vaddl.u8 q9, d2, d3
+ vext.8 d4, d0, d1, #4
+ vmla.u16 q8, q9, q11
+ vext.8 d1, d0, d1, #1
+ vadd.s16 q14, q4, q7
+ vaddl.u8 q9, d1, d4
+ vadd.s16 q15, q5, q6
+ vmls.u16 q8, q9, q12
+ vld1.32 {q0}, [r8], r2
+ vext.8 d5, d0, d1, #5
+ vext.8 d2, d0, d1, #2
+ vext.8 d3, d0, d1, #3
+ vaddl.u8 q10, d0, d5
+
+ vst1.32 {q8}, [r10], r6
+
+ vaddl.s16 q9, d6, d16
+
+ vld1.32 {q13}, [r11], r6
+
+ vaddl.s16 q3, d7, d17
+
+ vqrshrun.s16 d26, q13, #5
+
+ vmlal.s16 q9, d30, d22
+ vmlsl.s16 q9, d28, d24
+ vmlal.s16 q3, d31, d22
+ vmlsl.s16 q3, d29, d24
+ vaddl.u8 q1, d2, d3
+ vext.8 d4, d0, d1, #4
+ vmla.u16 q10, q1, q11
+ vqrshrun.s32 d18, q9, #10
+ vext.8 d1, d0, d1, #1
+ vqrshrun.s32 d19, q3, #10
+ vadd.s16 q14, q5, q8
+ vaddl.u8 q1, d1, d4
+ vadd.s16 q15, q6, q7
+ vmls.u16 q10, q1, q12
+ vqmovn.u16 d18, q9
+ vld1.32 {q0}, [r8], r2
+
+ vrhadd.u8 d26, d18, d26
+
+ vext.8 d5, d0, d1, #5
+ vext.8 d2, d0, d1, #2
+
+ vst1.32 {q10}, [r10], r6
+
+ vaddl.s16 q9, d8, d20
+ vaddl.s16 q3, d9, d21
+
+ vld1.32 {q4}, [r11], r6
+
+
+ vst1.32 d26, [r14], r3 @store row 0
+
+ vmlal.s16 q9, d30, d22
+ vmlsl.s16 q9, d28, d24
+
+ vqrshrun.s16 d28, q4, #5
+
+ vmlal.s16 q3, d31, d22
+ vmlsl.s16 q3, d29, d24
+ vext.8 d3, d0, d1, #3
+ vaddl.u8 q4, d0, d5
+ vaddl.u8 q1, d2, d3
+ vqrshrun.s32 d18, q9, #10
+ vext.8 d4, d0, d1, #4
+ vqrshrun.s32 d19, q3, #10
+ vmla.u16 q4, q1, q11
+ vext.8 d1, d0, d1, #1
+ vadd.s16 q13, q6, q10
+ vaddl.u8 q1, d1, d4
+ vqmovn.u16 d18, q9
+ vadd.s16 q15, q7, q8
+ vmls.u16 q4, q1, q12
+ vld1.32 {q0}, [r8], r2
+
+ vrhadd.u8 d28, d28, d18
+
+ vext.8 d5, d0, d1, #5
+ vext.8 d2, d0, d1, #2
+ vext.8 d3, d0, d1, #3
+
+ vst1.32 d28, [r14], r3 @store row 1
+
+ vaddl.u8 q14, d0, d5
+
+ vst1.32 {q4}, [r10], r6
+
+ vaddl.s16 q9, d10, d8
+ vaddl.s16 q3, d11, d9
+
+ vld1.32 {q5}, [r11], r6
+
+ vmlal.s16 q9, d30, d22
+ vmlsl.s16 q9, d26, d24
+ vmlal.s16 q3, d31, d22
+
+ vqrshrun.s16 d26, q5, #5
+
+ vmlsl.s16 q3, d27, d24
+ vaddl.u8 q1, d2, d3
+ vext.8 d4, d0, d1, #4
+ vmla.u16 q14, q1, q11
+ vqrshrun.s32 d18, q9, #10
+ vext.8 d1, d0, d1, #1
+ vqrshrun.s32 d19, q3, #10
+ vadd.s16 q5, q7, q4
+ vaddl.u8 q1, d1, d4
+ vadd.s16 q15, q8, q10
+ vmls.u16 q14, q1, q12
+ vqmovn.u16 d27, q9
+
+
+ vaddl.s16 q9, d12, d28
+ vaddl.s16 q3, d13, d29
+
+ vrhadd.u8 d26, d26, d27
+
+ vmlal.s16 q9, d30, d22
+ vmlsl.s16 q9, d10, d24
+ vmlal.s16 q3, d31, d22
+ vmlsl.s16 q3, d11, d24
+
+ vst1.32 d26, [r14], r3 @ store row 2
+
+ vst1.32 {q14}, [r10]
+
+ vqrshrun.s32 d18, q9, #10
+ vmov q5, q10
+ vld1.32 {q15}, [r11], r6
+
+ vqrshrun.s32 d19, q3, #10
+ subs r12, r12, #4
+
+ vqrshrun.s16 d30, q15, #5
+
+ vqmovn.u16 d18, q9
+ vmov q6, q4
+ vmov q3, q7
+ vrhadd.u8 d30, d18, d30
+ vmov q4, q8
+ vmov q7, q14
+ vst1.32 d30, [r14], r3 @ store row 3
+
+ bgt loop_16_highhalf @ looping if height = 8 or 16
+ b end_func
+
+loop_8_start:
+
+ vmov.u16 q11, #20 @ Filter coeff 20 into Q11
+ vmov.u16 q12, #5 @ Filter coeff 5 into Q12
+ vld1.32 {q0}, [r0], r2 @ row -2 load for horizontal filter
+ vext.8 d5, d0, d1, #5
+ vaddl.u8 q3, d0, d5
+
+ vext.8 d2, d0, d1, #2
+ vext.8 d3, d0, d1, #3
+ vaddl.u8 q4, d2, d3
+ vext.8 d4, d0, d1, #4
+ vmla.u16 q3, q4, q11
+ vext.8 d1, d0, d1, #1
+ vaddl.u8 q4, d1, d4
+ vld1.32 {q0}, [r0], r2 @ row -1 load for horizontal filter
+ vmls.u16 q3, q4, q12
+ vext.8 d5, d0, d1, #5
+ vaddl.u8 q4, d0, d5
+ vext.8 d2, d0, d1, #2
+ vext.8 d3, d0, d1, #3
+ vaddl.u8 q5, d2, d3
+
+ vst1.32 {q3}, [r9], r6 @ store temp buffer 0
+
+ vext.8 d4, d0, d1, #4
+ vmla.u16 q4, q5, q11
+ vext.8 d1, d0, d1, #1
+ vaddl.u8 q5, d1, d4
+ vld1.32 {q0}, [r0], r2 @ row 0 load for horizontal filter
+ vmls.u16 q4, q5, q12
+ vext.8 d5, d0, d1, #5
+ vaddl.u8 q5, d0, d5
+ vext.8 d2, d0, d1, #2
+ vext.8 d3, d0, d1, #3
+ vaddl.u8 q6, d2, d3
+
+ vst1.32 {q4}, [r9], r6 @ store temp buffer 1
+
+ vext.8 d4, d0, d1, #4
+ vmla.u16 q5, q6, q11
+ vext.8 d1, d0, d1, #1
+ vaddl.u8 q6, d1, d4
+ vld1.32 {q0}, [r0], r2 @ row 1 load for horizontal filter
+ vmls.u16 q5, q6, q12
+ vext.8 d5, d0, d1, #5
+ vaddl.u8 q6, d0, d5
+ vext.8 d2, d0, d1, #2
+ vext.8 d3, d0, d1, #3
+ vaddl.u8 q7, d2, d3
+
+ vst1.32 {q5}, [r9], r6 @ store temp buffer 2
+
+ vext.8 d4, d0, d1, #4
+ vmla.u16 q6, q7, q11
+ vext.8 d1, d0, d1, #1
+ vaddl.u8 q7, d1, d4
+ vld1.32 {q0}, [r0], r2 @ row 2 load for horizontal filter
+ vmls.u16 q6, q7, q12
+ vext.8 d5, d0, d1, #5
+ vaddl.u8 q7, d0, d5
+ vext.8 d2, d0, d1, #2
+ vext.8 d3, d0, d1, #3
+ vaddl.u8 q8, d2, d3
+
+ vst1.32 {q6}, [r9], r6 @ store temp buffer 3
+
+ vext.8 d4, d0, d1, #4
+ vmla.u16 q7, q8, q11
+ vext.8 d1, d0, d1, #1
+ vaddl.u8 q8, d1, d4
+
+ vmls.u16 q7, q8, q12
+loop_8:
+
+ vld1.32 {q0}, [r0], r2 @ row 3 load for horizontal filter
+ vext.8 d5, d0, d1, #5
+ vext.8 d2, d0, d1, #2
+ vext.8 d3, d0, d1, #3
+ vaddl.u8 q8, d0, d5
+
+ vst1.32 {q7}, [r9], r6 @ store temp buffer 4
+
+ vaddl.u8 q9, d2, d3
+ vext.8 d4, d0, d1, #4
+ vmla.u16 q8, q9, q11
+ vext.8 d1, d0, d1, #1
+ vadd.s16 q14, q4, q7
+ vaddl.u8 q9, d1, d4
+ vadd.s16 q15, q5, q6
+ vmls.u16 q8, q9, q12
+ vld1.32 {q0}, [r0], r2 @ row 4 load for hoorizontal filter
+ vext.8 d5, d0, d1, #5
+ vext.8 d2, d0, d1, #2
+ vext.8 d3, d0, d1, #3
+ vaddl.u8 q10, d0, d5
+
+ vst1.32 {q8}, [r9], r6 @ store temp buffer r5
+
+ vaddl.s16 q9, d6, d16
+
+ vld1.32 {q13}, [r7], r6 @ load from temp buffer 0
+
+ vaddl.s16 q3, d7, d17
+
+ vqrshrun.s16 d26, q13, #5
+
+ vmlal.s16 q9, d30, d22
+ vmlsl.s16 q9, d28, d24
+ vmlal.s16 q3, d31, d22
+ vmlsl.s16 q3, d29, d24
+ vaddl.u8 q1, d2, d3
+ vext.8 d4, d0, d1, #4
+ vmla.u16 q10, q1, q11
+ vqrshrun.s32 d18, q9, #10
+ vext.8 d1, d0, d1, #1
+ vqrshrun.s32 d19, q3, #10
+ vadd.s16 q14, q5, q8
+ vaddl.u8 q1, d1, d4
+ vadd.s16 q15, q6, q7
+ vmls.u16 q10, q1, q12
+ vqmovn.u16 d18, q9
+ vld1.32 {q0}, [r0], r2 @ row 5 load for horizontal filter
+
+ vrhadd.u8 d26, d18, d26
+
+ vext.8 d5, d0, d1, #5
+ vext.8 d2, d0, d1, #2
+
+ vst1.32 {q10}, [r9], r6 @ store temp buffer r6
+
+ vaddl.s16 q9, d8, d20
+
+ vaddl.s16 q3, d9, d21
+
+ vld1.32 {q4}, [r7], r6 @load from temp buffer 1
+
+
+ vst1.32 d26, [r1], r3 @ store row 0
+
+ vmlal.s16 q9, d30, d22
+ vmlsl.s16 q9, d28, d24
+
+ vqrshrun.s16 d28, q4, #5
+
+ vmlal.s16 q3, d31, d22
+ vmlsl.s16 q3, d29, d24
+ vext.8 d3, d0, d1, #3
+ vaddl.u8 q4, d0, d5
+ vaddl.u8 q1, d2, d3
+ vqrshrun.s32 d18, q9, #10
+ vext.8 d4, d0, d1, #4
+ vqrshrun.s32 d19, q3, #10
+ vmla.u16 q4, q1, q11
+ vext.8 d1, d0, d1, #1
+ vadd.s16 q13, q6, q10
+ vaddl.u8 q1, d1, d4
+ vqmovn.u16 d18, q9
+ vadd.s16 q15, q7, q8
+ vmls.u16 q4, q1, q12
+ vld1.32 {q0}, [r0], r2 @ row 6 load for horizontal filter
+
+ vrhadd.u8 d28, d28, d18
+
+ vext.8 d5, d0, d1, #5
+ vext.8 d2, d0, d1, #2
+ vext.8 d3, d0, d1, #3
+
+ vst1.32 d28, [r1], r3 @ store row 1
+
+ vaddl.u8 q14, d0, d5
+
+ vst1.32 {q4}, [r9], r6 @ store temp buffer r7
+
+ vaddl.s16 q9, d10, d8
+ vaddl.s16 q3, d11, d9
+
+ vld1.32 {q5}, [r7], r6 @ load from temp buffer 2
+
+ vmlal.s16 q9, d30, d22
+ vmlsl.s16 q9, d26, d24
+ vmlal.s16 q3, d31, d22
+
+ vqrshrun.s16 d26, q5, #5
+
+ vmlsl.s16 q3, d27, d24
+ vaddl.u8 q1, d2, d3
+ vext.8 d4, d0, d1, #4
+ vmla.u16 q14, q1, q11
+ vqrshrun.s32 d18, q9, #10
+ vext.8 d1, d0, d1, #1
+ vqrshrun.s32 d19, q3, #10
+ vadd.s16 q5, q7, q4
+ vaddl.u8 q1, d1, d4
+ vadd.s16 q15, q8, q10
+ vmls.u16 q14, q1, q12
+ vqmovn.u16 d27, q9
+
+ vaddl.s16 q9, d12, d28
+ vaddl.s16 q3, d13, d29
+
+ vrhadd.u8 d26, d26, d27
+
+ vmlal.s16 q9, d30, d22
+ vmlsl.s16 q9, d10, d24
+ vmlal.s16 q3, d31, d22
+ vmlsl.s16 q3, d11, d24
+
+ vst1.32 d26, [r1], r3 @ store row 2
+
+ vst1.32 {q14}, [r9]
+
+
+ vqrshrun.s32 d18, q9, #10
+ vmov q5, q10
+ vld1.32 {q15}, [r7], r6 @ load from temp buffer 3
+
+ vqrshrun.s32 d19, q3, #10
+ subs r4, r4, #4
+
+ vqrshrun.s16 d30, q15, #5
+
+ vqmovn.u16 d18, q9
+ vmov q6, q4
+ vmov q3, q7
+ vrhadd.u8 d30, d18, d30
+ vmov q4, q8
+ vmov q7, q14
+ vst1.32 d30, [r1], r3 @ store row 3
+
+ bgt loop_8 @if height =8 or 16 loop
+ b end_func
+
+loop_4_start:
+ vmov.u16 d22, #20 @ Filter coeff 20 into D22
+ vmov.u16 d23, #5 @ Filter coeff 5 into D23
+
+ vld1.32 {q0}, [r0], r2 @row -2 load
+ vext.8 d5, d0, d1, #5
+ vaddl.u8 q3, d0, d5
+ vext.8 d2, d0, d1, #2
+ vext.8 d3, d0, d1, #3
+ vaddl.u8 q4, d2, d3
+ vext.8 d4, d0, d1, #4
+ vmla.u16 d6, d8, d22
+ vext.8 d1, d0, d1, #1
+ vaddl.u8 q4, d1, d4
+ vld1.32 {q0}, [r0], r2 @ row -1 load
+ vmls.u16 d6, d8, d23
+ vext.8 d5, d0, d1, #5
+ vaddl.u8 q4, d0, d5
+ vext.8 d2, d0, d1, #2
+ vext.8 d3, d0, d1, #3
+ vaddl.u8 q5, d2, d3
+
+ vst1.32 d6, [r9], r6 @ store temp buffer 0
+
+ vext.8 d4, d0, d1, #4
+ vmla.u16 d8, d10, d22
+ vext.8 d1, d0, d1, #1
+ vaddl.u8 q5, d1, d4
+ vld1.32 {q0}, [r0], r2 @ row 0 load
+ vmls.u16 d8, d10, d23
+ vext.8 d5, d0, d1, #5
+ vaddl.u8 q5, d0, d5
+ vext.8 d2, d0, d1, #2
+ vext.8 d3, d0, d1, #3
+ vaddl.u8 q6, d2, d3
+
+ vst1.32 d8, [r9], r6 @ store temp buffer 1
+
+ vext.8 d4, d0, d1, #4
+ vmla.u16 d10, d12, d22
+ vext.8 d1, d0, d1, #1
+ vaddl.u8 q6, d1, d4
+ vld1.32 {q0}, [r0], r2 @ row 1 load
+ vmls.u16 d10, d12, d23
+ vext.8 d5, d0, d1, #5
+ vaddl.u8 q6, d0, d5
+ vext.8 d2, d0, d1, #2
+ vext.8 d3, d0, d1, #3
+ vaddl.u8 q7, d2, d3
+
+ vst1.32 d10, [r9], r6 @ store temp buffer 2
+
+ vext.8 d4, d0, d1, #4
+ vmla.u16 d12, d14, d22
+ vext.8 d1, d0, d1, #1
+ vaddl.u8 q7, d1, d4
+ vld1.32 {q0}, [r0], r2 @ row 2 load
+ vmls.u16 d12, d14, d23
+ vext.8 d5, d0, d1, #5
+ vaddl.u8 q7, d0, d5
+ vext.8 d2, d0, d1, #2
+ vext.8 d3, d0, d1, #3
+ vaddl.u8 q8, d2, d3
+ vext.8 d4, d0, d1, #4
+ vmla.u16 d14, d16, d22
+ vext.8 d1, d0, d1, #1
+ vaddl.u8 q8, d1, d4
+
+ vst1.32 d12, [r9], r6 @ store temp buffer 3
+
+ vmls.u16 d14, d16, d23
+
+loop_4:
+
+ vld1.32 {q0}, [r0], r2 @ row 3 load
+ vext.8 d5, d0, d1, #5
+ vaddl.u8 q8, d0, d5
+ vext.8 d2, d0, d1, #2
+ vext.8 d3, d0, d1, #3
+ vaddl.u8 q9, d2, d3
+ vst1.32 d14, [r9], r6 @ store temp buffer 4
+ vext.8 d4, d0, d1, #4
+ vmla.u16 d16, d18, d22
+ vext.8 d1, d0, d1, #1
+ vaddl.u8 q9, d1, d4
+ vadd.s16 d2, d10, d12
+ vmls.u16 d16, d18, d23
+ vadd.s16 d3, d8, d14
+ vld1.32 {q9}, [r0], r2 @ row 4 load
+ vext.8 d25, d18, d19, #5
+ vaddl.u8 q13, d18, d25
+ vext.8 d20, d18, d19, #2
+
+ vst1.32 d16, [r9], r6 @ store temp buffer 5
+
+ vaddl.s16 q0, d6, d16
+ vmlal.s16 q0, d2, d22
+ vext.8 d21, d18, d19, #3
+ vaddl.u8 q14, d20, d21
+ vext.8 d24, d18, d19, #4
+ vmlsl.s16 q0, d3, d23
+ vmla.u16 d26, d28, d22
+ vext.8 d19, d18, d19, #1
+ vaddl.u8 q14, d19, d24
+ vadd.s16 d2, d12, d14
+ vmls.u16 d26, d28, d23
+ vqrshrun.s32 d0, q0, #0xa
+ vadd.s16 d3, d10, d16
+ vld1.32 {q9}, [r0], r2 @ row 5 load
+ vext.8 d25, d18, d19, #5
+ vqmovn.u16 d11, q0
+ vaddl.u8 q14, d18, d25
+
+ vst1.32 d26, [r9], r6 @ store temp buffer 6
+
+ @Q3 available here
+ vld1.32 d6, [r7], r6 @ load from temp buffer 0
+ vld1.32 d7, [r7], r6 @ load from temp buffer 1
+ vqrshrun.s16 d9, q3, #5
+
+ vext.8 d20, d18, d19, #2
+
+ vaddl.s16 q0, d8, d26
+ vmlal.s16 q0, d2, d22
+ vext.8 d21, d18, d19, #3
+ vaddl.u8 q3, d20, d21
+ vext.8 d24, d18, d19, #4
+ vmlsl.s16 q0, d3, d23
+ vmla.u16 d28, d6, d22
+ vext.8 d19, d18, d19, #1
+ vaddl.u8 q3, d19, d24
+ vadd.s16 d2, d14, d16
+ vmls.u16 d28, d6, d23
+ vqrshrun.s32 d0, q0, #0xa
+ vadd.s16 d3, d12, d26
+ vld1.32 {q9}, [r0], r2 @ row 6 load
+ vext.8 d25, d18, d19, #5
+ vqmovn.u16 d13, q0
+
+ vtrn.32 d11, d13
+ vaddl.s16 q0, d10, d28
+ vrhadd.u8 d9, d9, d11
+
+ vst1.32 d28, [r9], r6 @ store temp buffer 7
+
+ vmlal.s16 q0, d2, d22
+ vaddl.u8 q15, d18, d25
+
+ vst1.32 d9[0], [r1], r3 @ store row 0
+
+ vext.8 d20, d18, d19, #2
+
+ vst1.32 d9[1], [r1], r3 @ store row 1
+
+ vext.8 d21, d18, d19, #3
+ vmlsl.s16 q0, d3, d23
+ vaddl.u8 q4, d20, d21
+ vext.8 d24, d18, d19, #4
+ vmla.u16 d30, d8, d22
+ vext.8 d19, d18, d19, #1
+ vaddl.u8 q4, d19, d24
+ vqrshrun.s32 d0, q0, #0xa
+ vadd.s16 d2, d16, d26
+ vmls.u16 d30, d8, d23
+ vqmovn.u16 d4, q0
+
+ vadd.s16 d3, d14, d28
+
+
+ vaddl.s16 q0, d12, d30
+
+ vst1.32 d30, [r9]
+
+ vmlal.s16 q0, d2, d22
+
+ vld1.32 d8, [r7], r6 @ load from temp buffer 2
+ vld1.32 d9, [r7], r6 @ load from temp buffer 3
+ vmlsl.s16 q0, d3, d23
+ subs r4, r4, #4
+ vqrshrun.s16 d10, q4, #5
+
+ vmov d12, d28
+
+ vqrshrun.s32 d0, q0, #0xa
+ vmov d6, d14
+ vmov d8, d16
+
+ vqmovn.u16 d5, q0
+
+ vtrn.32 d4, d5
+ vrhadd.u8 d4, d4, d10
+ vmov d10, d26
+ vmov d14, d30
+
+ vst1.32 d4[0], [r1], r3 @ store row 2
+ vst1.32 d4[1], [r1], r3 @ store row 3
+
+ bgt loop_4
+
+end_func:
+ vldmia sp!, {d8-d15} @ Restore neon registers that were saved
+ ldmfd sp!, {r4-r12, pc} @Restoring registers from stack
+
+