aboutsummaryrefslogtreecommitdiffstats
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
parent355736095980774b06c4feef9a313f1eb2528091 (diff)
downloadcompcert-kvx-88448ee297d8894ecfb09d7925663cf6eb12cf01.tar.gz
compcert-kvx-88448ee297d8894ecfb09d7925663cf6eb12cf01.zip
Jump tables now work. There is still an "Admitted" subcase in a proof.
-rw-r--r--mppa_k1c/Machregs.v3
-rw-r--r--mppa_k1c/PostpassSchedulingOracle.ml1
-rw-r--r--mppa_k1c/TargetPrinter.ml16
3 files changed, 15 insertions, 5 deletions
diff --git a/mppa_k1c/Machregs.v b/mppa_k1c/Machregs.v
index 4de37af4..60142797 100644
--- a/mppa_k1c/Machregs.v
+++ b/mppa_k1c/Machregs.v
@@ -152,8 +152,7 @@ Definition destroyed_by_store (chunk: memory_chunk) (addr: addressing): list mre
Definition destroyed_by_cond (cond: condition): list mreg := nil.
-(* Definition destroyed_by_jumptable: list mreg := R5 :: nil. *)
-Definition destroyed_by_jumptable: list mreg := nil.
+Definition destroyed_by_jumptable: list mreg := R62 :: R63 :: nil.
Fixpoint destroyed_by_clobber (cl: list string): list mreg :=
match cl with
diff --git a/mppa_k1c/PostpassSchedulingOracle.ml b/mppa_k1c/PostpassSchedulingOracle.ml
index 2c39e342..25262af2 100644
--- a/mppa_k1c/PostpassSchedulingOracle.ml
+++ b/mppa_k1c/PostpassSchedulingOracle.ml
@@ -234,6 +234,7 @@ let ctl_flow_rec = function
| Pj_l lbl -> { inst = "Pj_l"; write_locs = []; read_locs = []; imm = None ; is_control = true}
| Pcb (bt, rs, lbl) -> { inst = "Pcb"; write_locs = []; read_locs = [Reg (IR rs)]; imm = None ; is_control = true}
| Pcbu (bt, rs, lbl) -> { inst = "Pcbu"; write_locs = []; read_locs = [Reg (IR rs)]; imm = None ; is_control = true}
+ | Pjumptable (r, _) -> { inst = "Pjumptable"; write_locs = [Reg (IR GPR62); Reg (IR GPR63)]; read_locs = [Reg (IR r)]; imm = None ; is_control = true}
let control_rec i =
match i with
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