blob: 059baecee3dfe7bd2aa6e970ae108c44bf2b6d98 [file] [log] [blame]
@/******************************************************************************
@ *
@ * Copyright (C) 2018 The Android Open Source Project
@ *
@ * Licensed under the Apache License, Version 2.0 (the "License");
@ * you may not use this file except in compliance with the License.
@ * You may obtain a copy of the License at:
@ *
@ * http://www.apache.org/licenses/LICENSE-2.0
@ *
@ * Unless required by applicable law or agreed to in writing, software
@ * distributed under the License is distributed on an "AS IS" BASIS,
@ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
@ * See the License for the specific language governing permissions and
@ * limitations under the License.
@ *
@ *****************************************************************************
@ * Originally developed and contributed by Ittiam Systems Pvt. Ltd, Bangalore
@*/
.text
.p2align 2
.extern ixheaacd_radix4bfly
.hidden ixheaacd_radix4bfly
.extern ixheaacd_postradixcompute2
.hidden ixheaacd_postradixcompute2
.extern ixheaacd_sbr_imdct_using_fft
.hidden ixheaacd_sbr_imdct_using_fft
.global ixheaacd_dec_DCT2_64_asm
ixheaacd_dec_DCT2_64_asm:
STMFD sp!, {r0-r3, r4-r12, r14}
ADD R2, R1, #252
MOV R3, #32
MOV R4, #-4
ADD R2, R2, #4
FOR_LOOP:
VLD2.32 {Q0, Q1}, [R0]!
SUBS R3, R3, #4
VST1.32 {Q0}, [R1]!
SUB R2, R2, #16
VREV64.32 Q1, Q1
VSWP D2, D3
VST1.32 {Q1}, [R2]
BGT FOR_LOOP
LDR r0, [sp, #8]
MOV r1, #32
LDR r2, [sp, #4]
LDR r3, [sp]
LDR r4, [sp, #12]
STR r4, [sp, #-4]!
STR r4, [sp, #-4]!
STR r4, [sp, #-4]!
STR r4, [sp, #-4]!
BL ixheaacd_sbr_imdct_using_fft
ADD sp, sp, #16
LDR r0, [sp]
LDR r2, [sp, #56]
VPUSH {D8 - D15}
ADD R5, R0, #252
VLD1.32 D0, [R0]
ADD R3, R2, #2
VSHL.S32 D0, D0, #1
VST1.32 D0, [R0]!
SUB R5, R5, #28
VLD2.32 {Q0, Q1}, [R0]!
VLD2.32 {Q2, Q3}, [R5]!
VREV64.32 Q2, Q2
VSWP D4, D5
MOV R10, #-8
VREV64.32 Q3, Q3
ADD R4, R2, #30
VSWP D6, D7
SUB R4, R4, #6
VLD1.16 D8, [R3]!
VSUB.I32 Q11, Q3, Q1
VLD1.16 D10, [R4], R10
VADD.I32 Q10, Q3, Q1
VREV64.16 D10, D10
VSUB.I32 Q9, Q0, Q2
VUZP.16 D20, D21
VADD.I32 Q8, Q0, Q2
VUZP.16 D18, D19
VMULL.U16 Q15, D20, D8
VMLSL.U16 Q15, D18, D10
VMULL.U16 Q14, D18, D8
VMLAL.U16 Q14, D20, D10
SUB R11, R0, #32
VSHR.S32 Q15, Q15, #16
VSHR.U32 Q14, Q14, #16
SUB R12, R5, #32
VMLAL.S16 Q15, D21, D8
VMLSL.S16 Q15, D19, D10
VLD2.32 {Q0, Q1}, [R0]!
SUB R5, R5, #64
VMLAL.S16 Q14, D19, D8
VLD2.32 {Q2, Q3}, [R5]!
VMLAL.S16 Q14, D21, D10
VREV64.32 Q2, Q2
VSHL.S32 Q15, Q15, #1
VSWP D4, D5
VSHL.S32 Q14, Q14, #1
VREV64.32 Q3, Q3
VADD.I32 Q13, Q8, Q15
VSWP D6, D7
VADD.I32 Q12, Q11, Q14
VLD1.16 D8, [R3]!
VSUB.I32 Q7, Q14, Q11
VLD1.16 D10, [R4], R10
VSUB.I32 Q6, Q8, Q15
VREV64.32 Q7, Q7
VREV64.32 Q6, Q6
VSWP D14, D15
VSWP D12, D13
VREV64.16 D10, D10
VSUB.I32 Q11, Q3, Q1
VSWP Q13, Q12
VADD.I32 Q10, Q3, Q1
VST2.32 {Q12, Q13}, [R11]!
VSUB.I32 Q9, Q0, Q2
VADD.I32 Q8, Q0, Q2
VST2.32 {Q6, Q7}, [R12]
SUB R11, R0, #32
VUZP.16 D20, D21
SUB R12, R5, #32
VUZP.16 D18, D19
SUB R5, R5, #64
VMULL.U16 Q15, D20, D8
VLD2.32 {Q0, Q1}, [R0]!
VMLSL.U16 Q15, D18, D10
VLD2.32 {Q2, Q3}, [R5]!
VMULL.U16 Q14, D18, D8
VREV64.32 Q2, Q2
VMLAL.U16 Q14, D20, D10
VSWP D4, D5
VSHR.S32 Q15, Q15, #16
VREV64.32 Q3, Q3
VMLAL.S16 Q15, D21, D8
VMLSL.S16 Q15, D19, D10
VSWP D6, D7
VSHR.U32 Q14, Q14, #16
VMLAL.S16 Q14, D19, D8
VLD1.16 D8, [R3]!
VMLAL.S16 Q14, D21, D10
VSHL.S32 Q15, Q15, #1
VLD1.16 D10, [R4], R10
VSHL.S32 Q14, Q14, #1
VREV64.16 D10, D10
VADD.I32 Q13, Q8, Q15
VADD.I32 Q12, Q11, Q14
VSUB.I32 Q7, Q14, Q11
VSUB.I32 Q6, Q8, Q15
VREV64.32 Q7, Q7
VSUB.I32 Q11, Q3, Q1
VREV64.32 Q6, Q6
VADD.I32 Q10, Q3, Q1
VSWP D14, D15
VSUB.I32 Q9, Q0, Q2
VSWP D12, D13
VADD.I32 Q8, Q0, Q2
VSWP Q13, Q12
VUZP.16 D20, D21
VUZP.16 D18, D19
VMULL.U16 Q15, D20, D8
VMLSL.U16 Q15, D18, D10
VST2.32 {Q12, Q13}, [R11]!
VMULL.U16 Q14, D18, D8
VMLAL.U16 Q14, D20, D10
VST2.32 {Q6, Q7}, [R12]
SUB R11, R0, #32
VLD2.32 {Q0, Q1}, [R0]!
SUB R12, R5, #32
SUB R5, R5, #64
VSHR.S32 Q15, Q15, #16
VLD2.32 {Q2, Q3}, [R5]!
VMLAL.S16 Q15, D21, D8
VREV64.32 Q2, Q2
VMLSL.S16 Q15, D19, D10
VSWP D4, D5
VSHR.U32 Q14, Q14, #16
VREV64.32 Q3, Q3
VMLAL.S16 Q14, D19, D8
VSWP D6, D7
VMLAL.S16 Q14, D21, D10
VSHL.S32 Q15, Q15, #1
VLD1.16 D8, [R3]!
VSHL.S32 Q14, Q14, #1
VADD.I32 Q13, Q8, Q15
VLD1.16 D10, [R4], R10
VADD.I32 Q12, Q11, Q14
VREV64.16 D10, D10
VSUB.I32 Q7, Q14, Q11
VSUB.I32 Q6, Q8, Q15
VREV64.32 Q7, Q7
VREV64.32 Q6, Q6
VSWP D14, D15
VSWP D12, D13
VSWP Q13, Q12
VSUB.I32 Q11, Q3, Q1
VST2.32 {Q12, Q13}, [R11]!
VADD.I32 Q10, Q3, Q1
VST2.32 {Q6, Q7}, [R12]
SUB R11, R0, #32
VSUB.I32 Q9, Q0, Q2
VADD.I32 Q8, Q0, Q2
VUZP.16 D20, D21
SUB R12, R5, #32
VUZP.16 D18, D19
SUB R5, R5, #64
VMULL.U16 Q15, D20, D8
VMLSL.U16 Q15, D18, D10
VMULL.U16 Q14, D18, D8
VMLAL.U16 Q14, D20, D10
VSHR.S32 Q15, Q15, #16
VMLAL.S16 Q15, D21, D8
VMLSL.S16 Q15, D19, D10
VSHR.U32 Q14, Q14, #16
VMLAL.S16 Q14, D19, D8
VMLAL.S16 Q14, D21, D10
VSHL.S32 Q15, Q15, #1
VSHL.S32 Q14, Q14, #1
VADD.I32 Q13, Q8, Q15
VADD.I32 Q12, Q11, Q14
VSUB.I32 Q7, Q14, Q11
VSUB.I32 Q6, Q8, Q15
VREV64.32 Q7, Q7
VREV64.32 Q6, Q6
VSWP D14, D15
VSWP D12, D13
VSWP Q13, Q12
VST2.32 {Q12, Q13}, [R11]!
VST2.32 {Q6, Q7}, [R12]
VPOP {D8 - D15}
LDMFD sp!, {r0-r2, r3}
LDR R1, [SP, #48]
LDR R2, [SP, #44]
ADD R3, R1, #126
VLD1.32 D0[0], [R0, :32]!
SUB R4, R1, #2
ADD R5, R1, #130
VLD1.32 D1[0], [R0, :32]!
ADD R7, R2, #4
MOV R6, #0x8000
VDUP.32 Q15, R6
VADD.I32 D2, D0, D1
VSHR.S32 D2, D2, #1
VSHL.S32 D2, D2, #4
VADD.I32 Q2, Q1, Q15
VSHR.S32 Q2, Q2, #16
VSUB.I32 D6, D0, D1
VST1.16 D4[0], [R1]!
MOV R8, #28
MOV R9, #-2
VLD2.32 {Q0, Q1}, [R0]!
SUB R4, R4, #6
SUB R3, R3, #6
VLD2.16 {D4, D5}, [R7]!
VUZP.16 D0, D1
VUZP.16 D2, D3
VMULL.U16 Q14, D0, D4
VMLSL.U16 Q14, D2, D5
VSHR.S32 Q14, Q14, #16
VMLAL.S16 Q14, D1, D4
VMLSL.S16 Q14, D3, D5
VMULL.U16 Q13, D0, D5
VMLAL.U16 Q13, D2, D4
VSHR.U32 Q13, Q13, #16
VMLAL.S16 Q13, D1, D5
VMLAL.S16 Q13, D3, D4
VSHL.S32 Q12, Q14, #4
VLD2.32 {Q0, Q1}, [R0]!
VADD.I32 Q12, Q12, Q15
VSHR.S32 Q12, Q12, #16
VUZP.16 D24, D25
VSHL.S32 Q11, Q13, #4
VLD2.16 {D4, D5}, [R7]!
VADD.I32 Q11, Q11, Q15
VSHR.S32 Q11, Q11, #16
VUZP.16 D22, D23
VQNEG.S16 D20, D22
VUZP.16 D0, D1
VUZP.16 D2, D3
SUB R8, R8, #8
LOOP_2:
VMULL.U16 Q14, D0, D4
VST1.16 D24, [R1]!
VMLSL.U16 Q14, D2, D5
VREV64.16 D24, D24
VMULL.U16 Q13, D0, D5
VMLAL.U16 Q13, D2, D4
VST1.16 D24, [R4]
SUB R4, R4, #8
VREV64.16 D22, D22
VSHR.S32 Q14, Q14, #16
VSHR.U32 Q13, Q13, #16
VST1.16 D22, [R3]
VMLAL.S16 Q14, D1, D4
VMLSL.S16 Q14, D3, D5
VST1.16 D20, [R5]!
VMLAL.S16 Q13, D1, D5
VMLAL.S16 Q13, D3, D4
VSHL.S32 Q12, Q14, #4
SUB R3, R3, #8
VLD2.32 {Q0, Q1}, [R0]!
VSHL.S32 Q11, Q13, #4
VADD.I32 Q12, Q12, Q15
VLD2.16 {D4, D5}, [R7]!
VADD.I32 Q11, Q11, Q15
VUZP.16 D0, D1
VSHR.S32 Q12, Q12, #16
VUZP.16 D24, D25
VSHR.S32 Q11, Q11, #16
VUZP.16 D22, D23
SUBS R8, R8, #4
VUZP.16 D2, D3
VQNEG.S16 D20, D22
BGT LOOP_2
VMULL.U16 Q14, D0, D4
VST1.16 D24, [R1]!
VMLSL.U16 Q14, D2, D5
VREV64.16 D24, D24
VMULL.U16 Q13, D0, D5
VMLAL.U16 Q13, D2, D4
VST1.16 D24, [R4]
VSHR.S32 Q14, Q14, #16
SUB R4, R4, #8
VST1.16 D20, [R5]!
VMLAL.S16 Q14, D1, D4
VMLSL.S16 Q14, D3, D5
VREV64.16 D22, D22
VSHR.U32 Q13, Q13, #16
VST1.16 D22, [R3]
SUB R3, R3, #8
VMLAL.S16 Q13, D1, D5
VSHL.S32 Q12, Q14, #4
VMLAL.S16 Q13, D3, D4
VADD.I32 Q12, Q12, Q15
VSHL.S32 Q11, Q13, #4
VSHR.S32 Q12, Q12, #16
VUZP.16 D24, D25
VADD.I32 Q11, Q11, Q15
VST1.16 D24, [R1]!
VSHR.S32 Q11, Q11, #16
VREV64.16 D24, D24
VUZP.16 D22, D23
VST1.16 D24, [R4]
VQNEG.S16 D20, D22
SUB R4, R4, #2
VREV64.16 D22, D22
VST1.16 D22, [R3]
SUB R3, R3, #2
VST1.16 D20, [R5]!
VLD2.32 {Q0, Q1}, [R0]!
VLD2.16 {Q2}, [R7]
ADD R7, R7, #12
VUZP.16 D0, D1
VUZP.16 D2, D3
VMULL.U16 Q14, D0, D4
VMLSL.U16 Q14, D2, D5
VSHR.S32 Q14, Q14, #16
VMLAL.S16 Q14, D1, D4
VMLSL.S16 Q14, D3, D5
VMULL.U16 Q13, D0, D5
VMLAL.U16 Q13, D2, D4
VSHR.U32 Q13, Q13, #16
VMLAL.S16 Q13, D1, D5
VMLAL.S16 Q13, D3, D4
VSHL.S32 Q12, Q14, #4
VADD.I32 Q12, Q12, Q15
VSHR.S32 Q12, Q12, #16
VUZP.16 D24, D25
VSHL.S32 Q11, Q13, #4
VADD.I32 Q11, Q11, Q15
VSHR.S32 Q11, Q11, #16
VUZP.16 D22, D23
VQNEG.S16 D20, D22
VST1.16 D24[0], [R1]!
VST1.16 D24[1], [R1]!
VST1.16 D24[2], [R1]!
VST1.16 D24[0], [R4], R9
VST1.16 D24[1], [R4], R9
VST1.16 D24[2], [R4], R9
VST1.16 D22[0], [R3], R9
VST1.16 D22[1], [R3], R9
VST1.16 D22[2], [R3], R9
VST1.16 D20[0], [R5]!
VST1.16 D20[1], [R5]!
VST1.16 D20[2], [R5]!
VUZP.16 D6, D7
VLD1.16 D0, [R7]!
VMULL.U16 Q1, D0, D6
VSHR.S32 Q1, Q1, #16
VMLAL.S16 Q1, D0, D7
VSHL.S32 Q1, Q1, #4
VADD.I32 Q1, Q1, Q15
VSHR.S32 Q1, Q1, #16
VST1.16 D2[0], [R1]!
VST1.16 D2[0], [R4], R9
LDMFD sp!, {r4-r12, r15}