blob: e65f1da97a6263e6cc08ce124cca8059cb26315a [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_pretwiddle_compute_armv7
ixheaacd_pretwiddle_compute_armv7:
STMFD sp!, {R4-R12}
VPUSH {d8 - d15}
MOVW R8, #7500
ADD R3, R3, R8
LDR R4, [sp, #100]
LDR R5, [sp, #104]
LSL R7, R4, #4
ADD R7, R2, R7
SUB R7, R7, #4
MVN R5, R5
ADD R5, R5, #1
ARM_PROLOGUE:
LDR R8, [R3], #4
LDR R9, [R0], #4
SMULWB R12, R9, R8
LDR R10, [R1], #-4
SMULWT R11, R9, R8
SMLAWT R9, R10, R8, R12
SMULWB R6, R10, R8
MVN R9, R9
ADD R9, R9, #1
SUB R11, R11, R6
CMP R5, #0
BGT NEXT
MVN R8, R5
ADD R8, R8, #1
ASR R11, R11, R8
ASR R9, R9, R8
B NEXT1
NEXT:
LSL R11, R11, R5
LSL R9, R9, R5
NEXT1:
STR R9, [R2], #4
STR R11, [R2], #4
CMP R4, #0x100
BNE NXT
MOV R6, #4
B NXT1
NXT:
MOV R6, #32
ADD R3, R3, #28
NXT1:
SUB R4, R4, #1
ASR R4, R4, #2
SUB R7, R7, #28
NEON_PROLOGUE:
MOV R8, #-32
VDUP.32 Q7, R5
SUB R1, R1, #28
VLD2.16 {D8[0], D9[0]}, [R3], R6
VLD2.16 {D8[1], D9[1]}, [R3], R6
VLD2.16 {D8[2], D9[2]}, [R3], R6
VLD2.16 {D8[3], D9[3]}, [R3], R6
VREV64.16 Q5, Q4
VLD4.16 {D0, D1, D2, D3}, [R0]!
VLD4.16 {D4, D5, D6, D7}, [R1], R8
VREV64.16 Q0, Q0
VREV64.16 Q2, Q2
VMULL.U16 Q15, D2, D9
VMULL.U16 Q14, D4, D9
VMULL.U16 Q13, D2, D8
VMULL.U16 Q12, D4, D8
VSHR.U32 Q15, Q15, #16
VSHR.U32 Q14, Q14, #16
VSHR.U32 Q13, Q13, #16
VSHR.U32 Q12, Q12, #16
VMLAL.S16 Q15, D3, D9
VMLAL.S16 Q14, D5, D9
VMLAL.S16 Q13, D3, D8
VMLAL.S16 Q12, D5, D8
VADD.I32 Q14, Q13, Q14
VNEG.S32 Q14, Q14
VSUB.I32 Q15, Q15, Q12
VMULL.U16 Q11, D0, D11
VMULL.U16 Q10, D6, D11
VMULL.U16 Q9, D0, D10
VMULL.U16 Q8, D6, D10
VSHR.U32 Q11, Q11, #16
VSHR.U32 Q10, Q10, #16
VSHR.U32 Q9, Q9, #16
VSHR.U32 Q8, Q8, #16
VMLAL.S16 Q11, D1, D11
VLD2.16 {D8[0], D9[0]}, [R3], R6
VMLAL.S16 Q10, D7, D11
VLD2.16 {D8[1], D9[1]}, [R3], R6
VMLAL.S16 Q9, D1, D10
VLD2.16 {D8[2], D9[2]}, [R3], R6
VMLAL.S16 Q8, D7, D10
VLD2.16 {D8[3], D9[3]}, [R3], R6
VADD.I32 Q10, Q10, Q9
VNEG.S32 Q10, Q10
VREV64.16 Q5, Q4
VSUB.I32 Q11, Q8, Q11
VLD4.16 {D0, D1, D2, D3}, [R0]!
VSHL.S32 Q10, Q10, Q7
VLD4.16 {D4, D5, D6, D7}, [R1], R8
VREV64.16 Q0, Q0
VSHL.S32 Q11, Q11, Q7
VREV64.16 Q2, Q2
VSHL.S32 Q9, Q15, Q7
VSHL.S32 Q8, Q14, Q7
SUB R4, R4, #2
CORE_LOOP_PTC:
VMULL.U16 Q15, D2, D9
VST2.32 {Q8, Q9}, [R2]!
VMULL.U16 Q14, D4, D9
VMULL.U16 Q13, D2, D8
VST2.32 {Q10, Q11}, [R7], R8
VMULL.U16 Q12, D4, D8
VSHR.U32 Q15, Q15, #16
VSHR.U32 Q14, Q14, #16
VSHR.U32 Q13, Q13, #16
VSHR.U32 Q12, Q12, #16
VMLAL.S16 Q15, D3, D9
VMLAL.S16 Q14, D5, D9
VMLAL.S16 Q13, D3, D8
VMLAL.S16 Q12, D5, D8
VADD.I32 Q14, Q13, Q14
VNEG.S32 Q14, Q14
VSUB.I32 Q15, Q15, Q12
VMULL.U16 Q11, D0, D11
VLD2.16 {D8[0], D9[0]}, [R3], R6
VMULL.U16 Q10, D6, D11
VMULL.U16 Q9, D0, D10
VLD2.16 {D8[1], D9[1]}, [R3], R6
VMULL.U16 Q8, D6, D10
VSHR.U32 Q11, Q11, #16
VLD2.16 {D8[2], D9[2]}, [R3], R6
VSHR.U32 Q10, Q10, #16
VSHR.U32 Q9, Q9, #16
VLD2.16 {D8[3], D9[3]}, [R3], R6
VSHR.U32 Q8, Q8, #16
VMLAL.S16 Q11, D1, D11
VMLAL.S16 Q10, D7, D11
VMLAL.S16 Q9, D1, D10
VMLAL.S16 Q8, D7, D10
VLD4.16 {D0, D1, D2, D3}, [R0]!
VADD.I32 Q10, Q10, Q9
VNEG.S32 Q10, Q10
VREV64.16 Q5, Q4
VSUB.I32 Q11, Q8, Q11
VLD4.16 {D4, D5, D6, D7}, [R1], R8
VSHL.S32 Q10, Q10, Q7
VSHL.S32 Q11, Q11, Q7
VREV64.16 Q0, Q0
VSHL.S32 Q9, Q15, Q7
VREV64.16 Q2, Q2
VSHL.S32 Q8, Q14, Q7
SUBS R4, R4, #1
BNE CORE_LOOP_PTC
NEON_EPILOGUE:
VMULL.U16 Q15, D2, D9
VST2.32 {Q8, Q9}, [R2]!
VMULL.U16 Q14, D4, D9
VMULL.U16 Q13, D2, D8
VST2.32 {Q10, Q11}, [R7], R8
VMULL.U16 Q12, D4, D8
VSHR.U32 Q15, Q15, #16
VSHR.U32 Q14, Q14, #16
VSHR.U32 Q13, Q13, #16
VSHR.U32 Q12, Q12, #16
VMLAL.S16 Q15, D3, D9
VMLAL.S16 Q14, D5, D9
VMLAL.S16 Q13, D3, D8
VMLAL.S16 Q12, D5, D8
VADD.I32 Q14, Q13, Q14
VNEG.S32 Q14, Q14
VSUB.I32 Q15, Q15, Q12
VMULL.U16 Q11, D0, D11
VMULL.U16 Q10, D6, D11
VMULL.U16 Q9, D0, D10
VMULL.U16 Q8, D6, D10
VSHR.U32 Q11, Q11, #16
VSHR.U32 Q10, Q10, #16
VSHR.U32 Q9, Q9, #16
VSHR.U32 Q8, Q8, #16
VMLAL.S16 Q11, D1, D11
VMLAL.S16 Q10, D7, D11
VMLAL.S16 Q9, D1, D10
VMLAL.S16 Q8, D7, D10
VADD.I32 Q10, Q10, Q9
VNEG.S32 Q10, Q10
VSUB.I32 Q11, Q8, Q11
VSHL.S32 Q10, Q10, Q7
VSHL.S32 Q11, Q11, Q7
VSHL.S32 Q9, Q15, Q7
VSHL.S32 Q8, Q14, Q7
VST2.32 {Q8, Q9}, [R2]!
VST2.32 {Q10, Q11}, [R7], R8
RESIDUE_NEON:
MOV R10, #-16
VMOV.S32 D3, #0x00000000
VMOV.S32 D4, #0x00000000
VLD2.32 {D0, D2}, [R0]!
VLD2.32 {D1[0], D3[0]}, [R0]!
VLD1.32 D1[1], [R0]
VUZP.16 D0, D1
VUZP.16 D2, D3
ADD R1, R1, #4
VLD1.32 D6[0], [R1]!
VLD2.32 {D4[1], D6[1]}, [R1]!
VLD2.32 {D5, D7}, [R1]!
VUZP.16 D4, D5
VUZP.16 D6, D7
VREV64.16 Q0, Q0
VREV64.16 Q2, Q2
VLD2.16 {D8[0], D9[0]}, [R3], R6
VLD2.16 {D8[1], D9[1]}, [R3], R6
VLD2.16 {D8[2], D9[2]}, [R3], R6
VLD2.16 {D8[3], D9[3]}, [R3], R6
VREV64.16 Q5, Q4
VMULL.U16 Q15, D2, D9
VMULL.U16 Q14, D4, D9
VMULL.U16 Q13, D2, D8
VMULL.U16 Q12, D4, D8
VSHR.U32 Q15, Q15, #16
VSHR.U32 Q14, Q14, #16
VSHR.U32 Q13, Q13, #16
VSHR.U32 Q12, Q12, #16
VMLAL.S16 Q15, D3, D9
VMLAL.S16 Q14, D5, D9
VMLAL.S16 Q13, D3, D8
VMLAL.S16 Q12, D5, D8
VADD.I32 Q14, Q13, Q14
VNEG.S32 Q14, Q14
VSUB.I32 Q15, Q15, Q12
VMULL.U16 Q11, D0, D11
VMULL.U16 Q10, D6, D11
VMULL.U16 Q9, D0, D10
VMULL.U16 Q8, D6, D10
VSHR.U32 Q11, Q11, #16
VSHR.U32 Q10, Q10, #16
VSHR.U32 Q9, Q9, #16
VSHR.U32 Q8, Q8, #16
VMLAL.S16 Q11, D1, D11
VMLAL.S16 Q10, D7, D11
VMLAL.S16 Q9, D1, D10
VMLAL.S16 Q8, D7, D10
VADD.I32 Q10, Q10, Q9
VNEG.S32 Q10, Q10
VSUB.I32 Q11, Q8, Q11
VSHL.S32 Q10, Q10, Q7
VSHL.S32 Q11, Q11, Q7
VSHL.S32 Q9, Q15, Q7
VSHL.S32 Q8, Q14, Q7
VST2.32 {Q10, Q11}, [R7]
VST2.32 {D16, D18}, [R2]!
VST2.32 {D17[0], D19[0]}, [R2]!
VPOP {d8 - d15}
LDMFD sp!, {R4-R12}
BX LR