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 file was originally licensed as follows. It has been 1199b31ea5d0f4629ceddf4852f96757c9c73654artoy@google.com@// relicensed with permission from the copyright holders. 1299b31ea5d0f4629ceddf4852f96757c9c73654artoy@google.com@// 1399b31ea5d0f4629ceddf4852f96757c9c73654artoy@google.com 1499b31ea5d0f4629ceddf4852f96757c9c73654artoy@google.com@// 1599b31ea5d0f4629ceddf4852f96757c9c73654artoy@google.com@// File Name: omxSP_FFTInv_CCSToR_S32_Sfs_s.s 1699b31ea5d0f4629ceddf4852f96757c9c73654artoy@google.com@// OpenMAX DL: v1.0.2 1799b31ea5d0f4629ceddf4852f96757c9c73654artoy@google.com@// Last Modified Revision: 7469 1899b31ea5d0f4629ceddf4852f96757c9c73654artoy@google.com@// Last Modified Date: Thu, 20 Sep 2007 1999b31ea5d0f4629ceddf4852f96757c9c73654artoy@google.com@// 2099b31ea5d0f4629ceddf4852f96757c9c73654artoy@google.com@// (c) Copyright 2007-2008 ARM Limited. All Rights Reserved. 2199b31ea5d0f4629ceddf4852f96757c9c73654artoy@google.com@// 2299b31ea5d0f4629ceddf4852f96757c9c73654artoy@google.com@// 2399b31ea5d0f4629ceddf4852f96757c9c73654artoy@google.com@// 2499b31ea5d0f4629ceddf4852f96757c9c73654artoy@google.com@// Description: 2599b31ea5d0f4629ceddf4852f96757c9c73654artoy@google.com@// Compute an inverse FFT for a complex signal 2699b31ea5d0f4629ceddf4852f96757c9c73654artoy@google.com@// 2799b31ea5d0f4629ceddf4852f96757c9c73654artoy@google.com 2899b31ea5d0f4629ceddf4852f96757c9c73654artoy@google.com 2999b31ea5d0f4629ceddf4852f96757c9c73654artoy@google.com 3099b31ea5d0f4629ceddf4852f96757c9c73654artoy@google.com@// Include standard headers 3199b31ea5d0f4629ceddf4852f96757c9c73654artoy@google.com 32bdf981cb383b7ec472ee86d2fedb53937285f894rtoy@google.com#include "dl/api/arm/armCOMM_s.h" 33bdf981cb383b7ec472ee86d2fedb53937285f894rtoy@google.com#include "dl/api/arm/omxtypes_s.h" 3499b31ea5d0f4629ceddf4852f96757c9c73654artoy@google.com 3599b31ea5d0f4629ceddf4852f96757c9c73654artoy@google.com 3699b31ea5d0f4629ceddf4852f96757c9c73654artoy@google.com@// Import symbols required from other files 3799b31ea5d0f4629ceddf4852f96757c9c73654artoy@google.com@// (For example tables) 3899b31ea5d0f4629ceddf4852f96757c9c73654artoy@google.com 3999b31ea5d0f4629ceddf4852f96757c9c73654artoy@google.com .extern armSP_FFTInv_CToC_SC32_Sfs_Radix2_fs_OutOfPlace_unsafe 4099b31ea5d0f4629ceddf4852f96757c9c73654artoy@google.com .extern armSP_FFTInv_CToC_SC32_Radix2_fs_OutOfPlace_unsafe 4199b31ea5d0f4629ceddf4852f96757c9c73654artoy@google.com .extern armSP_FFTInv_CToC_SC32_Radix4_fs_OutOfPlace_unsafe 4299b31ea5d0f4629ceddf4852f96757c9c73654artoy@google.com .extern armSP_FFTInv_CToC_SC32_Radix8_fs_OutOfPlace_unsafe 4399b31ea5d0f4629ceddf4852f96757c9c73654artoy@google.com .extern armSP_FFTInv_CToC_SC32_Radix4_OutOfPlace_unsafe 4499b31ea5d0f4629ceddf4852f96757c9c73654artoy@google.com .extern armSP_FFTInv_CToC_SC32_Sfs_Radix4_fs_OutOfPlace_unsafe 4599b31ea5d0f4629ceddf4852f96757c9c73654artoy@google.com .extern armSP_FFTInv_CToC_SC32_Sfs_Radix8_fs_OutOfPlace_unsafe 4699b31ea5d0f4629ceddf4852f96757c9c73654artoy@google.com .extern armSP_FFTInv_CToC_SC32_Sfs_Radix4_OutOfPlace_unsafe 4799b31ea5d0f4629ceddf4852f96757c9c73654artoy@google.com .extern armSP_FFTInv_CToC_SC32_Sfs_Radix2_OutOfPlace_unsafe 4899b31ea5d0f4629ceddf4852f96757c9c73654artoy@google.com .extern armSP_FFTInv_CToC_SC32_Radix2_OutOfPlace_unsafe 4999b31ea5d0f4629ceddf4852f96757c9c73654artoy@google.com .extern armSP_FFTInv_CCSToR_S32_Sfs_preTwiddleRadix2_unsafe 5099b31ea5d0f4629ceddf4852f96757c9c73654artoy@google.com .extern armSP_FFTInv_CCSToR_S32_preTwiddleRadix2_unsafe 5199b31ea5d0f4629ceddf4852f96757c9c73654artoy@google.com 5299b31ea5d0f4629ceddf4852f96757c9c73654artoy@google.com 5399b31ea5d0f4629ceddf4852f96757c9c73654artoy@google.com@// Set debugging level 5499b31ea5d0f4629ceddf4852f96757c9c73654artoy@google.com@//DEBUG_ON SETL {TRUE} 5599b31ea5d0f4629ceddf4852f96757c9c73654artoy@google.com 5699b31ea5d0f4629ceddf4852f96757c9c73654artoy@google.com 5799b31ea5d0f4629ceddf4852f96757c9c73654artoy@google.com 5899b31ea5d0f4629ceddf4852f96757c9c73654artoy@google.com@// Guarding implementation by the processor name 5999b31ea5d0f4629ceddf4852f96757c9c73654artoy@google.com 6099b31ea5d0f4629ceddf4852f96757c9c73654artoy@google.com 6199b31ea5d0f4629ceddf4852f96757c9c73654artoy@google.com 6299b31ea5d0f4629ceddf4852f96757c9c73654artoy@google.com @// Guarding implementation by the processor name 6399b31ea5d0f4629ceddf4852f96757c9c73654artoy@google.com 6499b31ea5d0f4629ceddf4852f96757c9c73654artoy@google.com@// Import symbols required from other files 6599b31ea5d0f4629ceddf4852f96757c9c73654artoy@google.com@// (For example tables) 6699b31ea5d0f4629ceddf4852f96757c9c73654artoy@google.com .extern armSP_FFTInv_CToC_SC32_Radix4_ls_OutOfPlace_unsafe 6799b31ea5d0f4629ceddf4852f96757c9c73654artoy@google.com .extern armSP_FFTInv_CToC_SC32_Radix2_ls_OutOfPlace_unsafe 6899b31ea5d0f4629ceddf4852f96757c9c73654artoy@google.com .extern armSP_FFTInv_CToC_SC32_Sfs_Radix2_ls_OutOfPlace_unsafe 6999b31ea5d0f4629ceddf4852f96757c9c73654artoy@google.com .extern armSP_FFTInv_CToC_SC32_Sfs_Radix4_ls_OutOfPlace_unsafe 7099b31ea5d0f4629ceddf4852f96757c9c73654artoy@google.com 7199b31ea5d0f4629ceddf4852f96757c9c73654artoy@google.com 7299b31ea5d0f4629ceddf4852f96757c9c73654artoy@google.com@//Input Registers 7399b31ea5d0f4629ceddf4852f96757c9c73654artoy@google.com 7499b31ea5d0f4629ceddf4852f96757c9c73654artoy@google.com#define pSrc r0 7599b31ea5d0f4629ceddf4852f96757c9c73654artoy@google.com#define pDst r1 7699b31ea5d0f4629ceddf4852f96757c9c73654artoy@google.com#define pFFTSpec r2 7799b31ea5d0f4629ceddf4852f96757c9c73654artoy@google.com#define scale r3 7899b31ea5d0f4629ceddf4852f96757c9c73654artoy@google.com 7999b31ea5d0f4629ceddf4852f96757c9c73654artoy@google.com 8099b31ea5d0f4629ceddf4852f96757c9c73654artoy@google.com@// Output registers 8199b31ea5d0f4629ceddf4852f96757c9c73654artoy@google.com#define result r0 8299b31ea5d0f4629ceddf4852f96757c9c73654artoy@google.com 8399b31ea5d0f4629ceddf4852f96757c9c73654artoy@google.com@//Local Scratch Registers 8499b31ea5d0f4629ceddf4852f96757c9c73654artoy@google.com 8599b31ea5d0f4629ceddf4852f96757c9c73654artoy@google.com#define argTwiddle r1 8699b31ea5d0f4629ceddf4852f96757c9c73654artoy@google.com#define argDst r2 8799b31ea5d0f4629ceddf4852f96757c9c73654artoy@google.com#define argScale r4 8899b31ea5d0f4629ceddf4852f96757c9c73654artoy@google.com#define tmpOrder r4 8999b31ea5d0f4629ceddf4852f96757c9c73654artoy@google.com#define pTwiddle r4 9099b31ea5d0f4629ceddf4852f96757c9c73654artoy@google.com#define pOut r5 9199b31ea5d0f4629ceddf4852f96757c9c73654artoy@google.com#define subFFTSize r7 9299b31ea5d0f4629ceddf4852f96757c9c73654artoy@google.com#define subFFTNum r6 9399b31ea5d0f4629ceddf4852f96757c9c73654artoy@google.com#define N r6 9499b31ea5d0f4629ceddf4852f96757c9c73654artoy@google.com#define order r14 9599b31ea5d0f4629ceddf4852f96757c9c73654artoy@google.com#define diff r9 9699b31ea5d0f4629ceddf4852f96757c9c73654artoy@google.com@// Total num of radix stages required to comple the FFT 9799b31ea5d0f4629ceddf4852f96757c9c73654artoy@google.com#define count r8 9899b31ea5d0f4629ceddf4852f96757c9c73654artoy@google.com#define x0r r4 9999b31ea5d0f4629ceddf4852f96757c9c73654artoy@google.com#define x0i r5 10099b31ea5d0f4629ceddf4852f96757c9c73654artoy@google.com#define diffMinusOne r2 10199b31ea5d0f4629ceddf4852f96757c9c73654artoy@google.com#define round r3 10299b31ea5d0f4629ceddf4852f96757c9c73654artoy@google.com 10399b31ea5d0f4629ceddf4852f96757c9c73654artoy@google.com#define pOut1 r2 10499b31ea5d0f4629ceddf4852f96757c9c73654artoy@google.com#define size r7 10599b31ea5d0f4629ceddf4852f96757c9c73654artoy@google.com#define step r8 10699b31ea5d0f4629ceddf4852f96757c9c73654artoy@google.com#define step1 r9 10799b31ea5d0f4629ceddf4852f96757c9c73654artoy@google.com#define twStep r10 10899b31ea5d0f4629ceddf4852f96757c9c73654artoy@google.com#define pTwiddleTmp r11 10999b31ea5d0f4629ceddf4852f96757c9c73654artoy@google.com#define argTwiddle1 r12 11099b31ea5d0f4629ceddf4852f96757c9c73654artoy@google.com#define zero r14 11199b31ea5d0f4629ceddf4852f96757c9c73654artoy@google.com 11299b31ea5d0f4629ceddf4852f96757c9c73654artoy@google.com@// Neon registers 11399b31ea5d0f4629ceddf4852f96757c9c73654artoy@google.com 11499b31ea5d0f4629ceddf4852f96757c9c73654artoy@google.com#define dX0 D0.S32 11599b31ea5d0f4629ceddf4852f96757c9c73654artoy@google.com#define dShift D1.S32 11699b31ea5d0f4629ceddf4852f96757c9c73654artoy@google.com#define dX1 D1.S32 11799b31ea5d0f4629ceddf4852f96757c9c73654artoy@google.com#define dY0 D2.S32 11899b31ea5d0f4629ceddf4852f96757c9c73654artoy@google.com#define dY1 D3.S32 11999b31ea5d0f4629ceddf4852f96757c9c73654artoy@google.com#define dX0r D0.S32 12099b31ea5d0f4629ceddf4852f96757c9c73654artoy@google.com#define dX0i D1.S32 12199b31ea5d0f4629ceddf4852f96757c9c73654artoy@google.com#define dX1r D2.S32 12299b31ea5d0f4629ceddf4852f96757c9c73654artoy@google.com#define dX1i D3.S32 12399b31ea5d0f4629ceddf4852f96757c9c73654artoy@google.com#define dW0r D4.S32 12499b31ea5d0f4629ceddf4852f96757c9c73654artoy@google.com#define dW0i D5.S32 12599b31ea5d0f4629ceddf4852f96757c9c73654artoy@google.com#define dW1r D6.S32 12699b31ea5d0f4629ceddf4852f96757c9c73654artoy@google.com#define dW1i D7.S32 12799b31ea5d0f4629ceddf4852f96757c9c73654artoy@google.com#define dT0 D8.S32 12899b31ea5d0f4629ceddf4852f96757c9c73654artoy@google.com#define dT1 D9.S32 12999b31ea5d0f4629ceddf4852f96757c9c73654artoy@google.com#define dT2 D10.S32 13099b31ea5d0f4629ceddf4852f96757c9c73654artoy@google.com#define dT3 D11.S32 13199b31ea5d0f4629ceddf4852f96757c9c73654artoy@google.com#define qT0 Q6.S64 13299b31ea5d0f4629ceddf4852f96757c9c73654artoy@google.com#define qT1 Q7.S64 13399b31ea5d0f4629ceddf4852f96757c9c73654artoy@google.com#define qT2 Q8.S64 13499b31ea5d0f4629ceddf4852f96757c9c73654artoy@google.com#define qT3 Q9.S64 13599b31ea5d0f4629ceddf4852f96757c9c73654artoy@google.com#define dY0r D4.S32 13699b31ea5d0f4629ceddf4852f96757c9c73654artoy@google.com#define dY0i D5.S32 13799b31ea5d0f4629ceddf4852f96757c9c73654artoy@google.com#define dY1r D6.S32 13899b31ea5d0f4629ceddf4852f96757c9c73654artoy@google.com#define dY1i D7.S32 13999b31ea5d0f4629ceddf4852f96757c9c73654artoy@google.com#define dzero D20.S32 14099b31ea5d0f4629ceddf4852f96757c9c73654artoy@google.com 14199b31ea5d0f4629ceddf4852f96757c9c73654artoy@google.com#define dY2 D4.S32 14299b31ea5d0f4629ceddf4852f96757c9c73654artoy@google.com#define dY3 D5.S32 14399b31ea5d0f4629ceddf4852f96757c9c73654artoy@google.com#define dW0 D6.S32 14499b31ea5d0f4629ceddf4852f96757c9c73654artoy@google.com#define dW1 D7.S32 14599b31ea5d0f4629ceddf4852f96757c9c73654artoy@google.com#define dW0Tmp D10.S32 14699b31ea5d0f4629ceddf4852f96757c9c73654artoy@google.com#define dW1Neg D11.S32 14799b31ea5d0f4629ceddf4852f96757c9c73654artoy@google.com 14899b31ea5d0f4629ceddf4852f96757c9c73654artoy@google.com 14999b31ea5d0f4629ceddf4852f96757c9c73654artoy@google.com 15099b31ea5d0f4629ceddf4852f96757c9c73654artoy@google.com @// Allocate stack memory required by the function 15199b31ea5d0f4629ceddf4852f96757c9c73654artoy@google.com M_ALLOC4 diffOnStack, 4 15299b31ea5d0f4629ceddf4852f96757c9c73654artoy@google.com 15399b31ea5d0f4629ceddf4852f96757c9c73654artoy@google.com @// Write function header 15499b31ea5d0f4629ceddf4852f96757c9c73654artoy@google.com M_START omxSP_FFTInv_CCSToR_S32_Sfs,r11,d15 15599b31ea5d0f4629ceddf4852f96757c9c73654artoy@google.com 15699b31ea5d0f4629ceddf4852f96757c9c73654artoy@google.com@ Structure offsets for the FFTSpec 15799b31ea5d0f4629ceddf4852f96757c9c73654artoy@google.com .set ARMsFFTSpec_N, 0 15899b31ea5d0f4629ceddf4852f96757c9c73654artoy@google.com .set ARMsFFTSpec_pBitRev, 4 15999b31ea5d0f4629ceddf4852f96757c9c73654artoy@google.com .set ARMsFFTSpec_pTwiddle, 8 16099b31ea5d0f4629ceddf4852f96757c9c73654artoy@google.com .set ARMsFFTSpec_pBuf, 12 16199b31ea5d0f4629ceddf4852f96757c9c73654artoy@google.com 16299b31ea5d0f4629ceddf4852f96757c9c73654artoy@google.com @// Define stack arguments 16399b31ea5d0f4629ceddf4852f96757c9c73654artoy@google.com 16499b31ea5d0f4629ceddf4852f96757c9c73654artoy@google.com @// Read the size from structure and take log 16599b31ea5d0f4629ceddf4852f96757c9c73654artoy@google.com LDR N, [pFFTSpec, #ARMsFFTSpec_N] 16699b31ea5d0f4629ceddf4852f96757c9c73654artoy@google.com 16799b31ea5d0f4629ceddf4852f96757c9c73654artoy@google.com @// Read other structure parameters 16899b31ea5d0f4629ceddf4852f96757c9c73654artoy@google.com LDR pTwiddle, [pFFTSpec, #ARMsFFTSpec_pTwiddle] 16999b31ea5d0f4629ceddf4852f96757c9c73654artoy@google.com LDR pOut, [pFFTSpec, #ARMsFFTSpec_pBuf] 17099b31ea5d0f4629ceddf4852f96757c9c73654artoy@google.com 17199b31ea5d0f4629ceddf4852f96757c9c73654artoy@google.com @// N=1 Treat seperately 17299b31ea5d0f4629ceddf4852f96757c9c73654artoy@google.com CMP N,#1 17399b31ea5d0f4629ceddf4852f96757c9c73654artoy@google.com BGT sizeGreaterThanOne 17499b31ea5d0f4629ceddf4852f96757c9c73654artoy@google.com VLD1 dX0[0],[pSrc] 17599b31ea5d0f4629ceddf4852f96757c9c73654artoy@google.com RSB scale,scale,#0 @// to use VRSHL for right shift by a variable 17699b31ea5d0f4629ceddf4852f96757c9c73654artoy@google.com VMOV dShift[0],scale 17799b31ea5d0f4629ceddf4852f96757c9c73654artoy@google.com VRSHL dX0,dShift 17899b31ea5d0f4629ceddf4852f96757c9c73654artoy@google.com VST1 dX0[0],[pDst] 17999b31ea5d0f4629ceddf4852f96757c9c73654artoy@google.com 18099b31ea5d0f4629ceddf4852f96757c9c73654artoy@google.com B End 18199b31ea5d0f4629ceddf4852f96757c9c73654artoy@google.com 18299b31ea5d0f4629ceddf4852f96757c9c73654artoy@google.comsizeGreaterThanOne: 18399b31ea5d0f4629ceddf4852f96757c9c73654artoy@google.com 18499b31ea5d0f4629ceddf4852f96757c9c73654artoy@google.com @// Call the preTwiddle Radix2 stage before doing the compledIFFT 18599b31ea5d0f4629ceddf4852f96757c9c73654artoy@google.com 18699b31ea5d0f4629ceddf4852f96757c9c73654artoy@google.com @// The following conditional BL combination would work since 18799b31ea5d0f4629ceddf4852f96757c9c73654artoy@google.com @// evenOddButterflyLoop in the first call would set Z flag to zero 18899b31ea5d0f4629ceddf4852f96757c9c73654artoy@google.com 18999b31ea5d0f4629ceddf4852f96757c9c73654artoy@google.com CMP scale,#0 19099b31ea5d0f4629ceddf4852f96757c9c73654artoy@google.com BLEQ armSP_FFTInv_CCSToR_S32_preTwiddleRadix2_unsafe 19199b31ea5d0f4629ceddf4852f96757c9c73654artoy@google.com BLGT armSP_FFTInv_CCSToR_S32_Sfs_preTwiddleRadix2_unsafe 19299b31ea5d0f4629ceddf4852f96757c9c73654artoy@google.com 19399b31ea5d0f4629ceddf4852f96757c9c73654artoy@google.com 19499b31ea5d0f4629ceddf4852f96757c9c73654artoy@google.com 19599b31ea5d0f4629ceddf4852f96757c9c73654artoy@google.comcomplexIFFT: 19699b31ea5d0f4629ceddf4852f96757c9c73654artoy@google.com 19799b31ea5d0f4629ceddf4852f96757c9c73654artoy@google.com ASR N,N,#1 @// N/2 point complex IFFT 19899b31ea5d0f4629ceddf4852f96757c9c73654artoy@google.com ADD pSrc,pOut,N,LSL #3 @// set pSrc as pOut1 19999b31ea5d0f4629ceddf4852f96757c9c73654artoy@google.com 20099b31ea5d0f4629ceddf4852f96757c9c73654artoy@google.com CLZ order,N @// N = 2^order 20199b31ea5d0f4629ceddf4852f96757c9c73654artoy@google.com RSB order,order,#31 20299b31ea5d0f4629ceddf4852f96757c9c73654artoy@google.com MOV subFFTSize,#1 20399b31ea5d0f4629ceddf4852f96757c9c73654artoy@google.com @//MOV subFFTNum,N 20499b31ea5d0f4629ceddf4852f96757c9c73654artoy@google.com 20599b31ea5d0f4629ceddf4852f96757c9c73654artoy@google.com ADD scale,scale,order @// FFTInverse has a final scaling factor by N 20699b31ea5d0f4629ceddf4852f96757c9c73654artoy@google.com 20799b31ea5d0f4629ceddf4852f96757c9c73654artoy@google.com CMP order,#3 20899b31ea5d0f4629ceddf4852f96757c9c73654artoy@google.com BGT orderGreaterthan3 @// order > 3 20999b31ea5d0f4629ceddf4852f96757c9c73654artoy@google.com 21099b31ea5d0f4629ceddf4852f96757c9c73654artoy@google.com CMP order,#1 21199b31ea5d0f4629ceddf4852f96757c9c73654artoy@google.com BGE orderGreaterthan0 @// order > 0 21299b31ea5d0f4629ceddf4852f96757c9c73654artoy@google.com M_STR scale, diffOnStack,LT @// order = 0 21399b31ea5d0f4629ceddf4852f96757c9c73654artoy@google.com VLD1 dX0,[pSrc] 21499b31ea5d0f4629ceddf4852f96757c9c73654artoy@google.com VST1 dX0,[pDst] 21599b31ea5d0f4629ceddf4852f96757c9c73654artoy@google.com MOV pSrc,pDst 21699b31ea5d0f4629ceddf4852f96757c9c73654artoy@google.com BLT FFTEnd 21799b31ea5d0f4629ceddf4852f96757c9c73654artoy@google.com 21899b31ea5d0f4629ceddf4852f96757c9c73654artoy@google.comorderGreaterthan0: 21999b31ea5d0f4629ceddf4852f96757c9c73654artoy@google.com @// set the buffers appropriately for various orders 22099b31ea5d0f4629ceddf4852f96757c9c73654artoy@google.com CMP order,#2 22199b31ea5d0f4629ceddf4852f96757c9c73654artoy@google.com MOVNE argDst,pDst 22299b31ea5d0f4629ceddf4852f96757c9c73654artoy@google.com MOVEQ argDst,pOut 22399b31ea5d0f4629ceddf4852f96757c9c73654artoy@google.com MOVEQ pOut,pDst @// Pass the first stage destination in RN5 22499b31ea5d0f4629ceddf4852f96757c9c73654artoy@google.com MOV argTwiddle,pTwiddle 22599b31ea5d0f4629ceddf4852f96757c9c73654artoy@google.com @// Store the scale factor and scale at the end 22699b31ea5d0f4629ceddf4852f96757c9c73654artoy@google.com SUB diff,scale,order 22799b31ea5d0f4629ceddf4852f96757c9c73654artoy@google.com M_STR diff, diffOnStack 22899b31ea5d0f4629ceddf4852f96757c9c73654artoy@google.com BGE orderGreaterthan1 22999b31ea5d0f4629ceddf4852f96757c9c73654artoy@google.com BLLT armSP_FFTInv_CToC_SC32_Sfs_Radix2_fs_OutOfPlace_unsafe @// order = 1 23099b31ea5d0f4629ceddf4852f96757c9c73654artoy@google.com B FFTEnd 23199b31ea5d0f4629ceddf4852f96757c9c73654artoy@google.com 23299b31ea5d0f4629ceddf4852f96757c9c73654artoy@google.comorderGreaterthan1: 23399b31ea5d0f4629ceddf4852f96757c9c73654artoy@google.com MOV tmpOrder,order @// tmpOrder = RN 4 23499b31ea5d0f4629ceddf4852f96757c9c73654artoy@google.com BL armSP_FFTInv_CToC_SC32_Sfs_Radix2_fs_OutOfPlace_unsafe 23599b31ea5d0f4629ceddf4852f96757c9c73654artoy@google.com CMP tmpOrder,#2 23699b31ea5d0f4629ceddf4852f96757c9c73654artoy@google.com BLGT armSP_FFTInv_CToC_SC32_Sfs_Radix2_OutOfPlace_unsafe 23799b31ea5d0f4629ceddf4852f96757c9c73654artoy@google.com BL armSP_FFTInv_CToC_SC32_Sfs_Radix2_ls_OutOfPlace_unsafe 23899b31ea5d0f4629ceddf4852f96757c9c73654artoy@google.com B FFTEnd 23999b31ea5d0f4629ceddf4852f96757c9c73654artoy@google.com 24099b31ea5d0f4629ceddf4852f96757c9c73654artoy@google.com 24199b31ea5d0f4629ceddf4852f96757c9c73654artoy@google.comorderGreaterthan3: 24299b31ea5d0f4629ceddf4852f96757c9c73654artoy@google.com @// check scale = 0 or scale = order 24399b31ea5d0f4629ceddf4852f96757c9c73654artoy@google.com SUBS diff, scale, order @// scale > order 24499b31ea5d0f4629ceddf4852f96757c9c73654artoy@google.com MOVGT scale,order 24599b31ea5d0f4629ceddf4852f96757c9c73654artoy@google.com BGE specialScaleCase @// scale = 0 or scale = order 24699b31ea5d0f4629ceddf4852f96757c9c73654artoy@google.com CMP scale,#0 24799b31ea5d0f4629ceddf4852f96757c9c73654artoy@google.com BEQ specialScaleCase 24899b31ea5d0f4629ceddf4852f96757c9c73654artoy@google.com B generalScaleCase 24999b31ea5d0f4629ceddf4852f96757c9c73654artoy@google.com 25099b31ea5d0f4629ceddf4852f96757c9c73654artoy@google.comspecialScaleCase: @// scale = 0 or scale = order and order >= 2 25199b31ea5d0f4629ceddf4852f96757c9c73654artoy@google.com 25299b31ea5d0f4629ceddf4852f96757c9c73654artoy@google.com TST order, #2 @// Set input args to fft stages 25399b31ea5d0f4629ceddf4852f96757c9c73654artoy@google.com MOVNE argDst,pDst 25499b31ea5d0f4629ceddf4852f96757c9c73654artoy@google.com MOVEQ argDst,pOut 25599b31ea5d0f4629ceddf4852f96757c9c73654artoy@google.com MOVEQ pOut,pDst @// Pass the first stage destination in RN5 25699b31ea5d0f4629ceddf4852f96757c9c73654artoy@google.com MOV argTwiddle,pTwiddle 25799b31ea5d0f4629ceddf4852f96757c9c73654artoy@google.com 25899b31ea5d0f4629ceddf4852f96757c9c73654artoy@google.com CMP diff,#0 25999b31ea5d0f4629ceddf4852f96757c9c73654artoy@google.com M_STR diff, diffOnStack 26099b31ea5d0f4629ceddf4852f96757c9c73654artoy@google.com BGE scaleEqualsOrder 26199b31ea5d0f4629ceddf4852f96757c9c73654artoy@google.com 26299b31ea5d0f4629ceddf4852f96757c9c73654artoy@google.com @//check for even or odd order 26399b31ea5d0f4629ceddf4852f96757c9c73654artoy@google.com @// NOTE: The following combination of BL's would work fine eventhough the first 26499b31ea5d0f4629ceddf4852f96757c9c73654artoy@google.com @// BL would corrupt the flags. This is because the end of the "grpZeroSetLoop" loop inside 26599b31ea5d0f4629ceddf4852f96757c9c73654artoy@google.com @// armSP_FFTInv_CToC_SC32_Radix4_fs_OutOfPlace_unsafe sets the Z flag to EQ 26699b31ea5d0f4629ceddf4852f96757c9c73654artoy@google.com 26799b31ea5d0f4629ceddf4852f96757c9c73654artoy@google.com TST order,#0x00000001 26899b31ea5d0f4629ceddf4852f96757c9c73654artoy@google.com BLEQ armSP_FFTInv_CToC_SC32_Radix4_fs_OutOfPlace_unsafe 26999b31ea5d0f4629ceddf4852f96757c9c73654artoy@google.com BLNE armSP_FFTInv_CToC_SC32_Radix8_fs_OutOfPlace_unsafe 27099b31ea5d0f4629ceddf4852f96757c9c73654artoy@google.com 27199b31ea5d0f4629ceddf4852f96757c9c73654artoy@google.com CMP subFFTNum,#4 27299b31ea5d0f4629ceddf4852f96757c9c73654artoy@google.com BLT FFTEnd 27399b31ea5d0f4629ceddf4852f96757c9c73654artoy@google.com 27499b31ea5d0f4629ceddf4852f96757c9c73654artoy@google.com 27599b31ea5d0f4629ceddf4852f96757c9c73654artoy@google.comunscaledRadix4Loop: 27699b31ea5d0f4629ceddf4852f96757c9c73654artoy@google.com BEQ lastStageUnscaledRadix4 27799b31ea5d0f4629ceddf4852f96757c9c73654artoy@google.com BL armSP_FFTInv_CToC_SC32_Radix4_OutOfPlace_unsafe 27899b31ea5d0f4629ceddf4852f96757c9c73654artoy@google.com CMP subFFTNum,#4 27999b31ea5d0f4629ceddf4852f96757c9c73654artoy@google.com B unscaledRadix4Loop 28099b31ea5d0f4629ceddf4852f96757c9c73654artoy@google.com 28199b31ea5d0f4629ceddf4852f96757c9c73654artoy@google.comlastStageUnscaledRadix4: 28299b31ea5d0f4629ceddf4852f96757c9c73654artoy@google.com BL armSP_FFTInv_CToC_SC32_Radix4_ls_OutOfPlace_unsafe 28399b31ea5d0f4629ceddf4852f96757c9c73654artoy@google.com B FFTEnd 28499b31ea5d0f4629ceddf4852f96757c9c73654artoy@google.com 28599b31ea5d0f4629ceddf4852f96757c9c73654artoy@google.com 28699b31ea5d0f4629ceddf4852f96757c9c73654artoy@google.comscaleEqualsOrder: 28799b31ea5d0f4629ceddf4852f96757c9c73654artoy@google.com @//check for even or odd order 28899b31ea5d0f4629ceddf4852f96757c9c73654artoy@google.com @// NOTE: The following combination of BL's would work fine eventhough the first 28999b31ea5d0f4629ceddf4852f96757c9c73654artoy@google.com @// BL would corrupt the flags. This is because the end of the "grpZeroSetLoop" loop inside 29099b31ea5d0f4629ceddf4852f96757c9c73654artoy@google.com @// armSP_FFTInv_CToC_SC32_Radix4_fs_OutOfPlace_unsafe sets the Z flag to EQ 29199b31ea5d0f4629ceddf4852f96757c9c73654artoy@google.com 29299b31ea5d0f4629ceddf4852f96757c9c73654artoy@google.com TST order,#0x00000001 29399b31ea5d0f4629ceddf4852f96757c9c73654artoy@google.com BLEQ armSP_FFTInv_CToC_SC32_Sfs_Radix4_fs_OutOfPlace_unsafe 29499b31ea5d0f4629ceddf4852f96757c9c73654artoy@google.com BLNE armSP_FFTInv_CToC_SC32_Sfs_Radix8_fs_OutOfPlace_unsafe 29599b31ea5d0f4629ceddf4852f96757c9c73654artoy@google.com 29699b31ea5d0f4629ceddf4852f96757c9c73654artoy@google.com CMP subFFTNum,#4 29799b31ea5d0f4629ceddf4852f96757c9c73654artoy@google.com BLT FFTEnd 29899b31ea5d0f4629ceddf4852f96757c9c73654artoy@google.com 29999b31ea5d0f4629ceddf4852f96757c9c73654artoy@google.com 30099b31ea5d0f4629ceddf4852f96757c9c73654artoy@google.comscaledRadix4Loop: 30199b31ea5d0f4629ceddf4852f96757c9c73654artoy@google.com BEQ lastStageScaledRadix4 30299b31ea5d0f4629ceddf4852f96757c9c73654artoy@google.com BL armSP_FFTInv_CToC_SC32_Sfs_Radix4_OutOfPlace_unsafe 30399b31ea5d0f4629ceddf4852f96757c9c73654artoy@google.com CMP subFFTNum,#4 30499b31ea5d0f4629ceddf4852f96757c9c73654artoy@google.com B scaledRadix4Loop 30599b31ea5d0f4629ceddf4852f96757c9c73654artoy@google.com 30699b31ea5d0f4629ceddf4852f96757c9c73654artoy@google.comlastStageScaledRadix4: 30799b31ea5d0f4629ceddf4852f96757c9c73654artoy@google.com BL armSP_FFTInv_CToC_SC32_Sfs_Radix4_ls_OutOfPlace_unsafe 30899b31ea5d0f4629ceddf4852f96757c9c73654artoy@google.com B FFTEnd 30999b31ea5d0f4629ceddf4852f96757c9c73654artoy@google.com 31099b31ea5d0f4629ceddf4852f96757c9c73654artoy@google.comgeneralScaleCase: @// 0 < scale < order and order >= 2 31199b31ea5d0f4629ceddf4852f96757c9c73654artoy@google.com @// Determine the correct destination buffer 31299b31ea5d0f4629ceddf4852f96757c9c73654artoy@google.com SUB diff,order,scale 31399b31ea5d0f4629ceddf4852f96757c9c73654artoy@google.com TST diff,#0x01 31499b31ea5d0f4629ceddf4852f96757c9c73654artoy@google.com ADDEQ count,scale,diff,LSR #1 @// count = scale + (order - scale)/2 31599b31ea5d0f4629ceddf4852f96757c9c73654artoy@google.com MOVNE count,order 31699b31ea5d0f4629ceddf4852f96757c9c73654artoy@google.com TST count,#0x01 @// Is count even or odd ? 31799b31ea5d0f4629ceddf4852f96757c9c73654artoy@google.com 31899b31ea5d0f4629ceddf4852f96757c9c73654artoy@google.com MOVNE argDst,pDst @// Set input args to fft stages 31999b31ea5d0f4629ceddf4852f96757c9c73654artoy@google.com MOVEQ argDst,pOut 32099b31ea5d0f4629ceddf4852f96757c9c73654artoy@google.com MOVEQ pOut,pDst @// Pass the first stage destination in RN5 32199b31ea5d0f4629ceddf4852f96757c9c73654artoy@google.com MOV argTwiddle,pTwiddle 32299b31ea5d0f4629ceddf4852f96757c9c73654artoy@google.com 32399b31ea5d0f4629ceddf4852f96757c9c73654artoy@google.com M_STR diff, diffOnStack 32499b31ea5d0f4629ceddf4852f96757c9c73654artoy@google.com 32599b31ea5d0f4629ceddf4852f96757c9c73654artoy@google.com MOV argScale,scale @// Put scale in RN4 so as to save and restore 32699b31ea5d0f4629ceddf4852f96757c9c73654artoy@google.com BL armSP_FFTInv_CToC_SC32_Sfs_Radix2_fs_OutOfPlace_unsafe @// scaled first stage 32799b31ea5d0f4629ceddf4852f96757c9c73654artoy@google.com SUBS argScale,argScale,#1 32899b31ea5d0f4629ceddf4852f96757c9c73654artoy@google.com 32999b31ea5d0f4629ceddf4852f96757c9c73654artoy@google.comscaledRadix2Loop: 33099b31ea5d0f4629ceddf4852f96757c9c73654artoy@google.com BLGT armSP_FFTInv_CToC_SC32_Sfs_Radix2_OutOfPlace_unsafe 33199b31ea5d0f4629ceddf4852f96757c9c73654artoy@google.com SUBS argScale,argScale,#1 @// save and restore scale (RN4) in the scaled stages 33299b31ea5d0f4629ceddf4852f96757c9c73654artoy@google.com BGT scaledRadix2Loop 33399b31ea5d0f4629ceddf4852f96757c9c73654artoy@google.com 33499b31ea5d0f4629ceddf4852f96757c9c73654artoy@google.com 33599b31ea5d0f4629ceddf4852f96757c9c73654artoy@google.com M_LDR diff, diffOnStack 33699b31ea5d0f4629ceddf4852f96757c9c73654artoy@google.com @//check for even or odd order 33799b31ea5d0f4629ceddf4852f96757c9c73654artoy@google.com TST diff,#0x00000001 33899b31ea5d0f4629ceddf4852f96757c9c73654artoy@google.com BEQ generalUnscaledRadix4Loop 33999b31ea5d0f4629ceddf4852f96757c9c73654artoy@google.com B unscaledRadix2Loop 34099b31ea5d0f4629ceddf4852f96757c9c73654artoy@google.com 34199b31ea5d0f4629ceddf4852f96757c9c73654artoy@google.comgeneralUnscaledRadix4Loop: 34299b31ea5d0f4629ceddf4852f96757c9c73654artoy@google.com CMP subFFTNum,#4 34399b31ea5d0f4629ceddf4852f96757c9c73654artoy@google.com BEQ generalLastStageUnscaledRadix4 34499b31ea5d0f4629ceddf4852f96757c9c73654artoy@google.com BL armSP_FFTInv_CToC_SC32_Radix4_OutOfPlace_unsafe 34599b31ea5d0f4629ceddf4852f96757c9c73654artoy@google.com B generalUnscaledRadix4Loop 34699b31ea5d0f4629ceddf4852f96757c9c73654artoy@google.com 34799b31ea5d0f4629ceddf4852f96757c9c73654artoy@google.comgeneralLastStageUnscaledRadix4: 34899b31ea5d0f4629ceddf4852f96757c9c73654artoy@google.com BL armSP_FFTInv_CToC_SC32_Radix4_ls_OutOfPlace_unsafe 34999b31ea5d0f4629ceddf4852f96757c9c73654artoy@google.com B End 35099b31ea5d0f4629ceddf4852f96757c9c73654artoy@google.com 35199b31ea5d0f4629ceddf4852f96757c9c73654artoy@google.com 35299b31ea5d0f4629ceddf4852f96757c9c73654artoy@google.comunscaledRadix2Loop: 35399b31ea5d0f4629ceddf4852f96757c9c73654artoy@google.com CMP subFFTNum,#2 35499b31ea5d0f4629ceddf4852f96757c9c73654artoy@google.com BEQ generalLastStageUnscaledRadix2 35599b31ea5d0f4629ceddf4852f96757c9c73654artoy@google.com BL armSP_FFTInv_CToC_SC32_Radix2_OutOfPlace_unsafe 35699b31ea5d0f4629ceddf4852f96757c9c73654artoy@google.com B unscaledRadix2Loop 35799b31ea5d0f4629ceddf4852f96757c9c73654artoy@google.com 35899b31ea5d0f4629ceddf4852f96757c9c73654artoy@google.comgeneralLastStageUnscaledRadix2: 35999b31ea5d0f4629ceddf4852f96757c9c73654artoy@google.com BL armSP_FFTInv_CToC_SC32_Radix2_ls_OutOfPlace_unsafe 36099b31ea5d0f4629ceddf4852f96757c9c73654artoy@google.com B End 36199b31ea5d0f4629ceddf4852f96757c9c73654artoy@google.com 36299b31ea5d0f4629ceddf4852f96757c9c73654artoy@google.com 36399b31ea5d0f4629ceddf4852f96757c9c73654artoy@google.comFFTEnd: @// Does only the scaling 36499b31ea5d0f4629ceddf4852f96757c9c73654artoy@google.com 36599b31ea5d0f4629ceddf4852f96757c9c73654artoy@google.com M_LDR diff, diffOnStack 36699b31ea5d0f4629ceddf4852f96757c9c73654artoy@google.com CMP diff,#0 36799b31ea5d0f4629ceddf4852f96757c9c73654artoy@google.com BLE End 36899b31ea5d0f4629ceddf4852f96757c9c73654artoy@google.com 36999b31ea5d0f4629ceddf4852f96757c9c73654artoy@google.com RSB diff,diff,#0 @// to use VRSHL for right shift by a variable 37099b31ea5d0f4629ceddf4852f96757c9c73654artoy@google.com VDUP dShift,diff 37199b31ea5d0f4629ceddf4852f96757c9c73654artoy@google.com 37299b31ea5d0f4629ceddf4852f96757c9c73654artoy@google.comscaleFFTData: @// N = subFFTSize ; dataptr = pDst ; scale = diff 37399b31ea5d0f4629ceddf4852f96757c9c73654artoy@google.com VLD1 {dX0},[pSrc] @// pSrc contains pDst pointer 37499b31ea5d0f4629ceddf4852f96757c9c73654artoy@google.com SUBS subFFTSize,subFFTSize,#1 37599b31ea5d0f4629ceddf4852f96757c9c73654artoy@google.com VRSHL dX0,dShift 37699b31ea5d0f4629ceddf4852f96757c9c73654artoy@google.com VST1 {dX0},[pSrc]! 37799b31ea5d0f4629ceddf4852f96757c9c73654artoy@google.com 37899b31ea5d0f4629ceddf4852f96757c9c73654artoy@google.com BGT scaleFFTData 37999b31ea5d0f4629ceddf4852f96757c9c73654artoy@google.com 38099b31ea5d0f4629ceddf4852f96757c9c73654artoy@google.com 38199b31ea5d0f4629ceddf4852f96757c9c73654artoy@google.comEnd: 38299b31ea5d0f4629ceddf4852f96757c9c73654artoy@google.com @// Set return value 38399b31ea5d0f4629ceddf4852f96757c9c73654artoy@google.com MOV result, #OMX_Sts_NoErr 38499b31ea5d0f4629ceddf4852f96757c9c73654artoy@google.com 38599b31ea5d0f4629ceddf4852f96757c9c73654artoy@google.com @// Write function tail 38699b31ea5d0f4629ceddf4852f96757c9c73654artoy@google.com M_END 38799b31ea5d0f4629ceddf4852f96757c9c73654artoy@google.com 38899b31ea5d0f4629ceddf4852f96757c9c73654artoy@google.com 38999b31ea5d0f4629ceddf4852f96757c9c73654artoy@google.com 39099b31ea5d0f4629ceddf4852f96757c9c73654artoy@google.com .end 391