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