blob: b376470859455e1962fff1984e179b0b41d990ff [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
.global ixheaacd_over_lap_add1_armv7
ixheaacd_over_lap_add1_armv7:
STMFD sp!, {R4-R12, R14}
VPUSH {d8 - d15}
LDR R4, [SP, #104]
LDR R5, [SP, #108]
LDR R6, [SP, #112]
MOV R10, R5, LSL #1
SUB R11, R10, #1
MOV R10, R11, LSL #2
ADD R10, R0, R10
SUB R10, R10, #12
MOV R8, R11, LSL #1
ADD R8, R8, R3
SUB R8, R8, #14
MOV R12, #0
VDUP.S16 D12, R12
MOV R12, #-16
VDUP.16 Q11, R4
VLD1.32 {D6, D7}, [R10], R12
MOV R7, #0x2000
VREV64.32 Q3, Q3
RSB R7, R7, #0
VQNEG.S32 Q0, Q3
VDUP.32 Q10, R7
VUZP.16 D1, D0
SUB R11, R5, #1
VUZP.16 D7, D6
SMULBB R11, R11, R6
MOV R11, R11, LSL #1
VLD2.16 {D2, D3}, [R8], R12
ADD R11, R11, R2
VREV64.16 Q1, Q1
MOV R4, R6, LSL #1
RSB R4, R4, #0
MOV R9, R6, LSL #1
SMULBB R6, R5, R6
MOV R6, R6, LSL #1
ADD R6, R6, R2
VMULL.U16 Q15, D7, D2
VLD1.32 {D4, D5}, [R1]!
VSHR.U32 Q15, Q15, #16
VMLAL.S16 Q15, D6, D2
VQSHL.S32 Q15, Q15, Q11
VADDL.S16 Q7, D3, D12
VMULL.S32 Q13, D4, D14
VQMOVN.S64 D28, Q13
VMULL.S32 Q13, D5, D15
VQMOVN.S64 D29, Q13
VQADD.S32 Q14, Q14, Q10
VQSUB.S32 Q13, Q15, Q14
VQSHL.S32 Q13, Q13, #2
VSHR.S32 Q13, Q13, #16
VUZP.16 D26, D27
VMULL.U16 Q12, D1, D3
VSHR.U32 Q12, Q12, #16
VMLAL.S16 Q12, D0, D3
VQSHL.S32 Q12, Q12, Q11
VLD1.32 {D6, D7}, [R10], R12
VADDL.S16 Q7, D2, D12
VMULL.S32 Q0, D14, D4
VQMOVN.S64 D16, Q0
VMULL.S32 Q0, D15, D5
VQMOVN.S64 D17, Q0
VREV64.32 Q3, Q3
VQADD.S32 Q8, Q8, Q10
VQNEG.S32 Q0, Q3
VUZP.16 D1, D0
VQSUB.S32 Q9, Q12, Q8
VUZP.16 D7, D6
VQSHL.S32 Q9, Q9, #2
VLD2.16 {D2, D3}, [R8], R12
VSHR.S32 Q9, Q9, #16
VREV64.16 Q1, Q1
VUZP.16 D18, D19
VLD1.32 {D4, D5}, [R1]!
SUB R5, R5, #8
LOOP_1:
VST1.16 D26[0], [R11], R4
VMULL.U16 Q15, D7, D2
VST1.16 D26[1], [R11], R4
VMULL.U16 Q12, D1, D3
VST1.16 D26[2], [R11], R4
VSHR.U32 Q15, Q15, #16
VST1.16 D26[3], [R11], R4
VSHR.U32 Q12, Q12, #16
VST1.16 D18[0], [R6], R9
VMLAL.S16 Q15, D6, D2
VST1.16 D18[1], [R6], R9
VMLAL.S16 Q12, D0, D3
VST1.16 D18[2], [R6], R9
VQSHL.S32 Q15, Q15, Q11
VST1.16 D18[3], [R6], R9
VQSHL.S32 Q12, Q12, Q11
VLD1.32 {D6, D7}, [R10], R12
VADDL.S16 Q7, D3, D12
VMULL.S32 Q8, D4, D14
VQMOVN.S64 D28, Q8
VMULL.S32 Q8, D5, D15
VQMOVN.S64 D29, Q8
VREV64.32 Q3, Q3
VADDL.S16 Q7, D2, D12
VMULL.S32 Q0, D4, D14
VQMOVN.S64 D16, Q0
VMULL.S32 Q0, D5, D15
VQMOVN.S64 D17, Q0
VLD2.16 {D2, D3}, [R8], R12
VQNEG.S32 Q0, Q3
VLD1.32 {D4, D5}, [R1]!
VQADD.S32 Q14, Q14, Q10
VUZP.16 D1, D0
VQADD.S32 Q8, Q8, Q10
VUZP.16 D7, D6
VQSUB.S32 Q13, Q15, Q14
VREV64.16 Q1, Q1
VQSUB.S32 Q9, Q12, Q8
VQSHL.S32 Q13, Q13, #2
VQSHL.S32 Q9, Q9, #2
VMULL.U16 Q15, D7, D2
VSHR.S32 Q13, Q13, #16
VUZP.16 D26, D27
VSHR.S32 Q9, Q9, #16
VST1.16 D26[0], [R11], R4
VMULL.U16 Q12, D1, D3
VUZP.16 D18, D19
VSHR.U32 Q15, Q15, #16
VST1.16 D26[1], [R11], R4
VMLAL.S16 Q15, D6, D2 @MLA
VST1.16 D26[2], [R11], R4
VSHR.U32 Q12, Q12, #16
VST1.16 D26[3], [R11], R4
VMLAL.S16 Q12, D0, D3 @MLA
VST1.16 D18[0], [R6], R9
VQSHL.S32 Q15, Q15, Q11
VST1.16 D18[1], [R6], R9
VQSHL.S32 Q12, Q12, Q11
VST1.16 D18[2], [R6], R9
VADDL.S16 Q7, D3, D12
VMULL.S32 Q8, D4, D14
VQMOVN.S64 D28, Q8
VMULL.S32 Q8, D5, D15
VQMOVN.S64 D29, Q8
VST1.16 D18[3], [R6], R9
VADDL.S16 Q7, D2, D12
VMULL.S32 Q0, D4, D14
VQMOVN.S64 D16, Q0
VMULL.S32 Q0, D5, D15
VQMOVN.S64 D17, Q0
VLD1.32 {D6, D7}, [R10], R12
VQADD.S32 Q14, Q14, Q10
VREV64.32 Q3, Q3
VQNEG.S32 Q0, Q3
VUZP.16 D1, D0
VQSUB.S32 Q13, Q15, Q14
VUZP.16 D7, D6
VQADD.S32 Q8, Q8, Q10
VLD2.16 {D2, D3}, [R8], R12
VQSUB.S32 Q9, Q12, Q8
VREV64.16 Q1, Q1
VQSHL.S32 Q13, Q13, #2
VLD1.32 {D4, D5}, [R1]!
VQSHL.S32 Q9, Q9, #2
VSHR.S32 Q13, Q13, #16
SUBS R5, R5, #8
VSHR.S32 Q9, Q9, #16
VUZP.16 D26, D27
VUZP.16 D18, D19
BGT LOOP_1
VST1.16 D26[0], [R11], R4
VMULL.U16 Q15, D7, D2
VST1.16 D26[1], [R11], R4
VMULL.U16 Q12, D1, D3
VST1.16 D26[2], [R11], R4
VSHR.U32 Q15, Q15, #16
VST1.16 D26[3], [R11], R4
VSHR.U32 Q12, Q12, #16
VST1.16 D18[0], [R6], R9
VMLAL.S16 Q15, D6, D2
VST1.16 D18[1], [R6], R9
VMLAL.S16 Q12, D0, D3
VST1.16 D18[2], [R6], R9
VQSHL.S32 Q15, Q15, Q11
VST1.16 D18[3], [R6], R9
VQSHL.S32 Q12, Q12, Q11
VADDL.S16 Q7, D3, D12
VMULL.S32 Q8, D4, D14
VQMOVN.S64 D28, Q8
VMULL.S32 Q8, D5, D15
VQMOVN.S64 D29, Q8
VADDL.S16 Q7, D2, D12
VMULL.S32 Q13, D4, D14
VQMOVN.S64 D16, Q13
VMULL.S32 Q13, D5, D15
VQMOVN.S64 D17, Q13
VQADD.S32 Q14, Q14, Q10
VQADD.S32 Q8, Q8, Q10
VQSUB.S32 Q13, Q15, Q14
VQSUB.S32 Q9, Q12, Q8
VQSHL.S32 Q13, Q13, #2
VQSHL.S32 Q9, Q9, #2
VSHR.S32 Q13, Q13, #16
VSHR.S32 Q9, Q9, #16
VUZP.16 D26, D27
VUZP.16 D18, D19
VST1.16 D26[0], [R11], R4
VST1.16 D26[1], [R11], R4
VST1.16 D26[2], [R11], R4
VST1.16 D26[3], [R11], R4
VST1.16 D18[0], [R6], R9
VST1.16 D18[1], [R6], R9
VST1.16 D18[2], [R6], R9
VST1.16 D18[3], [R6], R9
VPOP {d8 - d15}
LDMFD sp!, {R4-R12, R15}