annotate src/fftw-3.3.3/genfft/gen_hc2hc.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
Chris@10 33 let speclist = [
Chris@10 34 "-dit",
Chris@10 35 Arg.Unit(fun () -> ditdif := DIT),
Chris@10 36 " generate a DIT codelet";
Chris@10 37
Chris@10 38 "-dif",
Chris@10 39 Arg.Unit(fun () -> ditdif := DIF),
Chris@10 40 " generate a DIF codelet";
Chris@10 41
Chris@10 42 "-with-rs",
Chris@10 43 Arg.String(fun x -> urs := arg_to_stride x),
Chris@10 44 " specialize for given R-stride";
Chris@10 45 ]
Chris@10 46
Chris@10 47 let rioarray = "cr"
Chris@10 48 and iioarray = "ci"
Chris@10 49
Chris@10 50 let genone sign n transform load store vrs =
Chris@10 51 let locations = unique_array_c n in
Chris@10 52 let input =
Chris@10 53 locative_array_c n
Chris@10 54 (C.array_subscript rioarray vrs)
Chris@10 55 (C.array_subscript iioarray vrs)
Chris@10 56 locations "BUG" in
Chris@10 57 let output = transform sign n (load n input) in
Chris@10 58 let ioloc =
Chris@10 59 locative_array_c n
Chris@10 60 (C.array_subscript rioarray vrs)
Chris@10 61 (C.array_subscript iioarray vrs)
Chris@10 62 locations "BUG" in
Chris@10 63 let odag = store n ioloc output in
Chris@10 64 let annot = standard_optimizer odag
Chris@10 65 in annot
Chris@10 66
Chris@10 67 let byi = Complex.times Complex.i
Chris@10 68 let byui = Complex.times (Complex.uminus Complex.i)
Chris@10 69
Chris@10 70 let sym1 n f i =
Chris@10 71 Complex.plus [Complex.real (f i); byi (Complex.imag (f (n - 1 - i)))]
Chris@10 72
Chris@10 73 let sym2 n f i = if (i < n - i) then f i else byi (f i)
Chris@10 74 let sym2i n f i = if (i < n - i) then f i else byui (f i)
Chris@10 75
Chris@10 76 let generate n =
Chris@10 77 let rs = "rs"
Chris@10 78 and twarray = "W"
Chris@10 79 and m = "m" and mb = "mb" and me = "me" and ms = "ms" in
Chris@10 80
Chris@10 81 let sign = !Genutil.sign
Chris@10 82 and name = !Magic.codelet_name
Chris@10 83 and byvl x = choose_simd x (ctimes (CVar "VL", x)) in
Chris@10 84
Chris@10 85 let (bytwiddle, num_twiddles, twdesc) = Twiddle.twiddle_policy 1 false in
Chris@10 86 let nt = num_twiddles n in
Chris@10 87
Chris@10 88 let byw = bytwiddle n sign (twiddle_array nt twarray) in
Chris@10 89
Chris@10 90 let vrs = either_stride (!urs) (C.SVar rs) in
Chris@10 91
Chris@10 92 let asch =
Chris@10 93 match !ditdif with
Chris@10 94 | DIT ->
Chris@10 95 genone sign n
Chris@10 96 (fun sign n input ->
Chris@10 97 ((sym1 n) @@ (sym2 n)) (Fft.dft sign n (byw input)))
Chris@10 98 load_array_c store_array_c vrs
Chris@10 99 | DIF ->
Chris@10 100 genone sign n
Chris@10 101 (fun sign n input ->
Chris@10 102 byw (Fft.dft sign n (((sym2i n) @@ (sym1 n)) input)))
Chris@10 103 load_array_c store_array_c vrs
Chris@10 104 in
Chris@10 105
Chris@10 106 let vms = CVar "ms"
Chris@10 107 and vrioarray = CVar rioarray
Chris@10 108 and viioarray = CVar iioarray
Chris@10 109 and vm = CVar m and vmb = CVar mb and vme = CVar me
Chris@10 110 in
Chris@10 111 let body = Block (
Chris@10 112 [Decl ("INT", m)],
Chris@10 113 [For (list_to_comma
Chris@10 114 [Expr_assign (vm, vmb);
Chris@10 115 Expr_assign (CVar twarray,
Chris@10 116 CPlus [CVar twarray;
Chris@10 117 ctimes (CPlus [vmb; CUminus (Integer 1)],
Chris@10 118 Integer nt)])],
Chris@10 119 Binop (" < ", vm, vme),
Chris@10 120 list_to_comma
Chris@10 121 [Expr_assign (vm, CPlus [vm; byvl (Integer 1)]);
Chris@10 122 Expr_assign (vrioarray, CPlus [vrioarray; byvl vms]);
Chris@10 123 Expr_assign (viioarray,
Chris@10 124 CPlus [viioarray; CUminus (byvl vms)]);
Chris@10 125 Expr_assign (CVar twarray, CPlus [CVar twarray;
Chris@10 126 byvl (Integer nt)]);
Chris@10 127 make_volatile_stride (2*n) (CVar rs)
Chris@10 128 ],
Chris@10 129 Asch asch)])
Chris@10 130 in
Chris@10 131
Chris@10 132 let tree =
Chris@10 133 Fcn ("static void", name,
Chris@10 134 [Decl (C.realtypep, rioarray);
Chris@10 135 Decl (C.realtypep, iioarray);
Chris@10 136 Decl (C.constrealtypep, twarray);
Chris@10 137 Decl (C.stridetype, rs);
Chris@10 138 Decl ("INT", mb);
Chris@10 139 Decl ("INT", me);
Chris@10 140 Decl ("INT", ms)],
Chris@10 141 finalize_fcn body)
Chris@10 142 in
Chris@10 143 let twinstr =
Chris@10 144 Printf.sprintf "static const tw_instr twinstr[] = %s;\n\n"
Chris@10 145 (twinstr_to_string "VL" (twdesc n))
Chris@10 146 and desc =
Chris@10 147 Printf.sprintf
Chris@10 148 "static const hc2hc_desc desc = {%d, \"%s\", twinstr, &GENUS, %s};\n\n"
Chris@10 149 n name (flops_of tree)
Chris@10 150 and register = "X(khc2hc_register)"
Chris@10 151
Chris@10 152 in
Chris@10 153 let init =
Chris@10 154 "\n" ^
Chris@10 155 twinstr ^
Chris@10 156 desc ^
Chris@10 157 (declare_register_fcn name) ^
Chris@10 158 (Printf.sprintf "{\n%s(p, %s, &desc);\n}" register name)
Chris@10 159 in
Chris@10 160
Chris@10 161 (unparse tree) ^ "\n" ^ init
Chris@10 162
Chris@10 163
Chris@10 164 let main () =
Chris@10 165 begin
Chris@10 166 parse (speclist @ Twiddle.speclist) usage;
Chris@10 167 print_string (generate (check_size ()));
Chris@10 168 end
Chris@10 169
Chris@10 170 let _ = main()