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