Common definition and proofs on Asmblock required by various modules
Require Import Coqlib.
Require Import Integers.
Require Import Memory.
Require Import Globalenvs.
Require Import Values.
Require Import Asmblock.
Require Import Axioms.
Definition bblock_simu (
ge:
Genv.t fundef unit) (
f:
function) (
bb bb':
bblock) :=
forall rs m,
exec_bblock ge f bb rs m <>
Stuck ->
exec_bblock ge f bb rs m =
exec_bblock ge f bb' rs m.
#[
global]
Hint Extern 2 (_ <> _) =>
congruence:
asmgen.
Lemma preg_of_data:
forall r,
data_preg (
preg_of r) =
true.
Proof.
intros. destruct r; reflexivity.
Qed.
#[
global]
Hint Resolve preg_of_data:
asmgen.
Lemma data_diff:
forall r r',
data_preg r =
true ->
data_preg r' =
false ->
r <>
r'.
Proof.
congruence.
Qed.
#[
global]
Hint Resolve data_diff:
asmgen.
Lemma preg_of_not_PC:
forall r,
preg_of r <>
PC.
Proof.
intros.
apply data_diff;
auto with asmgen.
Qed.
Lemma preg_of_not_SP:
forall r,
preg_of r <>
SP.
Proof.
intros.
unfold preg_of;
destruct r;
cbn;
congruence.
Qed.
#[
global]
Hint Resolve preg_of_not_SP preg_of_not_PC:
asmgen.
Lemma nextblock_pc:
forall b rs, (
nextblock b rs)#
PC =
Val.offset_ptr rs#
PC (
Ptrofs.repr (
size b)).
Proof.
Lemma nextblock_inv:
forall b r rs,
r <>
PC -> (
nextblock b rs)#
r =
rs#
r.
Proof.
Lemma nextblock_inv1:
forall b r rs,
data_preg r =
true -> (
nextblock b rs)#
r =
rs#
r.
Proof.
intros.
apply nextblock_inv.
red;
intro;
subst;
discriminate.
Qed.
Ltac Simplif :=
((
rewrite nextblock_inv by eauto with asmgen)
|| (
rewrite nextblock_inv1 by eauto with asmgen)
|| (
rewrite Pregmap.gss)
|| (
rewrite nextblock_pc)
|| (
rewrite Pregmap.gso by eauto with asmgen)
);
auto with asmgen.
Ltac Simpl :=
repeat Simplif.
Theorem exec_basic_instr_pc:
forall ge b rs1 m1 rs2 m2,
exec_basic_instr ge b rs1 m1 =
Next rs2 m2 ->
rs2 PC =
rs1 PC.
Proof.
Lemma regset_double_set:
forall r1 r2 (
rs:
regset)
v1 v2,
r1 <>
r2 ->
(
rs #
r1 <-
v1 #
r2 <-
v2) = (
rs #
r2 <-
v2 #
r1 <-
v1).
Proof.
Lemma next_eq:
forall (
rs rs':
regset)
m m',
rs =
rs' ->
m =
m' ->
Next rs m =
Next rs' m'.
Proof.
Lemma exec_load_offset_pc_var:
forall trap t rs m rd ra ofs rs' m' v,
exec_load_offset trap t rs m rd ra ofs =
Next rs' m' ->
exec_load_offset trap t rs #
PC <-
v m rd ra ofs =
Next rs' #
PC <-
v m'.
Proof.
Lemma exec_load_reg_pc_var:
forall trap t rs m rd ra ro rs' m' v,
exec_load_reg trap t rs m rd ra ro =
Next rs' m' ->
exec_load_reg trap t rs #
PC <-
v m rd ra ro =
Next rs' #
PC <-
v m'.
Proof.
Lemma exec_load_regxs_pc_var:
forall trap t rs m rd ra ro rs' m' v,
exec_load_regxs trap t rs m rd ra ro =
Next rs' m' ->
exec_load_regxs trap t rs #
PC <-
v m rd ra ro =
Next rs' #
PC <-
v m'.
Proof.
Lemma exec_load_offset_q_pc_var:
forall rs m rd ra ofs rs' m' v,
exec_load_q_offset rs m rd ra ofs =
Next rs' m' ->
exec_load_q_offset rs #
PC <-
v m rd ra ofs =
Next rs' #
PC <-
v m'.
Proof.
Lemma exec_load_offset_o_pc_var:
forall rs m rd ra ofs rs' m' v,
exec_load_o_offset rs m rd ra ofs =
Next rs' m' ->
exec_load_o_offset rs #
PC <-
v m rd ra ofs =
Next rs' #
PC <-
v m'.
Proof.
Lemma exec_store_offset_pc_var:
forall t rs m rd ra ofs rs' m' v,
exec_store_offset t rs m rd ra ofs =
Next rs' m' ->
exec_store_offset t rs #
PC <-
v m rd ra ofs =
Next rs' #
PC <-
v m'.
Proof.
Lemma exec_store_q_offset_pc_var:
forall rs m rd ra ofs rs' m' v,
exec_store_q_offset rs m rd ra ofs =
Next rs' m' ->
exec_store_q_offset rs #
PC <-
v m rd ra ofs =
Next rs' #
PC <-
v m'.
Proof.
Lemma exec_store_o_offset_pc_var:
forall rs m rd ra ofs rs' m' v,
exec_store_o_offset rs m rd ra ofs =
Next rs' m' ->
exec_store_o_offset rs #
PC <-
v m rd ra ofs =
Next rs' #
PC <-
v m'.
Proof.
Lemma exec_store_reg_pc_var:
forall t rs m rd ra ro rs' m' v,
exec_store_reg t rs m rd ra ro =
Next rs' m' ->
exec_store_reg t rs #
PC <-
v m rd ra ro =
Next rs' #
PC <-
v m'.
Proof.
Lemma exec_store_regxs_pc_var:
forall t rs m rd ra ro rs' m' v,
exec_store_regxs t rs m rd ra ro =
Next rs' m' ->
exec_store_regxs t rs #
PC <-
v m rd ra ro =
Next rs' #
PC <-
v m'.
Proof.
Theorem exec_basic_instr_pc_var:
forall ge i rs m rs' m' v,
exec_basic_instr ge i rs m =
Next rs' m' ->
exec_basic_instr ge i (
rs #
PC <-
v)
m =
Next (
rs' #
PC <-
v)
m'.
Proof.