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//  This is a modification of armSP_FFT_CToC_FC32_Radix8_fs_unsafe_s.s
114d09f5abfba45163d1296272ac7d2ddc2cd5f9fbrtoy@google.com//  to support float instead of SC32.
124d09f5abfba45163d1296272ac7d2ddc2cd5f9fbrtoy@google.com//
134d09f5abfba45163d1296272ac7d2ddc2cd5f9fbrtoy@google.com
144d09f5abfba45163d1296272ac7d2ddc2cd5f9fbrtoy@google.com//
154d09f5abfba45163d1296272ac7d2ddc2cd5f9fbrtoy@google.com// Description:
164d09f5abfba45163d1296272ac7d2ddc2cd5f9fbrtoy@google.com// Compute a first stage Radix 8 FFT stage for a N point complex signal
174d09f5abfba45163d1296272ac7d2ddc2cd5f9fbrtoy@google.com//
184d09f5abfba45163d1296272ac7d2ddc2cd5f9fbrtoy@google.com//
194d09f5abfba45163d1296272ac7d2ddc2cd5f9fbrtoy@google.com
204d09f5abfba45163d1296272ac7d2ddc2cd5f9fbrtoy@google.com
214d09f5abfba45163d1296272ac7d2ddc2cd5f9fbrtoy@google.com// Include standard headers
224d09f5abfba45163d1296272ac7d2ddc2cd5f9fbrtoy@google.com
234d09f5abfba45163d1296272ac7d2ddc2cd5f9fbrtoy@google.com#include "dl/api/arm/arm64COMM_s.h"
244d09f5abfba45163d1296272ac7d2ddc2cd5f9fbrtoy@google.com#include "dl/api/arm/omxtypes_s.h"
254d09f5abfba45163d1296272ac7d2ddc2cd5f9fbrtoy@google.com
264d09f5abfba45163d1296272ac7d2ddc2cd5f9fbrtoy@google.com// Import symbols required from other files
274d09f5abfba45163d1296272ac7d2ddc2cd5f9fbrtoy@google.com// (For example tables)
284d09f5abfba45163d1296272ac7d2ddc2cd5f9fbrtoy@google.com
294d09f5abfba45163d1296272ac7d2ddc2cd5f9fbrtoy@google.com
304d09f5abfba45163d1296272ac7d2ddc2cd5f9fbrtoy@google.com// Set debugging level
314d09f5abfba45163d1296272ac7d2ddc2cd5f9fbrtoy@google.com//DEBUG_ON    SETL {TRUE}
324d09f5abfba45163d1296272ac7d2ddc2cd5f9fbrtoy@google.com
334d09f5abfba45163d1296272ac7d2ddc2cd5f9fbrtoy@google.com
344d09f5abfba45163d1296272ac7d2ddc2cd5f9fbrtoy@google.com
354d09f5abfba45163d1296272ac7d2ddc2cd5f9fbrtoy@google.com// Guarding implementation by the processor name
364d09f5abfba45163d1296272ac7d2ddc2cd5f9fbrtoy@google.com
374d09f5abfba45163d1296272ac7d2ddc2cd5f9fbrtoy@google.com
384d09f5abfba45163d1296272ac7d2ddc2cd5f9fbrtoy@google.com
394d09f5abfba45163d1296272ac7d2ddc2cd5f9fbrtoy@google.com
404d09f5abfba45163d1296272ac7d2ddc2cd5f9fbrtoy@google.com// Guarding implementation by the processor name
414d09f5abfba45163d1296272ac7d2ddc2cd5f9fbrtoy@google.com
424d09f5abfba45163d1296272ac7d2ddc2cd5f9fbrtoy@google.com//Input Registers
434d09f5abfba45163d1296272ac7d2ddc2cd5f9fbrtoy@google.com
444d09f5abfba45163d1296272ac7d2ddc2cd5f9fbrtoy@google.com#define pSrc            x0
454d09f5abfba45163d1296272ac7d2ddc2cd5f9fbrtoy@google.com#define pDst            x1
464d09f5abfba45163d1296272ac7d2ddc2cd5f9fbrtoy@google.com#define pTwiddle        x2
474d09f5abfba45163d1296272ac7d2ddc2cd5f9fbrtoy@google.com#define	pSubFFTNum	x3
484d09f5abfba45163d1296272ac7d2ddc2cd5f9fbrtoy@google.com#define pSubFFTSize	x4
494d09f5abfba45163d1296272ac7d2ddc2cd5f9fbrtoy@google.com
504d09f5abfba45163d1296272ac7d2ddc2cd5f9fbrtoy@google.com
514d09f5abfba45163d1296272ac7d2ddc2cd5f9fbrtoy@google.com//Output Registers
524d09f5abfba45163d1296272ac7d2ddc2cd5f9fbrtoy@google.com
534d09f5abfba45163d1296272ac7d2ddc2cd5f9fbrtoy@google.com
544d09f5abfba45163d1296272ac7d2ddc2cd5f9fbrtoy@google.com//Local Scratch Registers
554d09f5abfba45163d1296272ac7d2ddc2cd5f9fbrtoy@google.com
564d09f5abfba45163d1296272ac7d2ddc2cd5f9fbrtoy@google.com#define subFFTNum       x5
574d09f5abfba45163d1296272ac7d2ddc2cd5f9fbrtoy@google.com#define subFFTSize      x6
584d09f5abfba45163d1296272ac7d2ddc2cd5f9fbrtoy@google.com#define grpSize         x7
594d09f5abfba45163d1296272ac7d2ddc2cd5f9fbrtoy@google.com// Reuse grpSize as setCount
604d09f5abfba45163d1296272ac7d2ddc2cd5f9fbrtoy@google.com#define setCount        x7
614d09f5abfba45163d1296272ac7d2ddc2cd5f9fbrtoy@google.com#define pointStep       x8
624d09f5abfba45163d1296272ac7d2ddc2cd5f9fbrtoy@google.com#define outPointStep    x8
634d09f5abfba45163d1296272ac7d2ddc2cd5f9fbrtoy@google.com#define setStep         x9
644d09f5abfba45163d1296272ac7d2ddc2cd5f9fbrtoy@google.com#define step1           x10
654d09f5abfba45163d1296272ac7d2ddc2cd5f9fbrtoy@google.com#define step2           x11
664d09f5abfba45163d1296272ac7d2ddc2cd5f9fbrtoy@google.com#define t0              w12
674d09f5abfba45163d1296272ac7d2ddc2cd5f9fbrtoy@google.com
684d09f5abfba45163d1296272ac7d2ddc2cd5f9fbrtoy@google.com
694d09f5abfba45163d1296272ac7d2ddc2cd5f9fbrtoy@google.com// Neon Registers
704d09f5abfba45163d1296272ac7d2ddc2cd5f9fbrtoy@google.com
714d09f5abfba45163d1296272ac7d2ddc2cd5f9fbrtoy@google.com#define dXr0    v0.2s
724d09f5abfba45163d1296272ac7d2ddc2cd5f9fbrtoy@google.com#define dXi0    v1.2s
734d09f5abfba45163d1296272ac7d2ddc2cd5f9fbrtoy@google.com#define dXr1    v2.2s
744d09f5abfba45163d1296272ac7d2ddc2cd5f9fbrtoy@google.com#define dXi1    v3.2s
754d09f5abfba45163d1296272ac7d2ddc2cd5f9fbrtoy@google.com#define dXr2    v4.2s
764d09f5abfba45163d1296272ac7d2ddc2cd5f9fbrtoy@google.com#define dXi2    v5.2s
774d09f5abfba45163d1296272ac7d2ddc2cd5f9fbrtoy@google.com#define dXr3    v6.2s
784d09f5abfba45163d1296272ac7d2ddc2cd5f9fbrtoy@google.com#define dXi3    v7.2s
794d09f5abfba45163d1296272ac7d2ddc2cd5f9fbrtoy@google.com#define dXr4    v8.2s
804d09f5abfba45163d1296272ac7d2ddc2cd5f9fbrtoy@google.com#define dXi4    v9.2s
814d09f5abfba45163d1296272ac7d2ddc2cd5f9fbrtoy@google.com#define dXr5    v10.2s
824d09f5abfba45163d1296272ac7d2ddc2cd5f9fbrtoy@google.com#define dXi5    v11.2s
834d09f5abfba45163d1296272ac7d2ddc2cd5f9fbrtoy@google.com#define dXr6    v12.2s
844d09f5abfba45163d1296272ac7d2ddc2cd5f9fbrtoy@google.com#define dXi6    v13.2s
854d09f5abfba45163d1296272ac7d2ddc2cd5f9fbrtoy@google.com#define dXr7    v14.2s
864d09f5abfba45163d1296272ac7d2ddc2cd5f9fbrtoy@google.com#define dXi7    v15.2s
874d09f5abfba45163d1296272ac7d2ddc2cd5f9fbrtoy@google.com#define qX0     v0.4s
884d09f5abfba45163d1296272ac7d2ddc2cd5f9fbrtoy@google.com#define qX1     v1.4s
894d09f5abfba45163d1296272ac7d2ddc2cd5f9fbrtoy@google.com#define qX2     v2.4s
904d09f5abfba45163d1296272ac7d2ddc2cd5f9fbrtoy@google.com#define qX3     v3.4s
914d09f5abfba45163d1296272ac7d2ddc2cd5f9fbrtoy@google.com#define qX4     v4.4s
924d09f5abfba45163d1296272ac7d2ddc2cd5f9fbrtoy@google.com#define qX5     v5.4s
934d09f5abfba45163d1296272ac7d2ddc2cd5f9fbrtoy@google.com#define qX6     v6.4s
944d09f5abfba45163d1296272ac7d2ddc2cd5f9fbrtoy@google.com#define qX7     v7.4s
954d09f5abfba45163d1296272ac7d2ddc2cd5f9fbrtoy@google.com
964d09f5abfba45163d1296272ac7d2ddc2cd5f9fbrtoy@google.com#define dUr0    v16.2s
974d09f5abfba45163d1296272ac7d2ddc2cd5f9fbrtoy@google.com#define dUi0    v17.2s
984d09f5abfba45163d1296272ac7d2ddc2cd5f9fbrtoy@google.com#define dUr2    v18.2s
994d09f5abfba45163d1296272ac7d2ddc2cd5f9fbrtoy@google.com#define dUi2    v19.2s
1004d09f5abfba45163d1296272ac7d2ddc2cd5f9fbrtoy@google.com#define dUr4    v20.2s
1014d09f5abfba45163d1296272ac7d2ddc2cd5f9fbrtoy@google.com#define dUi4    v21.2s
1024d09f5abfba45163d1296272ac7d2ddc2cd5f9fbrtoy@google.com#define dUr6    v22.2s
1034d09f5abfba45163d1296272ac7d2ddc2cd5f9fbrtoy@google.com#define dUi6    v23.2s
1044d09f5abfba45163d1296272ac7d2ddc2cd5f9fbrtoy@google.com#define dUr1    v24.2s
1054d09f5abfba45163d1296272ac7d2ddc2cd5f9fbrtoy@google.com#define dUi1    v25.2s
1064d09f5abfba45163d1296272ac7d2ddc2cd5f9fbrtoy@google.com#define dUr3    v26.2s
1074d09f5abfba45163d1296272ac7d2ddc2cd5f9fbrtoy@google.com#define dUi3    v27.2s
1084d09f5abfba45163d1296272ac7d2ddc2cd5f9fbrtoy@google.com#define dUr5    v28.2s
1094d09f5abfba45163d1296272ac7d2ddc2cd5f9fbrtoy@google.com#define dUi5    v29.2s
1104d09f5abfba45163d1296272ac7d2ddc2cd5f9fbrtoy@google.com// reuse dXr7 and dXi7
1114d09f5abfba45163d1296272ac7d2ddc2cd5f9fbrtoy@google.com#define dUr7    v30.2s
1124d09f5abfba45163d1296272ac7d2ddc2cd5f9fbrtoy@google.com#define dUi7    v31.2s
1134d09f5abfba45163d1296272ac7d2ddc2cd5f9fbrtoy@google.com#define qU0     v8.4s
1144d09f5abfba45163d1296272ac7d2ddc2cd5f9fbrtoy@google.com#define qU1     v12.4s
1154d09f5abfba45163d1296272ac7d2ddc2cd5f9fbrtoy@google.com#define qU2     v9.4s
1164d09f5abfba45163d1296272ac7d2ddc2cd5f9fbrtoy@google.com#define qU3     v13.4s
1174d09f5abfba45163d1296272ac7d2ddc2cd5f9fbrtoy@google.com#define qU4     v10.4s
1184d09f5abfba45163d1296272ac7d2ddc2cd5f9fbrtoy@google.com#define qU5     v14.4s
1194d09f5abfba45163d1296272ac7d2ddc2cd5f9fbrtoy@google.com#define qU6     v11.4s
1204d09f5abfba45163d1296272ac7d2ddc2cd5f9fbrtoy@google.com#define qU7     v15.4s
1214d09f5abfba45163d1296272ac7d2ddc2cd5f9fbrtoy@google.com
1224d09f5abfba45163d1296272ac7d2ddc2cd5f9fbrtoy@google.com
1234d09f5abfba45163d1296272ac7d2ddc2cd5f9fbrtoy@google.com#define dVr0    v24.2s
1244d09f5abfba45163d1296272ac7d2ddc2cd5f9fbrtoy@google.com#define dVi0    v25.2s
1254d09f5abfba45163d1296272ac7d2ddc2cd5f9fbrtoy@google.com#define dVr2    v26.2s
1264d09f5abfba45163d1296272ac7d2ddc2cd5f9fbrtoy@google.com#define dVi2    v27.2s
1274d09f5abfba45163d1296272ac7d2ddc2cd5f9fbrtoy@google.com#define dVr4    v28.2s
1284d09f5abfba45163d1296272ac7d2ddc2cd5f9fbrtoy@google.com#define dVi4    v29.2s
1294d09f5abfba45163d1296272ac7d2ddc2cd5f9fbrtoy@google.com#define dVr6    v30.2s
1304d09f5abfba45163d1296272ac7d2ddc2cd5f9fbrtoy@google.com#define dVi6    v31.2s
1314d09f5abfba45163d1296272ac7d2ddc2cd5f9fbrtoy@google.com#define dVr1    v16.2s
1324d09f5abfba45163d1296272ac7d2ddc2cd5f9fbrtoy@google.com#define dVi1    v17.2s
1334d09f5abfba45163d1296272ac7d2ddc2cd5f9fbrtoy@google.com#define dVr3    v18.2s
1344d09f5abfba45163d1296272ac7d2ddc2cd5f9fbrtoy@google.com#define dVi3    v19.2s
1354d09f5abfba45163d1296272ac7d2ddc2cd5f9fbrtoy@google.com#define dVr5    v20.2s
1364d09f5abfba45163d1296272ac7d2ddc2cd5f9fbrtoy@google.com#define dVi5    v21.2s
1374d09f5abfba45163d1296272ac7d2ddc2cd5f9fbrtoy@google.com#define dVr7    v22.2s
1384d09f5abfba45163d1296272ac7d2ddc2cd5f9fbrtoy@google.com#define dVi7    v23.2s
1394d09f5abfba45163d1296272ac7d2ddc2cd5f9fbrtoy@google.com#define qV0     v12.4s
1404d09f5abfba45163d1296272ac7d2ddc2cd5f9fbrtoy@google.com#define qV1     v8.4s
1414d09f5abfba45163d1296272ac7d2ddc2cd5f9fbrtoy@google.com#define qV2     v13.4s
1424d09f5abfba45163d1296272ac7d2ddc2cd5f9fbrtoy@google.com#define qV3     v9.4s
1434d09f5abfba45163d1296272ac7d2ddc2cd5f9fbrtoy@google.com#define qV4     v14.4s
1444d09f5abfba45163d1296272ac7d2ddc2cd5f9fbrtoy@google.com#define qV5     v10.4s
1454d09f5abfba45163d1296272ac7d2ddc2cd5f9fbrtoy@google.com#define qV6     v15.4s
1464d09f5abfba45163d1296272ac7d2ddc2cd5f9fbrtoy@google.com#define qV7     v11.4s
1474d09f5abfba45163d1296272ac7d2ddc2cd5f9fbrtoy@google.com
1484d09f5abfba45163d1296272ac7d2ddc2cd5f9fbrtoy@google.com#define dYr0    v16.2s
1494d09f5abfba45163d1296272ac7d2ddc2cd5f9fbrtoy@google.com#define dYi0    v17.2s
1504d09f5abfba45163d1296272ac7d2ddc2cd5f9fbrtoy@google.com#define dYr2    v18.2s
1514d09f5abfba45163d1296272ac7d2ddc2cd5f9fbrtoy@google.com#define dYi2    v19.2s
1524d09f5abfba45163d1296272ac7d2ddc2cd5f9fbrtoy@google.com#define dYr4    v20.2s
1534d09f5abfba45163d1296272ac7d2ddc2cd5f9fbrtoy@google.com#define dYi4    v21.2s
1544d09f5abfba45163d1296272ac7d2ddc2cd5f9fbrtoy@google.com#define dYr6    v22.2s
1554d09f5abfba45163d1296272ac7d2ddc2cd5f9fbrtoy@google.com#define dYi6    v23.2s
1564d09f5abfba45163d1296272ac7d2ddc2cd5f9fbrtoy@google.com#define dYr1    v24.2s
1574d09f5abfba45163d1296272ac7d2ddc2cd5f9fbrtoy@google.com#define dYi1    v25.2s
1584d09f5abfba45163d1296272ac7d2ddc2cd5f9fbrtoy@google.com#define dYr3    v26.2s
1594d09f5abfba45163d1296272ac7d2ddc2cd5f9fbrtoy@google.com#define dYi3    v27.2s
1604d09f5abfba45163d1296272ac7d2ddc2cd5f9fbrtoy@google.com#define dYr5    v28.2s
1614d09f5abfba45163d1296272ac7d2ddc2cd5f9fbrtoy@google.com#define dYi5    v29.2s
1624d09f5abfba45163d1296272ac7d2ddc2cd5f9fbrtoy@google.com#define dYr7    v30.2s
1634d09f5abfba45163d1296272ac7d2ddc2cd5f9fbrtoy@google.com#define dYi7    v31.2s
1644d09f5abfba45163d1296272ac7d2ddc2cd5f9fbrtoy@google.com#define qY0     v8.4s
1654d09f5abfba45163d1296272ac7d2ddc2cd5f9fbrtoy@google.com#define qY1     v12.4s
1664d09f5abfba45163d1296272ac7d2ddc2cd5f9fbrtoy@google.com#define qY2     v9.4s
1674d09f5abfba45163d1296272ac7d2ddc2cd5f9fbrtoy@google.com#define qY3     v13.4s
1684d09f5abfba45163d1296272ac7d2ddc2cd5f9fbrtoy@google.com#define qY4     v10.4s
1694d09f5abfba45163d1296272ac7d2ddc2cd5f9fbrtoy@google.com#define qY5     v14.4s
1704d09f5abfba45163d1296272ac7d2ddc2cd5f9fbrtoy@google.com#define qY6     v11.4s
1714d09f5abfba45163d1296272ac7d2ddc2cd5f9fbrtoy@google.com#define qY7     v15.4s
1724d09f5abfba45163d1296272ac7d2ddc2cd5f9fbrtoy@google.com
1734d09f5abfba45163d1296272ac7d2ddc2cd5f9fbrtoy@google.com#define dT0     v14.2s
1744d09f5abfba45163d1296272ac7d2ddc2cd5f9fbrtoy@google.com#define dT0s    v14.s
1754d09f5abfba45163d1296272ac7d2ddc2cd5f9fbrtoy@google.com#define dT1     v15.2s
1764d09f5abfba45163d1296272ac7d2ddc2cd5f9fbrtoy@google.com
1774d09f5abfba45163d1296272ac7d2ddc2cd5f9fbrtoy@google.com        .MACRO FFTSTAGE scaled, inverse, name
1784d09f5abfba45163d1296272ac7d2ddc2cd5f9fbrtoy@google.com
1794d09f5abfba45163d1296272ac7d2ddc2cd5f9fbrtoy@google.com        // Define stack arguments
1804d09f5abfba45163d1296272ac7d2ddc2cd5f9fbrtoy@google.com
1814d09f5abfba45163d1296272ac7d2ddc2cd5f9fbrtoy@google.com        // Move args values into our work registers
1824d09f5abfba45163d1296272ac7d2ddc2cd5f9fbrtoy@google.com        ldr     subFFTNum, [pSubFFTNum]
1834d09f5abfba45163d1296272ac7d2ddc2cd5f9fbrtoy@google.com        ldr     subFFTSize, [pSubFFTSize]
1844d09f5abfba45163d1296272ac7d2ddc2cd5f9fbrtoy@google.com
1854d09f5abfba45163d1296272ac7d2ddc2cd5f9fbrtoy@google.com        // Update pSubFFTSize and pSubFFTNum regs
1864d09f5abfba45163d1296272ac7d2ddc2cd5f9fbrtoy@google.com        // subFFTSize = 1 for the first stage
1874d09f5abfba45163d1296272ac7d2ddc2cd5f9fbrtoy@google.com
1884d09f5abfba45163d1296272ac7d2ddc2cd5f9fbrtoy@google.com        movz    t0, 0x3f35, lsl #16               // High half word of sqrt(1/2).
1894d09f5abfba45163d1296272ac7d2ddc2cd5f9fbrtoy@google.com        movk    t0, 0x04f3                        // Low half word of sqrt(1/2).
1904d09f5abfba45163d1296272ac7d2ddc2cd5f9fbrtoy@google.com        MOV     subFFTSize,#8
1914d09f5abfba45163d1296272ac7d2ddc2cd5f9fbrtoy@google.com
1924d09f5abfba45163d1296272ac7d2ddc2cd5f9fbrtoy@google.com        // Note: setCount = subFFTNum/8 (reuse the grpSize reg for setCount)
1934d09f5abfba45163d1296272ac7d2ddc2cd5f9fbrtoy@google.com        LSR     grpSize,subFFTNum,#3
1944d09f5abfba45163d1296272ac7d2ddc2cd5f9fbrtoy@google.com        MOV     subFFTNum,grpSize
1954d09f5abfba45163d1296272ac7d2ddc2cd5f9fbrtoy@google.com
1964d09f5abfba45163d1296272ac7d2ddc2cd5f9fbrtoy@google.com
1974d09f5abfba45163d1296272ac7d2ddc2cd5f9fbrtoy@google.com        // pT0+1 increments pT0 by 8 bytes
1984d09f5abfba45163d1296272ac7d2ddc2cd5f9fbrtoy@google.com        // pT0+pointStep = increment of 8*pointStep bytes = grpSize bytes
1994d09f5abfba45163d1296272ac7d2ddc2cd5f9fbrtoy@google.com        // Note: outPointStep = pointStep for firststage
2004d09f5abfba45163d1296272ac7d2ddc2cd5f9fbrtoy@google.com
2014d09f5abfba45163d1296272ac7d2ddc2cd5f9fbrtoy@google.com        lsl     pointStep,grpSize, #3
2024d09f5abfba45163d1296272ac7d2ddc2cd5f9fbrtoy@google.com
2034d09f5abfba45163d1296272ac7d2ddc2cd5f9fbrtoy@google.com
2044d09f5abfba45163d1296272ac7d2ddc2cd5f9fbrtoy@google.com        // Calculate the step of input data for the next set
2054d09f5abfba45163d1296272ac7d2ddc2cd5f9fbrtoy@google.com        //MOV     step1,pointStep,LSL #1             // step1 = 2*pointStep
2064d09f5abfba45163d1296272ac7d2ddc2cd5f9fbrtoy@google.com        ld2     {dXr0,dXi0},[pSrc],pointStep         //  data[0]
2074d09f5abfba45163d1296272ac7d2ddc2cd5f9fbrtoy@google.com        lsl     step1,grpSize, #4
2084d09f5abfba45163d1296272ac7d2ddc2cd5f9fbrtoy@google.com        lsl     step2,pointStep, #3
2094d09f5abfba45163d1296272ac7d2ddc2cd5f9fbrtoy@google.com
2104d09f5abfba45163d1296272ac7d2ddc2cd5f9fbrtoy@google.com        ld2     {dXr1,dXi1},[pSrc],pointStep         //  data[1]
2114d09f5abfba45163d1296272ac7d2ddc2cd5f9fbrtoy@google.com        SUB     step2,step2,pointStep                // step2 = 7*pointStep
2124d09f5abfba45163d1296272ac7d2ddc2cd5f9fbrtoy@google.com        // setStep = - 7*pointStep+16
2134d09f5abfba45163d1296272ac7d2ddc2cd5f9fbrtoy@google.com        rsb     setStep,step2,#16
2144d09f5abfba45163d1296272ac7d2ddc2cd5f9fbrtoy@google.com
2154d09f5abfba45163d1296272ac7d2ddc2cd5f9fbrtoy@google.com        ld2     {dXr2,dXi2},[pSrc],pointStep         //  data[2]
2164d09f5abfba45163d1296272ac7d2ddc2cd5f9fbrtoy@google.com        ld2     {dXr3,dXi3},[pSrc],pointStep         //  data[3]
2174d09f5abfba45163d1296272ac7d2ddc2cd5f9fbrtoy@google.com        ld2     {dXr4,dXi4},[pSrc],pointStep         //  data[4]
2184d09f5abfba45163d1296272ac7d2ddc2cd5f9fbrtoy@google.com        ld2     {dXr5,dXi5},[pSrc],pointStep         //  data[5]
2194d09f5abfba45163d1296272ac7d2ddc2cd5f9fbrtoy@google.com        ld2     {dXr6,dXi6},[pSrc],pointStep         //  data[6]
2204d09f5abfba45163d1296272ac7d2ddc2cd5f9fbrtoy@google.com        //  data[7] & update pSrc for the next set
2214d09f5abfba45163d1296272ac7d2ddc2cd5f9fbrtoy@google.com        //  setStep = -7*pointStep + 16
2224d09f5abfba45163d1296272ac7d2ddc2cd5f9fbrtoy@google.com        ld2     {dXr7,dXi7},[pSrc],setStep
2234d09f5abfba45163d1296272ac7d2ddc2cd5f9fbrtoy@google.com        // grp = 0 a special case since all the twiddle factors are 1
2244d09f5abfba45163d1296272ac7d2ddc2cd5f9fbrtoy@google.com        // Loop on the sets
2254d09f5abfba45163d1296272ac7d2ddc2cd5f9fbrtoy@google.com
2264d09f5abfba45163d1296272ac7d2ddc2cd5f9fbrtoy@google.comradix8fsGrpZeroSetLoop\name :
2274d09f5abfba45163d1296272ac7d2ddc2cd5f9fbrtoy@google.com
2284d09f5abfba45163d1296272ac7d2ddc2cd5f9fbrtoy@google.com        // Decrement setcount
2294d09f5abfba45163d1296272ac7d2ddc2cd5f9fbrtoy@google.com        SUBS    setCount,setCount,#2
2304d09f5abfba45163d1296272ac7d2ddc2cd5f9fbrtoy@google.com
2314d09f5abfba45163d1296272ac7d2ddc2cd5f9fbrtoy@google.com
2324d09f5abfba45163d1296272ac7d2ddc2cd5f9fbrtoy@google.com        // finish first stage of 8 point FFT
2334d09f5abfba45163d1296272ac7d2ddc2cd5f9fbrtoy@google.com
2344d09f5abfba45163d1296272ac7d2ddc2cd5f9fbrtoy@google.com        // fadd    qU0,qX0,qX4
2354d09f5abfba45163d1296272ac7d2ddc2cd5f9fbrtoy@google.com        // fadd    qU2,qX1,qX5
2364d09f5abfba45163d1296272ac7d2ddc2cd5f9fbrtoy@google.com        // fadd    qU4,qX2,qX6
2374d09f5abfba45163d1296272ac7d2ddc2cd5f9fbrtoy@google.com        // fadd    qU6,qX3,qX7
2384d09f5abfba45163d1296272ac7d2ddc2cd5f9fbrtoy@google.com        fadd    dUr0,dXr0,dXr4
2394d09f5abfba45163d1296272ac7d2ddc2cd5f9fbrtoy@google.com        fadd    dUr2,dXr1,dXr5
2404d09f5abfba45163d1296272ac7d2ddc2cd5f9fbrtoy@google.com        fadd    dUr4,dXr2,dXr6
2414d09f5abfba45163d1296272ac7d2ddc2cd5f9fbrtoy@google.com        fadd    dUr6,dXr3,dXr7
2424d09f5abfba45163d1296272ac7d2ddc2cd5f9fbrtoy@google.com        fadd    dUi0,dXi0,dXi4
2434d09f5abfba45163d1296272ac7d2ddc2cd5f9fbrtoy@google.com        fadd    dUi2,dXi1,dXi5
2444d09f5abfba45163d1296272ac7d2ddc2cd5f9fbrtoy@google.com        fadd    dUi4,dXi2,dXi6
2454d09f5abfba45163d1296272ac7d2ddc2cd5f9fbrtoy@google.com        fadd    dUi6,dXi3,dXi7
2464d09f5abfba45163d1296272ac7d2ddc2cd5f9fbrtoy@google.com
2474d09f5abfba45163d1296272ac7d2ddc2cd5f9fbrtoy@google.com        // finish second stage of 8 point FFT
2484d09f5abfba45163d1296272ac7d2ddc2cd5f9fbrtoy@google.com
2494d09f5abfba45163d1296272ac7d2ddc2cd5f9fbrtoy@google.com        // fadd    qV0,qU0,qU4
2504d09f5abfba45163d1296272ac7d2ddc2cd5f9fbrtoy@google.com        // fsub    qV2,qU0,qU4
2514d09f5abfba45163d1296272ac7d2ddc2cd5f9fbrtoy@google.com        // fadd    qV4,qU2,qU6
2524d09f5abfba45163d1296272ac7d2ddc2cd5f9fbrtoy@google.com        // fsub    qV6,qU2,qU6
2534d09f5abfba45163d1296272ac7d2ddc2cd5f9fbrtoy@google.com        fadd    dVr0,dUr0,dUr4
2544d09f5abfba45163d1296272ac7d2ddc2cd5f9fbrtoy@google.com        fsub    dVr2,dUr0,dUr4
2554d09f5abfba45163d1296272ac7d2ddc2cd5f9fbrtoy@google.com        fadd    dVr4,dUr2,dUr6
2564d09f5abfba45163d1296272ac7d2ddc2cd5f9fbrtoy@google.com        fsub    dVr6,dUr2,dUr6
2574d09f5abfba45163d1296272ac7d2ddc2cd5f9fbrtoy@google.com        fadd    dVi0,dUi0,dUi4
2584d09f5abfba45163d1296272ac7d2ddc2cd5f9fbrtoy@google.com        fsub    dVi2,dUi0,dUi4
2594d09f5abfba45163d1296272ac7d2ddc2cd5f9fbrtoy@google.com        fadd    dVi4,dUi2,dUi6
2604d09f5abfba45163d1296272ac7d2ddc2cd5f9fbrtoy@google.com        fsub    dVi6,dUi2,dUi6
2614d09f5abfba45163d1296272ac7d2ddc2cd5f9fbrtoy@google.com
2624d09f5abfba45163d1296272ac7d2ddc2cd5f9fbrtoy@google.com        // finish third stage of 8 point FFT
2634d09f5abfba45163d1296272ac7d2ddc2cd5f9fbrtoy@google.com
2644d09f5abfba45163d1296272ac7d2ddc2cd5f9fbrtoy@google.com        // fadd    qY0,qV0,qV4
2654d09f5abfba45163d1296272ac7d2ddc2cd5f9fbrtoy@google.com        // fsub    qY4,qV0,qV4
2664d09f5abfba45163d1296272ac7d2ddc2cd5f9fbrtoy@google.com        fadd    dYr0,dVr0,dVr4
2674d09f5abfba45163d1296272ac7d2ddc2cd5f9fbrtoy@google.com        fsub    dYr4,dVr0,dVr4
2684d09f5abfba45163d1296272ac7d2ddc2cd5f9fbrtoy@google.com        fadd    dYi0,dVi0,dVi4
2694d09f5abfba45163d1296272ac7d2ddc2cd5f9fbrtoy@google.com        fsub    dYi4,dVi0,dVi4
2704d09f5abfba45163d1296272ac7d2ddc2cd5f9fbrtoy@google.com
2714d09f5abfba45163d1296272ac7d2ddc2cd5f9fbrtoy@google.com        st2     {dYr0,dYi0},[pDst],step1         // store y0
2724d09f5abfba45163d1296272ac7d2ddc2cd5f9fbrtoy@google.com
2734d09f5abfba45163d1296272ac7d2ddc2cd5f9fbrtoy@google.com        .ifeqs  "\inverse", "TRUE"
2744d09f5abfba45163d1296272ac7d2ddc2cd5f9fbrtoy@google.com
2754d09f5abfba45163d1296272ac7d2ddc2cd5f9fbrtoy@google.com            fsub    dYr2,dVr2,dVi6
2764d09f5abfba45163d1296272ac7d2ddc2cd5f9fbrtoy@google.com            fadd    dYi2,dVi2,dVr6
2774d09f5abfba45163d1296272ac7d2ddc2cd5f9fbrtoy@google.com
2784d09f5abfba45163d1296272ac7d2ddc2cd5f9fbrtoy@google.com            fadd    dYr6,dVr2,dVi6
2794d09f5abfba45163d1296272ac7d2ddc2cd5f9fbrtoy@google.com            st2     {dYr2,dYi2},[pDst],step1     // store y2
2804d09f5abfba45163d1296272ac7d2ddc2cd5f9fbrtoy@google.com            fsub    dYi6,dVi2,dVr6
2814d09f5abfba45163d1296272ac7d2ddc2cd5f9fbrtoy@google.com
2824d09f5abfba45163d1296272ac7d2ddc2cd5f9fbrtoy@google.com            // fsub    qU1,qX0,qX4
2834d09f5abfba45163d1296272ac7d2ddc2cd5f9fbrtoy@google.com            fsub    dUr1,dXr0,dXr4
2844d09f5abfba45163d1296272ac7d2ddc2cd5f9fbrtoy@google.com            fsub    dUi1,dXi0,dXi4
2854d09f5abfba45163d1296272ac7d2ddc2cd5f9fbrtoy@google.com
2864d09f5abfba45163d1296272ac7d2ddc2cd5f9fbrtoy@google.com            st2     {dYr4,dYi4},[pDst],step1     // store y4
2874d09f5abfba45163d1296272ac7d2ddc2cd5f9fbrtoy@google.com
2884d09f5abfba45163d1296272ac7d2ddc2cd5f9fbrtoy@google.com            // fsub    qU3,qX1,qX5
2894d09f5abfba45163d1296272ac7d2ddc2cd5f9fbrtoy@google.com            // fsub    qU5,qX2,qX6
2904d09f5abfba45163d1296272ac7d2ddc2cd5f9fbrtoy@google.com            fsub    dUr3,dXr1,dXr5
2914d09f5abfba45163d1296272ac7d2ddc2cd5f9fbrtoy@google.com            fsub    dUr5,dXr2,dXr6
2924d09f5abfba45163d1296272ac7d2ddc2cd5f9fbrtoy@google.com            fsub    dUi3,dXi1,dXi5
2934d09f5abfba45163d1296272ac7d2ddc2cd5f9fbrtoy@google.com            fsub    dUi5,dXi2,dXi6
2944d09f5abfba45163d1296272ac7d2ddc2cd5f9fbrtoy@google.com
2954d09f5abfba45163d1296272ac7d2ddc2cd5f9fbrtoy@google.com            st2     {dYr6,dYi6},[pDst],step1     // store y6
2964d09f5abfba45163d1296272ac7d2ddc2cd5f9fbrtoy@google.com
2974d09f5abfba45163d1296272ac7d2ddc2cd5f9fbrtoy@google.com        .ELSE
2984d09f5abfba45163d1296272ac7d2ddc2cd5f9fbrtoy@google.com
2994d09f5abfba45163d1296272ac7d2ddc2cd5f9fbrtoy@google.com            fadd    dYr6,dVr2,dVi6
3004d09f5abfba45163d1296272ac7d2ddc2cd5f9fbrtoy@google.com            fsub    dYi6,dVi2,dVr6
3014d09f5abfba45163d1296272ac7d2ddc2cd5f9fbrtoy@google.com
3024d09f5abfba45163d1296272ac7d2ddc2cd5f9fbrtoy@google.com            fsub    dYr2,dVr2,dVi6
3034d09f5abfba45163d1296272ac7d2ddc2cd5f9fbrtoy@google.com            st2     {dYr6,dYi6},[pDst],step1     // store y2
3044d09f5abfba45163d1296272ac7d2ddc2cd5f9fbrtoy@google.com            fadd    dYi2,dVi2,dVr6
3054d09f5abfba45163d1296272ac7d2ddc2cd5f9fbrtoy@google.com
3064d09f5abfba45163d1296272ac7d2ddc2cd5f9fbrtoy@google.com
3074d09f5abfba45163d1296272ac7d2ddc2cd5f9fbrtoy@google.com            // fsub    qU1,qX0,qX4
3084d09f5abfba45163d1296272ac7d2ddc2cd5f9fbrtoy@google.com            fsub    dUr1,dXr0,dXr4
3094d09f5abfba45163d1296272ac7d2ddc2cd5f9fbrtoy@google.com            fsub    dUi1,dXi0,dXi4
3104d09f5abfba45163d1296272ac7d2ddc2cd5f9fbrtoy@google.com
3114d09f5abfba45163d1296272ac7d2ddc2cd5f9fbrtoy@google.com            st2     {dYr4,dYi4},[pDst],step1     // store y4
3124d09f5abfba45163d1296272ac7d2ddc2cd5f9fbrtoy@google.com
3134d09f5abfba45163d1296272ac7d2ddc2cd5f9fbrtoy@google.com            // fsub    qU3,qX1,qX5
3144d09f5abfba45163d1296272ac7d2ddc2cd5f9fbrtoy@google.com            // fsub    qU5,qX2,qX6
3154d09f5abfba45163d1296272ac7d2ddc2cd5f9fbrtoy@google.com            fsub    dUr3,dXr1,dXr5
3164d09f5abfba45163d1296272ac7d2ddc2cd5f9fbrtoy@google.com            fsub    dUr5,dXr2,dXr6
3174d09f5abfba45163d1296272ac7d2ddc2cd5f9fbrtoy@google.com            fsub    dUi3,dXi1,dXi5
3184d09f5abfba45163d1296272ac7d2ddc2cd5f9fbrtoy@google.com            fsub    dUi5,dXi2,dXi6
3194d09f5abfba45163d1296272ac7d2ddc2cd5f9fbrtoy@google.com
3204d09f5abfba45163d1296272ac7d2ddc2cd5f9fbrtoy@google.com            st2     {dYr2,dYi2},[pDst],step1     // store y6
3214d09f5abfba45163d1296272ac7d2ddc2cd5f9fbrtoy@google.com
3224d09f5abfba45163d1296272ac7d2ddc2cd5f9fbrtoy@google.com
3234d09f5abfba45163d1296272ac7d2ddc2cd5f9fbrtoy@google.com        .ENDIF
3244d09f5abfba45163d1296272ac7d2ddc2cd5f9fbrtoy@google.com
3254d09f5abfba45163d1296272ac7d2ddc2cd5f9fbrtoy@google.com        // finish first stage of 8 point FFT
3264d09f5abfba45163d1296272ac7d2ddc2cd5f9fbrtoy@google.com
3274d09f5abfba45163d1296272ac7d2ddc2cd5f9fbrtoy@google.com        // fsub    qU7,qX3,qX7
3284d09f5abfba45163d1296272ac7d2ddc2cd5f9fbrtoy@google.com        fsub    dUr7,dXr3,dXr7
3294d09f5abfba45163d1296272ac7d2ddc2cd5f9fbrtoy@google.com        fsub    dUi7,dXi3,dXi7
3304d09f5abfba45163d1296272ac7d2ddc2cd5f9fbrtoy@google.com
3314d09f5abfba45163d1296272ac7d2ddc2cd5f9fbrtoy@google.com        mov     dT0s[0], t0
3324d09f5abfba45163d1296272ac7d2ddc2cd5f9fbrtoy@google.com
3334d09f5abfba45163d1296272ac7d2ddc2cd5f9fbrtoy@google.com        // finish second stage of 8 point FFT
3344d09f5abfba45163d1296272ac7d2ddc2cd5f9fbrtoy@google.com
3354d09f5abfba45163d1296272ac7d2ddc2cd5f9fbrtoy@google.com        fsub    dVr1,dUr1,dUi5
3364d09f5abfba45163d1296272ac7d2ddc2cd5f9fbrtoy@google.com        //  data[0] for next iteration
3374d09f5abfba45163d1296272ac7d2ddc2cd5f9fbrtoy@google.com        ld2     {dXr0,dXi0},[pSrc],pointStep
3384d09f5abfba45163d1296272ac7d2ddc2cd5f9fbrtoy@google.com        fadd    dVi1,dUi1,dUr5
3394d09f5abfba45163d1296272ac7d2ddc2cd5f9fbrtoy@google.com        fadd    dVr3,dUr1,dUi5
3404d09f5abfba45163d1296272ac7d2ddc2cd5f9fbrtoy@google.com        ld2     {dXr1,dXi1},[pSrc],pointStep     //  data[1]
3414d09f5abfba45163d1296272ac7d2ddc2cd5f9fbrtoy@google.com        fsub    dVi3,dUi1,dUr5
3424d09f5abfba45163d1296272ac7d2ddc2cd5f9fbrtoy@google.com
3434d09f5abfba45163d1296272ac7d2ddc2cd5f9fbrtoy@google.com        fsub    dVr5,dUr3,dUi7
3444d09f5abfba45163d1296272ac7d2ddc2cd5f9fbrtoy@google.com        ld2     {dXr2,dXi2},[pSrc],pointStep     //  data[2]
3454d09f5abfba45163d1296272ac7d2ddc2cd5f9fbrtoy@google.com        fadd    dVi5,dUi3,dUr7
3464d09f5abfba45163d1296272ac7d2ddc2cd5f9fbrtoy@google.com        fadd    dVr7,dUr3,dUi7
3474d09f5abfba45163d1296272ac7d2ddc2cd5f9fbrtoy@google.com        ld2     {dXr3,dXi3},[pSrc],pointStep     //  data[3]
3484d09f5abfba45163d1296272ac7d2ddc2cd5f9fbrtoy@google.com        fsub    dVi7,dUi3,dUr7
3494d09f5abfba45163d1296272ac7d2ddc2cd5f9fbrtoy@google.com
3504d09f5abfba45163d1296272ac7d2ddc2cd5f9fbrtoy@google.com        // finish third stage of 8 point FFT
3514d09f5abfba45163d1296272ac7d2ddc2cd5f9fbrtoy@google.com
3524d09f5abfba45163d1296272ac7d2ddc2cd5f9fbrtoy@google.com        .ifeqs  "\inverse", "TRUE"
3534d09f5abfba45163d1296272ac7d2ddc2cd5f9fbrtoy@google.com
3544d09f5abfba45163d1296272ac7d2ddc2cd5f9fbrtoy@google.com            // calculate a*v5
3554d09f5abfba45163d1296272ac7d2ddc2cd5f9fbrtoy@google.com            fmul    dT1,dVr5,dT0[0]              // use dVi0 for dT1
3564d09f5abfba45163d1296272ac7d2ddc2cd5f9fbrtoy@google.com
3574d09f5abfba45163d1296272ac7d2ddc2cd5f9fbrtoy@google.com            ld2     {dXr4,dXi4},[pSrc],pointStep //  data[4]
3584d09f5abfba45163d1296272ac7d2ddc2cd5f9fbrtoy@google.com            fmul    dVi5,dVi5,dT0[0]
3594d09f5abfba45163d1296272ac7d2ddc2cd5f9fbrtoy@google.com
3604d09f5abfba45163d1296272ac7d2ddc2cd5f9fbrtoy@google.com            ld2     {dXr5,dXi5},[pSrc],pointStep //  data[5]
3614d09f5abfba45163d1296272ac7d2ddc2cd5f9fbrtoy@google.com            fsub    dVr5,dT1,dVi5                // a * V5
3624d09f5abfba45163d1296272ac7d2ddc2cd5f9fbrtoy@google.com            fadd    dVi5,dT1,dVi5
3634d09f5abfba45163d1296272ac7d2ddc2cd5f9fbrtoy@google.com
3644d09f5abfba45163d1296272ac7d2ddc2cd5f9fbrtoy@google.com            ld2     {dXr6,dXi6},[pSrc],pointStep //  data[6]
3654d09f5abfba45163d1296272ac7d2ddc2cd5f9fbrtoy@google.com
3664d09f5abfba45163d1296272ac7d2ddc2cd5f9fbrtoy@google.com            // calculate  b*v7
3674d09f5abfba45163d1296272ac7d2ddc2cd5f9fbrtoy@google.com            fmul    dT1,dVr7,dT0[0]
3684d09f5abfba45163d1296272ac7d2ddc2cd5f9fbrtoy@google.com            fmul    dVi7,dVi7,dT0[0]
3694d09f5abfba45163d1296272ac7d2ddc2cd5f9fbrtoy@google.com
3704d09f5abfba45163d1296272ac7d2ddc2cd5f9fbrtoy@google.com            // fadd    qY1,qV1,qV5
3714d09f5abfba45163d1296272ac7d2ddc2cd5f9fbrtoy@google.com            // fsub    qY5,qV1,qV5
3724d09f5abfba45163d1296272ac7d2ddc2cd5f9fbrtoy@google.com            fadd    dYr1,dVr1,dVr5
3734d09f5abfba45163d1296272ac7d2ddc2cd5f9fbrtoy@google.com            fsub    dYr5,dVr1,dVr5
3744d09f5abfba45163d1296272ac7d2ddc2cd5f9fbrtoy@google.com            fadd    dYi1,dVi1,dVi5
3754d09f5abfba45163d1296272ac7d2ddc2cd5f9fbrtoy@google.com            fsub    dYi5,dVi1,dVi5
3764d09f5abfba45163d1296272ac7d2ddc2cd5f9fbrtoy@google.com
3774d09f5abfba45163d1296272ac7d2ddc2cd5f9fbrtoy@google.com            fadd    dVr7,dT1,dVi7                // b * V7
3784d09f5abfba45163d1296272ac7d2ddc2cd5f9fbrtoy@google.com            fsub    dVi7,dVi7,dT1
3794d09f5abfba45163d1296272ac7d2ddc2cd5f9fbrtoy@google.com            SUB     pDst, pDst, step2            // set pDst to y1
3804d09f5abfba45163d1296272ac7d2ddc2cd5f9fbrtoy@google.com
3814d09f5abfba45163d1296272ac7d2ddc2cd5f9fbrtoy@google.com            // On the last iteration,  this will read past the end of pSrc,
3824d09f5abfba45163d1296272ac7d2ddc2cd5f9fbrtoy@google.com            // so skip this read.
3834d09f5abfba45163d1296272ac7d2ddc2cd5f9fbrtoy@google.com            BEQ     radix8SkipLastUpdateInv\name
3844d09f5abfba45163d1296272ac7d2ddc2cd5f9fbrtoy@google.com            ld2     {dXr7,dXi7},[pSrc],setStep   //  data[7]
3854d09f5abfba45163d1296272ac7d2ddc2cd5f9fbrtoy@google.comradix8SkipLastUpdateInv\name:
3864d09f5abfba45163d1296272ac7d2ddc2cd5f9fbrtoy@google.com
3874d09f5abfba45163d1296272ac7d2ddc2cd5f9fbrtoy@google.com            fsub    dYr3,dVr3,dVr7
3884d09f5abfba45163d1296272ac7d2ddc2cd5f9fbrtoy@google.com            fsub    dYi3,dVi3,dVi7
3894d09f5abfba45163d1296272ac7d2ddc2cd5f9fbrtoy@google.com            st2     {dYr1,dYi1},[pDst],step1     // store y1
3904d09f5abfba45163d1296272ac7d2ddc2cd5f9fbrtoy@google.com            fadd    dYr7,dVr3,dVr7
3914d09f5abfba45163d1296272ac7d2ddc2cd5f9fbrtoy@google.com            fadd    dYi7,dVi3,dVi7
3924d09f5abfba45163d1296272ac7d2ddc2cd5f9fbrtoy@google.com
3934d09f5abfba45163d1296272ac7d2ddc2cd5f9fbrtoy@google.com
3944d09f5abfba45163d1296272ac7d2ddc2cd5f9fbrtoy@google.com            st2     {dYr3,dYi3},[pDst],step1     // store y3
3954d09f5abfba45163d1296272ac7d2ddc2cd5f9fbrtoy@google.com            st2     {dYr5,dYi5},[pDst],step1     // store y5
3964d09f5abfba45163d1296272ac7d2ddc2cd5f9fbrtoy@google.com            st2     {dYr7,dYi7},[pDst]           // store y7
3974d09f5abfba45163d1296272ac7d2ddc2cd5f9fbrtoy@google.com            ADD pDst, pDst, #16
3984d09f5abfba45163d1296272ac7d2ddc2cd5f9fbrtoy@google.com
3994d09f5abfba45163d1296272ac7d2ddc2cd5f9fbrtoy@google.com        .ELSE
4004d09f5abfba45163d1296272ac7d2ddc2cd5f9fbrtoy@google.com
4014d09f5abfba45163d1296272ac7d2ddc2cd5f9fbrtoy@google.com            // calculate  b*v7
4024d09f5abfba45163d1296272ac7d2ddc2cd5f9fbrtoy@google.com            fmul    dT1,dVr7,dT0[0]
4034d09f5abfba45163d1296272ac7d2ddc2cd5f9fbrtoy@google.com            ld2     {dXr4,dXi4},[pSrc],pointStep //  data[4]
4044d09f5abfba45163d1296272ac7d2ddc2cd5f9fbrtoy@google.com            fmul    dVi7,dVi7,dT0[0]
4054d09f5abfba45163d1296272ac7d2ddc2cd5f9fbrtoy@google.com
4064d09f5abfba45163d1296272ac7d2ddc2cd5f9fbrtoy@google.com            ld2     {dXr5,dXi5},[pSrc],pointStep //  data[5]
4074d09f5abfba45163d1296272ac7d2ddc2cd5f9fbrtoy@google.com            fadd    dVr7,dT1,dVi7                     // b * V7
4084d09f5abfba45163d1296272ac7d2ddc2cd5f9fbrtoy@google.com            fsub    dVi7,dVi7,dT1
4094d09f5abfba45163d1296272ac7d2ddc2cd5f9fbrtoy@google.com
4104d09f5abfba45163d1296272ac7d2ddc2cd5f9fbrtoy@google.com            ld2     {dXr6,dXi6},[pSrc],pointStep //  data[6]
4114d09f5abfba45163d1296272ac7d2ddc2cd5f9fbrtoy@google.com
4124d09f5abfba45163d1296272ac7d2ddc2cd5f9fbrtoy@google.com            // calculate a*v5
4134d09f5abfba45163d1296272ac7d2ddc2cd5f9fbrtoy@google.com            fmul    dT1,dVr5,dT0[0]              // use dVi0 for dT1
4144d09f5abfba45163d1296272ac7d2ddc2cd5f9fbrtoy@google.com            fmul    dVi5,dVi5,dT0[0]
4154d09f5abfba45163d1296272ac7d2ddc2cd5f9fbrtoy@google.com
4164d09f5abfba45163d1296272ac7d2ddc2cd5f9fbrtoy@google.com            fadd    dYr7,dVr3,dVr7
4174d09f5abfba45163d1296272ac7d2ddc2cd5f9fbrtoy@google.com            fadd    dYi7,dVi3,dVi7
4184d09f5abfba45163d1296272ac7d2ddc2cd5f9fbrtoy@google.com            SUB     pDst, pDst, step2            // set pDst to y1
4194d09f5abfba45163d1296272ac7d2ddc2cd5f9fbrtoy@google.com
4204d09f5abfba45163d1296272ac7d2ddc2cd5f9fbrtoy@google.com            fsub    dVr5,dT1,dVi5                // a * V5
4214d09f5abfba45163d1296272ac7d2ddc2cd5f9fbrtoy@google.com            fadd    dVi5,dT1,dVi5
4224d09f5abfba45163d1296272ac7d2ddc2cd5f9fbrtoy@google.com
4234d09f5abfba45163d1296272ac7d2ddc2cd5f9fbrtoy@google.com            // On the last iteration,  this will read past the end of pSrc,
4244d09f5abfba45163d1296272ac7d2ddc2cd5f9fbrtoy@google.com            // so skip this read.
4254d09f5abfba45163d1296272ac7d2ddc2cd5f9fbrtoy@google.com            BEQ     radix8SkipLastUpdateFwd\name
4264d09f5abfba45163d1296272ac7d2ddc2cd5f9fbrtoy@google.com            ld2     {dXr7,dXi7},[pSrc],setStep   //  data[7]
4274d09f5abfba45163d1296272ac7d2ddc2cd5f9fbrtoy@google.comradix8SkipLastUpdateFwd\name:
4284d09f5abfba45163d1296272ac7d2ddc2cd5f9fbrtoy@google.com
4294d09f5abfba45163d1296272ac7d2ddc2cd5f9fbrtoy@google.com            // fsub    qY5,qV1,qV5
4304d09f5abfba45163d1296272ac7d2ddc2cd5f9fbrtoy@google.com            fsub    dYr5,dVr1,dVr5
4314d09f5abfba45163d1296272ac7d2ddc2cd5f9fbrtoy@google.com            fsub    dYi5,dVi1,dVi5
4324d09f5abfba45163d1296272ac7d2ddc2cd5f9fbrtoy@google.com
4334d09f5abfba45163d1296272ac7d2ddc2cd5f9fbrtoy@google.com            fsub    dYr3,dVr3,dVr7
4344d09f5abfba45163d1296272ac7d2ddc2cd5f9fbrtoy@google.com            st2     {dYr7,dYi7},[pDst],step1     // store y1
4354d09f5abfba45163d1296272ac7d2ddc2cd5f9fbrtoy@google.com            fsub    dYi3,dVi3,dVi7
4364d09f5abfba45163d1296272ac7d2ddc2cd5f9fbrtoy@google.com
4374d09f5abfba45163d1296272ac7d2ddc2cd5f9fbrtoy@google.com            // fadd    qY1,qV1,qV5
4384d09f5abfba45163d1296272ac7d2ddc2cd5f9fbrtoy@google.com            fadd    dYr1,dVr1,dVr5
4394d09f5abfba45163d1296272ac7d2ddc2cd5f9fbrtoy@google.com            fadd    dYi1,dVi1,dVi5
4404d09f5abfba45163d1296272ac7d2ddc2cd5f9fbrtoy@google.com
4414d09f5abfba45163d1296272ac7d2ddc2cd5f9fbrtoy@google.com            st2     {dYr5,dYi5},[pDst],step1     // store y3
4424d09f5abfba45163d1296272ac7d2ddc2cd5f9fbrtoy@google.com            st2     {dYr3,dYi3},[pDst],step1     // store y5
4434d09f5abfba45163d1296272ac7d2ddc2cd5f9fbrtoy@google.com            st2     {dYr1,dYi1},[pDst],#16       // store y7
4444d09f5abfba45163d1296272ac7d2ddc2cd5f9fbrtoy@google.com
4454d09f5abfba45163d1296272ac7d2ddc2cd5f9fbrtoy@google.com        .ENDIF
4464d09f5abfba45163d1296272ac7d2ddc2cd5f9fbrtoy@google.com
4474d09f5abfba45163d1296272ac7d2ddc2cd5f9fbrtoy@google.com
4484d09f5abfba45163d1296272ac7d2ddc2cd5f9fbrtoy@google.com        // update pDst for the next set
4494d09f5abfba45163d1296272ac7d2ddc2cd5f9fbrtoy@google.com        SUB     pDst, pDst, step2
4504d09f5abfba45163d1296272ac7d2ddc2cd5f9fbrtoy@google.com        BGT     radix8fsGrpZeroSetLoop\name
4514d09f5abfba45163d1296272ac7d2ddc2cd5f9fbrtoy@google.com
4524d09f5abfba45163d1296272ac7d2ddc2cd5f9fbrtoy@google.com        // Save subFFTNum and subFFTSize for next stage
4534d09f5abfba45163d1296272ac7d2ddc2cd5f9fbrtoy@google.com        str     subFFTNum, [pSubFFTNum]
4544d09f5abfba45163d1296272ac7d2ddc2cd5f9fbrtoy@google.com        str     subFFTSize, [pSubFFTSize]
4554d09f5abfba45163d1296272ac7d2ddc2cd5f9fbrtoy@google.com
4564d09f5abfba45163d1296272ac7d2ddc2cd5f9fbrtoy@google.com        .endm
4574d09f5abfba45163d1296272ac7d2ddc2cd5f9fbrtoy@google.com
4584d09f5abfba45163d1296272ac7d2ddc2cd5f9fbrtoy@google.com
4594d09f5abfba45163d1296272ac7d2ddc2cd5f9fbrtoy@google.com        // Allocate stack memory required by the function
4604d09f5abfba45163d1296272ac7d2ddc2cd5f9fbrtoy@google.com
4614d09f5abfba45163d1296272ac7d2ddc2cd5f9fbrtoy@google.com
4624d09f5abfba45163d1296272ac7d2ddc2cd5f9fbrtoy@google.com        M_START armSP_FFTFwd_CToC_FC32_Radix8_fs_OutOfPlace,,d15
4634d09f5abfba45163d1296272ac7d2ddc2cd5f9fbrtoy@google.com            FFTSTAGE "FALSE","FALSE",FWD
4644d09f5abfba45163d1296272ac7d2ddc2cd5f9fbrtoy@google.com        M_END
4654d09f5abfba45163d1296272ac7d2ddc2cd5f9fbrtoy@google.com
4664d09f5abfba45163d1296272ac7d2ddc2cd5f9fbrtoy@google.com
4674d09f5abfba45163d1296272ac7d2ddc2cd5f9fbrtoy@google.com        M_START armSP_FFTInv_CToC_FC32_Radix8_fs_OutOfPlace,,d15
4684d09f5abfba45163d1296272ac7d2ddc2cd5f9fbrtoy@google.com            FFTSTAGE "FALSE","TRUE",INV
4694d09f5abfba45163d1296272ac7d2ddc2cd5f9fbrtoy@google.com        M_END
4704d09f5abfba45163d1296272ac7d2ddc2cd5f9fbrtoy@google.com
4714d09f5abfba45163d1296272ac7d2ddc2cd5f9fbrtoy@google.com
4724d09f5abfba45163d1296272ac7d2ddc2cd5f9fbrtoy@google.com
4734d09f5abfba45163d1296272ac7d2ddc2cd5f9fbrtoy@google.com        .end
474