Home | History | Annotate | Download | only in neon
      1 @//
      2 @//  Copyright (c) 2013 The WebRTC project authors. All Rights Reserved.
      3 @//
      4 @//  Use of this source code is governed by a BSD-style license
      5 @//  that can be found in the LICENSE file in the root of the source
      6 @//  tree. An additional intellectual property rights grant can be found
      7 @//  in the file PATENTS.  All contributing project authors may
      8 @//  be found in the AUTHORS file in the root of the source tree.
      9 @//
     10 @//  This file was originally licensed as follows. It has been
     11 @//  relicensed with permission from the copyright holders.
     12 
     13 @//
     14 @//
     15 @// File Name:  armSP_FFT_CToC_SC32_Radix2_fs_unsafe_s.s
     16 @// OpenMAX DL: v1.0.2
     17 @// Last Modified Revision:   5995
     18 @// Last Modified Date:       Fri, 08 Jun 2007
     19 @//
     20 @// (c) Copyright 2007-2008 ARM Limited. All Rights Reserved.
     21 @//
     22 @//
     23 @//
     24 @// Description:
     25 @// Compute the first stage of a Radix 2 DIT in-order out-of-place FFT
     26 @// stage for a N point complex signal.
     27 @//
     28 
     29 
     30 @// Include standard headers
     31 
     32 #include "dl/api/arm/armCOMM_s.h"
     33 #include "dl/api/arm/omxtypes_s.h"
     34 
     35 
     36 @// Import symbols required from other files
     37 @// (For example tables)
     38 
     39 
     40 
     41 
     42 @// Set debugging level
     43 @//DEBUG_ON    SETL {TRUE}
     44 
     45 
     46 
     47 @// Guarding implementation by the processor name
     48 
     49 
     50 
     51 @// Guarding implementation by the processor name
     52 
     53 
     54 @//Input Registers
     55 
     56 #define pSrc		r0
     57 #define pDst		r2
     58 #define pTwiddle	r1
     59 #define pPingPongBuf	r5
     60 #define subFFTNum	r6
     61 #define subFFTSize	r7
     62 
     63 
     64 @//Output Registers
     65 
     66 
     67 @//Local Scratch Registers
     68 
     69 #define pointStep	r3
     70 #define outPointStep	r3
     71 #define grpSize		r4
     72 #define setCount	r4
     73 #define step		r8
     74 #define dstStep		r8
     75 
     76 @// Neon Registers
     77 
     78 #define dX0	D0.S32
     79 #define dX1	D1.S32
     80 #define dY0	D2.S32
     81 #define dY1	D3.S32
     82 
     83 
     84         .MACRO FFTSTAGE scaled, inverse, name
     85 
     86         @// Define stack arguments
     87 
     88 
     89         @// update subFFTSize and subFFTNum into RN6 and RN7 for the next stage
     90 
     91 
     92         MOV        subFFTSize,#2
     93         LSR        grpSize,subFFTNum,#1
     94         MOV        subFFTNum,grpSize
     95 
     96 
     97         @// pT0+1 increments pT0 by 8 bytes
     98         @// pT0+pointStep = increment of 8*pointStep bytes = 4*grpSize bytes
     99         @// Note: outPointStep = pointStep for firststage
    100         @// Note: setCount = grpSize/2 (reuse the updated grpSize for setCount)
    101 
    102         MOV        pointStep,grpSize,LSL #3
    103         RSB        step,pointStep,#8
    104 
    105 
    106         @// Loop on the sets for grp zero
    107 
    108 grpZeroSetLoop\name :
    109 
    110         VLD1    dX0,[pSrc],pointStep
    111         VLD1    dX1,[pSrc],step                   @// step = -pointStep + 8
    112         SUBS    setCount,setCount,#1              @// decrement the loop counter
    113 
    114         .ifeqs "\scaled", "TRUE"
    115 
    116             VHADD    dY0,dX0,dX1
    117             VHSUB    dY1,dX0,dX1
    118 
    119         .ELSE
    120 
    121             VADD    dY0,dX0,dX1
    122             VSUB    dY1,dX0,dX1
    123 
    124 
    125         .ENDIF
    126 
    127         VST1    dY0,[pDst],outPointStep
    128         VST1    dY1,[pDst],dstStep                  @// dstStep =  step = -pointStep + 8
    129 
    130         BGT     grpZeroSetLoop\name
    131 
    132 
    133         @// reset pSrc to pDst for the next stage
    134         SUB     pSrc,pDst,pointStep                     @// pDst -= 2*grpSize
    135         MOV     pDst,pPingPongBuf
    136 
    137         .endm
    138 
    139 
    140 
    141         M_START armSP_FFTFwd_CToC_SC32_Radix2_fs_OutOfPlace_unsafe,r4
    142         FFTSTAGE "FALSE","FALSE",fwd
    143         M_END
    144 
    145 
    146 
    147         M_START armSP_FFTInv_CToC_SC32_Radix2_fs_OutOfPlace_unsafe,r4
    148         FFTSTAGE "FALSE","TRUE",inv
    149         M_END
    150 
    151 
    152 
    153         M_START armSP_FFTFwd_CToC_SC32_Sfs_Radix2_fs_OutOfPlace_unsafe,r4
    154         FFTSTAGE "TRUE","FALSE",fwdsfs
    155         M_END
    156 
    157 
    158 
    159         M_START armSP_FFTInv_CToC_SC32_Sfs_Radix2_fs_OutOfPlace_unsafe,r4
    160         FFTSTAGE "TRUE","TRUE",invsfs
    161         M_END
    162 
    163 	.end
    164