@/****************************************************************************** @ * @ * 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 .global ixheaacd_dct3_32 .type ixheaacd_dct3_32, %function .extern ixheaacd_radix4bfly .hidden ixheaacd_radix4bfly .extern ixheaacd_postradixcompute4 .hidden ixheaacd_postradixcompute4 ixheaacd_dct3_32: STMFD sp!, {R4-R12, R14} VPUSH {D8 - D15} ADD R6, R0, #196 SUB R7, R6, #8 ADD R10, R7, #4 MOV R9, #0 VDUP.32 D0, R9 ADD R4, R2, #8 MOV R8, R1 VLD1.32 D0[0], [R10] MOV R11, #-4 VSHR.S32 D0, D0, #7 VLD4.16 {D12, D13, D14, D15}, [R4]! MOV R12, #-16 VST1.32 D0, [R8]! SUB R7, R7, #12 VLD1.32 {Q0}, [R6]! VLD1.32 {Q1}, [R7], R12 SUB R9, R6, #144 VREV64.32 Q1, Q1 SUB R5, R7, #112 VSWP D2, D3 VSHR.S32 Q0, Q0, #7 VSHR.S32 Q1, Q1, #7 VLD1.32 {Q3}, [R9]! VADD.I32 Q2, Q1, Q0 VUZP.16 D4, D5 VSHR.S32 Q3, Q3, #7 VLD1.32 {Q4}, [R5], R12 VMULL.U16 Q15, D4, D12 VREV64.32 Q4, Q4 VMULL.U16 Q14, D4, D13 VSWP D8, D9 VSHR.S32 Q4, Q4, #7 VLD1.32 {Q0}, [R6]! VSUB.I32 Q5, Q3, Q4 VUZP.16 D10, D11 VMLAL.U16 Q15, D10, D13 VLD1.32 {Q1}, [R7], R12 VMLSL.U16 Q14, D10, D12 VREV64.32 Q1, Q1 VSHR.S32 Q0, Q0, #7 VSWP D2, D3 VSHR.U32 Q15, Q15, #16 VSHR.S32 Q1, Q1, #7 VMLAL.S16 Q15, D5, D12 VMLAL.S16 Q15, D11, D13 VSHR.S32 Q14, Q14, #16 VMLAL.S16 Q14, D5, D13 VADD.I32 Q2, Q1, Q0 VMLSL.S16 Q14, D11, D12 VUZP.16 D4, D5 SUB R9, R6, #144 VSWP Q15, Q14 SUB R5, R7, #112 VST2.32 {Q14, Q15}, [R8]! VLD1.32 {Q3}, [R9]! VLD1.32 {Q4}, [R5], R12 VSHR.S32 Q3, Q3, #7 VREV64.32 Q4, Q4 VSWP D8, D9 VSHR.S32 Q4, Q4, #7 VLD4.16 {D12, D13, D14, D15}, [R4]! VSUB.I32 Q5, Q3, Q4 VUZP.16 D10, D11 VMULL.U16 Q15, D4, D12 VMLAL.U16 Q15, D10, D13 VMULL.U16 Q14, D4, D13 VLD1.32 {Q0}, [R6]! VMLSL.U16 Q14, D10, D12 VLD1.32 {Q1}, [R7], R11 VSHR.U32 Q15, Q15, #16 VREV64.32 Q1, Q1 VSHR.S32 Q14, Q14, #16 VSWP D2, D3 VSHR.S32 Q0, Q0, #7 SUB R9, R6, #144 SUB R5, R7, #124 VLD1.32 {Q3}, [R9]! VMLAL.S16 Q14, D5, D13 VMLSL.S16 Q14, D11, D12 VLD1.32 {Q4}, [R5], R11 VMLAL.S16 Q15, D5, D12 VREV64.32 Q4, Q4 VMLAL.S16 Q15, D11, D13 VSWP D8, D9 VSHR.S32 Q1, Q1, #7 VADD.I32 Q2, Q1, Q0 VLD4.16 {D12, D13, D14, D15}, [R4]! VSHR.S32 Q3, Q3, #7 VUZP.16 D4, D5 VSHR.S32 Q4, Q4, #7 VSWP Q15, Q14 VSUB.I32 Q5, Q3, Q4 VST2.32 {Q14, Q15}, [R8]! VUZP.16 D10, D11 VMULL.U16 Q15, D4, D12 VMLAL.U16 Q15, D10, D13 VLD1.32 D0, [R6]! VMULL.U16 Q14, D4, D13 VMLSL.U16 Q14, D10, D12 VLD1.32 D1[0], [R6]! VSHR.U32 Q15, Q15, #16 VLD1.32 D2[0], [R7], R11 VMLAL.S16 Q15, D5, D12 VLD1.32 D2[1], [R7], R11 VMLAL.S16 Q15, D11, D13 SUB R9, R6, #140 VLD1.32 D3[0], [R7], R11 SUB R5, R7, #116 VLD1.32 D6, [R9]! VSHR.S32 Q14, Q14, #16 VSHR.S32 Q0, Q0, #7 VLD1.32 D7[0], [R9]! VMLAL.S16 Q14, D5, D13 VLD1.32 D8[0], [R5], R11 VMLSL.S16 Q14, D11, D12 VSHR.S32 Q1, Q1, #7 VLD4.16 {D12, D13, D14, D15}, [R4] VADD.I32 Q2, Q1, Q0 VLD1.32 D8[1], [R5], R11 VSHR.S32 Q3, Q3, #7 VSWP Q15, Q14 VLD1.32 D9[0], [R5], R11 VSHR.S32 Q4, Q4, #7 VST2.32 {Q14, Q15}, [R8]! ADD R4, #24 VUZP.16 D4, D5 VSUB.I32 Q5, Q3, Q4 VUZP.16 D10, D11 VMULL.U16 Q15, D4, D12 VMLAL.U16 Q15, D10, D13 VMULL.U16 Q14, D4, D13 VMLSL.U16 Q14, D10, D12 VLD1.16 D0[0], [R4]! VSHR.U32 Q15, Q15, #16 VSHR.S32 Q14, Q14, #16 VLD1.32 D2[0], [R7], R11 VMLAL.S16 Q15, D5, D12 SUB R5, R7, #124 VMLAL.S16 Q15, D11, D13 VLD1.32 D4[0], [R5] VMLAL.S16 Q14, D5, D13 VMLSL.S16 Q14, D11, D12 VSHR.S32 D2, D2, #7 VST1.32 D30[0], [R8]! VSHR.S32 D4, D4, #7 VSUB.I32 D2, D2, D4 VMOV D4, D2 VST1.32 D28[0], [R8]! MOV R6, R1 ADD R7, R1, #124 VST1.32 D30[1], [R8]! ADD R10, R3, #16 SUB R7, R7, #28 VST1.32 D28[1], [R8]! MOV R5, #-16 MOV R9, #-4 VST1.32 D31[0], [R8]! MOV R11, #16 VST1.32 D29[0], [R8]! MOV R12, #4 VUZP.16 D4, D5 MOV R8, #6 VLD1.16 D1[0], [R4], R8 VMULL.U16 Q15, D4, D0 VUZP.16 D2, D3 VMULL.U16 Q14, D4, D1 VMLAL.U16 Q15, D2, D1 VLD2.32 {D10, D11}, [R6] VMLSL.U16 Q14, D2, D0 ADD R4, R3, #4 MOV R8, #-32 VSHR.U32 Q15, Q15, #16 VSHR.S32 Q14, Q14, #16 VMLAL.S16 Q15, D5, D0 VMLAL.S16 Q15, D3, D1 VMLAL.S16 Q14, D5, D1 VMLSL.S16 Q14, D3, D0 VADD.I32 D14, D11, D28 VLD2.32 {Q2, Q3}, [R7] VNEG.S32 D14, D14 VREV64.32 Q2, Q2 VSUB.I32 D12, D10, D30 VREV64.32 Q3, Q3 VADD.I32 D10, D10, D30 VSWP D4, D5 VADD.I32 D10, D10, D14 VSWP D6, D7 VSUB.I32 D11, D11, D28 VADD.I32 D11, D11, D12 VLD2.16 {D8, D9}, [R10], R5 VSHR.S32 D10, D10, #1 VREV64.16 D8, D8 VSHR.S32 D11, D11, #1 VUZP.32 D10, D11 VST1.32 D10, [R6]! VLD2.32 {Q0, Q1}, [R6] VADD.I32 Q7, Q0, Q2 VLD2.16 {D10, D11}, [R4], R11 VSUB.I32 Q6, Q0, Q2 VUZP.16 D12, D13 VADD.I32 Q8, Q1, Q3 VUZP.16 D16, D17 VSUB.I32 Q9, Q1, Q3 VMULL.U16 Q15, D12, D8 VMLAL.U16 Q15, D16, D10 VMULL.U16 Q14, D12, D10 VMLSL.U16 Q14, D16, D8 VSHR.S32 Q7, Q7, #1 VSHR.U32 Q15, Q15, #16 VSHR.S32 Q9, Q9, #1 VSHR.S32 Q14, Q14, #16 VMLAL.S16 Q15, D13, D8 VMLAL.S16 Q15, D17, D10 VMLAL.S16 Q14, D13, D10 VMLSL.S16 Q14, D17, D8 VSUB.I32 Q10, Q7, Q15 VLD2.16 {D8, D9}, [R10] VADD.I32 Q13, Q7, Q15 VREV64.32 Q13, Q13 VSWP D26, D27 VADD.I32 Q11, Q9, Q14 VREV64.16 D8, D8 VSUB.I32 Q12, Q14, Q9 VREV64.32 Q12, Q12 VST2.32 {Q10, Q11}, [R6]! VSWP D24, D25 VSWP Q12, Q13 VST2.32 {Q12, Q13}, [R7], R8 VLD2.32 {Q0, Q1}, [R6] VLD2.32 {Q2, Q3}, [R7] VREV64.32 Q2, Q2 VREV64.32 Q3, Q3 VSWP D4, D5 VSWP D6, D7 VSUB.I32 Q6, Q0, Q2 VADD.I32 Q7, Q0, Q2 VLD2.16 {D10, D11}, [R4], R11 VADD.I32 Q8, Q1, Q3 VUZP.16 D12, D13 VSUB.I32 Q9, Q1, Q3 VUZP.16 D16, D17 VMULL.U16 Q15, D12, D8 VMLAL.U16 Q15, D16, D10 VMULL.U16 Q14, D12, D10 VMLSL.U16 Q14, D16, D8 ADD R7, R7, #8 VSHR.U32 Q15, Q15, #16 VSHR.S32 Q7, Q7, #1 VSHR.S32 Q14, Q14, #16 VMLAL.S16 Q15, D13, D8 VMLAL.S16 Q15, D17, D10 VMLAL.S16 Q14, D13, D10 VMLSL.S16 Q14, D17, D8 VSHR.S32 Q9, Q9, #1 VSUB.I32 Q10, Q7, Q15 VSUB.I32 Q12, Q14, Q9 VADD.I32 Q11, Q9, Q14 VST1.32 D20[0], [R6]! VADD.I32 Q13, Q7, Q15 VST1.32 D22[0], [R6]! VST1.32 D20[1], [R6]! VST1.32 D22[1], [R6]! VST1.32 D21[0], [R6]! VST1.32 D23[0], [R6]! VREV64.32 Q12, Q12 VREV64.32 Q13, Q13 VSWP D24, D25 VSWP D26, D27 VST1.32 D26[1], [R7]! VST1.32 D24[1], [R7]! VST1.32 D27[0], [R7]! VST1.32 D25[0], [R7]! VST1.32 D27[1], [R7]! VST1.32 D25[1], [R7]! SUB R7, R7, #32 VLD2.32 {D0, D1}, [R6] VLD2.32 {D2, D3}, [R7] VSUB.I32 D12, D0, D2 VLD1.16 D8, [R10], R9 VADD.I32 D14, D0, D2 VADD.I32 D16, D1, D3 VLD1.16 D10, [R4], R12 VSUB.I32 D18, D1, D3 VUZP.16 D12, D13 MOV R4, R0 VUZP.16 D16, D17 VMULL.U16 Q15, D12, D8 VMLAL.U16 Q15, D16, D10 VMULL.U16 Q14, D12, D10 VMLSL.U16 Q14, D16, D8 VSHR.S32 D18, D18, #1 VSHR.U32 Q15, Q15, #16 VSHR.S32 Q14, Q14, #16 VMLAL.S16 Q15, D13, D8 VMLAL.S16 Q15, D17, D10 MOV R10, R1 VMLAL.S16 Q14, D13, D10 VMLSL.S16 Q14, D17, D8 VNEG.S32 Q15, Q15 VSHR.S32 D14, D14, #1 VADD.I32 Q13, Q7, Q15 VADD.I32 Q11, Q9, Q14 LDR r0 , [sp , #104] VST1.32 D26[0], [R6]! MOV r2, #1 VST1.32 D22[0], [R6]! MOV r3, #4 BL ixheaacd_radix4bfly MOV r0, r4 MOV r1, r10 LDR r2 , [sp , #108] MOV r3, #16 BL ixheaacd_postradixcompute4 MOV r0, r4 MOV r1, r10 LDMIA r0!, {r4, r5} STR r4, [r1], #4 STR r5, [r1, #4] ADD r2, r0, #64 ADD r3, r1, #116 MOV r6, #7 BACK3: LDMIA r0!, {r4, r5} STR r5, [r1], #8 STR r4, [r1], #8 LDMIA r2!, {r4, r5} STR r5, [r3], #-8 STR r4, [r3], #-8 SUBS r6, r6, #1 BNE BACK3 LDMIA r0!, {r4, r5} STR r5, [r1], #8 STR r4, [r1], #8 VPOP {D8 - D15} LDMFD sp!, {r4-r12, r15}