blob: eeb1d6689753185a63f417d818774d3ffccc88d0 [file] [log] [blame]
@/*****************************************************************************
@*
@* 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}