@/****************************************************************************** @ * @ * 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_post_twiddle_armv7 ixheaacd_post_twiddle_armv7: STMFD sp!, {R4-R12} VPUSH {d8 - d15} LDR R4, [sp, #100] ARM_PROLOGUE: CMP R3, #0x400 LDR R6, =7500 ADD R2, R2, R6 BLT NEXT MOV R4, #50 MOV R5, #-50 MOV R6, #4 VDUP.16 D10, R4 B NEXT1 NEXT: LDR R4, =0x192 LDR R5, =0xfe6e MOV R6, #32 VDUP.16 D10, R4 NEXT1: LDR R7, [R1], #4 LDR R8, [R1], #4 LDR R9, [R2] ADD R2, R2, R6 SMULWT R11, R8, R9 SMULWB R10, R8, R9 SMULWT R12, R7, R9 SMLAWB R8, R7, R9, R11 SUB R10, R10, R12 MVN R8, R8 ADD R8, R8, #1 SMLAWB R9, R10, R5, R8 SMLAWB R11, R8, R4, R10 LSL R7, R3, #2 ADD R7, R0, R7 SUB R7, R7, #4 STR R11, [R7], #-4 STR R9, [R0], #4 LSL R5, R3, #2 ADD R5, R1, R5 SUB R5, R5, #40 SUB R3, R3, #1 ASR R3, R3, #4 SUB R7, R7, #28 MOV R8, #-32 NEON_PROLOGUE: VLD4.16 {D0, D1, D2, D3}, [R5], R8 VLD4.16 {D4, D5, D6, D7}, [R1]! VLD2.16 {D8[0], D9[0]}, [R2], R6 VLD2.16 {D8[1], D9[1]}, [R2], R6 VLD2.16 {D8[2], D9[2]}, [R2], R6 VLD2.16 {D8[3], D9[3]}, [R2], R6 VREV64.16 Q6, Q4 VMULL.U16 Q15, D2, D13 VMULL.U16 Q14, D0, D13 VMULL.U16 Q13, D2, D12 VMULL.U16 Q12, D0, D12 VSHR.U32 Q15, Q15, #16 VSHR.U32 Q14, Q14, #16 VSHR.U32 Q13, Q13, #16 VSHR.U32 Q12, Q12, #16 VMLAL.S16 Q15, D3, D13 VMLAL.S16 Q14, D1, D13 VMLAL.S16 Q13, D3, D12 VMLAL.S16 Q12, D1, D12 VMULL.U16 Q11, D6, D9 VMULL.U16 Q10, D4, D9 VADD.I32 Q14, Q14, Q13 VSUB.I32 Q15, Q15, Q12 VNEG.S32 Q14, Q14 VMULL.U16 Q9, D6, D8 VMULL.U16 Q8, D4, D8 VMOV Q13, Q15 VSHR.U32 Q11, Q11, #16 VMOV Q12, Q14 VSHR.U32 Q10, Q10, #16 VUZP.16 D26, D27 VSHR.U32 Q9, Q9, #16 VUZP.16 D24, D25 VSHR.U32 Q8, Q8, #16 VMLAL.S16 Q11, D7, D9 VMLAL.S16 Q10, D5, D9 VMLAL.S16 Q9, D7, D8 VMLAL.S16 Q8, D5, D8 VLD2.16 {D8[0], D9[0]}, [R2], R6 VMULL.U16 Q0, D26, D10 VLD2.16 {D8[1], D9[1]}, [R2], R6 VMULL.U16 Q1, D24, D10 VLD2.16 {D8[2], D9[2]}, [R2], R6 VADD.I32 Q11, Q11, Q8 VLD2.16 {D8[3], D9[3]}, [R2], R6 VSUB.I32 Q10, Q9, Q10 VREV64.16 Q6, Q4 VNEG.S32 Q11, Q11 VMOV Q9, Q11 VSHR.U32 Q0, Q0, #16 VMOV Q8, Q10 VSHR.U32 Q1, Q1, #16 VUZP.16 D18, D19 VMLAL.S16 Q0, D27, D10 VUZP.16 D16, D17 VMLAL.S16 Q1, D25, D10 VMULL.U16 Q2, D18, D10 VMULL.U16 Q3, D16, D10 VNEG.S32 Q0, Q0 VADD.I32 Q7, Q15, Q1 VADD.I32 Q13, Q14, Q0 VREV64.32 Q7, Q7 VSHR.U32 Q2, Q2, #16 VSWP D14, D15 VSHR.U32 Q3, Q3, #16 VMLAL.S16 Q2, D19, D10 VLD4.16 {D0, D1, D2, D3}, [R5], R8 VMLAL.S16 Q3, D17, D10 SUB R3, R3, #2 VADD.I32 Q12, Q10, Q2 VREV64.32 Q12, Q12 VNEG.S32 Q8, Q3 VLD4.16 {D4, D5, D6, D7}, [R1]! VSWP D24, D25 VADD.I32 Q8, Q11, Q8 CORE_LOOP_PT: VMULL.U16 Q15, D2, D13 VST2.32 {Q12, Q13}, [R7], R8 VMULL.U16 Q14, D0, D13 VMULL.U16 Q13, D2, D12 VST2.32 {Q7, Q8}, [R0]! VMULL.U16 Q12, D0, D12 VSHR.U32 Q15, Q15, #16 VSHR.U32 Q14, Q14, #16 VSHR.U32 Q13, Q13, #16 VSHR.U32 Q12, Q12, #16 VMLAL.S16 Q15, D3, D13 VMLAL.S16 Q14, D1, D13 VMLAL.S16 Q13, D3, D12 VMLAL.S16 Q12, D1, D12 VMULL.U16 Q11, D6, D9 VMULL.U16 Q10, D4, D9 VADD.I32 Q14, Q14, Q13 VSUB.I32 Q15, Q15, Q12 VNEG.S32 Q14, Q14 VMULL.U16 Q9, D6, D8 VMULL.U16 Q8, D4, D8 VMOV Q13, Q15 VSHR.U32 Q11, Q11, #16 VMOV Q12, Q14 VSHR.U32 Q10, Q10, #16 VUZP.16 D26, D27 VSHR.U32 Q9, Q9, #16 VUZP.16 D24, D25 VSHR.U32 Q8, Q8, #16 VMLAL.S16 Q11, D7, D9 VMLAL.S16 Q10, D5, D9 VMLAL.S16 Q9, D7, D8 VMLAL.S16 Q8, D5, D8 VLD2.16 {D8[0], D9[0]}, [R2], R6 VMULL.U16 Q0, D26, D10 VLD2.16 {D8[1], D9[1]}, [R2], R6 VMULL.U16 Q1, D24, D10 VLD2.16 {D8[2], D9[2]}, [R2], R6 VADD.I32 Q11, Q11, Q8 VLD2.16 {D8[3], D9[3]}, [R2], R6 VSUB.I32 Q10, Q9, Q10 VREV64.16 Q6, Q4 VNEG.S32 Q11, Q11 VMOV Q9, Q11 VSHR.U32 Q0, Q0, #16 VMOV Q8, Q10 VSHR.U32 Q1, Q1, #16 VUZP.16 D18, D19 VMLAL.S16 Q0, D27, D10 VUZP.16 D16, D17 VMLAL.S16 Q1, D25, D10 VMULL.U16 Q2, D18, D10 VMULL.U16 Q3, D16, D10 VNEG.S32 Q0, Q0 VADD.I32 Q7, Q15, Q1 VADD.I32 Q13, Q14, Q0 VREV64.32 Q7, Q7 VSHR.U32 Q2, Q2, #16 VSWP D14, D15 VSHR.U32 Q3, Q3, #16 VMLAL.S16 Q2, D19, D10 VLD4.16 {D0, D1, D2, D3}, [R5], R8 VMLAL.S16 Q3, D17, D10 VADD.I32 Q12, Q10, Q2 VREV64.32 Q12, Q12 VNEG.S32 Q8, Q3 VLD4.16 {D4, D5, D6, D7}, [R1]! VSWP D24, D25 VADD.I32 Q8, Q11, Q8 SUBS R3, R3, #1 BNE CORE_LOOP_PT NEON_EPILOGUE: VMULL.U16 Q15, D2, D13 VST2.32 {Q12, Q13}, [R7], R8 VMULL.U16 Q14, D0, D13 VMULL.U16 Q13, D2, D12 VST2.32 {Q7, Q8}, [R0]! VMULL.U16 Q12, D0, D12 VSHR.U32 Q15, Q15, #16 VSHR.U32 Q14, Q14, #16 VSHR.U32 Q13, Q13, #16 VSHR.U32 Q12, Q12, #16 VMLAL.S16 Q15, D3, D13 VMLAL.S16 Q14, D1, D13 VMLAL.S16 Q13, D3, D12 VMLAL.S16 Q12, D1, D12 VMULL.U16 Q11, D6, D9 VMULL.U16 Q10, D4, D9 VADD.I32 Q14, Q14, Q13 VSUB.I32 Q15, Q15, Q12 VNEG.S32 Q14, Q14 VMULL.U16 Q9, D6, D8 VMULL.U16 Q8, D4, D8 VMOV Q13, Q15 VSHR.U32 Q11, Q11, #16 VMOV Q12, Q14 VSHR.U32 Q10, Q10, #16 VUZP.16 D26, D27 VSHR.U32 Q9, Q9, #16 VUZP.16 D24, D25 VSHR.U32 Q8, Q8, #16 VMLAL.S16 Q11, D7, D9 VMLAL.S16 Q10, D5, D9 VMLAL.S16 Q9, D7, D8 VMLAL.S16 Q8, D5, D8 VMULL.U16 Q0, D26, D10 VMULL.U16 Q1, D24, D10 VADD.I32 Q11, Q11, Q8 VSUB.I32 Q10, Q9, Q10 VNEG.S32 Q11, Q11 VMOV Q9, Q11 VSHR.U32 Q0, Q0, #16 VMOV Q8, Q10 VSHR.U32 Q1, Q1, #16 VUZP.16 D18, D19 VMLAL.S16 Q0, D27, D10 VUZP.16 D16, D17 VMLAL.S16 Q1, D25, D10 VMULL.U16 Q2, D18, D10 VMULL.U16 Q3, D16, D10 VNEG.S32 Q0, Q0 VADD.I32 Q7, Q15, Q1 VADD.I32 Q13, Q14, Q0 VREV64.32 Q7, Q7 VSHR.U32 Q2, Q2, #16 VSWP D14, D15 VSHR.U32 Q3, Q3, #16 VMLAL.S16 Q2, D19, D10 VMLAL.S16 Q3, D17, D10 VADD.I32 Q12, Q10, Q2 VREV64.32 Q12, Q12 VNEG.S32 Q8, Q3 VSWP D24, D25 VADD.I32 Q8, Q11, Q8 VST2.32 {Q7, Q8}, [R0]! VST2.32 {Q12, Q13}, [R7], R8 VLD4.16 {D0, D1, D2, D3}, [R5], R8 VMOV.S32 D5, #0x00000000 VMOV.S32 D7, #0x00000000 VLD2.32 {D4, D6}, [R1]! VLD2.32 {D5[0], D7[0]}, [R1] VLD2.16 {D8[0], D9[0]}, [R2], R6 VLD2.16 {D8[1], D9[1]}, [R2], R6 VLD2.16 {D8[2], D9[2]}, [R2], R6 VLD2.16 {D8[3], D9[3]}, [R2], R6 VREV64.16 Q6, Q4 VUZP.16 D4, D5 VUZP.16 D6, D7 VMULL.U16 Q15, D2, D13 VMULL.U16 Q14, D0, D13 VMULL.U16 Q13, D2, D12 VMULL.U16 Q12, D0, D12 VSHR.U32 Q15, Q15, #16 VSHR.U32 Q14, Q14, #16 VSHR.U32 Q13, Q13, #16 VSHR.U32 Q12, Q12, #16 VMLAL.S16 Q15, D3, D13 VMLAL.S16 Q14, D1, D13 VMLAL.S16 Q13, D3, D12 VMLAL.S16 Q12, D1, D12 VMULL.U16 Q11, D6, D9 VMULL.U16 Q10, D4, D9 VADD.I32 Q14, Q14, Q13 VSUB.I32 Q15, Q15, Q12 VNEG.S32 Q14, Q14 VMULL.U16 Q9, D6, D8 VMULL.U16 Q8, D4, D8 VMOV Q13, Q15 VSHR.U32 Q11, Q11, #16 VMOV Q12, Q14 VSHR.U32 Q10, Q10, #16 VUZP.16 D26, D27 VSHR.U32 Q9, Q9, #16 VUZP.16 D24, D25 VSHR.U32 Q8, Q8, #16 VMLAL.S16 Q11, D7, D9 VMLAL.S16 Q10, D5, D9 VMLAL.S16 Q9, D7, D8 VMLAL.S16 Q8, D5, D8 VMULL.U16 Q0, D26, D10 VMULL.U16 Q1, D24, D10 VADD.I32 Q11, Q11, Q8 VSUB.I32 Q10, Q9, Q10 VNEG.S32 Q11, Q11 VMOV Q9, Q11 VSHR.U32 Q0, Q0, #16 VMOV Q8, Q10 VSHR.U32 Q1, Q1, #16 VUZP.16 D18, D19 VMLAL.S16 Q0, D27, D10 VUZP.16 D16, D17 VMLAL.S16 Q1, D25, D10 VMULL.U16 Q2, D18, D10 VMULL.U16 Q3, D16, D10 VNEG.S32 Q0, Q0 VADD.I32 Q7, Q15, Q1 VADD.I32 Q13, Q14, Q0 VREV64.32 Q7, Q7 VSHR.U32 Q2, Q2, #16 VSWP D14, D15 VSHR.U32 Q3, Q3, #16 VMLAL.S16 Q2, D19, D10 VMLAL.S16 Q3, D17, D10 VADD.I32 Q12, Q10, Q2 VREV64.32 Q12, Q12 VNEG.S32 Q8, Q3 VSWP D24, D25 VADD.I32 Q8, Q11, Q8 VST2.32 {D14, D16}, [R0]! VST2.32 {D15[0], D17[0]}, [R0]! VST1.32 D15[1], [R0] ADD R7, R7, #4 VST1.32 D26[0], [R7]! VST2.32 {D24[1], D26[1]}, [R7]! VST2.32 {D25, D27}, [R7] VPOP {d8 - d15} LDMFD sp!, {R4-R12} BX LR