You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
826 lines
17 KiB
826 lines
17 KiB
@/******************************************************************************
|
|
@ *
|
|
@ * 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_imdct_using_fft_armv7
|
|
ixheaacd_imdct_using_fft_armv7:
|
|
|
|
STMFD sp!, {r4-r12, lr}
|
|
vpush {d8-d15}
|
|
|
|
@ LDR r4, [sp, #0x68]
|
|
@ LDR r5, [sp, #0x68+4]
|
|
@ LDR r6, [sp, #0x68+8]
|
|
@ LDR r7, [sp, #0x68+12]
|
|
|
|
MOVW r8, #11600
|
|
ADD r4, r0, r8
|
|
MOVW r8, #11856
|
|
ADD r5, r0, r8
|
|
MOVW r8, #11920
|
|
ADD r6, r0, r8
|
|
MOVW r8, #11936
|
|
ADD r7, r0, r8
|
|
|
|
|
|
|
|
|
|
|
|
COND_1: CMP r1, #0x400
|
|
BNE COND_2
|
|
|
|
MOV r8, #4
|
|
B RADIX_4_FIRST_START
|
|
|
|
|
|
COND_2: CMP r1, #0x200
|
|
BNE COND_3
|
|
|
|
MOV r8, #3
|
|
MOV r4, r5
|
|
B RADIX_8_FIRST_START
|
|
|
|
COND_3: CMP r1, #0x100
|
|
BNE COND_4
|
|
|
|
MOV r8, #3
|
|
MOV r4, r5
|
|
B RADIX_4_FIRST_START
|
|
|
|
COND_4: CMP r1, #0x80
|
|
BNE COND_5
|
|
|
|
MOV r8, #2
|
|
MOV r4, r6
|
|
B RADIX_8_FIRST_START
|
|
|
|
COND_5: CMP r1, #0x40
|
|
BNE COND_6
|
|
|
|
MOV r8, #2
|
|
MOV r4, r6
|
|
B RADIX_4_FIRST_START
|
|
COND_6:
|
|
|
|
MOV r8, #1
|
|
MOV r4, r7
|
|
|
|
|
|
|
|
|
|
|
|
|
|
RADIX_8_FIRST_START:
|
|
|
|
|
|
LSR r9 , r1, #5
|
|
LSL r1, r1, #1
|
|
|
|
RADIX_8_FIRST_LOOP:
|
|
|
|
MOV r5 , r2
|
|
MOV r6 , r2
|
|
MOV r7 , r2
|
|
MOV r11 , r2
|
|
|
|
LDRB r12, [r4, #0]
|
|
ADD r5, r5, r12, LSL #3
|
|
VLD2.32 {d0[0], d2[0]}, [r5] , r1
|
|
ADD r5, r5, r1
|
|
VLD2.32 {d8[0], d10[0]}, [r5] , r1
|
|
SUB r5, r5, r1, LSL #1
|
|
VLD2.32 {d4[0], d6[0]}, [r5] , r1
|
|
ADD r5, r5, r1
|
|
VLD2.32 {d12[0], d14[0]}, [r5], r1
|
|
SUB r5, r5, r1, LSL #2
|
|
|
|
LDRB r12, [r4, #1]
|
|
ADD r6, r6, r12, LSL #3
|
|
VLD2.32 {d0[1], d2[1]}, [r6] , r1
|
|
ADD r6, r6, r1
|
|
VLD2.32 {d8[1], d10[1]}, [r6] , r1
|
|
SUB r6, r6, r1, LSL #1
|
|
VLD2.32 {d4[1], d6[1]}, [r6] , r1
|
|
ADD r6, r6, r1
|
|
VLD2.32 {d12[1], d14[1]}, [r6], r1
|
|
SUB r6, r6, r1, LSL #2
|
|
|
|
|
|
LDRB r12, [r4, #2]
|
|
ADD r7, r7, r12 , LSL #3
|
|
VLD2.32 {d1[0], d3[0]}, [r7] , r1
|
|
ADD r7, r7, r1
|
|
VLD2.32 {d9[0], d11[0]}, [r7] , r1
|
|
SUB r7, r7, r1, LSL #1
|
|
|
|
LDRB r12, [r4, #3]
|
|
ADD r11, r11, r12 , LSL #3
|
|
VLD2.32 {d1[1], d3[1]}, [r11] , r1
|
|
ADD r11, r11, r1
|
|
VLD2.32 {d9[1], d11[1]}, [r11] , r1
|
|
SUB r11, r11, r1, LSL #1
|
|
|
|
|
|
|
|
VADD.I32 q8, q0, q4
|
|
VLD2.32 {d5[0], d7[0]}, [r7] , r1
|
|
ADD r7, r7, r1
|
|
|
|
VSUB.I32 q9, q0, q4
|
|
VLD2.32 {d13[0], d15[0]}, [r7], r1
|
|
SUB r7, r7, r1, LSL #2
|
|
|
|
|
|
|
|
|
|
VADD.I32 q0, q1, q5
|
|
VLD2.32 {d5[1], d7[1]}, [r11] , r1
|
|
ADD r11, r11, r1
|
|
|
|
VSUB.I32 q4, q1, q5
|
|
VLD2.32 {d13[1], d15[1]}, [r11], r1
|
|
SUB r11, r11, r1, LSL #2
|
|
|
|
|
|
|
|
ADD r4, r4, #4
|
|
|
|
ADD r5, r5, r1, LSR #1
|
|
ADD r6, r6, r1, LSR #1
|
|
ADD r7, r7, r1, LSR #1
|
|
ADD r11, r11, r1, LSR #1
|
|
|
|
|
|
VADD.I32 q1, q2, q6
|
|
VLD2.32 {d28[0], d30[0]}, [r5] , r1
|
|
|
|
|
|
VSUB.I32 q5, q2, q6
|
|
VLD2.32 {d20[0], d22[0]}, [r5] , r1
|
|
|
|
|
|
VADD.I32 q2, q3, q7
|
|
VLD2.32 {d24[0], d26[0]}, [r5] , r1
|
|
|
|
|
|
VSUB.I32 q6, q3, q7
|
|
VLD2.32 {d28[1], d30[1]}, [r6] , r1
|
|
|
|
VADD.S32 q3, q9, q6
|
|
VLD2.32 {d20[1], d22[1]}, [r6] , r1
|
|
|
|
VSUB.S32 q7, q9, q6
|
|
VLD2.32 {d24[1], d26[1]}, [r6] , r1
|
|
|
|
VSUB.S32 q6, q4, q5
|
|
VLD2.32 {d29[0], d31[0]}, [r7] , r1
|
|
|
|
VADD.S32 q9, q4, q5
|
|
VLD2.32 {d21[0], d23[0]}, [r7] , r1
|
|
|
|
VADD.S32 q4, q8, q1
|
|
VLD2.32 {d25[0], d27[0]}, [r7] , r1
|
|
|
|
VSUB.S32 q5, q8, q1
|
|
VLD2.32 {d29[1], d31[1]}, [r11] , r1
|
|
|
|
VADD.S32 q8, q0, q2
|
|
VLD2.32 {d21[1], d23[1]}, [r11] , r1
|
|
|
|
VSUB.S32 q0, q0, q2
|
|
VLD2.32 {d25[1], d27[1]}, [r11] , r1
|
|
|
|
|
|
VPUSH {q3}
|
|
VPUSH {q7}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
VLD2.32 {d2[0], d4[0]}, [r5], r1
|
|
|
|
VADD.I32 q7, q14, q12
|
|
|
|
VLD2.32 {d2[1], d4[1]}, [r6] , r1
|
|
|
|
VSUB.I32 q3, q14, q12
|
|
|
|
VLD2.32 {d3[0], d5[0]}, [r7] , r1
|
|
|
|
VADD.I32 q14, q15, q13
|
|
|
|
VLD2.32 {d3[1], d5[1]}, [r11] , r1
|
|
|
|
VSUB.I32 q12, q15, q13
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
VADD.I32 q15, q10, q1
|
|
VSUB.I32 q13, q10, q1
|
|
VADD.I32 q10, q11, q2
|
|
VSUB.I32 q1, q11, q2
|
|
|
|
|
|
|
|
VADD.S32 q11, q7, q15
|
|
VSUB.S32 q2, q7, q15
|
|
VADD.S32 q7, q14, q10
|
|
VSUB.S32 q15, q14, q10
|
|
|
|
VADD.S32 q14, q3, q12
|
|
VSUB.S32 q10, q3, q12
|
|
VADD.S32 q3, q13, q1
|
|
VSUB.S32 q12, q13, q1
|
|
|
|
VADD.S32 q1 , q14, q12
|
|
VSUB.S32 q13, q14, q12
|
|
VSUB.S32 q12, q3, q10
|
|
|
|
VUZP.16 d2, d3
|
|
VADD.S32 q14, q3, q10
|
|
|
|
VUZP.16 d26, d27
|
|
VADD.S32 q3, q4, q11
|
|
|
|
VUZP.16 d24, d25
|
|
VSUB.S32 q10, q4, q11
|
|
|
|
VUZP.16 d28, d29
|
|
VADD.S32 q4, q8, q7
|
|
|
|
MOVW r14, #0x5a82
|
|
|
|
VSUB.S32 q11, q8, q7
|
|
|
|
VADD.S32 q8, q5, q15
|
|
VSUB.S32 q7, q5, q15
|
|
VSUB.S32 q5, q0, q2
|
|
VADD.S32 q15, q0, q2
|
|
|
|
VPOP {q0}
|
|
VPOP {q2}
|
|
VPUSH {q3-q4}
|
|
VPUSH {q10}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
VDUP.16 d20, r14
|
|
|
|
|
|
VMULL.u16 q4, d26, d20
|
|
VMULL.u16 q3, d28, d20
|
|
|
|
VPUSH {q7-q8}
|
|
VPUSH {q5}
|
|
|
|
VSHR.S32 q4, q4, #15
|
|
VSHR.S32 q3, q3, #15
|
|
|
|
VQDMLAL.S16 q4, d27, d20
|
|
VQDMLAL.S16 q3, d29, d20
|
|
|
|
|
|
VPUSH {q11}
|
|
|
|
VMULL.u16 q13, d24, d20
|
|
VMULL.u16 q14, d2, d20
|
|
|
|
VADD.S32 q5, q2, q4
|
|
VSUB.S32 q7, q2, q4
|
|
|
|
VADD.S32 q8, q6, q3
|
|
VSUB.S32 q6, q6, q3
|
|
|
|
|
|
|
|
|
|
|
|
|
|
VSHR.S32 q13, q13, #15
|
|
VSHR.S32 q14, q14, #15
|
|
|
|
VQDMLAL.S16 q13, d25, d20
|
|
VQDMLAL.S16 q14, d3, d20
|
|
|
|
VPOP {q1}
|
|
VPOP {q10}
|
|
|
|
VADD.S32 q2, q0, q13
|
|
VSUB.S32 q4, q0, q13
|
|
|
|
VADD.S32 q11, q9, q14
|
|
VSUB.S32 q3, q9, q14
|
|
|
|
|
|
|
|
|
|
VPOP {q14}
|
|
VPOP {q9}
|
|
VPOP {q0}
|
|
VPOP {q12, q13}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
VTRN.32 q12, q5
|
|
VSHL.S32 q12, q12, #3
|
|
VTRN.32 q9, q2
|
|
VSHL.S32 q5, q5, #3
|
|
|
|
VSHL.S32 q9, q9, #3
|
|
VTRN.32 q0, q7
|
|
VSHL.S32 q2, q2, #3
|
|
|
|
VSHL.S32 q0, q0, #3
|
|
VTRN.32 q14, q4
|
|
VSHL.S32 q7, q7, #3
|
|
|
|
VSHL.S32 q14, q14, #3
|
|
VTRN.32 q13, q6
|
|
VSHL.S32 q4, q4, #3
|
|
|
|
VSHL.S32 q13, q13, #3
|
|
VTRN.32 q10, q3
|
|
VSHL.S32 q6, q6, #3
|
|
|
|
VSHL.S32 q10, q10, #3
|
|
VTRN.32 q1, q8
|
|
VSHL.S32 q3, q3, #3
|
|
|
|
VSHL.S32 q1, q1, #3
|
|
VTRN.32 q15, q11
|
|
VSHL.S32 q8, q8, #3
|
|
|
|
VSHL.S32 q15, q15, #3
|
|
VSWP d18, d25
|
|
|
|
VSHL.S32 q11, q11, #3
|
|
VSWP d4, d11
|
|
|
|
VSWP d1, d28
|
|
VSWP d15, d8
|
|
|
|
VSWP d20, d27
|
|
VSWP d6, d13
|
|
|
|
VSWP d30, d3
|
|
VSWP d22, d17
|
|
|
|
VST2.32 {q12, q13}, [r3]!
|
|
VST2.32 {q0, q1}, [r3]!
|
|
|
|
VST2.32 {q5, q6}, [r3]!
|
|
VST2.32 {q7, q8}, [r3]!
|
|
|
|
VMOV q5, q11
|
|
|
|
VST2.32 {q9, q10}, [r3]!
|
|
VST2.32 {q14, q15}, [r3]!
|
|
|
|
VST2.32 {q2, q3}, [r3]!
|
|
VST2.32 {q4, q5}, [r3]!
|
|
|
|
|
|
SUBS r9, r9, #1
|
|
BNE RADIX_8_FIRST_LOOP
|
|
|
|
LSR r1, r1, #1
|
|
SUB r3, r1, LSL #3
|
|
|
|
MOV r5, #8
|
|
MOV r4, #32
|
|
LSR r6, r1, #5
|
|
|
|
B RADIX_4_FIRST_ENDS
|
|
|
|
RADIX_8_FIRST_ENDS:
|
|
|
|
|
|
RADIX_4_FIRST_START:
|
|
|
|
|
|
LSR r9 , r1, #4
|
|
LSL r1, r1, #1
|
|
|
|
RADIX_4_LOOP:
|
|
|
|
MOV r5 , r2
|
|
MOV r6 , r2
|
|
MOV r7 , r2
|
|
MOV r11 , r2
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
LDRB r12, [r4, #0]
|
|
ADD r5, r5, r12, LSL #3
|
|
|
|
VLD2.32 {d0[0], d2[0]}, [r5] , r1
|
|
ADD r5, r5, r1
|
|
VLD2.32 {d8[0], d10[0]}, [r5] , r1
|
|
SUB r5, r5, r1, LSL #1
|
|
VLD2.32 {d4[0], d6[0]}, [r5] , r1
|
|
ADD r5, r5, r1
|
|
VLD2.32 {d12[0], d14[0]}, [r5], r1
|
|
|
|
LDRB r12, [r4, #1]
|
|
ADD r6, r6, r12, LSL #3
|
|
|
|
VLD2.32 {d0[1], d2[1]}, [r6] , r1
|
|
ADD r6, r6, r1
|
|
VLD2.32 {d8[1], d10[1]}, [r6] , r1
|
|
SUB r6, r6, r1, LSL #1
|
|
VLD2.32 {d4[1], d6[1]}, [r6] , r1
|
|
ADD r6, r6, r1
|
|
VLD2.32 {d12[1], d14[1]}, [r6], r1
|
|
|
|
|
|
LDRB r12, [r4, #2]
|
|
ADD r7, r7, r12, LSL #3
|
|
|
|
VLD2.32 {d1[0], d3[0]}, [r7] , r1
|
|
ADD r7, r7, r1
|
|
VLD2.32 {d9[0], d11[0]}, [r7] , r1
|
|
|
|
LDRB r12, [r4, #3]
|
|
ADD r11, r11, r12 , LSL #3
|
|
|
|
VLD2.32 {d1[1], d3[1]}, [r11] , r1
|
|
ADD r11, r11, r1
|
|
VLD2.32 {d9[1], d11[1]}, [r11] , r1
|
|
|
|
|
|
SUB r7, r7, r1, LSL #1
|
|
VADD.S32 q8, q0, q4
|
|
VLD2.32 {d5[0], d7[0]}, [r7] , r1
|
|
ADD r7, r7, r1
|
|
VADD.S32 q9, q1, q5
|
|
VLD2.32 {d13[0], d15[0]}, [r7], r1
|
|
|
|
|
|
|
|
SUB r11, r11, r1, LSL #1
|
|
VSUB.S32 q10, q0, q4
|
|
VLD2.32 {d5[1], d7[1]}, [r11] , r1
|
|
ADD r11, r11, r1
|
|
VSUB.S32 q11, q1, q5
|
|
VLD2.32 {d13[1], d15[1]}, [r11], r1
|
|
|
|
|
|
ADD r4, r4, #4
|
|
|
|
VADD.S32 q12, q2, q6
|
|
VADD.S32 q13, q3, q7
|
|
VSUB.S32 q14, q2, q6
|
|
VSUB.S32 q15, q3, q7
|
|
|
|
VADD.S32 q0, q8, q12
|
|
VADD.S32 q1, q9, q13
|
|
VSUB.S32 q2, q8, q12
|
|
VSUB.S32 q3, q9, q13
|
|
|
|
VADD.S32 q4, q10, q15
|
|
VSUB.S32 q5, q11, q14
|
|
VADD.S32 q7, q11, q14
|
|
VSUB.S32 q6, q10, q15
|
|
|
|
|
|
|
|
|
|
VTRN.32 q0, q4
|
|
|
|
VSHL.S32 q0, q0, #2
|
|
VTRN.32 q2, q6
|
|
VSHL.S32 q4, q4, #2
|
|
|
|
VSHL.S32 q2, q2, #2
|
|
VTRN.32 q1, q5
|
|
VSHL.S32 q6, q6, #2
|
|
|
|
VSHL.S32 q1, q1, #2
|
|
VTRN.32 q3, q7
|
|
VSHL.S32 q5, q5, #2
|
|
|
|
VSHL.S32 q3, q3, #2
|
|
VSWP d4, d1
|
|
|
|
VSHL.S32 q7, q7, #2
|
|
VSWP d12, d9
|
|
|
|
|
|
|
|
VSWP d6, d3
|
|
VSWP d14, d11
|
|
|
|
|
|
VST2.32 {q0, q1}, [r3]!
|
|
VST2.32 {q4, q5}, [r3]!
|
|
|
|
VST2.32 {q2, q3}, [r3]!
|
|
VST2.32 {q6, q7}, [r3]!
|
|
|
|
|
|
|
|
SUBS r9, r9, #1
|
|
BNE RADIX_4_LOOP
|
|
|
|
LSR r1, r1, #1
|
|
SUB r3, r1, LSL #3
|
|
MOV r5, #4
|
|
MOV r4, #64
|
|
LSR r6, r1, #4
|
|
|
|
|
|
RADIX_4_FIRST_ENDS:
|
|
|
|
PUSH {r3}
|
|
LSR r5, r5, #2
|
|
MOVW r14, #8528
|
|
ADD r0, r0, r14
|
|
|
|
OUTER_LOOP_R4:
|
|
|
|
|
|
LDR r14, [sp]
|
|
|
|
MOV r7, r5
|
|
MOV r2, #0
|
|
MOV r9, r0
|
|
LSL r12 , r5, #5
|
|
MIDDLE_LOOP_R4:
|
|
|
|
|
|
VLD2.16 {d0[0], d1[0]}, [r9], r2
|
|
VLD2.16 {d2[0], d3[0]}, [r9], r2
|
|
ADD r11, r2, r4, LSL #2
|
|
VLD2.16 {d4[0], d5[0]}, [r9]
|
|
ADD r10, r0, r11
|
|
|
|
|
|
VLD2.16 {d0[1], d1[1]}, [r10], r11
|
|
VLD2.16 {d2[1], d3[1]}, [r10], r11
|
|
ADD r2, r11, r4, LSL #2
|
|
VLD2.16 {d4[1], d5[1]}, [r10]
|
|
ADD r9, r0, r2
|
|
|
|
|
|
VLD2.16 {d0[2], d1[2]}, [r9], r2
|
|
VLD2.16 {d2[2], d3[2]}, [r9], r2
|
|
ADD r11, r2, r4, LSL #2
|
|
VLD2.16 {d4[2], d5[2]}, [r9]
|
|
ADD r10, r0, r11
|
|
|
|
|
|
|
|
VLD2.16 {d0[3], d1[3]}, [r10], r11
|
|
VLD2.16 {d2[3], d3[3]}, [r10], r11
|
|
ADD r2, r11, r4, LSL #2
|
|
VLD2.16 {d4[3], d5[3]}, [r10]
|
|
ADD r9, r0, r2
|
|
|
|
MOV r10, r6
|
|
|
|
|
|
|
|
INNER_LOOP_R4:
|
|
|
|
VLD2.32 {q3, q4}, [r14], r12
|
|
|
|
VSHR.S32 q3, q3, #1
|
|
VLD4.16 {q5, q6}, [r14], r12
|
|
VSHR.S32 q4, q4, #1
|
|
|
|
VSHR.U16 d10, d10, #1
|
|
VLD4.16 {q7, q8}, [r14], r12
|
|
VSHR.U16 d12, d12, #1
|
|
|
|
VMULL.S16 q11, d10, d0
|
|
VMLSL.S16 q11, d12, d1
|
|
VLD4.16 {q9, q10}, [r14], r12
|
|
VMULL.S16 q12, d10, d1
|
|
VMLAL.S16 q12, d12, d0
|
|
|
|
VSHR.U16 d14, d14, #1
|
|
VSHR.U16 d16, d16, #1
|
|
|
|
SUB r14, r14, r12, LSL #2
|
|
|
|
VSHR.U16 d18, d18, #1
|
|
VSHR.U16 d20, d20, #1
|
|
|
|
VMULL.S16 q13, d14, d2
|
|
VMLSL.S16 q13, d16, d3
|
|
|
|
VSHR.S32 q11, q11, #15
|
|
|
|
VMULL.S16 q14, d14, d3
|
|
VMLAL.S16 q14, d16, d2
|
|
|
|
VMULL.S16 q15, d18, d4
|
|
VMLSL.S16 q15, d20, d5
|
|
|
|
VMLAL.S16 q11, d11, d0
|
|
VMLSL.S16 q11, d13, d1
|
|
|
|
VSHR.S32 q12, q12, #15
|
|
VSHR.S32 q13, q13, #15
|
|
VSHR.S32 q14, q14, #15
|
|
VSHR.S32 q15, q15, #15
|
|
|
|
|
|
VMLAL.S16 q12, d11, d1
|
|
VMLAL.S16 q12, d13, d0
|
|
|
|
|
|
VMULL.S16 q5, d18, d5
|
|
VMLAL.S16 q5, d20, d4
|
|
|
|
|
|
VMLAL.S16 q13, d15, d2
|
|
VMLSL.S16 q13, d17, d3
|
|
|
|
VMLAL.S16 q14, d15, d3
|
|
VMLAL.S16 q14, d17, d2
|
|
|
|
|
|
VMLAL.S16 q15, d19, d4
|
|
VMLSL.S16 q15, d21, d5
|
|
|
|
VSHR.S32 q5, q5, #15
|
|
|
|
VMLAL.S16 q5, d19, d5
|
|
VMLAL.S16 q5, d21, d4
|
|
|
|
|
|
|
|
CMP r7, r5
|
|
BNE BYPASS_IF
|
|
|
|
ADD r14, r14, r12
|
|
|
|
LDR r3, [r14], r12
|
|
ASR r3, r3, #1
|
|
VMOV.32 d22[0], r3
|
|
|
|
LDR r3, [r14], r12
|
|
ASR r3, r3, #1
|
|
VMOV.32 d26[0], r3
|
|
|
|
LDR r3, [r14]
|
|
ASR r3, r3, #1
|
|
VMOV.32 d30[0], r3
|
|
|
|
SUB r14, r14, r12, LSL #1
|
|
ADD r14, r14, #4
|
|
|
|
LDR r3, [r14], r12
|
|
ASR r3, r3, #1
|
|
VMOV.32 d24[0], r3
|
|
|
|
LDR r3, [r14], r12
|
|
ASR r3, r3, #1
|
|
VMOV.32 d28[0], r3
|
|
|
|
LDR r3, [r14], r12
|
|
ASR r3, r3, #1
|
|
VMOV.32 d10[0], r3
|
|
|
|
SUB r14, r14, #4
|
|
|
|
SUB r14, r14, r12, LSL #2
|
|
|
|
BYPASS_IF:
|
|
|
|
VADD.S32 q6, q3, q13
|
|
VADD.S32 q7, q4, q14
|
|
VSUB.S32 q3, q3, q13
|
|
VSUB.S32 q4, q4, q14
|
|
VADD.S32 q8, q11, q15
|
|
VADD.S32 q9, q12, q5
|
|
|
|
VSUB.S32 q15, q11, q15
|
|
VSUB.S32 q14, q12, q5
|
|
|
|
VADD.S32 q10, q6, q8
|
|
VADD.S32 q11, q7, q9
|
|
VADD.S32 q12, q3, q14
|
|
VSUB.S32 q13, q4, q15
|
|
|
|
VSUB.S32 q6, q6, q8
|
|
VST2.32 {q10, q11}, [r14], r12
|
|
VSUB.S32 q7, q7, q9
|
|
|
|
VSUB.S32 q8, q3, q14
|
|
VST2.32 {q12, q13}, [r14], r12
|
|
VADD.S32 q9, q4, q15
|
|
|
|
|
|
VST2.32 {q6, q7}, [r14], r12
|
|
VST2.32 {q8, q9}, [r14], r12
|
|
|
|
|
|
|
|
|
|
SUBS r10, r10, #1
|
|
BNE INNER_LOOP_R4
|
|
|
|
SUB r14, r14, r1, LSL #3
|
|
ADD r14, r14, #32
|
|
|
|
SUBS r7, r7, #1
|
|
BNE MIDDLE_LOOP_R4
|
|
|
|
|
|
|
|
|
|
LSR r4, r4, #2
|
|
LSL r5, r5, #2
|
|
LSR r6, r6, #2
|
|
SUBS r8, r8, #1
|
|
BNE OUTER_LOOP_R4
|
|
END_LOOPS:
|
|
POP {r3}
|
|
vpop {d8-d15}
|
|
LDMFD sp!, {r4-r12, pc}
|
|
|