You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
951 lines
55 KiB
951 lines
55 KiB
@/******************************************************************************
|
|
@ *
|
|
@ * 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
|
|
@ * ih264e_half_pel.s
|
|
@ *
|
|
@ * @brief
|
|
@ *
|
|
@ *
|
|
@ * @author
|
|
@ * Ittiam
|
|
@ *
|
|
@ * @par List of Functions:
|
|
@ * ih264e_sixtapfilter_horz
|
|
@ * ih264e_sixtap_filter_2dvh_vert
|
|
@
|
|
@ *
|
|
@ * @remarks
|
|
@ * None
|
|
@ *
|
|
@ *******************************************************************************
|
|
@ */
|
|
|
|
|
|
.text
|
|
.p2align 2
|
|
|
|
@/*******************************************************************************
|
|
@*
|
|
@* @brief
|
|
@* Interprediction luma filter for horizontal input(Filter run for width = 17 and height =16)
|
|
@*
|
|
@* @par Description:
|
|
@* Applies a 6 tap horizontal filter .The output is clipped to 8 bits
|
|
@* sec 8.4.2.2.1 titled "Luma sample interpolation process"
|
|
@*
|
|
@* @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
|
|
@*
|
|
@*
|
|
@* @returns
|
|
@*
|
|
@* @remarks
|
|
@* None
|
|
@*
|
|
@*******************************************************************************
|
|
@*/
|
|
@void ih264e_sixtapfilter_horz(UWORD8 *pu1_src,
|
|
@ UWORD8 *pu1_dst,
|
|
@ WORD32 src_strd,
|
|
@ WORD32 dst_strd);
|
|
|
|
|
|
.equ HALFPEL_WIDTH , 17 + 1 @( make it even, two rows are processed at a time)
|
|
|
|
|
|
.global ih264e_sixtapfilter_horz_a9q
|
|
ih264e_sixtapfilter_horz_a9q:
|
|
stmfd sp!, {lr}
|
|
|
|
vmov.i8 d0, #5
|
|
sub r0, r0, #2
|
|
|
|
vmov.i8 d1, #20
|
|
mov r14, #HALFPEL_WIDTH
|
|
vpush {d8-d15}
|
|
|
|
filter_horz_loop:
|
|
|
|
|
|
vld1.8 {d2, d3, d4}, [r0], r2 @// Load row0
|
|
vld1.8 {d5, d6, d7}, [r0], r2 @// Load row1
|
|
|
|
@// Processing row0 and row1
|
|
|
|
vext.8 d31, d2, d3, #5 @//extract a[5] (column1,row0)
|
|
vext.8 d30, d3, d4, #5 @//extract a[5] (column2,row0)
|
|
|
|
vaddl.u8 q4, d31, d2 @// a0 + a5 (column1,row0)
|
|
vext.8 d29, d4, d4, #5 @//extract a[5] (column3,row0)
|
|
vaddl.u8 q5, d30, d3 @// a0 + a5 (column2,row0)
|
|
vext.8 d28, d5, d6, #5 @//extract a[5] (column1,row1)
|
|
vaddl.u8 q6, d29, d4 @// a0 + a5 (column3,row0)
|
|
vext.8 d27, d6, d7, #5 @//extract a[5] (column2,row1)
|
|
vaddl.u8 q7, d28, d5 @// a0 + a5 (column1,row1)
|
|
vext.8 d26, d7, d7, #5 @//extract a[5] (column3,row1)
|
|
|
|
vaddl.u8 q8, d27, d6 @// a0 + a5 (column2,row1)
|
|
vext.8 d31, d2, d3, #2 @//extract a[2] (column1,row0)
|
|
vaddl.u8 q9, d26, d7 @// a0 + a5 (column3,row1)
|
|
vext.8 d30, d3, d4, #2 @//extract a[2] (column2,row0)
|
|
vmlal.u8 q4, d31, d1 @// a0 + a5 + 20a2 (column1,row0)
|
|
vext.8 d29, d4, d4, #2 @//extract a[2] (column3,row0)
|
|
vmlal.u8 q5, d30, d1 @// a0 + a5 + 20a2 (column2,row0)
|
|
vext.8 d28, d5, d6, #2 @//extract a[2] (column1,row1)
|
|
vmlal.u8 q6, d29, d1 @// a0 + a5 + 20a2 (column3,row0)
|
|
vext.8 d27, d6, d7, #2 @//extract a[2] (column2,row1)
|
|
vmlal.u8 q7, d28, d1 @// a0 + a5 + 20a2 (column1,row1)
|
|
vext.8 d26, d7, d7, #2 @//extract a[2] (column3,row1)
|
|
|
|
vmlal.u8 q8, d27, d1 @// a0 + a5 + 20a2 (column2,row1)
|
|
vext.8 d31, d2, d3, #3 @//extract a[3] (column1,row0)
|
|
vmlal.u8 q9, d26, d1 @// a0 + a5 + 20a2 (column3,row1)
|
|
vext.8 d30, d3, d4, #3 @//extract a[3] (column2,row0)
|
|
vmlal.u8 q4, d31, d1 @// a0 + a5 + 20a2 + 20a3 (column1,row0)
|
|
vext.8 d29, d4, d4, #3 @//extract a[3] (column3,row0)
|
|
vmlal.u8 q5, d30, d1 @// a0 + a5 + 20a2 + 20a3 (column2,row0)
|
|
vext.8 d28, d5, d6, #3 @//extract a[3] (column1,row1)
|
|
vmlal.u8 q6, d29, d1 @// a0 + a5 + 20a2 + 20a3 (column3,row0)
|
|
vext.8 d27, d6, d7, #3 @//extract a[3] (column2,row1)
|
|
vmlal.u8 q7, d28, d1 @// a0 + a5 + 20a2 + 20a3 (column1,row1)
|
|
vext.8 d26, d7, d7, #3 @//extract a[3] (column3,row1)
|
|
|
|
vmlal.u8 q8, d27, d1 @// a0 + a5 + 20a2 + 20a3 (column2,row1)
|
|
vext.8 d31, d2, d3, #1 @//extract a[1] (column1,row0)
|
|
vmlal.u8 q9, d26, d1 @// a0 + a5 + 20a2 + 20a3 (column3,row1)
|
|
vext.8 d30, d3, d4, #1 @//extract a[1] (column2,row0)
|
|
vmlsl.u8 q4, d31, d0 @// a0 + a5 + 20a2 + 20a3 - 5a1 (column1,row0)
|
|
vext.8 d29, d4, d4, #1 @//extract a[1] (column3,row0)
|
|
vmlsl.u8 q5, d30, d0 @// a0 + a5 + 20a2 + 20a3 - 5a1 (column2,row0)
|
|
vext.8 d28, d5, d6, #1 @//extract a[1] (column1,row1)
|
|
vmlsl.u8 q6, d29, d0 @// a0 + a5 + 20a2 + 20a3 - 5a1 (column3,row0)
|
|
vext.8 d27, d6, d7, #1 @//extract a[1] (column2,row1)
|
|
vmlsl.u8 q7, d28, d0 @// a0 + a5 + 20a2 + 20a3 - 5a1 (column1,row1)
|
|
vext.8 d26, d7, d7, #1 @//extract a[1] (column3,row1)
|
|
|
|
vmlsl.u8 q8, d27, d0 @// a0 + a5 + 20a2 + 20a3 - 5a1 (column2,row1)
|
|
vext.8 d31, d2, d3, #4 @//extract a[4] (column1,row0)
|
|
vmlsl.u8 q9, d26, d0 @// a0 + a5 + 20a2 + 20a3 - 5a1 (column3,row1)
|
|
vext.8 d30, d3, d4, #4 @//extract a[4] (column2,row0)
|
|
vmlsl.u8 q4, d31, d0 @// a0 + a5 + 20a2 + 20a3 - 5a1 - 5a4 (column1,row0)
|
|
vext.8 d29, d4, d4, #4 @//extract a[4] (column3,row0)
|
|
vmlsl.u8 q5, d30, d0 @// a0 + a5 + 20a2 + 20a3 - 5a1 - 5a4 (column2,row0)
|
|
vext.8 d28, d5, d6, #4 @//extract a[4] (column1,row1)
|
|
vmlsl.u8 q6, d29, d0 @// a0 + a5 + 20a2 + 20a3 - 5a1 - 5a4 (column3,row0)
|
|
vext.8 d27, d6, d7, #4 @//extract a[4] (column2,row1)
|
|
vmlsl.u8 q7, d28, d0 @// a0 + a5 + 20a2 + 20a3 - 5a1 - 5a4 (column1,row1)
|
|
vext.8 d26, d7, d7, #4 @//extract a[4] (column3,row1)
|
|
|
|
vmlsl.u8 q8, d27, d0 @// a0 + a5 + 20a2 + 20a3 - 5a1 - 5a4 (column2,row1)
|
|
vmlsl.u8 q9, d26, d0 @// a0 + a5 + 20a2 + 20a3 - 5a1 - 5a4 (column3,row1)
|
|
|
|
vqrshrun.s16 d20, q4, #5 @// (a0 + a5 + 20a2 + 20a3 - 5a1 - 5a4 + 16) >> 5 (column1,row0)
|
|
vqrshrun.s16 d21, q5, #5 @// (a0 + a5 + 20a2 + 20a3 - 5a1 - 5a4 + 16) >> 5 (column2,row0)
|
|
vqrshrun.s16 d22, q6, #5 @// (a0 + a5 + 20a2 + 20a3 - 5a1 - 5a4 + 16) >> 5 (column3,row0)
|
|
vqrshrun.s16 d23, q7, #5 @// (a0 + a5 + 20a2 + 20a3 - 5a1 - 5a4 + 16) >> 5 (column1,row1)
|
|
vqrshrun.s16 d24, q8, #5 @// (a0 + a5 + 20a2 + 20a3 - 5a1 - 5a4 + 16) >> 5 (column2,row1)
|
|
vqrshrun.s16 d25, q9, #5 @// (a0 + a5 + 20a2 + 20a3 - 5a1 - 5a4 + 16) >> 5 (column3,row1)
|
|
|
|
vst1.8 {d20, d21, d22}, [r1], r3 @//Store dest row0
|
|
vst1.8 {d23, d24, d25}, [r1], r3 @//Store dest row1
|
|
|
|
subs r14, r14, #2 @ decrement counter
|
|
|
|
bne filter_horz_loop
|
|
|
|
vpop {d8-d15}
|
|
ldmfd sp!, {pc}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
@/**
|
|
@*******************************************************************************
|
|
@*
|
|
@* @brief
|
|
@* This function implements a two stage cascaded six tap filter. It
|
|
@* applies the six tap filter in the vertical direction on the
|
|
@* predictor values, followed by applying the same filter in the
|
|
@* horizontal direction on the output of the first stage. The six tap
|
|
@* filtering operation is described in sec 8.4.2.2.1 titled "Luma sample
|
|
@* interpolation process"
|
|
@* (Filter run for width = 17 and height =17)
|
|
@* @par Description:
|
|
@* The function interpolates
|
|
@* the predictors first in the vertical direction and then in the
|
|
@* horizontal direction to output the (1/2,1/2). The output of the first
|
|
@* stage of the filter is stored in the buffer pointed to by pi16_pred1(only in C)
|
|
@* in 16 bit precision.
|
|
@*
|
|
@*
|
|
@* @param[in] pu1_src
|
|
@* UWORD8 pointer to the source
|
|
@*
|
|
@* @param[out] pu1_dst1
|
|
@* UWORD8 pointer to the destination(vertical filtered output)
|
|
@*
|
|
@* @param[out] pu1_dst2
|
|
@* UWORD8 pointer to the destination(out put after applying horizontal filter to the intermediate vertical output)
|
|
@*
|
|
@* @param[in] src_strd
|
|
@* integer source stride
|
|
@*
|
|
@* @param[in] dst_strd
|
|
@* integer destination stride of pu1_dst
|
|
@*
|
|
@* @param[in]pi16_pred1
|
|
@* Pointer to 16bit intermediate buffer(used only in c)
|
|
@*
|
|
@* @param[in] pi16_pred1_strd
|
|
@* integer destination stride of pi16_pred1
|
|
@*
|
|
@*
|
|
@* @returns
|
|
@*
|
|
@* @remarks
|
|
@* None
|
|
@*
|
|
@*******************************************************************************
|
|
@*/
|
|
@void ih264e_sixtap_filter_2dvh_vert(UWORD8 *pu1_src,
|
|
@ UWORD8 *pu1_dst1,
|
|
@ UWORD8 *pu1_dst2,
|
|
@ WORD32 src_strd,
|
|
@ WORD32 dst_strd,
|
|
@ WORD32 *pi16_pred1,/* Pointer to 16bit intermmediate buffer (used only in c)*/
|
|
@ WORD32 pi16_pred1_strd)
|
|
|
|
|
|
|
|
|
|
.global ih264e_sixtap_filter_2dvh_vert_a9q
|
|
|
|
ih264e_sixtap_filter_2dvh_vert_a9q:
|
|
stmfd sp!, {r10, r11, r12, lr}
|
|
|
|
@//r0 - pu1_ref
|
|
@//r3 - u4_ref_width
|
|
vpush {d8-d15}
|
|
@// Load six rows for vertical interpolation
|
|
lsl r12, r3, #1
|
|
sub r0, r0, r12
|
|
sub r0, r0, #2
|
|
vld1.8 {d2, d3, d4}, [r0], r3
|
|
vld1.8 {d5, d6, d7}, [r0], r3
|
|
vld1.8 {d8, d9, d10}, [r0], r3
|
|
mov r12, #5
|
|
vld1.8 {d11, d12, d13}, [r0], r3
|
|
mov r14, #20
|
|
vld1.8 {d14, d15, d16}, [r0], r3
|
|
vmov.16 d0[0], r12
|
|
vmov.16 d0[1], r14
|
|
vld1.8 {d17, d18, d19}, [r0], r3
|
|
vmov.i8 d1, #20
|
|
|
|
@// r12 - u2_buff1_width
|
|
@// r14 - u2_buff2_width
|
|
ldr r12, [sp, #80]
|
|
add r11, r1, #6
|
|
|
|
mov r14, r12
|
|
|
|
mov r10, #3 @loop counter
|
|
|
|
|
|
filter_2dvh_loop:
|
|
|
|
@// ////////////// ROW 1 ///////////////////////
|
|
|
|
@// Process first vertical interpolated row
|
|
@// each column is
|
|
vaddl.u8 q10, d2, d17 @// a0 + a5 (column1,row0)
|
|
vmov.i8 d31, #5
|
|
vmlal.u8 q10, d8, d1 @// a0 + a5 + 20a2 (column1,row0)
|
|
vmlal.u8 q10, d11, d1 @// a0 + a5 + 20a2 + 20a3 (column1,row0)
|
|
vmlsl.u8 q10, d5, d31 @// a0 + a5 + 20a2 + 20a3 - 5a1 (column1,row0)
|
|
vmlsl.u8 q10, d14, d31 @// a0 + a5 + 20a2 + 20a3 - 5a1 - 5a4 (column1,row0)
|
|
|
|
|
|
vaddl.u8 q11, d3, d18 @// a0 + a5 (column2,row0)
|
|
vmlal.u8 q11, d9, d1 @// a0 + a5 + 20a2 (column2,row0)
|
|
vmlal.u8 q11, d12, d1 @// a0 + a5 + 20a2 + 20a3 (column2,row0)
|
|
vmlsl.u8 q11, d6, d31 @// a0 + a5 + 20a2 + 20a3 - 5a1 (column2,row0)
|
|
vmlsl.u8 q11, d15, d31 @// a0 + a5 + 20a2 + 20a3 - 5a1 - 5a4 (column2,row0)
|
|
vext.16 d30, d20, d21, #2 @//extract a[2] (set1)
|
|
|
|
vaddl.u8 q12, d4, d19 @// a0 + a5 (column3,row0)
|
|
vext.16 d29, d20, d21, #3 @//extract a[3] (set1)
|
|
vmlal.u8 q12, d10, d1 @// a0 + a5 + 20a2 (column3,row0)
|
|
vmlal.u8 q12, d13, d1 @// a0 + a5 + 20a2 + 20a3 (column3,row0)
|
|
vmlsl.u8 q12, d7, d31 @// a0 + a5 + 20a2 + 20a3 - 5a1 (column3,row0)
|
|
vmlsl.u8 q12, d16, d31 @// a0 + a5 + 20a2 + 20a3 - 5a1 - 5a4 (column3,row0)
|
|
|
|
vqrshrun.s16 d2, q10, #5 @// (a0 + a5 + 20a2 + 20a3 - 5a1 - 5a4 + 16) >> 5 (column1,row0)
|
|
vext.16 d31, d21, d22, #1 @//extract a[5] (set1)
|
|
vqrshrun.s16 d3, q11, #5 @// (a0 + a5 + 20a2 + 20a3 - 5a1 - 5a4 + 16) >> 5 (column2,row0)
|
|
vext.16 d28, d20, d21, #1 @//extract a[1] (set1)
|
|
|
|
vaddl.s16 q13, d31, d20 @// a0 + a5 (set1)
|
|
vext.16 d31, d22, d23, #1 @//extract a[5] (set2)
|
|
vmlal.s16 q13, d30, d0[1] @// a0 + a5 + 20a2 (set1)
|
|
vmlal.s16 q13, d29, d0[1] @// a0 + a5 + 20a2 + 20a3 (set1)
|
|
vmlsl.s16 q13, d28, d0[0] @// a0 + a5 + 20a2 + 20a3 - 5a1 (set1)
|
|
vmlsl.s16 q13, d21, d0[0] @// a0 + a5 + 20a2 + 20a3 - 5a1 - 5a4 (set1)
|
|
vext.16 d30, d21, d22, #2 @//extract a[2] (set2)
|
|
|
|
vqrshrun.s16 d4, q12, #5 @// (a0 + a5 + 20a2 + 20a3 - 5a1 - 5a4 + 16) >> 5 (column3,row0)
|
|
vext.16 d29, d21, d22, #3 @//extract a[3] (set2)
|
|
|
|
vext.16 d28, d21, d22, #1 @//extract a[1] (set2)
|
|
vaddl.s16 q10, d31, d21 @// a0 + a5 (set2)
|
|
vmlal.s16 q10, d30, d0[1] @// a0 + a5 + 20a2 (set2)
|
|
vmlal.s16 q10, d29, d0[1] @// a0 + a5 + 20a2 + 20a3 (set2)
|
|
vmlsl.s16 q10, d28, d0[0] @// a0 + a5 + 20a2 + 20a3 - 5a1 (set2)
|
|
vmlsl.s16 q10, d22, d0[0] @// a0 + a5 + 20a2 + 20a3 - 5a1 - 5a4 (set2)
|
|
vext.16 d31, d23, d24, #1 @//extract a[5] (set3)
|
|
|
|
vext.8 d2, d2, d3, #2
|
|
vst1.8 {d3, d4}, [r11], r12 @// store row1 - 1,1/2 grid
|
|
vst1.8 {d2}, [r1], r12 @// store row1 - 1,1/2 grid
|
|
|
|
vext.16 d30, d22, d23, #2 @//extract a[2] (set3)
|
|
vext.16 d29, d22, d23, #3 @//extract a[3] (set3)
|
|
|
|
vaddl.s16 q1, d31, d22 @// a0 + a5 (set3)
|
|
vext.16 d28, d22, d23, #1 @//extract a[1] (set3)
|
|
vmlal.s16 q1, d30, d0[1] @// a0 + a5 + 20a2 (set3)
|
|
vmlal.s16 q1, d29, d0[1] @// a0 + a5 + 20a2 + 20a3 (set3)
|
|
vmlsl.s16 q1, d28, d0[0] @// a0 + a5 + 20a2 + 20a3 - 5a1 (set3)
|
|
vmlsl.s16 q1, d23, d0[0] @// a0 + a5 + 20a2 + 20a3 - 5a1 - 5a4 (set3)
|
|
vext.16 d31, d24, d25, #1 @//extract a[5] (set4)
|
|
|
|
vshrn.s32 d21, q10, #8 @// shift by 8 and later we will shift by 2 more with rounding (set2)
|
|
vext.16 d30, d23, d24, #2 @//extract a[2] (set4)
|
|
vshrn.s32 d20, q13, #8 @// shift by 8 and later we will shift by 2 more with rounding (set1)
|
|
vext.16 d29, d23, d24, #3 @//extract a[3] (set4)
|
|
|
|
vaddl.s16 q13, d31, d23 @// a0 + a5 (set4)
|
|
vext.16 d28, d23, d24, #1 @//extract a[1] (set4)
|
|
vext.16 d31, d25, d25, #1 @//extract a[5] (set5) ;//here only first element in the row is valid
|
|
vmlal.s16 q13, d30, d0[1] @// a0 + a5 + 20a2 (set4)
|
|
vmlal.s16 q13, d29, d0[1] @// a0 + a5 + 20a2 + 20a3 (set4)
|
|
vmlsl.s16 q13, d28, d0[0] @// a0 + a5 + 20a2 + 20a3 - 5a1 (set4)
|
|
vmlsl.s16 q13, d24, d0[0] @// a0 + a5 + 20a2 + 20a3 - 5a1 - 5a4 (set4)
|
|
vext.16 d30, d24, d25, #2 @//extract a[2] (set5)
|
|
|
|
vaddl.s16 q11, d31, d24 @// a0 + a5 (set5)
|
|
vext.16 d29, d24, d25, #3 @//extract a[3] (set5)
|
|
|
|
vext.16 d31, d24, d25, #1 @//extract a[1] (set5)
|
|
vshrn.s32 d28, q1, #8 @// shift by 8 and later we will shift by 2 more with rounding (set3)
|
|
|
|
vld1.8 {d2, d3, d4}, [r0], r3 @// Load next Row data
|
|
vmlal.s16 q11, d30, d0[1] @// a0 + a5 + 20a2 (set5)
|
|
vmlal.s16 q11, d29, d0[1] @// a0 + a5 + 20a2 + 20a3 (set5)
|
|
vmlsl.s16 q11, d31, d0[0] @// a0 + a5 + 20a2 + 20a3 - 5a1 (set5)
|
|
vmlsl.s16 q11, d25, d0[0] @// a0 + a5 + 20a2 + 20a3 - 5a1 - 5a4 (set5)
|
|
vshrn.s32 d29, q13, #8 @// shift by 8 and later we will shift by 2 more with rounding (set4)
|
|
vqrshrun.s16 d26, q10, #2 @// half,half gird set1,2
|
|
|
|
|
|
@//VQRSHRUN.s16 D27,Q14,#2 ;// half,half gird set3,4
|
|
@//VSHRN.s32 D28,Q11,#8 ;// shift by 8 and later we will shift by 2 more with rounding (set5)
|
|
|
|
@//VQRSHRUN.s16 D28,Q14,#2 ;// half,half gird set5
|
|
|
|
@//VST1.8 {D26,D27,D28},[r2],r14 ;// store 1/2,1,2 grif values
|
|
@// ////////////// ROW 2 ///////////////////////
|
|
|
|
@// Process first vertical interpolated row
|
|
@// each column is
|
|
vaddl.u8 q10, d5, d2 @// a0 + a5 (column1,row0)
|
|
vmov.i8 d31, #5
|
|
vmlal.u8 q10, d11, d1 @// a0 + a5 + 20a2 (column1,row0)
|
|
vmlal.u8 q10, d14, d1 @// a0 + a5 + 20a2 + 20a3 (column1,row0)
|
|
vmlsl.u8 q10, d8, d31 @// a0 + a5 + 20a2 + 20a3 - 5a1 (column1,row0)
|
|
vmlsl.u8 q10, d17, d31 @// a0 + a5 + 20a2 + 20a3 - 5a1 - 5a4 (column1,row0)
|
|
|
|
vqrshrun.s16 d27, q14, #2 @// half,half gird set3,4
|
|
vshrn.s32 d28, q11, #8 @// shift by 8 and later we will shift by 2 more with rounding (set5)
|
|
|
|
vaddl.u8 q11, d6, d3 @// a0 + a5 (column2,row0)
|
|
vmlal.u8 q11, d12, d1 @// a0 + a5 + 20a2 (column2,row0)
|
|
vmlal.u8 q11, d15, d1 @// a0 + a5 + 20a2 + 20a3 (column2,row0)
|
|
vmlsl.u8 q11, d9, d31 @// a0 + a5 + 20a2 + 20a3 - 5a1 (column2,row0)
|
|
vmlsl.u8 q11, d18, d31 @// a0 + a5 + 20a2 + 20a3 - 5a1 - 5a4 (column2,row0)
|
|
|
|
vqrshrun.s16 d28, q14, #2 @// half,half gird set5
|
|
vext.16 d30, d20, d21, #2 @//extract a[2] (set1)
|
|
|
|
vaddl.u8 q12, d7, d4 @// a0 + a5 (column3,row0)
|
|
vext.16 d29, d20, d21, #3 @//extract a[3] (set1)
|
|
vmlal.u8 q12, d13, d1 @// a0 + a5 + 20a2 (column3,row0)
|
|
vmlal.u8 q12, d16, d1 @// a0 + a5 + 20a2 + 20a3 (column3,row0)
|
|
vmlsl.u8 q12, d10, d31 @// a0 + a5 + 20a2 + 20a3 - 5a1 (column3,row0)
|
|
vmlsl.u8 q12, d19, d31 @// a0 + a5 + 20a2 + 20a3 - 5a1 - 5a4 (column3,row0)
|
|
vst1.8 {d26, d27, d28}, [r2], r14 @// store 1/2,1,2 grif values
|
|
|
|
vqrshrun.s16 d5, q10, #5 @// (a0 + a5 + 20a2 + 20a3 - 5a1 - 5a4 + 16) >> 5 (column1,row0)
|
|
vext.16 d31, d21, d22, #1 @//extract a[5] (set1)
|
|
vqrshrun.s16 d6, q11, #5 @// (a0 + a5 + 20a2 + 20a3 - 5a1 - 5a4 + 16) >> 5 (column2,row0)
|
|
vext.16 d28, d20, d21, #1 @//extract a[1] (set1)
|
|
|
|
vaddl.s16 q13, d31, d20 @// a0 + a5 (set1)
|
|
vext.16 d31, d22, d23, #1 @//extract a[5] (set2)
|
|
vmlal.s16 q13, d30, d0[1] @// a0 + a5 + 20a2 (set1)
|
|
vmlal.s16 q13, d29, d0[1] @// a0 + a5 + 20a2 + 20a3 (set1)
|
|
vmlsl.s16 q13, d28, d0[0] @// a0 + a5 + 20a2 + 20a3 - 5a1 (set1)
|
|
vmlsl.s16 q13, d21, d0[0] @// a0 + a5 + 20a2 + 20a3 - 5a1 - 5a4 (set1)
|
|
vext.16 d30, d21, d22, #2 @//extract a[2] (set2)
|
|
|
|
vqrshrun.s16 d7, q12, #5 @// (a0 + a5 + 20a2 + 20a3 - 5a1 - 5a4 + 16) >> 5 (column3,row0)
|
|
vext.16 d29, d21, d22, #3 @//extract a[3] (set2)
|
|
|
|
vext.16 d28, d21, d22, #1 @//extract a[1] (set2)
|
|
vaddl.s16 q10, d31, d21 @// a0 + a5 (set2)
|
|
vmlal.s16 q10, d30, d0[1] @// a0 + a5 + 20a2 (set2)
|
|
vmlal.s16 q10, d29, d0[1] @// a0 + a5 + 20a2 + 20a3 (set2)
|
|
vmlsl.s16 q10, d28, d0[0] @// a0 + a5 + 20a2 + 20a3 - 5a1 (set2)
|
|
vmlsl.s16 q10, d22, d0[0] @// a0 + a5 + 20a2 + 20a3 - 5a1 - 5a4 (set2)
|
|
vext.16 d31, d23, d24, #1 @//extract a[5] (set3)
|
|
|
|
vext.8 d5, d5, d6, #2
|
|
vst1.8 {d6, d7}, [r11], r12 @// store row1 - 1,1/2 grid
|
|
vst1.8 {d5}, [r1], r12 @// store row1 - 1,1/2 grid
|
|
|
|
vext.16 d30, d22, d23, #2 @//extract a[2] (set3)
|
|
vext.16 d29, d22, d23, #3 @//extract a[3] (set3)
|
|
|
|
vaddl.s16 q3, d31, d22 @// a0 + a5 (set3)
|
|
vext.16 d28, d22, d23, #1 @//extract a[1] (set3)
|
|
vmlal.s16 q3, d30, d0[1] @// a0 + a5 + 20a2 (set3)
|
|
vmlal.s16 q3, d29, d0[1] @// a0 + a5 + 20a2 + 20a3 (set3)
|
|
vmlsl.s16 q3, d28, d0[0] @// a0 + a5 + 20a2 + 20a3 - 5a1 (set3)
|
|
vmlsl.s16 q3, d23, d0[0] @// a0 + a5 + 20a2 + 20a3 - 5a1 - 5a4 (set3)
|
|
vext.16 d31, d24, d25, #1 @//extract a[5] (set4)
|
|
|
|
vshrn.s32 d21, q10, #8 @// shift by 8 and later we will shift by 2 more with rounding (set2)
|
|
vext.16 d30, d23, d24, #2 @//extract a[2] (set4)
|
|
vshrn.s32 d20, q13, #8 @// shift by 8 and later we will shift by 2 more with rounding (set1)
|
|
vext.16 d29, d23, d24, #3 @//extract a[3] (set4)
|
|
|
|
vaddl.s16 q13, d31, d23 @// a0 + a5 (set4)
|
|
vext.16 d28, d23, d24, #1 @//extract a[1] (set4)
|
|
vext.16 d31, d25, d25, #1 @//extract a[5] (set5) ;//here only first element in the row is valid
|
|
vmlal.s16 q13, d30, d0[1] @// a0 + a5 + 20a2 (set4)
|
|
vmlal.s16 q13, d29, d0[1] @// a0 + a5 + 20a2 + 20a3 (set4)
|
|
vmlsl.s16 q13, d28, d0[0] @// a0 + a5 + 20a2 + 20a3 - 5a1 (set4)
|
|
vmlsl.s16 q13, d24, d0[0] @// a0 + a5 + 20a2 + 20a3 - 5a1 - 5a4 (set4)
|
|
vext.16 d30, d24, d25, #2 @//extract a[2] (set5)
|
|
|
|
vaddl.s16 q11, d31, d24 @// a0 + a5 (set5)
|
|
vext.16 d29, d24, d25, #3 @//extract a[3] (set5)
|
|
|
|
vext.16 d31, d24, d25, #1 @//extract a[1] (set5)
|
|
vshrn.s32 d28, q3, #8 @// shift by 8 and later we will shift by 2 more with rounding (set3)
|
|
|
|
vld1.8 {d5, d6, d7}, [r0], r3 @// Load next Row data
|
|
vmlal.s16 q11, d30, d0[1] @// a0 + a5 + 20a2 (set5)
|
|
vmlal.s16 q11, d29, d0[1] @// a0 + a5 + 20a2 + 20a3 (set5)
|
|
vmlsl.s16 q11, d31, d0[0] @// a0 + a5 + 20a2 + 20a3 - 5a1 (set5)
|
|
vmlsl.s16 q11, d25, d0[0] @// a0 + a5 + 20a2 + 20a3 - 5a1 - 5a4 (set5)
|
|
vshrn.s32 d29, q13, #8 @// shift by 8 and later we will shift by 2 more with rounding (set4)
|
|
vqrshrun.s16 d26, q10, #2 @// half,half gird set1,2
|
|
|
|
|
|
@//VQRSHRUN.s16 D27,Q14,#2 ;// half,half gird set3,4
|
|
@//VSHRN.s32 D28,Q11,#8 ;// shift by 8 and later we will shift by 2 more with rounding (set5)
|
|
|
|
@//VQRSHRUN.s16 D28,Q14,#2 ;// half,half gird set5
|
|
|
|
@//VST1.8 {D26,D27,D28},[r2],r14 ;// store 1/2,1,2 grif values
|
|
@// ////////////// ROW 3 ///////////////////////
|
|
|
|
@// Process first vertical interpolated row
|
|
@// each column is
|
|
vaddl.u8 q10, d8, d5 @// a0 + a5 (column1,row0)
|
|
vmov.i8 d31, #5
|
|
vmlal.u8 q10, d14, d1 @// a0 + a5 + 20a2 (column1,row0)
|
|
vmlal.u8 q10, d17, d1 @// a0 + a5 + 20a2 + 20a3 (column1,row0)
|
|
vmlsl.u8 q10, d11, d31 @// a0 + a5 + 20a2 + 20a3 - 5a1 (column1,row0)
|
|
vmlsl.u8 q10, d2, d31 @// a0 + a5 + 20a2 + 20a3 - 5a1 - 5a4 (column1,row0)
|
|
|
|
vqrshrun.s16 d27, q14, #2 @// half,half gird set3,4
|
|
vshrn.s32 d28, q11, #8 @// shift by 8 and later we will shift by 2 more with rounding (set5)
|
|
|
|
vaddl.u8 q11, d9, d6 @// a0 + a5 (column2,row0)
|
|
vmlal.u8 q11, d15, d1 @// a0 + a5 + 20a2 (column2,row0)
|
|
vmlal.u8 q11, d18, d1 @// a0 + a5 + 20a2 + 20a3 (column2,row0)
|
|
vmlsl.u8 q11, d12, d31 @// a0 + a5 + 20a2 + 20a3 - 5a1 (column2,row0)
|
|
vmlsl.u8 q11, d3, d31 @// a0 + a5 + 20a2 + 20a3 - 5a1 - 5a4 (column2,row0)
|
|
|
|
vqrshrun.s16 d28, q14, #2 @// half,half gird set5
|
|
vext.16 d30, d20, d21, #2 @//extract a[2] (set1)
|
|
|
|
vaddl.u8 q12, d10, d7 @// a0 + a5 (column3,row0)
|
|
vext.16 d29, d20, d21, #3 @//extract a[3] (set1)
|
|
vmlal.u8 q12, d16, d1 @// a0 + a5 + 20a2 (column3,row0)
|
|
vmlal.u8 q12, d19, d1 @// a0 + a5 + 20a2 + 20a3 (column3,row0)
|
|
vmlsl.u8 q12, d13, d31 @// a0 + a5 + 20a2 + 20a3 - 5a1 (column3,row0)
|
|
vmlsl.u8 q12, d4, d31 @// a0 + a5 + 20a2 + 20a3 - 5a1 - 5a4 (column3,row0)
|
|
|
|
vst1.8 {d26, d27, d28}, [r2], r14 @// store 1/2,1,2 grif values
|
|
|
|
vqrshrun.s16 d8, q10, #5 @// (a0 + a5 + 20a2 + 20a3 - 5a1 - 5a4 + 16) >> 5 (column1,row0)
|
|
vext.16 d31, d21, d22, #1 @//extract a[5] (set1)
|
|
vqrshrun.s16 d9, q11, #5 @// (a0 + a5 + 20a2 + 20a3 - 5a1 - 5a4 + 16) >> 5 (column2,row0)
|
|
vext.16 d28, d20, d21, #1 @//extract a[1] (set1)
|
|
|
|
vaddl.s16 q13, d31, d20 @// a0 + a5 (set1)
|
|
vext.16 d31, d22, d23, #1 @//extract a[5] (set2)
|
|
vmlal.s16 q13, d30, d0[1] @// a0 + a5 + 20a2 (set1)
|
|
vmlal.s16 q13, d29, d0[1] @// a0 + a5 + 20a2 + 20a3 (set1)
|
|
vmlsl.s16 q13, d28, d0[0] @// a0 + a5 + 20a2 + 20a3 - 5a1 (set1)
|
|
vmlsl.s16 q13, d21, d0[0] @// a0 + a5 + 20a2 + 20a3 - 5a1 - 5a4 (set1)
|
|
vext.16 d30, d21, d22, #2 @//extract a[2] (set2)
|
|
|
|
vqrshrun.s16 d10, q12, #5 @// (a0 + a5 + 20a2 + 20a3 - 5a1 - 5a4 + 16) >> 5 (column3,row0)
|
|
vext.16 d29, d21, d22, #3 @//extract a[3] (set2)
|
|
|
|
vext.16 d28, d21, d22, #1 @//extract a[1] (set2)
|
|
vaddl.s16 q10, d31, d21 @// a0 + a5 (set2)
|
|
vmlal.s16 q10, d30, d0[1] @// a0 + a5 + 20a2 (set2)
|
|
vmlal.s16 q10, d29, d0[1] @// a0 + a5 + 20a2 + 20a3 (set2)
|
|
vmlsl.s16 q10, d28, d0[0] @// a0 + a5 + 20a2 + 20a3 - 5a1 (set2)
|
|
vmlsl.s16 q10, d22, d0[0] @// a0 + a5 + 20a2 + 20a3 - 5a1 - 5a4 (set2)
|
|
vext.16 d31, d23, d24, #1 @//extract a[5] (set3)
|
|
|
|
vext.8 d8, d8, d9, #2
|
|
vst1.8 {d9, d10}, [r11], r12 @// store row1 - 1,1/2 grid
|
|
vst1.8 {d8}, [r1], r12 @// store row1 - 1,1/2 grid
|
|
|
|
vext.16 d30, d22, d23, #2 @//extract a[2] (set3)
|
|
vext.16 d29, d22, d23, #3 @//extract a[3] (set3)
|
|
|
|
vaddl.s16 q4, d31, d22 @// a0 + a5 (set3)
|
|
vext.16 d28, d22, d23, #1 @//extract a[1] (set3)
|
|
vmlal.s16 q4, d30, d0[1] @// a0 + a5 + 20a2 (set3)
|
|
vmlal.s16 q4, d29, d0[1] @// a0 + a5 + 20a2 + 20a3 (set3)
|
|
vmlsl.s16 q4, d28, d0[0] @// a0 + a5 + 20a2 + 20a3 - 5a1 (set3)
|
|
vmlsl.s16 q4, d23, d0[0] @// a0 + a5 + 20a2 + 20a3 - 5a1 - 5a4 (set3)
|
|
vext.16 d31, d24, d25, #1 @//extract a[5] (set4)
|
|
|
|
vshrn.s32 d21, q10, #8 @// shift by 8 and later we will shift by 2 more with rounding (set2)
|
|
vext.16 d30, d23, d24, #2 @//extract a[2] (set4)
|
|
vshrn.s32 d20, q13, #8 @// shift by 8 and later we will shift by 2 more with rounding (set1)
|
|
vext.16 d29, d23, d24, #3 @//extract a[3] (set4)
|
|
|
|
vaddl.s16 q13, d31, d23 @// a0 + a5 (set4)
|
|
vext.16 d28, d23, d24, #1 @//extract a[1] (set4)
|
|
vext.16 d31, d25, d25, #1 @//extract a[5] (set5) ;//here only first element in the row is valid
|
|
vmlal.s16 q13, d30, d0[1] @// a0 + a5 + 20a2 (set4)
|
|
vmlal.s16 q13, d29, d0[1] @// a0 + a5 + 20a2 + 20a3 (set4)
|
|
vmlsl.s16 q13, d28, d0[0] @// a0 + a5 + 20a2 + 20a3 - 5a1 (set4)
|
|
vmlsl.s16 q13, d24, d0[0] @// a0 + a5 + 20a2 + 20a3 - 5a1 - 5a4 (set4)
|
|
vext.16 d30, d24, d25, #2 @//extract a[2] (set5)
|
|
|
|
vaddl.s16 q11, d31, d24 @// a0 + a5 (set5)
|
|
vext.16 d29, d24, d25, #3 @//extract a[3] (set5)
|
|
|
|
vext.16 d31, d24, d25, #1 @//extract a[1] (set5)
|
|
vshrn.s32 d28, q4, #8 @// shift by 8 and later we will shift by 2 more with rounding (set3)
|
|
|
|
vld1.8 {d8, d9, d10}, [r0], r3 @// Load next Row data
|
|
vmlal.s16 q11, d30, d0[1] @// a0 + a5 + 20a2 (set5)
|
|
vmlal.s16 q11, d29, d0[1] @// a0 + a5 + 20a2 + 20a3 (set5)
|
|
vmlsl.s16 q11, d31, d0[0] @// a0 + a5 + 20a2 + 20a3 - 5a1 (set5)
|
|
vmlsl.s16 q11, d25, d0[0] @// a0 + a5 + 20a2 + 20a3 - 5a1 - 5a4 (set5)
|
|
vshrn.s32 d29, q13, #8 @// shift by 8 and later we will shift by 2 more with rounding (set4)
|
|
vqrshrun.s16 d26, q10, #2 @// half,half gird set1,2
|
|
|
|
|
|
@//VQRSHRUN.s16 D27,Q14,#2 ;// half,half gird set3,4
|
|
@//VSHRN.s32 D28,Q11,#8 ;// shift by 8 and later we will shift by 2 more with rounding (set5)
|
|
|
|
@//VQRSHRUN.s16 D28,Q14,#2 ;// half,half gird set5
|
|
|
|
@//VST1.8 {D26,D27,D28},[r2],r14 ;// store 1/2,1,2 grif values
|
|
@// ////////////// ROW 4 ///////////////////////
|
|
|
|
@// Process first vertical interpolated row
|
|
@// each column is
|
|
vaddl.u8 q10, d11, d8 @// a0 + a5 (column1,row0)
|
|
vmov.i8 d31, #5
|
|
vmlal.u8 q10, d17, d1 @// a0 + a5 + 20a2 (column1,row0)
|
|
vmlal.u8 q10, d2, d1 @// a0 + a5 + 20a2 + 20a3 (column1,row0)
|
|
vmlsl.u8 q10, d14, d31 @// a0 + a5 + 20a2 + 20a3 - 5a1 (column1,row0)
|
|
vmlsl.u8 q10, d5, d31 @// a0 + a5 + 20a2 + 20a3 - 5a1 - 5a4 (column1,row0)
|
|
|
|
vqrshrun.s16 d27, q14, #2 @// half,half gird set3,4
|
|
vshrn.s32 d28, q11, #8 @// shift by 8 and later we will shift by 2 more with rounding (set5)
|
|
|
|
vaddl.u8 q11, d12, d9 @// a0 + a5 (column2,row0)
|
|
vmlal.u8 q11, d18, d1 @// a0 + a5 + 20a2 (column2,row0)
|
|
vmlal.u8 q11, d3, d1 @// a0 + a5 + 20a2 + 20a3 (column2,row0)
|
|
vmlsl.u8 q11, d15, d31 @// a0 + a5 + 20a2 + 20a3 - 5a1 (column2,row0)
|
|
vmlsl.u8 q11, d6, d31 @// a0 + a5 + 20a2 + 20a3 - 5a1 - 5a4 (column2,row0)
|
|
|
|
vqrshrun.s16 d28, q14, #2 @// half,half gird set5
|
|
vext.16 d30, d20, d21, #2 @//extract a[2] (set1)
|
|
|
|
vaddl.u8 q12, d13, d10 @// a0 + a5 (column3,row0)
|
|
vext.16 d29, d20, d21, #3 @//extract a[3] (set1)
|
|
vmlal.u8 q12, d19, d1 @// a0 + a5 + 20a2 (column3,row0)
|
|
vmlal.u8 q12, d4, d1 @// a0 + a5 + 20a2 + 20a3 (column3,row0)
|
|
vmlsl.u8 q12, d16, d31 @// a0 + a5 + 20a2 + 20a3 - 5a1 (column3,row0)
|
|
vmlsl.u8 q12, d7, d31 @// a0 + a5 + 20a2 + 20a3 - 5a1 - 5a4 (column3,row0)
|
|
|
|
vst1.8 {d26, d27, d28}, [r2], r14 @// store 1/2,1,2 grif values
|
|
|
|
vqrshrun.s16 d11, q10, #5 @// (a0 + a5 + 20a2 + 20a3 - 5a1 - 5a4 + 16) >> 5 (column1,row0)
|
|
vext.16 d31, d21, d22, #1 @//extract a[5] (set1)
|
|
vqrshrun.s16 d12, q11, #5 @// (a0 + a5 + 20a2 + 20a3 - 5a1 - 5a4 + 16) >> 5 (column2,row0)
|
|
vext.16 d28, d20, d21, #1 @//extract a[1] (set1)
|
|
|
|
vaddl.s16 q13, d31, d20 @// a0 + a5 (set1)
|
|
vext.16 d31, d22, d23, #1 @//extract a[5] (set2)
|
|
vmlal.s16 q13, d30, d0[1] @// a0 + a5 + 20a2 (set1)
|
|
vmlal.s16 q13, d29, d0[1] @// a0 + a5 + 20a2 + 20a3 (set1)
|
|
vmlsl.s16 q13, d28, d0[0] @// a0 + a5 + 20a2 + 20a3 - 5a1 (set1)
|
|
vmlsl.s16 q13, d21, d0[0] @// a0 + a5 + 20a2 + 20a3 - 5a1 - 5a4 (set1)
|
|
vext.16 d30, d21, d22, #2 @//extract a[2] (set2)
|
|
|
|
vqrshrun.s16 d13, q12, #5 @// (a0 + a5 + 20a2 + 20a3 - 5a1 - 5a4 + 16) >> 5 (column3,row0)
|
|
vext.16 d29, d21, d22, #3 @//extract a[3] (set2)
|
|
|
|
vext.16 d28, d21, d22, #1 @//extract a[1] (set2)
|
|
vaddl.s16 q10, d31, d21 @// a0 + a5 (set2)
|
|
vmlal.s16 q10, d30, d0[1] @// a0 + a5 + 20a2 (set2)
|
|
vmlal.s16 q10, d29, d0[1] @// a0 + a5 + 20a2 + 20a3 (set2)
|
|
vmlsl.s16 q10, d28, d0[0] @// a0 + a5 + 20a2 + 20a3 - 5a1 (set2)
|
|
vmlsl.s16 q10, d22, d0[0] @// a0 + a5 + 20a2 + 20a3 - 5a1 - 5a4 (set2)
|
|
vext.16 d31, d23, d24, #1 @//extract a[5] (set3)
|
|
|
|
vext.8 d11, d11, d12, #2
|
|
vst1.8 {d12, d13}, [r11], r12 @// store row1 - 1,1/2 grid
|
|
vst1.8 {d11}, [r1], r12 @// store row1 - 1,1/2 grid
|
|
|
|
vext.16 d30, d22, d23, #2 @//extract a[2] (set3)
|
|
vext.16 d29, d22, d23, #3 @//extract a[3] (set3)
|
|
|
|
vaddl.s16 q6, d31, d22 @// a0 + a5 (set3)
|
|
vext.16 d28, d22, d23, #1 @//extract a[1] (set3)
|
|
vmlal.s16 q6, d30, d0[1] @// a0 + a5 + 20a2 (set3)
|
|
vmlal.s16 q6, d29, d0[1] @// a0 + a5 + 20a2 + 20a3 (set3)
|
|
vmlsl.s16 q6, d28, d0[0] @// a0 + a5 + 20a2 + 20a3 - 5a1 (set3)
|
|
vmlsl.s16 q6, d23, d0[0] @// a0 + a5 + 20a2 + 20a3 - 5a1 - 5a4 (set3)
|
|
vext.16 d31, d24, d25, #1 @//extract a[5] (set4)
|
|
|
|
vshrn.s32 d21, q10, #8 @// shift by 8 and later we will shift by 2 more with rounding (set2)
|
|
vext.16 d30, d23, d24, #2 @//extract a[2] (set4)
|
|
vshrn.s32 d20, q13, #8 @// shift by 8 and later we will shift by 2 more with rounding (set1)
|
|
vext.16 d29, d23, d24, #3 @//extract a[3] (set4)
|
|
|
|
vaddl.s16 q13, d31, d23 @// a0 + a5 (set4)
|
|
vext.16 d28, d23, d24, #1 @//extract a[1] (set4)
|
|
vext.16 d31, d25, d25, #1 @//extract a[5] (set5) ;//here only first element in the row is valid
|
|
vmlal.s16 q13, d30, d0[1] @// a0 + a5 + 20a2 (set4)
|
|
vmlal.s16 q13, d29, d0[1] @// a0 + a5 + 20a2 + 20a3 (set4)
|
|
vmlsl.s16 q13, d28, d0[0] @// a0 + a5 + 20a2 + 20a3 - 5a1 (set4)
|
|
vmlsl.s16 q13, d24, d0[0] @// a0 + a5 + 20a2 + 20a3 - 5a1 - 5a4 (set4)
|
|
vext.16 d30, d24, d25, #2 @//extract a[2] (set5)
|
|
|
|
vaddl.s16 q11, d31, d24 @// a0 + a5 (set5)
|
|
vext.16 d29, d24, d25, #3 @//extract a[3] (set5)
|
|
|
|
vext.16 d31, d24, d25, #1 @//extract a[1] (set5)
|
|
vshrn.s32 d28, q6, #8 @// shift by 8 and later we will shift by 2 more with rounding (set3)
|
|
|
|
vld1.8 {d11, d12, d13}, [r0], r3 @// Load next Row data
|
|
vmlal.s16 q11, d30, d0[1] @// a0 + a5 + 20a2 (set5)
|
|
vmlal.s16 q11, d29, d0[1] @// a0 + a5 + 20a2 + 20a3 (set5)
|
|
vmlsl.s16 q11, d31, d0[0] @// a0 + a5 + 20a2 + 20a3 - 5a1 (set5)
|
|
vmlsl.s16 q11, d25, d0[0] @// a0 + a5 + 20a2 + 20a3 - 5a1 - 5a4 (set5)
|
|
vshrn.s32 d29, q13, #8 @// shift by 8 and later we will shift by 2 more with rounding (set4)
|
|
vqrshrun.s16 d26, q10, #2 @// half,half gird set1,2
|
|
|
|
|
|
@//VQRSHRUN.s16 D27,Q14,#2 ;// half,half gird set3,4
|
|
@//VSHRN.s32 D28,Q11,#8 ;// shift by 8 and later we will shift by 2 more with rounding (set5)
|
|
|
|
@//VQRSHRUN.s16 D28,Q14,#2 ;// half,half gird set5
|
|
|
|
@//VST1.8 {D26,D27,D28},[r2],r14 ;// store 1/2,1,2 grif values
|
|
@// ////////////// ROW 5 ///////////////////////
|
|
|
|
@// Process first vertical interpolated row
|
|
@// each column is
|
|
vaddl.u8 q10, d14, d11 @// a0 + a5 (column1,row0)
|
|
vmov.i8 d31, #5
|
|
vmlal.u8 q10, d2, d1 @// a0 + a5 + 20a2 (column1,row0)
|
|
vmlal.u8 q10, d5, d1 @// a0 + a5 + 20a2 + 20a3 (column1,row0)
|
|
vmlsl.u8 q10, d17, d31 @// a0 + a5 + 20a2 + 20a3 - 5a1 (column1,row0)
|
|
vmlsl.u8 q10, d8, d31 @// a0 + a5 + 20a2 + 20a3 - 5a1 - 5a4 (column1,row0)
|
|
|
|
vqrshrun.s16 d27, q14, #2 @// half,half gird set3,4
|
|
vshrn.s32 d28, q11, #8 @// shift by 8 and later we will shift by 2 more with rounding (set5)
|
|
|
|
vaddl.u8 q11, d15, d12 @// a0 + a5 (column2,row0)
|
|
vmlal.u8 q11, d3, d1 @// a0 + a5 + 20a2 (column2,row0)
|
|
vmlal.u8 q11, d6, d1 @// a0 + a5 + 20a2 + 20a3 (column2,row0)
|
|
vmlsl.u8 q11, d18, d31 @// a0 + a5 + 20a2 + 20a3 - 5a1 (column2,row0)
|
|
vmlsl.u8 q11, d9, d31 @// a0 + a5 + 20a2 + 20a3 - 5a1 - 5a4 (column2,row0)
|
|
|
|
vqrshrun.s16 d28, q14, #2 @// half,half gird set5
|
|
vext.16 d30, d20, d21, #2 @//extract a[2] (set1)
|
|
|
|
vaddl.u8 q12, d16, d13 @// a0 + a5 (column3,row0)
|
|
vext.16 d29, d20, d21, #3 @//extract a[3] (set1)
|
|
vmlal.u8 q12, d4, d1 @// a0 + a5 + 20a2 (column3,row0)
|
|
vmlal.u8 q12, d7, d1 @// a0 + a5 + 20a2 + 20a3 (column3,row0)
|
|
vmlsl.u8 q12, d19, d31 @// a0 + a5 + 20a2 + 20a3 - 5a1 (column3,row0)
|
|
vmlsl.u8 q12, d10, d31 @// a0 + a5 + 20a2 + 20a3 - 5a1 - 5a4 (column3,row0)
|
|
|
|
vst1.8 {d26, d27, d28}, [r2], r14 @// store 1/2,1,2 grif values
|
|
|
|
vqrshrun.s16 d14, q10, #5 @// (a0 + a5 + 20a2 + 20a3 - 5a1 - 5a4 + 16) >> 5 (column1,row0)
|
|
vext.16 d31, d21, d22, #1 @//extract a[5] (set1)
|
|
vqrshrun.s16 d15, q11, #5 @// (a0 + a5 + 20a2 + 20a3 - 5a1 - 5a4 + 16) >> 5 (column2,row0)
|
|
vext.16 d28, d20, d21, #1 @//extract a[1] (set1)
|
|
|
|
vaddl.s16 q13, d31, d20 @// a0 + a5 (set1)
|
|
vext.16 d31, d22, d23, #1 @//extract a[5] (set2)
|
|
vmlal.s16 q13, d30, d0[1] @// a0 + a5 + 20a2 (set1)
|
|
vmlal.s16 q13, d29, d0[1] @// a0 + a5 + 20a2 + 20a3 (set1)
|
|
vmlsl.s16 q13, d28, d0[0] @// a0 + a5 + 20a2 + 20a3 - 5a1 (set1)
|
|
vmlsl.s16 q13, d21, d0[0] @// a0 + a5 + 20a2 + 20a3 - 5a1 - 5a4 (set1)
|
|
vext.16 d30, d21, d22, #2 @//extract a[2] (set2)
|
|
|
|
vqrshrun.s16 d16, q12, #5 @// (a0 + a5 + 20a2 + 20a3 - 5a1 - 5a4 + 16) >> 5 (column3,row0)
|
|
vext.16 d29, d21, d22, #3 @//extract a[3] (set2)
|
|
|
|
vext.16 d28, d21, d22, #1 @//extract a[1] (set2)
|
|
vaddl.s16 q10, d31, d21 @// a0 + a5 (set2)
|
|
vmlal.s16 q10, d30, d0[1] @// a0 + a5 + 20a2 (set2)
|
|
vmlal.s16 q10, d29, d0[1] @// a0 + a5 + 20a2 + 20a3 (set2)
|
|
vmlsl.s16 q10, d28, d0[0] @// a0 + a5 + 20a2 + 20a3 - 5a1 (set2)
|
|
vmlsl.s16 q10, d22, d0[0] @// a0 + a5 + 20a2 + 20a3 - 5a1 - 5a4 (set2)
|
|
vext.16 d31, d23, d24, #1 @//extract a[5] (set3)
|
|
|
|
vext.8 d14, d14, d15, #2
|
|
vst1.8 {d15, d16}, [r11], r12 @// store row1 - 1,1/2 grid
|
|
vst1.8 {d14}, [r1], r12 @// store row1 - 1,1/2 grid
|
|
|
|
vext.16 d30, d22, d23, #2 @//extract a[2] (set3)
|
|
vext.16 d29, d22, d23, #3 @//extract a[3] (set3)
|
|
|
|
vaddl.s16 q7, d31, d22 @// a0 + a5 (set3)
|
|
vext.16 d28, d22, d23, #1 @//extract a[1] (set3)
|
|
vmlal.s16 q7, d30, d0[1] @// a0 + a5 + 20a2 (set3)
|
|
vmlal.s16 q7, d29, d0[1] @// a0 + a5 + 20a2 + 20a3 (set3)
|
|
vmlsl.s16 q7, d28, d0[0] @// a0 + a5 + 20a2 + 20a3 - 5a1 (set3)
|
|
vmlsl.s16 q7, d23, d0[0] @// a0 + a5 + 20a2 + 20a3 - 5a1 - 5a4 (set3)
|
|
vext.16 d31, d24, d25, #1 @//extract a[5] (set4)
|
|
|
|
vshrn.s32 d21, q10, #8 @// shift by 8 and later we will shift by 2 more with rounding (set2)
|
|
vext.16 d30, d23, d24, #2 @//extract a[2] (set4)
|
|
vshrn.s32 d20, q13, #8 @// shift by 8 and later we will shift by 2 more with rounding (set1)
|
|
vext.16 d29, d23, d24, #3 @//extract a[3] (set4)
|
|
|
|
vaddl.s16 q13, d31, d23 @// a0 + a5 (set4)
|
|
vext.16 d28, d23, d24, #1 @//extract a[1] (set4)
|
|
vext.16 d31, d25, d25, #1 @//extract a[5] (set5) ;//here only first element in the row is valid
|
|
vmlal.s16 q13, d30, d0[1] @// a0 + a5 + 20a2 (set4)
|
|
vmlal.s16 q13, d29, d0[1] @// a0 + a5 + 20a2 + 20a3 (set4)
|
|
vmlsl.s16 q13, d28, d0[0] @// a0 + a5 + 20a2 + 20a3 - 5a1 (set4)
|
|
vmlsl.s16 q13, d24, d0[0] @// a0 + a5 + 20a2 + 20a3 - 5a1 - 5a4 (set4)
|
|
vext.16 d30, d24, d25, #2 @//extract a[2] (set5)
|
|
|
|
vaddl.s16 q11, d31, d24 @// a0 + a5 (set5)
|
|
vext.16 d29, d24, d25, #3 @//extract a[3] (set5)
|
|
|
|
vext.16 d31, d24, d25, #1 @//extract a[1] (set5)
|
|
vshrn.s32 d28, q7, #8 @// shift by 8 and later we will shift by 2 more with rounding (set3)
|
|
|
|
vld1.8 {d14, d15, d16}, [r0], r3 @// Load next Row data
|
|
vmlal.s16 q11, d30, d0[1] @// a0 + a5 + 20a2 (set5)
|
|
vmlal.s16 q11, d29, d0[1] @// a0 + a5 + 20a2 + 20a3 (set5)
|
|
vmlsl.s16 q11, d31, d0[0] @// a0 + a5 + 20a2 + 20a3 - 5a1 (set5)
|
|
vmlsl.s16 q11, d25, d0[0] @// a0 + a5 + 20a2 + 20a3 - 5a1 - 5a4 (set5)
|
|
vshrn.s32 d29, q13, #8 @// shift by 8 and later we will shift by 2 more with rounding (set4)
|
|
vqrshrun.s16 d26, q10, #2 @// half,half gird set1,2
|
|
|
|
|
|
@//VQRSHRUN.s16 D27,Q14,#2 ;// half,half gird set3,4
|
|
@//VSHRN.s32 D28,Q11,#8 ;// shift by 8 and later we will shift by 2 more with rounding (set5)
|
|
|
|
@//VQRSHRUN.s16 D28,Q14,#2 ;// half,half gird set5
|
|
|
|
@//VST1.8 {D26,D27,D28},[r2],r14 ;// store 1/2,1,2 grif values
|
|
@// ////////////// ROW 6 ///////////////////////
|
|
|
|
@// Process first vertical interpolated row
|
|
@// each column is
|
|
|
|
cmp r10, #1 @// if it 17 rows are complete skip
|
|
beq filter_2dvh_skip_row
|
|
vaddl.u8 q10, d17, d14 @// a0 + a5 (column1,row0)
|
|
vmov.i8 d31, #5
|
|
vmlal.u8 q10, d5, d1 @// a0 + a5 + 20a2 (column1,row0)
|
|
vmlal.u8 q10, d8, d1 @// a0 + a5 + 20a2 + 20a3 (column1,row0)
|
|
vmlsl.u8 q10, d2, d31 @// a0 + a5 + 20a2 + 20a3 - 5a1 (column1,row0)
|
|
vmlsl.u8 q10, d11, d31 @// a0 + a5 + 20a2 + 20a3 - 5a1 - 5a4 (column1,row0)
|
|
|
|
vqrshrun.s16 d27, q14, #2 @// half,half gird set3,4
|
|
vshrn.s32 d28, q11, #8 @// shift by 8 and later we will shift by 2 more with rounding (set5)
|
|
|
|
vaddl.u8 q11, d18, d15 @// a0 + a5 (column2,row0)
|
|
vmlal.u8 q11, d6, d1 @// a0 + a5 + 20a2 (column2,row0)
|
|
vmlal.u8 q11, d9, d1 @// a0 + a5 + 20a2 + 20a3 (column2,row0)
|
|
vmlsl.u8 q11, d3, d31 @// a0 + a5 + 20a2 + 20a3 - 5a1 (column2,row0)
|
|
vmlsl.u8 q11, d12, d31 @// a0 + a5 + 20a2 + 20a3 - 5a1 - 5a4 (column2,row0)
|
|
|
|
vqrshrun.s16 d28, q14, #2 @// half,half gird set5
|
|
vext.16 d30, d20, d21, #2 @//extract a[2] (set1)
|
|
|
|
vaddl.u8 q12, d19, d16 @// a0 + a5 (column3,row0)
|
|
vext.16 d29, d20, d21, #3 @//extract a[3] (set1)
|
|
vmlal.u8 q12, d7, d1 @// a0 + a5 + 20a2 (column3,row0)
|
|
vmlal.u8 q12, d10, d1 @// a0 + a5 + 20a2 + 20a3 (column3,row0)
|
|
vmlsl.u8 q12, d4, d31 @// a0 + a5 + 20a2 + 20a3 - 5a1 (column3,row0)
|
|
vmlsl.u8 q12, d13, d31 @// a0 + a5 + 20a2 + 20a3 - 5a1 - 5a4 (column3,row0)
|
|
|
|
vst1.8 {d26, d27, d28}, [r2], r14 @// store 1/2,1,2 grif values
|
|
|
|
vqrshrun.s16 d17, q10, #5 @// (a0 + a5 + 20a2 + 20a3 - 5a1 - 5a4 + 16) >> 5 (column1,row0)
|
|
vext.16 d31, d21, d22, #1 @//extract a[5] (set1)
|
|
vqrshrun.s16 d18, q11, #5 @// (a0 + a5 + 20a2 + 20a3 - 5a1 - 5a4 + 16) >> 5 (column2,row0)
|
|
vext.16 d28, d20, d21, #1 @//extract a[1] (set1)
|
|
|
|
vaddl.s16 q13, d31, d20 @// a0 + a5 (set1)
|
|
vext.16 d31, d22, d23, #1 @//extract a[5] (set2)
|
|
vmlal.s16 q13, d30, d0[1] @// a0 + a5 + 20a2 (set1)
|
|
vmlal.s16 q13, d29, d0[1] @// a0 + a5 + 20a2 + 20a3 (set1)
|
|
vmlsl.s16 q13, d28, d0[0] @// a0 + a5 + 20a2 + 20a3 - 5a1 (set1)
|
|
vmlsl.s16 q13, d21, d0[0] @// a0 + a5 + 20a2 + 20a3 - 5a1 - 5a4 (set1)
|
|
vext.16 d30, d21, d22, #2 @//extract a[2] (set2)
|
|
|
|
vqrshrun.s16 d19, q12, #5 @// (a0 + a5 + 20a2 + 20a3 - 5a1 - 5a4 + 16) >> 5 (column3,row0)
|
|
vext.16 d29, d21, d22, #3 @//extract a[3] (set2)
|
|
|
|
vext.16 d28, d21, d22, #1 @//extract a[1] (set2)
|
|
vaddl.s16 q10, d31, d21 @// a0 + a5 (set2)
|
|
vmlal.s16 q10, d30, d0[1] @// a0 + a5 + 20a2 (set2)
|
|
vmlal.s16 q10, d29, d0[1] @// a0 + a5 + 20a2 + 20a3 (set2)
|
|
vmlsl.s16 q10, d28, d0[0] @// a0 + a5 + 20a2 + 20a3 - 5a1 (set2)
|
|
vmlsl.s16 q10, d22, d0[0] @// a0 + a5 + 20a2 + 20a3 - 5a1 - 5a4 (set2)
|
|
vext.16 d31, d23, d24, #1 @//extract a[5] (set3)
|
|
|
|
vext.8 d17, d17, d18, #2
|
|
vst1.8 {d18, d19}, [r11], r12 @// store row1 - 1,1/2 grid
|
|
vst1.8 {d17}, [r1], r12 @// store row1 - 1,1/2 grid
|
|
|
|
vext.16 d30, d22, d23, #2 @//extract a[2] (set3)
|
|
vext.16 d29, d22, d23, #3 @//extract a[3] (set3)
|
|
|
|
vaddl.s16 q9, d31, d22 @// a0 + a5 (set3)
|
|
vext.16 d28, d22, d23, #1 @//extract a[1] (set3)
|
|
vmlal.s16 q9, d30, d0[1] @// a0 + a5 + 20a2 (set3)
|
|
vmlal.s16 q9, d29, d0[1] @// a0 + a5 + 20a2 + 20a3 (set3)
|
|
vmlsl.s16 q9, d28, d0[0] @// a0 + a5 + 20a2 + 20a3 - 5a1 (set3)
|
|
vmlsl.s16 q9, d23, d0[0] @// a0 + a5 + 20a2 + 20a3 - 5a1 - 5a4 (set3)
|
|
vext.16 d31, d24, d25, #1 @//extract a[5] (set4)
|
|
|
|
vshrn.s32 d21, q10, #8 @// shift by 8 and later we will shift by 2 more with rounding (set2)
|
|
vext.16 d30, d23, d24, #2 @//extract a[2] (set4)
|
|
vshrn.s32 d20, q13, #8 @// shift by 8 and later we will shift by 2 more with rounding (set1)
|
|
vext.16 d29, d23, d24, #3 @//extract a[3] (set4)
|
|
|
|
vaddl.s16 q13, d31, d23 @// a0 + a5 (set4)
|
|
vext.16 d28, d23, d24, #1 @//extract a[1] (set4)
|
|
vext.16 d31, d25, d25, #1 @//extract a[5] (set5) ;//here only first element in the row is valid
|
|
vmlal.s16 q13, d30, d0[1] @// a0 + a5 + 20a2 (set4)
|
|
vmlal.s16 q13, d29, d0[1] @// a0 + a5 + 20a2 + 20a3 (set4)
|
|
vmlsl.s16 q13, d28, d0[0] @// a0 + a5 + 20a2 + 20a3 - 5a1 (set4)
|
|
vmlsl.s16 q13, d24, d0[0] @// a0 + a5 + 20a2 + 20a3 - 5a1 - 5a4 (set4)
|
|
vext.16 d30, d24, d25, #2 @//extract a[2] (set5)
|
|
|
|
vaddl.s16 q11, d31, d24 @// a0 + a5 (set5)
|
|
vext.16 d29, d24, d25, #3 @//extract a[3] (set5)
|
|
|
|
vext.16 d31, d24, d25, #1 @//extract a[1] (set5)
|
|
vshrn.s32 d28, q9, #8 @// shift by 8 and later we will shift by 2 more with rounding (set3)
|
|
|
|
vld1.8 {d17, d18, d19}, [r0], r3 @// Load next Row data
|
|
vmlal.s16 q11, d30, d0[1] @// a0 + a5 + 20a2 (set5)
|
|
vmlal.s16 q11, d29, d0[1] @// a0 + a5 + 20a2 + 20a3 (set5)
|
|
vmlsl.s16 q11, d31, d0[0] @// a0 + a5 + 20a2 + 20a3 - 5a1 (set5)
|
|
vmlsl.s16 q11, d25, d0[0] @// a0 + a5 + 20a2 + 20a3 - 5a1 - 5a4 (set5)
|
|
vshrn.s32 d29, q13, #8 @// shift by 8 and later we will shift by 2 more with rounding (set4)
|
|
vqrshrun.s16 d26, q10, #2 @// half,half gird set1,2
|
|
|
|
|
|
vqrshrun.s16 d27, q14, #2 @// half,half gird set3,4
|
|
vshrn.s32 d28, q11, #8 @// shift by 8 and later we will shift by 2 more with rounding (set5)
|
|
|
|
vqrshrun.s16 d28, q14, #2 @// half,half gird set5
|
|
|
|
vst1.8 {d26, d27, d28}, [r2], r14 @// store 1/2,1,2 grif values
|
|
|
|
subs r10, r10, #1 @//decrement loop counter
|
|
|
|
bne filter_2dvh_loop
|
|
|
|
|
|
@// Process first vertical interpolated row
|
|
@// each column is
|
|
@// ////////////// ROW 13 ///////////////////////
|
|
|
|
@// Process first vertical interpolated row
|
|
@// each column is
|
|
vpop {d8-d15}
|
|
ldmfd sp!, {r10, r11, r12, pc}
|
|
|
|
filter_2dvh_skip_row:
|
|
|
|
vqrshrun.s16 d27, q14, #2 @// half,half gird set3,4
|
|
vshrn.s32 d28, q11, #8 @// shift by 8 and later we will shift by 2 more with rounding (set5)
|
|
|
|
vqrshrun.s16 d28, q14, #2 @// half,half gird set5
|
|
|
|
vst1.8 {d26, d27, d28}, [r2], r14 @// store 1/2,1,2 grif values
|
|
vpop {d8-d15}
|
|
ldmfd sp!, {r10, r11, r12, pc}
|
|
|
|
|
|
|
|
|