annotate src/fftw-3.3.5/rdft/codelet-rdft.h @ 83:ae30d91d2ffe

Replace these with versions built using an older toolset (so as to avoid ABI compatibilities when linking on Ubuntu 14.04 for packaging purposes)
author Chris Cannam
date Fri, 07 Feb 2020 11:51:13 +0000
parents 2cd0e3b3e1fd
children
rev   line source
Chris@42 1 /*
Chris@42 2 * Copyright (c) 2003, 2007-14 Matteo Frigo
Chris@42 3 * Copyright (c) 2003, 2007-14 Massachusetts Institute of Technology
Chris@42 4 *
Chris@42 5 * This program is free software; you can redistribute it and/or modify
Chris@42 6 * it under the terms of the GNU General Public License as published by
Chris@42 7 * the Free Software Foundation; either version 2 of the License, or
Chris@42 8 * (at your option) any later version.
Chris@42 9 *
Chris@42 10 * This program is distributed in the hope that it will be useful,
Chris@42 11 * but WITHOUT ANY WARRANTY; without even the implied warranty of
Chris@42 12 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
Chris@42 13 * GNU General Public License for more details.
Chris@42 14 *
Chris@42 15 * You should have received a copy of the GNU General Public License
Chris@42 16 * along with this program; if not, write to the Free Software
Chris@42 17 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
Chris@42 18 *
Chris@42 19 */
Chris@42 20
Chris@42 21 /*
Chris@42 22 * This header file must include every file or define every
Chris@42 23 * type or macro which is required to compile a codelet.
Chris@42 24 */
Chris@42 25
Chris@42 26 #ifndef __RDFT_CODELET_H__
Chris@42 27 #define __RDFT_CODELET_H__
Chris@42 28
Chris@42 29 #include "ifftw.h"
Chris@42 30
Chris@42 31 /**************************************************************
Chris@42 32 * types of codelets
Chris@42 33 **************************************************************/
Chris@42 34
Chris@42 35 /* FOOab, with a,b in {0,1}, denotes the FOO transform
Chris@42 36 where a/b say whether the input/output are shifted by
Chris@42 37 half a sample/slot. */
Chris@42 38
Chris@42 39 typedef enum {
Chris@42 40 R2HC00, R2HC01, R2HC10, R2HC11,
Chris@42 41 HC2R00, HC2R01, HC2R10, HC2R11,
Chris@42 42 DHT,
Chris@42 43 REDFT00, REDFT01, REDFT10, REDFT11, /* real-even == DCT's */
Chris@42 44 RODFT00, RODFT01, RODFT10, RODFT11 /* real-odd == DST's */
Chris@42 45 } rdft_kind;
Chris@42 46
Chris@42 47 /* standard R2HC/HC2R transforms are unshifted */
Chris@42 48 #define R2HC R2HC00
Chris@42 49 #define HC2R HC2R00
Chris@42 50
Chris@42 51 #define R2HCII R2HC01
Chris@42 52 #define HC2RIII HC2R10
Chris@42 53
Chris@42 54 /* (k) >= R2HC00 produces a warning under gcc because checking x >= 0
Chris@42 55 is superfluous for unsigned values...but it is needed because other
Chris@42 56 compilers (e.g. icc) may define the enum to be a signed int...grrr. */
Chris@42 57 #define R2HC_KINDP(k) ((k) >= R2HC00 && (k) <= R2HC11) /* uses kr2hc_genus */
Chris@42 58 #define HC2R_KINDP(k) ((k) >= HC2R00 && (k) <= HC2R11) /* uses khc2r_genus */
Chris@42 59
Chris@42 60 #define R2R_KINDP(k) ((k) >= DHT) /* uses kr2r_genus */
Chris@42 61
Chris@42 62 #define REDFT_KINDP(k) ((k) >= REDFT00 && (k) <= REDFT11)
Chris@42 63 #define RODFT_KINDP(k) ((k) >= RODFT00 && (k) <= RODFT11)
Chris@42 64 #define REODFT_KINDP(k) ((k) >= REDFT00 && (k) <= RODFT11)
Chris@42 65
Chris@42 66 /* codelets with real input (output) and complex output (input) */
Chris@42 67 typedef struct kr2c_desc_s kr2c_desc;
Chris@42 68
Chris@42 69 typedef struct {
Chris@42 70 rdft_kind kind;
Chris@42 71 INT vl;
Chris@42 72 } kr2c_genus;
Chris@42 73
Chris@42 74 struct kr2c_desc_s {
Chris@42 75 INT n; /* size of transform computed */
Chris@42 76 const char *nam;
Chris@42 77 opcnt ops;
Chris@42 78 const kr2c_genus *genus;
Chris@42 79 };
Chris@42 80
Chris@42 81 typedef void (*kr2c) (R *R0, R *R1, R *Cr, R *Ci,
Chris@42 82 stride rs, stride csr, stride csi,
Chris@42 83 INT vl, INT ivs, INT ovs);
Chris@42 84 void X(kr2c_register)(planner *p, kr2c codelet, const kr2c_desc *desc);
Chris@42 85
Chris@42 86 /* half-complex to half-complex DIT/DIF codelets: */
Chris@42 87 typedef struct hc2hc_desc_s hc2hc_desc;
Chris@42 88
Chris@42 89 typedef struct {
Chris@42 90 rdft_kind kind;
Chris@42 91 INT vl;
Chris@42 92 } hc2hc_genus;
Chris@42 93
Chris@42 94 struct hc2hc_desc_s {
Chris@42 95 INT radix;
Chris@42 96 const char *nam;
Chris@42 97 const tw_instr *tw;
Chris@42 98 const hc2hc_genus *genus;
Chris@42 99 opcnt ops;
Chris@42 100 };
Chris@42 101
Chris@42 102 typedef void (*khc2hc) (R *rioarray, R *iioarray, const R *W,
Chris@42 103 stride rs, INT mb, INT me, INT ms);
Chris@42 104 void X(khc2hc_register)(planner *p, khc2hc codelet, const hc2hc_desc *desc);
Chris@42 105
Chris@42 106 /* half-complex to rdft2-complex DIT/DIF codelets: */
Chris@42 107 typedef struct hc2c_desc_s hc2c_desc;
Chris@42 108
Chris@42 109 typedef enum {
Chris@42 110 HC2C_VIA_RDFT,
Chris@42 111 HC2C_VIA_DFT
Chris@42 112 } hc2c_kind;
Chris@42 113
Chris@42 114 typedef struct {
Chris@42 115 int (*okp)(
Chris@42 116 const R *Rp, const R *Ip, const R *Rm, const R *Im,
Chris@42 117 INT rs, INT mb, INT me, INT ms,
Chris@42 118 const planner *plnr);
Chris@42 119 rdft_kind kind;
Chris@42 120 INT vl;
Chris@42 121 } hc2c_genus;
Chris@42 122
Chris@42 123 struct hc2c_desc_s {
Chris@42 124 INT radix;
Chris@42 125 const char *nam;
Chris@42 126 const tw_instr *tw;
Chris@42 127 const hc2c_genus *genus;
Chris@42 128 opcnt ops;
Chris@42 129 };
Chris@42 130
Chris@42 131 typedef void (*khc2c) (R *Rp, R *Ip, R *Rm, R *Im, const R *W,
Chris@42 132 stride rs, INT mb, INT me, INT ms);
Chris@42 133 void X(khc2c_register)(planner *p, khc2c codelet, const hc2c_desc *desc,
Chris@42 134 hc2c_kind hc2ckind);
Chris@42 135
Chris@42 136 extern const solvtab X(solvtab_rdft_r2cf);
Chris@42 137 extern const solvtab X(solvtab_rdft_r2cb);
Chris@42 138 extern const solvtab X(solvtab_rdft_sse2);
Chris@42 139 extern const solvtab X(solvtab_rdft_avx);
Chris@42 140 extern const solvtab X(solvtab_rdft_avx_128_fma);
Chris@42 141 extern const solvtab X(solvtab_rdft_avx2);
Chris@42 142 extern const solvtab X(solvtab_rdft_avx2_128);
Chris@42 143 extern const solvtab X(solvtab_rdft_avx512);
Chris@42 144 extern const solvtab X(solvtab_rdft_kcvi);
Chris@42 145 extern const solvtab X(solvtab_rdft_altivec);
Chris@42 146 extern const solvtab X(solvtab_rdft_vsx);
Chris@42 147 extern const solvtab X(solvtab_rdft_neon);
Chris@42 148 extern const solvtab X(solvtab_rdft_generic_simd128);
Chris@42 149 extern const solvtab X(solvtab_rdft_generic_simd256);
Chris@42 150
Chris@42 151 /* real-input & output DFT-like codelets (DHT, etc.) */
Chris@42 152 typedef struct kr2r_desc_s kr2r_desc;
Chris@42 153
Chris@42 154 typedef struct {
Chris@42 155 INT vl;
Chris@42 156 } kr2r_genus;
Chris@42 157
Chris@42 158 struct kr2r_desc_s {
Chris@42 159 INT n; /* size of transform computed */
Chris@42 160 const char *nam;
Chris@42 161 opcnt ops;
Chris@42 162 const kr2r_genus *genus;
Chris@42 163 rdft_kind kind;
Chris@42 164 };
Chris@42 165
Chris@42 166 typedef void (*kr2r) (const R *I, R *O, stride is, stride os,
Chris@42 167 INT vl, INT ivs, INT ovs);
Chris@42 168 void X(kr2r_register)(planner *p, kr2r codelet, const kr2r_desc *desc);
Chris@42 169
Chris@42 170 extern const solvtab X(solvtab_rdft_r2r);
Chris@42 171
Chris@42 172 #endif /* __RDFT_CODELET_H__ */