188b02237dfdb25a9b602a7b6dd49665c96e8e890rtoy@google.com@// 288b02237dfdb25a9b602a7b6dd49665c96e8e890rtoy@google.com@// Copyright (c) 2013 The WebRTC project authors. All Rights Reserved. 388b02237dfdb25a9b602a7b6dd49665c96e8e890rtoy@google.com@// 488b02237dfdb25a9b602a7b6dd49665c96e8e890rtoy@google.com@// Use of this source code is governed by a BSD-style license 588b02237dfdb25a9b602a7b6dd49665c96e8e890rtoy@google.com@// that can be found in the LICENSE file in the root of the source 688b02237dfdb25a9b602a7b6dd49665c96e8e890rtoy@google.com@// tree. An additional intellectual property rights grant can be found 788b02237dfdb25a9b602a7b6dd49665c96e8e890rtoy@google.com@// in the file PATENTS. All contributing project authors may 888b02237dfdb25a9b602a7b6dd49665c96e8e890rtoy@google.com@// be found in the AUTHORS file in the root of the source tree. 988b02237dfdb25a9b602a7b6dd49665c96e8e890rtoy@google.com@// 1088b02237dfdb25a9b602a7b6dd49665c96e8e890rtoy@google.com@// This is a modification of armSP_FFT_CToC_SC32_Radix4_unsafe_s.S 1188b02237dfdb25a9b602a7b6dd49665c96e8e890rtoy@google.com@// to support float instead of SC32. 1288b02237dfdb25a9b602a7b6dd49665c96e8e890rtoy@google.com@// 1388b02237dfdb25a9b602a7b6dd49665c96e8e890rtoy@google.com 1488b02237dfdb25a9b602a7b6dd49665c96e8e890rtoy@google.com@// 1588b02237dfdb25a9b602a7b6dd49665c96e8e890rtoy@google.com@// Description: 1688b02237dfdb25a9b602a7b6dd49665c96e8e890rtoy@google.com@// Compute a Radix 4 FFT stage for a N point complex signal 1788b02237dfdb25a9b602a7b6dd49665c96e8e890rtoy@google.com@// 1888b02237dfdb25a9b602a7b6dd49665c96e8e890rtoy@google.com@// 1988b02237dfdb25a9b602a7b6dd49665c96e8e890rtoy@google.com 2088b02237dfdb25a9b602a7b6dd49665c96e8e890rtoy@google.com 2188b02237dfdb25a9b602a7b6dd49665c96e8e890rtoy@google.com@// Include standard headers 2288b02237dfdb25a9b602a7b6dd49665c96e8e890rtoy@google.com 2388b02237dfdb25a9b602a7b6dd49665c96e8e890rtoy@google.com#include "dl/api/arm/armCOMM_s.h" 2488b02237dfdb25a9b602a7b6dd49665c96e8e890rtoy@google.com#include "dl/api/arm/omxtypes_s.h" 2588b02237dfdb25a9b602a7b6dd49665c96e8e890rtoy@google.com 2688b02237dfdb25a9b602a7b6dd49665c96e8e890rtoy@google.com@// M_VARIANTS ARM1136JS 2788b02237dfdb25a9b602a7b6dd49665c96e8e890rtoy@google.com 2888b02237dfdb25a9b602a7b6dd49665c96e8e890rtoy@google.com@// Import symbols required from other files 2988b02237dfdb25a9b602a7b6dd49665c96e8e890rtoy@google.com@// (For example tables) 3088b02237dfdb25a9b602a7b6dd49665c96e8e890rtoy@google.com 3188b02237dfdb25a9b602a7b6dd49665c96e8e890rtoy@google.com 3288b02237dfdb25a9b602a7b6dd49665c96e8e890rtoy@google.com 3388b02237dfdb25a9b602a7b6dd49665c96e8e890rtoy@google.com 3488b02237dfdb25a9b602a7b6dd49665c96e8e890rtoy@google.com@// Set debugging level 3588b02237dfdb25a9b602a7b6dd49665c96e8e890rtoy@google.com@//DEBUG_ON SETL {TRUE} 3688b02237dfdb25a9b602a7b6dd49665c96e8e890rtoy@google.com 3788b02237dfdb25a9b602a7b6dd49665c96e8e890rtoy@google.com 3888b02237dfdb25a9b602a7b6dd49665c96e8e890rtoy@google.com 3988b02237dfdb25a9b602a7b6dd49665c96e8e890rtoy@google.com@// Guarding implementation by the processor name 4088b02237dfdb25a9b602a7b6dd49665c96e8e890rtoy@google.com 4188b02237dfdb25a9b602a7b6dd49665c96e8e890rtoy@google.com@// IF ARM1136JS 4288b02237dfdb25a9b602a7b6dd49665c96e8e890rtoy@google.com 4388b02237dfdb25a9b602a7b6dd49665c96e8e890rtoy@google.com@//Input Registers 4488b02237dfdb25a9b602a7b6dd49665c96e8e890rtoy@google.com 4588b02237dfdb25a9b602a7b6dd49665c96e8e890rtoy@google.com#define pSrc r0 4688b02237dfdb25a9b602a7b6dd49665c96e8e890rtoy@google.com#define pDst r2 4788b02237dfdb25a9b602a7b6dd49665c96e8e890rtoy@google.com#define pTwiddle r1 4888b02237dfdb25a9b602a7b6dd49665c96e8e890rtoy@google.com#define subFFTNum r6 4988b02237dfdb25a9b602a7b6dd49665c96e8e890rtoy@google.com#define subFFTSize r7 5088b02237dfdb25a9b602a7b6dd49665c96e8e890rtoy@google.com 5188b02237dfdb25a9b602a7b6dd49665c96e8e890rtoy@google.com 5288b02237dfdb25a9b602a7b6dd49665c96e8e890rtoy@google.com 5388b02237dfdb25a9b602a7b6dd49665c96e8e890rtoy@google.com@//Output Registers 5488b02237dfdb25a9b602a7b6dd49665c96e8e890rtoy@google.com 5588b02237dfdb25a9b602a7b6dd49665c96e8e890rtoy@google.com 5688b02237dfdb25a9b602a7b6dd49665c96e8e890rtoy@google.com@//Local Scratch Registers 5788b02237dfdb25a9b602a7b6dd49665c96e8e890rtoy@google.com 5888b02237dfdb25a9b602a7b6dd49665c96e8e890rtoy@google.com#define grpCount r12 5988b02237dfdb25a9b602a7b6dd49665c96e8e890rtoy@google.com#define step r12 /*@// Reuse grpCount*/ 6088b02237dfdb25a9b602a7b6dd49665c96e8e890rtoy@google.com#define outPointStep r3 6188b02237dfdb25a9b602a7b6dd49665c96e8e890rtoy@google.com#define setCount r8 6288b02237dfdb25a9b602a7b6dd49665c96e8e890rtoy@google.com#define diff r9 6388b02237dfdb25a9b602a7b6dd49665c96e8e890rtoy@google.com#define pointStep r14 6488b02237dfdb25a9b602a7b6dd49665c96e8e890rtoy@google.com 6588b02237dfdb25a9b602a7b6dd49665c96e8e890rtoy@google.com#define t1 r3 /*@// Reuse outPointStep*/ 6688b02237dfdb25a9b602a7b6dd49665c96e8e890rtoy@google.com 6788b02237dfdb25a9b602a7b6dd49665c96e8e890rtoy@google.com@// Real and Imaginary parts used in the inner grp loop 6888b02237dfdb25a9b602a7b6dd49665c96e8e890rtoy@google.com#define x0r s0 6988b02237dfdb25a9b602a7b6dd49665c96e8e890rtoy@google.com#define x0i s1 7088b02237dfdb25a9b602a7b6dd49665c96e8e890rtoy@google.com#define x1r s2 7188b02237dfdb25a9b602a7b6dd49665c96e8e890rtoy@google.com#define x1i s3 7288b02237dfdb25a9b602a7b6dd49665c96e8e890rtoy@google.com#define x2r s4 7388b02237dfdb25a9b602a7b6dd49665c96e8e890rtoy@google.com#define x2i s5 7488b02237dfdb25a9b602a7b6dd49665c96e8e890rtoy@google.com#define x3r s6 7588b02237dfdb25a9b602a7b6dd49665c96e8e890rtoy@google.com#define x3i s7 7688b02237dfdb25a9b602a7b6dd49665c96e8e890rtoy@google.com 7788b02237dfdb25a9b602a7b6dd49665c96e8e890rtoy@google.com@// Temporary reg to hold the twiddle multiplies 7888b02237dfdb25a9b602a7b6dd49665c96e8e890rtoy@google.com 7988b02237dfdb25a9b602a7b6dd49665c96e8e890rtoy@google.com#define t0r s8 8088b02237dfdb25a9b602a7b6dd49665c96e8e890rtoy@google.com#define t0i s9 8188b02237dfdb25a9b602a7b6dd49665c96e8e890rtoy@google.com#define t2r s10 8288b02237dfdb25a9b602a7b6dd49665c96e8e890rtoy@google.com#define t2i s11 8388b02237dfdb25a9b602a7b6dd49665c96e8e890rtoy@google.com#define sr s12 8488b02237dfdb25a9b602a7b6dd49665c96e8e890rtoy@google.com#define si s13 8588b02237dfdb25a9b602a7b6dd49665c96e8e890rtoy@google.com 8688b02237dfdb25a9b602a7b6dd49665c96e8e890rtoy@google.com 8788b02237dfdb25a9b602a7b6dd49665c96e8e890rtoy@google.com 8888b02237dfdb25a9b602a7b6dd49665c96e8e890rtoy@google.com 895d8507771824df2b96d9c6f2fd55a47fcfd9dec9rtoy@google.com .macro FFTSTAGE scaled, inverse , name 9088b02237dfdb25a9b602a7b6dd49665c96e8e890rtoy@google.com 9188b02237dfdb25a9b602a7b6dd49665c96e8e890rtoy@google.com @// Define stack arguments 9288b02237dfdb25a9b602a7b6dd49665c96e8e890rtoy@google.com 9388b02237dfdb25a9b602a7b6dd49665c96e8e890rtoy@google.com 9488b02237dfdb25a9b602a7b6dd49665c96e8e890rtoy@google.com @// Update grpCount and grpSize rightaway inorder to reuse 9588b02237dfdb25a9b602a7b6dd49665c96e8e890rtoy@google.com @// pGrpCount and pGrpSize regs 9688b02237dfdb25a9b602a7b6dd49665c96e8e890rtoy@google.com 9788b02237dfdb25a9b602a7b6dd49665c96e8e890rtoy@google.com LSL grpCount,subFFTSize,#2 9888b02237dfdb25a9b602a7b6dd49665c96e8e890rtoy@google.com lsr subFFTNum, subFFTNum, #2 9988b02237dfdb25a9b602a7b6dd49665c96e8e890rtoy@google.com mov subFFTSize, grpCount 10088b02237dfdb25a9b602a7b6dd49665c96e8e890rtoy@google.com 10188b02237dfdb25a9b602a7b6dd49665c96e8e890rtoy@google.com 10288b02237dfdb25a9b602a7b6dd49665c96e8e890rtoy@google.com @// pT0+1 increments pT0 by 8 bytes 10388b02237dfdb25a9b602a7b6dd49665c96e8e890rtoy@google.com @// pT0+pointStep = increment of 8*pointStep bytes = 2*grpSize bytes 10488b02237dfdb25a9b602a7b6dd49665c96e8e890rtoy@google.com mov pointStep, subFFTNum, lsl #1 10588b02237dfdb25a9b602a7b6dd49665c96e8e890rtoy@google.com 10688b02237dfdb25a9b602a7b6dd49665c96e8e890rtoy@google.com 10788b02237dfdb25a9b602a7b6dd49665c96e8e890rtoy@google.com @// pOut0+1 increments pOut0 by 8 bytes 10888b02237dfdb25a9b602a7b6dd49665c96e8e890rtoy@google.com @// pOut0+outPointStep == increment of 8*outPointStep bytes = 2*size 10988b02237dfdb25a9b602a7b6dd49665c96e8e890rtoy@google.com @// bytes 11088b02237dfdb25a9b602a7b6dd49665c96e8e890rtoy@google.com 11188b02237dfdb25a9b602a7b6dd49665c96e8e890rtoy@google.com @// Use setCount as dummy. It's set correctly below. 11288b02237dfdb25a9b602a7b6dd49665c96e8e890rtoy@google.com smull outPointStep, setCount, grpCount, pointStep 11388b02237dfdb25a9b602a7b6dd49665c96e8e890rtoy@google.com 11488b02237dfdb25a9b602a7b6dd49665c96e8e890rtoy@google.com LSL pointStep,pointStep,#2 @// 2*grpSize 11588b02237dfdb25a9b602a7b6dd49665c96e8e890rtoy@google.com 11688b02237dfdb25a9b602a7b6dd49665c96e8e890rtoy@google.com 11788b02237dfdb25a9b602a7b6dd49665c96e8e890rtoy@google.com MOV setCount,pointStep,LSR #3 11888b02237dfdb25a9b602a7b6dd49665c96e8e890rtoy@google.com 11988b02237dfdb25a9b602a7b6dd49665c96e8e890rtoy@google.com @// Interchange grpLoop and setLoop 12088b02237dfdb25a9b602a7b6dd49665c96e8e890rtoy@google.com 12188b02237dfdb25a9b602a7b6dd49665c96e8e890rtoy@google.comsetLoop\name: 12288b02237dfdb25a9b602a7b6dd49665c96e8e890rtoy@google.com 12388b02237dfdb25a9b602a7b6dd49665c96e8e890rtoy@google.com MOV step,#0 12488b02237dfdb25a9b602a7b6dd49665c96e8e890rtoy@google.com @// Set pSrc and pDst for the grpLoop 12588b02237dfdb25a9b602a7b6dd49665c96e8e890rtoy@google.com 12688b02237dfdb25a9b602a7b6dd49665c96e8e890rtoy@google.com SUB diff,outPointStep,pointStep 12788b02237dfdb25a9b602a7b6dd49665c96e8e890rtoy@google.com 12888b02237dfdb25a9b602a7b6dd49665c96e8e890rtoy@google.com @// Save setCount on stack to reuse the reg 12988b02237dfdb25a9b602a7b6dd49665c96e8e890rtoy@google.com 13088b02237dfdb25a9b602a7b6dd49665c96e8e890rtoy@google.com ADD pSrc,pSrc,diff,LSL #2 @// pSrc += (grpCount-1)*grpStep 13188b02237dfdb25a9b602a7b6dd49665c96e8e890rtoy@google.com ADD pDst,pDst,diff @// pDst += (grpCount-1)*setCount 13288b02237dfdb25a9b602a7b6dd49665c96e8e890rtoy@google.com ADD step,step,diff @// step += (grpCount-1)*setCount 13388b02237dfdb25a9b602a7b6dd49665c96e8e890rtoy@google.com 13488b02237dfdb25a9b602a7b6dd49665c96e8e890rtoy@google.com 13588b02237dfdb25a9b602a7b6dd49665c96e8e890rtoy@google.com 13688b02237dfdb25a9b602a7b6dd49665c96e8e890rtoy@google.com @// Loop on the grps 13788b02237dfdb25a9b602a7b6dd49665c96e8e890rtoy@google.com 13888b02237dfdb25a9b602a7b6dd49665c96e8e890rtoy@google.comgrpLoop\name: 13988b02237dfdb25a9b602a7b6dd49665c96e8e890rtoy@google.com 14088b02237dfdb25a9b602a7b6dd49665c96e8e890rtoy@google.com 14188b02237dfdb25a9b602a7b6dd49665c96e8e890rtoy@google.com 14288b02237dfdb25a9b602a7b6dd49665c96e8e890rtoy@google.com @// butterfly loop 14388b02237dfdb25a9b602a7b6dd49665c96e8e890rtoy@google.com add pSrc, pointStep 14488b02237dfdb25a9b602a7b6dd49665c96e8e890rtoy@google.com vldm.f32 pSrc, {x3r, x3i} @// data[1] 14588b02237dfdb25a9b602a7b6dd49665c96e8e890rtoy@google.com add pTwiddle, step 14688b02237dfdb25a9b602a7b6dd49665c96e8e890rtoy@google.com vldm.f32 pTwiddle, {x1r, x1i} @// coef[1] 14788b02237dfdb25a9b602a7b6dd49665c96e8e890rtoy@google.com add pTwiddle, step 14888b02237dfdb25a9b602a7b6dd49665c96e8e890rtoy@google.com vldm.f32 pTwiddle, {x2r, x2i} @// coef[2] 14988b02237dfdb25a9b602a7b6dd49665c96e8e890rtoy@google.com add pSrc, pointStep 15088b02237dfdb25a9b602a7b6dd49665c96e8e890rtoy@google.com vldm.f32 pSrc, {x0r, x0i} @// data[2] 15188b02237dfdb25a9b602a7b6dd49665c96e8e890rtoy@google.com 15288b02237dfdb25a9b602a7b6dd49665c96e8e890rtoy@google.com @// do first complex multiply 15388b02237dfdb25a9b602a7b6dd49665c96e8e890rtoy@google.com vmul.f32 t0r, x3r, x1r 15488b02237dfdb25a9b602a7b6dd49665c96e8e890rtoy@google.com vmul.f32 t0i, x3i, x1r 15588b02237dfdb25a9b602a7b6dd49665c96e8e890rtoy@google.com 15688b02237dfdb25a9b602a7b6dd49665c96e8e890rtoy@google.com .ifeqs "\inverse", "TRUE" 15788b02237dfdb25a9b602a7b6dd49665c96e8e890rtoy@google.com vmla.f32 t0r, x3i, x1i 15888b02237dfdb25a9b602a7b6dd49665c96e8e890rtoy@google.com vmls.f32 t0i, x3r, x1i 15988b02237dfdb25a9b602a7b6dd49665c96e8e890rtoy@google.com vmov.f32 x1r, t0r 16088b02237dfdb25a9b602a7b6dd49665c96e8e890rtoy@google.com vmov.f32 x1i, t0i 16188b02237dfdb25a9b602a7b6dd49665c96e8e890rtoy@google.com .else 16288b02237dfdb25a9b602a7b6dd49665c96e8e890rtoy@google.com vmls.f32 t0r, x3i, x1i 16388b02237dfdb25a9b602a7b6dd49665c96e8e890rtoy@google.com vmla.f32 t0i, x3r, x1i 16488b02237dfdb25a9b602a7b6dd49665c96e8e890rtoy@google.com vmov.f32 x1r, t0r 16588b02237dfdb25a9b602a7b6dd49665c96e8e890rtoy@google.com vmov.f32 x1i, t0i 16688b02237dfdb25a9b602a7b6dd49665c96e8e890rtoy@google.com .endif 16788b02237dfdb25a9b602a7b6dd49665c96e8e890rtoy@google.com 16888b02237dfdb25a9b602a7b6dd49665c96e8e890rtoy@google.com add pTwiddle, pTwiddle, step 16988b02237dfdb25a9b602a7b6dd49665c96e8e890rtoy@google.com vldm pTwiddle, {x3r, x3i} @// coef[3] 17088b02237dfdb25a9b602a7b6dd49665c96e8e890rtoy@google.com sub pTwiddle, pTwiddle, step 17188b02237dfdb25a9b602a7b6dd49665c96e8e890rtoy@google.com 17288b02237dfdb25a9b602a7b6dd49665c96e8e890rtoy@google.com @// do second complex multiply 17388b02237dfdb25a9b602a7b6dd49665c96e8e890rtoy@google.com vmul.f32 t0r, x0r, x2r 17488b02237dfdb25a9b602a7b6dd49665c96e8e890rtoy@google.com vmul.f32 t0i, x0i, x2r 17588b02237dfdb25a9b602a7b6dd49665c96e8e890rtoy@google.com 17688b02237dfdb25a9b602a7b6dd49665c96e8e890rtoy@google.com .ifeqs "\inverse", "TRUE" 17788b02237dfdb25a9b602a7b6dd49665c96e8e890rtoy@google.com vmla.f32 t0r, x0i, x2i 17888b02237dfdb25a9b602a7b6dd49665c96e8e890rtoy@google.com vmls.f32 t0i, x0r, x2i 17988b02237dfdb25a9b602a7b6dd49665c96e8e890rtoy@google.com vmov.f32 x2r, t0r 18088b02237dfdb25a9b602a7b6dd49665c96e8e890rtoy@google.com vmov.f32 x2i, t0i 18188b02237dfdb25a9b602a7b6dd49665c96e8e890rtoy@google.com .else 18288b02237dfdb25a9b602a7b6dd49665c96e8e890rtoy@google.com vmls.f32 t0r, x0i, x2i 18388b02237dfdb25a9b602a7b6dd49665c96e8e890rtoy@google.com vmla.f32 t0i, x0r, x2i 18488b02237dfdb25a9b602a7b6dd49665c96e8e890rtoy@google.com vmov.f32 x2r, t0r 18588b02237dfdb25a9b602a7b6dd49665c96e8e890rtoy@google.com vmov.f32 x2i, t0i 18688b02237dfdb25a9b602a7b6dd49665c96e8e890rtoy@google.com .endif 18788b02237dfdb25a9b602a7b6dd49665c96e8e890rtoy@google.com 18888b02237dfdb25a9b602a7b6dd49665c96e8e890rtoy@google.com add pSrc, pointStep 18988b02237dfdb25a9b602a7b6dd49665c96e8e890rtoy@google.com vldm pSrc, {x0r, x0i} @// data[3] 19088b02237dfdb25a9b602a7b6dd49665c96e8e890rtoy@google.com sub pSrc, pointStep 19188b02237dfdb25a9b602a7b6dd49665c96e8e890rtoy@google.com 19288b02237dfdb25a9b602a7b6dd49665c96e8e890rtoy@google.com SUB pTwiddle,pTwiddle,step,LSL #1 @// reset pTwiddle 19388b02237dfdb25a9b602a7b6dd49665c96e8e890rtoy@google.com SUBS step,step,pointStep @// decrement loop counter 19488b02237dfdb25a9b602a7b6dd49665c96e8e890rtoy@google.com 19588b02237dfdb25a9b602a7b6dd49665c96e8e890rtoy@google.com @// do third complex multiply 19688b02237dfdb25a9b602a7b6dd49665c96e8e890rtoy@google.com SUB pSrc,pSrc,pointStep,LSL #1 @// reset pSrc to data[0] 19788b02237dfdb25a9b602a7b6dd49665c96e8e890rtoy@google.com vmul.f32 t0r, x0r, x3r 19888b02237dfdb25a9b602a7b6dd49665c96e8e890rtoy@google.com vmul.f32 t0i, x0i, x3r 19988b02237dfdb25a9b602a7b6dd49665c96e8e890rtoy@google.com 20088b02237dfdb25a9b602a7b6dd49665c96e8e890rtoy@google.com .ifeqs "\inverse", "TRUE" 20188b02237dfdb25a9b602a7b6dd49665c96e8e890rtoy@google.com vmla.f32 t0r, x0i, x3i 20288b02237dfdb25a9b602a7b6dd49665c96e8e890rtoy@google.com vmls.f32 t0i, x0r, x3i 20388b02237dfdb25a9b602a7b6dd49665c96e8e890rtoy@google.com vmov.f32 x3r, t0r 20488b02237dfdb25a9b602a7b6dd49665c96e8e890rtoy@google.com vmov.f32 x3i, t0i 20588b02237dfdb25a9b602a7b6dd49665c96e8e890rtoy@google.com .else 20688b02237dfdb25a9b602a7b6dd49665c96e8e890rtoy@google.com vmls.f32 t0r, x0i, x3i 20788b02237dfdb25a9b602a7b6dd49665c96e8e890rtoy@google.com vmla.f32 t0i, x0r, x3i 20888b02237dfdb25a9b602a7b6dd49665c96e8e890rtoy@google.com vmov.f32 x3r, t0r 20988b02237dfdb25a9b602a7b6dd49665c96e8e890rtoy@google.com vmov.f32 x3i, t0i 21088b02237dfdb25a9b602a7b6dd49665c96e8e890rtoy@google.com .endif 21188b02237dfdb25a9b602a7b6dd49665c96e8e890rtoy@google.com 21288b02237dfdb25a9b602a7b6dd49665c96e8e890rtoy@google.com vldm pSrc, {x0r, x0i} @// data[0] 21388b02237dfdb25a9b602a7b6dd49665c96e8e890rtoy@google.com 21488b02237dfdb25a9b602a7b6dd49665c96e8e890rtoy@google.com @// finish first stage of 4 point FFT 21588b02237dfdb25a9b602a7b6dd49665c96e8e890rtoy@google.com vadd.f32 x0r,x0r,x2r @// x0 = x0 + x2 (u0) 21688b02237dfdb25a9b602a7b6dd49665c96e8e890rtoy@google.com vadd.f32 x0i,x0i,x2i 21788b02237dfdb25a9b602a7b6dd49665c96e8e890rtoy@google.com 21888b02237dfdb25a9b602a7b6dd49665c96e8e890rtoy@google.com vadd.f32 sr, x2r, x2r 21988b02237dfdb25a9b602a7b6dd49665c96e8e890rtoy@google.com vadd.f32 si, x2i, x2i 22088b02237dfdb25a9b602a7b6dd49665c96e8e890rtoy@google.com vsub.f32 x2r,x0r,sr @// x2 = x0 - x2 (u1) 22188b02237dfdb25a9b602a7b6dd49665c96e8e890rtoy@google.com vsub.f32 x2i,x0i,si 22288b02237dfdb25a9b602a7b6dd49665c96e8e890rtoy@google.com 22388b02237dfdb25a9b602a7b6dd49665c96e8e890rtoy@google.com vadd.f32 x1r,x1r,x3r @// x1 = x1/2 + x3/2 (u2/2) 22488b02237dfdb25a9b602a7b6dd49665c96e8e890rtoy@google.com vadd.f32 x1i,x1i,x3i 22588b02237dfdb25a9b602a7b6dd49665c96e8e890rtoy@google.com 22688b02237dfdb25a9b602a7b6dd49665c96e8e890rtoy@google.com vadd.f32 sr, x3r, x3r 22788b02237dfdb25a9b602a7b6dd49665c96e8e890rtoy@google.com vadd.f32 si, x3i, x3i 22888b02237dfdb25a9b602a7b6dd49665c96e8e890rtoy@google.com vsub.f32 x3r,x1r,sr @// x3 = x1/2 - x3/2 (u3/2) 22988b02237dfdb25a9b602a7b6dd49665c96e8e890rtoy@google.com vsub.f32 x3i,x1i,si 23088b02237dfdb25a9b602a7b6dd49665c96e8e890rtoy@google.com 23188b02237dfdb25a9b602a7b6dd49665c96e8e890rtoy@google.com 23288b02237dfdb25a9b602a7b6dd49665c96e8e890rtoy@google.com @// finish second stage of 4 point FFT 23388b02237dfdb25a9b602a7b6dd49665c96e8e890rtoy@google.com 23488b02237dfdb25a9b602a7b6dd49665c96e8e890rtoy@google.com @// y0 = u1-u2 since twiddle's are stored as -ve values 23588b02237dfdb25a9b602a7b6dd49665c96e8e890rtoy@google.com vsub.f32 x2r,x2r,x1r 23688b02237dfdb25a9b602a7b6dd49665c96e8e890rtoy@google.com vsub.f32 x2i,x2i,x1i 23788b02237dfdb25a9b602a7b6dd49665c96e8e890rtoy@google.com 23888b02237dfdb25a9b602a7b6dd49665c96e8e890rtoy@google.com vadd.f32 sr, x1r, x1r 23988b02237dfdb25a9b602a7b6dd49665c96e8e890rtoy@google.com vadd.f32 si, x1i, x1i 24088b02237dfdb25a9b602a7b6dd49665c96e8e890rtoy@google.com vadd.f32 x1r,x2r,sr @// y2 = u1+u2 24188b02237dfdb25a9b602a7b6dd49665c96e8e890rtoy@google.com vadd.f32 x1i,x2i,si 24288b02237dfdb25a9b602a7b6dd49665c96e8e890rtoy@google.com vstm pDst, {x2r, x2i} @// store y0 24388b02237dfdb25a9b602a7b6dd49665c96e8e890rtoy@google.com 24488b02237dfdb25a9b602a7b6dd49665c96e8e890rtoy@google.com vsub.f32 x0r,x0r,x3i @// y3 = u0+ju3 24588b02237dfdb25a9b602a7b6dd49665c96e8e890rtoy@google.com vadd.f32 x0i,x0i,x3r 24688b02237dfdb25a9b602a7b6dd49665c96e8e890rtoy@google.com 24788b02237dfdb25a9b602a7b6dd49665c96e8e890rtoy@google.com vadd.f32 sr, x3r, x3r 24888b02237dfdb25a9b602a7b6dd49665c96e8e890rtoy@google.com vadd.f32 si, x3i, x3i 24988b02237dfdb25a9b602a7b6dd49665c96e8e890rtoy@google.com vadd.f32 t2r,x0r,si @// y1 = u0-ju3 25088b02237dfdb25a9b602a7b6dd49665c96e8e890rtoy@google.com vsub.f32 t2i,x0i,sr @// t2 will be same as x2r reg 25188b02237dfdb25a9b602a7b6dd49665c96e8e890rtoy@google.com 25288b02237dfdb25a9b602a7b6dd49665c96e8e890rtoy@google.com .ifeqs "\inverse", "TRUE" 25388b02237dfdb25a9b602a7b6dd49665c96e8e890rtoy@google.com add pDst, outPointStep 25488b02237dfdb25a9b602a7b6dd49665c96e8e890rtoy@google.com vstm pDst, {t2r, t2i} @// store y1 25588b02237dfdb25a9b602a7b6dd49665c96e8e890rtoy@google.com add pDst, outPointStep 25688b02237dfdb25a9b602a7b6dd49665c96e8e890rtoy@google.com vstm pDst, {x1r, x1i} @// store y2 25788b02237dfdb25a9b602a7b6dd49665c96e8e890rtoy@google.com add pDst, outPointStep 25888b02237dfdb25a9b602a7b6dd49665c96e8e890rtoy@google.com vstm pDst, {x0r, x0i} @// store y3 25988b02237dfdb25a9b602a7b6dd49665c96e8e890rtoy@google.com sub pDst, outPointStep 26088b02237dfdb25a9b602a7b6dd49665c96e8e890rtoy@google.com .else 26188b02237dfdb25a9b602a7b6dd49665c96e8e890rtoy@google.com add pDst, outPointStep 26288b02237dfdb25a9b602a7b6dd49665c96e8e890rtoy@google.com vstm pDst, {x0r, x0i} @// store y1 26388b02237dfdb25a9b602a7b6dd49665c96e8e890rtoy@google.com add pDst, outPointStep 26488b02237dfdb25a9b602a7b6dd49665c96e8e890rtoy@google.com vstm pDst, {x1r, x1i} @// store y2 26588b02237dfdb25a9b602a7b6dd49665c96e8e890rtoy@google.com add pDst, outPointStep 26688b02237dfdb25a9b602a7b6dd49665c96e8e890rtoy@google.com vstm pDst, {t2r, t2i} @// store y3 26788b02237dfdb25a9b602a7b6dd49665c96e8e890rtoy@google.com sub pDst, outPointStep 26888b02237dfdb25a9b602a7b6dd49665c96e8e890rtoy@google.com .endif 26988b02237dfdb25a9b602a7b6dd49665c96e8e890rtoy@google.com 27088b02237dfdb25a9b602a7b6dd49665c96e8e890rtoy@google.com SUB pDst,pDst,outPointStep, LSL #1 @// reset pDst 27188b02237dfdb25a9b602a7b6dd49665c96e8e890rtoy@google.com @// update the pDst for the next grp 27288b02237dfdb25a9b602a7b6dd49665c96e8e890rtoy@google.com SUBGE pDst,pDst,pointStep 27388b02237dfdb25a9b602a7b6dd49665c96e8e890rtoy@google.com @// update the pSrc for the next grp 27488b02237dfdb25a9b602a7b6dd49665c96e8e890rtoy@google.com SUBGE pSrc,pSrc,pointStep,LSL #2 27588b02237dfdb25a9b602a7b6dd49665c96e8e890rtoy@google.com 27688b02237dfdb25a9b602a7b6dd49665c96e8e890rtoy@google.com 27788b02237dfdb25a9b602a7b6dd49665c96e8e890rtoy@google.com BGE grpLoop\name 27888b02237dfdb25a9b602a7b6dd49665c96e8e890rtoy@google.com 27988b02237dfdb25a9b602a7b6dd49665c96e8e890rtoy@google.com ADD pSrc,pSrc,#8 @// pSrc += 1; for the next set 28088b02237dfdb25a9b602a7b6dd49665c96e8e890rtoy@google.com ADD pDst,pDst,#8 @// pDst += 1; for the next set 28188b02237dfdb25a9b602a7b6dd49665c96e8e890rtoy@google.com 28288b02237dfdb25a9b602a7b6dd49665c96e8e890rtoy@google.com SUBS setCount,setCount,#1 @// decrement loop counter 28388b02237dfdb25a9b602a7b6dd49665c96e8e890rtoy@google.com 28488b02237dfdb25a9b602a7b6dd49665c96e8e890rtoy@google.com 28588b02237dfdb25a9b602a7b6dd49665c96e8e890rtoy@google.com BGT setLoop\name 28688b02237dfdb25a9b602a7b6dd49665c96e8e890rtoy@google.com 28788b02237dfdb25a9b602a7b6dd49665c96e8e890rtoy@google.com @// Reset and Swap pSrc and pDst for the next stage 28888b02237dfdb25a9b602a7b6dd49665c96e8e890rtoy@google.com MOV t1,pDst 28988b02237dfdb25a9b602a7b6dd49665c96e8e890rtoy@google.com SUB pDst,pSrc,subFFTNum,LSL #3 29088b02237dfdb25a9b602a7b6dd49665c96e8e890rtoy@google.com SUB pSrc,t1,subFFTNum,LSL #3 29188b02237dfdb25a9b602a7b6dd49665c96e8e890rtoy@google.com 29288b02237dfdb25a9b602a7b6dd49665c96e8e890rtoy@google.com .endm 29388b02237dfdb25a9b602a7b6dd49665c96e8e890rtoy@google.com 29488b02237dfdb25a9b602a7b6dd49665c96e8e890rtoy@google.com 29588b02237dfdb25a9b602a7b6dd49665c96e8e890rtoy@google.com M_START armSP_FFTFwd_CToC_FC32_Radix4_OutOfPlace_unsafe_vfp,r4 29688b02237dfdb25a9b602a7b6dd49665c96e8e890rtoy@google.com FFTSTAGE "FALSE","FALSE",FWD 29788b02237dfdb25a9b602a7b6dd49665c96e8e890rtoy@google.com M_END 29888b02237dfdb25a9b602a7b6dd49665c96e8e890rtoy@google.com 29988b02237dfdb25a9b602a7b6dd49665c96e8e890rtoy@google.com M_START armSP_FFTInv_CToC_FC32_Radix4_OutOfPlace_unsafe_vfp,r4 30088b02237dfdb25a9b602a7b6dd49665c96e8e890rtoy@google.com FFTSTAGE "FALSE","TRUE",INV 30188b02237dfdb25a9b602a7b6dd49665c96e8e890rtoy@google.com M_END 30288b02237dfdb25a9b602a7b6dd49665c96e8e890rtoy@google.com 30388b02237dfdb25a9b602a7b6dd49665c96e8e890rtoy@google.com 30488b02237dfdb25a9b602a7b6dd49665c96e8e890rtoy@google.com@// ENDIF @//ARM1136JS 30588b02237dfdb25a9b602a7b6dd49665c96e8e890rtoy@google.com 30688b02237dfdb25a9b602a7b6dd49665c96e8e890rtoy@google.com 30788b02237dfdb25a9b602a7b6dd49665c96e8e890rtoy@google.com 30888b02237dfdb25a9b602a7b6dd49665c96e8e890rtoy@google.com@// Guarding implementation by the processor name 30988b02237dfdb25a9b602a7b6dd49665c96e8e890rtoy@google.com 31088b02237dfdb25a9b602a7b6dd49665c96e8e890rtoy@google.com .end 311