aboutsummaryrefslogtreecommitdiffstats
path: root/scheduling/PrintBTL.ml
blob: 4b14d28e6a4079d2aebae2dfeedb470dd2b3b879 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
open Printf
open Camlcoq
open Datatypes
open Maps
open AST
open BTL
open PrintAST

(* Printing of BTL code *)

let reg pp r = fprintf pp "x%d" (P.to_int r)

let rec regs pp = function
  | [] -> ()
  | [ r ] -> reg pp r
  | r1 :: rl -> fprintf pp "%a, %a" reg r1 regs rl

let ros pp = function
  | Coq_inl r -> reg pp r
  | Coq_inr s -> fprintf pp "\"%s\"" (extern_atom s)

let print_succ pp s = fprintf pp "\tsucc %d\n" (P.to_int s)

let print_pref pp pref = fprintf pp "%s" pref

let rec print_iblock pp is_rec pref ib =
  match ib with
  | Bnop _ ->
      print_pref pp pref;
      fprintf pp "Bnop\n"
  | Bop (op, args, res, _) ->
      print_pref pp pref;
      fprintf pp "Bop: %a = %a\n" reg res
        (PrintOp.print_operation reg)
        (op, args)
  | Bload (trap, chunk, addr, args, dst, _) ->
      print_pref pp pref;
      fprintf pp "Bload: %a = %s[%a]%a\n" reg dst (name_of_chunk chunk)
        (PrintOp.print_addressing reg)
        (addr, args) print_trapping_mode trap
  | Bstore (chunk, addr, args, src, _) ->
      print_pref pp pref;
      fprintf pp "Bstore: %s[%a] = %a\n" (name_of_chunk chunk)
        (PrintOp.print_addressing reg)
        (addr, args) reg src
  | BF (Bcall (sg, fn, args, res, s, _)) ->
      print_pref pp pref;
      fprintf pp "Bcall: %a = %a(%a)\n" reg res ros fn regs args;
      print_succ pp s
  | BF (Btailcall (sg, fn, args, _)) ->
      print_pref pp pref;
      fprintf pp "Btailcall: %a(%a)\n" ros fn regs args
  | BF (Bbuiltin (ef, args, res, s, _)) ->
      print_pref pp pref;
      fprintf pp "Bbuiltin: %a = %s(%a)\n" (print_builtin_res reg) res
        (name_of_external ef) (print_builtin_args reg) args;
      print_succ pp s
  | Bcond (cond, args, ib1, ib2, info, _) ->
      print_pref pp pref;
      fprintf pp "Bcond: (%a) (prediction: %s)\n"
        (PrintOp.print_condition reg)
        (cond, args)
        (match info with
        | None -> "none"
        | Some true -> "branch"
        | Some false -> "fallthrough");
      let pref' = pref ^ "  " in
      fprintf pp "%sifso = [\n" pref;
      if is_rec then print_iblock pp is_rec pref' ib1 else fprintf pp "...\n";
      fprintf pp "%s]\n" pref;
      fprintf pp "%sifnot = [\n" pref;
      if is_rec then print_iblock pp is_rec pref' ib2 else fprintf pp "...\n";
      fprintf pp "%s]\n" pref
  | BF (Bjumptable (arg, tbl, _)) ->
      let tbl = Array.of_list tbl in
      print_pref pp pref;
      fprintf pp "Bjumptable: (%a)\n" reg arg;
      for i = 0 to Array.length tbl - 1 do
        fprintf pp "\t\tcase %d: goto %d\n" i (P.to_int tbl.(i))
      done
  | BF (Breturn (None, _)) ->
      print_pref pp pref;
      fprintf pp "Breturn\n"
  | BF (Breturn (Some arg, _)) ->
      print_pref pp pref;
      fprintf pp "Breturn: %a\n" reg arg
  | BF (Bgoto s) ->
      print_pref pp pref;
      fprintf pp "Bgoto: %d\n" (P.to_int s)
  | Bseq (ib1, ib2) ->
      if is_rec then (
        print_iblock pp is_rec pref ib1;
        print_iblock pp is_rec pref ib2)
      else fprintf pp "Bseq...\n"

let print_btl_inst pp ib = print_iblock pp false "  " ib

let print_btl_code pp btl is_rec =
  fprintf pp "\n";
  List.iter
    (fun (n, ibf) ->
      fprintf pp "[BTL block %d]\n" (P.to_int n);
      print_iblock pp is_rec "  " ibf.entry;
      fprintf pp "\n")
    (PTree.elements btl);
  fprintf pp "\n"

let print_function pp id f =
  fprintf pp "%s(%a) {\n" (extern_atom id) regs f.fn_params;
  let instrs = List.map (fun (n, i) -> i.entry) (PTree.elements f.fn_code) in
  List.iter (print_iblock pp true "") instrs;
  fprintf pp "}\n\n"

let print_globdef pp (id, gd) =
  match gd with Gfun (Internal f) -> print_function pp id f | _ -> ()

let print_program pp (prog : BTL.program) =
  List.iter (print_globdef pp) prog.prog_defs