14d09f5abfba45163d1296272ac7d2ddc2cd5f9fbrtoy@google.com//
24d09f5abfba45163d1296272ac7d2ddc2cd5f9fbrtoy@google.com//  Copyright (c) 2013 The WebRTC project authors. All Rights Reserved.
34d09f5abfba45163d1296272ac7d2ddc2cd5f9fbrtoy@google.com//
44d09f5abfba45163d1296272ac7d2ddc2cd5f9fbrtoy@google.com//  Use of this source code is governed by a BSD-style license
54d09f5abfba45163d1296272ac7d2ddc2cd5f9fbrtoy@google.com//  that can be found in the LICENSE file in the root of the source
64d09f5abfba45163d1296272ac7d2ddc2cd5f9fbrtoy@google.com//  tree. An additional intellectual property rights grant can be found
74d09f5abfba45163d1296272ac7d2ddc2cd5f9fbrtoy@google.com//  in the file PATENTS.  All contributing project authors may
84d09f5abfba45163d1296272ac7d2ddc2cd5f9fbrtoy@google.com//  be found in the AUTHORS file in the root of the source tree.
94d09f5abfba45163d1296272ac7d2ddc2cd5f9fbrtoy@google.com//
104d09f5abfba45163d1296272ac7d2ddc2cd5f9fbrtoy@google.com//
114d09f5abfba45163d1296272ac7d2ddc2cd5f9fbrtoy@google.com//  This is a modification of armSP_FFT_CToC_SC32_Radix4_unsafe_s.s
124d09f5abfba45163d1296272ac7d2ddc2cd5f9fbrtoy@google.com//  to support float instead of SC32.
134d09f5abfba45163d1296272ac7d2ddc2cd5f9fbrtoy@google.com//
144d09f5abfba45163d1296272ac7d2ddc2cd5f9fbrtoy@google.com
154d09f5abfba45163d1296272ac7d2ddc2cd5f9fbrtoy@google.com//
164d09f5abfba45163d1296272ac7d2ddc2cd5f9fbrtoy@google.com// Description:
174d09f5abfba45163d1296272ac7d2ddc2cd5f9fbrtoy@google.com// Compute a Radix 4 FFT stage for a N point complex signal
184d09f5abfba45163d1296272ac7d2ddc2cd5f9fbrtoy@google.com//
194d09f5abfba45163d1296272ac7d2ddc2cd5f9fbrtoy@google.com//
204d09f5abfba45163d1296272ac7d2ddc2cd5f9fbrtoy@google.com
214d09f5abfba45163d1296272ac7d2ddc2cd5f9fbrtoy@google.com
224d09f5abfba45163d1296272ac7d2ddc2cd5f9fbrtoy@google.com// Include standard headers
234d09f5abfba45163d1296272ac7d2ddc2cd5f9fbrtoy@google.com
244d09f5abfba45163d1296272ac7d2ddc2cd5f9fbrtoy@google.com#include "dl/api/arm/arm64COMM_s.h"
254d09f5abfba45163d1296272ac7d2ddc2cd5f9fbrtoy@google.com#include "dl/api/arm/omxtypes_s.h"
264d09f5abfba45163d1296272ac7d2ddc2cd5f9fbrtoy@google.com
274d09f5abfba45163d1296272ac7d2ddc2cd5f9fbrtoy@google.com
284d09f5abfba45163d1296272ac7d2ddc2cd5f9fbrtoy@google.com// Import symbols required from other files
294d09f5abfba45163d1296272ac7d2ddc2cd5f9fbrtoy@google.com// (For example tables)
304d09f5abfba45163d1296272ac7d2ddc2cd5f9fbrtoy@google.com
314d09f5abfba45163d1296272ac7d2ddc2cd5f9fbrtoy@google.com
324d09f5abfba45163d1296272ac7d2ddc2cd5f9fbrtoy@google.com
334d09f5abfba45163d1296272ac7d2ddc2cd5f9fbrtoy@google.com
344d09f5abfba45163d1296272ac7d2ddc2cd5f9fbrtoy@google.com// Set debugging level
354d09f5abfba45163d1296272ac7d2ddc2cd5f9fbrtoy@google.com//DEBUG_ON    SETL {TRUE}
364d09f5abfba45163d1296272ac7d2ddc2cd5f9fbrtoy@google.com
374d09f5abfba45163d1296272ac7d2ddc2cd5f9fbrtoy@google.com
384d09f5abfba45163d1296272ac7d2ddc2cd5f9fbrtoy@google.com
394d09f5abfba45163d1296272ac7d2ddc2cd5f9fbrtoy@google.com// Guarding implementation by the processor name
404d09f5abfba45163d1296272ac7d2ddc2cd5f9fbrtoy@google.com
414d09f5abfba45163d1296272ac7d2ddc2cd5f9fbrtoy@google.com
424d09f5abfba45163d1296272ac7d2ddc2cd5f9fbrtoy@google.com
434d09f5abfba45163d1296272ac7d2ddc2cd5f9fbrtoy@google.com
444d09f5abfba45163d1296272ac7d2ddc2cd5f9fbrtoy@google.com// Guarding implementation by the processor name
454d09f5abfba45163d1296272ac7d2ddc2cd5f9fbrtoy@google.com
464d09f5abfba45163d1296272ac7d2ddc2cd5f9fbrtoy@google.com
474d09f5abfba45163d1296272ac7d2ddc2cd5f9fbrtoy@google.com// Import symbols required from other files
484d09f5abfba45163d1296272ac7d2ddc2cd5f9fbrtoy@google.com// (For example tables)
494d09f5abfba45163d1296272ac7d2ddc2cd5f9fbrtoy@google.com
504d09f5abfba45163d1296272ac7d2ddc2cd5f9fbrtoy@google.com
514d09f5abfba45163d1296272ac7d2ddc2cd5f9fbrtoy@google.com//Input Registers
524d09f5abfba45163d1296272ac7d2ddc2cd5f9fbrtoy@google.com
534d09f5abfba45163d1296272ac7d2ddc2cd5f9fbrtoy@google.com#define pSrc            x0
544d09f5abfba45163d1296272ac7d2ddc2cd5f9fbrtoy@google.com#define pDst            x1
554d09f5abfba45163d1296272ac7d2ddc2cd5f9fbrtoy@google.com#define pTwiddle        x2
564d09f5abfba45163d1296272ac7d2ddc2cd5f9fbrtoy@google.com#define	pSubFFTNum	x3
574d09f5abfba45163d1296272ac7d2ddc2cd5f9fbrtoy@google.com#define pSubFFTSize	x4
584d09f5abfba45163d1296272ac7d2ddc2cd5f9fbrtoy@google.com
594d09f5abfba45163d1296272ac7d2ddc2cd5f9fbrtoy@google.com
604d09f5abfba45163d1296272ac7d2ddc2cd5f9fbrtoy@google.com
614d09f5abfba45163d1296272ac7d2ddc2cd5f9fbrtoy@google.com//Output Registers
624d09f5abfba45163d1296272ac7d2ddc2cd5f9fbrtoy@google.com
634d09f5abfba45163d1296272ac7d2ddc2cd5f9fbrtoy@google.com
644d09f5abfba45163d1296272ac7d2ddc2cd5f9fbrtoy@google.com//Local Scratch Registers
654d09f5abfba45163d1296272ac7d2ddc2cd5f9fbrtoy@google.com
664d09f5abfba45163d1296272ac7d2ddc2cd5f9fbrtoy@google.com#define subFFTNum       x5
674d09f5abfba45163d1296272ac7d2ddc2cd5f9fbrtoy@google.com#define subFFTSize      x6
684d09f5abfba45163d1296272ac7d2ddc2cd5f9fbrtoy@google.com#define grpCount        x7
694d09f5abfba45163d1296272ac7d2ddc2cd5f9fbrtoy@google.com#define grpCount32      w7
704d09f5abfba45163d1296272ac7d2ddc2cd5f9fbrtoy@google.com#define pointStep       x8
714d09f5abfba45163d1296272ac7d2ddc2cd5f9fbrtoy@google.com#define pointStep32     w8
724d09f5abfba45163d1296272ac7d2ddc2cd5f9fbrtoy@google.com#define outPointStep    x9
734d09f5abfba45163d1296272ac7d2ddc2cd5f9fbrtoy@google.com#define stepTwiddle     x10
744d09f5abfba45163d1296272ac7d2ddc2cd5f9fbrtoy@google.com#define setCount        x11
754d09f5abfba45163d1296272ac7d2ddc2cd5f9fbrtoy@google.com#define srcStep         x12
764d09f5abfba45163d1296272ac7d2ddc2cd5f9fbrtoy@google.com#define setStep         x13
774d09f5abfba45163d1296272ac7d2ddc2cd5f9fbrtoy@google.com#define dstStep         x14
784d09f5abfba45163d1296272ac7d2ddc2cd5f9fbrtoy@google.com#define twStep          x15
794d09f5abfba45163d1296272ac7d2ddc2cd5f9fbrtoy@google.com
804d09f5abfba45163d1296272ac7d2ddc2cd5f9fbrtoy@google.com// Neon Registers
814d09f5abfba45163d1296272ac7d2ddc2cd5f9fbrtoy@google.com
824d09f5abfba45163d1296272ac7d2ddc2cd5f9fbrtoy@google.com#define dW1     v0.2s
834d09f5abfba45163d1296272ac7d2ddc2cd5f9fbrtoy@google.com#define dW2     v1.2s
844d09f5abfba45163d1296272ac7d2ddc2cd5f9fbrtoy@google.com#define dW3     v2.2s
854d09f5abfba45163d1296272ac7d2ddc2cd5f9fbrtoy@google.com
864d09f5abfba45163d1296272ac7d2ddc2cd5f9fbrtoy@google.com#define dXr0    v4.2s
874d09f5abfba45163d1296272ac7d2ddc2cd5f9fbrtoy@google.com#define dXi0    v5.2s
884d09f5abfba45163d1296272ac7d2ddc2cd5f9fbrtoy@google.com#define dXr1    v6.2s
894d09f5abfba45163d1296272ac7d2ddc2cd5f9fbrtoy@google.com#define dXi1    v7.2s
904d09f5abfba45163d1296272ac7d2ddc2cd5f9fbrtoy@google.com#define dXr2    v8.2s
914d09f5abfba45163d1296272ac7d2ddc2cd5f9fbrtoy@google.com#define dXi2    v9.2s
924d09f5abfba45163d1296272ac7d2ddc2cd5f9fbrtoy@google.com#define dXr3    v10.2s
934d09f5abfba45163d1296272ac7d2ddc2cd5f9fbrtoy@google.com#define dXi3    v11.2s
944d09f5abfba45163d1296272ac7d2ddc2cd5f9fbrtoy@google.com#define dYr0    v12.2s
954d09f5abfba45163d1296272ac7d2ddc2cd5f9fbrtoy@google.com#define dYi0    v13.2s
964d09f5abfba45163d1296272ac7d2ddc2cd5f9fbrtoy@google.com#define dYr1    v14.2s
974d09f5abfba45163d1296272ac7d2ddc2cd5f9fbrtoy@google.com#define dYi1    v15.2s
984d09f5abfba45163d1296272ac7d2ddc2cd5f9fbrtoy@google.com#define dYr2    v16.2s
994d09f5abfba45163d1296272ac7d2ddc2cd5f9fbrtoy@google.com#define dYi2    v17.2s
1004d09f5abfba45163d1296272ac7d2ddc2cd5f9fbrtoy@google.com#define dYr3    v18.2s
1014d09f5abfba45163d1296272ac7d2ddc2cd5f9fbrtoy@google.com#define dYi3    v19.2s
1024d09f5abfba45163d1296272ac7d2ddc2cd5f9fbrtoy@google.com#define dZr0    v20.2s
1034d09f5abfba45163d1296272ac7d2ddc2cd5f9fbrtoy@google.com#define dZi0    v21.2s
1044d09f5abfba45163d1296272ac7d2ddc2cd5f9fbrtoy@google.com#define dZr1    v22.2s
1054d09f5abfba45163d1296272ac7d2ddc2cd5f9fbrtoy@google.com#define dZi1    v23.2s
1064d09f5abfba45163d1296272ac7d2ddc2cd5f9fbrtoy@google.com#define dZr2    v24.2s
1074d09f5abfba45163d1296272ac7d2ddc2cd5f9fbrtoy@google.com#define dZi2    v25.2s
1084d09f5abfba45163d1296272ac7d2ddc2cd5f9fbrtoy@google.com#define dZr3    v26.2s
1094d09f5abfba45163d1296272ac7d2ddc2cd5f9fbrtoy@google.com#define dZi3    v27.2s
1104d09f5abfba45163d1296272ac7d2ddc2cd5f9fbrtoy@google.com
1114d09f5abfba45163d1296272ac7d2ddc2cd5f9fbrtoy@google.com        .MACRO FFTSTAGE scaled, inverse , name
1124d09f5abfba45163d1296272ac7d2ddc2cd5f9fbrtoy@google.com
1134d09f5abfba45163d1296272ac7d2ddc2cd5f9fbrtoy@google.com        // Define stack arguments
1144d09f5abfba45163d1296272ac7d2ddc2cd5f9fbrtoy@google.com
1154d09f5abfba45163d1296272ac7d2ddc2cd5f9fbrtoy@google.com        // Move args values into our work registers
1164d09f5abfba45163d1296272ac7d2ddc2cd5f9fbrtoy@google.com        ldr     subFFTNum, [pSubFFTNum]
1174d09f5abfba45163d1296272ac7d2ddc2cd5f9fbrtoy@google.com        ldr     subFFTSize, [pSubFFTSize]
1184d09f5abfba45163d1296272ac7d2ddc2cd5f9fbrtoy@google.com
1194d09f5abfba45163d1296272ac7d2ddc2cd5f9fbrtoy@google.com        // Update grpCount and grpSize rightaway inorder to reuse
1204d09f5abfba45163d1296272ac7d2ddc2cd5f9fbrtoy@google.com        // pGrpCount and pGrpSize regs
1214d09f5abfba45163d1296272ac7d2ddc2cd5f9fbrtoy@google.com
1224d09f5abfba45163d1296272ac7d2ddc2cd5f9fbrtoy@google.com        LSL     grpCount,subFFTSize,#2
1234d09f5abfba45163d1296272ac7d2ddc2cd5f9fbrtoy@google.com        LSR     subFFTNum,subFFTNum,#2
1244d09f5abfba45163d1296272ac7d2ddc2cd5f9fbrtoy@google.com        MOV     subFFTSize,grpCount
1254d09f5abfba45163d1296272ac7d2ddc2cd5f9fbrtoy@google.com
1264d09f5abfba45163d1296272ac7d2ddc2cd5f9fbrtoy@google.com        ld1      {dW1},[pTwiddle]                    //[wi | wr]
1274d09f5abfba45163d1296272ac7d2ddc2cd5f9fbrtoy@google.com        // pT0+1 increments pT0 by 8 bytes
1284d09f5abfba45163d1296272ac7d2ddc2cd5f9fbrtoy@google.com        // pT0+pointStep = increment of 8*pointStep bytes = 2*grpSize bytes
1294d09f5abfba45163d1296272ac7d2ddc2cd5f9fbrtoy@google.com        lsl     pointStep,subFFTNum, #1
1304d09f5abfba45163d1296272ac7d2ddc2cd5f9fbrtoy@google.com
1314d09f5abfba45163d1296272ac7d2ddc2cd5f9fbrtoy@google.com        // pOut0+1 increments pOut0 by 8 bytes
1324d09f5abfba45163d1296272ac7d2ddc2cd5f9fbrtoy@google.com        // pOut0+outPointStep == increment of 8*outPointStep bytes
1334d09f5abfba45163d1296272ac7d2ddc2cd5f9fbrtoy@google.com        //   = 2*size bytes
1344d09f5abfba45163d1296272ac7d2ddc2cd5f9fbrtoy@google.com
1354d09f5abfba45163d1296272ac7d2ddc2cd5f9fbrtoy@google.com        MOV     stepTwiddle,#0
1364d09f5abfba45163d1296272ac7d2ddc2cd5f9fbrtoy@google.com        ld1      {dW2},[pTwiddle]                    //[wi | wr]
1374d09f5abfba45163d1296272ac7d2ddc2cd5f9fbrtoy@google.com        smull   outPointStep,grpCount32,pointStep32
1384d09f5abfba45163d1296272ac7d2ddc2cd5f9fbrtoy@google.com
1394d09f5abfba45163d1296272ac7d2ddc2cd5f9fbrtoy@google.com        LSL     pointStep,pointStep,#2             // 2*grpSize
1404d09f5abfba45163d1296272ac7d2ddc2cd5f9fbrtoy@google.com
1414d09f5abfba45163d1296272ac7d2ddc2cd5f9fbrtoy@google.com        ld1      {dW3},[pTwiddle]                  //[wi | wr]
1424d09f5abfba45163d1296272ac7d2ddc2cd5f9fbrtoy@google.com        lsl     srcStep,pointStep, #1              // srcStep = 2*pointStep
1434d09f5abfba45163d1296272ac7d2ddc2cd5f9fbrtoy@google.com
1444d09f5abfba45163d1296272ac7d2ddc2cd5f9fbrtoy@google.com        ADD     setStep,srcStep,pointStep          // setStep = 3*pointStep
1454d09f5abfba45163d1296272ac7d2ddc2cd5f9fbrtoy@google.com
1464d09f5abfba45163d1296272ac7d2ddc2cd5f9fbrtoy@google.com        rsb     setStep,setStep,#0                 // setStep = - 3*pointStep
1474d09f5abfba45163d1296272ac7d2ddc2cd5f9fbrtoy@google.com        SUB     srcStep,srcStep,#16                // srcStep = 2*pointStep-16
1484d09f5abfba45163d1296272ac7d2ddc2cd5f9fbrtoy@google.com
1494d09f5abfba45163d1296272ac7d2ddc2cd5f9fbrtoy@google.com        lsl     dstStep,outPointStep, #1
1504d09f5abfba45163d1296272ac7d2ddc2cd5f9fbrtoy@google.com
1514d09f5abfba45163d1296272ac7d2ddc2cd5f9fbrtoy@google.com        ADD     dstStep,dstStep,outPointStep       // dstStep = 3*outPointStep
1524d09f5abfba45163d1296272ac7d2ddc2cd5f9fbrtoy@google.com        // dstStep = - 3*outPointStep+16
1534d09f5abfba45163d1296272ac7d2ddc2cd5f9fbrtoy@google.com        rsb     dstStep,dstStep,#16
1544d09f5abfba45163d1296272ac7d2ddc2cd5f9fbrtoy@google.com
1554d09f5abfba45163d1296272ac7d2ddc2cd5f9fbrtoy@google.com
1564d09f5abfba45163d1296272ac7d2ddc2cd5f9fbrtoy@google.comradix4GrpLoop\name :
1574d09f5abfba45163d1296272ac7d2ddc2cd5f9fbrtoy@google.com
1584d09f5abfba45163d1296272ac7d2ddc2cd5f9fbrtoy@google.com        ld2     {dXr0,dXi0},[pSrc],pointStep       //  data[0]
1594d09f5abfba45163d1296272ac7d2ddc2cd5f9fbrtoy@google.com        ADD      stepTwiddle,stepTwiddle,pointStep
1604d09f5abfba45163d1296272ac7d2ddc2cd5f9fbrtoy@google.com        ld2     {dXr1,dXi1},[pSrc],pointStep       //  data[1]
1614d09f5abfba45163d1296272ac7d2ddc2cd5f9fbrtoy@google.com        // set pTwiddle to the first point
1624d09f5abfba45163d1296272ac7d2ddc2cd5f9fbrtoy@google.com        ADD      pTwiddle,pTwiddle,stepTwiddle
1634d09f5abfba45163d1296272ac7d2ddc2cd5f9fbrtoy@google.com        ld2     {dXr2,dXi2},[pSrc],pointStep       //  data[2]
1644d09f5abfba45163d1296272ac7d2ddc2cd5f9fbrtoy@google.com        lsl      twStep,stepTwiddle, #2
1654d09f5abfba45163d1296272ac7d2ddc2cd5f9fbrtoy@google.com
1664d09f5abfba45163d1296272ac7d2ddc2cd5f9fbrtoy@google.com        //  data[3] & update pSrc for the next set
1674d09f5abfba45163d1296272ac7d2ddc2cd5f9fbrtoy@google.com        ld2     {dXr3,dXi3},[pSrc],setStep
1684d09f5abfba45163d1296272ac7d2ddc2cd5f9fbrtoy@google.com        SUB      twStep,stepTwiddle,twStep         // twStep = -3*stepTwiddle
1694d09f5abfba45163d1296272ac7d2ddc2cd5f9fbrtoy@google.com
1704d09f5abfba45163d1296272ac7d2ddc2cd5f9fbrtoy@google.com        lsr      setCount,pointStep, #3
1714d09f5abfba45163d1296272ac7d2ddc2cd5f9fbrtoy@google.com
1724d09f5abfba45163d1296272ac7d2ddc2cd5f9fbrtoy@google.com        // set pSrc to data[0] of the next set
1734d09f5abfba45163d1296272ac7d2ddc2cd5f9fbrtoy@google.com        ADD     pSrc,pSrc,#16
1744d09f5abfba45163d1296272ac7d2ddc2cd5f9fbrtoy@google.com        // increment to data[1] of the next set
1754d09f5abfba45163d1296272ac7d2ddc2cd5f9fbrtoy@google.com        ADD     pSrc,pSrc,pointStep
1764d09f5abfba45163d1296272ac7d2ddc2cd5f9fbrtoy@google.com
1774d09f5abfba45163d1296272ac7d2ddc2cd5f9fbrtoy@google.com
1784d09f5abfba45163d1296272ac7d2ddc2cd5f9fbrtoy@google.com        // Loop on the sets
1794d09f5abfba45163d1296272ac7d2ddc2cd5f9fbrtoy@google.com
1804d09f5abfba45163d1296272ac7d2ddc2cd5f9fbrtoy@google.comradix4SetLoop\name :
1814d09f5abfba45163d1296272ac7d2ddc2cd5f9fbrtoy@google.com
1824d09f5abfba45163d1296272ac7d2ddc2cd5f9fbrtoy@google.com
1834d09f5abfba45163d1296272ac7d2ddc2cd5f9fbrtoy@google.com
1844d09f5abfba45163d1296272ac7d2ddc2cd5f9fbrtoy@google.com        .ifeqs  "\inverse", "TRUE"
1854d09f5abfba45163d1296272ac7d2ddc2cd5f9fbrtoy@google.com            fmul   dZr1,dXr1,dW1[0]
1864d09f5abfba45163d1296272ac7d2ddc2cd5f9fbrtoy@google.com            fmul   dZi1,dXi1,dW1[0]
1874d09f5abfba45163d1296272ac7d2ddc2cd5f9fbrtoy@google.com            fmul   dZr2,dXr2,dW2[0]
1884d09f5abfba45163d1296272ac7d2ddc2cd5f9fbrtoy@google.com            fmul   dZi2,dXi2,dW2[0]
1894d09f5abfba45163d1296272ac7d2ddc2cd5f9fbrtoy@google.com            fmul   dZr3,dXr3,dW3[0]
1904d09f5abfba45163d1296272ac7d2ddc2cd5f9fbrtoy@google.com            fmul   dZi3,dXi3,dW3[0]
1914d09f5abfba45163d1296272ac7d2ddc2cd5f9fbrtoy@google.com
1924d09f5abfba45163d1296272ac7d2ddc2cd5f9fbrtoy@google.com            fmla   dZr1,dXi1,dW1[1]                // real part
1934d09f5abfba45163d1296272ac7d2ddc2cd5f9fbrtoy@google.com            fmls   dZi1,dXr1,dW1[1]                // imag part
1944d09f5abfba45163d1296272ac7d2ddc2cd5f9fbrtoy@google.com
1954d09f5abfba45163d1296272ac7d2ddc2cd5f9fbrtoy@google.com            //  data[1] for next iteration
1964d09f5abfba45163d1296272ac7d2ddc2cd5f9fbrtoy@google.com            ld2     {dXr1,dXi1},[pSrc],pointStep
1974d09f5abfba45163d1296272ac7d2ddc2cd5f9fbrtoy@google.com
1984d09f5abfba45163d1296272ac7d2ddc2cd5f9fbrtoy@google.com            fmla   dZr2,dXi2,dW2[1]                // real part
1994d09f5abfba45163d1296272ac7d2ddc2cd5f9fbrtoy@google.com            fmls   dZi2,dXr2,dW2[1]                // imag part
2004d09f5abfba45163d1296272ac7d2ddc2cd5f9fbrtoy@google.com
2014d09f5abfba45163d1296272ac7d2ddc2cd5f9fbrtoy@google.com            //  data[2] for next iteration
2024d09f5abfba45163d1296272ac7d2ddc2cd5f9fbrtoy@google.com            ld2     {dXr2,dXi2},[pSrc],pointStep
2034d09f5abfba45163d1296272ac7d2ddc2cd5f9fbrtoy@google.com
2044d09f5abfba45163d1296272ac7d2ddc2cd5f9fbrtoy@google.com            fmla   dZr3,dXi3,dW3[1]                // real part
2054d09f5abfba45163d1296272ac7d2ddc2cd5f9fbrtoy@google.com            fmls   dZi3,dXr3,dW3[1]                // imag part
2064d09f5abfba45163d1296272ac7d2ddc2cd5f9fbrtoy@google.com        .else
2074d09f5abfba45163d1296272ac7d2ddc2cd5f9fbrtoy@google.com            fmul   dZr1,dXr1,dW1[0]
2084d09f5abfba45163d1296272ac7d2ddc2cd5f9fbrtoy@google.com            fmul   dZi1,dXi1,dW1[0]
2094d09f5abfba45163d1296272ac7d2ddc2cd5f9fbrtoy@google.com            fmul   dZr2,dXr2,dW2[0]
2104d09f5abfba45163d1296272ac7d2ddc2cd5f9fbrtoy@google.com            fmul   dZi2,dXi2,dW2[0]
2114d09f5abfba45163d1296272ac7d2ddc2cd5f9fbrtoy@google.com            fmul   dZr3,dXr3,dW3[0]
2124d09f5abfba45163d1296272ac7d2ddc2cd5f9fbrtoy@google.com            fmul   dZi3,dXi3,dW3[0]
2134d09f5abfba45163d1296272ac7d2ddc2cd5f9fbrtoy@google.com
2144d09f5abfba45163d1296272ac7d2ddc2cd5f9fbrtoy@google.com            fmls   dZr1,dXi1,dW1[1]                // real part
2154d09f5abfba45163d1296272ac7d2ddc2cd5f9fbrtoy@google.com            fmla   dZi1,dXr1,dW1[1]                // imag part
2164d09f5abfba45163d1296272ac7d2ddc2cd5f9fbrtoy@google.com
2174d09f5abfba45163d1296272ac7d2ddc2cd5f9fbrtoy@google.com            //  data[1] for next iteration
2184d09f5abfba45163d1296272ac7d2ddc2cd5f9fbrtoy@google.com            ld2     {dXr1,dXi1},[pSrc],pointStep
2194d09f5abfba45163d1296272ac7d2ddc2cd5f9fbrtoy@google.com
2204d09f5abfba45163d1296272ac7d2ddc2cd5f9fbrtoy@google.com            fmls   dZr2,dXi2,dW2[1]                // real part
2214d09f5abfba45163d1296272ac7d2ddc2cd5f9fbrtoy@google.com            fmla   dZi2,dXr2,dW2[1]                // imag part
2224d09f5abfba45163d1296272ac7d2ddc2cd5f9fbrtoy@google.com
2234d09f5abfba45163d1296272ac7d2ddc2cd5f9fbrtoy@google.com            //  data[2] for next iteration
2244d09f5abfba45163d1296272ac7d2ddc2cd5f9fbrtoy@google.com            ld2     {dXr2,dXi2},[pSrc],pointStep
2254d09f5abfba45163d1296272ac7d2ddc2cd5f9fbrtoy@google.com
2264d09f5abfba45163d1296272ac7d2ddc2cd5f9fbrtoy@google.com            fmls   dZr3,dXi3,dW3[1]                // real part
2274d09f5abfba45163d1296272ac7d2ddc2cd5f9fbrtoy@google.com            fmla   dZi3,dXr3,dW3[1]                // imag part
2284d09f5abfba45163d1296272ac7d2ddc2cd5f9fbrtoy@google.com        .endif
2294d09f5abfba45163d1296272ac7d2ddc2cd5f9fbrtoy@google.com
2304d09f5abfba45163d1296272ac7d2ddc2cd5f9fbrtoy@google.com        //  data[3] & update pSrc to data[0]
2314d09f5abfba45163d1296272ac7d2ddc2cd5f9fbrtoy@google.com        // But don't read on the very last iteration because that reads past
2324d09f5abfba45163d1296272ac7d2ddc2cd5f9fbrtoy@google.com        // the end of pSrc. The last iteration is grpCount = 4, setCount = 2.
2334d09f5abfba45163d1296272ac7d2ddc2cd5f9fbrtoy@google.com        cmp     grpCount, #4
2344d09f5abfba45163d1296272ac7d2ddc2cd5f9fbrtoy@google.com
2354d09f5abfba45163d1296272ac7d2ddc2cd5f9fbrtoy@google.com        b.ne    skipUpdate\name
2364d09f5abfba45163d1296272ac7d2ddc2cd5f9fbrtoy@google.com        cmp     setCount, #2
2374d09f5abfba45163d1296272ac7d2ddc2cd5f9fbrtoy@google.com        b.ne    skipUpdate\name
2384d09f5abfba45163d1296272ac7d2ddc2cd5f9fbrtoy@google.com        add     pSrc, pSrc, setStep
2394d09f5abfba45163d1296272ac7d2ddc2cd5f9fbrtoy@google.com        beq     radix4SkipRead\name
2404d09f5abfba45163d1296272ac7d2ddc2cd5f9fbrtoy@google.comskipUpdate\name:
2414d09f5abfba45163d1296272ac7d2ddc2cd5f9fbrtoy@google.com        ld2     {dXr3,dXi3},[pSrc],setStep
2424d09f5abfba45163d1296272ac7d2ddc2cd5f9fbrtoy@google.comradix4SkipRead\name:
2434d09f5abfba45163d1296272ac7d2ddc2cd5f9fbrtoy@google.com
2444d09f5abfba45163d1296272ac7d2ddc2cd5f9fbrtoy@google.com        SUBS    setCount,setCount,#2
2454d09f5abfba45163d1296272ac7d2ddc2cd5f9fbrtoy@google.com
2464d09f5abfba45163d1296272ac7d2ddc2cd5f9fbrtoy@google.com        // finish first stage of 4 point FFT
2474d09f5abfba45163d1296272ac7d2ddc2cd5f9fbrtoy@google.com        // fadd    qY0,qX0,qZ2
2484d09f5abfba45163d1296272ac7d2ddc2cd5f9fbrtoy@google.com        // fsub    qY2,qX0,qZ2
2494d09f5abfba45163d1296272ac7d2ddc2cd5f9fbrtoy@google.com        fadd    dYr0,dXr0,dZr2
2504d09f5abfba45163d1296272ac7d2ddc2cd5f9fbrtoy@google.com        fsub    dYr2,dXr0,dZr2
2514d09f5abfba45163d1296272ac7d2ddc2cd5f9fbrtoy@google.com        fadd    dYi0,dXi0,dZi2
2524d09f5abfba45163d1296272ac7d2ddc2cd5f9fbrtoy@google.com        fsub    dYi2,dXi0,dZi2
2534d09f5abfba45163d1296272ac7d2ddc2cd5f9fbrtoy@google.com
2544d09f5abfba45163d1296272ac7d2ddc2cd5f9fbrtoy@google.com        //  data[0] for next iteration
2554d09f5abfba45163d1296272ac7d2ddc2cd5f9fbrtoy@google.com        ld2     {dXr0,dXi0},[pSrc], #16
2564d09f5abfba45163d1296272ac7d2ddc2cd5f9fbrtoy@google.com        // fadd    qY1,qZ1,qZ3
2574d09f5abfba45163d1296272ac7d2ddc2cd5f9fbrtoy@google.com        // fsub    qY3,qZ1,qZ3
2584d09f5abfba45163d1296272ac7d2ddc2cd5f9fbrtoy@google.com        fadd    dYr1,dZr1,dZr3
2594d09f5abfba45163d1296272ac7d2ddc2cd5f9fbrtoy@google.com        fsub    dYr3,dZr1,dZr3
2604d09f5abfba45163d1296272ac7d2ddc2cd5f9fbrtoy@google.com        fadd    dYi1,dZi1,dZi3
2614d09f5abfba45163d1296272ac7d2ddc2cd5f9fbrtoy@google.com        fsub    dYi3,dZi1,dZi3
2624d09f5abfba45163d1296272ac7d2ddc2cd5f9fbrtoy@google.com
2634d09f5abfba45163d1296272ac7d2ddc2cd5f9fbrtoy@google.com        // finish second stage of 4 point FFT
2644d09f5abfba45163d1296272ac7d2ddc2cd5f9fbrtoy@google.com
2654d09f5abfba45163d1296272ac7d2ddc2cd5f9fbrtoy@google.com        // fsub    qZ0,qY2,qY1
2664d09f5abfba45163d1296272ac7d2ddc2cd5f9fbrtoy@google.com        fsub    dZr0,dYr2,dYr1
2674d09f5abfba45163d1296272ac7d2ddc2cd5f9fbrtoy@google.com        fsub    dZi0,dYi2,dYi1
2684d09f5abfba45163d1296272ac7d2ddc2cd5f9fbrtoy@google.com
2694d09f5abfba45163d1296272ac7d2ddc2cd5f9fbrtoy@google.com        .ifeqs  "\inverse", "TRUE"
2704d09f5abfba45163d1296272ac7d2ddc2cd5f9fbrtoy@google.com
2714d09f5abfba45163d1296272ac7d2ddc2cd5f9fbrtoy@google.com            fadd    dZr3,dYr0,dYi3
2724d09f5abfba45163d1296272ac7d2ddc2cd5f9fbrtoy@google.com            st2     {dZr0,dZi0},[pDst],outPointStep
2734d09f5abfba45163d1296272ac7d2ddc2cd5f9fbrtoy@google.com            fsub    dZi3,dYi0,dYr3
2744d09f5abfba45163d1296272ac7d2ddc2cd5f9fbrtoy@google.com
2754d09f5abfba45163d1296272ac7d2ddc2cd5f9fbrtoy@google.com            // fadd    qZ2,qY2,qY1
2764d09f5abfba45163d1296272ac7d2ddc2cd5f9fbrtoy@google.com            fadd    dZr2,dYr2,dYr1
2774d09f5abfba45163d1296272ac7d2ddc2cd5f9fbrtoy@google.com            fadd    dZi2,dYi2,dYi1
2784d09f5abfba45163d1296272ac7d2ddc2cd5f9fbrtoy@google.com
2794d09f5abfba45163d1296272ac7d2ddc2cd5f9fbrtoy@google.com            st2     {dZr3,dZi3},[pDst],outPointStep
2804d09f5abfba45163d1296272ac7d2ddc2cd5f9fbrtoy@google.com
2814d09f5abfba45163d1296272ac7d2ddc2cd5f9fbrtoy@google.com            fsub    dZr1,dYr0,dYi3
2824d09f5abfba45163d1296272ac7d2ddc2cd5f9fbrtoy@google.com            st2     {dZr2,dZi2},[pDst],outPointStep
2834d09f5abfba45163d1296272ac7d2ddc2cd5f9fbrtoy@google.com            fadd    dZi1,dYi0,dYr3
2844d09f5abfba45163d1296272ac7d2ddc2cd5f9fbrtoy@google.com
2854d09f5abfba45163d1296272ac7d2ddc2cd5f9fbrtoy@google.com            st2     {dZr1,dZi1},[pDst],dstStep
2864d09f5abfba45163d1296272ac7d2ddc2cd5f9fbrtoy@google.com
2874d09f5abfba45163d1296272ac7d2ddc2cd5f9fbrtoy@google.com
2884d09f5abfba45163d1296272ac7d2ddc2cd5f9fbrtoy@google.com        .else
2894d09f5abfba45163d1296272ac7d2ddc2cd5f9fbrtoy@google.com
2904d09f5abfba45163d1296272ac7d2ddc2cd5f9fbrtoy@google.com            fsub    dZr1,dYr0,dYi3
2914d09f5abfba45163d1296272ac7d2ddc2cd5f9fbrtoy@google.com            st2     {dZr0,dZi0},[pDst],outPointStep
2924d09f5abfba45163d1296272ac7d2ddc2cd5f9fbrtoy@google.com            fadd    dZi1,dYi0,dYr3
2934d09f5abfba45163d1296272ac7d2ddc2cd5f9fbrtoy@google.com
2944d09f5abfba45163d1296272ac7d2ddc2cd5f9fbrtoy@google.com            // fadd    qZ2,qY2,qY1
2954d09f5abfba45163d1296272ac7d2ddc2cd5f9fbrtoy@google.com            fadd    dZr2,dYr2,dYr1
2964d09f5abfba45163d1296272ac7d2ddc2cd5f9fbrtoy@google.com            fadd    dZi2,dYi2,dYi1
2974d09f5abfba45163d1296272ac7d2ddc2cd5f9fbrtoy@google.com
2984d09f5abfba45163d1296272ac7d2ddc2cd5f9fbrtoy@google.com            st2     {dZr1,dZi1},[pDst],outPointStep
2994d09f5abfba45163d1296272ac7d2ddc2cd5f9fbrtoy@google.com
3004d09f5abfba45163d1296272ac7d2ddc2cd5f9fbrtoy@google.com            fadd    dZr3,dYr0,dYi3
3014d09f5abfba45163d1296272ac7d2ddc2cd5f9fbrtoy@google.com            st2     {dZr2,dZi2},[pDst],outPointStep
3024d09f5abfba45163d1296272ac7d2ddc2cd5f9fbrtoy@google.com            fsub    dZi3,dYi0,dYr3
3034d09f5abfba45163d1296272ac7d2ddc2cd5f9fbrtoy@google.com
3044d09f5abfba45163d1296272ac7d2ddc2cd5f9fbrtoy@google.com            st2     {dZr3,dZi3},[pDst],dstStep
3054d09f5abfba45163d1296272ac7d2ddc2cd5f9fbrtoy@google.com
3064d09f5abfba45163d1296272ac7d2ddc2cd5f9fbrtoy@google.com
3074d09f5abfba45163d1296272ac7d2ddc2cd5f9fbrtoy@google.com        .endif
3084d09f5abfba45163d1296272ac7d2ddc2cd5f9fbrtoy@google.com
3094d09f5abfba45163d1296272ac7d2ddc2cd5f9fbrtoy@google.com        // increment to data[1] of the next set
3104d09f5abfba45163d1296272ac7d2ddc2cd5f9fbrtoy@google.com        ADD     pSrc,pSrc,pointStep
3114d09f5abfba45163d1296272ac7d2ddc2cd5f9fbrtoy@google.com        BGT     radix4SetLoop\name
3124d09f5abfba45163d1296272ac7d2ddc2cd5f9fbrtoy@google.com
3134d09f5abfba45163d1296272ac7d2ddc2cd5f9fbrtoy@google.com
3144d09f5abfba45163d1296272ac7d2ddc2cd5f9fbrtoy@google.com        ld1      {dW1},[pTwiddle],stepTwiddle    //[wi | wr]
3154d09f5abfba45163d1296272ac7d2ddc2cd5f9fbrtoy@google.com        // subtract 4 since grpCount multiplied by 4
3164d09f5abfba45163d1296272ac7d2ddc2cd5f9fbrtoy@google.com        SUBS    grpCount,grpCount,#4
3174d09f5abfba45163d1296272ac7d2ddc2cd5f9fbrtoy@google.com        ld1      {dW2},[pTwiddle],stepTwiddle    //[wi | wr]
3184d09f5abfba45163d1296272ac7d2ddc2cd5f9fbrtoy@google.com        // increment pSrc for the next grp
3194d09f5abfba45163d1296272ac7d2ddc2cd5f9fbrtoy@google.com        ADD     pSrc,pSrc,srcStep
3204d09f5abfba45163d1296272ac7d2ddc2cd5f9fbrtoy@google.com        ld1      {dW3},[pTwiddle],twStep         //[wi | wr]
3214d09f5abfba45163d1296272ac7d2ddc2cd5f9fbrtoy@google.com        BGT     radix4GrpLoop\name
3224d09f5abfba45163d1296272ac7d2ddc2cd5f9fbrtoy@google.com
3234d09f5abfba45163d1296272ac7d2ddc2cd5f9fbrtoy@google.com        str     subFFTNum, [pSubFFTNum]
3244d09f5abfba45163d1296272ac7d2ddc2cd5f9fbrtoy@google.com        str     subFFTSize, [pSubFFTSize]
3254d09f5abfba45163d1296272ac7d2ddc2cd5f9fbrtoy@google.com
3264d09f5abfba45163d1296272ac7d2ddc2cd5f9fbrtoy@google.com        .endm
3274d09f5abfba45163d1296272ac7d2ddc2cd5f9fbrtoy@google.com
3284d09f5abfba45163d1296272ac7d2ddc2cd5f9fbrtoy@google.com
3294d09f5abfba45163d1296272ac7d2ddc2cd5f9fbrtoy@google.com        M_START armSP_FFTFwd_CToC_FC32_Radix4_OutOfPlace,,d15
3304d09f5abfba45163d1296272ac7d2ddc2cd5f9fbrtoy@google.com            FFTSTAGE "FALSE","FALSE",FWD
3314d09f5abfba45163d1296272ac7d2ddc2cd5f9fbrtoy@google.com        M_END
3324d09f5abfba45163d1296272ac7d2ddc2cd5f9fbrtoy@google.com
3334d09f5abfba45163d1296272ac7d2ddc2cd5f9fbrtoy@google.com
3344d09f5abfba45163d1296272ac7d2ddc2cd5f9fbrtoy@google.com        M_START armSP_FFTInv_CToC_FC32_Radix4_OutOfPlace,,d15
3354d09f5abfba45163d1296272ac7d2ddc2cd5f9fbrtoy@google.com            FFTSTAGE "FALSE","TRUE",INV
3364d09f5abfba45163d1296272ac7d2ddc2cd5f9fbrtoy@google.com        M_END
3374d09f5abfba45163d1296272ac7d2ddc2cd5f9fbrtoy@google.com
3384d09f5abfba45163d1296272ac7d2ddc2cd5f9fbrtoy@google.com
3394d09f5abfba45163d1296272ac7d2ddc2cd5f9fbrtoy@google.com        .end
340