151aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick@/******************************************************************************
251aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick@ *
351aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick@ * Copyright (C) 2018 The Android Open Source Project
451aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick@ *
551aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick@ * Licensed under the Apache License, Version 2.0 (the "License");
651aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick@ * you may not use this file except in compliance with the License.
751aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick@ * You may obtain a copy of the License at:
851aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick@ *
951aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick@ * http://www.apache.org/licenses/LICENSE-2.0
1051aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick@ *
1151aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick@ * Unless required by applicable law or agreed to in writing, software
1251aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick@ * distributed under the License is distributed on an "AS IS" BASIS,
1351aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick@ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
1451aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick@ * See the License for the specific language governing permissions and
1551aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick@ * limitations under the License.
1651aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick@ *
1751aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick@ *****************************************************************************
1851aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick@ * Originally developed and contributed by Ittiam Systems Pvt. Ltd, Bangalore
1951aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick@*/
2051aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick
2151aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick
2251aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick.text
2351aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick.p2align 2
2451aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick.global ixheaacd_mps_mulshift_acc
2551aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick
2651aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essickixheaacd_mps_mulshift_acc:
2751aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick
2851aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick    STMFD           sp!, {R4-R12, R14}
2951aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick    VPUSH           {d8 - d15}
3051aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick    LDR             R4, [SP, #104]      @Argument V_fix
3151aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick    LDR             R5, [SP, #108]      @Argument 2*resolution
3251aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick    ASR             R6, R5, #1
3351aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick
3451aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick    MOV             R7, R4
3551aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick    MOV             R11, #40
3651aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick    MUL             R11, R11, R5
3751aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick    ADD             R7, R7, R11
3851aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick    LSL             R8, R5, #2
3951aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick    SUB             R8, R7, R8
4051aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick    MOV             R10, #9
4151aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick    MUL             R9, R5, R10
4251aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick
4351aa06e124ba688ca810b25ee0b5bb66678aac14Ray EssickCOPYLOOP:
4451aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick    SUB             R8, R8, #32
4551aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick    VLD1.32         {Q0, Q1}, [R8]
4651aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick    SUB             R7, R7, #32
4751aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick    VST1.32         {Q0, Q1}, [R7]
4851aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick    SUBS            R9, R9, #8
4951aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick    BGT             COPYLOOP
5051aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick
5151aa06e124ba688ca810b25ee0b5bb66678aac14Ray EssickLOOP:
5251aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick    VMOV.I64        Q14, #0
5351aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick    VMOV.I64        Q15, #0
5451aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick    MOV             R7, R6
5551aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick    MOV             R8, R0
5651aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick    MOV             R9, R1
5751aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick
5851aa06e124ba688ca810b25ee0b5bb66678aac14Ray EssickLOOP1:
5951aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick    VLD1.32         {Q0, Q1}, [R8]!     @LOADING values from R0   Sr_fix
6051aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick    VLD1.32         {Q2, Q3}, [R9]!     @LOADING values from R1   Si_fix
6151aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick    VLD1.32         {Q4, Q5}, [R2]!     @LOADING values from R2   N.real_fix
6251aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick    VLD1.32         {Q6, Q7}, [R3]!     @LOADING values from R3   N.imag_fix
6351aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick
6451aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick    VMULL.S32       Q12, D0, D8
6551aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick    VMULL.S32       Q10, D1, D9
6651aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick    VMULL.S32       Q11, D3, D11
6751aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick    VMULL.S32       Q13, D2, D10
6851aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick
6951aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick    VMULL.S32       Q0, D4, D12
7051aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick    VMULL.S32       Q4, D5, D13
7151aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick    VMULL.S32       Q5, D7, D15
7251aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick    VMULL.S32       Q1, D6, D14
7351aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick
7451aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick    VSHR.S64        Q0, Q0, #31
7551aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick    VSHR.S64        Q1, Q1, #31
7651aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick    VSHR.S64        Q4, Q4, #31
7751aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick    VSHR.S64        Q5, Q5, #31
7851aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick
7951aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick    VSHR.S64        Q12, Q12, #31
8051aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick    VSHR.S64        Q13, Q13, #31
8151aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick    VSHR.S64        Q10, Q10, #31
8251aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick    VSHR.S64        Q11, Q11, #31
8351aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick
8451aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick    VSUB.I64        Q12, Q12, Q0
8551aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick    VSUB.I64        Q13, Q13, Q1
8651aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick    VSUB.I64        Q10, Q10, Q4
8751aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick    VSUB.I64        Q11, Q11, Q5
8851aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick
8951aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick    VADD.I64        Q12, Q12, Q13
9051aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick    VADD.I64        Q10, Q10, Q11
9151aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick    VADD.I64        Q12, Q12, Q10
9251aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick    VADD.I64        D24, D24, D25
9351aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick    VADD.I64        D28, D28, D24
9451aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick    SUBS            R7, R7, #8
9551aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick    BGT             LOOP1
9651aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick
9751aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick
9851aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick    MOV             R7, R6
9951aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick    MOV             R8, R0
10051aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick    MOV             R9, R1
10151aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick
10251aa06e124ba688ca810b25ee0b5bb66678aac14Ray EssickLOOP2:
10351aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick    VLD1.32         {Q0, Q1}, [R8]!     @LOADING values from R0   Sr_fix
10451aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick    VLD1.32         {Q2, Q3}, [R9]!     @LOADING values from R1   Si_fix
10551aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick    VLD1.32         {Q4, Q5}, [R2]!     @LOADING values from R2   N.real_fix
10651aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick    VLD1.32         {Q6, Q7}, [R3]!     @LOADING values from R3   N.imag_fix
10751aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick
10851aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick    VMULL.S32       Q12, D0, D8
10951aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick    VMULL.S32       Q10, D1, D9
11051aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick    VMULL.S32       Q11, D3, D11
11151aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick    VMULL.S32       Q13, D2, D10
11251aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick
11351aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick    VMULL.S32       Q0, D4, D12
11451aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick    VMULL.S32       Q4, D5, D13
11551aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick    VMULL.S32       Q5, D7, D15
11651aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick    VMULL.S32       Q1, D6, D14
11751aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick
11851aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick    VSHR.S64        Q12, Q12, #31
11951aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick    VSHR.S64        Q13, Q13, #31
12051aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick    VSHR.S64        Q10, Q10, #31
12151aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick    VSHR.S64        Q11, Q11, #31
12251aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick
12351aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick    VSHR.S64        Q0, Q0, #31
12451aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick    VSHR.S64        Q1, Q1, #31
12551aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick    VSHR.S64        Q4, Q4, #31
12651aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick    VSHR.S64        Q5, Q5, #31
12751aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick
12851aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick    VSUB.I64        Q12, Q12, Q0
12951aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick    VSUB.I64        Q13, Q13, Q1
13051aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick    VSUB.I64        Q10, Q10, Q4
13151aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick    VSUB.I64        Q11, Q11, Q5
13251aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick
13351aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick    VADD.I64        Q12, Q12, Q13
13451aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick    VADD.I64        Q10, Q10, Q11
13551aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick    VADD.I64        Q12, Q12, Q10
13651aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick    VADD.I64        D24, D24, D25
13751aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick    VADD.I64        D29, D29, D24
13851aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick    SUBS            R7, R7, #8
13951aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick    BGT             LOOP2
14051aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick
14151aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick    MOV             R7, R6
14251aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick    MOV             R8, R0
14351aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick    MOV             R9, R1
14451aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick
14551aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick
14651aa06e124ba688ca810b25ee0b5bb66678aac14Ray EssickLOOP3:
14751aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick    VLD1.32         {Q0, Q1}, [R8]!     @LOADING values from R0   Sr_fix
14851aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick    VLD1.32         {Q2, Q3}, [R9]!     @LOADING values from R1   Si_fix
14951aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick    VLD1.32         {Q4, Q5}, [R2]!     @LOADING values from R2   N.real_fix
15051aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick    VLD1.32         {Q6, Q7}, [R3]!     @LOADING values from R3   N.imag_fix
15151aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick
15251aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick    VMULL.S32       Q12, D0, D8
15351aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick    VMULL.S32       Q10, D1, D9
15451aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick    VMULL.S32       Q11, D3, D11
15551aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick    VMULL.S32       Q13, D2, D10
15651aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick
15751aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick    VMULL.S32       Q0, D4, D12
15851aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick    VMULL.S32       Q4, D5, D13
15951aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick    VMULL.S32       Q5, D7, D15
16051aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick    VMULL.S32       Q1, D6, D14
16151aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick
16251aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick    VSHR.S64        Q12, Q12, #31
16351aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick    VSHR.S64        Q13, Q13, #31
16451aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick    VSHR.S64        Q10, Q10, #31
16551aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick    VSHR.S64        Q11, Q11, #31
16651aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick
16751aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick    VSHR.S64        Q0, Q0, #31
16851aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick    VSHR.S64        Q1, Q1, #31
16951aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick    VSHR.S64        Q4, Q4, #31
17051aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick    VSHR.S64        Q5, Q5, #31
17151aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick
17251aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick    VSUB.I64        Q12, Q12, Q0
17351aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick    VSUB.I64        Q13, Q13, Q1
17451aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick    VSUB.I64        Q10, Q10, Q4
17551aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick    VSUB.I64        Q11, Q11, Q5
17651aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick
17751aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick    VADD.I64        Q12, Q12, Q13
17851aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick    VADD.I64        Q10, Q10, Q11
17951aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick    VADD.I64        Q12, Q12, Q10
18051aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick    VADD.I64        D24, D24, D25
18151aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick    VADD.I64        D30, D30, D24
18251aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick    SUBS            R7, R7, #8
18351aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick    BGT             LOOP3
18451aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick
18551aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick    MOV             R7, R6
18651aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick    MOV             R8, R0
18751aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick    MOV             R9, R1
18851aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick
18951aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick
19051aa06e124ba688ca810b25ee0b5bb66678aac14Ray EssickLOOP4:
19151aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick    VLD1.32         {Q0, Q1}, [R8]!     @LOADING values from R0   Sr_fix
19251aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick    VLD1.32         {Q2, Q3}, [R9]!     @LOADING values from R1   Si_fix
19351aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick    VLD1.32         {Q4, Q5}, [R2]!     @LOADING values from R2   N.real_fix
19451aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick    VLD1.32         {Q6, Q7}, [R3]!     @LOADING values from R3   N.imag_fix
19551aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick
19651aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick    VMULL.S32       Q12, D0, D8
19751aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick    VMULL.S32       Q10, D1, D9
19851aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick    VMULL.S32       Q11, D3, D11
19951aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick    VMULL.S32       Q13, D2, D10
20051aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick
20151aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick    VMULL.S32       Q0, D4, D12
20251aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick    VMULL.S32       Q4, D5, D13
20351aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick    VMULL.S32       Q5, D7, D15
20451aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick    VMULL.S32       Q1, D6, D14
20551aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick
20651aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick    VSHR.S64        Q12, Q12, #31
20751aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick    VSHR.S64        Q13, Q13, #31
20851aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick    VSHR.S64        Q10, Q10, #31
20951aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick    VSHR.S64        Q11, Q11, #31
21051aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick
21151aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick    VSHR.S64        Q0, Q0, #31
21251aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick    VSHR.S64        Q1, Q1, #31
21351aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick    VSHR.S64        Q4, Q4, #31
21451aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick    VSHR.S64        Q5, Q5, #31
21551aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick
21651aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick    VSUB.I64        Q12, Q12, Q0
21751aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick    VSUB.I64        Q13, Q13, Q1
21851aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick    VSUB.I64        Q10, Q10, Q4
21951aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick    VSUB.I64        Q11, Q11, Q5
22051aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick
22151aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick    VADD.I64        Q12, Q12, Q13
22251aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick    VADD.I64        Q10, Q10, Q11
22351aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick    VADD.I64        Q12, Q12, Q10
22451aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick    VADD.I64        D24, D24, D25
22551aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick    VADD.I64        D31, D31, D24
22651aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick    SUBS            R7, R7, #8
22751aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick    BGT             LOOP4
22851aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick
22951aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick    VQMOVN.S64      D0, Q14
23051aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick    VQMOVN.S64      D1, Q15
23151aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick
23251aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick    VST1.32         {Q0}, [R4]!         @Storing values to R4
23351aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick
23451aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick    SUBS            R5, R5, #4
23551aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick    BGT             LOOP
23651aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick
23751aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick    VPOP            {d8 - d15}
23851aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick    LDMFD           sp!, {R4-R12, R14}
23951aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick    BX              LR
24051aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick
241