524 lines
		
	
	
		
			13 KiB
		
	
	
	
		
			ArmAsm
		
	
	
	
			
		
		
	
	
			524 lines
		
	
	
		
			13 KiB
		
	
	
	
		
			ArmAsm
		
	
	
	
| @/******************************************************************************
 | |
| @ *
 | |
| @ * 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
 | |
|         .type ixheaacd_dec_DCT2_64_asm, %function
 | |
| 
 | |
| 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}
 | |
| 
 | |
| 
 |