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