199b31ea5d0f4629ceddf4852f96757c9c73654artoy@google.com@//
299b31ea5d0f4629ceddf4852f96757c9c73654artoy@google.com@//  Copyright (c) 2013 The WebRTC project authors. All Rights Reserved.
399b31ea5d0f4629ceddf4852f96757c9c73654artoy@google.com@//
499b31ea5d0f4629ceddf4852f96757c9c73654artoy@google.com@//  Use of this source code is governed by a BSD-style license
599b31ea5d0f4629ceddf4852f96757c9c73654artoy@google.com@//  that can be found in the LICENSE file in the root of the source
699b31ea5d0f4629ceddf4852f96757c9c73654artoy@google.com@//  tree. An additional intellectual property rights grant can be found
799b31ea5d0f4629ceddf4852f96757c9c73654artoy@google.com@//  in the file PATENTS.  All contributing project authors may
899b31ea5d0f4629ceddf4852f96757c9c73654artoy@google.com@//  be found in the AUTHORS file in the root of the source tree.
999b31ea5d0f4629ceddf4852f96757c9c73654artoy@google.com@//
1099b31ea5d0f4629ceddf4852f96757c9c73654artoy@google.com@//  This file was originally licensed as follows. It has been
1199b31ea5d0f4629ceddf4852f96757c9c73654artoy@google.com@//  relicensed with permission from the copyright holders.
1299b31ea5d0f4629ceddf4852f96757c9c73654artoy@google.com@//
1399b31ea5d0f4629ceddf4852f96757c9c73654artoy@google.com
1499b31ea5d0f4629ceddf4852f96757c9c73654artoy@google.com@//
1599b31ea5d0f4629ceddf4852f96757c9c73654artoy@google.com@// File Name:  armSP_FFT_CToC_SC32_Radix4_fs_unsafe_s.s
1699b31ea5d0f4629ceddf4852f96757c9c73654artoy@google.com@// OpenMAX DL: v1.0.2
1799b31ea5d0f4629ceddf4852f96757c9c73654artoy@google.com@// Last Modified Revision:   7767
1899b31ea5d0f4629ceddf4852f96757c9c73654artoy@google.com@// Last Modified Date:       Thu, 27 Sep 2007
1999b31ea5d0f4629ceddf4852f96757c9c73654artoy@google.com@//
2099b31ea5d0f4629ceddf4852f96757c9c73654artoy@google.com@// (c) Copyright 2007-2008 ARM Limited. All Rights Reserved.
2199b31ea5d0f4629ceddf4852f96757c9c73654artoy@google.com@//
2299b31ea5d0f4629ceddf4852f96757c9c73654artoy@google.com@//
2399b31ea5d0f4629ceddf4852f96757c9c73654artoy@google.com@//
2499b31ea5d0f4629ceddf4852f96757c9c73654artoy@google.com@// Description:
2599b31ea5d0f4629ceddf4852f96757c9c73654artoy@google.com@// Compute a first stage Radix 4 FFT stage for a N point complex signal
2699b31ea5d0f4629ceddf4852f96757c9c73654artoy@google.com@//
2799b31ea5d0f4629ceddf4852f96757c9c73654artoy@google.com
2899b31ea5d0f4629ceddf4852f96757c9c73654artoy@google.com
2999b31ea5d0f4629ceddf4852f96757c9c73654artoy@google.com
3099b31ea5d0f4629ceddf4852f96757c9c73654artoy@google.com@// Include standard headers
3199b31ea5d0f4629ceddf4852f96757c9c73654artoy@google.com
32bdf981cb383b7ec472ee86d2fedb53937285f894rtoy@google.com#include "dl/api/arm/armCOMM_s.h"
33bdf981cb383b7ec472ee86d2fedb53937285f894rtoy@google.com#include "dl/api/arm/omxtypes_s.h"
3499b31ea5d0f4629ceddf4852f96757c9c73654artoy@google.com
3599b31ea5d0f4629ceddf4852f96757c9c73654artoy@google.com@// Import symbols required from other files
3699b31ea5d0f4629ceddf4852f96757c9c73654artoy@google.com@// (For example tables)
3799b31ea5d0f4629ceddf4852f96757c9c73654artoy@google.com
3899b31ea5d0f4629ceddf4852f96757c9c73654artoy@google.com
3999b31ea5d0f4629ceddf4852f96757c9c73654artoy@google.com
4099b31ea5d0f4629ceddf4852f96757c9c73654artoy@google.com
4199b31ea5d0f4629ceddf4852f96757c9c73654artoy@google.com@// Set debugging level
4299b31ea5d0f4629ceddf4852f96757c9c73654artoy@google.com@//DEBUG_ON    SETL {TRUE}
4399b31ea5d0f4629ceddf4852f96757c9c73654artoy@google.com
4499b31ea5d0f4629ceddf4852f96757c9c73654artoy@google.com
4599b31ea5d0f4629ceddf4852f96757c9c73654artoy@google.com
4699b31ea5d0f4629ceddf4852f96757c9c73654artoy@google.com@// Guarding implementation by the processor name
4799b31ea5d0f4629ceddf4852f96757c9c73654artoy@google.com
4899b31ea5d0f4629ceddf4852f96757c9c73654artoy@google.com
4999b31ea5d0f4629ceddf4852f96757c9c73654artoy@google.com
5099b31ea5d0f4629ceddf4852f96757c9c73654artoy@google.com@// Guarding implementation by the processor name
5199b31ea5d0f4629ceddf4852f96757c9c73654artoy@google.com
5299b31ea5d0f4629ceddf4852f96757c9c73654artoy@google.com
5399b31ea5d0f4629ceddf4852f96757c9c73654artoy@google.com@//Input Registers
5499b31ea5d0f4629ceddf4852f96757c9c73654artoy@google.com
5599b31ea5d0f4629ceddf4852f96757c9c73654artoy@google.com#define pSrc		r0
5699b31ea5d0f4629ceddf4852f96757c9c73654artoy@google.com#define pDst		r2
5799b31ea5d0f4629ceddf4852f96757c9c73654artoy@google.com#define pTwiddle	r1
5899b31ea5d0f4629ceddf4852f96757c9c73654artoy@google.com#define pPingPongBuf	r5
5999b31ea5d0f4629ceddf4852f96757c9c73654artoy@google.com#define subFFTNum	r6
6099b31ea5d0f4629ceddf4852f96757c9c73654artoy@google.com#define subFFTSize	r7
6199b31ea5d0f4629ceddf4852f96757c9c73654artoy@google.com
6299b31ea5d0f4629ceddf4852f96757c9c73654artoy@google.com
6399b31ea5d0f4629ceddf4852f96757c9c73654artoy@google.com@//Output Registers
6499b31ea5d0f4629ceddf4852f96757c9c73654artoy@google.com
6599b31ea5d0f4629ceddf4852f96757c9c73654artoy@google.com
6699b31ea5d0f4629ceddf4852f96757c9c73654artoy@google.com@//Local Scratch Registers
6799b31ea5d0f4629ceddf4852f96757c9c73654artoy@google.com
6899b31ea5d0f4629ceddf4852f96757c9c73654artoy@google.com#define grpSize		r3
6999b31ea5d0f4629ceddf4852f96757c9c73654artoy@google.com@// Reuse grpSize as setCount
7099b31ea5d0f4629ceddf4852f96757c9c73654artoy@google.com#define setCount	r3
7199b31ea5d0f4629ceddf4852f96757c9c73654artoy@google.com#define pointStep	r4
7299b31ea5d0f4629ceddf4852f96757c9c73654artoy@google.com#define outPointStep	r4
7399b31ea5d0f4629ceddf4852f96757c9c73654artoy@google.com#define setStep		r8
7499b31ea5d0f4629ceddf4852f96757c9c73654artoy@google.com#define step1		r9
7599b31ea5d0f4629ceddf4852f96757c9c73654artoy@google.com#define step3		r10
7699b31ea5d0f4629ceddf4852f96757c9c73654artoy@google.com
7799b31ea5d0f4629ceddf4852f96757c9c73654artoy@google.com@// Neon Registers
7899b31ea5d0f4629ceddf4852f96757c9c73654artoy@google.com
7999b31ea5d0f4629ceddf4852f96757c9c73654artoy@google.com#define dXr0	D0.S32
8099b31ea5d0f4629ceddf4852f96757c9c73654artoy@google.com#define dXi0	D1.S32
8199b31ea5d0f4629ceddf4852f96757c9c73654artoy@google.com#define dXr1	D2.S32
8299b31ea5d0f4629ceddf4852f96757c9c73654artoy@google.com#define dXi1	D3.S32
8399b31ea5d0f4629ceddf4852f96757c9c73654artoy@google.com#define dXr2	D4.S32
8499b31ea5d0f4629ceddf4852f96757c9c73654artoy@google.com#define dXi2	D5.S32
8599b31ea5d0f4629ceddf4852f96757c9c73654artoy@google.com#define dXr3	D6.S32
8699b31ea5d0f4629ceddf4852f96757c9c73654artoy@google.com#define dXi3	D7.S32
8799b31ea5d0f4629ceddf4852f96757c9c73654artoy@google.com#define dYr0	D8.S32
8899b31ea5d0f4629ceddf4852f96757c9c73654artoy@google.com#define dYi0	D9.S32
8999b31ea5d0f4629ceddf4852f96757c9c73654artoy@google.com#define dYr1	D10.S32
9099b31ea5d0f4629ceddf4852f96757c9c73654artoy@google.com#define dYi1	D11.S32
9199b31ea5d0f4629ceddf4852f96757c9c73654artoy@google.com#define dYr2	D12.S32
9299b31ea5d0f4629ceddf4852f96757c9c73654artoy@google.com#define dYi2	D13.S32
9399b31ea5d0f4629ceddf4852f96757c9c73654artoy@google.com#define dYr3	D14.S32
9499b31ea5d0f4629ceddf4852f96757c9c73654artoy@google.com#define dYi3	D15.S32
9599b31ea5d0f4629ceddf4852f96757c9c73654artoy@google.com#define qX0	Q0.S32
9699b31ea5d0f4629ceddf4852f96757c9c73654artoy@google.com#define qX1	Q1.S32
9799b31ea5d0f4629ceddf4852f96757c9c73654artoy@google.com#define qX2	Q2.S32
9899b31ea5d0f4629ceddf4852f96757c9c73654artoy@google.com#define qX3	Q3.S32
9999b31ea5d0f4629ceddf4852f96757c9c73654artoy@google.com#define qY0	Q4.S32
10099b31ea5d0f4629ceddf4852f96757c9c73654artoy@google.com#define qY1	Q5.S32
10199b31ea5d0f4629ceddf4852f96757c9c73654artoy@google.com#define qY2	Q6.S32
10299b31ea5d0f4629ceddf4852f96757c9c73654artoy@google.com#define qY3	Q7.S32
10399b31ea5d0f4629ceddf4852f96757c9c73654artoy@google.com#define dZr0	D16.S32
10499b31ea5d0f4629ceddf4852f96757c9c73654artoy@google.com#define dZi0	D17.S32
10599b31ea5d0f4629ceddf4852f96757c9c73654artoy@google.com#define dZr1	D18.S32
10699b31ea5d0f4629ceddf4852f96757c9c73654artoy@google.com#define dZi1	D19.S32
10799b31ea5d0f4629ceddf4852f96757c9c73654artoy@google.com#define dZr2	D20.S32
10899b31ea5d0f4629ceddf4852f96757c9c73654artoy@google.com#define dZi2	D21.S32
10999b31ea5d0f4629ceddf4852f96757c9c73654artoy@google.com#define dZr3	D22.S32
11099b31ea5d0f4629ceddf4852f96757c9c73654artoy@google.com#define dZi3	D23.S32
11199b31ea5d0f4629ceddf4852f96757c9c73654artoy@google.com#define qZ0	Q8.S32
11299b31ea5d0f4629ceddf4852f96757c9c73654artoy@google.com#define qZ1	Q9.S32
11399b31ea5d0f4629ceddf4852f96757c9c73654artoy@google.com#define qZ2	Q10.S32
11499b31ea5d0f4629ceddf4852f96757c9c73654artoy@google.com#define qZ3	Q11.S32
11599b31ea5d0f4629ceddf4852f96757c9c73654artoy@google.com
11699b31ea5d0f4629ceddf4852f96757c9c73654artoy@google.com
1175d8507771824df2b96d9c6f2fd55a47fcfd9dec9rtoy@google.com        .macro FFTSTAGE scaled, inverse, name
11899b31ea5d0f4629ceddf4852f96757c9c73654artoy@google.com
11999b31ea5d0f4629ceddf4852f96757c9c73654artoy@google.com        @// Define stack arguments
12099b31ea5d0f4629ceddf4852f96757c9c73654artoy@google.com
12199b31ea5d0f4629ceddf4852f96757c9c73654artoy@google.com        @// pT0+1 increments pT0 by 8 bytes
12299b31ea5d0f4629ceddf4852f96757c9c73654artoy@google.com        @// pT0+pointStep = increment of 8*pointStep bytes = 2*grpSize bytes
12399b31ea5d0f4629ceddf4852f96757c9c73654artoy@google.com        @// Note: outPointStep = pointStep for firststage
12499b31ea5d0f4629ceddf4852f96757c9c73654artoy@google.com
12599b31ea5d0f4629ceddf4852f96757c9c73654artoy@google.com        MOV     pointStep,subFFTNum,LSL #1
12699b31ea5d0f4629ceddf4852f96757c9c73654artoy@google.com
12799b31ea5d0f4629ceddf4852f96757c9c73654artoy@google.com
12899b31ea5d0f4629ceddf4852f96757c9c73654artoy@google.com        @// Update pSubFFTSize and pSubFFTNum regs
12999b31ea5d0f4629ceddf4852f96757c9c73654artoy@google.com        VLD2    {dXr0,dXi0},[pSrc :128],pointStep          @//  data[0]
13099b31ea5d0f4629ceddf4852f96757c9c73654artoy@google.com        MOV     subFFTSize,#4                                 @// subFFTSize = 1 for the first stage
13199b31ea5d0f4629ceddf4852f96757c9c73654artoy@google.com
13299b31ea5d0f4629ceddf4852f96757c9c73654artoy@google.com        @// Note: setCount = subFFTNum/4 (reuse the grpSize reg for setCount)
13399b31ea5d0f4629ceddf4852f96757c9c73654artoy@google.com        LSR     grpSize,subFFTNum,#2
13499b31ea5d0f4629ceddf4852f96757c9c73654artoy@google.com        VLD2    {dXr1,dXi1},[pSrc :128],pointStep          @//  data[1]
13599b31ea5d0f4629ceddf4852f96757c9c73654artoy@google.com        MOV     subFFTNum,grpSize
13699b31ea5d0f4629ceddf4852f96757c9c73654artoy@google.com
13799b31ea5d0f4629ceddf4852f96757c9c73654artoy@google.com
13899b31ea5d0f4629ceddf4852f96757c9c73654artoy@google.com        @// Calculate the step of input data for the next set
13999b31ea5d0f4629ceddf4852f96757c9c73654artoy@google.com        @//MOV     setStep,pointStep,LSL #1
14099b31ea5d0f4629ceddf4852f96757c9c73654artoy@google.com        MOV     setStep,grpSize,LSL #4
14199b31ea5d0f4629ceddf4852f96757c9c73654artoy@google.com        VLD2    {dXr2,dXi2},[pSrc :128],pointStep          @//  data[2]
14299b31ea5d0f4629ceddf4852f96757c9c73654artoy@google.com        ADD     setStep,setStep,pointStep                   @// setStep = 3*pointStep
14399b31ea5d0f4629ceddf4852f96757c9c73654artoy@google.com        RSB     setStep,setStep,#16                         @// setStep = - 3*pointStep+16
14499b31ea5d0f4629ceddf4852f96757c9c73654artoy@google.com
14599b31ea5d0f4629ceddf4852f96757c9c73654artoy@google.com        VLD2    {dXr3,dXi3},[pSrc :128],setStep            @//  data[3] & update pSrc for the next set
14699b31ea5d0f4629ceddf4852f96757c9c73654artoy@google.com        MOV     step1,pointStep,LSL #1                      @// step1 = 2*pointStep
14799b31ea5d0f4629ceddf4852f96757c9c73654artoy@google.com
14899b31ea5d0f4629ceddf4852f96757c9c73654artoy@google.com        .ifeqs "\scaled", "TRUE"
14999b31ea5d0f4629ceddf4852f96757c9c73654artoy@google.com            VHADD    qY0,qX0,qX2
15099b31ea5d0f4629ceddf4852f96757c9c73654artoy@google.com        .else
15199b31ea5d0f4629ceddf4852f96757c9c73654artoy@google.com            VADD    qY0,qX0,qX2
15299b31ea5d0f4629ceddf4852f96757c9c73654artoy@google.com        .endif
15399b31ea5d0f4629ceddf4852f96757c9c73654artoy@google.com
15499b31ea5d0f4629ceddf4852f96757c9c73654artoy@google.com        RSB     step3,pointStep,#0                          @// step3 = -pointStep
15599b31ea5d0f4629ceddf4852f96757c9c73654artoy@google.com
15699b31ea5d0f4629ceddf4852f96757c9c73654artoy@google.com        @// grp = 0 a special case since all the twiddle factors are 1
15799b31ea5d0f4629ceddf4852f96757c9c73654artoy@google.com        @// Loop on the sets : 2 sets at a time
15899b31ea5d0f4629ceddf4852f96757c9c73654artoy@google.com
15999b31ea5d0f4629ceddf4852f96757c9c73654artoy@google.comgrpZeroSetLoop\name :
16099b31ea5d0f4629ceddf4852f96757c9c73654artoy@google.com
16199b31ea5d0f4629ceddf4852f96757c9c73654artoy@google.com
16299b31ea5d0f4629ceddf4852f96757c9c73654artoy@google.com
16399b31ea5d0f4629ceddf4852f96757c9c73654artoy@google.com        @// Decrement setcount
16499b31ea5d0f4629ceddf4852f96757c9c73654artoy@google.com        SUBS    setCount,setCount,#2                    @// decrement the set loop counter
16599b31ea5d0f4629ceddf4852f96757c9c73654artoy@google.com
16699b31ea5d0f4629ceddf4852f96757c9c73654artoy@google.com        .ifeqs "\scaled", "TRUE"
16799b31ea5d0f4629ceddf4852f96757c9c73654artoy@google.com
16899b31ea5d0f4629ceddf4852f96757c9c73654artoy@google.com            @// finish first stage of 4 point FFT
16999b31ea5d0f4629ceddf4852f96757c9c73654artoy@google.com
17099b31ea5d0f4629ceddf4852f96757c9c73654artoy@google.com            VHSUB    qY2,qX0,qX2
17199b31ea5d0f4629ceddf4852f96757c9c73654artoy@google.com
17299b31ea5d0f4629ceddf4852f96757c9c73654artoy@google.com            VLD2    {dXr0,dXi0},[pSrc :128],step1          @//  data[0]
17399b31ea5d0f4629ceddf4852f96757c9c73654artoy@google.com            VHADD    qY1,qX1,qX3
17499b31ea5d0f4629ceddf4852f96757c9c73654artoy@google.com            VLD2    {dXr2,dXi2},[pSrc :128],step3          @//  data[2]
17599b31ea5d0f4629ceddf4852f96757c9c73654artoy@google.com            VHSUB    qY3,qX1,qX3
17699b31ea5d0f4629ceddf4852f96757c9c73654artoy@google.com
17799b31ea5d0f4629ceddf4852f96757c9c73654artoy@google.com
17899b31ea5d0f4629ceddf4852f96757c9c73654artoy@google.com            @// finish second stage of 4 point FFT
17999b31ea5d0f4629ceddf4852f96757c9c73654artoy@google.com
18099b31ea5d0f4629ceddf4852f96757c9c73654artoy@google.com            .ifeqs "\inverse", "TRUE"
18199b31ea5d0f4629ceddf4852f96757c9c73654artoy@google.com
18299b31ea5d0f4629ceddf4852f96757c9c73654artoy@google.com                VLD2    {dXr1,dXi1},[pSrc :128],step1          @//  data[1]
18399b31ea5d0f4629ceddf4852f96757c9c73654artoy@google.com                VHADD    qZ0,qY0,qY1
18499b31ea5d0f4629ceddf4852f96757c9c73654artoy@google.com
18599b31ea5d0f4629ceddf4852f96757c9c73654artoy@google.com                VLD2    {dXr3,dXi3},[pSrc :128],setStep            @//  data[3] & update pSrc for the next set
18699b31ea5d0f4629ceddf4852f96757c9c73654artoy@google.com                VHSUB    dZr3,dYr2,dYi3
18799b31ea5d0f4629ceddf4852f96757c9c73654artoy@google.com
18899b31ea5d0f4629ceddf4852f96757c9c73654artoy@google.com                VST2    {dZr0,dZi0},[pDst :128],outPointStep
18999b31ea5d0f4629ceddf4852f96757c9c73654artoy@google.com                VHADD    dZi3,dYi2,dYr3
19099b31ea5d0f4629ceddf4852f96757c9c73654artoy@google.com
19199b31ea5d0f4629ceddf4852f96757c9c73654artoy@google.com                VHSUB    qZ1,qY0,qY1
19299b31ea5d0f4629ceddf4852f96757c9c73654artoy@google.com                VST2    {dZr3,dZi3},[pDst :128],outPointStep
19399b31ea5d0f4629ceddf4852f96757c9c73654artoy@google.com
19499b31ea5d0f4629ceddf4852f96757c9c73654artoy@google.com                VHADD    dZr2,dYr2,dYi3
19599b31ea5d0f4629ceddf4852f96757c9c73654artoy@google.com                VST2    {dZr1,dZi1},[pDst :128],outPointStep
19699b31ea5d0f4629ceddf4852f96757c9c73654artoy@google.com                VHSUB    dZi2,dYi2,dYr3
19799b31ea5d0f4629ceddf4852f96757c9c73654artoy@google.com
19899b31ea5d0f4629ceddf4852f96757c9c73654artoy@google.com                VHADD    qY0,qX0,qX2                     @// u0 for next iteration
19999b31ea5d0f4629ceddf4852f96757c9c73654artoy@google.com                VST2    {dZr2,dZi2},[pDst :128],setStep
20099b31ea5d0f4629ceddf4852f96757c9c73654artoy@google.com
20199b31ea5d0f4629ceddf4852f96757c9c73654artoy@google.com
20299b31ea5d0f4629ceddf4852f96757c9c73654artoy@google.com            .else
20399b31ea5d0f4629ceddf4852f96757c9c73654artoy@google.com
20499b31ea5d0f4629ceddf4852f96757c9c73654artoy@google.com                VLD2    {dXr1,dXi1},[pSrc :128],step1          @//  data[1]
20599b31ea5d0f4629ceddf4852f96757c9c73654artoy@google.com                VHADD    qZ0,qY0,qY1
20699b31ea5d0f4629ceddf4852f96757c9c73654artoy@google.com
20799b31ea5d0f4629ceddf4852f96757c9c73654artoy@google.com                VLD2    {dXr3,dXi3},[pSrc :128],setStep            @//  data[3] & update pSrc for the next set
20899b31ea5d0f4629ceddf4852f96757c9c73654artoy@google.com                VHADD    dZr2,dYr2,dYi3
20999b31ea5d0f4629ceddf4852f96757c9c73654artoy@google.com
21099b31ea5d0f4629ceddf4852f96757c9c73654artoy@google.com                VST2    {dZr0,dZi0},[pDst :128],outPointStep
21199b31ea5d0f4629ceddf4852f96757c9c73654artoy@google.com                VHSUB    dZi2,dYi2,dYr3
21299b31ea5d0f4629ceddf4852f96757c9c73654artoy@google.com
21399b31ea5d0f4629ceddf4852f96757c9c73654artoy@google.com                VHSUB    qZ1,qY0,qY1
21499b31ea5d0f4629ceddf4852f96757c9c73654artoy@google.com                VST2    {dZr2,dZi2},[pDst :128],outPointStep
21599b31ea5d0f4629ceddf4852f96757c9c73654artoy@google.com
21699b31ea5d0f4629ceddf4852f96757c9c73654artoy@google.com                VHSUB    dZr3,dYr2,dYi3
21799b31ea5d0f4629ceddf4852f96757c9c73654artoy@google.com                VST2    {dZr1,dZi1},[pDst :128],outPointStep
21899b31ea5d0f4629ceddf4852f96757c9c73654artoy@google.com                VHADD    dZi3,dYi2,dYr3
21999b31ea5d0f4629ceddf4852f96757c9c73654artoy@google.com
22099b31ea5d0f4629ceddf4852f96757c9c73654artoy@google.com                VHADD    qY0,qX0,qX2                     @// u0 for next iteration
22199b31ea5d0f4629ceddf4852f96757c9c73654artoy@google.com                VST2    {dZr3,dZi3},[pDst :128],setStep
22299b31ea5d0f4629ceddf4852f96757c9c73654artoy@google.com
22399b31ea5d0f4629ceddf4852f96757c9c73654artoy@google.com            .endif
22499b31ea5d0f4629ceddf4852f96757c9c73654artoy@google.com
22599b31ea5d0f4629ceddf4852f96757c9c73654artoy@google.com
22699b31ea5d0f4629ceddf4852f96757c9c73654artoy@google.com
22799b31ea5d0f4629ceddf4852f96757c9c73654artoy@google.com        .else
22899b31ea5d0f4629ceddf4852f96757c9c73654artoy@google.com
22999b31ea5d0f4629ceddf4852f96757c9c73654artoy@google.com            @// finish first stage of 4 point FFT
23099b31ea5d0f4629ceddf4852f96757c9c73654artoy@google.com
23199b31ea5d0f4629ceddf4852f96757c9c73654artoy@google.com
23299b31ea5d0f4629ceddf4852f96757c9c73654artoy@google.com            VSUB    qY2,qX0,qX2
23399b31ea5d0f4629ceddf4852f96757c9c73654artoy@google.com
23499b31ea5d0f4629ceddf4852f96757c9c73654artoy@google.com            VLD2    {dXr0,dXi0},[pSrc :128],step1          @//  data[0]
23599b31ea5d0f4629ceddf4852f96757c9c73654artoy@google.com            VADD    qY1,qX1,qX3
23699b31ea5d0f4629ceddf4852f96757c9c73654artoy@google.com            VLD2    {dXr2,dXi2},[pSrc :128],step3          @//  data[2]
23799b31ea5d0f4629ceddf4852f96757c9c73654artoy@google.com            VSUB    qY3,qX1,qX3
23899b31ea5d0f4629ceddf4852f96757c9c73654artoy@google.com
23999b31ea5d0f4629ceddf4852f96757c9c73654artoy@google.com
24099b31ea5d0f4629ceddf4852f96757c9c73654artoy@google.com            @// finish second stage of 4 point FFT
24199b31ea5d0f4629ceddf4852f96757c9c73654artoy@google.com
24299b31ea5d0f4629ceddf4852f96757c9c73654artoy@google.com            .ifeqs "\inverse", "TRUE"
24399b31ea5d0f4629ceddf4852f96757c9c73654artoy@google.com
24499b31ea5d0f4629ceddf4852f96757c9c73654artoy@google.com                VLD2    {dXr1,dXi1},[pSrc :128],step1          @//  data[1]
24599b31ea5d0f4629ceddf4852f96757c9c73654artoy@google.com                VADD    qZ0,qY0,qY1
24699b31ea5d0f4629ceddf4852f96757c9c73654artoy@google.com
24799b31ea5d0f4629ceddf4852f96757c9c73654artoy@google.com                VLD2    {dXr3,dXi3},[pSrc :128],setStep            @//  data[3] & update pSrc for the next set
24899b31ea5d0f4629ceddf4852f96757c9c73654artoy@google.com                VSUB    dZr3,dYr2,dYi3
24999b31ea5d0f4629ceddf4852f96757c9c73654artoy@google.com
25099b31ea5d0f4629ceddf4852f96757c9c73654artoy@google.com                VST2    {dZr0,dZi0},[pDst :128],outPointStep
25199b31ea5d0f4629ceddf4852f96757c9c73654artoy@google.com                VADD    dZi3,dYi2,dYr3
25299b31ea5d0f4629ceddf4852f96757c9c73654artoy@google.com
25399b31ea5d0f4629ceddf4852f96757c9c73654artoy@google.com                VSUB    qZ1,qY0,qY1
25499b31ea5d0f4629ceddf4852f96757c9c73654artoy@google.com                VST2    {dZr3,dZi3},[pDst :128],outPointStep
25599b31ea5d0f4629ceddf4852f96757c9c73654artoy@google.com
25699b31ea5d0f4629ceddf4852f96757c9c73654artoy@google.com                VADD    dZr2,dYr2,dYi3
25799b31ea5d0f4629ceddf4852f96757c9c73654artoy@google.com                VST2    {dZr1,dZi1},[pDst :128],outPointStep
25899b31ea5d0f4629ceddf4852f96757c9c73654artoy@google.com                VSUB    dZi2,dYi2,dYr3
25999b31ea5d0f4629ceddf4852f96757c9c73654artoy@google.com
26099b31ea5d0f4629ceddf4852f96757c9c73654artoy@google.com                VADD    qY0,qX0,qX2                     @// u0 for next iteration
26199b31ea5d0f4629ceddf4852f96757c9c73654artoy@google.com                VST2    {dZr2,dZi2},[pDst :128],setStep
26299b31ea5d0f4629ceddf4852f96757c9c73654artoy@google.com
26399b31ea5d0f4629ceddf4852f96757c9c73654artoy@google.com
26499b31ea5d0f4629ceddf4852f96757c9c73654artoy@google.com            .else
26599b31ea5d0f4629ceddf4852f96757c9c73654artoy@google.com
26699b31ea5d0f4629ceddf4852f96757c9c73654artoy@google.com                VLD2    {dXr1,dXi1},[pSrc :128],step1          @//  data[1]
26799b31ea5d0f4629ceddf4852f96757c9c73654artoy@google.com                VADD    qZ0,qY0,qY1
26899b31ea5d0f4629ceddf4852f96757c9c73654artoy@google.com
26999b31ea5d0f4629ceddf4852f96757c9c73654artoy@google.com                VLD2    {dXr3,dXi3},[pSrc :128],setStep            @//  data[3] & update pSrc for the next set
27099b31ea5d0f4629ceddf4852f96757c9c73654artoy@google.com                VADD    dZr2,dYr2,dYi3
27199b31ea5d0f4629ceddf4852f96757c9c73654artoy@google.com
27299b31ea5d0f4629ceddf4852f96757c9c73654artoy@google.com                VST2    {dZr0,dZi0},[pDst :128],outPointStep
27399b31ea5d0f4629ceddf4852f96757c9c73654artoy@google.com                VSUB    dZi2,dYi2,dYr3
27499b31ea5d0f4629ceddf4852f96757c9c73654artoy@google.com
27599b31ea5d0f4629ceddf4852f96757c9c73654artoy@google.com                VSUB    qZ1,qY0,qY1
27699b31ea5d0f4629ceddf4852f96757c9c73654artoy@google.com                VST2    {dZr2,dZi2},[pDst :128],outPointStep
27799b31ea5d0f4629ceddf4852f96757c9c73654artoy@google.com
27899b31ea5d0f4629ceddf4852f96757c9c73654artoy@google.com                VSUB    dZr3,dYr2,dYi3
27999b31ea5d0f4629ceddf4852f96757c9c73654artoy@google.com                VST2    {dZr1,dZi1},[pDst :128],outPointStep
28099b31ea5d0f4629ceddf4852f96757c9c73654artoy@google.com                VADD    dZi3,dYi2,dYr3
28199b31ea5d0f4629ceddf4852f96757c9c73654artoy@google.com
28299b31ea5d0f4629ceddf4852f96757c9c73654artoy@google.com                VADD    qY0,qX0,qX2                     @// u0 for next iteration
28399b31ea5d0f4629ceddf4852f96757c9c73654artoy@google.com                VST2    {dZr3,dZi3},[pDst :128],setStep
28499b31ea5d0f4629ceddf4852f96757c9c73654artoy@google.com
28599b31ea5d0f4629ceddf4852f96757c9c73654artoy@google.com            .endif
28699b31ea5d0f4629ceddf4852f96757c9c73654artoy@google.com
28799b31ea5d0f4629ceddf4852f96757c9c73654artoy@google.com        .endif
28899b31ea5d0f4629ceddf4852f96757c9c73654artoy@google.com
28999b31ea5d0f4629ceddf4852f96757c9c73654artoy@google.com        BGT     grpZeroSetLoop\name
29099b31ea5d0f4629ceddf4852f96757c9c73654artoy@google.com
29199b31ea5d0f4629ceddf4852f96757c9c73654artoy@google.com        @// reset pSrc to pDst for the next stage
29299b31ea5d0f4629ceddf4852f96757c9c73654artoy@google.com        SUB     pSrc,pDst,pointStep                     @// pDst -= 2*grpSize
29399b31ea5d0f4629ceddf4852f96757c9c73654artoy@google.com        MOV     pDst,pPingPongBuf
29499b31ea5d0f4629ceddf4852f96757c9c73654artoy@google.com
29599b31ea5d0f4629ceddf4852f96757c9c73654artoy@google.com
29699b31ea5d0f4629ceddf4852f96757c9c73654artoy@google.com        .endm
29799b31ea5d0f4629ceddf4852f96757c9c73654artoy@google.com
29899b31ea5d0f4629ceddf4852f96757c9c73654artoy@google.com
29999b31ea5d0f4629ceddf4852f96757c9c73654artoy@google.com
30099b31ea5d0f4629ceddf4852f96757c9c73654artoy@google.com        M_START armSP_FFTFwd_CToC_SC32_Radix4_fs_OutOfPlace_unsafe,r4
30199b31ea5d0f4629ceddf4852f96757c9c73654artoy@google.com        FFTSTAGE "FALSE","FALSE",fwd
30299b31ea5d0f4629ceddf4852f96757c9c73654artoy@google.com        M_END
30399b31ea5d0f4629ceddf4852f96757c9c73654artoy@google.com
30499b31ea5d0f4629ceddf4852f96757c9c73654artoy@google.com
30599b31ea5d0f4629ceddf4852f96757c9c73654artoy@google.com
30699b31ea5d0f4629ceddf4852f96757c9c73654artoy@google.com        M_START armSP_FFTInv_CToC_SC32_Radix4_fs_OutOfPlace_unsafe,r4
30799b31ea5d0f4629ceddf4852f96757c9c73654artoy@google.com        FFTSTAGE "FALSE","TRUE",inv
30899b31ea5d0f4629ceddf4852f96757c9c73654artoy@google.com        M_END
30999b31ea5d0f4629ceddf4852f96757c9c73654artoy@google.com
31099b31ea5d0f4629ceddf4852f96757c9c73654artoy@google.com
31199b31ea5d0f4629ceddf4852f96757c9c73654artoy@google.com        M_START armSP_FFTFwd_CToC_SC32_Sfs_Radix4_fs_OutOfPlace_unsafe,r4
31299b31ea5d0f4629ceddf4852f96757c9c73654artoy@google.com        FFTSTAGE "TRUE","FALSE",fwdsfs
31399b31ea5d0f4629ceddf4852f96757c9c73654artoy@google.com        M_END
31499b31ea5d0f4629ceddf4852f96757c9c73654artoy@google.com
31599b31ea5d0f4629ceddf4852f96757c9c73654artoy@google.com
31699b31ea5d0f4629ceddf4852f96757c9c73654artoy@google.com        M_START armSP_FFTInv_CToC_SC32_Sfs_Radix4_fs_OutOfPlace_unsafe,r4
31799b31ea5d0f4629ceddf4852f96757c9c73654artoy@google.com        FFTSTAGE "TRUE","TRUE",invsfs
31899b31ea5d0f4629ceddf4852f96757c9c73654artoy@google.com        M_END
31999b31ea5d0f4629ceddf4852f96757c9c73654artoy@google.com
32099b31ea5d0f4629ceddf4852f96757c9c73654artoy@google.com	.end
321