aboutsummaryrefslogtreecommitdiffstats
path: root/aarch64/Asmblockdeps.v
diff options
context:
space:
mode:
Diffstat (limited to 'aarch64/Asmblockdeps.v')
-rw-r--r--aarch64/Asmblockdeps.v202
1 files changed, 110 insertions, 92 deletions
diff --git a/aarch64/Asmblockdeps.v b/aarch64/Asmblockdeps.v
index e2d788a5..1ad18889 100644
--- a/aarch64/Asmblockdeps.v
+++ b/aarch64/Asmblockdeps.v
@@ -166,15 +166,15 @@ Inductive arith_op :=
.
Inductive store_op :=
- | Ostore1 (st: st_instruction) (a: addressing)
- | Ostore2 (st: st_instruction) (a: addressing)
- | OstoreU (st: st_instruction) (a: addressing)
+ | Ostore1 (st: store_rs_a) (chunk: memory_chunk) (a: addressing)
+ | Ostore2 (st: store_rs_a) (chunk: memory_chunk) (a: addressing)
+ | OstoreU (st: store_rs_a) (chunk: memory_chunk) (a: addressing)
.
Inductive load_op :=
- | Oload1 (ld: ld_instruction) (a: addressing)
- | Oload2 (ld: ld_instruction) (a: addressing)
- | OloadU (ld: ld_instruction) (a: addressing)
+ | Oload1 (ld: load_rd_a) (chunk: memory_chunk) (a: addressing)
+ | Oload2 (ld: load_rd_a) (chunk: memory_chunk) (a: addressing)
+ | OloadU (ld: load_rd_a) (chunk: memory_chunk) (a: addressing)
.
Inductive allocf_op :=
@@ -424,16 +424,16 @@ Definition call_ll_storev (c: memory_chunk) (m: mem) (v: option val) (vs: val) :
| None => None (* should never occurs *)
end.
-Definition exec_store1 (n: st_instruction) (m: mem) (a: addressing) (vr vs: val) :=
+Definition exec_store1 (n: store_rs_a) (m: mem) (chunk: memory_chunk) (a: addressing) (vr vs: val) :=
let v :=
match a with
| ADimm _ n => Some (Val.addl vs (Vlong n))
| ADadr _ id ofs => Some (Val.addl vs (symbol_low Ge.(_lk) id ofs))
| _ => None
end in
- call_ll_storev (chunk_store n) m v vr.
+ call_ll_storev chunk m v vr.
-Definition exec_store2 (n: st_instruction) (m: mem) (a: addressing) (vr vs1 vs2: val) :=
+Definition exec_store2 (n: store_rs_a) (m: mem) (chunk: memory_chunk) (a: addressing) (vr vs1 vs2: val) :=
let v :=
match a with
| ADreg _ _ => Some (Val.addl vs1 vs2)
@@ -442,10 +442,10 @@ Definition exec_store2 (n: st_instruction) (m: mem) (a: addressing) (vr vs1 vs2:
| ADuxt _ _ n => Some (Val.addl vs1 (Val.shll (Val.longofintu vs2) (Vint n)))
| _ => None
end in
- call_ll_storev (chunk_store n) m v vr.
+ call_ll_storev chunk m v vr.
-Definition exec_storeU (n: st_instruction) (m: mem) (a: addressing) (vr: val) :=
- call_ll_storev (chunk_store n) m None vr.
+Definition exec_storeU (n: store_rs_a) (m: mem) (chunk: memory_chunk) (a: addressing) (vr: val) :=
+ call_ll_storev chunk m None vr.
Definition goto_label_deps (f: function) (lbl: label) (vpc: val) :=
match label_pos lbl 0 (fn_blocks f) with
@@ -503,9 +503,9 @@ Definition control_eval (o: control_op) (l: list value) :=
Definition store_eval (o: store_op) (l: list value) :=
match o, l with
- | Ostore1 st a, [Val vr; Val vs; Memstate m] => exec_store1 st m a vr vs
- | Ostore2 st a, [Val vr; Val vs1; Val vs2; Memstate m] => exec_store2 st m a vr vs1 vs2
- | OstoreU st a, [Val vr; Memstate m] => exec_storeU st m a vr
+ | Ostore1 st chunk a, [Val vr; Val vs; Memstate m] => exec_store1 st m chunk a vr vs
+ | Ostore2 st chunk a, [Val vr; Val vs1; Val vs2; Memstate m] => exec_store2 st m chunk a vr vs1 vs2
+ | OstoreU st chunk a, [Val vr; Memstate m] => exec_storeU st m chunk a vr
| _, _ => None
end.
@@ -518,16 +518,16 @@ Definition call_ll_loadv (c: memory_chunk) (transf: val -> val) (m: mem) (v: opt
| None => None (* should never occurs *)
end.
-Definition exec_load1 (ld: ld_instruction) (m: mem) (a: addressing) (vl: val) :=
+Definition exec_load1 (ld: load_rd_a) (m: mem) (chunk: memory_chunk) (a: addressing) (vl: val) :=
let v :=
match a with
| ADimm _ n => Some (Val.addl vl (Vlong n))
| ADadr _ id ofs => Some (Val.addl vl (symbol_low Ge.(_lk) id ofs))
| _ => None
end in
- call_ll_loadv (chunk_load ld) (interp_load ld) m v.
+ call_ll_loadv chunk (interp_load ld) m v.
-Definition exec_load2 (ld: ld_instruction) (m: mem) (a: addressing) (vl1 vl2: val) :=
+Definition exec_load2 (ld: load_rd_a) (m: mem) (chunk: memory_chunk) (a: addressing) (vl1 vl2: val) :=
let v :=
match a with
| ADreg _ _ => Some (Val.addl vl1 vl2)
@@ -536,16 +536,16 @@ Definition exec_load2 (ld: ld_instruction) (m: mem) (a: addressing) (vl1 vl2: va
| ADuxt _ _ n => Some (Val.addl vl1 (Val.shll (Val.longofintu vl2) (Vint n)))
| _ => None
end in
- call_ll_loadv (chunk_load ld) (interp_load ld) m v.
+ call_ll_loadv chunk (interp_load ld) m v.
-Definition exec_loadU (n: ld_instruction) (m: mem) (a: addressing) :=
- call_ll_loadv (chunk_load n) (interp_load n) m None.
+Definition exec_loadU (n: load_rd_a) (m: mem) (chunk: memory_chunk) (a: addressing) :=
+ call_ll_loadv chunk (interp_load n) m None.
Definition load_eval (o: load_op) (l: list value) :=
match o, l with
- | Oload1 ld a, [Val vs; Memstate m] => exec_load1 ld m a vs
- | Oload2 ld a, [Val vs1; Val vs2; Memstate m] => exec_load2 ld m a vs1 vs2
- | OloadU st a, [Memstate m] => exec_loadU st m a
+ | Oload1 ld chunk a, [Val vs; Memstate m] => exec_load1 ld m chunk a vs
+ | Oload2 ld chunk a, [Val vs1; Val vs2; Memstate m] => exec_load2 ld m chunk a vs1 vs2
+ | OloadU st chunk a, [Memstate m] => exec_loadU st m chunk a
| _, _ => None
end.
@@ -768,12 +768,12 @@ Opaque control_op_eq_correct.
Definition store_op_eq (s1 s2: store_op): ?? bool :=
match s1 with
- | Ostore1 st1 a1 =>
- match s2 with Ostore1 st2 a2 => iandb (struct_eq st1 st2) (struct_eq a1 a2) | _ => RET false end
- | Ostore2 st1 a1 =>
- match s2 with Ostore2 st2 a2 => iandb (struct_eq st1 st2) (struct_eq a1 a2) | _ => RET false end
- | OstoreU st1 a1 =>
- match s2 with OstoreU st2 a2 => iandb (struct_eq st1 st2) (struct_eq a1 a2) | _ => RET false end
+ | Ostore1 st1 chk1 a1 =>
+ match s2 with Ostore1 st2 chk2 a2 => iandb (struct_eq chk1 chk2) (iandb (struct_eq st1 st2) (struct_eq a1 a2)) | _ => RET false end
+ | Ostore2 st1 chk1 a1 =>
+ match s2 with Ostore2 st2 chk2 a2 => iandb (struct_eq chk1 chk2) (iandb (struct_eq st1 st2) (struct_eq a1 a2)) | _ => RET false end
+ | OstoreU st1 chk1 a1 =>
+ match s2 with OstoreU st2 chk2 a2 => iandb (struct_eq chk1 chk2) (iandb (struct_eq st1 st2) (struct_eq a1 a2)) | _ => RET false end
end.
Lemma store_op_eq_correct s1 s2:
@@ -787,12 +787,12 @@ Opaque store_op_eq_correct.
Definition load_op_eq (l1 l2: load_op): ?? bool :=
match l1 with
- | Oload1 ld1 a1 =>
- match l2 with Oload1 ld2 a2 => iandb (struct_eq ld1 ld2) (struct_eq a1 a2) | _ => RET false end
- | Oload2 ld1 a1 =>
- match l2 with Oload2 ld2 a2 => iandb (struct_eq ld1 ld2) (struct_eq a1 a2) | _ => RET false end
- | OloadU ld1 a1 =>
- match l2 with OloadU ld2 a2 => iandb (struct_eq ld1 ld2) (struct_eq a1 a2) | _ => RET false end
+ | Oload1 ld1 chk1 a1 =>
+ match l2 with Oload1 ld2 chk2 a2 => iandb (struct_eq chk1 chk2) (iandb (struct_eq ld1 ld2) (struct_eq a1 a2)) | _ => RET false end
+ | Oload2 ld1 chk1 a1 =>
+ match l2 with Oload2 ld2 chk2 a2 => iandb (struct_eq chk1 chk2) (iandb (struct_eq ld1 ld2) (struct_eq a1 a2)) | _ => RET false end
+ | OloadU ld1 chk1 a1 =>
+ match l2 with OloadU ld2 chk2 a2 => iandb (struct_eq chk1 chk2) (iandb (struct_eq ld1 ld2) (struct_eq a1 a2)) | _ => RET false end
end.
Lemma load_op_eq_correct l1 l2:
@@ -1127,45 +1127,58 @@ Definition trans_arith (ai: ar_instruction) : inst :=
| Pfnmul fsz rd r1 r2 => [(#rd, Op(Arith (Ofnmul fsz)) (PReg(#r1) @ PReg(#r2) @ Enil))]
end.
-Definition eval_addressing_rlocs_st (st: st_instruction) (rs: dreg) (a: addressing) :=
+Definition eval_addressing_rlocs_st (st: store_rs_a) (chunk: memory_chunk) (rs: dreg) (a: addressing) :=
match a with
- | ADimm base n => Op (Store (Ostore1 st a)) (PReg (#rs) @ PReg (#base) @ PReg (pmem) @ Enil)
- | ADreg base r => Op (Store (Ostore2 st a)) (PReg (#rs) @ PReg (#base) @ PReg(#r) @ PReg (pmem) @ Enil)
- | ADlsl base r n => Op (Store (Ostore2 st a)) (PReg (#rs) @ PReg (#base) @ PReg(#r) @ PReg (pmem) @ Enil)
- | ADsxt base r n => Op (Store (Ostore2 st a)) (PReg (#rs) @ PReg (#base) @ PReg(#r) @ PReg (pmem) @ Enil)
- | ADuxt base r n => Op (Store (Ostore2 st a)) (PReg (#rs) @ PReg (#base) @ PReg(#r) @ PReg (pmem) @ Enil)
- | ADadr base id ofs => Op (Store (Ostore1 st a)) (PReg (#rs) @ PReg (#base) @ PReg (pmem) @ Enil)
- | ADpostincr base n => Op (Store (OstoreU st a)) (PReg (#rs) @ PReg (pmem) @ Enil) (* not modeled yet *)
+ | ADimm base n => Op (Store (Ostore1 st chunk a)) (PReg (#rs) @ PReg (#base) @ PReg (pmem) @ Enil)
+ | ADreg base r => Op (Store (Ostore2 st chunk a)) (PReg (#rs) @ PReg (#base) @ PReg(#r) @ PReg (pmem) @ Enil)
+ | ADlsl base r n => Op (Store (Ostore2 st chunk a)) (PReg (#rs) @ PReg (#base) @ PReg(#r) @ PReg (pmem) @ Enil)
+ | ADsxt base r n => Op (Store (Ostore2 st chunk a)) (PReg (#rs) @ PReg (#base) @ PReg(#r) @ PReg (pmem) @ Enil)
+ | ADuxt base r n => Op (Store (Ostore2 st chunk a)) (PReg (#rs) @ PReg (#base) @ PReg(#r) @ PReg (pmem) @ Enil)
+ | ADadr base id ofs => Op (Store (Ostore1 st chunk a)) (PReg (#rs) @ PReg (#base) @ PReg (pmem) @ Enil)
+ | ADpostincr base n => Op (Store (OstoreU st chunk a)) (PReg (#rs) @ PReg (pmem) @ Enil) (* not modeled yet *)
end.
-Definition eval_addressing_rlocs_ld (ld: ld_instruction) (a: addressing) :=
+Definition eval_addressing_rlocs_ld (ld: load_rd_a) (chunk: memory_chunk) (a: addressing) :=
match a with
- | ADimm base n => Op (Load (Oload1 ld a)) (PReg (#base) @ PReg (pmem) @ Enil)
- | ADreg base r => Op (Load (Oload2 ld a)) (PReg (#base) @ PReg(#r) @ PReg (pmem) @ Enil)
- | ADlsl base r n => Op (Load (Oload2 ld a)) (PReg (#base) @ PReg(#r) @ PReg (pmem) @ Enil)
- | ADsxt base r n => Op (Load (Oload2 ld a)) (PReg (#base) @ PReg(#r) @ PReg (pmem) @ Enil)
- | ADuxt base r n => Op (Load (Oload2 ld a)) (PReg (#base) @ PReg(#r) @ PReg (pmem) @ Enil)
- | ADadr base id ofs => Op (Load (Oload1 ld a)) (PReg (#base) @ PReg (pmem) @ Enil)
- | ADpostincr base n => Op (Load (Oload1 ld a)) (PReg (#base) @ PReg (pmem) @ Enil)
+ | ADimm base n => Op (Load (Oload1 ld chunk a)) (PReg (#base) @ PReg (pmem) @ Enil)
+ | ADreg base r => Op (Load (Oload2 ld chunk a)) (PReg (#base) @ PReg(#r) @ PReg (pmem) @ Enil)
+ | ADlsl base r n => Op (Load (Oload2 ld chunk a)) (PReg (#base) @ PReg(#r) @ PReg (pmem) @ Enil)
+ | ADsxt base r n => Op (Load (Oload2 ld chunk a)) (PReg (#base) @ PReg(#r) @ PReg (pmem) @ Enil)
+ | ADuxt base r n => Op (Load (Oload2 ld chunk a)) (PReg (#base) @ PReg(#r) @ PReg (pmem) @ Enil)
+ | ADadr base id ofs => Op (Load (Oload1 ld chunk a)) (PReg (#base) @ PReg (pmem) @ Enil)
+ | ADpostincr base n => Op (Load (Oload1 ld chunk a)) (PReg (#base) @ PReg (pmem) @ Enil)
+ end.
+
+Definition trans_ldp_chunk (chunk: memory_chunk): load_rd_a :=
+ match chunk with
+ | Many32 => Pldrw_a
+ | Mint64 => Pldrx
+ | Many64 => Pldrx_a
+ | _ => Pldrw
+ end.
+
+Definition trans_stp_chunk (chunk: memory_chunk): store_rs_a :=
+ match chunk with
+ | Many32 => Pstrw_a
+ | Mint64 => Pstrx
+ | Many64 => Pstrx_a
+ | _ => Pstrw
end.
Definition trans_load (ldi: ld_instruction) :=
match ldi with
| PLd_rd_a ld r a =>
- let lr := eval_addressing_rlocs_ld ldi a in [(#r, lr)]
- | Pldp ld r1 r2 a =>
- let ldi' :=
- match ld with
- | Pldpw => Pldrw
- | Pldpx => Pldrx
- end in
- let lr := eval_addressing_rlocs_ld (PLd_rd_a ldi' r1 a) a in
- let ofs := match ld with | Pldpw => 4%Z | Pldpx => 8%Z end in
+ let lr := eval_addressing_rlocs_ld ld (chunk_load ld) a in [(#r, lr)]
+ | Pldp ld r1 r2 chk1 chk2 a =>
+ let ldi1 := trans_ldp_chunk chk1 in
+ let ldi2 := trans_ldp_chunk chk2 in
+ let lr := eval_addressing_rlocs_ld ldi1 chk1 a in
+ let ofs := match chk1 with | Mint32 | Many32 => 4%Z | _ => 8%Z end in
match a with
| ADimm base n =>
let a' := (get_offset_addr a ofs) in
[(#r1, lr);
- (#r2, Op (Load (Oload1 (PLd_rd_a ldi' r2 a') a'))
+ (#r2, Op (Load (Oload1 ldi2 chk2 a'))
(Old(PReg (#base)) @ PReg (pmem) @ Enil))]
| _ => [(#PC, (Op (OError)) Enil)]
end
@@ -1174,20 +1187,17 @@ Definition trans_load (ldi: ld_instruction) :=
Definition trans_store (sti: st_instruction) :=
match sti with
| PSt_rs_a st r a =>
- let lr := eval_addressing_rlocs_st sti r a in [(pmem, lr)]
- | Pstp st r1 r2 a =>
- let sti' :=
- match st with
- | Pstpw => Pstrw
- | Pstpx => Pstrx
- end in
- let lr := eval_addressing_rlocs_st (PSt_rs_a sti' r1 a) r1 a in
- let ofs := match st with | Pstpw => 4%Z | Pstpx => 8%Z end in
+ let lr := eval_addressing_rlocs_st st (chunk_store st) r a in [(pmem, lr)]
+ | Pstp st r1 r2 chk1 chk2 a =>
+ let sti1 := trans_stp_chunk chk1 in
+ let sti2 := trans_stp_chunk chk2 in
+ let lr := eval_addressing_rlocs_st sti1 chk1 r1 a in
+ let ofs := match chk1 with | Mint32 | Many32 => 4%Z | _ => 8%Z end in
match a with
| ADimm base n =>
let a' := (get_offset_addr a ofs) in
[(pmem, lr);
- (pmem, Op (Store (Ostore1 (PSt_rs_a sti' r2 a') a'))
+ (pmem, Op (Store (Ostore1 sti2 chk2 a'))
(PReg (#r2) @ Old(PReg (#base)) @ PReg (pmem) @ Enil))]
| _ => [(#PC, (Op (OError)) Enil)]
end
@@ -1695,6 +1705,12 @@ Proof.
econstructor.
Qed.
+Lemma load_chunk_neutral: forall chk v,
+ interp_load (trans_ldp_chunk chk) v = v.
+Proof.
+ intros; destruct chk; simpl; reflexivity.
+Qed.
+
Theorem bisimu_basic rsr mr sr bi:
match_states (State rsr mr) sr ->
match_outcome (exec_basic Ge.(_lk) Ge.(_genv) bi rsr mr) (inst_run Ge (trans_basic bi) sr sr).
@@ -1721,14 +1737,16 @@ Local Ltac preg_eq_discr r rd :=
unfold exec_load1, exec_load2, chunk_load; unfold call_ll_loadv;
try destruct (Mem.loadv _ _ _); simpl; auto.
all: try (fold (ppos rd); Simpl_exists sr; auto; intros rr; Simpl_update).
- + unfold exec_load, exec_load_double, eval_addressing_rlocs_ld, exp_eval;
+ +
+ unfold exec_load, exec_load_double, eval_addressing_rlocs_ld, exp_eval;
destruct ld; destruct a; simpl; unfold control_eval; destruct Ge; auto;
try fold (ppos base);
try erewrite !H0, H; simpl;
- unfold exec_load1, exec_load2, chunk_load; unfold call_ll_loadv;
- try destruct (Mem.loadv _ _ _); simpl; auto;
+ unfold exec_load1, exec_load2; unfold call_ll_loadv;
+ destruct (Mem.loadv _ _ _); simpl; auto;
fold (ppos rd1); rewrite assign_diff; discriminate_ppos; rewrite H;
try destruct (Mem.loadv _ _ _); simpl; auto; Simpl_exists sr;
+ rewrite !load_chunk_neutral;
try (rewrite !assign_diff; discriminate_ppos; reflexivity);
try (destruct base; discriminate_ppos);
repeat (try fold (ppos r); intros; Simpl_update).
@@ -1746,7 +1764,7 @@ Local Ltac preg_eq_discr r rd :=
destruct st; destruct a; simpl; unfold control_eval; destruct Ge; auto;
try fold (ppos base); try fold (ppos rs1);
erewrite !H0, H; simpl;
- unfold exec_store1, exec_store2, chunk_store; unfold call_ll_storev;
+ unfold exec_store1, exec_store2; unfold call_ll_storev;
try destruct (Mem.storev _ _ _ _); simpl; auto;
fold (ppos rs2); rewrite assign_diff; try congruence; try rewrite H0; simpl;
try destruct (Mem.storev _ _ _ _); simpl; auto.
@@ -2473,22 +2491,22 @@ Definition string_of_ldi (ldi: ld_instruction) : ?? pstring:=
DO a' <~ string_of_addressing a;;
DO rd' <~ dreg_name rd;;
RET (Str "PLd_rd_a (" +; (string_of_ld_rd_a ld) +; " " +; rd' +; " " +; a' +; ")")
- | Pldp _ _ _ a =>
+ | Pldp _ _ _ _ _ a =>
DO a' <~ string_of_addressing a;;
RET (Str "Pldp (" +; a' +; ")")
end.
Definition string_of_load (op: load_op) : ?? pstring :=
match op with
- | Oload1 ld a =>
+ | Oload1 ld _ a =>
DO a' <~ string_of_addressing a;;
- DO ld' <~ string_of_ldi ld;;
- RET((Str "Oload1 ") +; " " +; ld' +; " " +; a' +; " ")
- | Oload2 ld a =>
+ (*DO ld' <~ string_of_ldi ld;;*)
+ RET((Str "Oload1 ") +; " " +; string_of_ld_rd_a ld +; " " +; a' +; " ")
+ | Oload2 ld _ a =>
DO a' <~ string_of_addressing a;;
- DO ld' <~ string_of_ldi ld;;
- RET((Str "Oload2 ") +; " " +; ld' +; " " +; a' +; " ")
- | OloadU _ _ => RET (Str "OloadU")
+ (*DO ld' <~ string_of_ldi ld;;*)
+ RET((Str "Oload2 ") +; " " +; string_of_ld_rd_a ld +; " " +; a' +; " ")
+ | OloadU _ _ _ => RET (Str "OloadU")
end.
Definition string_of_st_rs_a (st: store_rs_a) : pstring :=
@@ -2510,22 +2528,22 @@ Definition string_of_sti (sti: st_instruction) : ?? pstring:=
DO a' <~ string_of_addressing a;;
DO rs' <~ dreg_name rs;;
RET (Str "PSt_rs_a (" +; (string_of_st_rs_a st) +; " " +; rs' +; " " +; a' +; ")")
- | Pstp _ _ _ a =>
+ | Pstp _ _ _ _ _ a =>
DO a' <~ string_of_addressing a;;
RET (Str "Pstp (" +; a' +; ")")
end.
Definition string_of_store (op: store_op) : ?? pstring :=
match op with
- | Ostore1 st a =>
+ | Ostore1 st _ a =>
DO a' <~ string_of_addressing a;;
- DO st' <~ string_of_sti st;;
- RET((Str "Ostore1 ") +; " " +; st' +; " " +; a' +; " ")
- | Ostore2 st a =>
+ (*DO st' <~ string_of_sti st;;*)
+ RET((Str "Ostore1 ") +; " " +; string_of_st_rs_a st +; " " +; a' +; " ")
+ | Ostore2 st _ a =>
DO a' <~ string_of_addressing a;;
- DO st' <~ string_of_sti st;;
- RET((Str "Ostore2 ") +; " " +; st' +; " " +; a' +; " ")
- | OstoreU _ _ => RET (Str "OstoreU")
+ (*DO st' <~ string_of_sti st;;*)
+ RET((Str "Ostore2 ") +; " " +; string_of_st_rs_a st +; " " +; a' +; " ")
+ | OstoreU _ _ _ => RET (Str "OstoreU")
end.
Definition string_of_control (op: control_op) : pstring :=