199b31ea5d0f4629ceddf4852f96757c9c73654artoy@google.com@// 299b31ea5d0f4629ceddf4852f96757c9c73654artoy@google.com@// Copyright (c) 2013 The WebRTC project authors. All Rights Reserved. 399b31ea5d0f4629ceddf4852f96757c9c73654artoy@google.com@// 499b31ea5d0f4629ceddf4852f96757c9c73654artoy@google.com@// Use of this source code is governed by a BSD-style license 599b31ea5d0f4629ceddf4852f96757c9c73654artoy@google.com@// that can be found in the LICENSE file in the root of the source 699b31ea5d0f4629ceddf4852f96757c9c73654artoy@google.com@// tree. An additional intellectual property rights grant can be found 799b31ea5d0f4629ceddf4852f96757c9c73654artoy@google.com@// in the file PATENTS. All contributing project authors may 899b31ea5d0f4629ceddf4852f96757c9c73654artoy@google.com@// be found in the AUTHORS file in the root of the source tree. 999b31ea5d0f4629ceddf4852f96757c9c73654artoy@google.com@// 1099b31ea5d0f4629ceddf4852f96757c9c73654artoy@google.com@// This is a modification of omxSP_FFTInv_CCSToR_S32_Sfs_s.s 1199b31ea5d0f4629ceddf4852f96757c9c73654artoy@google.com@// to support float instead of SC32. 1299b31ea5d0f4629ceddf4852f96757c9c73654artoy@google.com@// 1399b31ea5d0f4629ceddf4852f96757c9c73654artoy@google.com 1499b31ea5d0f4629ceddf4852f96757c9c73654artoy@google.com@// 1599b31ea5d0f4629ceddf4852f96757c9c73654artoy@google.com@// Description: 1699b31ea5d0f4629ceddf4852f96757c9c73654artoy@google.com@// Compute an inverse FFT for a complex signal 1799b31ea5d0f4629ceddf4852f96757c9c73654artoy@google.com@// 1899b31ea5d0f4629ceddf4852f96757c9c73654artoy@google.com@// 1999b31ea5d0f4629ceddf4852f96757c9c73654artoy@google.com 2099b31ea5d0f4629ceddf4852f96757c9c73654artoy@google.com 2199b31ea5d0f4629ceddf4852f96757c9c73654artoy@google.com@// Include standard headers 2299b31ea5d0f4629ceddf4852f96757c9c73654artoy@google.com 23bdf981cb383b7ec472ee86d2fedb53937285f894rtoy@google.com#include "dl/api/arm/armCOMM_s.h" 24bdf981cb383b7ec472ee86d2fedb53937285f894rtoy@google.com#include "dl/api/arm/omxtypes_s.h" 2599b31ea5d0f4629ceddf4852f96757c9c73654artoy@google.com 2699b31ea5d0f4629ceddf4852f96757c9c73654artoy@google.com 2799b31ea5d0f4629ceddf4852f96757c9c73654artoy@google.com@// Import symbols required from other files 2899b31ea5d0f4629ceddf4852f96757c9c73654artoy@google.com@// (For example tables) 2999b31ea5d0f4629ceddf4852f96757c9c73654artoy@google.com 3099b31ea5d0f4629ceddf4852f96757c9c73654artoy@google.com .extern armSP_FFTInv_CToC_FC32_Radix2_fs_OutOfPlace_unsafe 3199b31ea5d0f4629ceddf4852f96757c9c73654artoy@google.com .extern armSP_FFTInv_CToC_FC32_Radix4_fs_OutOfPlace_unsafe 3299b31ea5d0f4629ceddf4852f96757c9c73654artoy@google.com .extern armSP_FFTInv_CToC_FC32_Radix8_fs_OutOfPlace_unsafe 3399b31ea5d0f4629ceddf4852f96757c9c73654artoy@google.com .extern armSP_FFTInv_CToC_FC32_Radix4_OutOfPlace_unsafe 3499b31ea5d0f4629ceddf4852f96757c9c73654artoy@google.com .extern armSP_FFTInv_CToC_FC32_Radix2_OutOfPlace_unsafe 3599b31ea5d0f4629ceddf4852f96757c9c73654artoy@google.com .extern armSP_FFTInv_CCSToR_F32_preTwiddleRadix2_unsafe 3699b31ea5d0f4629ceddf4852f96757c9c73654artoy@google.com 3799b31ea5d0f4629ceddf4852f96757c9c73654artoy@google.com 3899b31ea5d0f4629ceddf4852f96757c9c73654artoy@google.com@// Set debugging level 3999b31ea5d0f4629ceddf4852f96757c9c73654artoy@google.com@//DEBUG_ON SETL {TRUE} 4099b31ea5d0f4629ceddf4852f96757c9c73654artoy@google.com 4199b31ea5d0f4629ceddf4852f96757c9c73654artoy@google.com 4299b31ea5d0f4629ceddf4852f96757c9c73654artoy@google.com 4399b31ea5d0f4629ceddf4852f96757c9c73654artoy@google.com@// Guarding implementation by the processor name 4499b31ea5d0f4629ceddf4852f96757c9c73654artoy@google.com 4599b31ea5d0f4629ceddf4852f96757c9c73654artoy@google.com 4699b31ea5d0f4629ceddf4852f96757c9c73654artoy@google.com 4799b31ea5d0f4629ceddf4852f96757c9c73654artoy@google.com @// Guarding implementation by the processor name 4899b31ea5d0f4629ceddf4852f96757c9c73654artoy@google.com 4999b31ea5d0f4629ceddf4852f96757c9c73654artoy@google.com@// Import symbols required from other files 5099b31ea5d0f4629ceddf4852f96757c9c73654artoy@google.com@// (For example tables) 5199b31ea5d0f4629ceddf4852f96757c9c73654artoy@google.com .extern armSP_FFTInv_CToC_FC32_Radix4_ls_OutOfPlace_unsafe 5299b31ea5d0f4629ceddf4852f96757c9c73654artoy@google.com .extern armSP_FFTInv_CToC_FC32_Radix2_ls_OutOfPlace_unsafe 5399b31ea5d0f4629ceddf4852f96757c9c73654artoy@google.com 5499b31ea5d0f4629ceddf4852f96757c9c73654artoy@google.com 5599b31ea5d0f4629ceddf4852f96757c9c73654artoy@google.com@//Input Registers 5699b31ea5d0f4629ceddf4852f96757c9c73654artoy@google.com 5799b31ea5d0f4629ceddf4852f96757c9c73654artoy@google.com#define pSrc r0 5899b31ea5d0f4629ceddf4852f96757c9c73654artoy@google.com#define pDst r1 5999b31ea5d0f4629ceddf4852f96757c9c73654artoy@google.com#define pFFTSpec r2 6099b31ea5d0f4629ceddf4852f96757c9c73654artoy@google.com#define scale r3 6199b31ea5d0f4629ceddf4852f96757c9c73654artoy@google.com 6299b31ea5d0f4629ceddf4852f96757c9c73654artoy@google.com 6399b31ea5d0f4629ceddf4852f96757c9c73654artoy@google.com@// Output registers 6499b31ea5d0f4629ceddf4852f96757c9c73654artoy@google.com#define result r0 6599b31ea5d0f4629ceddf4852f96757c9c73654artoy@google.com 6699b31ea5d0f4629ceddf4852f96757c9c73654artoy@google.com@//Local Scratch Registers 6799b31ea5d0f4629ceddf4852f96757c9c73654artoy@google.com 6899b31ea5d0f4629ceddf4852f96757c9c73654artoy@google.com#define argTwiddle r1 6999b31ea5d0f4629ceddf4852f96757c9c73654artoy@google.com#define argDst r2 7099b31ea5d0f4629ceddf4852f96757c9c73654artoy@google.com#define argScale r4 7199b31ea5d0f4629ceddf4852f96757c9c73654artoy@google.com#define tmpOrder r4 7299b31ea5d0f4629ceddf4852f96757c9c73654artoy@google.com#define pTwiddle r4 7399b31ea5d0f4629ceddf4852f96757c9c73654artoy@google.com#define pOut r5 7499b31ea5d0f4629ceddf4852f96757c9c73654artoy@google.com#define subFFTSize r7 7599b31ea5d0f4629ceddf4852f96757c9c73654artoy@google.com#define subFFTNum r6 7699b31ea5d0f4629ceddf4852f96757c9c73654artoy@google.com#define N r6 7799b31ea5d0f4629ceddf4852f96757c9c73654artoy@google.com#define order r14 7899b31ea5d0f4629ceddf4852f96757c9c73654artoy@google.com#define diff r9 7999b31ea5d0f4629ceddf4852f96757c9c73654artoy@google.com@// Total num of radix stages required to comple the FFT 8099b31ea5d0f4629ceddf4852f96757c9c73654artoy@google.com#define count r8 8199b31ea5d0f4629ceddf4852f96757c9c73654artoy@google.com#define x0r r4 8299b31ea5d0f4629ceddf4852f96757c9c73654artoy@google.com#define x0i r5 8399b31ea5d0f4629ceddf4852f96757c9c73654artoy@google.com#define diffMinusOne r2 8499b31ea5d0f4629ceddf4852f96757c9c73654artoy@google.com#define round r3 8599b31ea5d0f4629ceddf4852f96757c9c73654artoy@google.com 8699b31ea5d0f4629ceddf4852f96757c9c73654artoy@google.com#define pOut1 r2 8799b31ea5d0f4629ceddf4852f96757c9c73654artoy@google.com#define size r7 8899b31ea5d0f4629ceddf4852f96757c9c73654artoy@google.com#define step r8 8999b31ea5d0f4629ceddf4852f96757c9c73654artoy@google.com#define step1 r9 9099b31ea5d0f4629ceddf4852f96757c9c73654artoy@google.com#define twStep r10 9199b31ea5d0f4629ceddf4852f96757c9c73654artoy@google.com#define pTwiddleTmp r11 9299b31ea5d0f4629ceddf4852f96757c9c73654artoy@google.com#define argTwiddle1 r12 9399b31ea5d0f4629ceddf4852f96757c9c73654artoy@google.com#define zero r14 9499b31ea5d0f4629ceddf4852f96757c9c73654artoy@google.com 9599b31ea5d0f4629ceddf4852f96757c9c73654artoy@google.com@// Neon registers 9699b31ea5d0f4629ceddf4852f96757c9c73654artoy@google.com 9799b31ea5d0f4629ceddf4852f96757c9c73654artoy@google.com#define dX0 D0.F32 9899b31ea5d0f4629ceddf4852f96757c9c73654artoy@google.com#define dShift D1.F32 9999b31ea5d0f4629ceddf4852f96757c9c73654artoy@google.com#define dX1 D1.F32 10099b31ea5d0f4629ceddf4852f96757c9c73654artoy@google.com#define dY0 D2.F32 10199b31ea5d0f4629ceddf4852f96757c9c73654artoy@google.com#define dY1 D3.F32 10299b31ea5d0f4629ceddf4852f96757c9c73654artoy@google.com#define dX0r D0.F32 10399b31ea5d0f4629ceddf4852f96757c9c73654artoy@google.com#define dX0i D1.F32 10499b31ea5d0f4629ceddf4852f96757c9c73654artoy@google.com#define dX1r D2.F32 10599b31ea5d0f4629ceddf4852f96757c9c73654artoy@google.com#define dX1i D3.F32 10699b31ea5d0f4629ceddf4852f96757c9c73654artoy@google.com#define dW0r D4.F32 10799b31ea5d0f4629ceddf4852f96757c9c73654artoy@google.com#define dW0i D5.F32 10899b31ea5d0f4629ceddf4852f96757c9c73654artoy@google.com#define dW1r D6.F32 10999b31ea5d0f4629ceddf4852f96757c9c73654artoy@google.com#define dW1i D7.F32 11099b31ea5d0f4629ceddf4852f96757c9c73654artoy@google.com#define dT0 D8.F32 11199b31ea5d0f4629ceddf4852f96757c9c73654artoy@google.com#define dT1 D9.F32 11299b31ea5d0f4629ceddf4852f96757c9c73654artoy@google.com#define dT2 D10.F32 11399b31ea5d0f4629ceddf4852f96757c9c73654artoy@google.com#define dT3 D11.F32 11499b31ea5d0f4629ceddf4852f96757c9c73654artoy@google.com#define qT0 d12.F32 11599b31ea5d0f4629ceddf4852f96757c9c73654artoy@google.com#define qT1 d14.F32 11699b31ea5d0f4629ceddf4852f96757c9c73654artoy@google.com#define qT2 d16.F32 11799b31ea5d0f4629ceddf4852f96757c9c73654artoy@google.com#define qT3 d18.F32 11899b31ea5d0f4629ceddf4852f96757c9c73654artoy@google.com#define dY0r D4.F32 11999b31ea5d0f4629ceddf4852f96757c9c73654artoy@google.com#define dY0i D5.F32 12099b31ea5d0f4629ceddf4852f96757c9c73654artoy@google.com#define dY1r D6.F32 12199b31ea5d0f4629ceddf4852f96757c9c73654artoy@google.com#define dY1i D7.F32 12299b31ea5d0f4629ceddf4852f96757c9c73654artoy@google.com#define dzero D20.F32 12399b31ea5d0f4629ceddf4852f96757c9c73654artoy@google.com 12499b31ea5d0f4629ceddf4852f96757c9c73654artoy@google.com#define dY2 D4.F32 12599b31ea5d0f4629ceddf4852f96757c9c73654artoy@google.com#define dY3 D5.F32 12699b31ea5d0f4629ceddf4852f96757c9c73654artoy@google.com#define dW0 D6.F32 12799b31ea5d0f4629ceddf4852f96757c9c73654artoy@google.com#define dW1 D7.F32 12899b31ea5d0f4629ceddf4852f96757c9c73654artoy@google.com#define dW0Tmp D10.F32 12999b31ea5d0f4629ceddf4852f96757c9c73654artoy@google.com#define dW1Neg D11.F32 13099b31ea5d0f4629ceddf4852f96757c9c73654artoy@google.com 13199b31ea5d0f4629ceddf4852f96757c9c73654artoy@google.com#define sN S0.S32 13299b31ea5d0f4629ceddf4852f96757c9c73654artoy@google.com#define fN S1.F32 13399b31ea5d0f4629ceddf4852f96757c9c73654artoy@google.com@// one must be the same as dScale[0]! 13499b31ea5d0f4629ceddf4852f96757c9c73654artoy@google.com#define dScale D2.F32 13599b31ea5d0f4629ceddf4852f96757c9c73654artoy@google.com#define one S4.F32 13699b31ea5d0f4629ceddf4852f96757c9c73654artoy@google.com 137f2abf62750419d4ce70b53b1b4fef405046d29f9rtoy@google.com#define qX0 Q2.F32 138f2abf62750419d4ce70b53b1b4fef405046d29f9rtoy@google.com#define qX1 Q3.F32 13999b31ea5d0f4629ceddf4852f96757c9c73654artoy@google.com 14099b31ea5d0f4629ceddf4852f96757c9c73654artoy@google.com @// Allocate stack memory required by the function 14199b31ea5d0f4629ceddf4852f96757c9c73654artoy@google.com M_ALLOC4 complexFFTSize, 4 14299b31ea5d0f4629ceddf4852f96757c9c73654artoy@google.com 14399b31ea5d0f4629ceddf4852f96757c9c73654artoy@google.com @// Write function header 14499b31ea5d0f4629ceddf4852f96757c9c73654artoy@google.com M_START omxSP_FFTInv_CCSToR_F32_Sfs,r11,d15 14599b31ea5d0f4629ceddf4852f96757c9c73654artoy@google.com 14699b31ea5d0f4629ceddf4852f96757c9c73654artoy@google.com@ Structure offsets for the FFTSpec 14799b31ea5d0f4629ceddf4852f96757c9c73654artoy@google.com .set ARMsFFTSpec_N, 0 14899b31ea5d0f4629ceddf4852f96757c9c73654artoy@google.com .set ARMsFFTSpec_pBitRev, 4 14999b31ea5d0f4629ceddf4852f96757c9c73654artoy@google.com .set ARMsFFTSpec_pTwiddle, 8 15099b31ea5d0f4629ceddf4852f96757c9c73654artoy@google.com .set ARMsFFTSpec_pBuf, 12 15199b31ea5d0f4629ceddf4852f96757c9c73654artoy@google.com 15299b31ea5d0f4629ceddf4852f96757c9c73654artoy@google.com @// Define stack arguments 15399b31ea5d0f4629ceddf4852f96757c9c73654artoy@google.com 15499b31ea5d0f4629ceddf4852f96757c9c73654artoy@google.com @// Read the size from structure and take log 15599b31ea5d0f4629ceddf4852f96757c9c73654artoy@google.com LDR N, [pFFTSpec, #ARMsFFTSpec_N] 15699b31ea5d0f4629ceddf4852f96757c9c73654artoy@google.com 15799b31ea5d0f4629ceddf4852f96757c9c73654artoy@google.com @// Read other structure parameters 15899b31ea5d0f4629ceddf4852f96757c9c73654artoy@google.com LDR pTwiddle, [pFFTSpec, #ARMsFFTSpec_pTwiddle] 15999b31ea5d0f4629ceddf4852f96757c9c73654artoy@google.com LDR pOut, [pFFTSpec, #ARMsFFTSpec_pBuf] 16099b31ea5d0f4629ceddf4852f96757c9c73654artoy@google.com 16199b31ea5d0f4629ceddf4852f96757c9c73654artoy@google.com @// N=1 Treat seperately 16299b31ea5d0f4629ceddf4852f96757c9c73654artoy@google.com CMP N,#1 16399b31ea5d0f4629ceddf4852f96757c9c73654artoy@google.com BGT sizeGreaterThanOne 16499b31ea5d0f4629ceddf4852f96757c9c73654artoy@google.com VLD1 dX0[0],[pSrc] 16599b31ea5d0f4629ceddf4852f96757c9c73654artoy@google.com VST1 dX0[0],[pDst] 16699b31ea5d0f4629ceddf4852f96757c9c73654artoy@google.com 16799b31ea5d0f4629ceddf4852f96757c9c73654artoy@google.com B End 16899b31ea5d0f4629ceddf4852f96757c9c73654artoy@google.com 16999b31ea5d0f4629ceddf4852f96757c9c73654artoy@google.comsizeGreaterThanOne: 17099b31ea5d0f4629ceddf4852f96757c9c73654artoy@google.com 17199b31ea5d0f4629ceddf4852f96757c9c73654artoy@google.com @// Call the preTwiddle Radix2 stage before doing the compledIFFT 17299b31ea5d0f4629ceddf4852f96757c9c73654artoy@google.com 17399b31ea5d0f4629ceddf4852f96757c9c73654artoy@google.com 17499b31ea5d0f4629ceddf4852f96757c9c73654artoy@google.com BL armSP_FFTInv_CCSToR_F32_preTwiddleRadix2_unsafe 17599b31ea5d0f4629ceddf4852f96757c9c73654artoy@google.com 17699b31ea5d0f4629ceddf4852f96757c9c73654artoy@google.com 17799b31ea5d0f4629ceddf4852f96757c9c73654artoy@google.comcomplexIFFT: 17899b31ea5d0f4629ceddf4852f96757c9c73654artoy@google.com 17999b31ea5d0f4629ceddf4852f96757c9c73654artoy@google.com ASR N,N,#1 @// N/2 point complex IFFT 18099b31ea5d0f4629ceddf4852f96757c9c73654artoy@google.com M_STR N, complexFFTSize @ Save N for scaling later 18199b31ea5d0f4629ceddf4852f96757c9c73654artoy@google.com ADD pSrc,pOut,N,LSL #3 @// set pSrc as pOut1 18299b31ea5d0f4629ceddf4852f96757c9c73654artoy@google.com 18399b31ea5d0f4629ceddf4852f96757c9c73654artoy@google.com CLZ order,N @// N = 2^order 18499b31ea5d0f4629ceddf4852f96757c9c73654artoy@google.com RSB order,order,#31 18599b31ea5d0f4629ceddf4852f96757c9c73654artoy@google.com MOV subFFTSize,#1 18699b31ea5d0f4629ceddf4852f96757c9c73654artoy@google.com @//MOV subFFTNum,N 18799b31ea5d0f4629ceddf4852f96757c9c73654artoy@google.com 18899b31ea5d0f4629ceddf4852f96757c9c73654artoy@google.com CMP order,#3 18999b31ea5d0f4629ceddf4852f96757c9c73654artoy@google.com BGT orderGreaterthan3 @// order > 3 19099b31ea5d0f4629ceddf4852f96757c9c73654artoy@google.com 19199b31ea5d0f4629ceddf4852f96757c9c73654artoy@google.com CMP order,#1 19299b31ea5d0f4629ceddf4852f96757c9c73654artoy@google.com BGE orderGreaterthan0 @// order > 0 19399b31ea5d0f4629ceddf4852f96757c9c73654artoy@google.com 19499b31ea5d0f4629ceddf4852f96757c9c73654artoy@google.com VLD1 dX0,[pSrc] 19599b31ea5d0f4629ceddf4852f96757c9c73654artoy@google.com VST1 dX0,[pDst] 19699b31ea5d0f4629ceddf4852f96757c9c73654artoy@google.com MOV pSrc,pDst 19799b31ea5d0f4629ceddf4852f96757c9c73654artoy@google.com BLT FFTEnd 19899b31ea5d0f4629ceddf4852f96757c9c73654artoy@google.com 19999b31ea5d0f4629ceddf4852f96757c9c73654artoy@google.comorderGreaterthan0: 20099b31ea5d0f4629ceddf4852f96757c9c73654artoy@google.com @// set the buffers appropriately for various orders 20199b31ea5d0f4629ceddf4852f96757c9c73654artoy@google.com CMP order,#2 20299b31ea5d0f4629ceddf4852f96757c9c73654artoy@google.com MOVNE argDst,pDst 20399b31ea5d0f4629ceddf4852f96757c9c73654artoy@google.com MOVEQ argDst,pOut 20499b31ea5d0f4629ceddf4852f96757c9c73654artoy@google.com @// Pass the first stage destination in RN5 20599b31ea5d0f4629ceddf4852f96757c9c73654artoy@google.com MOVEQ pOut,pDst 20699b31ea5d0f4629ceddf4852f96757c9c73654artoy@google.com MOV argTwiddle,pTwiddle 20799b31ea5d0f4629ceddf4852f96757c9c73654artoy@google.com 20899b31ea5d0f4629ceddf4852f96757c9c73654artoy@google.com BGE orderGreaterthan1 20999b31ea5d0f4629ceddf4852f96757c9c73654artoy@google.com BLLT armSP_FFTInv_CToC_FC32_Radix2_fs_OutOfPlace_unsafe @// order = 1 21099b31ea5d0f4629ceddf4852f96757c9c73654artoy@google.com B FFTEnd 21199b31ea5d0f4629ceddf4852f96757c9c73654artoy@google.com 21299b31ea5d0f4629ceddf4852f96757c9c73654artoy@google.comorderGreaterthan1: 21399b31ea5d0f4629ceddf4852f96757c9c73654artoy@google.com MOV tmpOrder,order @// tmpOrder = RN 4 21499b31ea5d0f4629ceddf4852f96757c9c73654artoy@google.com BL armSP_FFTInv_CToC_FC32_Radix2_fs_OutOfPlace_unsafe 21599b31ea5d0f4629ceddf4852f96757c9c73654artoy@google.com CMP tmpOrder,#2 21699b31ea5d0f4629ceddf4852f96757c9c73654artoy@google.com BLGT armSP_FFTInv_CToC_FC32_Radix2_OutOfPlace_unsafe 21799b31ea5d0f4629ceddf4852f96757c9c73654artoy@google.com BL armSP_FFTInv_CToC_FC32_Radix2_ls_OutOfPlace_unsafe 21899b31ea5d0f4629ceddf4852f96757c9c73654artoy@google.com B FFTEnd 21999b31ea5d0f4629ceddf4852f96757c9c73654artoy@google.com 22099b31ea5d0f4629ceddf4852f96757c9c73654artoy@google.com 22199b31ea5d0f4629ceddf4852f96757c9c73654artoy@google.comorderGreaterthan3: 22299b31ea5d0f4629ceddf4852f96757c9c73654artoy@google.comspecialScaleCase: 22399b31ea5d0f4629ceddf4852f96757c9c73654artoy@google.com 22499b31ea5d0f4629ceddf4852f96757c9c73654artoy@google.com @// Set input args to fft stages 22599b31ea5d0f4629ceddf4852f96757c9c73654artoy@google.com TST order, #2 22699b31ea5d0f4629ceddf4852f96757c9c73654artoy@google.com MOVNE argDst,pDst 22799b31ea5d0f4629ceddf4852f96757c9c73654artoy@google.com MOVEQ argDst,pOut 22899b31ea5d0f4629ceddf4852f96757c9c73654artoy@google.com @// Pass the first stage destination in RN5 22999b31ea5d0f4629ceddf4852f96757c9c73654artoy@google.com MOVEQ pOut,pDst 23099b31ea5d0f4629ceddf4852f96757c9c73654artoy@google.com MOV argTwiddle,pTwiddle 23199b31ea5d0f4629ceddf4852f96757c9c73654artoy@google.com 23299b31ea5d0f4629ceddf4852f96757c9c73654artoy@google.com @//check for even or odd order 23399b31ea5d0f4629ceddf4852f96757c9c73654artoy@google.com @// NOTE: The following combination of BL's would work fine even though 23499b31ea5d0f4629ceddf4852f96757c9c73654artoy@google.com @// the first BL would corrupt the flags. This is because the end of 23599b31ea5d0f4629ceddf4852f96757c9c73654artoy@google.com @// the "grpZeroSetLoop" loop inside 23699b31ea5d0f4629ceddf4852f96757c9c73654artoy@google.com @// armSP_FFTInv_CToC_FC32_Radix4_fs_OutOfPlace_unsafe sets the Z flag 23799b31ea5d0f4629ceddf4852f96757c9c73654artoy@google.com @// to EQ 23899b31ea5d0f4629ceddf4852f96757c9c73654artoy@google.com 23999b31ea5d0f4629ceddf4852f96757c9c73654artoy@google.com TST order,#0x00000001 24099b31ea5d0f4629ceddf4852f96757c9c73654artoy@google.com BLEQ armSP_FFTInv_CToC_FC32_Radix4_fs_OutOfPlace_unsafe 24199b31ea5d0f4629ceddf4852f96757c9c73654artoy@google.com BLNE armSP_FFTInv_CToC_FC32_Radix8_fs_OutOfPlace_unsafe 24299b31ea5d0f4629ceddf4852f96757c9c73654artoy@google.com 24399b31ea5d0f4629ceddf4852f96757c9c73654artoy@google.com CMP subFFTNum,#4 24499b31ea5d0f4629ceddf4852f96757c9c73654artoy@google.com BLT FFTEnd 24599b31ea5d0f4629ceddf4852f96757c9c73654artoy@google.com 24699b31ea5d0f4629ceddf4852f96757c9c73654artoy@google.com 24799b31ea5d0f4629ceddf4852f96757c9c73654artoy@google.comunscaledRadix4Loop: 24899b31ea5d0f4629ceddf4852f96757c9c73654artoy@google.com BEQ lastStageUnscaledRadix4 24999b31ea5d0f4629ceddf4852f96757c9c73654artoy@google.com BL armSP_FFTInv_CToC_FC32_Radix4_OutOfPlace_unsafe 25099b31ea5d0f4629ceddf4852f96757c9c73654artoy@google.com CMP subFFTNum,#4 25199b31ea5d0f4629ceddf4852f96757c9c73654artoy@google.com B unscaledRadix4Loop 25299b31ea5d0f4629ceddf4852f96757c9c73654artoy@google.com 25399b31ea5d0f4629ceddf4852f96757c9c73654artoy@google.comlastStageUnscaledRadix4: 25499b31ea5d0f4629ceddf4852f96757c9c73654artoy@google.com BL armSP_FFTInv_CToC_FC32_Radix4_ls_OutOfPlace_unsafe 25599b31ea5d0f4629ceddf4852f96757c9c73654artoy@google.com B FFTEnd 25699b31ea5d0f4629ceddf4852f96757c9c73654artoy@google.com 25799b31ea5d0f4629ceddf4852f96757c9c73654artoy@google.comFFTEnd: @// Does only the scaling 25899b31ea5d0f4629ceddf4852f96757c9c73654artoy@google.com @ Scale inverse FFT result by 1/N 25999b31ea5d0f4629ceddf4852f96757c9c73654artoy@google.com 26099b31ea5d0f4629ceddf4852f96757c9c73654artoy@google.com M_LDR N, complexFFTSize 26199b31ea5d0f4629ceddf4852f96757c9c73654artoy@google.com VMOV sN,N 26299b31ea5d0f4629ceddf4852f96757c9c73654artoy@google.com VCVT fN, sN @ fn = fftSize, as a float 26399b31ea5d0f4629ceddf4852f96757c9c73654artoy@google.com VMOV one, 1.0 26499b31ea5d0f4629ceddf4852f96757c9c73654artoy@google.com VDIV one, one, fN @ one = dScale[0] = 1 / fftSize 26599b31ea5d0f4629ceddf4852f96757c9c73654artoy@google.com 26699b31ea5d0f4629ceddf4852f96757c9c73654artoy@google.com 267f2abf62750419d4ce70b53b1b4fef405046d29f9rtoy@google.com @// subFFTSize = N = complexFFTSize, which is always even and 268f2abf62750419d4ce70b53b1b4fef405046d29f9rtoy@google.com @// greater than 0. 269f2abf62750419d4ce70b53b1b4fef405046d29f9rtoy@google.com CMP subFFTSize, #4 270f2abf62750419d4ce70b53b1b4fef405046d29f9rtoy@google.com BLT scaleFFTData1 27199b31ea5d0f4629ceddf4852f96757c9c73654artoy@google.comscaleFFTData: 272f2abf62750419d4ce70b53b1b4fef405046d29f9rtoy@google.com @// Scale 4 complex (8 float) elements at a time 273f2abf62750419d4ce70b53b1b4fef405046d29f9rtoy@google.com VLD1 {qX0, qX1}, [pSrc :256] @// pSrc contains pDst pointer 274f2abf62750419d4ce70b53b1b4fef405046d29f9rtoy@google.com SUBS subFFTSize, subFFTSize, #4 275f2abf62750419d4ce70b53b1b4fef405046d29f9rtoy@google.com VMUL qX0, qX0, dScale[0] 276f2abf62750419d4ce70b53b1b4fef405046d29f9rtoy@google.com VMUL qX1, qX1, dScale[0] 277f2abf62750419d4ce70b53b1b4fef405046d29f9rtoy@google.com VST1 {qX0, qX1}, [pSrc :256]! 27899b31ea5d0f4629ceddf4852f96757c9c73654artoy@google.com 27999b31ea5d0f4629ceddf4852f96757c9c73654artoy@google.com BGT scaleFFTData 280f2abf62750419d4ce70b53b1b4fef405046d29f9rtoy@google.comscaleFFTData1: 281f2abf62750419d4ce70b53b1b4fef405046d29f9rtoy@google.com CMP subFFTSize, #2 282f2abf62750419d4ce70b53b1b4fef405046d29f9rtoy@google.com BLT End 283f2abf62750419d4ce70b53b1b4fef405046d29f9rtoy@google.com VLD1 {qX0}, [pSrc] 284f2abf62750419d4ce70b53b1b4fef405046d29f9rtoy@google.com VMUL qX0, qX0, dScale[0] 285f2abf62750419d4ce70b53b1b4fef405046d29f9rtoy@google.com VST1 {qX0}, [pSrc]! 28699b31ea5d0f4629ceddf4852f96757c9c73654artoy@google.comEnd: 28799b31ea5d0f4629ceddf4852f96757c9c73654artoy@google.com @// Set return value 28899b31ea5d0f4629ceddf4852f96757c9c73654artoy@google.com MOV result, #OMX_Sts_NoErr 28999b31ea5d0f4629ceddf4852f96757c9c73654artoy@google.com 29099b31ea5d0f4629ceddf4852f96757c9c73654artoy@google.com @// Write function tail 29199b31ea5d0f4629ceddf4852f96757c9c73654artoy@google.com M_END 29299b31ea5d0f4629ceddf4852f96757c9c73654artoy@google.com 29399b31ea5d0f4629ceddf4852f96757c9c73654artoy@google.com 29499b31ea5d0f4629ceddf4852f96757c9c73654artoy@google.com 29599b31ea5d0f4629ceddf4852f96757c9c73654artoy@google.com .end 296