aboutsummaryrefslogtreecommitdiffstats
path: root/mppa_k1c/Asmblockdeps.v
diff options
context:
space:
mode:
Diffstat (limited to 'mppa_k1c/Asmblockdeps.v')
-rw-r--r--mppa_k1c/Asmblockdeps.v202
1 files changed, 199 insertions, 3 deletions
diff --git a/mppa_k1c/Asmblockdeps.v b/mppa_k1c/Asmblockdeps.v
index 225c3e98..baaff273 100644
--- a/mppa_k1c/Asmblockdeps.v
+++ b/mppa_k1c/Asmblockdeps.v
@@ -654,17 +654,35 @@ Definition trans_basic (b: basic) : inst :=
| PLoadQRRO qd a ofs =>
let (d0, d1) := gpreg_q_expand qd in
if ireg_eq d0 a
- then [(#d0, Op Fail Enil);
- (#d1, Op Fail Enil)]
+ then [(#d0, Op Fail Enil)]
else
[(#d0, Op (Load (OLoadRRO Pld_a ofs)) (PReg (#a) @ PReg pmem @ Enil));
(#d1, Op (Load (OLoadRRO Pld_a (Ptrofs.add ofs (Ptrofs.repr 8)))) (PReg (#a) @ PReg pmem @ Enil))]
+ | PLoadORRO od a ofs =>
+ match gpreg_o_expand od with
+ | (d0, d1, d2, d3) =>
+ if (ireg_eq d0 a) || (ireg_eq d1 a) || (ireg_eq d2 a)
+ then [(#d0, Op Fail Enil)]
+ else
+ [(#d0, Op (Load (OLoadRRO Pld_a ofs)) (PReg (#a) @ PReg pmem @ Enil));
+ (#d1, Op (Load (OLoadRRO Pld_a (Ptrofs.add ofs (Ptrofs.repr 8)))) (PReg (#a) @ PReg pmem @ Enil));
+ (#d2, Op (Load (OLoadRRO Pld_a (Ptrofs.add ofs (Ptrofs.repr 16)))) (PReg (#a) @ PReg pmem @ Enil));
+ (#d3, Op (Load (OLoadRRO Pld_a (Ptrofs.add ofs (Ptrofs.repr 24)))) (PReg (#a) @ PReg pmem @ Enil))]
+ end
| PStoreRRR n s a ro => [(pmem, Op (Store (OStoreRRR n)) (PReg (#s) @ PReg (#a) @ PReg (#ro) @ PReg pmem @ Enil))]
| PStoreRRRXS n s a ro => [(pmem, Op (Store (OStoreRRRXS n)) (PReg (#s) @ PReg (#a) @ PReg (#ro) @ PReg pmem @ Enil))]
| PStoreQRRO qs a ofs =>
let (s0, s1) := gpreg_q_expand qs in
[(pmem, Op (Store (OStoreRRO Psd_a ofs)) (PReg (#s0) @ PReg (#a) @ PReg pmem @ Enil));
(pmem, Op (Store (OStoreRRO Psd_a (Ptrofs.add ofs (Ptrofs.repr 8)))) (PReg (#s1) @ PReg (#a) @ PReg pmem @ Enil))]
+ | PStoreORRO os a ofs =>
+ match gpreg_o_expand os with
+ | (s0, s1, s2, s3) =>
+ [(pmem, Op (Store (OStoreRRO Psd_a ofs)) (PReg (#s0) @ PReg (#a) @ PReg pmem @ Enil));
+ (pmem, Op (Store (OStoreRRO Psd_a (Ptrofs.add ofs (Ptrofs.repr 8)))) (PReg (#s1) @ PReg (#a) @ PReg pmem @ Enil));
+ (pmem, Op (Store (OStoreRRO Psd_a (Ptrofs.add ofs (Ptrofs.repr 16)))) (PReg (#s2) @ PReg (#a) @ PReg pmem @ Enil));
+ (pmem, Op (Store (OStoreRRO Psd_a (Ptrofs.add ofs (Ptrofs.repr 24)))) (PReg (#s3) @ PReg (#a) @ PReg pmem @ Enil))]
+ end
| Pallocframe sz pos => [(#FP, PReg (#SP)); (#SP, Op (Allocframe2 sz pos) (PReg (#SP) @ PReg pmem @ Enil)); (#RTMP, Op (Constant Vundef) Enil);
(pmem, Op (Allocframe sz pos) (Old (PReg (#SP)) @ PReg pmem @ Enil))]
| Pfreeframe sz pos => [(pmem, Op (Freeframe sz pos) (PReg (#SP) @ PReg pmem @ Enil));
@@ -885,7 +903,9 @@ Proof.
unfold parexec_load_regxs; simpl; unfold exec_load_deps_regxs; rewrite H, H0; rewrite (H0 rofs);
destruct (Mem.loadv _ _ _) eqn:MEML; simpl; auto;
eexists; split; try split; Simpl;
- intros rr; destruct rr; Simpl; destruct (ireg_eq g rd); subst; Simpl.
+ intros rr; destruct rr; Simpl; destruct (ireg_eq g rd); subst; Simpl.
+
+ (* Load Quad word *)
+ unfold parexec_load_q_offset.
destruct (gpreg_q_expand rd) as [rd0 rd1].
destruct (ireg_eq rd0 ra) as [ OVERLAP0 | NOOVERLAP0 ].
@@ -935,6 +955,106 @@ Proof.
constructor.
++ rewrite H0. rewrite H. rewrite MEML0. trivial.
+ (* Load Octuple word *)
+ + unfold parexec_load_o_offset.
+ destruct (gpreg_o_expand rd) as [[[rd0 rd1] rd2] rd3].
+ destruct (ireg_eq rd0 ra); simpl; trivial.
+ destruct (ireg_eq rd1 ra); simpl; trivial.
+ destruct (ireg_eq rd2 ra); simpl; trivial.
+ destruct Ge.
+ repeat rewrite H0.
+ destruct (Mem.loadv Many64 mr (Val.offset_ptr (rsr ra) ofs)) as [load0 | ] eqn:MEML0; simpl.
+ { destruct (Mem.loadv Many64 mr
+ (Val.offset_ptr (rsr ra) (Ptrofs.add ofs (Ptrofs.repr 8)))) as [load1| ] eqn:MEML1.
+ { destruct (Mem.loadv Many64 mr
+ (Val.offset_ptr (rsr ra) (Ptrofs.add ofs (Ptrofs.repr 16)))) as [load2| ] eqn:MEML2.
+ { destruct (Mem.loadv Many64 mr
+ (Val.offset_ptr (rsr ra) (Ptrofs.add ofs (Ptrofs.repr 24)))) as [load3| ] eqn:MEML3.
+ { rewrite H.
+ rewrite MEML0.
+ rewrite (assign_diff _ _ (# ra)) by (apply ppos_discr; congruence).
+ rewrite H0.
+ rewrite (assign_diff _ _ pmem) by (apply not_eq_sym; apply ppos_pmem_discr).
+ rewrite H.
+ rewrite MEML1.
+ repeat rewrite (assign_diff _ _ (# ra)) by (apply ppos_discr; congruence).
+ rewrite H0.
+ repeat rewrite (assign_diff _ _ pmem) by (apply not_eq_sym; apply ppos_pmem_discr).
+ rewrite H.
+ rewrite MEML2.
+ repeat rewrite (assign_diff _ _ (# ra)) by (apply ppos_discr; congruence).
+ rewrite H0.
+ repeat rewrite (assign_diff _ _ pmem) by (apply not_eq_sym; apply ppos_pmem_discr).
+ rewrite H.
+ rewrite MEML3.
+ repeat rewrite (assign_diff _ _ (# ra)) by (apply ppos_discr; congruence).
+ econstructor; split; trivial.
+ constructor.
+ { repeat rewrite (assign_diff _ _ pmem) by (apply not_eq_sym; apply ppos_pmem_discr). assumption. }
+ { intro.
+ destruct (preg_eq r rd3).
+ { subst r. rewrite assign_eq. rewrite Pregmap.gss. trivial.
+ }
+ rewrite assign_diff by (apply ppos_discr; congruence).
+ rewrite Pregmap.gso by assumption.
+ destruct (preg_eq r rd2).
+ { subst r. rewrite assign_eq.
+ rewrite Pregmap.gss. trivial.
+ }
+ rewrite assign_diff by (apply ppos_discr; congruence).
+ rewrite Pregmap.gso by assumption.
+ destruct (preg_eq r rd1).
+ { subst r. rewrite assign_eq.
+ rewrite Pregmap.gss. trivial.
+ }
+ rewrite assign_diff by (apply ppos_discr; congruence).
+ rewrite Pregmap.gso by assumption.
+ destruct (preg_eq r rd0).
+ { subst r. rewrite assign_eq.
+ rewrite Pregmap.gss. trivial.
+ }
+ rewrite assign_diff by (apply ppos_discr; congruence).
+ rewrite Pregmap.gso by assumption.
+ auto.
+ }
+ }
+ rewrite H. rewrite MEML0.
+ rewrite assign_diff by (apply ppos_discr; congruence).
+ rewrite H0.
+ rewrite (assign_diff _ _ pmem) by (apply not_eq_sym; apply ppos_pmem_discr).
+ rewrite H. rewrite MEML1.
+ repeat rewrite assign_diff by (apply ppos_discr; congruence).
+ rewrite H0.
+ repeat rewrite (assign_diff _ _ pmem) by (apply not_eq_sym; apply ppos_pmem_discr).
+ rewrite H. rewrite MEML2.
+ repeat rewrite assign_diff by (apply ppos_discr; congruence).
+ rewrite H0.
+ repeat rewrite (assign_diff _ _ pmem) by (apply not_eq_sym; apply ppos_pmem_discr).
+ rewrite H. rewrite MEML3.
+ constructor.
+ }
+ rewrite H. rewrite MEML0.
+ rewrite assign_diff by (apply ppos_discr; congruence).
+ rewrite H0.
+ rewrite (assign_diff _ _ pmem) by (apply not_eq_sym; apply ppos_pmem_discr).
+ rewrite H. rewrite MEML1.
+ repeat rewrite assign_diff by (apply ppos_discr; congruence).
+ rewrite H0.
+ repeat rewrite (assign_diff _ _ pmem) by (apply not_eq_sym; apply ppos_pmem_discr).
+ rewrite H. rewrite MEML2.
+ repeat rewrite assign_diff by (apply ppos_discr; congruence).
+ constructor.
+ }
+ rewrite H. rewrite MEML0.
+ rewrite assign_diff by (apply ppos_discr; congruence).
+ rewrite H0.
+ rewrite (assign_diff _ _ pmem) by (apply not_eq_sym; apply ppos_pmem_discr).
+ rewrite H. rewrite MEML1.
+ repeat rewrite assign_diff by (apply ppos_discr; congruence).
+ constructor.
+ }
+ rewrite H. rewrite MEML0.
+ constructor.
(* Store *)
- destruct i.
(* Store Offset *)
@@ -959,6 +1079,7 @@ Proof.
eexists; split; try split; Simpl;
intros rr; destruct rr; Simpl.
+ (* Store Quad Word *)
+ unfold parexec_store_q_offset.
simpl.
destruct (gpreg_q_expand rs) as [s0 s1].
@@ -989,6 +1110,81 @@ Proof.
reflexivity.
++ rewrite MEML0.
reflexivity.
+
+ (* Store Ocuple Word *)
+ + unfold parexec_store_o_offset.
+ simpl.
+ destruct (gpreg_o_expand rs) as [[[s0 s1] s2] s3].
+ simpl.
+ destruct Ge.
+ destruct (Mem.storev _ _ _ (rsr s0)) as [store0 | ] eqn:MEML0.
+ { destruct (Mem.storev _ _ _ (rsr s1)) as [store1 | ] eqn:MEML1.
+ { destruct (Mem.storev _ _ _ (rsr s2)) as [store2 | ] eqn:MEML2.
+ { destruct (Mem.storev _ _ _ (rsr s3)) as [store3 | ] eqn:MEML3.
+ { repeat (try rewrite H0; try rewrite H).
+ simpl.
+ rewrite MEML0.
+ repeat rewrite (assign_diff _ _ _) by apply ppos_pmem_discr.
+ repeat (try rewrite H0; try rewrite H).
+ rewrite assign_eq.
+ rewrite MEML1.
+ repeat rewrite (assign_diff _ _ _) by apply ppos_pmem_discr.
+ repeat (try rewrite H0; try rewrite H).
+ rewrite assign_eq.
+ rewrite MEML2.
+ repeat rewrite (assign_diff _ _ _) by apply ppos_pmem_discr.
+ repeat (try rewrite H0; try rewrite H).
+ rewrite assign_eq.
+ rewrite MEML3.
+ econstructor; split; trivial.
+ split.
+ { repeat rewrite assign_eq. trivial. }
+ { intro.
+ repeat rewrite (assign_diff _ _ _) by apply ppos_pmem_discr.
+ trivial. }
+ }
+ {
+ repeat (try rewrite H0; try rewrite H; simpl).
+ rewrite MEML0.
+ repeat rewrite (assign_diff _ _ _) by apply ppos_pmem_discr.
+ repeat (try rewrite H0; try rewrite H; simpl).
+ rewrite MEML1.
+ repeat rewrite (assign_diff _ _ _) by apply ppos_pmem_discr.
+ repeat (try rewrite H0; try rewrite H; simpl).
+ rewrite MEML2.
+ repeat rewrite (assign_diff _ _ _) by apply ppos_pmem_discr.
+ repeat (try rewrite H0; try rewrite H; simpl).
+ rewrite MEML3.
+ trivial.
+ }
+ }
+ {
+ repeat (try rewrite H0; try rewrite H; simpl).
+ rewrite MEML0.
+ repeat rewrite (assign_diff _ _ _) by apply ppos_pmem_discr.
+ repeat (try rewrite H0; try rewrite H; simpl).
+ rewrite MEML1.
+ repeat rewrite (assign_diff _ _ _) by apply ppos_pmem_discr.
+ repeat (try rewrite H0; try rewrite H; simpl).
+ rewrite MEML2.
+ trivial.
+ }
+ }
+ {
+ repeat (try rewrite H0; try rewrite H; simpl).
+ rewrite MEML0.
+ repeat rewrite (assign_diff _ _ _) by apply ppos_pmem_discr.
+ repeat (try rewrite H0; try rewrite H; simpl).
+ rewrite MEML1.
+ trivial.
+ }
+ }
+ {
+ repeat (try rewrite H0; try rewrite H; simpl).
+ rewrite MEML0.
+ trivial.
+ }
+
(* Allocframe *)
- destruct (Mem.alloc _ _ _) eqn:MEMAL. destruct (Mem.store _ _ _ _) eqn:MEMS.
* eexists; repeat split.