diff options
Diffstat (limited to 'common/arm/ihevc_itrans_recon_32x32.s')
-rw-r--r-- | common/arm/ihevc_itrans_recon_32x32.s | 2863 |
1 files changed, 2863 insertions, 0 deletions
diff --git a/common/arm/ihevc_itrans_recon_32x32.s b/common/arm/ihevc_itrans_recon_32x32.s new file mode 100644 index 0000000..eeb1d66 --- /dev/null +++ b/common/arm/ihevc_itrans_recon_32x32.s @@ -0,0 +1,2863 @@ +@/***************************************************************************** +@* +@* Copyright (C) 2012 Ittiam Systems Pvt Ltd, Bangalore +@* +@* 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. +@* +@*****************************************************************************/ +@/** +@ ******************************************************************************* +@ * @file +@ * ihevc_itrans_recon_8x8_neon.s +@ * +@ * @brief +@ * contains function definitions for single stage inverse transform +@ * +@ * @author +@ * anand s +@ * +@ * @par list of functions: +@ * - ihevc_itrans_recon_32x32() +@ * +@ * @remarks +@ * the input buffer is being corrupted +@ * +@ ******************************************************************************* +@*/ + +@/** +@ ******************************************************************************* +@ * +@ * @brief +@ * this function performs inverse transform and reconstruction for 8x8 +@ * input block +@ * +@ * @par description: +@ * performs inverse transform and adds the prediction data and clips output +@ * to 8 bit +@ * +@ * @param[in] pi2_src +@ * input 16x16 coefficients +@ * +@ * @param[in] pi2_tmp +@ * temporary 16x16 buffer for storing inverse +@ * +@ * transform +@ * 1st stage output +@ * +@ * @param[in] pu1_pred +@ * prediction 16x16 block +@ * +@ * @param[out] pu1_dst +@ * output 8x8 block +@ * +@ * @param[in] src_strd +@ * input stride +@ * +@ * @param[in] pred_strd +@ * prediction stride +@ * +@ * @param[in] dst_strd +@ * output stride +@ * +@ * @param[in] shift +@ * output shift +@ * +@ * @param[in] r12 +@ * zero columns in pi2_src +@ * +@ * @returns void +@ * +@ * @remarks +@ * none +@ * +@ ******************************************************************************* +@ */ + +@void ihevc_itrans_recon_32x32(word16 *pi2_src, +@ word16 *pi2_tmp, +@ uword8 *pu1_pred, +@ uword8 *pu1_dst, +@ word32 src_strd, +@ word32 pred_strd, +@ word32 dst_strd, +@ word32 r12 +@ word32 r11 ) + +@**************variables vs registers************************* +@ r0 => *pi2_src +@ r1 => *pi2_tmp +@ r2 => *pu1_pred +@ r3 => *pu1_dst +@ src_strd +@ pred_strd +@ dst_strd +@ r12 +@ r11 + + +@d0[0]= 64 d2[0]=83 +@d0[1]= 90 d2[1]=82 +@d0[2]= 90 d2[2]=80 +@d0[3]= 90 d2[3]=78 +@d1[0]= 89 d3[0]=75 +@d1[1]= 88 d3[1]=73 +@d1[2]= 87 d3[2]=70 +@d1[3]= 85 d3[3]=67 + +@d4[0]= 64 d6[0]=36 +@d4[1]= 61 d6[1]=31 +@d4[2]= 57 d6[2]=25 +@d4[3]= 54 d6[3]=22 +@d5[0]= 50 d7[0]=18 +@d5[1]= 46 d7[1]=13 +@d5[2]= 43 d7[2]=9 +@d5[3]= 38 d7[3]=4 + +.text +.align 4 + + + + + +.set shift_stage1_idct , 7 +.set shift_stage2_idct , 12 + +@#define zero_cols r12 +@#define zero_rows r11 + +.globl ihevc_itrans_recon_32x32_a9q + +.extern g_ai2_ihevc_trans_32_transpose + +g_ai2_ihevc_trans_32_transpose_addr: +.long g_ai2_ihevc_trans_32_transpose - ulbl1 - 8 + +r5_addr: .word 0xfffff000 +r9_addr: .word 0xffff0000 + +.type ihevc_itrans_recon_32x32_a9q, %function + +ihevc_itrans_recon_32x32_a9q: + + stmfd sp!,{r0-r12,lr} + + +@ldr r8,[sp,#56] @ prediction stride +@ldr r7,[sp,#64] @ destination stride + ldr r6,[sp,#56] @ src stride + ldr r12,[sp,#68] + ldr r11,[sp,#72] + mov r6,r6,lsl #1 @ x sizeof(word16) + add r10,r6,r6, lsl #1 @ 3 rows + + + mov r8,r0 + + ldr r14,g_ai2_ihevc_trans_32_transpose_addr +ulbl1: + add r14,r14,pc + vld1.16 {d0,d1,d2,d3},[r14]! + vld1.16 {d4,d5,d6,d7},[r14]! + +@registers which are free +@ r10,r9,r11,r12 + mov r9,#0xffffff00 + mov r10,#0xfffffff0 + ldr r5,r5_addr + ldr r7,r9_addr + cmp r12,r10 + movhs r14,#1 + bhs stage1 + + + cmp r12,r9 + movhs r14,#2 + bhs stage1 + + cmp r12,r5 + movhs r14,#3 + bhs stage1 + + cmp r12,r7 + movhs r14,#4 + + mov r14,#8 + b stage1 +@.ltorg + + +dct_stage1: + add r8,r8,#8 + mov r0,r8 + +stage1: + vld1.16 d10,[r0],r6 + vld1.16 d8,[r0],r6 + vld1.16 d11,[r0],r6 + vld1.16 d9,[r0],r6 + + vmull.s16 q12,d8,d0[1] @// y1 * cos1(part of b0) + vmull.s16 q13,d8,d0[3] @// y1 * cos3(part of b1) + vmull.s16 q14,d8,d1[1] @// y1 * sin3(part of b2) + vmull.s16 q15,d8,d1[3] @// y1 * sin1(part of b3) + + vmlal.s16 q12,d9,d0[3] @// y1 * cos1 + y3 * cos3(part of b0) + vmlal.s16 q13,d9,d2[1] @// y1 * cos3 - y3 * sin1(part of b1) + vmlal.s16 q14,d9,d3[3] @// y1 * sin3 - y3 * cos1(part of b2) + vmlal.s16 q15,d9,d5[1] @// y1 * sin1 - y3 * sin3(part of b3) + + + + + + vmull.s16 q10,d10,d0[0] + vmlal.s16 q10,d11,d0[2] + + + vmull.s16 q11,d10,d0[0] + vmlal.s16 q11,d11,d1[2] + + vmull.s16 q8,d10,d0[0] + vmlal.s16 q8,d11,d2[2] + + vmull.s16 q9,d10,d0[0] + vmlal.s16 q9,d11,d3[2] + cmp r11,r10 + bhs shift1 + + vld1.16 d12,[r0],r6 + vld1.16 d14,[r0],r6 + vld1.16 d13,[r0],r6 + vld1.16 d15,[r0],r6 + + + + + + + + vmlal.s16 q12,d14,d1[1] + vmlal.s16 q13,d14,d3[3] + vmlal.s16 q14,d14,d6[1] + vmlsl.s16 q15,d14,d7[1] + + + vmlal.s16 q12,d15,d1[3] + vmlal.s16 q13,d15,d5[1] + vmlsl.s16 q14,d15,d7[1] + vmlsl.s16 q15,d15,d3[3] + + + vmlal.s16 q10,d12,d1[0] + vmlal.s16 q10,d13,d1[2] + vmlal.s16 q11,d12,d3[0] + vmlal.s16 q11,d13,d4[2] + vmlal.s16 q8,d12,d5[0] + vmlal.s16 q8,d13,d7[2] + vmlal.s16 q9,d12,d7[0] + vmlsl.s16 q9,d13,d5[2] + + cmp r11,r9 + bhs shift1 + + vld1.16 d10,[r0],r6 + vld1.16 d8,[r0],r6 + vld1.16 d11,[r0],r6 + vld1.16 d9,[r0],r6 + + + vmlal.s16 q12,d8,d2[1] @// y1 * cos1(part of b0) + vmlal.s16 q13,d8,d6[3] @// y1 * cos3(part of b1) + vmlsl.s16 q14,d8,d4[3] @// y1 * sin3(part of b2) + vmlsl.s16 q15,d8,d0[1] @// y1 * sin1(part of b3) + + vmlal.s16 q12,d9,d2[3] @// y1 * cos1 + y3 * cos3(part of b0) + vmlsl.s16 q13,d9,d7[3] @// y1 * cos3 - y3 * sin1(part of b1) + vmlsl.s16 q14,d9,d2[1] @// y1 * sin3 - y3 * cos1(part of b2) + vmlsl.s16 q15,d9,d3[1] @// y1 * sin1 - y3 * sin3(part of b3) + + + + + + vmlal.s16 q10,d10,d2[0] + vmlal.s16 q10,d11,d2[2] + + + vmlal.s16 q11,d10,d6[0] + vmlal.s16 q11,d11,d7[2] + + vmlsl.s16 q8,d10,d6[0] + vmlsl.s16 q8,d11,d3[2] + + vmlsl.s16 q9,d10,d2[0] + vmlsl.s16 q9,d11,d1[2] + + cmp r11,r5 + bhs shift1 + + + vld1.16 d12,[r0],r6 + vld1.16 d14,[r0],r6 + vld1.16 d13,[r0],r6 + vld1.16 d15,[r0],r6 + + + + + + + + + + vmlal.s16 q12,d14,d3[1] + vmlsl.s16 q13,d14,d6[1] + vmlsl.s16 q14,d14,d0[1] + vmlsl.s16 q15,d14,d6[3] + + + vmlal.s16 q12,d15,d3[3] + vmlsl.s16 q13,d15,d4[3] + vmlsl.s16 q14,d15,d2[3] + vmlal.s16 q15,d15,d5[3] + + + vmlal.s16 q10,d12,d3[0] + vmlal.s16 q10,d13,d3[2] + vmlsl.s16 q11,d12,d7[0] + vmlsl.s16 q11,d13,d5[2] + vmlsl.s16 q8,d12,d1[0] + vmlsl.s16 q8,d13,d1[2] + vmlsl.s16 q9,d12,d5[0] + vmlal.s16 q9,d13,d7[2] + + cmp r11,r7 + bhs shift1 + + + vld1.16 d10,[r0],r6 + vld1.16 d8,[r0],r6 + vld1.16 d11,[r0],r6 + vld1.16 d9,[r0],r6 + + + + vmlal.s16 q12,d8,d4[1] @// y1 * cos1(part of b0) + vmlsl.s16 q13,d8,d3[1] @// y1 * cos3(part of b1) + vmlsl.s16 q14,d8,d5[1] @// y1 * sin3(part of b2) + vmlal.s16 q15,d8,d2[1] @// y1 * sin1(part of b3) + + vmlal.s16 q12,d9,d4[3] @// y1 * cos1 + y3 * cos3(part of b0) + vmlsl.s16 q13,d9,d1[3] @// y1 * cos3 - y3 * sin1(part of b1) + vmlsl.s16 q14,d9,d7[3] @// y1 * sin3 - y3 * cos1(part of b2) + vmlal.s16 q15,d9,d1[1] @// y1 * sin1 - y3 * sin3(part of b3) + + + + + + vmlal.s16 q10,d10,d0[0] + vmlal.s16 q10,d11,d4[2] + + + vmlsl.s16 q11,d10,d0[0] + vmlsl.s16 q11,d11,d2[2] + + vmlsl.s16 q8,d10,d0[0] + vmlsl.s16 q8,d11,d6[2] + + vmlal.s16 q9,d10,d0[0] + vmlal.s16 q9,d11,d0[2] + + + + vld1.16 d12,[r0],r6 + vld1.16 d14,[r0],r6 + vld1.16 d13,[r0],r6 + vld1.16 d15,[r0],r6 + + + + + vmlal.s16 q12,d14,d5[1] + vmlsl.s16 q13,d14,d0[2] + vmlal.s16 q14,d14,d5[3] + vmlal.s16 q15,d14,d4[3] + + + vmlal.s16 q12,d15,d5[3] + vmlsl.s16 q13,d15,d1[1] + vmlal.s16 q14,d15,d3[1] + vmlsl.s16 q15,d15,d7[3] + + + vmlal.s16 q10,d12,d5[0] + vmlal.s16 q10,d13,d5[2] + vmlsl.s16 q11,d12,d1[0] + vmlsl.s16 q11,d13,d0[2] + vmlal.s16 q8,d12,d7[0] + vmlal.s16 q8,d13,d4[2] + vmlal.s16 q9,d12,d3[0] + vmlal.s16 q9,d13,d6[2] + + + vld1.16 d10,[r0],r6 + vld1.16 d8,[r0],r6 + vld1.16 d11,[r0],r6 + vld1.16 d9,[r0],r6 + + + + + + + + vmlal.s16 q12,d8,d6[1] @// y1 * cos1(part of b0) + vmlsl.s16 q13,d8,d2[3] @// y1 * cos3(part of b1) + vmlal.s16 q14,d8,d0[1] @// y1 * sin3(part of b2) + vmlsl.s16 q15,d8,d4[1] @// y1 * sin1(part of b3) + + vmlal.s16 q12,d9,d6[3] @// y1 * cos1 + y3 * cos3(part of b0) + vmlsl.s16 q13,d9,d4[1] @// y1 * cos3 - y3 * sin1(part of b1) + vmlal.s16 q14,d9,d1[3] @// y1 * sin3 - y3 * cos1(part of b2) + vmlsl.s16 q15,d9,d0[1] @// y1 * sin1 - y3 * sin3(part of b3) + + + + + + vmlal.s16 q10,d10,d6[0] + vmlal.s16 q10,d11,d6[2] + + + vmlsl.s16 q11,d10,d2[0] + vmlsl.s16 q11,d11,d3[2] + + vmlal.s16 q8,d10,d2[0] + vmlal.s16 q8,d11,d0[2] + + vmlsl.s16 q9,d10,d6[0] + vmlsl.s16 q9,d11,d2[2] + + vld1.16 d12,[r0],r6 + vld1.16 d14,[r0],r6 + vld1.16 d13,[r0],r6 + vld1.16 d15,[r0],r6 + + + vmlal.s16 q12,d14,d7[1] + vmlsl.s16 q13,d14,d5[3] + vmlal.s16 q14,d14,d4[1] + vmlsl.s16 q15,d14,d2[3] + + + vmlal.s16 q12,d15,d7[3] + vmlsl.s16 q13,d15,d7[1] + vmlal.s16 q14,d15,d6[3] + vmlsl.s16 q15,d15,d6[1] + + + vmlal.s16 q10,d12,d7[0] + vmlal.s16 q10,d13,d7[2] + vmlsl.s16 q11,d12,d5[0] + vmlsl.s16 q11,d13,d6[2] + vmlal.s16 q8,d12,d3[0] + vmlal.s16 q8,d13,d5[2] + vmlsl.s16 q9,d12,d1[0] + vmlsl.s16 q9,d13,d4[2] + + + +shift1: + vadd.s32 q4,q10,q12 + vsub.s32 q5,q10,q12 + + vadd.s32 q6,q11,q13 + vsub.s32 q12,q11,q13 + + vadd.s32 q7,q8,q14 + vsub.s32 q13,q8,q14 + + + vadd.s32 q8,q9,q15 + vsub.s32 q14,q9,q15 + + + vqrshrn.s32 d30,q4,#shift_stage1_idct @// r0 = (a0 + b0 + rnd) >> 7(shift_stage1_idct) + vqrshrn.s32 d19,q5,#shift_stage1_idct @// r7 = (a0 - b0 + rnd) >> 7(shift_stage1_idct) + vqrshrn.s32 d31,q7,#shift_stage1_idct @// r2 = (a2 + b2 + rnd) >> 7(shift_stage1_idct) + vqrshrn.s32 d18,q13,#shift_stage1_idct @// r5 = (a2 - b2 + rnd) >> 7(shift_stage1_idct) + vqrshrn.s32 d12,q6,#shift_stage1_idct @// r1 = (a1 + b1 + rnd) >> 7(shift_stage1_idct) + vqrshrn.s32 d15,q12,#shift_stage1_idct @// r6 = (a1 - b1 + rnd) >> 7(shift_stage1_idct) + vqrshrn.s32 d13,q8,#shift_stage1_idct @// r3 = (a3 + b3 + rnd) >> 7(shift_stage1_idct) + vqrshrn.s32 d14,q14,#shift_stage1_idct @// r4 = (a3 - b3 + rnd) >> 7(shift_stage1_idct) + + + @ registers used q15,q14,q6,q7 + + + vtrn.16 q15,q6 + vtrn.16 q7,q9 + + vtrn.32 d30,d31 + vtrn.32 d12,d13 + vtrn.32 d14,d15 + vtrn.32 d18,d19 + + +@ d30 =r0 1- 4 values +@ d31 =r2 1- 4 values +@ d12=r1 1- 4 values +@ d13=r3 1- 4 values +@ d14 =r0 28-31 values +@ d15 =r2 28- 31 values +@ d18=r1 28- 31 values +@ d19=r3 28- 31 values + + + + vst1.16 {q15},[r1]! + vst1.16 {q6},[r1]! + add r1,r1,#192 + vst1.16 {q7},[r1]! + vst1.16 {q9},[r1]! + sub r1,r1,#224 + + mov r0,r8 + + + + + + vld1.16 d10,[r0],r6 + vld1.16 d8,[r0],r6 + vld1.16 d11,[r0],r6 + vld1.16 d9,[r0],r6 + + + + + vmull.s16 q12,d8,d2[1] @// y1 * cos1(part of b0) + vmull.s16 q13,d8,d2[3] @// y1 * cos3(part of b1) + vmull.s16 q14,d8,d3[1] @// y1 * sin3(part of b2) + vmull.s16 q15,d8,d3[3] @// y1 * sin1(part of b3) + + vmlal.s16 q12,d9,d6[3] @// y1 * cos1 + y3 * cos3(part of b0) + vmlsl.s16 q13,d9,d7[3] @// y1 * cos3 - y3 * sin1(part of b1) + vmlsl.s16 q14,d9,d6[1] @// y1 * sin3 - y3 * cos1(part of b2) + vmlsl.s16 q15,d9,d4[3] @// y1 * sin1 - y3 * sin3(part of b3) + + + + + + vmull.s16 q10,d10,d0[0] + vmlal.s16 q10,d11,d4[2] + + + vmull.s16 q11,d10,d0[0] + vmlal.s16 q11,d11,d5[2] + + vmull.s16 q8,d10,d0[0] + vmlal.s16 q8,d11,d6[2] + + vmull.s16 q9,d10,d0[0] + vmlal.s16 q9,d11,d7[2] + cmp r11,r10 + bhs shift2 + + vld1.16 d12,[r0],r6 + vld1.16 d14,[r0],r6 + vld1.16 d13,[r0],r6 + vld1.16 d15,[r0],r6 + + + vmlsl.s16 q12,d14,d4[3] + vmlsl.s16 q13,d14,d2[1] + vmlsl.s16 q14,d14,d0[1] + vmlsl.s16 q15,d14,d2[3] + + + vmlsl.s16 q12,d15,d0[3] + vmlsl.s16 q13,d15,d3[1] + vmlsl.s16 q14,d15,d6[3] + vmlal.s16 q15,d15,d5[3] + + + vmlsl.s16 q10,d12,d7[0] + vmlsl.s16 q10,d13,d2[2] + vmlsl.s16 q11,d12,d5[0] + vmlsl.s16 q11,d13,d0[2] + vmlsl.s16 q8,d12,d3[0] + vmlsl.s16 q8,d13,d3[2] + vmlsl.s16 q9,d12,d1[0] + vmlsl.s16 q9,d13,d6[2] + + cmp r11,r9 + bhs shift2 + + + vld1.16 d10,[r0],r6 + vld1.16 d8,[r0],r6 + vld1.16 d11,[r0],r6 + vld1.16 d9,[r0],r6 + + + + + + + + vmlsl.s16 q12,d8,d4[1] @// y1 * cos1(part of b0) + vmlal.s16 q13,d8,d7[1] @// y1 * cos3(part of b1) + vmlal.s16 q14,d8,d2[3] @// y1 * sin3(part of b2) + vmlal.s16 q15,d8,d1[3] @// y1 * sin1(part of b3) + + vmlal.s16 q12,d9,d7[1] @// y1 * cos1 + y3 * cos3(part of b0) + vmlal.s16 q13,d9,d1[3] @// y1 * cos3 - y3 * sin1(part of b1) + vmlal.s16 q14,d9,d3[3] @// y1 * sin3 - y3 * cos1(part of b2) + vmlsl.s16 q15,d9,d6[3] @// y1 * sin1 - y3 * sin3(part of b3) + + + + + + vmlsl.s16 q10,d10,d2[0] + vmlsl.s16 q10,d11,d6[2] + + + vmlsl.s16 q11,d10,d6[0] + vmlal.s16 q11,d11,d4[2] + + vmlal.s16 q8,d10,d6[0] + vmlal.s16 q8,d11,d0[2] + + vmlal.s16 q9,d10,d2[0] + vmlal.s16 q9,d11,d5[2] + + cmp r11,r5 + bhs shift2 + + + vld1.16 d12,[r0],r6 + vld1.16 d14,[r0],r6 + vld1.16 d13,[r0],r6 + vld1.16 d15,[r0],r6 + + + + + + vmlal.s16 q12,d14,d2[3] + vmlal.s16 q13,d14,d3[3] + vmlsl.s16 q14,d14,d5[3] + vmlsl.s16 q15,d14,d0[3] + + + vmlal.s16 q12,d15,d1[3] + vmlsl.s16 q13,d15,d6[3] + vmlsl.s16 q14,d15,d0[3] + vmlal.s16 q15,d15,d7[3] + + + vmlal.s16 q10,d12,d5[0] + vmlal.s16 q10,d13,d0[2] + vmlal.s16 q11,d12,d1[0] + vmlal.s16 q11,d13,d6[2] + vmlal.s16 q8,d12,d7[0] + vmlsl.s16 q8,d13,d2[2] + vmlsl.s16 q9,d12,d3[0] + vmlsl.s16 q9,d13,d4[2] + + + cmp r11,r7 + bhs shift2 + + + vld1.16 d10,[r0],r6 + vld1.16 d8,[r0],r6 + vld1.16 d11,[r0],r6 + vld1.16 d9,[r0],r6 + + + + + + + + vmlal.s16 q12,d8,d6[1] @// y1 * cos1(part of b0) + vmlsl.s16 q13,d8,d1[1] @// y1 * cos3(part of b1) + vmlsl.s16 q14,d8,d7[1] @// y1 * sin3(part of b2) + vmlal.s16 q15,d8,d0[3] @// y1 * sin1(part of b3) + + vmlsl.s16 q12,d9,d5[1] @// y1 * cos1 + y3 * cos3(part of b0) + vmlsl.s16 q13,d9,d4[1] @// y1 * cos3 - y3 * sin1(part of b1) + vmlal.s16 q14,d9,d2[1] @// y1 * sin3 - y3 * cos1(part of b2) + vmlal.s16 q15,d9,d7[1] @// y1 * sin1 - y3 * sin3(part of b3) + + + + + + vmlal.s16 q10,d10,d0[0] + vmlsl.s16 q10,d11,d7[2] + + + vmlsl.s16 q11,d10,d0[0] + vmlsl.s16 q11,d11,d1[2] + + vmlsl.s16 q8,d10,d0[0] + vmlal.s16 q8,d11,d5[2] + + vmlal.s16 q9,d10,d0[0] + vmlal.s16 q9,d11,d3[2] + + + + vld1.16 d12,[r0],r6 + vld1.16 d14,[r0],r6 + vld1.16 d13,[r0],r6 + vld1.16 d15,[r0],r6 + + + vmlsl.s16 q12,d14,d0[1] + vmlal.s16 q13,d14,d6[1] + vmlal.s16 q14,d14,d4[1] + vmlsl.s16 q15,d14,d1[1] + + + vmlsl.s16 q12,d15,d3[3] + vmlal.s16 q13,d15,d0[1] + vmlsl.s16 q14,d15,d5[1] + vmlsl.s16 q15,d15,d6[1] + + + vmlsl.s16 q10,d12,d3[0] + vmlsl.s16 q10,d13,d1[2] + vmlsl.s16 q11,d12,d7[0] + vmlal.s16 q11,d13,d3[2] + vmlal.s16 q8,d12,d1[0] + vmlal.s16 q8,d13,d7[2] + vmlsl.s16 q9,d12,d5[0] + vmlsl.s16 q9,d13,d2[2] + + vld1.16 d10,[r0],r6 + vld1.16 d8,[r0],r6 + vld1.16 d11,[r0],r6 + vld1.16 d9,[r0],r6 + + + + + vmlal.s16 q12,d8,d7[3] @// y1 * cos1(part of b0) + vmlal.s16 q13,d8,d4[3] @// y1 * cos3(part of b1) + vmlsl.s16 q14,d8,d1[1] @// y1 * sin3(part of b2) + vmlal.s16 q15,d8,d2[1] @// y1 * sin1(part of b3) + + vmlal.s16 q12,d9,d3[1] @// y1 * cos1 + y3 * cos3(part of b0) + vmlsl.s16 q13,d9,d5[3] @// y1 * cos3 - y3 * sin1(part of b1) + vmlsl.s16 q14,d9,d7[3] @// y1 * sin3 - y3 * cos1(part of b2) + vmlal.s16 q15,d9,d5[1] @// y1 * sin1 - y3 * sin3(part of b3) + + + + + + vmlsl.s16 q10,d10,d6[0] + vmlal.s16 q10,d11,d5[2] + + + vmlal.s16 q11,d10,d2[0] + vmlal.s16 q11,d11,d7[2] + + vmlsl.s16 q8,d10,d2[0] + vmlsl.s16 q8,d11,d4[2] + + vmlal.s16 q9,d10,d6[0] + vmlal.s16 q9,d11,d1[2] + + + vld1.16 d12,[r0],r6 + vld1.16 d14,[r0],r6 + vld1.16 d13,[r0],r6 + vld1.16 d15,[r0],r6 + + + + + + vmlal.s16 q12,d14,d1[1] + vmlsl.s16 q13,d14,d0[3] + vmlal.s16 q14,d14,d1[3] + vmlsl.s16 q15,d14,d3[1] + + + vmlal.s16 q12,d15,d5[3] + vmlsl.s16 q13,d15,d5[1] + vmlal.s16 q14,d15,d4[3] + vmlsl.s16 q15,d15,d4[1] + + + vmlal.s16 q10,d12,d1[0] + vmlal.s16 q10,d13,d3[2] + vmlsl.s16 q11,d12,d3[0] + vmlsl.s16 q11,d13,d2[2] + vmlal.s16 q8,d12,d5[0] + vmlal.s16 q8,d13,d1[2] + vmlsl.s16 q9,d12,d7[0] + vmlsl.s16 q9,d13,d0[2] + +shift2: + vadd.s32 q4,q10,q12 + vsub.s32 q5,q10,q12 + + vadd.s32 q6,q11,q13 + vsub.s32 q12,q11,q13 + + vadd.s32 q7,q8,q14 + vsub.s32 q13,q8,q14 + + + vadd.s32 q8,q9,q15 + vsub.s32 q14,q9,q15 + + + vqrshrn.s32 d30,q4,#shift_stage1_idct @// r0 = (a0 + b0 + rnd) >> 7(shift_stage1_idct) + vqrshrn.s32 d19,q5,#shift_stage1_idct @// r7 = (a0 - b0 + rnd) >> 7(shift_stage1_idct) + vqrshrn.s32 d31,q7,#shift_stage1_idct @// r2 = (a2 + b2 + rnd) >> 7(shift_stage1_idct) + vqrshrn.s32 d18,q13,#shift_stage1_idct @// r5 = (a2 - b2 + rnd) >> 7(shift_stage1_idct) + vqrshrn.s32 d12,q6,#shift_stage1_idct @// r1 = (a1 + b1 + rnd) >> 7(shift_stage1_idct) + vqrshrn.s32 d15,q12,#shift_stage1_idct @// r6 = (a1 - b1 + rnd) >> 7(shift_stage1_idct) + vqrshrn.s32 d13,q8,#shift_stage1_idct @// r3 = (a3 + b3 + rnd) >> 7(shift_stage1_idct) + vqrshrn.s32 d14,q14,#shift_stage1_idct @// r4 = (a3 - b3 + rnd) >> 7(shift_stage1_idct) + + vtrn.16 q15,q6 + vtrn.16 q7,q9 + + vtrn.32 d30,d31 + vtrn.32 d12,d13 + vtrn.32 d14,d15 + vtrn.32 d18,d19 + + + vst1.16 {q15},[r1]! + vst1.16 {q6},[r1]! + add r1,r1,#128 + vst1.16 {q7},[r1]! + vst1.16 {q9},[r1]! + sub r1,r1,#160 + mov r0,r8 + + + + vld1.16 d10,[r0],r6 + vld1.16 d8,[r0],r6 + vld1.16 d11,[r0],r6 + vld1.16 d9,[r0],r6 + + + vmull.s16 q12,d8,d4[1] @// y1 * cos1(part of b0) + vmull.s16 q13,d8,d4[3] @// y1 * cos3(part of b1) + vmull.s16 q14,d8,d5[1] @// y1 * sin3(part of b2) + vmull.s16 q15,d8,d5[3] @// y1 * sin1(part of b3) + + vmlsl.s16 q12,d9,d3[1] @// y1 * cos1 + y3 * cos3(part of b0) + vmlsl.s16 q13,d9,d1[3] @// y1 * cos3 - y3 * sin1(part of b1) + vmlsl.s16 q14,d9,d0[2] @// y1 * sin3 - y3 * cos1(part of b2) + vmlsl.s16 q15,d9,d1[1] @// y1 * sin1 - y3 * sin3(part of b3) + + + + + + vmull.s16 q10,d10,d0[0] + vmlsl.s16 q10,d11,d7[2] + + + vmull.s16 q11,d10,d0[0] + vmlsl.s16 q11,d11,d6[2] + + vmull.s16 q8,d10,d0[0] + vmlsl.s16 q8,d11,d5[2] + + vmull.s16 q9,d10,d0[0] + vmlsl.s16 q9,d11,d4[2] + + cmp r11,r10 + bhs shift3 + + vld1.16 d12,[r0],r6 + vld1.16 d14,[r0],r6 + vld1.16 d13,[r0],r6 + vld1.16 d15,[r0],r6 + + + + + vmlsl.s16 q12,d14,d5[1] + vmlsl.s16 q13,d14,d7[3] + vmlal.s16 q14,d14,d5[3] + vmlal.s16 q15,d14,d3[1] + + + vmlal.s16 q12,d15,d2[1] + vmlal.s16 q13,d15,d1[1] + vmlal.s16 q14,d15,d4[3] + vmlsl.s16 q15,d15,d7[3] + + + vmlsl.s16 q10,d12,d1[0] + vmlal.s16 q10,d13,d6[2] + vmlsl.s16 q11,d12,d3[0] + vmlal.s16 q11,d13,d3[2] + vmlsl.s16 q8,d12,d5[0] + vmlal.s16 q8,d13,d0[2] + vmlsl.s16 q9,d12,d7[0] + vmlal.s16 q9,d13,d2[2] + + cmp r11,r9 + bhs shift3 + + vld1.16 d10,[r0],r6 + vld1.16 d8,[r0],r6 + vld1.16 d11,[r0],r6 + vld1.16 d9,[r0],r6 + + vmlal.s16 q12,d8,d6[1] @// y1 * cos1(part of b0) + vmlsl.s16 q13,d8,d5[1] @// y1 * cos3(part of b1) + vmlsl.s16 q14,d8,d0[3] @// y1 * sin3(part of b2) + vmlsl.s16 q15,d8,d3[3] @// y1 * sin1(part of b3) + + vmlsl.s16 q12,d9,d1[1] @// y1 * cos1 + y3 * cos3(part of b0) + vmlsl.s16 q13,d9,d4[1] @// y1 * cos3 - y3 * sin1(part of b1) + vmlal.s16 q14,d9,d6[1] @// y1 * sin3 - y3 * cos1(part of b2) + vmlal.s16 q15,d9,d0[1] @// y1 * sin1 - y3 * sin3(part of b3) + + + + + + vmlal.s16 q10,d10,d2[0] + vmlsl.s16 q10,d11,d5[2] + + + vmlal.s16 q11,d10,d6[0] + vmlsl.s16 q11,d11,d0[2] + + vmlsl.s16 q8,d10,d6[0] + vmlsl.s16 q8,d11,d4[2] + + vmlsl.s16 q9,d10,d2[0] + vmlal.s16 q9,d11,d6[2] + + cmp r11,r5 + bhs shift3 + + + vld1.16 d12,[r0],r6 + vld1.16 d14,[r0],r6 + vld1.16 d13,[r0],r6 + vld1.16 d15,[r0],r6 + + + + + + + vmlsl.s16 q12,d14,d7[1] + vmlal.s16 q13,d14,d2[1] + vmlal.s16 q14,d14,d4[1] + vmlsl.s16 q15,d14,d5[1] + + + vmlal.s16 q12,d15,d0[3] + vmlal.s16 q13,d15,d7[1] + vmlsl.s16 q14,d15,d1[1] + vmlsl.s16 q15,d15,d6[1] + + + vmlsl.s16 q10,d12,d3[0] + vmlal.s16 q10,d13,d4[2] + vmlal.s16 q11,d12,d7[0] + vmlal.s16 q11,d13,d2[2] + vmlal.s16 q8,d12,d1[0] + vmlsl.s16 q8,d13,d6[2] + vmlal.s16 q9,d12,d5[0] + vmlsl.s16 q9,d13,d0[2] + + + cmp r11,r7 + bhs shift3 + + + vld1.16 d10,[r0],r6 + vld1.16 d8,[r0],r6 + vld1.16 d11,[r0],r6 + vld1.16 d9,[r0],r6 + + + vmlsl.s16 q12,d8,d7[3] @// y1 * cos1(part of b0) + vmlsl.s16 q13,d8,d0[1] @// y1 * cos3(part of b1) + vmlal.s16 q14,d8,d6[3] @// y1 * sin3(part of b2) + vmlal.s16 q15,d8,d1[3] @// y1 * sin1(part of b3) + + vmlsl.s16 q12,d9,d0[1] @// y1 * cos1 + y3 * cos3(part of b0) + vmlal.s16 q13,d9,d5[3] @// y1 * cos3 - y3 * sin1(part of b1) + vmlal.s16 q14,d9,d3[3] @// y1 * sin3 - y3 * cos1(part of b2) + vmlsl.s16 q15,d9,d2[3] @// y1 * sin1 - y3 * sin3(part of b3) + + + + + + vmlal.s16 q10,d10,d0[0] + vmlsl.s16 q10,d11,d3[2] + + + vmlsl.s16 q11,d10,d0[0] + vmlsl.s16 q11,d11,d5[2] + + vmlsl.s16 q8,d10,d0[0] + vmlal.s16 q8,d11,d1[2] + + vmlal.s16 q9,d10,d0[0] + vmlal.s16 q9,d11,d7[2] + + + vld1.16 d12,[r0],r6 + vld1.16 d14,[r0],r6 + vld1.16 d13,[r0],r6 + vld1.16 d15,[r0],r6 + + + + vmlal.s16 q12,d14,d6[3] + vmlal.s16 q13,d14,d3[3] + vmlsl.s16 q14,d14,d1[3] + vmlal.s16 q15,d14,d7[1] + + + vmlal.s16 q12,d15,d1[3] + vmlsl.s16 q13,d15,d2[3] + vmlal.s16 q14,d15,d7[1] + vmlal.s16 q15,d15,d4[1] + + + vmlsl.s16 q10,d12,d5[0] + vmlal.s16 q10,d13,d2[2] + vmlal.s16 q11,d12,d1[0] + vmlsl.s16 q11,d13,d7[2] + vmlsl.s16 q8,d12,d7[0] + vmlsl.s16 q8,d13,d3[2] + vmlsl.s16 q9,d12,d3[0] + vmlal.s16 q9,d13,d1[2] + + + + vld1.16 d10,[r0],r6 + vld1.16 d8,[r0],r6 + vld1.16 d11,[r0],r6 + vld1.16 d9,[r0],r6 + + + + + vmlsl.s16 q12,d8,d5[3] @// y1 * cos1(part of b0) + vmlsl.s16 q13,d8,d6[3] @// y1 * cos3(part of b1) + vmlal.s16 q14,d8,d3[1] @// y1 * sin3(part of b2) + vmlsl.s16 q15,d8,d0[1] @// y1 * sin1(part of b3) + + vmlsl.s16 q12,d9,d2[3] @// y1 * cos1 + y3 * cos3(part of b0) + vmlal.s16 q13,d9,d0[1] @// y1 * cos3 - y3 * sin1(part of b1) + vmlsl.s16 q14,d9,d2[1] @// y1 * sin3 - y3 * cos1(part of b2) + vmlal.s16 q15,d9,d4[3] @// y1 * sin1 - y3 * sin3(part of b3) + + + + + + vmlal.s16 q10,d10,d6[0] + vmlsl.s16 q10,d11,d1[2] + + + vmlsl.s16 q11,d10,d2[0] + vmlal.s16 q11,d11,d4[2] + + vmlal.s16 q8,d10,d2[0] + vmlsl.s16 q8,d11,d7[2] + + vmlsl.s16 q9,d10,d6[0] + vmlsl.s16 q9,d11,d5[2] + + + vld1.16 d12,[r0],r6 + vld1.16 d14,[r0],r6 + vld1.16 d13,[r0],r6 + vld1.16 d15,[r0],r6 + + vmlal.s16 q12,d14,d4[3] + vmlsl.s16 q13,d14,d6[1] + vmlal.s16 q14,d14,d7[3] + vmlal.s16 q15,d14,d6[3] + + + vmlal.s16 q12,d15,d3[3] + vmlsl.s16 q13,d15,d3[1] + vmlal.s16 q14,d15,d2[3] + vmlsl.s16 q15,d15,d2[1] + + + vmlsl.s16 q10,d12,d7[0] + vmlal.s16 q10,d13,d0[2] + vmlal.s16 q11,d12,d5[0] + vmlsl.s16 q11,d13,d1[2] + vmlsl.s16 q8,d12,d3[0] + vmlal.s16 q8,d13,d2[2] + vmlal.s16 q9,d12,d1[0] + vmlsl.s16 q9,d13,d3[2] + +shift3: + vadd.s32 q4,q10,q12 + vsub.s32 q5,q10,q12 + + vadd.s32 q6,q11,q13 + vsub.s32 q12,q11,q13 + + vadd.s32 q7,q8,q14 + vsub.s32 q13,q8,q14 + + + vadd.s32 q8,q9,q15 + vsub.s32 q14,q9,q15 + + + vqrshrn.s32 d30,q4,#shift_stage1_idct @// r0 = (a0 + b0 + rnd) >> 7(shift_stage1_idct) + vqrshrn.s32 d19,q5,#shift_stage1_idct @// r7 = (a0 - b0 + rnd) >> 7(shift_stage1_idct) + vqrshrn.s32 d31,q7,#shift_stage1_idct @// r2 = (a2 + b2 + rnd) >> 7(shift_stage1_idct) + vqrshrn.s32 d18,q13,#shift_stage1_idct @// r5 = (a2 - b2 + rnd) >> 7(shift_stage1_idct) + vqrshrn.s32 d12,q6,#shift_stage1_idct @// r1 = (a1 + b1 + rnd) >> 7(shift_stage1_idct) + vqrshrn.s32 d15,q12,#shift_stage1_idct @// r6 = (a1 - b1 + rnd) >> 7(shift_stage1_idct) + vqrshrn.s32 d13,q8,#shift_stage1_idct @// r3 = (a3 + b3 + rnd) >> 7(shift_stage1_idct) + vqrshrn.s32 d14,q14,#shift_stage1_idct @// r4 = (a3 - b3 + rnd) >> 7(shift_stage1_idct) + + vtrn.16 q15,q6 + vtrn.16 q7,q9 + + vtrn.32 d30,d31 + vtrn.32 d12,d13 + vtrn.32 d14,d15 + vtrn.32 d18,d19 + + + vst1.16 {q15},[r1]! + vst1.16 {q6},[r1]! + add r1,r1,#64 + vst1.16 {q7},[r1]! + vst1.16 {q9},[r1]! + sub r1,r1,#96 + + mov r0,r8 + + + + vld1.16 d10,[r0],r6 + vld1.16 d8,[r0],r6 + vld1.16 d11,[r0],r6 + vld1.16 d9,[r0],r6 + + + vmull.s16 q12,d8,d6[1] @// y1 * cos1(part of b0) + vmull.s16 q13,d8,d6[3] @// y1 * cos3(part of b1) + vmull.s16 q14,d8,d7[1] @// y1 * sin3(part of b2) + vmull.s16 q15,d8,d7[3] @// y1 * sin1(part of b3) + + vmlsl.s16 q12,d9,d2[3] @// y1 * cos1 + y3 * cos3(part of b0) + vmlsl.s16 q13,d9,d4[1] @// y1 * cos3 - y3 * sin1(part of b1) + vmlsl.s16 q14,d9,d5[3] @// y1 * sin3 - y3 * cos1(part of b2) + vmlsl.s16 q15,d9,d7[1] @// y1 * sin1 - y3 * sin3(part of b3) + + + + + + vmull.s16 q10,d10,d0[0] + vmlsl.s16 q10,d11,d3[2] + + + vmull.s16 q11,d10,d0[0] + vmlsl.s16 q11,d11,d2[2] + + vmull.s16 q8,d10,d0[0] + vmlsl.s16 q8,d11,d1[2] + + vmull.s16 q9,d10,d0[0] + vmlsl.s16 q9,d11,d0[2] + + cmp r11,r10 + bhs shift4 + + vld1.16 d12,[r0],r6 + vld1.16 d14,[r0],r6 + vld1.16 d13,[r0],r6 + vld1.16 d15,[r0],r6 + + + + + + + vmlal.s16 q12,d14,d0[1] + vmlal.s16 q13,d14,d1[3] + vmlal.s16 q14,d14,d4[1] + vmlal.s16 q15,d14,d6[3] + + + vmlsl.s16 q12,d15,d4[1] + vmlsl.s16 q13,d15,d0[3] + vmlsl.s16 q14,d15,d2[3] + vmlsl.s16 q15,d15,d6[1] + + + vmlal.s16 q10,d12,d7[0] + vmlal.s16 q10,d13,d5[2] + vmlal.s16 q11,d12,d5[0] + vmlsl.s16 q11,d13,d7[2] + vmlal.s16 q8,d12,d3[0] + vmlsl.s16 q8,d13,d4[2] + vmlal.s16 q9,d12,d1[0] + vmlsl.s16 q9,d13,d1[2] + + cmp r11,r9 + bhs shift4 + + vld1.16 d10,[r0],r6 + vld1.16 d8,[r0],r6 + vld1.16 d11,[r0],r6 + vld1.16 d9,[r0],r6 + + + + vmlal.s16 q12,d8,d7[3] @// y1 * cos1(part of b0) + vmlal.s16 q13,d8,d3[1] @// y1 * cos3(part of b1) + vmlal.s16 q14,d8,d1[1] @// y1 * sin3(part of b2) + vmlal.s16 q15,d8,d5[3] @// y1 * sin1(part of b3) + + vmlal.s16 q12,d9,d4[3] @// y1 * cos1 + y3 * cos3(part of b0) + vmlsl.s16 q13,d9,d5[3] @// y1 * cos3 - y3 * sin1(part of b1) + vmlsl.s16 q14,d9,d0[1] @// y1 * sin3 - y3 * cos1(part of b2) + vmlsl.s16 q15,d9,d5[1] @// y1 * sin1 - y3 * sin3(part of b3) + + + + + + vmlsl.s16 q10,d10,d2[0] + vmlal.s16 q10,d11,d1[2] + + + vmlsl.s16 q11,d10,d6[0] + vmlal.s16 q11,d11,d3[2] + + vmlal.s16 q8,d10,d6[0] + vmlsl.s16 q8,d11,d7[2] + + vmlal.s16 q9,d10,d2[0] + vmlsl.s16 q9,d11,d2[2] + + cmp r11,r5 + bhs shift4 + + + vld1.16 d12,[r0],r6 + vld1.16 d14,[r0],r6 + vld1.16 d13,[r0],r6 + vld1.16 d15,[r0],r6 + + + + + + + vmlsl.s16 q12,d14,d1[1] + vmlsl.s16 q13,d14,d7[3] + vmlal.s16 q14,d14,d1[3] + vmlal.s16 q15,d14,d4[3] + + + vmlal.s16 q12,d15,d2[1] + vmlal.s16 q13,d15,d5[1] + vmlsl.s16 q14,d15,d3[1] + vmlsl.s16 q15,d15,d4[1] + + + vmlsl.s16 q10,d12,d5[0] + vmlsl.s16 q10,d13,d7[2] + vmlsl.s16 q11,d12,d1[0] + vmlal.s16 q11,d13,d1[2] + vmlsl.s16 q8,d12,d7[0] + vmlal.s16 q8,d13,d5[2] + vmlal.s16 q9,d12,d3[0] + vmlsl.s16 q9,d13,d3[2] + + cmp r11,r7 + bhs shift4 + + + vld1.16 d10,[r0],r6 + vld1.16 d8,[r0],r6 + vld1.16 d11,[r0],r6 + vld1.16 d9,[r0],r6 + + + vmlsl.s16 q12,d8,d5[3] @// y1 * cos1(part of b0) + vmlsl.s16 q13,d8,d2[3] @// y1 * cos3(part of b1) + vmlal.s16 q14,d8,d4[3] @// y1 * sin3(part of b2) + vmlal.s16 q15,d8,d3[3] @// y1 * sin1(part of b3) + + vmlsl.s16 q12,d9,d6[3] @// y1 * cos1 + y3 * cos3(part of b0) + vmlal.s16 q13,d9,d0[3] @// y1 * cos3 - y3 * sin1(part of b1) + vmlsl.s16 q14,d9,d6[1] @// y1 * sin3 - y3 * cos1(part of b2) + vmlsl.s16 q15,d9,d3[1] @// y1 * sin1 - y3 * sin3(part of b3) + + + + + + vmlal.s16 q10,d10,d0[0] + vmlsl.s16 q10,d11,d0[2] + + + vmlsl.s16 q11,d10,d0[0] + vmlal.s16 q11,d11,d6[2] + + vmlsl.s16 q8,d10,d0[0] + vmlal.s16 q8,d11,d2[2] + + vmlal.s16 q9,d10,d0[0] + vmlsl.s16 q9,d11,d4[2] + + + + + vld1.16 d12,[r0],r6 + vld1.16 d14,[r0],r6 + vld1.16 d13,[r0],r6 + vld1.16 d15,[r0],r6 + + + + + + + vmlal.s16 q12,d14,d3[1] + vmlsl.s16 q13,d14,d2[1] + vmlal.s16 q14,d14,d7[3] + vmlal.s16 q15,d14,d2[3] + + + vmlsl.s16 q12,d15,d0[3] + vmlal.s16 q13,d15,d4[3] + vmlal.s16 q14,d15,d6[3] + vmlsl.s16 q15,d15,d2[1] + + + vmlal.s16 q10,d12,d3[0] + vmlsl.s16 q10,d13,d6[2] + vmlal.s16 q11,d12,d7[0] + vmlsl.s16 q11,d13,d4[2] + vmlsl.s16 q8,d12,d1[0] + vmlal.s16 q8,d13,d0[2] + vmlal.s16 q9,d12,d5[0] + vmlsl.s16 q9,d13,d5[2] + + + vld1.16 d10,[r0],r6 + vld1.16 d8,[r0],r6 + vld1.16 d11,[r0],r6 + vld1.16 d9,[r0],r6 + + + + + + vmlal.s16 q12,d8,d3[3] @// y1 * cos1(part of b0) + vmlsl.s16 q13,d8,d7[1] @// y1 * cos3(part of b1) + vmlsl.s16 q14,d8,d5[1] @// y1 * sin3(part of b2) + vmlal.s16 q15,d8,d1[3] @// y1 * sin1(part of b3) + + vmlsl.s16 q12,d9,d7[1] @// y1 * cos1 + y3 * cos3(part of b0) + vmlsl.s16 q13,d9,d6[1] @// y1 * cos3 - y3 * sin1(part of b1) + vmlal.s16 q14,d9,d3[3] @// y1 * sin3 - y3 * cos1(part of b2) + vmlsl.s16 q15,d9,d1[1] @// y1 * sin1 - y3 * sin3(part of b3) + + + + + + vmlsl.s16 q10,d10,d6[0] + vmlal.s16 q10,d11,d2[2] + + + vmlal.s16 q11,d10,d2[0] + vmlsl.s16 q11,d11,d0[2] + + vmlsl.s16 q8,d10,d2[0] + vmlal.s16 q8,d11,d3[2] + + vmlal.s16 q9,d10,d6[0] + vmlsl.s16 q9,d11,d6[2] + + + vld1.16 d12,[r0],r6 + vld1.16 d14,[r0],r6 + vld1.16 d13,[r0],r6 + vld1.16 d15,[r0],r6 + + + + + vmlsl.s16 q12,d14,d5[1] + vmlal.s16 q13,d14,d3[3] + vmlsl.s16 q14,d14,d2[1] + vmlal.s16 q15,d14,d0[3] + + + vmlal.s16 q12,d15,d1[3] + vmlsl.s16 q13,d15,d1[1] + vmlal.s16 q14,d15,d0[3] + vmlsl.s16 q15,d15,d0[1] + + + vmlsl.s16 q10,d12,d1[0] + vmlal.s16 q10,d13,d4[2] + vmlal.s16 q11,d12,d3[0] + vmlsl.s16 q11,d13,d5[2] + vmlsl.s16 q8,d12,d5[0] + vmlal.s16 q8,d13,d6[2] + vmlal.s16 q9,d12,d7[0] + vmlsl.s16 q9,d13,d7[2] + +shift4: + vadd.s32 q4,q10,q12 + vsub.s32 q5,q10,q12 + + vadd.s32 q6,q11,q13 + vsub.s32 q12,q11,q13 + + vadd.s32 q7,q8,q14 + vsub.s32 q13,q8,q14 + + + vadd.s32 q8,q9,q15 + vsub.s32 q14,q9,q15 + + + vqrshrn.s32 d30,q4,#shift_stage1_idct @// r0 = (a0 + b0 + rnd) >> 7(shift_stage1_idct) + vqrshrn.s32 d19,q5,#shift_stage1_idct @// r7 = (a0 - b0 + rnd) >> 7(shift_stage1_idct) + vqrshrn.s32 d31,q7,#shift_stage1_idct @// r2 = (a2 + b2 + rnd) >> 7(shift_stage1_idct) + vqrshrn.s32 d18,q13,#shift_stage1_idct @// r5 = (a2 - b2 + rnd) >> 7(shift_stage1_idct) + vqrshrn.s32 d12,q6,#shift_stage1_idct @// r1 = (a1 + b1 + rnd) >> 7(shift_stage1_idct) + vqrshrn.s32 d15,q12,#shift_stage1_idct @// r6 = (a1 - b1 + rnd) >> 7(shift_stage1_idct) + vqrshrn.s32 d13,q8,#shift_stage1_idct @// r3 = (a3 + b3 + rnd) >> 7(shift_stage1_idct) + vqrshrn.s32 d14,q14,#shift_stage1_idct @// r4 = (a3 - b3 + rnd) >> 7(shift_stage1_idct) + + vtrn.16 q15,q6 + vtrn.16 q7,q9 + + vtrn.32 d30,d31 + vtrn.32 d12,d13 + vtrn.32 d14,d15 + vtrn.32 d18,d19 + + + vst1.16 {q15},[r1]! + vst1.16 {q6},[r1]! + vst1.16 {q7},[r1]! + vst1.16 {q9},[r1]! + + add r1,r1,#96 + + subs r14,r14,#1 + bne dct_stage1 +second_stage_dct: +@ mov r0,r1 + ldr r0,[sp] + ldr r1,[sp,#4] + ldr r8,[sp,#60] @ prediction stride + ldr r7,[sp,#64] @ destination stride + +@ add r4,r2,r8, lsl #1 @ r4 = r2 + pred_strd * 2 => r4 points to 3rd row of pred data +@ add r5,r8,r8, lsl #1 @ +@ sub r0,r0,#512 + mov r11,#0xfffffff0 + mov r5, #0xffffff00 + ldr r6,r5_addr + ldr r9,r9_addr +@ sub r1,r1,#2048 + mov r4,r1 + mov r10,#240 + mov r14,#8 + b stage2 + +@ registers free : + +@ arm registers used +@ r8 : predicition stride +@ r7 : destination stride +@ r1: temp buffer +@ r2 : pred buffer +@ r3 : destination buffer +@ r14 : loop counter +@r0 : scratch buffer +@r10 : used as stride +@ r4 : used to store the initial address +@r12 : zero cols +@ r11 : 0xfffffff0 +@ r5 : 0xffffff00 +dct_stage2: + add r4,r4,#32 + mov r1,r4 +stage2: + vld1.16 {d10,d11},[r1]! + vld1.16 {d8,d9},[r1],r10 + + vmull.s16 q12,d8,d0[1] @// y1 * cos1(part of b0) + vmull.s16 q13,d8,d0[3] @// y1 * cos3(part of b1) + vmull.s16 q14,d8,d1[1] @// y1 * sin3(part of b2) + vmull.s16 q15,d8,d1[3] @// y1 * sin1(part of b3) + + vmlal.s16 q12,d9,d0[3] @// y1 * cos1 + y3 * cos3(part of b0) + vmlal.s16 q13,d9,d2[1] @// y1 * cos3 - y3 * sin1(part of b1) + vmlal.s16 q14,d9,d3[3] @// y1 * sin3 - y3 * cos1(part of b2) + vmlal.s16 q15,d9,d5[1] @// y1 * sin1 - y3 * sin3(part of b3) + + + + vmull.s16 q10,d10,d0[0] + vmlal.s16 q10,d11,d0[2] + + + vmull.s16 q11,d10,d0[0] + vmlal.s16 q11,d11,d1[2] + + vmull.s16 q8,d10,d0[0] + vmlal.s16 q8,d11,d2[2] + + vmull.s16 q9,d10,d0[0] + vmlal.s16 q9,d11,d3[2] + cmp r12,r11 + bhs stage2_shift1 + + vld1.16 {d12,d13},[r1]! + vld1.16 {d14,d15},[r1],r10 + + + + + + + vmlal.s16 q12,d14,d1[1] + vmlal.s16 q13,d14,d3[3] + vmlal.s16 q14,d14,d6[1] + vmlsl.s16 q15,d14,d7[1] + + + vmlal.s16 q12,d15,d1[3] + vmlal.s16 q13,d15,d5[1] + vmlsl.s16 q14,d15,d7[1] + vmlsl.s16 q15,d15,d3[3] + + + vmlal.s16 q10,d12,d1[0] + vmlal.s16 q10,d13,d1[2] + vmlal.s16 q11,d12,d3[0] + vmlal.s16 q11,d13,d4[2] + vmlal.s16 q8,d12,d5[0] + vmlal.s16 q8,d13,d7[2] + vmlal.s16 q9,d12,d7[0] + vmlsl.s16 q9,d13,d5[2] + cmp r12,r5 + bhs stage2_shift1 + + vld1.16 {d10,d11},[r1]! + vld1.16 {d8,d9},[r1],r10 + + vmlal.s16 q12,d8,d2[1] @// y1 * cos1(part of b0) + vmlal.s16 q13,d8,d6[3] @// y1 * cos3(part of b1) + vmlsl.s16 q14,d8,d4[3] @// y1 * sin3(part of b2) + vmlsl.s16 q15,d8,d0[1] @// y1 * sin1(part of b3) + + vmlal.s16 q12,d9,d2[3] @// y1 * cos1 + y3 * cos3(part of b0) + vmlsl.s16 q13,d9,d7[3] @// y1 * cos3 - y3 * sin1(part of b1) + vmlsl.s16 q14,d9,d2[1] @// y1 * sin3 - y3 * cos1(part of b2) + vmlsl.s16 q15,d9,d3[1] @// y1 * sin1 - y3 * sin3(part of b3) + + + + + + vmlal.s16 q10,d10,d2[0] + vmlal.s16 q10,d11,d2[2] + + + vmlal.s16 q11,d10,d6[0] + vmlal.s16 q11,d11,d7[2] + + vmlsl.s16 q8,d10,d6[0] + vmlsl.s16 q8,d11,d3[2] + + vmlsl.s16 q9,d10,d2[0] + vmlsl.s16 q9,d11,d1[2] + + cmp r12,r6 + bhs stage2_shift1 + + + vld1.16 {d12,d13},[r1]! + vld1.16 {d14,d15},[r1],r10 + + + + + + vmlal.s16 q12,d14,d3[1] + vmlsl.s16 q13,d14,d6[1] + vmlsl.s16 q14,d14,d0[1] + vmlsl.s16 q15,d14,d6[3] + + + vmlal.s16 q12,d15,d3[3] + vmlsl.s16 q13,d15,d4[3] + vmlsl.s16 q14,d15,d2[3] + vmlal.s16 q15,d15,d5[3] + + + vmlal.s16 q10,d12,d3[0] + vmlal.s16 q10,d13,d3[2] + vmlsl.s16 q11,d12,d7[0] + vmlsl.s16 q11,d13,d5[2] + vmlsl.s16 q8,d12,d1[0] + vmlsl.s16 q8,d13,d1[2] + vmlsl.s16 q9,d12,d5[0] + vmlal.s16 q9,d13,d7[2] + + cmp r12,r9 + bhs stage2_shift1 + + + vld1.16 {d10,d11},[r1]! + vld1.16 {d8,d9},[r1],r10 + + + vmlal.s16 q12,d8,d4[1] @// y1 * cos1(part of b0) + vmlsl.s16 q13,d8,d3[1] @// y1 * cos3(part of b1) + vmlsl.s16 q14,d8,d5[1] @// y1 * sin3(part of b2) + vmlal.s16 q15,d8,d2[1] @// y1 * sin1(part of b3) + + vmlal.s16 q12,d9,d4[3] @// y1 * cos1 + y3 * cos3(part of b0) + vmlsl.s16 q13,d9,d1[3] @// y1 * cos3 - y3 * sin1(part of b1) + vmlsl.s16 q14,d9,d7[3] @// y1 * sin3 - y3 * cos1(part of b2) + vmlal.s16 q15,d9,d1[1] @// y1 * sin1 - y3 * sin3(part of b3) + + + + + + vmlal.s16 q10,d10,d0[0] + vmlal.s16 q10,d11,d4[2] + + + vmlsl.s16 q11,d10,d0[0] + vmlsl.s16 q11,d11,d2[2] + + vmlsl.s16 q8,d10,d0[0] + vmlsl.s16 q8,d11,d6[2] + + vmlal.s16 q9,d10,d0[0] + vmlal.s16 q9,d11,d0[2] + + vld1.16 {d12,d13},[r1]! + vld1.16 {d14,d15},[r1],r10 + + + + + + vmlal.s16 q12,d14,d5[1] + vmlsl.s16 q13,d14,d0[2] + vmlal.s16 q14,d14,d5[3] + vmlal.s16 q15,d14,d4[3] + + + vmlal.s16 q12,d15,d5[3] + vmlsl.s16 q13,d15,d1[1] + vmlal.s16 q14,d15,d3[1] + vmlsl.s16 q15,d15,d7[3] + + + vmlal.s16 q10,d12,d5[0] + vmlal.s16 q10,d13,d5[2] + vmlsl.s16 q11,d12,d1[0] + vmlsl.s16 q11,d13,d0[2] + vmlal.s16 q8,d12,d7[0] + vmlal.s16 q8,d13,d4[2] + vmlal.s16 q9,d12,d3[0] + vmlal.s16 q9,d13,d6[2] + + + vld1.16 {d10,d11},[r1]! + vld1.16 {d8,d9},[r1],r10 + + + + + vmlal.s16 q12,d8,d6[1] @// y1 * cos1(part of b0) + vmlsl.s16 q13,d8,d2[3] @// y1 * cos3(part of b1) + vmlal.s16 q14,d8,d0[1] @// y1 * sin3(part of b2) + vmlsl.s16 q15,d8,d4[1] @// y1 * sin1(part of b3) + + vmlal.s16 q12,d9,d6[3] @// y1 * cos1 + y3 * cos3(part of b0) + vmlsl.s16 q13,d9,d4[1] @// y1 * cos3 - y3 * sin1(part of b1) + vmlal.s16 q14,d9,d1[3] @// y1 * sin3 - y3 * cos1(part of b2) + vmlsl.s16 q15,d9,d0[1] @// y1 * sin1 - y3 * sin3(part of b3) + + + + + + vmlal.s16 q10,d10,d6[0] + vmlal.s16 q10,d11,d6[2] + + + vmlsl.s16 q11,d10,d2[0] + vmlsl.s16 q11,d11,d3[2] + + vmlal.s16 q8,d10,d2[0] + vmlal.s16 q8,d11,d0[2] + + vmlsl.s16 q9,d10,d6[0] + vmlsl.s16 q9,d11,d2[2] + + vld1.16 {d12,d13},[r1]! + vld1.16 {d14,d15},[r1],r10 + + vmlal.s16 q12,d14,d7[1] + vmlsl.s16 q13,d14,d5[3] + vmlal.s16 q14,d14,d4[1] + vmlsl.s16 q15,d14,d2[3] + + + vmlal.s16 q12,d15,d7[3] + vmlsl.s16 q13,d15,d7[1] + vmlal.s16 q14,d15,d6[3] + vmlsl.s16 q15,d15,d6[1] + + + vmlal.s16 q10,d12,d7[0] + vmlal.s16 q10,d13,d7[2] + vmlsl.s16 q11,d12,d5[0] + vmlsl.s16 q11,d13,d6[2] + vmlal.s16 q8,d12,d3[0] + vmlal.s16 q8,d13,d5[2] + vmlsl.s16 q9,d12,d1[0] + vmlsl.s16 q9,d13,d4[2] + +stage2_shift1: + vadd.s32 q4,q10,q12 + vsub.s32 q5,q10,q12 + + vadd.s32 q6,q11,q13 + vsub.s32 q12,q11,q13 + + vadd.s32 q7,q8,q14 + vsub.s32 q13,q8,q14 + + + vadd.s32 q8,q9,q15 + vsub.s32 q14,q9,q15 + + + vqrshrn.s32 d30,q4,#shift_stage2_idct @// r0 = (a0 + b0 + rnd) >> 7(shift_stage2_idct) + vqrshrn.s32 d19,q5,#shift_stage2_idct @// r7 = (a0 - b0 + rnd) >> 7(shift_stage2_idct) + vqrshrn.s32 d31,q7,#shift_stage2_idct @// r2 = (a2 + b2 + rnd) >> 7(shift_stage2_idct) + vqrshrn.s32 d18,q13,#shift_stage2_idct @// r5 = (a2 - b2 + rnd) >> 7(shift_stage2_idct) + vqrshrn.s32 d12,q6,#shift_stage2_idct @// r1 = (a1 + b1 + rnd) >> 7(shift_stage2_idct) + vqrshrn.s32 d15,q12,#shift_stage2_idct @// r6 = (a1 - b1 + rnd) >> 7(shift_stage2_idct) + vqrshrn.s32 d13,q8,#shift_stage2_idct @// r3 = (a3 + b3 + rnd) >> 7(shift_stage2_idct) + vqrshrn.s32 d14,q14,#shift_stage2_idct @// r4 = (a3 - b3 + rnd) >> 7(shift_stage2_idct) + + + vtrn.16 q15,q6 + vtrn.16 q7,q9 + + vtrn.32 d30,d31 + vtrn.32 d12,d13 + vtrn.32 d14,d15 + vtrn.32 d18,d19 + + + vst1.16 {q15},[r0]! + vst1.16 {q6},[r0]! + vst1.16 {q7},[r0]! + vst1.16 {q9},[r0]! + + + mov r1,r4 + + + + + + + vld1.16 {d10,d11},[r1]! + vld1.16 {d8,d9},[r1],r10 + + + vmull.s16 q12,d8,d2[1] @// y1 * cos1(part of b0) + vmull.s16 q13,d8,d2[3] @// y1 * cos3(part of b1) + vmull.s16 q14,d8,d3[1] @// y1 * sin3(part of b2) + vmull.s16 q15,d8,d3[3] @// y1 * sin1(part of b3) + + vmlal.s16 q12,d9,d6[3] @// y1 * cos1 + y3 * cos3(part of b0) + vmlsl.s16 q13,d9,d7[3] @// y1 * cos3 - y3 * sin1(part of b1) + vmlsl.s16 q14,d9,d6[1] @// y1 * sin3 - y3 * cos1(part of b2) + vmlsl.s16 q15,d9,d4[3] @// y1 * sin1 - y3 * sin3(part of b3) + + + + + + vmull.s16 q10,d10,d0[0] + vmlal.s16 q10,d11,d4[2] + + + vmull.s16 q11,d10,d0[0] + vmlal.s16 q11,d11,d5[2] + + vmull.s16 q8,d10,d0[0] + vmlal.s16 q8,d11,d6[2] + + vmull.s16 q9,d10,d0[0] + vmlal.s16 q9,d11,d7[2] + + cmp r12,r11 + bhs stage2_shift2 + + vld1.16 {d12,d13},[r1]! + vld1.16 {d14,d15},[r1],r10 + + + vmlsl.s16 q12,d14,d4[3] + vmlsl.s16 q13,d14,d2[1] + vmlsl.s16 q14,d14,d0[1] + vmlsl.s16 q15,d14,d2[3] + + + vmlsl.s16 q12,d15,d0[3] + vmlsl.s16 q13,d15,d3[1] + vmlsl.s16 q14,d15,d6[3] + vmlal.s16 q15,d15,d5[3] + + + vmlsl.s16 q10,d12,d7[0] + vmlsl.s16 q10,d13,d2[2] + vmlsl.s16 q11,d12,d5[0] + vmlsl.s16 q11,d13,d0[2] + vmlsl.s16 q8,d12,d3[0] + vmlsl.s16 q8,d13,d3[2] + vmlsl.s16 q9,d12,d1[0] + vmlsl.s16 q9,d13,d6[2] + + cmp r12,r5 + bhs stage2_shift2 + + vld1.16 {d10,d11},[r1]! + vld1.16 {d8,d9},[r1],r10 + + + + + + vmlsl.s16 q12,d8,d4[1] @// y1 * cos1(part of b0) + vmlal.s16 q13,d8,d7[1] @// y1 * cos3(part of b1) + vmlal.s16 q14,d8,d2[3] @// y1 * sin3(part of b2) + vmlal.s16 q15,d8,d1[3] @// y1 * sin1(part of b3) + + vmlal.s16 q12,d9,d7[1] @// y1 * cos1 + y3 * cos3(part of b0) + vmlal.s16 q13,d9,d1[3] @// y1 * cos3 - y3 * sin1(part of b1) + vmlal.s16 q14,d9,d3[3] @// y1 * sin3 - y3 * cos1(part of b2) + vmlsl.s16 q15,d9,d6[3] @// y1 * sin1 - y3 * sin3(part of b3) + + + + + + vmlsl.s16 q10,d10,d2[0] + vmlsl.s16 q10,d11,d6[2] + + + vmlsl.s16 q11,d10,d6[0] + vmlal.s16 q11,d11,d4[2] + + vmlal.s16 q8,d10,d6[0] + vmlal.s16 q8,d11,d0[2] + + vmlal.s16 q9,d10,d2[0] + vmlal.s16 q9,d11,d5[2] + + cmp r12,r6 + bhs stage2_shift2 + + + vld1.16 {d12,d13},[r1]! + vld1.16 {d14,d15},[r1],r10 + + + + + + + vmlal.s16 q12,d14,d2[3] + vmlal.s16 q13,d14,d3[3] + vmlsl.s16 q14,d14,d5[3] + vmlsl.s16 q15,d14,d0[3] + + + vmlal.s16 q12,d15,d1[3] + vmlsl.s16 q13,d15,d6[3] + vmlsl.s16 q14,d15,d0[3] + vmlal.s16 q15,d15,d7[3] + + + vmlal.s16 q10,d12,d5[0] + vmlal.s16 q10,d13,d0[2] + vmlal.s16 q11,d12,d1[0] + vmlal.s16 q11,d13,d6[2] + vmlal.s16 q8,d12,d7[0] + vmlsl.s16 q8,d13,d2[2] + vmlsl.s16 q9,d12,d3[0] + vmlsl.s16 q9,d13,d4[2] + + cmp r12,r9 + bhs stage2_shift2 + + + vld1.16 {d10,d11},[r1]! + vld1.16 {d8,d9},[r1],r10 + + + + vmlal.s16 q12,d8,d6[1] @// y1 * cos1(part of b0) + vmlsl.s16 q13,d8,d1[1] @// y1 * cos3(part of b1) + vmlsl.s16 q14,d8,d7[1] @// y1 * sin3(part of b2) + vmlal.s16 q15,d8,d0[3] @// y1 * sin1(part of b3) + + vmlsl.s16 q12,d9,d5[1] @// y1 * cos1 + y3 * cos3(part of b0) + vmlsl.s16 q13,d9,d4[1] @// y1 * cos3 - y3 * sin1(part of b1) + vmlal.s16 q14,d9,d2[1] @// y1 * sin3 - y3 * cos1(part of b2) + vmlal.s16 q15,d9,d7[1] @// y1 * sin1 - y3 * sin3(part of b3) + + + + + + vmlal.s16 q10,d10,d0[0] + vmlsl.s16 q10,d11,d7[2] + + + vmlsl.s16 q11,d10,d0[0] + vmlsl.s16 q11,d11,d1[2] + + vmlsl.s16 q8,d10,d0[0] + vmlal.s16 q8,d11,d5[2] + + vmlal.s16 q9,d10,d0[0] + vmlal.s16 q9,d11,d3[2] + + vld1.16 {d12,d13},[r1]! + vld1.16 {d14,d15},[r1],r10 + + + + + vmlsl.s16 q12,d14,d0[1] + vmlal.s16 q13,d14,d6[1] + vmlal.s16 q14,d14,d4[1] + vmlsl.s16 q15,d14,d1[1] + + + vmlsl.s16 q12,d15,d3[3] + vmlal.s16 q13,d15,d0[1] + vmlsl.s16 q14,d15,d5[1] + vmlsl.s16 q15,d15,d6[1] + + + vmlsl.s16 q10,d12,d3[0] + vmlsl.s16 q10,d13,d1[2] + vmlsl.s16 q11,d12,d7[0] + vmlal.s16 q11,d13,d3[2] + vmlal.s16 q8,d12,d1[0] + vmlal.s16 q8,d13,d7[2] + vmlsl.s16 q9,d12,d5[0] + vmlsl.s16 q9,d13,d2[2] + + + vld1.16 {d10,d11},[r1]! + vld1.16 {d8,d9},[r1],r10 + + + vmlal.s16 q12,d8,d7[3] @// y1 * cos1(part of b0) + vmlal.s16 q13,d8,d4[3] @// y1 * cos3(part of b1) + vmlsl.s16 q14,d8,d1[1] @// y1 * sin3(part of b2) + vmlal.s16 q15,d8,d2[1] @// y1 * sin1(part of b3) + + vmlal.s16 q12,d9,d3[1] @// y1 * cos1 + y3 * cos3(part of b0) + vmlsl.s16 q13,d9,d5[3] @// y1 * cos3 - y3 * sin1(part of b1) + vmlsl.s16 q14,d9,d7[3] @// y1 * sin3 - y3 * cos1(part of b2) + vmlal.s16 q15,d9,d5[1] @// y1 * sin1 - y3 * sin3(part of b3) + + + + + + vmlsl.s16 q10,d10,d6[0] + vmlal.s16 q10,d11,d5[2] + + + vmlal.s16 q11,d10,d2[0] + vmlal.s16 q11,d11,d7[2] + + vmlsl.s16 q8,d10,d2[0] + vmlsl.s16 q8,d11,d4[2] + + vmlal.s16 q9,d10,d6[0] + vmlal.s16 q9,d11,d1[2] + + + vld1.16 {d12,d13},[r1]! + vld1.16 {d14,d15},[r1],r10 + + + + vmlal.s16 q12,d14,d1[1] + vmlsl.s16 q13,d14,d0[3] + vmlal.s16 q14,d14,d1[3] + vmlsl.s16 q15,d14,d3[1] + + + vmlal.s16 q12,d15,d5[3] + vmlsl.s16 q13,d15,d5[1] + vmlal.s16 q14,d15,d4[3] + vmlsl.s16 q15,d15,d4[1] + + + vmlal.s16 q10,d12,d1[0] + vmlal.s16 q10,d13,d3[2] + vmlsl.s16 q11,d12,d3[0] + vmlsl.s16 q11,d13,d2[2] + vmlal.s16 q8,d12,d5[0] + vmlal.s16 q8,d13,d1[2] + vmlsl.s16 q9,d12,d7[0] + vmlsl.s16 q9,d13,d0[2] + +stage2_shift2: + vadd.s32 q4,q10,q12 + vsub.s32 q5,q10,q12 + + vadd.s32 q6,q11,q13 + vsub.s32 q12,q11,q13 + + vadd.s32 q7,q8,q14 + vsub.s32 q13,q8,q14 + + + vadd.s32 q8,q9,q15 + vsub.s32 q14,q9,q15 + + + vqrshrn.s32 d30,q4,#shift_stage2_idct @// r0 = (a0 + b0 + rnd) >> 7(shift_stage2_idct) + vqrshrn.s32 d19,q5,#shift_stage2_idct @// r7 = (a0 - b0 + rnd) >> 7(shift_stage2_idct) + vqrshrn.s32 d31,q7,#shift_stage2_idct @// r2 = (a2 + b2 + rnd) >> 7(shift_stage2_idct) + vqrshrn.s32 d18,q13,#shift_stage2_idct @// r5 = (a2 - b2 + rnd) >> 7(shift_stage2_idct) + vqrshrn.s32 d12,q6,#shift_stage2_idct @// r1 = (a1 + b1 + rnd) >> 7(shift_stage2_idct) + vqrshrn.s32 d15,q12,#shift_stage2_idct @// r6 = (a1 - b1 + rnd) >> 7(shift_stage2_idct) + vqrshrn.s32 d13,q8,#shift_stage2_idct @// r3 = (a3 + b3 + rnd) >> 7(shift_stage2_idct) + vqrshrn.s32 d14,q14,#shift_stage2_idct @// r4 = (a3 - b3 + rnd) >> 7(shift_stage2_idct) + + vtrn.16 q15,q6 + vtrn.16 q7,q9 + + vtrn.32 d30,d31 + vtrn.32 d12,d13 + vtrn.32 d14,d15 + vtrn.32 d18,d19 + + + vst1.16 {q15},[r0]! + vst1.16 {q6},[r0]! + vst1.16 {q7},[r0]! + vst1.16 {q9},[r0]! + + + + mov r1,r4 + + + + + vld1.16 {d10,d11},[r1]! + vld1.16 {d8,d9},[r1],r10 + + vmull.s16 q12,d8,d4[1] @// y1 * cos1(part of b0) + vmull.s16 q13,d8,d4[3] @// y1 * cos3(part of b1) + vmull.s16 q14,d8,d5[1] @// y1 * sin3(part of b2) + vmull.s16 q15,d8,d5[3] @// y1 * sin1(part of b3) + + vmlsl.s16 q12,d9,d3[1] @// y1 * cos1 + y3 * cos3(part of b0) + vmlsl.s16 q13,d9,d1[3] @// y1 * cos3 - y3 * sin1(part of b1) + vmlsl.s16 q14,d9,d0[2] @// y1 * sin3 - y3 * cos1(part of b2) + vmlsl.s16 q15,d9,d1[1] @// y1 * sin1 - y3 * sin3(part of b3) + + + + + + vmull.s16 q10,d10,d0[0] + vmlsl.s16 q10,d11,d7[2] + + + vmull.s16 q11,d10,d0[0] + vmlsl.s16 q11,d11,d6[2] + + vmull.s16 q8,d10,d0[0] + vmlsl.s16 q8,d11,d5[2] + + vmull.s16 q9,d10,d0[0] + vmlsl.s16 q9,d11,d4[2] + + cmp r12,r11 + bhs stage2_shift3 + + vld1.16 {d12,d13},[r1]! + vld1.16 {d14,d15},[r1],r10 + + vmlsl.s16 q12,d14,d5[1] + vmlsl.s16 q13,d14,d7[3] + vmlal.s16 q14,d14,d5[3] + vmlal.s16 q15,d14,d3[1] + + + vmlal.s16 q12,d15,d2[1] + vmlal.s16 q13,d15,d1[1] + vmlal.s16 q14,d15,d4[3] + vmlsl.s16 q15,d15,d7[3] + + + vmlsl.s16 q10,d12,d1[0] + vmlal.s16 q10,d13,d6[2] + vmlsl.s16 q11,d12,d3[0] + vmlal.s16 q11,d13,d3[2] + vmlsl.s16 q8,d12,d5[0] + vmlal.s16 q8,d13,d0[2] + vmlsl.s16 q9,d12,d7[0] + vmlal.s16 q9,d13,d2[2] + + cmp r12,r5 + bhs stage2_shift3 + + vld1.16 {d10,d11},[r1]! + vld1.16 {d8,d9},[r1],r10 + + + + vmlal.s16 q12,d8,d6[1] @// y1 * cos1(part of b0) + vmlsl.s16 q13,d8,d5[1] @// y1 * cos3(part of b1) + vmlsl.s16 q14,d8,d0[3] @// y1 * sin3(part of b2) + vmlsl.s16 q15,d8,d3[3] @// y1 * sin1(part of b3) + + vmlsl.s16 q12,d9,d1[1] @// y1 * cos1 + y3 * cos3(part of b0) + vmlsl.s16 q13,d9,d4[1] @// y1 * cos3 - y3 * sin1(part of b1) + vmlal.s16 q14,d9,d6[1] @// y1 * sin3 - y3 * cos1(part of b2) + vmlal.s16 q15,d9,d0[1] @// y1 * sin1 - y3 * sin3(part of b3) + + + + + + vmlal.s16 q10,d10,d2[0] + vmlsl.s16 q10,d11,d5[2] + + + vmlal.s16 q11,d10,d6[0] + vmlsl.s16 q11,d11,d0[2] + + vmlsl.s16 q8,d10,d6[0] + vmlsl.s16 q8,d11,d4[2] + + vmlsl.s16 q9,d10,d2[0] + vmlal.s16 q9,d11,d6[2] + + cmp r12,r6 + bhs stage2_shift3 + + vld1.16 {d12,d13},[r1]! + vld1.16 {d14,d15},[r1],r10 + + + + + + vmlsl.s16 q12,d14,d7[1] + vmlal.s16 q13,d14,d2[1] + vmlal.s16 q14,d14,d4[1] + vmlsl.s16 q15,d14,d5[1] + + + vmlal.s16 q12,d15,d0[3] + vmlal.s16 q13,d15,d7[1] + vmlsl.s16 q14,d15,d1[1] + vmlsl.s16 q15,d15,d6[1] + + + vmlsl.s16 q10,d12,d3[0] + vmlal.s16 q10,d13,d4[2] + vmlal.s16 q11,d12,d7[0] + vmlal.s16 q11,d13,d2[2] + vmlal.s16 q8,d12,d1[0] + vmlsl.s16 q8,d13,d6[2] + vmlal.s16 q9,d12,d5[0] + vmlsl.s16 q9,d13,d0[2] + + cmp r12,r9 + bhs stage2_shift3 + + + vld1.16 {d10,d11},[r1]! + vld1.16 {d8,d9},[r1],r10 + + + vmlsl.s16 q12,d8,d7[3] @// y1 * cos1(part of b0) + vmlsl.s16 q13,d8,d0[1] @// y1 * cos3(part of b1) + vmlal.s16 q14,d8,d6[3] @// y1 * sin3(part of b2) + vmlal.s16 q15,d8,d1[3] @// y1 * sin1(part of b3) + + vmlsl.s16 q12,d9,d0[1] @// y1 * cos1 + y3 * cos3(part of b0) + vmlal.s16 q13,d9,d5[3] @// y1 * cos3 - y3 * sin1(part of b1) + vmlal.s16 q14,d9,d3[3] @// y1 * sin3 - y3 * cos1(part of b2) + vmlsl.s16 q15,d9,d2[3] @// y1 * sin1 - y3 * sin3(part of b3) + + + + + + vmlal.s16 q10,d10,d0[0] + vmlsl.s16 q10,d11,d3[2] + + + vmlsl.s16 q11,d10,d0[0] + vmlsl.s16 q11,d11,d5[2] + + vmlsl.s16 q8,d10,d0[0] + vmlal.s16 q8,d11,d1[2] + + vmlal.s16 q9,d10,d0[0] + vmlal.s16 q9,d11,d7[2] + + vld1.16 {d12,d13},[r1]! + vld1.16 {d14,d15},[r1],r10 + + + + + vmlal.s16 q12,d14,d6[3] + vmlal.s16 q13,d14,d3[3] + vmlsl.s16 q14,d14,d1[3] + vmlal.s16 q15,d14,d7[1] + + + vmlal.s16 q12,d15,d1[3] + vmlsl.s16 q13,d15,d2[3] + vmlal.s16 q14,d15,d7[1] + vmlal.s16 q15,d15,d4[1] + + + vmlsl.s16 q10,d12,d5[0] + vmlal.s16 q10,d13,d2[2] + vmlal.s16 q11,d12,d1[0] + vmlsl.s16 q11,d13,d7[2] + vmlsl.s16 q8,d12,d7[0] + vmlsl.s16 q8,d13,d3[2] + vmlsl.s16 q9,d12,d3[0] + vmlal.s16 q9,d13,d1[2] + + + vld1.16 {d10,d11},[r1]! + vld1.16 {d8,d9},[r1],r10 + + + vmlsl.s16 q12,d8,d5[3] @// y1 * cos1(part of b0) + vmlsl.s16 q13,d8,d6[3] @// y1 * cos3(part of b1) + vmlal.s16 q14,d8,d3[1] @// y1 * sin3(part of b2) + vmlsl.s16 q15,d8,d0[1] @// y1 * sin1(part of b3) + + vmlsl.s16 q12,d9,d2[3] @// y1 * cos1 + y3 * cos3(part of b0) + vmlal.s16 q13,d9,d0[1] @// y1 * cos3 - y3 * sin1(part of b1) + vmlsl.s16 q14,d9,d2[1] @// y1 * sin3 - y3 * cos1(part of b2) + vmlal.s16 q15,d9,d4[3] @// y1 * sin1 - y3 * sin3(part of b3) + + + + + + vmlal.s16 q10,d10,d6[0] + vmlsl.s16 q10,d11,d1[2] + + + vmlsl.s16 q11,d10,d2[0] + vmlal.s16 q11,d11,d4[2] + + vmlal.s16 q8,d10,d2[0] + vmlsl.s16 q8,d11,d7[2] + + vmlsl.s16 q9,d10,d6[0] + vmlsl.s16 q9,d11,d5[2] + + vld1.16 {d12,d13},[r1]! + vld1.16 {d14,d15},[r1],r10 + + + + vmlal.s16 q12,d14,d4[3] + vmlsl.s16 q13,d14,d6[1] + vmlal.s16 q14,d14,d7[3] + vmlal.s16 q15,d14,d6[3] + + + vmlal.s16 q12,d15,d3[3] + vmlsl.s16 q13,d15,d3[1] + vmlal.s16 q14,d15,d2[3] + vmlsl.s16 q15,d15,d2[1] + + + vmlsl.s16 q10,d12,d7[0] + vmlal.s16 q10,d13,d0[2] + vmlal.s16 q11,d12,d5[0] + vmlsl.s16 q11,d13,d1[2] + vmlsl.s16 q8,d12,d3[0] + vmlal.s16 q8,d13,d2[2] + vmlal.s16 q9,d12,d1[0] + vmlsl.s16 q9,d13,d3[2] + +stage2_shift3: + vadd.s32 q4,q10,q12 + vsub.s32 q5,q10,q12 + + vadd.s32 q6,q11,q13 + vsub.s32 q12,q11,q13 + + vadd.s32 q7,q8,q14 + vsub.s32 q13,q8,q14 + + + vadd.s32 q8,q9,q15 + vsub.s32 q14,q9,q15 + + + vqrshrn.s32 d30,q4,#shift_stage2_idct @// r0 = (a0 + b0 + rnd) >> 7(shift_stage2_idct) + vqrshrn.s32 d19,q5,#shift_stage2_idct @// r11 = (a0 - b0 + rnd) >> 7(shift_stage2_idct) + vqrshrn.s32 d31,q7,#shift_stage2_idct @// r2 = (a2 + b2 + rnd) >> 7(shift_stage2_idct) + vqrshrn.s32 d18,q13,#shift_stage2_idct @// r5 = (a2 - b2 + rnd) >> 7(shift_stage2_idct) + vqrshrn.s32 d12,q6,#shift_stage2_idct @// r1 = (a1 + b1 + rnd) >> 7(shift_stage2_idct) + vqrshrn.s32 d15,q12,#shift_stage2_idct @// r6 = (a1 - b1 + rnd) >> 7(shift_stage2_idct) + vqrshrn.s32 d13,q8,#shift_stage2_idct @// r3 = (a3 + b3 + rnd) >> 7(shift_stage2_idct) + vqrshrn.s32 d14,q14,#shift_stage2_idct @// r4 = (a3 - b3 + rnd) >> 7(shift_stage2_idct) + + vtrn.16 q15,q6 + vtrn.16 q7,q9 + + vtrn.32 d30,d31 + vtrn.32 d12,d13 + vtrn.32 d14,d15 + vtrn.32 d18,d19 + + + vst1.16 {q15},[r0]! + vst1.16 {q6},[r0]! + vst1.16 {q7},[r0]! + vst1.16 {q9},[r0]! + + + + + mov r1,r4 + + + + + vld1.16 {d10,d11},[r1]! + vld1.16 {d8,d9},[r1],r10 + + + vmull.s16 q12,d8,d6[1] @// y1 * cos1(part of b0) + vmull.s16 q13,d8,d6[3] @// y1 * cos3(part of b1) + vmull.s16 q14,d8,d7[1] @// y1 * sin3(part of b2) + vmull.s16 q15,d8,d7[3] @// y1 * sin1(part of b3) + + vmlsl.s16 q12,d9,d2[3] @// y1 * cos1 + y3 * cos3(part of b0) + vmlsl.s16 q13,d9,d4[1] @// y1 * cos3 - y3 * sin1(part of b1) + vmlsl.s16 q14,d9,d5[3] @// y1 * sin3 - y3 * cos1(part of b2) + vmlsl.s16 q15,d9,d7[1] @// y1 * sin1 - y3 * sin3(part of b3) + + + + + + vmull.s16 q10,d10,d0[0] + vmlsl.s16 q10,d11,d3[2] + + + vmull.s16 q11,d10,d0[0] + vmlsl.s16 q11,d11,d2[2] + + vmull.s16 q8,d10,d0[0] + vmlsl.s16 q8,d11,d1[2] + + vmull.s16 q9,d10,d0[0] + vmlsl.s16 q9,d11,d0[2] + + cmp r12,r11 + bhs stage2_shift4 + vld1.16 {d12,d13},[r1]! + vld1.16 {d14,d15},[r1],r10 + + + + + + + vmlal.s16 q12,d14,d0[1] + vmlal.s16 q13,d14,d1[3] + vmlal.s16 q14,d14,d4[1] + vmlal.s16 q15,d14,d6[3] + + + vmlsl.s16 q12,d15,d4[1] + vmlsl.s16 q13,d15,d0[3] + vmlsl.s16 q14,d15,d2[3] + vmlsl.s16 q15,d15,d6[1] + + + vmlal.s16 q10,d12,d7[0] + vmlal.s16 q10,d13,d5[2] + vmlal.s16 q11,d12,d5[0] + vmlsl.s16 q11,d13,d7[2] + vmlal.s16 q8,d12,d3[0] + vmlsl.s16 q8,d13,d4[2] + vmlal.s16 q9,d12,d1[0] + vmlsl.s16 q9,d13,d1[2] + + cmp r12,r5 + bhs stage2_shift4 + + vld1.16 {d10,d11},[r1]! + vld1.16 {d8,d9},[r1],r10 + + + + vmlal.s16 q12,d8,d7[3] @// y1 * cos1(part of b0) + vmlal.s16 q13,d8,d3[1] @// y1 * cos3(part of b1) + vmlal.s16 q14,d8,d1[1] @// y1 * sin3(part of b2) + vmlal.s16 q15,d8,d5[3] @// y1 * sin1(part of b3) + + vmlal.s16 q12,d9,d4[3] @// y1 * cos1 + y3 * cos3(part of b0) + vmlsl.s16 q13,d9,d5[3] @// y1 * cos3 - y3 * sin1(part of b1) + vmlsl.s16 q14,d9,d0[1] @// y1 * sin3 - y3 * cos1(part of b2) + vmlsl.s16 q15,d9,d5[1] @// y1 * sin1 - y3 * sin3(part of b3) + + + + + + vmlsl.s16 q10,d10,d2[0] + vmlal.s16 q10,d11,d1[2] + + + vmlsl.s16 q11,d10,d6[0] + vmlal.s16 q11,d11,d3[2] + + vmlal.s16 q8,d10,d6[0] + vmlsl.s16 q8,d11,d7[2] + + vmlal.s16 q9,d10,d2[0] + vmlsl.s16 q9,d11,d2[2] + + cmp r12,r6 + bhs stage2_shift4 + + + vld1.16 {d12,d13},[r1]! + vld1.16 {d14,d15},[r1],r10 + + + + + + + vmlsl.s16 q12,d14,d1[1] + vmlsl.s16 q13,d14,d7[3] + vmlal.s16 q14,d14,d1[3] + vmlal.s16 q15,d14,d4[3] + + + vmlal.s16 q12,d15,d2[1] + vmlal.s16 q13,d15,d5[1] + vmlsl.s16 q14,d15,d3[1] + vmlsl.s16 q15,d15,d4[1] + + + vmlsl.s16 q10,d12,d5[0] + vmlsl.s16 q10,d13,d7[2] + vmlsl.s16 q11,d12,d1[0] + vmlal.s16 q11,d13,d1[2] + vmlsl.s16 q8,d12,d7[0] + vmlal.s16 q8,d13,d5[2] + vmlal.s16 q9,d12,d3[0] + vmlsl.s16 q9,d13,d3[2] + + cmp r12,r9 + bhs stage2_shift4 + + + vld1.16 {d10,d11},[r1]! + vld1.16 {d8,d9},[r1],r10 + + + vmlsl.s16 q12,d8,d5[3] @// y1 * cos1(part of b0) + vmlsl.s16 q13,d8,d2[3] @// y1 * cos3(part of b1) + vmlal.s16 q14,d8,d4[3] @// y1 * sin3(part of b2) + vmlal.s16 q15,d8,d3[3] @// y1 * sin1(part of b3) + + vmlsl.s16 q12,d9,d6[3] @// y1 * cos1 + y3 * cos3(part of b0) + vmlal.s16 q13,d9,d0[3] @// y1 * cos3 - y3 * sin1(part of b1) + vmlsl.s16 q14,d9,d6[1] @// y1 * sin3 - y3 * cos1(part of b2) + vmlsl.s16 q15,d9,d3[1] @// y1 * sin1 - y3 * sin3(part of b3) + + + + + + vmlal.s16 q10,d10,d0[0] + vmlsl.s16 q10,d11,d0[2] + + + vmlsl.s16 q11,d10,d0[0] + vmlal.s16 q11,d11,d6[2] + + vmlsl.s16 q8,d10,d0[0] + vmlal.s16 q8,d11,d2[2] + + vmlal.s16 q9,d10,d0[0] + vmlsl.s16 q9,d11,d4[2] + + vld1.16 {d12,d13},[r1]! + vld1.16 {d14,d15},[r1],r10 + + + + + vmlal.s16 q12,d14,d3[1] + vmlsl.s16 q13,d14,d2[1] + vmlal.s16 q14,d14,d7[3] + vmlal.s16 q15,d14,d2[3] + + + vmlsl.s16 q12,d15,d0[3] + vmlal.s16 q13,d15,d4[3] + vmlal.s16 q14,d15,d6[3] + vmlsl.s16 q15,d15,d2[1] + + + vmlal.s16 q10,d12,d3[0] + vmlsl.s16 q10,d13,d6[2] + vmlal.s16 q11,d12,d7[0] + vmlsl.s16 q11,d13,d4[2] + vmlsl.s16 q8,d12,d1[0] + vmlal.s16 q8,d13,d0[2] + vmlal.s16 q9,d12,d5[0] + vmlsl.s16 q9,d13,d5[2] + + + vld1.16 {d10,d11},[r1]! + vld1.16 {d8,d9},[r1],r10 + + + + + vmlal.s16 q12,d8,d3[3] @// y1 * cos1(part of b0) + vmlsl.s16 q13,d8,d7[1] @// y1 * cos3(part of b1) + vmlsl.s16 q14,d8,d5[1] @// y1 * sin3(part of b2) + vmlal.s16 q15,d8,d1[3] @// y1 * sin1(part of b3) + + vmlsl.s16 q12,d9,d7[1] @// y1 * cos1 + y3 * cos3(part of b0) + vmlsl.s16 q13,d9,d6[1] @// y1 * cos3 - y3 * sin1(part of b1) + vmlal.s16 q14,d9,d3[3] @// y1 * sin3 - y3 * cos1(part of b2) + vmlsl.s16 q15,d9,d1[1] @// y1 * sin1 - y3 * sin3(part of b3) + + + + + + vmlsl.s16 q10,d10,d6[0] + vmlal.s16 q10,d11,d2[2] + + + vmlal.s16 q11,d10,d2[0] + vmlsl.s16 q11,d11,d0[2] + + vmlsl.s16 q8,d10,d2[0] + vmlal.s16 q8,d11,d3[2] + + vmlal.s16 q9,d10,d6[0] + vmlsl.s16 q9,d11,d6[2] + + + vld1.16 {d12,d13},[r1]! + vld1.16 {d14,d15},[r1],r10 + + + + vmlsl.s16 q12,d14,d5[1] + vmlal.s16 q13,d14,d3[3] + vmlsl.s16 q14,d14,d2[1] + vmlal.s16 q15,d14,d0[3] + + + vmlal.s16 q12,d15,d1[3] + vmlsl.s16 q13,d15,d1[1] + vmlal.s16 q14,d15,d0[3] + vmlsl.s16 q15,d15,d0[1] + + + vmlsl.s16 q10,d12,d1[0] + vmlal.s16 q10,d13,d4[2] + vmlal.s16 q11,d12,d3[0] + vmlsl.s16 q11,d13,d5[2] + vmlsl.s16 q8,d12,d5[0] + vmlal.s16 q8,d13,d6[2] + vmlal.s16 q9,d12,d7[0] + vmlsl.s16 q9,d13,d7[2] + +stage2_shift4: + vadd.s32 q4,q10,q12 + vsub.s32 q5,q10,q12 + + vadd.s32 q6,q11,q13 + vsub.s32 q12,q11,q13 + + vadd.s32 q7,q8,q14 + vsub.s32 q13,q8,q14 + + + vadd.s32 q8,q9,q15 + vsub.s32 q14,q9,q15 + + + vqrshrn.s32 d30,q4,#shift_stage2_idct @// r0 = (a0 + b0 + rnd) >> 7(shift_stage2_idct) + vqrshrn.s32 d19,q5,#shift_stage2_idct @// r11 = (a0 - b0 + rnd) >> 7(shift_stage2_idct) + vqrshrn.s32 d31,q7,#shift_stage2_idct @// r2 = (a2 + b2 + rnd) >> 7(shift_stage2_idct) + vqrshrn.s32 d18,q13,#shift_stage2_idct @// r5 = (a2 - b2 + rnd) >> 7(shift_stage2_idct) + vqrshrn.s32 d12,q6,#shift_stage2_idct @// r1 = (a1 + b1 + rnd) >> 7(shift_stage2_idct) + vqrshrn.s32 d15,q12,#shift_stage2_idct @// r6 = (a1 - b1 + rnd) >> 7(shift_stage2_idct) + vqrshrn.s32 d13,q8,#shift_stage2_idct @// r3 = (a3 + b3 + rnd) >> 7(shift_stage2_idct) + vqrshrn.s32 d14,q14,#shift_stage2_idct @// r4 = (a3 - b3 + rnd) >> 7(shift_stage2_idct) + + + + vtrn.16 q15,q6 + vtrn.16 q7,q9 + + vtrn.32 d30,d31 + vtrn.32 d12,d13 + vtrn.32 d14,d15 + vtrn.32 d18,d19 + + + + vst1.16 {q15},[r0]! + vst1.16 {q6},[r0]! + vst1.16 {q7},[r0]! + vst1.16 {q9},[r0]! + + + + + sub r0,r0,#256 +prediction_buffer: + + + vld1.16 {d12,d13},[r0]! + vld1.16 {d14,d15},[r0]! + + add r0,r0,#32 + + vld1.16 {d16,d17},[r0]! + vld1.16 {d18,d19},[r0]! + add r0,r0,#32 + + vld1.16 {d20,d21},[r0]! + vld1.16 {d22,d23},[r0]! + + + add r0,r0,#32 + + vld1.16 {d24,d25},[r0]! + vld1.16 {d26,d27},[r0]! + + + + + +@ d12 =r0 1- 4 values +@ d13 =r2 1- 4 values +@ d14=r1 1- 4 values +@ d15=r3 1- 4 values + +@ d16 =r0 5- 8 values +@ d17 =r2 5- 8 values +@ d18=r1 5- 8 values +@ d19=r3 5- 8 values + +@ d20 =r0 9- 12 values +@ d21 =r2 9- 12 values +@ d22=r1 9- 12 values +@ d23=r3 9- 12 values + +@ d24 =r0 13-16 values +@ d25 =r2 13- 16 values +@ d26=r1 13- 16 values +@ d27=r3 13- 16 values + + vswp d13,d16 + vswp d21,d24 + vswp d15,d18 + vswp d23,d26 + + + vld1.8 {d8,d9},[r2],r8 + vld1.8 {d10,d11},[r2],r8 + vld1.8 {d28,d29},[r2],r8 + vld1.8 {d30,d31},[r2],r8 + + + vaddw.u8 q6,q6,d8 + vaddw.u8 q10,q10,d9 + vaddw.u8 q7,q7,d10 + vaddw.u8 q11,q11,d11 + vaddw.u8 q8,q8,d28 + vaddw.u8 q12,q12,d29 + vaddw.u8 q9,q9,d30 + vaddw.u8 q13,q13,d31 + sub r2,r2,r8,lsl #2 + add r2,r2,#16 + vqmovun.s16 d12,q6 + vqmovun.s16 d13,q10 + vqmovun.s16 d20,q7 + vqmovun.s16 d21,q11 + vqmovun.s16 d14,q8 + vqmovun.s16 d15,q12 + vqmovun.s16 d22,q9 + vqmovun.s16 d23,q13 + + + vst1.8 {d12,d13},[r3],r7 + vst1.8 {d20,d21},[r3],r7 + vst1.8 {d14,d15},[r3],r7 + vst1.8 {d22,d23},[r3],r7 + + + sub r3,r3,r7,lsl #2 + add r3,r3,#16 + + vld1.16 {d12,d13},[r0]! + vld1.16 {d14,d15},[r0]! + + sub r0,r0,#96 + + vld1.16 {d16,d17},[r0]! + vld1.16 {d18,d19},[r0]! + sub r0,r0,#96 + + vld1.16 {d20,d21},[r0]! + vld1.16 {d22,d23},[r0]! + + + sub r0,r0,#96 + + vld1.16 {d24,d25},[r0]! + vld1.16 {d26,d27},[r0]! + + + sub r0,r0,#64 + + + + + vswp d13,d16 + vswp d21,d24 + vswp d15,d18 + vswp d23,d26 + + + vld1.8 {d8,d9},[r2],r8 + vld1.8 {d10,d11},[r2],r8 + vld1.8 {d28,d29},[r2],r8 + vld1.8 {d30,d31},[r2],r8 + + + vaddw.u8 q6,q6,d8 + vaddw.u8 q10,q10,d9 + vaddw.u8 q7,q7,d10 + vaddw.u8 q11,q11,d11 + vaddw.u8 q8,q8,d28 + vaddw.u8 q12,q12,d29 + vaddw.u8 q9,q9,d30 + vaddw.u8 q13,q13,d31 + sub r2,r2,#16 + + vqmovun.s16 d12,q6 + vqmovun.s16 d13,q10 + vqmovun.s16 d20,q7 + vqmovun.s16 d21,q11 + vqmovun.s16 d14,q8 + vqmovun.s16 d15,q12 + vqmovun.s16 d22,q9 + vqmovun.s16 d23,q13 + + + vst1.8 {d12,d13},[r3],r7 + vst1.8 {d20,d21},[r3],r7 + vst1.8 {d14,d15},[r3],r7 + vst1.8 {d22,d23},[r3],r7 + + sub r3,r3,#16 + + subs r14,r14,#1 + bne dct_stage2 + ldmfd sp!,{r0-r12,pc} + + + + + |