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