annotate src/fftw-3.3.8/genfft/gen_r2cb.ml @ 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 d0c2a83c1364
children
rev   line source
Chris@82 1 (*
Chris@82 2 * Copyright (c) 1997-1999 Massachusetts Institute of Technology
Chris@82 3 * Copyright (c) 2003, 2007-14 Matteo Frigo
Chris@82 4 * Copyright (c) 2003, 2007-14 Massachusetts Institute of Technology
Chris@82 5 *
Chris@82 6 * This program is free software; you can redistribute it and/or modify
Chris@82 7 * it under the terms of the GNU General Public License as published by
Chris@82 8 * the Free Software Foundation; either version 2 of the License, or
Chris@82 9 * (at your option) any later version.
Chris@82 10 *
Chris@82 11 * This program is distributed in the hope that it will be useful,
Chris@82 12 * but WITHOUT ANY WARRANTY; without even the implied warranty of
Chris@82 13 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
Chris@82 14 * GNU General Public License for more details.
Chris@82 15 *
Chris@82 16 * You should have received a copy of the GNU General Public License
Chris@82 17 * along with this program; if not, write to the Free Software
Chris@82 18 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
Chris@82 19 *
Chris@82 20 *)
Chris@82 21
Chris@82 22 open Util
Chris@82 23 open Genutil
Chris@82 24 open C
Chris@82 25
Chris@82 26
Chris@82 27 let usage = "Usage: " ^ Sys.argv.(0) ^ " -n <number>"
Chris@82 28
Chris@82 29 let urs = ref Stride_variable
Chris@82 30 let ucsr = ref Stride_variable
Chris@82 31 let ucsi = ref Stride_variable
Chris@82 32 let uivs = ref Stride_variable
Chris@82 33 let uovs = ref Stride_variable
Chris@82 34 let dftIII_flag = ref false
Chris@82 35
Chris@82 36 let speclist = [
Chris@82 37 "-with-rs",
Chris@82 38 Arg.String(fun x -> urs := arg_to_stride x),
Chris@82 39 " specialize for given real-array stride";
Chris@82 40
Chris@82 41 "-with-csr",
Chris@82 42 Arg.String(fun x -> ucsr := arg_to_stride x),
Chris@82 43 " specialize for given complex-array real stride";
Chris@82 44
Chris@82 45 "-with-csi",
Chris@82 46 Arg.String(fun x -> ucsi := arg_to_stride x),
Chris@82 47 " specialize for given complex-array imaginary stride";
Chris@82 48
Chris@82 49 "-with-ivs",
Chris@82 50 Arg.String(fun x -> uivs := arg_to_stride x),
Chris@82 51 " specialize for given input vector stride";
Chris@82 52
Chris@82 53 "-with-ovs",
Chris@82 54 Arg.String(fun x -> uovs := arg_to_stride x),
Chris@82 55 " specialize for given output vector stride";
Chris@82 56
Chris@82 57 "-dft-III",
Chris@82 58 Arg.Unit(fun () -> dftIII_flag := true),
Chris@82 59 " produce shifted dftIII-style codelets"
Chris@82 60 ]
Chris@82 61
Chris@82 62 let hcdftIII sign n input =
Chris@82 63 let input' i =
Chris@82 64 if (i mod 2 == 0) then
Chris@82 65 Complex.zero
Chris@82 66 else
Chris@82 67 let i' = (i - 1) / 2 in
Chris@82 68 if (2 * i' < n - 1) then (input i')
Chris@82 69 else if (2 * i' == n - 1) then
Chris@82 70 Complex.real (input i')
Chris@82 71 else
Chris@82 72 Complex.conj (input (n - 1 - i'))
Chris@82 73 in Fft.dft sign (2 * n) input'
Chris@82 74
Chris@82 75 let generate n =
Chris@82 76 let ar0 = "R0" and ar1 = "R1" and acr = "Cr" and aci = "Ci"
Chris@82 77 and rs = "rs" and csr = "csr" and csi = "csi"
Chris@82 78 and i = "i" and v = "v"
Chris@82 79 and transform = if !dftIII_flag then hcdftIII else Trig.hdft
Chris@82 80 in
Chris@82 81
Chris@82 82 let sign = !Genutil.sign
Chris@82 83 and name = !Magic.codelet_name in
Chris@82 84
Chris@82 85 let vrs = either_stride (!urs) (C.SVar rs)
Chris@82 86 and vcsr = either_stride (!ucsr) (C.SVar csr)
Chris@82 87 and vcsi = either_stride (!ucsi) (C.SVar csi)
Chris@82 88 in
Chris@82 89
Chris@82 90 let sovs = stride_to_string "ovs" !uovs in
Chris@82 91 let sivs = stride_to_string "ivs" !uivs in
Chris@82 92
Chris@82 93 let locations = unique_array_c n in
Chris@82 94 let input =
Chris@82 95 locative_array_c n
Chris@82 96 (C.array_subscript acr vcsr)
Chris@82 97 (C.array_subscript aci vcsi)
Chris@82 98 locations sivs in
Chris@82 99 let output = transform sign n (load_array_hc n input) in
Chris@82 100 let oloce =
Chris@82 101 locative_array_c n
Chris@82 102 (C.array_subscript ar0 vrs)
Chris@82 103 (C.array_subscript "BUG" vrs)
Chris@82 104 locations sovs
Chris@82 105 and oloco =
Chris@82 106 locative_array_c n
Chris@82 107 (C.array_subscript ar1 vrs)
Chris@82 108 (C.array_subscript "BUG" vrs)
Chris@82 109 locations sovs in
Chris@82 110 let oloc i = if i mod 2 == 0 then oloce (i/2) else oloco ((i-1)/2) in
Chris@82 111 let odag = store_array_r n oloc output in
Chris@82 112 let annot = standard_optimizer odag in
Chris@82 113
Chris@82 114 let body = Block (
Chris@82 115 [Decl ("INT", i)],
Chris@82 116 [For (Expr_assign (CVar i, CVar v),
Chris@82 117 Binop (" > ", CVar i, Integer 0),
Chris@82 118 list_to_comma
Chris@82 119 [Expr_assign (CVar i, CPlus [CVar i; CUminus (Integer 1)]);
Chris@82 120 Expr_assign (CVar ar0, CPlus [CVar ar0; CVar sovs]);
Chris@82 121 Expr_assign (CVar ar1, CPlus [CVar ar1; CVar sovs]);
Chris@82 122 Expr_assign (CVar acr, CPlus [CVar acr; CVar sivs]);
Chris@82 123 Expr_assign (CVar aci, CPlus [CVar aci; CVar sivs]);
Chris@82 124 make_volatile_stride (4*n) (CVar rs);
Chris@82 125 make_volatile_stride (4*n) (CVar csr);
Chris@82 126 make_volatile_stride (4*n) (CVar csi)
Chris@82 127 ],
Chris@82 128 Asch annot)
Chris@82 129 ])
Chris@82 130 in
Chris@82 131
Chris@82 132 let tree =
Chris@82 133 Fcn ((if !Magic.standalone then "void" else "static void"), name,
Chris@82 134 ([Decl (C.realtypep, ar0);
Chris@82 135 Decl (C.realtypep, ar1);
Chris@82 136 Decl (C.realtypep, acr);
Chris@82 137 Decl (C.realtypep, aci);
Chris@82 138 Decl (C.stridetype, rs);
Chris@82 139 Decl (C.stridetype, csr);
Chris@82 140 Decl (C.stridetype, csi);
Chris@82 141 Decl ("INT", v);
Chris@82 142 Decl ("INT", "ivs");
Chris@82 143 Decl ("INT", "ovs")]),
Chris@82 144 finalize_fcn body)
Chris@82 145
Chris@82 146 in let desc =
Chris@82 147 Printf.sprintf
Chris@82 148 "static const kr2c_desc desc = { %d, \"%s\", %s, &GENUS };\n\n"
Chris@82 149 n name (flops_of tree)
Chris@82 150
Chris@82 151 and init =
Chris@82 152 (declare_register_fcn name) ^
Chris@82 153 "{" ^
Chris@82 154 " X(kr2c_register)(p, " ^ name ^ ", &desc);\n" ^
Chris@82 155 "}\n"
Chris@82 156
Chris@82 157 in
Chris@82 158 (unparse tree) ^ "\n" ^ (if !Magic.standalone then "" else desc ^ init)
Chris@82 159
Chris@82 160
Chris@82 161 let main () =
Chris@82 162 begin
Chris@82 163 parse speclist usage;
Chris@82 164 print_string (generate (check_size ()));
Chris@82 165 end
Chris@82 166
Chris@82 167 let _ = main()