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