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