annotate src/fftw-3.3.3/genfft/gen_twiddle_c.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 37bf6b4a2645
children
rev   line source
Chris@10 1 (*
Chris@10 2 * Copyright (c) 1997-1999 Massachusetts Institute of Technology
Chris@10 3 * Copyright (c) 2003, 2007-11 Matteo Frigo
Chris@10 4 * Copyright (c) 2003, 2007-11 Massachusetts Institute of Technology
Chris@10 5 *
Chris@10 6 * This program is free software; you can redistribute it and/or modify
Chris@10 7 * it under the terms of the GNU General Public License as published by
Chris@10 8 * the Free Software Foundation; either version 2 of the License, or
Chris@10 9 * (at your option) any later version.
Chris@10 10 *
Chris@10 11 * This program is distributed in the hope that it will be useful,
Chris@10 12 * but WITHOUT ANY WARRANTY; without even the implied warranty of
Chris@10 13 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
Chris@10 14 * GNU General Public License for more details.
Chris@10 15 *
Chris@10 16 * You should have received a copy of the GNU General Public License
Chris@10 17 * along with this program; if not, write to the Free Software
Chris@10 18 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
Chris@10 19 *
Chris@10 20 *)
Chris@10 21
Chris@10 22 open Util
Chris@10 23 open Genutil
Chris@10 24 open C
Chris@10 25
Chris@10 26
Chris@10 27 type ditdif = DIT | DIF
Chris@10 28 let ditdif = ref DIT
Chris@10 29 let usage = "Usage: " ^ Sys.argv.(0) ^ " -n <number> [ -dit | -dif ]"
Chris@10 30
Chris@10 31 let urs = ref Stride_variable
Chris@10 32 let ums = ref Stride_variable
Chris@10 33
Chris@10 34 let speclist = [
Chris@10 35 "-dit",
Chris@10 36 Arg.Unit(fun () -> ditdif := DIT),
Chris@10 37 " generate a DIT codelet";
Chris@10 38
Chris@10 39 "-dif",
Chris@10 40 Arg.Unit(fun () -> ditdif := DIF),
Chris@10 41 " generate a DIF codelet";
Chris@10 42
Chris@10 43 "-with-rs",
Chris@10 44 Arg.String(fun x -> urs := arg_to_stride x),
Chris@10 45 " specialize for given i/o stride";
Chris@10 46
Chris@10 47 "-with-ms",
Chris@10 48 Arg.String(fun x -> ums := arg_to_stride x),
Chris@10 49 " specialize for given ms"
Chris@10 50 ]
Chris@10 51
Chris@10 52 let generate n =
Chris@10 53 let rioarray = "x"
Chris@10 54 and rs = "rs"
Chris@10 55 and twarray = "W"
Chris@10 56 and m = "m" and mb = "mb" and me = "me" and ms = "ms" in
Chris@10 57
Chris@10 58 let sign = !Genutil.sign
Chris@10 59 and name = !Magic.codelet_name
Chris@10 60 and byvl x = choose_simd x (ctimes (CVar "VL", x))
Chris@10 61 and bytwvl x = choose_simd x (ctimes (CVar "TWVL", x))
Chris@10 62 and bytwvl_vl x = choose_simd x (ctimes (CVar "(TWVL/VL)", x)) in
Chris@10 63 let ename = expand_name name in
Chris@10 64
Chris@10 65 let (bytwiddle, num_twiddles, twdesc) = Twiddle.twiddle_policy 0 true in
Chris@10 66 let nt = num_twiddles n in
Chris@10 67
Chris@10 68 let byw = bytwiddle n sign (twiddle_array nt twarray) in
Chris@10 69
Chris@10 70 let vrs = either_stride (!urs) (C.SVar rs) in
Chris@10 71 let sms = stride_to_string "ms" !ums in
Chris@10 72
Chris@10 73 let locations = unique_array_c n in
Chris@10 74 let iloc =
Chris@10 75 locative_array_c n
Chris@10 76 (C.array_subscript rioarray vrs)
Chris@10 77 (C.array_subscript "BUG" vrs)
Chris@10 78 locations sms
Chris@10 79 and oloc =
Chris@10 80 locative_array_c n
Chris@10 81 (C.array_subscript rioarray vrs)
Chris@10 82 (C.array_subscript "BUG" vrs)
Chris@10 83 locations sms
Chris@10 84 in
Chris@10 85 let liloc = load_array_r n iloc in
Chris@10 86 let fft = Trig.dft_via_rdft in
Chris@10 87 let output =
Chris@10 88 match !ditdif with
Chris@10 89 | DIT -> array n (fft sign n (byw liloc))
Chris@10 90 | DIF -> array n (byw (fft sign n liloc))
Chris@10 91 in
Chris@10 92 let odag = store_array_r n oloc output in
Chris@10 93 let annot = standard_optimizer odag in
Chris@10 94
Chris@10 95 let vm = CVar m and vmb = CVar mb and vme = CVar me in
Chris@10 96
Chris@10 97 let body = Block (
Chris@10 98 [Decl ("INT", m);
Chris@10 99 Decl (C.realtypep, rioarray)],
Chris@10 100 [Stmt_assign (CVar rioarray,
Chris@10 101 CVar (if (sign < 0) then "ri" else "ii"));
Chris@10 102 For (list_to_comma
Chris@10 103 [Expr_assign (vm, vmb);
Chris@10 104 Expr_assign (CVar twarray,
Chris@10 105 CPlus [CVar twarray;
Chris@10 106 ctimes (vmb,
Chris@10 107 bytwvl_vl (Integer nt))])],
Chris@10 108 Binop (" < ", vm, vme),
Chris@10 109 list_to_comma
Chris@10 110 [Expr_assign (vm, CPlus [vm; byvl (Integer 1)]);
Chris@10 111 Expr_assign (CVar rioarray, CPlus [CVar rioarray;
Chris@10 112 byvl (CVar sms)]);
Chris@10 113 Expr_assign (CVar twarray, CPlus [CVar twarray;
Chris@10 114 bytwvl (Integer nt)]);
Chris@10 115 make_volatile_stride n (CVar rs)
Chris@10 116 ],
Chris@10 117 Asch annot)])
Chris@10 118 in
Chris@10 119
Chris@10 120 let tree =
Chris@10 121 Fcn (((if !Magic.standalone then "" else "static ") ^ "void"),
Chris@10 122 ename,
Chris@10 123 [Decl (C.realtypep, "ri");
Chris@10 124 Decl (C.realtypep, "ii");
Chris@10 125 Decl (C.constrealtypep, twarray);
Chris@10 126 Decl (C.stridetype, rs);
Chris@10 127 Decl ("INT", mb);
Chris@10 128 Decl ("INT", me);
Chris@10 129 Decl ("INT", ms)],
Chris@10 130 finalize_fcn body)
Chris@10 131 in
Chris@10 132 let twinstr =
Chris@10 133 Printf.sprintf "static const tw_instr twinstr[] = %s;\n\n"
Chris@10 134 (twinstr_to_string "VL" (twdesc n))
Chris@10 135 and desc =
Chris@10 136 Printf.sprintf
Chris@10 137 "static const ct_desc desc = {%d, %s, twinstr, &GENUS, %s, %s, %s, %s};\n\n"
Chris@10 138 n (stringify name) (flops_of tree)
Chris@10 139 (stride_to_solverparm !urs) "0"
Chris@10 140 (stride_to_solverparm !ums)
Chris@10 141 and register =
Chris@10 142 match !ditdif with
Chris@10 143 | DIT -> "X(kdft_dit_register)"
Chris@10 144 | DIF -> "X(kdft_dif_register)"
Chris@10 145
Chris@10 146 in
Chris@10 147 let init =
Chris@10 148 "\n" ^
Chris@10 149 twinstr ^
Chris@10 150 desc ^
Chris@10 151 (declare_register_fcn name) ^
Chris@10 152 (Printf.sprintf "{\n%s(p, %s, &desc);\n}" register ename)
Chris@10 153 in
Chris@10 154
Chris@10 155 (unparse tree) ^ "\n" ^ (if !Magic.standalone then "" else init)
Chris@10 156
Chris@10 157
Chris@10 158 let main () =
Chris@10 159 begin
Chris@10 160 Simdmagic.simd_mode := true;
Chris@10 161 parse (speclist @ Twiddle.speclist) usage;
Chris@10 162 print_string (generate (check_size ()));
Chris@10 163 end
Chris@10 164
Chris@10 165 let _ = main()