diff options
author | David Monniaux <david.monniaux@univ-grenoble-alpes.fr> | 2019-03-22 15:44:07 +0100 |
---|---|---|
committer | David Monniaux <david.monniaux@univ-grenoble-alpes.fr> | 2019-03-22 15:44:07 +0100 |
commit | 88448ee297d8894ecfb09d7925663cf6eb12cf01 (patch) | |
tree | 11baf9f1fa61285089c179058060f7f62d5ade50 /mppa_k1c/TargetPrinter.ml | |
parent | 355736095980774b06c4feef9a313f1eb2528091 (diff) | |
download | compcert-kvx-88448ee297d8894ecfb09d7925663cf6eb12cf01.tar.gz compcert-kvx-88448ee297d8894ecfb09d7925663cf6eb12cf01.zip |
Jump tables now work. There is still an "Admitted" subcase in a proof.
Diffstat (limited to 'mppa_k1c/TargetPrinter.ml')
-rw-r--r-- | mppa_k1c/TargetPrinter.ml | 16 |
1 files changed, 13 insertions, 3 deletions
diff --git a/mppa_k1c/TargetPrinter.ml b/mppa_k1c/TargetPrinter.ml index d4e2afc9..5bcb5cc8 100644 --- a/mppa_k1c/TargetPrinter.ml +++ b/mppa_k1c/TargetPrinter.ml @@ -268,7 +268,17 @@ module Target (*: TARGET*) = fprintf oc " cb.%a %a? %a\n" bcond bt ireg r print_label lbl | Ploopdo (r, lbl) -> fprintf oc " loopdo %a, %a\n" ireg r print_label lbl - + | Pjumptable (idx_reg, tbl) -> + let lbl = new_label() in + jumptables := (lbl, tbl) :: !jumptables; + let base_reg = if idx_reg=Asmblock.GPR63 then Asmblock.GPR62 else Asmblock.GPR63 in + fprintf oc "%s jumptable [ " comment; + List.iter (fun l -> fprintf oc "%a " print_label l) tbl; + fprintf oc "]\n"; + fprintf oc " make %a = %a\n ;;\n" ireg base_reg label lbl; + fprintf oc " lwz.xs %a = %a[%a]\n ;;\n" ireg base_reg ireg idx_reg ireg base_reg; + fprintf oc " igoto %a\n ;;\n" ireg base_reg + (* Load/Store instructions *) | Plb(rd, ra, ofs) -> fprintf oc " lbs %a = %a[%a]\n" ireg rd offset ofs ireg ra @@ -522,8 +532,8 @@ module Target (*: TARGET*) = let print_tbl oc (lbl, tbl) = fprintf oc "%a:\n" label lbl; List.iter - (fun l -> fprintf oc " .long %a - %a\n" - print_label l label lbl) + (fun l -> fprintf oc " .4byte %a\n" + print_label l) tbl in if !jumptables <> [] then begin |