xref: /aosp_15_r20/external/pffft/pffft.c (revision 3f1979aa0d7ad34fcf3763de7b7b8f8cd67e5bdd)
1*3f1979aaSAndroid Build Coastguard Worker /* Copyright (c) 2013  Julien Pommier ( [email protected] )
2*3f1979aaSAndroid Build Coastguard Worker    Copyright (c) 2020  Hayati Ayguen ( [email protected] )
3*3f1979aaSAndroid Build Coastguard Worker 
4*3f1979aaSAndroid Build Coastguard Worker    Based on original fortran 77 code from FFTPACKv4 from NETLIB
5*3f1979aaSAndroid Build Coastguard Worker    (http://www.netlib.org/fftpack), authored by Dr Paul Swarztrauber
6*3f1979aaSAndroid Build Coastguard Worker    of NCAR, in 1985.
7*3f1979aaSAndroid Build Coastguard Worker 
8*3f1979aaSAndroid Build Coastguard Worker    As confirmed by the NCAR fftpack software curators, the following
9*3f1979aaSAndroid Build Coastguard Worker    FFTPACKv5 license applies to FFTPACKv4 sources. My changes are
10*3f1979aaSAndroid Build Coastguard Worker    released under the same terms.
11*3f1979aaSAndroid Build Coastguard Worker 
12*3f1979aaSAndroid Build Coastguard Worker    FFTPACK license:
13*3f1979aaSAndroid Build Coastguard Worker 
14*3f1979aaSAndroid Build Coastguard Worker    http://www.cisl.ucar.edu/css/software/fftpack5/ftpk.html
15*3f1979aaSAndroid Build Coastguard Worker 
16*3f1979aaSAndroid Build Coastguard Worker    Copyright (c) 2004 the University Corporation for Atmospheric
17*3f1979aaSAndroid Build Coastguard Worker    Research ("UCAR"). All rights reserved. Developed by NCAR's
18*3f1979aaSAndroid Build Coastguard Worker    Computational and Information Systems Laboratory, UCAR,
19*3f1979aaSAndroid Build Coastguard Worker    www.cisl.ucar.edu.
20*3f1979aaSAndroid Build Coastguard Worker 
21*3f1979aaSAndroid Build Coastguard Worker    Redistribution and use of the Software in source and binary forms,
22*3f1979aaSAndroid Build Coastguard Worker    with or without modification, is permitted provided that the
23*3f1979aaSAndroid Build Coastguard Worker    following conditions are met:
24*3f1979aaSAndroid Build Coastguard Worker 
25*3f1979aaSAndroid Build Coastguard Worker    - Neither the names of NCAR's Computational and Information Systems
26*3f1979aaSAndroid Build Coastguard Worker    Laboratory, the University Corporation for Atmospheric Research,
27*3f1979aaSAndroid Build Coastguard Worker    nor the names of its sponsors or contributors may be used to
28*3f1979aaSAndroid Build Coastguard Worker    endorse or promote products derived from this Software without
29*3f1979aaSAndroid Build Coastguard Worker    specific prior written permission.
30*3f1979aaSAndroid Build Coastguard Worker 
31*3f1979aaSAndroid Build Coastguard Worker    - Redistributions of source code must retain the above copyright
32*3f1979aaSAndroid Build Coastguard Worker    notices, this list of conditions, and the disclaimer below.
33*3f1979aaSAndroid Build Coastguard Worker 
34*3f1979aaSAndroid Build Coastguard Worker    - Redistributions in binary form must reproduce the above copyright
35*3f1979aaSAndroid Build Coastguard Worker    notice, this list of conditions, and the disclaimer below in the
36*3f1979aaSAndroid Build Coastguard Worker    documentation and/or other materials provided with the
37*3f1979aaSAndroid Build Coastguard Worker    distribution.
38*3f1979aaSAndroid Build Coastguard Worker 
39*3f1979aaSAndroid Build Coastguard Worker    THIS SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
40*3f1979aaSAndroid Build Coastguard Worker    EXPRESS OR IMPLIED, INCLUDING, BUT NOT LIMITED TO THE WARRANTIES OF
41*3f1979aaSAndroid Build Coastguard Worker    MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
42*3f1979aaSAndroid Build Coastguard Worker    NONINFRINGEMENT. IN NO EVENT SHALL THE CONTRIBUTORS OR COPYRIGHT
43*3f1979aaSAndroid Build Coastguard Worker    HOLDERS BE LIABLE FOR ANY CLAIM, INDIRECT, INCIDENTAL, SPECIAL,
44*3f1979aaSAndroid Build Coastguard Worker    EXEMPLARY, OR CONSEQUENTIAL DAMAGES OR OTHER LIABILITY, WHETHER IN AN
45*3f1979aaSAndroid Build Coastguard Worker    ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
46*3f1979aaSAndroid Build Coastguard Worker    CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS WITH THE
47*3f1979aaSAndroid Build Coastguard Worker    SOFTWARE.
48*3f1979aaSAndroid Build Coastguard Worker 
49*3f1979aaSAndroid Build Coastguard Worker 
50*3f1979aaSAndroid Build Coastguard Worker    PFFFT : a Pretty Fast FFT.
51*3f1979aaSAndroid Build Coastguard Worker 
52*3f1979aaSAndroid Build Coastguard Worker    This file is largerly based on the original FFTPACK implementation, modified in
53*3f1979aaSAndroid Build Coastguard Worker    order to take advantage of SIMD instructions of modern CPUs.
54*3f1979aaSAndroid Build Coastguard Worker */
55*3f1979aaSAndroid Build Coastguard Worker 
56*3f1979aaSAndroid Build Coastguard Worker /*
57*3f1979aaSAndroid Build Coastguard Worker   ChangeLog:
58*3f1979aaSAndroid Build Coastguard Worker   - 2011/10/02, version 1: This is the very first release of this file.
59*3f1979aaSAndroid Build Coastguard Worker */
60*3f1979aaSAndroid Build Coastguard Worker 
61*3f1979aaSAndroid Build Coastguard Worker #include "pffft.h"
62*3f1979aaSAndroid Build Coastguard Worker 
63*3f1979aaSAndroid Build Coastguard Worker /* detect compiler flavour */
64*3f1979aaSAndroid Build Coastguard Worker #if defined(_MSC_VER)
65*3f1979aaSAndroid Build Coastguard Worker #  define COMPILER_MSVC
66*3f1979aaSAndroid Build Coastguard Worker #elif defined(__GNUC__)
67*3f1979aaSAndroid Build Coastguard Worker #  define COMPILER_GCC
68*3f1979aaSAndroid Build Coastguard Worker #endif
69*3f1979aaSAndroid Build Coastguard Worker 
70*3f1979aaSAndroid Build Coastguard Worker #include <stdlib.h>
71*3f1979aaSAndroid Build Coastguard Worker #include <stdint.h>
72*3f1979aaSAndroid Build Coastguard Worker #include <stdio.h>
73*3f1979aaSAndroid Build Coastguard Worker #include <math.h>
74*3f1979aaSAndroid Build Coastguard Worker #include <assert.h>
75*3f1979aaSAndroid Build Coastguard Worker 
76*3f1979aaSAndroid Build Coastguard Worker #if defined(COMPILER_GCC)
77*3f1979aaSAndroid Build Coastguard Worker #  define ALWAYS_INLINE(return_type) inline return_type __attribute__ ((always_inline))
78*3f1979aaSAndroid Build Coastguard Worker #  define NEVER_INLINE(return_type) return_type __attribute__ ((noinline))
79*3f1979aaSAndroid Build Coastguard Worker #  define RESTRICT __restrict
80*3f1979aaSAndroid Build Coastguard Worker #  define VLA_ARRAY_ON_STACK(type__, varname__, size__) type__ varname__[size__];
81*3f1979aaSAndroid Build Coastguard Worker #elif defined(COMPILER_MSVC)
82*3f1979aaSAndroid Build Coastguard Worker #  define ALWAYS_INLINE(return_type) __forceinline return_type
83*3f1979aaSAndroid Build Coastguard Worker #  define NEVER_INLINE(return_type) __declspec(noinline) return_type
84*3f1979aaSAndroid Build Coastguard Worker #  define RESTRICT __restrict
85*3f1979aaSAndroid Build Coastguard Worker #  define VLA_ARRAY_ON_STACK(type__, varname__, size__) type__ *varname__ = (type__*)_alloca(size__ * sizeof(type__))
86*3f1979aaSAndroid Build Coastguard Worker #endif
87*3f1979aaSAndroid Build Coastguard Worker 
88*3f1979aaSAndroid Build Coastguard Worker 
89*3f1979aaSAndroid Build Coastguard Worker #ifdef COMPILER_MSVC
90*3f1979aaSAndroid Build Coastguard Worker #pragma warning( disable : 4244 4305 4204 4456 )
91*3f1979aaSAndroid Build Coastguard Worker #endif
92*3f1979aaSAndroid Build Coastguard Worker 
93*3f1979aaSAndroid Build Coastguard Worker /*
94*3f1979aaSAndroid Build Coastguard Worker    vector support macros: the rest of the code is independant of
95*3f1979aaSAndroid Build Coastguard Worker    SSE/Altivec/NEON -- adding support for other platforms with 4-element
96*3f1979aaSAndroid Build Coastguard Worker    vectors should be limited to these macros
97*3f1979aaSAndroid Build Coastguard Worker */
98*3f1979aaSAndroid Build Coastguard Worker #include "simd/pf_float.h"
99*3f1979aaSAndroid Build Coastguard Worker 
100*3f1979aaSAndroid Build Coastguard Worker /* have code comparable with this definition */
101*3f1979aaSAndroid Build Coastguard Worker #define SETUP_STRUCT               PFFFT_Setup
102*3f1979aaSAndroid Build Coastguard Worker #define FUNC_NEW_SETUP             pffft_new_setup
103*3f1979aaSAndroid Build Coastguard Worker #define FUNC_DESTROY               pffft_destroy_setup
104*3f1979aaSAndroid Build Coastguard Worker #define FUNC_TRANSFORM_UNORDRD     pffft_transform
105*3f1979aaSAndroid Build Coastguard Worker #define FUNC_TRANSFORM_ORDERED     pffft_transform_ordered
106*3f1979aaSAndroid Build Coastguard Worker #define FUNC_ZREORDER              pffft_zreorder
107*3f1979aaSAndroid Build Coastguard Worker #define FUNC_ZCONVOLVE_ACCUMULATE  pffft_zconvolve_accumulate
108*3f1979aaSAndroid Build Coastguard Worker #define FUNC_ZCONVOLVE_NO_ACCU     pffft_zconvolve_no_accu
109*3f1979aaSAndroid Build Coastguard Worker 
110*3f1979aaSAndroid Build Coastguard Worker #define FUNC_ALIGNED_MALLOC        pffft_aligned_malloc
111*3f1979aaSAndroid Build Coastguard Worker #define FUNC_ALIGNED_FREE          pffft_aligned_free
112*3f1979aaSAndroid Build Coastguard Worker #define FUNC_SIMD_SIZE             pffft_simd_size
113*3f1979aaSAndroid Build Coastguard Worker #define FUNC_SIMD_ARCH             pffft_simd_arch
114*3f1979aaSAndroid Build Coastguard Worker #define FUNC_VALIDATE_SIMD_A       validate_pffft_simd
115*3f1979aaSAndroid Build Coastguard Worker #define FUNC_VALIDATE_SIMD_EX      validate_pffft_simd_ex
116*3f1979aaSAndroid Build Coastguard Worker 
117*3f1979aaSAndroid Build Coastguard Worker #define FUNC_CPLX_FINALIZE         pffft_cplx_finalize
118*3f1979aaSAndroid Build Coastguard Worker #define FUNC_CPLX_PREPROCESS       pffft_cplx_preprocess
119*3f1979aaSAndroid Build Coastguard Worker #define FUNC_REAL_PREPROCESS_4X4   pffft_real_preprocess_4x4
120*3f1979aaSAndroid Build Coastguard Worker #define FUNC_REAL_PREPROCESS       pffft_real_preprocess
121*3f1979aaSAndroid Build Coastguard Worker #define FUNC_REAL_FINALIZE_4X4     pffft_real_finalize_4x4
122*3f1979aaSAndroid Build Coastguard Worker #define FUNC_REAL_FINALIZE         pffft_real_finalize
123*3f1979aaSAndroid Build Coastguard Worker #define FUNC_TRANSFORM_INTERNAL    pffft_transform_internal
124*3f1979aaSAndroid Build Coastguard Worker 
125*3f1979aaSAndroid Build Coastguard Worker #define FUNC_COS  cosf
126*3f1979aaSAndroid Build Coastguard Worker #define FUNC_SIN  sinf
127*3f1979aaSAndroid Build Coastguard Worker 
128*3f1979aaSAndroid Build Coastguard Worker 
129*3f1979aaSAndroid Build Coastguard Worker #include "pffft_priv_impl.h"
130*3f1979aaSAndroid Build Coastguard Worker 
131*3f1979aaSAndroid Build Coastguard Worker 
132