aboutsummaryrefslogtreecommitdiffstats
path: root/mppa_k1c/TargetPrinter.ml
diff options
context:
space:
mode:
authorDavid Monniaux <david.monniaux@univ-grenoble-alpes.fr>2019-03-22 15:44:07 +0100
committerDavid Monniaux <david.monniaux@univ-grenoble-alpes.fr>2019-03-22 15:44:07 +0100
commit88448ee297d8894ecfb09d7925663cf6eb12cf01 (patch)
tree11baf9f1fa61285089c179058060f7f62d5ade50 /mppa_k1c/TargetPrinter.ml
parent355736095980774b06c4feef9a313f1eb2528091 (diff)
downloadcompcert-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.ml16
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