| ; |
| ; 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 |