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:  armSP_FFT_CToC_SC32_Radix2_ls_unsafe_s.s
1699b31ea5d0f4629ceddf4852f96757c9c73654artoy@google.com@// OpenMAX DL: v1.0.2
1799b31ea5d0f4629ceddf4852f96757c9c73654artoy@google.com@// Last Modified Revision:   7493
1899b31ea5d0f4629ceddf4852f96757c9c73654artoy@google.com@// Last Modified Date:       Mon, 24 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 the last stage of a Radix 2 DIT in-order out-of-place FFT
2699b31ea5d0f4629ceddf4852f96757c9c73654artoy@google.com@// stage for a N point complex signal.
2799b31ea5d0f4629ceddf4852f96757c9c73654artoy@google.com@//
2899b31ea5d0f4629ceddf4852f96757c9c73654artoy@google.com
2999b31ea5d0f4629ceddf4852f96757c9c73654artoy@google.com
3099b31ea5d0f4629ceddf4852f96757c9c73654artoy@google.com
3199b31ea5d0f4629ceddf4852f96757c9c73654artoy@google.com@// Include standard headers
3299b31ea5d0f4629ceddf4852f96757c9c73654artoy@google.com
33bdf981cb383b7ec472ee86d2fedb53937285f894rtoy@google.com#include "dl/api/arm/armCOMM_s.h"
34bdf981cb383b7ec472ee86d2fedb53937285f894rtoy@google.com#include "dl/api/arm/omxtypes_s.h"
3599b31ea5d0f4629ceddf4852f96757c9c73654artoy@google.com
3699b31ea5d0f4629ceddf4852f96757c9c73654artoy@google.com
3799b31ea5d0f4629ceddf4852f96757c9c73654artoy@google.com@// Import symbols required from other files
3899b31ea5d0f4629ceddf4852f96757c9c73654artoy@google.com@// (For example tables)
3999b31ea5d0f4629ceddf4852f96757c9c73654artoy@google.com
4099b31ea5d0f4629ceddf4852f96757c9c73654artoy@google.com
4199b31ea5d0f4629ceddf4852f96757c9c73654artoy@google.com
4299b31ea5d0f4629ceddf4852f96757c9c73654artoy@google.com
4399b31ea5d0f4629ceddf4852f96757c9c73654artoy@google.com@// Set debugging level
4499b31ea5d0f4629ceddf4852f96757c9c73654artoy@google.com@//DEBUG_ON    SETL {TRUE}
4599b31ea5d0f4629ceddf4852f96757c9c73654artoy@google.com
4699b31ea5d0f4629ceddf4852f96757c9c73654artoy@google.com
4799b31ea5d0f4629ceddf4852f96757c9c73654artoy@google.com@// Guarding implementation by the processor name
4899b31ea5d0f4629ceddf4852f96757c9c73654artoy@google.com
4999b31ea5d0f4629ceddf4852f96757c9c73654artoy@google.com
5099b31ea5d0f4629ceddf4852f96757c9c73654artoy@google.com@//Input Registers
5199b31ea5d0f4629ceddf4852f96757c9c73654artoy@google.com
5299b31ea5d0f4629ceddf4852f96757c9c73654artoy@google.com#define pSrc		r0
5399b31ea5d0f4629ceddf4852f96757c9c73654artoy@google.com#define pDst		r2
5499b31ea5d0f4629ceddf4852f96757c9c73654artoy@google.com#define pTwiddle	r1
5599b31ea5d0f4629ceddf4852f96757c9c73654artoy@google.com#define subFFTNum	r6
5699b31ea5d0f4629ceddf4852f96757c9c73654artoy@google.com#define subFFTSize	r7
5799b31ea5d0f4629ceddf4852f96757c9c73654artoy@google.com
5899b31ea5d0f4629ceddf4852f96757c9c73654artoy@google.com
5999b31ea5d0f4629ceddf4852f96757c9c73654artoy@google.com@//Output Registers
6099b31ea5d0f4629ceddf4852f96757c9c73654artoy@google.com
6199b31ea5d0f4629ceddf4852f96757c9c73654artoy@google.com
6299b31ea5d0f4629ceddf4852f96757c9c73654artoy@google.com@//Local Scratch Registers
6399b31ea5d0f4629ceddf4852f96757c9c73654artoy@google.com
6499b31ea5d0f4629ceddf4852f96757c9c73654artoy@google.com
6599b31ea5d0f4629ceddf4852f96757c9c73654artoy@google.com#define outPointStep	r3
6699b31ea5d0f4629ceddf4852f96757c9c73654artoy@google.com#define grpCount	r4
6799b31ea5d0f4629ceddf4852f96757c9c73654artoy@google.com#define dstStep		r5
6899b31ea5d0f4629ceddf4852f96757c9c73654artoy@google.com#define pTmp		r4
6999b31ea5d0f4629ceddf4852f96757c9c73654artoy@google.com
7099b31ea5d0f4629ceddf4852f96757c9c73654artoy@google.com@// Neon Registers
7199b31ea5d0f4629ceddf4852f96757c9c73654artoy@google.com
7299b31ea5d0f4629ceddf4852f96757c9c73654artoy@google.com#define dWr	D0.S32
7399b31ea5d0f4629ceddf4852f96757c9c73654artoy@google.com#define dWi	d1.s32
7499b31ea5d0f4629ceddf4852f96757c9c73654artoy@google.com#define dXr0	d2.s32
7599b31ea5d0f4629ceddf4852f96757c9c73654artoy@google.com#define dXi0	d3.s32
7699b31ea5d0f4629ceddf4852f96757c9c73654artoy@google.com#define dXr1	d4.s32
7799b31ea5d0f4629ceddf4852f96757c9c73654artoy@google.com#define dXi1	d5.s32
7899b31ea5d0f4629ceddf4852f96757c9c73654artoy@google.com#define dYr0	d6.s32
7999b31ea5d0f4629ceddf4852f96757c9c73654artoy@google.com#define dYi0	d7.s32
8099b31ea5d0f4629ceddf4852f96757c9c73654artoy@google.com#define dYr1	d8.s32
8199b31ea5d0f4629ceddf4852f96757c9c73654artoy@google.com#define dYi1	d9.s32
8299b31ea5d0f4629ceddf4852f96757c9c73654artoy@google.com#define qT0	q5.s64
8399b31ea5d0f4629ceddf4852f96757c9c73654artoy@google.com#define qT1	q6.s64
8499b31ea5d0f4629ceddf4852f96757c9c73654artoy@google.com
8599b31ea5d0f4629ceddf4852f96757c9c73654artoy@google.com        .macro FFTSTAGE scaled, inverse, name
8699b31ea5d0f4629ceddf4852f96757c9c73654artoy@google.com
8799b31ea5d0f4629ceddf4852f96757c9c73654artoy@google.com
8899b31ea5d0f4629ceddf4852f96757c9c73654artoy@google.com        MOV     outPointStep,subFFTSize,LSL #3
8999b31ea5d0f4629ceddf4852f96757c9c73654artoy@google.com        @// Update grpCount and grpSize rightaway
9099b31ea5d0f4629ceddf4852f96757c9c73654artoy@google.com
9199b31ea5d0f4629ceddf4852f96757c9c73654artoy@google.com        MOV     subFFTNum,#1                            @//after the last stage
9299b31ea5d0f4629ceddf4852f96757c9c73654artoy@google.com        LSL     grpCount,subFFTSize,#1
9399b31ea5d0f4629ceddf4852f96757c9c73654artoy@google.com
9499b31ea5d0f4629ceddf4852f96757c9c73654artoy@google.com        @// update subFFTSize for the next stage
9599b31ea5d0f4629ceddf4852f96757c9c73654artoy@google.com        MOV     subFFTSize,grpCount
9699b31ea5d0f4629ceddf4852f96757c9c73654artoy@google.com
9799b31ea5d0f4629ceddf4852f96757c9c73654artoy@google.com        RSB      dstStep,outPointStep,#16
9899b31ea5d0f4629ceddf4852f96757c9c73654artoy@google.com
9999b31ea5d0f4629ceddf4852f96757c9c73654artoy@google.com
10099b31ea5d0f4629ceddf4852f96757c9c73654artoy@google.com        @// Loop on 2 grps at a time for the last stage
10199b31ea5d0f4629ceddf4852f96757c9c73654artoy@google.com
10299b31ea5d0f4629ceddf4852f96757c9c73654artoy@google.comgrpLoop\name :
10399b31ea5d0f4629ceddf4852f96757c9c73654artoy@google.com        VLD2    {dWr,dWi},[pTwiddle :64]!
10499b31ea5d0f4629ceddf4852f96757c9c73654artoy@google.com
10599b31ea5d0f4629ceddf4852f96757c9c73654artoy@google.com        VLD4    {dXr0,dXi0,dXr1,dXi1},[pSrc :128]!
10699b31ea5d0f4629ceddf4852f96757c9c73654artoy@google.com        SUBS    grpCount,grpCount,#4                   @// grpCount is multiplied by 2
10799b31ea5d0f4629ceddf4852f96757c9c73654artoy@google.com
10899b31ea5d0f4629ceddf4852f96757c9c73654artoy@google.com        .ifeqs  "\inverse", "TRUE"
10999b31ea5d0f4629ceddf4852f96757c9c73654artoy@google.com            VMULL   qT0,dWr,dXr1
11099b31ea5d0f4629ceddf4852f96757c9c73654artoy@google.com            VMLAL   qT0,dWi,dXi1                       @// real part
11199b31ea5d0f4629ceddf4852f96757c9c73654artoy@google.com            VMULL   qT1,dWr,dXi1
11299b31ea5d0f4629ceddf4852f96757c9c73654artoy@google.com            VMLSL   qT1,dWi,dXr1                       @// imag part
11399b31ea5d0f4629ceddf4852f96757c9c73654artoy@google.com
11499b31ea5d0f4629ceddf4852f96757c9c73654artoy@google.com        .else
11599b31ea5d0f4629ceddf4852f96757c9c73654artoy@google.com
11699b31ea5d0f4629ceddf4852f96757c9c73654artoy@google.com            VMULL   qT0,dWr,dXr1
11799b31ea5d0f4629ceddf4852f96757c9c73654artoy@google.com            VMLSL   qT0,dWi,dXi1                       @// real part
11899b31ea5d0f4629ceddf4852f96757c9c73654artoy@google.com            VMULL   qT1,dWr,dXi1
11999b31ea5d0f4629ceddf4852f96757c9c73654artoy@google.com            VMLAL   qT1,dWi,dXr1                       @// imag part
12099b31ea5d0f4629ceddf4852f96757c9c73654artoy@google.com
12199b31ea5d0f4629ceddf4852f96757c9c73654artoy@google.com        .endif
12299b31ea5d0f4629ceddf4852f96757c9c73654artoy@google.com
12399b31ea5d0f4629ceddf4852f96757c9c73654artoy@google.com        VRSHRN  dXr1,qT0,#31
12499b31ea5d0f4629ceddf4852f96757c9c73654artoy@google.com        VRSHRN  dXi1,qT1,#31
12599b31ea5d0f4629ceddf4852f96757c9c73654artoy@google.com
12699b31ea5d0f4629ceddf4852f96757c9c73654artoy@google.com
12799b31ea5d0f4629ceddf4852f96757c9c73654artoy@google.com        .ifeqs "\scaled", "TRUE"
12899b31ea5d0f4629ceddf4852f96757c9c73654artoy@google.com
12999b31ea5d0f4629ceddf4852f96757c9c73654artoy@google.com            VHSUB    dYr0,dXr0,dXr1
13099b31ea5d0f4629ceddf4852f96757c9c73654artoy@google.com            VHSUB    dYi0,dXi0,dXi1
13199b31ea5d0f4629ceddf4852f96757c9c73654artoy@google.com            VHADD    dYr1,dXr0,dXr1
13299b31ea5d0f4629ceddf4852f96757c9c73654artoy@google.com            VHADD    dYi1,dXi0,dXi1
13399b31ea5d0f4629ceddf4852f96757c9c73654artoy@google.com
13499b31ea5d0f4629ceddf4852f96757c9c73654artoy@google.com        .else
13599b31ea5d0f4629ceddf4852f96757c9c73654artoy@google.com
13699b31ea5d0f4629ceddf4852f96757c9c73654artoy@google.com            VSUB    dYr0,dXr0,dXr1
13799b31ea5d0f4629ceddf4852f96757c9c73654artoy@google.com            VSUB    dYi0,dXi0,dXi1
13899b31ea5d0f4629ceddf4852f96757c9c73654artoy@google.com            VADD    dYr1,dXr0,dXr1
13999b31ea5d0f4629ceddf4852f96757c9c73654artoy@google.com            VADD    dYi1,dXi0,dXi1
14099b31ea5d0f4629ceddf4852f96757c9c73654artoy@google.com
14199b31ea5d0f4629ceddf4852f96757c9c73654artoy@google.com
14299b31ea5d0f4629ceddf4852f96757c9c73654artoy@google.com        .endif
14399b31ea5d0f4629ceddf4852f96757c9c73654artoy@google.com
14499b31ea5d0f4629ceddf4852f96757c9c73654artoy@google.com        VST2    {dYr0,dYi0},[pDst],outPointStep
14599b31ea5d0f4629ceddf4852f96757c9c73654artoy@google.com        VST2    {dYr1,dYi1},[pDst],dstStep                  @// dstStep =  step = -outPointStep + 16
14699b31ea5d0f4629ceddf4852f96757c9c73654artoy@google.com
14799b31ea5d0f4629ceddf4852f96757c9c73654artoy@google.com        bgt     grpLoop\name
14899b31ea5d0f4629ceddf4852f96757c9c73654artoy@google.com
14999b31ea5d0f4629ceddf4852f96757c9c73654artoy@google.com
15099b31ea5d0f4629ceddf4852f96757c9c73654artoy@google.com        @// Reset and Swap pSrc and pDst for the next stage
15199b31ea5d0f4629ceddf4852f96757c9c73654artoy@google.com        MOV     pTmp,pDst
15299b31ea5d0f4629ceddf4852f96757c9c73654artoy@google.com        SUB     pDst,pSrc,outPointStep,LSL #1       @// pDst -= 4*size; pSrc -= 8*size bytes
15399b31ea5d0f4629ceddf4852f96757c9c73654artoy@google.com        SUB     pSrc,pTmp,outPointStep
15499b31ea5d0f4629ceddf4852f96757c9c73654artoy@google.com
15599b31ea5d0f4629ceddf4852f96757c9c73654artoy@google.com        @// Reset pTwiddle for the next stage
15699b31ea5d0f4629ceddf4852f96757c9c73654artoy@google.com        SUB     pTwiddle,pTwiddle,outPointStep      @// pTwiddle -= 4*size bytes
15799b31ea5d0f4629ceddf4852f96757c9c73654artoy@google.com
15899b31ea5d0f4629ceddf4852f96757c9c73654artoy@google.com        .endm
15999b31ea5d0f4629ceddf4852f96757c9c73654artoy@google.com
16099b31ea5d0f4629ceddf4852f96757c9c73654artoy@google.com
16199b31ea5d0f4629ceddf4852f96757c9c73654artoy@google.com
16299b31ea5d0f4629ceddf4852f96757c9c73654artoy@google.com        M_START armSP_FFTFwd_CToC_SC32_Radix2_ls_OutOfPlace_unsafe,r4,""
16399b31ea5d0f4629ceddf4852f96757c9c73654artoy@google.com        FFTSTAGE "FALSE","FALSE",fwd
16499b31ea5d0f4629ceddf4852f96757c9c73654artoy@google.com        M_END
16599b31ea5d0f4629ceddf4852f96757c9c73654artoy@google.com
16699b31ea5d0f4629ceddf4852f96757c9c73654artoy@google.com
16799b31ea5d0f4629ceddf4852f96757c9c73654artoy@google.com
16899b31ea5d0f4629ceddf4852f96757c9c73654artoy@google.com        M_START armSP_FFTInv_CToC_SC32_Radix2_ls_OutOfPlace_unsafe,r4
16999b31ea5d0f4629ceddf4852f96757c9c73654artoy@google.com        FFTSTAGE "FALSE","TRUE",inv
17099b31ea5d0f4629ceddf4852f96757c9c73654artoy@google.com        M_END
17199b31ea5d0f4629ceddf4852f96757c9c73654artoy@google.com
17299b31ea5d0f4629ceddf4852f96757c9c73654artoy@google.com
17399b31ea5d0f4629ceddf4852f96757c9c73654artoy@google.com
17499b31ea5d0f4629ceddf4852f96757c9c73654artoy@google.com        M_START armSP_FFTFwd_CToC_SC32_Sfs_Radix2_ls_OutOfPlace_unsafe,r4
17599b31ea5d0f4629ceddf4852f96757c9c73654artoy@google.com        FFTSTAGE "TRUE","FALSE",fwdsfs
17699b31ea5d0f4629ceddf4852f96757c9c73654artoy@google.com        M_END
17799b31ea5d0f4629ceddf4852f96757c9c73654artoy@google.com
17899b31ea5d0f4629ceddf4852f96757c9c73654artoy@google.com
17999b31ea5d0f4629ceddf4852f96757c9c73654artoy@google.com
18099b31ea5d0f4629ceddf4852f96757c9c73654artoy@google.com        M_START armSP_FFTInv_CToC_SC32_Sfs_Radix2_ls_OutOfPlace_unsafe,r4
18199b31ea5d0f4629ceddf4852f96757c9c73654artoy@google.com        FFTSTAGE "TRUE","TRUE",invsfs
18299b31ea5d0f4629ceddf4852f96757c9c73654artoy@google.com        M_END
18399b31ea5d0f4629ceddf4852f96757c9c73654artoy@google.com
18499b31ea5d0f4629ceddf4852f96757c9c73654artoy@google.com	.end
185