blob: d310a83dad801b232fe60e6bcd043beba5d3d384 [file] [log] [blame]
;
; Copyright (c) 2018 The WebM project authors. All Rights Reserved.
;
; Use of this source code is governed by a BSD-style license
; that can be found in the LICENSE file in the root of the source
; tree. An additional intellectual property rights grant can be found
; in the file PATENTS. All contributing project authors may
; be found in the AUTHORS file in the root of the source tree.
;
;**************Variables Vs Registers***********************************
; r0 => src
; r1 => dst
; r2 => src_stride
; r6 => dst_stride
; r12 => filter_y0
; r5 => ht
; r3 => wd
EXPORT |vpx_convolve8_avg_vert_filter_type1_neon|
ARM
REQUIRE8
PRESERVE8
AREA ||.text||, CODE, READONLY, ALIGN=2
|vpx_convolve8_avg_vert_filter_type1_neon| PROC
stmfd sp!, {r4 - r12, r14} ;stack stores the values of
; the arguments
vpush {d8 - d15} ; stack offset by 64
mov r4, r1
mov r1, r2
mov r2, r4
vmov.i16 q15, #0x4000
mov r11, #0xc000
ldr r12, [sp, #104] ;load filter
ldr r6, [sp, #116] ;load y0_q4
add r12, r12, r6, lsl #4 ;r12 = filter[y0_q4]
mov r6, r3
ldr r5, [sp, #124] ;load wd
vld2.8 {d0, d1}, [r12] ;coeff = vld1_s8(pi1_coeff)
sub r12, r2, r2, lsl #2 ;src_ctrd & pi1_coeff
vabs.s8 d0, d0 ;vabs_s8(coeff)
add r0, r0, r12 ;r0->pu1_src r12->pi1_coeff
ldr r3, [sp, #128] ;load ht
subs r7, r3, #0 ;r3->ht
vdup.u8 d22, d0[0] ;coeffabs_0 = vdup_lane_u8(coeffabs,
; 0);
cmp r5, #8
vdup.u8 d23, d0[1] ;coeffabs_1 = vdup_lane_u8(coeffabs,
; 1);
vdup.u8 d24, d0[2] ;coeffabs_2 = vdup_lane_u8(coeffabs,
; 2);
vdup.u8 d25, d0[3] ;coeffabs_3 = vdup_lane_u8(coeffabs,
; 3);
vdup.u8 d26, d0[4] ;coeffabs_4 = vdup_lane_u8(coeffabs,
; 4);
vdup.u8 d27, d0[5] ;coeffabs_5 = vdup_lane_u8(coeffabs,
; 5);
vdup.u8 d28, d0[6] ;coeffabs_6 = vdup_lane_u8(coeffabs,
; 6);
vdup.u8 d29, d0[7] ;coeffabs_7 = vdup_lane_u8(coeffabs,
; 7);
blt core_loop_wd_4 ;core loop wd 4 jump
str r0, [sp, #-4]!
str r1, [sp, #-4]!
bic r4, r5, #7 ;r5 ->wd
rsb r9, r4, r6, lsl #2 ;r6->dst_strd r5 ->wd
rsb r8, r4, r2, lsl #2 ;r2->src_strd
mov r3, r5, lsr #3 ;divide by 8
mul r7, r3 ;multiply height by width
sub r7, #4 ;subtract by one for epilog
prolog
and r10, r0, #31
add r3, r0, r2 ;pu1_src_tmp += src_strd;
vdup.16 q4, r11
vld1.u8 {d1}, [r3], r2 ;src_tmp2 = vld1_u8(pu1_src_tmp);
vld1.u8 {d0}, [r0]! ;src_tmp1 = vld1_u8(pu1_src_tmp);
subs r4, r4, #8
vld1.u8 {d2}, [r3], r2 ;src_tmp3 = vld1_u8(pu1_src_tmp);
vmlsl.u8 q4, d1, d23 ;mul_res1 = vmull_u8(src_tmp2,
; coeffabs_1);
vld1.u8 {d3}, [r3], r2 ;src_tmp4 = vld1_u8(pu1_src_tmp);
vmlsl.u8 q4, d0, d22 ;mul_res1 = vmlsl_u8(mul_res1,
; src_tmp1, coeffabs_0);
vld1.u8 {d4}, [r3], r2 ;src_tmp1 = vld1_u8(pu1_src_tmp);
vmlal.u8 q4, d2, d24 ;mul_res1 = vmlsl_u8(mul_res1,
; src_tmp3, coeffabs_2);
vld1.u8 {d5}, [r3], r2 ;src_tmp2 = vld1_u8(pu1_src_tmp);
vmlal.u8 q4, d3, d25 ;mul_res1 = vmlal_u8(mul_res1,
; src_tmp4, coeffabs_3);
vld1.u8 {d6}, [r3], r2 ;src_tmp3 = vld1_u8(pu1_src_tmp);
vmlal.u8 q4, d4, d26 ;mul_res1 = vmlal_u8(mul_res1,
; src_tmp1, coeffabs_4);
vld1.u8 {d7}, [r3], r2 ;src_tmp4 = vld1_u8(pu1_src_tmp);
vmlal.u8 q4, d5, d27 ;mul_res1 = vmlsl_u8(mul_res1,
; src_tmp2, coeffabs_5);
vld1.u8 {d16}, [r3], r2 ;src_tmp1 = vld1_u8(pu1_src_tmp);
vmlsl.u8 q4, d6, d28 ;mul_res1 = vmlal_u8(mul_res1,
; src_tmp3, coeffabs_6);
vld1.u8 {d17}, [r3], r2 ;src_tmp2 = vld1_u8(pu1_src_tmp);
vmlsl.u8 q4, d7, d29 ;mul_res1 = vmlsl_u8(mul_res1,
; src_tmp4, coeffabs_7);
vdup.16 q5, r11
vld1.u8 {d18}, [r3], r2 ;src_tmp3 = vld1_u8(pu1_src_tmp);
vmlsl.u8 q5, d2, d23 ;mul_res2 = vmull_u8(src_tmp3,
; coeffabs_1);
addle r0, r0, r8
vmlsl.u8 q5, d1, d22 ;mul_res2 = vmlsl_u8(mul_res2,
; src_tmp2, coeffabs_0);
bicle r4, r5, #7 ;r5 ->wd
vmlal.u8 q5, d3, d24 ;mul_res2 = vmlsl_u8(mul_res2,
; src_tmp4, coeffabs_2);
pld [r3]
vmlal.u8 q5, d4, d25 ;mul_res2 = vmlal_u8(mul_res2,
; src_tmp1, coeffabs_3);
vhadd.s16 q4, q4, q15
vdup.16 q6, r11
pld [r3, r2]
pld [r3, r2, lsl #1]
vmlal.u8 q5, d5, d26 ;mul_res2 = vmlal_u8(mul_res2,
; src_tmp2, coeffabs_4);
add r3, r3, r2
vmlal.u8 q5, d6, d27 ;mul_res2 = vmlsl_u8(mul_res2,
; src_tmp3, coeffabs_5);
pld [r3, r2, lsl #1]
vmlsl.u8 q5, d7, d28 ;mul_res2 = vmlal_u8(mul_res2,
; src_tmp4, coeffabs_6);
add r3, r0, r2 ;pu1_src_tmp += src_strd;
vmlsl.u8 q5, d16, d29 ;mul_res2 = vmlsl_u8(mul_res2,
; src_tmp1, coeffabs_7);
vld1.u8 {d20}, [r1]
vqrshrun.s16 d8, q4, #6 ;sto_res = vqmovun_s16(sto_res_tmp);
vld1.u8 {d1}, [r3], r2 ;src_tmp3 = vld1_u8(pu1_src_tmp);
vmlsl.u8 q6, d3, d23
vld1.u8 {d0}, [r0]! ;src_tmp1 = vld1_u8(pu1_src_tmp);
vmlsl.u8 q6, d2, d22
vrhadd.u8 d8, d8, d20
vld1.u8 {d2}, [r3], r2 ;src_tmp3 = vld1_u8(pu1_src_tmp);
vmlal.u8 q6, d4, d24
vhadd.s16 q5, q5, q15
vdup.16 q7, r11
vmlal.u8 q6, d5, d25
vmlal.u8 q6, d6, d26
add r14, r1, r6
vmlal.u8 q6, d7, d27
vmlsl.u8 q6, d16, d28
vst1.8 {d8}, [r1]! ;vst1_u8(pu1_dst,sto_res);
vmlsl.u8 q6, d17, d29
vld1.u8 {d20}, [r14]
vqrshrun.s16 d10, q5, #6 ;sto_res = vqmovun_s16(sto_res_tmp);
addle r1, r1, r9
vmlsl.u8 q7, d4, d23
subs r7, r7, #4
vmlsl.u8 q7, d3, d22
vmlal.u8 q7, d5, d24
vld1.u8 {d3}, [r3], r2 ;src_tmp4 = vld1_u8(pu1_src_tmp);
vmlal.u8 q7, d6, d25
vrhadd.u8 d10, d10, d20
vhadd.s16 q6, q6, q15
vdup.16 q4, r11
vmlal.u8 q7, d7, d26
vld1.u8 {d4}, [r3], r2 ;src_tmp1 = vld1_u8(pu1_src_tmp);
vmlal.u8 q7, d16, d27
vld1.u8 {d5}, [r3], r2 ;src_tmp2 = vld1_u8(pu1_src_tmp);
vmlsl.u8 q7, d17, d28
vld1.u8 {d6}, [r3], r2 ;src_tmp3 = vld1_u8(pu1_src_tmp);
vmlsl.u8 q7, d18, d29
vld1.u8 {d7}, [r3], r2 ;src_tmp4 = vld1_u8(pu1_src_tmp);
vst1.8 {d10}, [r14], r6 ;vst1_u8(pu1_dst_tmp,sto_res);
vqrshrun.s16 d12, q6, #6
blt epilog_end ;jumps to epilog_end
beq epilog ;jumps to epilog
main_loop_8
subs r4, r4, #8
vmlsl.u8 q4, d1, d23 ;mul_res1 = vmull_u8(src_tmp2,
; coeffabs_1);
vld1.u8 {d20}, [r14]
vmlsl.u8 q4, d0, d22 ;mul_res1 = vmlsl_u8(mul_res1,
; src_tmp1, coeffabs_0);
addle r0, r0, r8
bicle r4, r5, #7 ;r5 ->wd
vmlal.u8 q4, d2, d24 ;mul_res1 = vmlsl_u8(mul_res1,
; src_tmp3, coeffabs_2);
vld1.u8 {d16}, [r3], r2 ;src_tmp1 = vld1_u8(pu1_src_tmp);
vmlal.u8 q4, d3, d25 ;mul_res1 = vmlal_u8(mul_res1,
; src_tmp4, coeffabs_3);
vrhadd.u8 d12, d12, d20
vhadd.s16 q7, q7, q15
vdup.16 q5, r11
vld1.u8 {d17}, [r3], r2 ;src_tmp2 = vld1_u8(pu1_src_tmp);
vmlal.u8 q4, d4, d26 ;mul_res1 = vmlal_u8(mul_res1,
; src_tmp1, coeffabs_4);
vld1.u8 {d18}, [r3], r2 ;src_tmp3 = vld1_u8(pu1_src_tmp);
vmlal.u8 q4, d5, d27 ;mul_res1 = vmlsl_u8(mul_res1,
; src_tmp2, coeffabs_5);
vmlsl.u8 q4, d6, d28 ;mul_res1 = vmlal_u8(mul_res1,
; src_tmp3, coeffabs_6);
vmlsl.u8 q4, d7, d29 ;mul_res1 = vmlsl_u8(mul_res1,
; src_tmp4, coeffabs_7);
vst1.8 {d12}, [r14], r6
vld1.u8 {d20}, [r14]
vqrshrun.s16 d14, q7, #6
add r3, r0, r2 ;pu1_src_tmp += src_strd;
vmlsl.u8 q5, d2, d23 ;mul_res2 = vmull_u8(src_tmp3,
; coeffabs_1);
vld1.u8 {d0}, [r0]! ;src_tmp1 = vld1_u8(pu1_src_tmp);
vmlsl.u8 q5, d1, d22 ;mul_res2 = vmlsl_u8(mul_res2,
; src_tmp2, coeffabs_0);
vrhadd.u8 d14, d14, d20
vmlal.u8 q5, d3, d24 ;mul_res2 = vmlsl_u8(mul_res2,
; src_tmp4, coeffabs_2);
vld1.u8 {d1}, [r3], r2 ;src_tmp2 = vld1_u8(pu1_src_tmp);
vmlal.u8 q5, d4, d25 ;mul_res2 = vmlal_u8(mul_res2,
; src_tmp1, coeffabs_3);
vhadd.s16 q4, q4, q15
vdup.16 q6, r11
vst1.8 {d14}, [r14], r6
vmlal.u8 q5, d5, d26 ;mul_res2 = vmlal_u8(mul_res2,
; src_tmp2, coeffabs_4);
add r14, r1, #0
vmlal.u8 q5, d6, d27 ;mul_res2 = vmlsl_u8(mul_res2,
; src_tmp3, coeffabs_5);
add r1, r1, #8
vmlsl.u8 q5, d7, d28 ;mul_res2 = vmlal_u8(mul_res2,
; src_tmp4, coeffabs_6);
addle r1, r1, r9
vmlsl.u8 q5, d16, d29 ;mul_res2 = vmlsl_u8(mul_res2,
; src_tmp1, coeffabs_7);
vld1.u8 {d20}, [r14]
vqrshrun.s16 d8, q4, #6 ;sto_res = vqmovun_s16(sto_res_tmp);
vmlsl.u8 q6, d3, d23
add r10, r3, r2, lsl #3 ; 10*strd - 8+2
vmlsl.u8 q6, d2, d22
vrhadd.u8 d8, d8, d20
add r10, r10, r2 ; 11*strd
vmlal.u8 q6, d4, d24
vld1.u8 {d2}, [r3], r2 ;src_tmp3 = vld1_u8(pu1_src_tmp);
vmlal.u8 q6, d5, d25
vhadd.s16 q5, q5, q15
vdup.16 q7, r11
vmlal.u8 q6, d6, d26
vst1.8 {d8}, [r14], r6 ;vst1_u8(pu1_dst,sto_res);
pld [r10] ;11+ 0
vmlal.u8 q6, d7, d27
pld [r10, r2] ;11+ 1*strd
pld [r10, r2, lsl #1] ;11+ 2*strd
vmlsl.u8 q6, d16, d28
add r10, r10, r2 ;12*strd
vmlsl.u8 q6, d17, d29
vld1.u8 {d20}, [r14]
vqrshrun.s16 d10, q5, #6 ;sto_res = vqmovun_s16(sto_res_tmp);
pld [r10, r2, lsl #1] ;11+ 3*strd
vmlsl.u8 q7, d4, d23
vmlsl.u8 q7, d3, d22
vrhadd.u8 d10, d10, d20
subs r7, r7, #4
vmlal.u8 q7, d5, d24
vmlal.u8 q7, d6, d25
vld1.u8 {d3}, [r3], r2 ;src_tmp4 = vld1_u8(pu1_src_tmp);
vhadd.s16 q6, q6, q15
vdup.16 q4, r11
vmlal.u8 q7, d7, d26
vld1.u8 {d4}, [r3], r2 ;src_tmp1 = vld1_u8(pu1_src_tmp);
vmlal.u8 q7, d16, d27
vld1.u8 {d5}, [r3], r2 ;src_tmp2 = vld1_u8(pu1_src_tmp);
vmlsl.u8 q7, d17, d28
vld1.u8 {d6}, [r3], r2 ;src_tmp3 = vld1_u8(pu1_src_tmp);
vmlsl.u8 q7, d18, d29
vld1.u8 {d7}, [r3], r2 ;src_tmp4 = vld1_u8(pu1_src_tmp);
vqrshrun.s16 d12, q6, #6
vst1.8 {d10}, [r14], r6 ;vst1_u8(pu1_dst_tmp,sto_res);
bgt main_loop_8 ;jumps to main_loop_8
epilog
vld1.u8 {d20}, [r14]
vmlsl.u8 q4, d1, d23 ;mul_res1 = vmull_u8(src_tmp2,
; coeffabs_1);
vmlsl.u8 q4, d0, d22 ;mul_res1 = vmlsl_u8(mul_res1,
; src_tmp1, coeffabs_0);
vmlal.u8 q4, d2, d24 ;mul_res1 = vmlsl_u8(mul_res1,
; src_tmp3, coeffabs_2);
vrhadd.u8 d12, d12, d20
vmlal.u8 q4, d3, d25 ;mul_res1 = vmlal_u8(mul_res1,
; src_tmp4, coeffabs_3);
vhadd.s16 q7, q7, q15
vdup.16 q5, r11
vmlal.u8 q4, d4, d26 ;mul_res1 = vmlal_u8(mul_res1,
; src_tmp1, coeffabs_4);
vmlal.u8 q4, d5, d27 ;mul_res1 = vmlsl_u8(mul_res1,
; src_tmp2, coeffabs_5);
vmlsl.u8 q4, d6, d28 ;mul_res1 = vmlal_u8(mul_res1,
; src_tmp3, coeffabs_6);
vst1.8 {d12}, [r14], r6
vmlsl.u8 q4, d7, d29 ;mul_res1 = vmlsl_u8(mul_res1,
; src_tmp4, coeffabs_7);
vld1.u8 {d20}, [r14]
vqrshrun.s16 d14, q7, #6
vld1.u8 {d16}, [r3], r2 ;src_tmp1 = vld1_u8(pu1_src_tmp);
vmlsl.u8 q5, d2, d23 ;mul_res2 = vmull_u8(src_tmp3,
; coeffabs_1);
vmlsl.u8 q5, d1, d22 ;mul_res2 = vmlsl_u8(mul_res2,
; src_tmp2, coeffabs_0);
vrhadd.u8 d14, d14, d20
vmlal.u8 q5, d3, d24 ;mul_res2 = vmlsl_u8(mul_res2,
; src_tmp4, coeffabs_2);
vmlal.u8 q5, d4, d25 ;mul_res2 = vmlal_u8(mul_res2,
; src_tmp1, coeffabs_3);
vhadd.s16 q4, q4, q15
vdup.16 q6, r11
vmlal.u8 q5, d5, d26 ;mul_res2 = vmlal_u8(mul_res2,
; src_tmp2, coeffabs_4);
vmlal.u8 q5, d6, d27 ;mul_res2 = vmlsl_u8(mul_res2,
; src_tmp3, coeffabs_5);
vmlsl.u8 q5, d7, d28 ;mul_res2 = vmlal_u8(mul_res2,
; src_tmp4, coeffabs_6);
vst1.8 {d14}, [r14], r6
vmlsl.u8 q5, d16, d29 ;mul_res2 = vmlsl_u8(mul_res2,
; src_tmp1, coeffabs_7);
vld1.u8 {d20}, [r1]
vqrshrun.s16 d8, q4, #6 ;sto_res = vqmovun_s16(sto_res_tmp);
vld1.u8 {d17}, [r3], r2 ;src_tmp2 = vld1_u8(pu1_src_tmp);
vmlsl.u8 q6, d3, d23
vmlsl.u8 q6, d2, d22
vrhadd.u8 d8, d8, d20
vmlal.u8 q6, d4, d24
vmlal.u8 q6, d5, d25
vhadd.s16 q5, q5, q15
vdup.16 q7, r11
vmlal.u8 q6, d6, d26
vmlal.u8 q6, d7, d27
add r14, r1, r6
vmlsl.u8 q6, d16, d28
vst1.8 {d8}, [r1]! ;vst1_u8(pu1_dst,sto_res);
vmlsl.u8 q6, d17, d29
vld1.u8 {d20}, [r14]
vqrshrun.s16 d10, q5, #6 ;sto_res = vqmovun_s16(sto_res_tmp);
vld1.u8 {d18}, [r3], r2 ;src_tmp3 = vld1_u8(pu1_src_tmp);
vmlsl.u8 q7, d4, d23
vmlsl.u8 q7, d3, d22
vrhadd.u8 d10, d10, d20
vmlal.u8 q7, d5, d24
vmlal.u8 q7, d6, d25
vhadd.s16 q6, q6, q15
vmlal.u8 q7, d7, d26
vmlal.u8 q7, d16, d27
vmlsl.u8 q7, d17, d28
vmlsl.u8 q7, d18, d29
vst1.8 {d10}, [r14], r6 ;vst1_u8(pu1_dst_tmp,sto_res);
vqrshrun.s16 d12, q6, #6
epilog_end
vld1.u8 {d20}, [r14]
vrhadd.u8 d12, d12, d20
vst1.8 {d12}, [r14], r6
vhadd.s16 q7, q7, q15
vqrshrun.s16 d14, q7, #6
vld1.u8 {d20}, [r14]
vrhadd.u8 d14, d14, d20
vst1.8 {d14}, [r14], r6
end_loops
tst r5, #7
ldr r1, [sp], #4
ldr r0, [sp], #4
vpopeq {d8 - d15}
ldmfdeq sp!, {r4 - r12, r15} ;reload the registers from sp
mov r5, #4
add r0, r0, #8
add r1, r1, #8
mov r7, #16
core_loop_wd_4
rsb r9, r5, r6, lsl #2 ;r6->dst_strd r5 ->wd
rsb r8, r5, r2, lsl #2 ;r2->src_strd
vmov.i8 d4, #0
outer_loop_wd_4
subs r12, r5, #0
ble end_inner_loop_wd_4 ;outer loop jump
inner_loop_wd_4
add r3, r0, r2
vld1.u32 {d4[1]},[r3], r2 ;src_tmp1 = vld1_lane_u32((uint32_t
; *)pu1_src_tmp, src_tmp1, 1);
subs r12, r12, #4
vdup.u32 d5, d4[1] ;src_tmp2 = vdup_lane_u32(src_tmp1,
; 1);
vld1.u32 {d5[1]},[r3], r2 ;src_tmp2 = vld1_lane_u32((uint32_t
; *)pu1_src_tmp, src_tmp2, 1);
vld1.u32 {d4[0]},[r0] ;src_tmp1 = vld1_lane_u32((uint32_t
; *)pu1_src_tmp, src_tmp1, 0);
vdup.16 q0, r11
vmlsl.u8 q0, d5, d23 ;mul_res1 =
; vmull_u8(vreinterpret_u8_u32(src_tmp2), coeffabs_1);
vdup.u32 d6, d5[1] ;src_tmp3 = vdup_lane_u32(src_tmp2,
; 1);
add r0, r0, #4
vld1.u32 {d6[1]},[r3], r2 ;src_tmp3 = vld1_lane_u32((uint32_t
; *)pu1_src_tmp, src_tmp3, 1);
vmlsl.u8 q0, d4, d22 ;mul_res1 = vmlsl_u8(mul_res1,
; vreinterpret_u8_u32(src_tmp1), coeffabs_0);
vdup.u32 d7, d6[1] ;src_tmp4 = vdup_lane_u32(src_tmp3,
; 1);
vld1.u32 {d7[1]},[r3], r2 ;src_tmp4 = vld1_lane_u32((uint32_t
; *)pu1_src_tmp, src_tmp4, 1);
vmlal.u8 q0, d6, d24 ;mul_res1 = vmlsl_u8(mul_res1,
; vreinterpret_u8_u32(src_tmp3), coeffabs_2);
vdup.16 q4, r11
vmlsl.u8 q4, d7, d23
vdup.u32 d4, d7[1] ;src_tmp1 = vdup_lane_u32(src_tmp4,
; 1);
vmull.u8 q1, d7, d25 ;mul_res2 =
; vmull_u8(vreinterpret_u8_u32(src_tmp4), coeffabs_3);
vld1.u32 {d4[1]},[r3], r2 ;src_tmp1 = vld1_lane_u32((uint32_t
; *)pu1_src_tmp, src_tmp1, 1);
vmlsl.u8 q4, d6, d22
vmlal.u8 q0, d4, d26 ;mul_res1 = vmlal_u8(mul_res1,
; vreinterpret_u8_u32(src_tmp1), coeffabs_4);
vdup.u32 d5, d4[1] ;src_tmp2 = vdup_lane_u32(src_tmp1,
; 1);
vmlal.u8 q4, d4, d24
vld1.u32 {d5[1]},[r3], r2 ;src_tmp2 = vld1_lane_u32((uint32_t
; *)pu1_src_tmp, src_tmp2, 1);
vmlal.u8 q1, d5, d27 ;mul_res2 = vmlsl_u8(mul_res2,
; vreinterpret_u8_u32(src_tmp2), coeffabs_5);
vdup.u32 d6, d5[1] ;src_tmp3 = vdup_lane_u32(src_tmp2,
; 1);
vmlal.u8 q4, d5, d25
vld1.u32 {d6[1]},[r3], r2 ;src_tmp3 = vld1_lane_u32((uint32_t
; *)pu1_src_tmp, src_tmp3, 1);
vmlsl.u8 q0, d6, d28 ;mul_res1 = vmlal_u8(mul_res1,
; vreinterpret_u8_u32(src_tmp3), coeffabs_6);
vdup.u32 d7, d6[1] ;src_tmp4 = vdup_lane_u32(src_tmp3,
; 1);
vmlal.u8 q4, d6, d26
vld1.u32 {d7[1]},[r3], r2 ;src_tmp4 = vld1_lane_u32((uint32_t
; *)pu1_src_tmp, src_tmp4, 1);
vmlsl.u8 q1, d7, d29 ;mul_res2 = vmlsl_u8(mul_res2,
; vreinterpret_u8_u32(src_tmp4), coeffabs_7);
vdup.u32 d4, d7[1]
vadd.i16 q0, q0, q1 ;mul_res1 = vaddq_u16(mul_res1,
; mul_res2);
vmlal.u8 q4, d7, d27
vld1.u32 {d4[1]},[r3], r2
vmlsl.u8 q4, d4, d28
vdup.u32 d5, d4[1]
vhadd.s16 q0, q0, q15
vqrshrun.s16 d0, q0, #6 ;sto_res = vqmovun_s16(sto_res_tmp);
vld1.u32 {d5[1]},[r3]
add r3, r1, r6
vld1.u32 {d20[0]}, [r1]
vld1.u32 {d20[1]}, [r3]
vrhadd.u8 d0, d0, d20
vst1.32 {d0[0]},[r1] ;vst1_lane_u32((uint32_t *)pu1_dst,
; vreinterpret_u32_u8(sto_res), 0);
vmlsl.u8 q4, d5, d29
vst1.32 {d0[1]},[r3], r6 ;vst1_lane_u32((uint32_t
; *)pu1_dst_tmp, vreinterpret_u32_u8(sto_res), 1);
vhadd.s16 q4, q4, q15
vqrshrun.s16 d8, q4, #6
mov r4, r3
vld1.u32 {d20[0]}, [r4], r6
vld1.u32 {d20[1]}, [r4]
vrhadd.u8 d8, d8, d20
vst1.32 {d8[0]},[r3], r6
add r1, r1, #4
vst1.32 {d8[1]},[r3]
bgt inner_loop_wd_4
end_inner_loop_wd_4
subs r7, r7, #4
add r1, r1, r9
add r0, r0, r8
bgt outer_loop_wd_4
vpop {d8 - d15}
ldmfd sp!, {r4 - r12, r15} ;reload the registers from sp
ENDP
END