Section TRANSLATION.
Variable prog: Csharpminor.program.
Variable tprog: Cminor.program.
Hypothesis TRANSL: transl_program prog = OK tprog.
Let ge : Csharpminor.genv := Genv.globalenv prog.
(*Let gce : compilenv := build_global_compilenv prog.*)
Let tge: genv := Genv.globalenv tprog.
Let core_data := CSharpMin_core.
(*Lenb -- meminj_preserves_globales is new, and needed since this property is now required by the simulation realtions, rather than only at/efterexternal clauses*)
Inductive match_cores: core_data -> meminj -> CSharpMin_core -> mem -> CMin_core -> mem -> Prop :=
| MC_states:
forall d fn s k e le m tfn ts tk sp te tm cenv xenv j lo hi cs sz
(TRF: transl_funbody cenv sz fn = OK tfn)
(TR: transl_stmt cenv xenv s = OK ts)
(MINJ: Mem.inject j m tm)
(MCS: match_callstack prog j m tm
(Frame cenv tfn e le te sp lo hi :: cs)
(Mem.nextblock m) (Mem.nextblock tm))
(MK: match_cont k tk  cenv xenv cs)
(PG: meminj_preserves_globals ge j),
match_cores d j (CSharpMin_State fn s k e le) m
(CMin_State tfn ts tk (Vptr sp Int.zero) te) tm
| MC_state_seq:
forall d fn s1 s2 k e le m tfn ts1 tk sp te tm cenv xenv j lo hi cs sz
(TRF: transl_funbody cenv sz fn = OK tfn)
(TR: transl_stmt cenv xenv s1 = OK ts1)
(MINJ: Mem.inject j m tm)
(MCS: match_callstack prog j m tm
(Frame cenv tfn e le te sp lo hi :: cs)
(Mem.nextblock m) (Mem.nextblock tm))
(MK: match_cont (Csharpminor.Kseq s2 k) tk cenv xenv cs)
(PG: meminj_preserves_globals ge j),
match_cores d j (CSharpMin_State fn (Csharpminor.Sseq s1 s2) k e le) m
(CMin_State tfn ts1 tk (Vptr sp Int.zero) te) tm
| MC_callstate:
forall d fd args k m tfd targs tk tm j cs cenv
(TR: transl_fundef fd = OK tfd)
(MINJ: Mem.inject j m tm)
(MCS: match_callstack prog j m tm cs (Mem.nextblock m) (Mem.nextblock tm))
(MK: match_cont k tk cenv nil cs)
(ISCC: Csharpminor.is_call_cont k)
(ARGSINJ: val_list_inject j args targs)
(PG: meminj_preserves_globals ge j),
match_cores d j (CSharpMin_Callstate fd args k) m
(CMin_Callstate tfd targs tk) tm
| MC_returnstate:
forall d v k m tv tk tm j cs cenv
(MINJ: Mem.inject j m tm)
(MCS: match_callstack prog j m tm cs (Mem.nextblock m) (Mem.nextblock tm))
(MK: match_cont k tk cenv nil cs)
(RESINJ: val_inject j v tv)
(PG: meminj_preserves_globals ge j),
match_cores d j (CSharpMin_Returnstate v k) m
(CMin_Returnstate tv tk) tm.
(*--------------------------------------------------------------------*)

(*NEW:*) (PG: meminj_preserves_globals ge j), exists c2' : CMin_core, exists m2' : mem, corestep_plus CMin_core_sem tge (CMin_State tfn (Sassign id x) tk (Vptr sp Int.zero) te) tm c2' m2' /\ match_cores (CSharpMin_State f Csharpminor.Sskip k e (PTree.set id v lenv)) j (CSharpMin_State f Csharpminor.Sskip k e (PTree.set id v lenv)) m c2' m2'. (*  exists c' : CSharpMin_core, inj_match_states_star unit match_cores MC_measure (tt,c') j (CSharpMin_State f Csharpminor.Sskip k e lenv) m' c2' m2'.*)
(*no case Set in CompCert 2.0 Lemma MS_step_case_Set: forall cenv sz f tfn j m tm e lenv te sp lo hi cs k tk xenv x x0 v a id (H: Csharpminor.eval_expr ge e lenv m a v) (TRF : transl_funbody cenv sz f = OK tfn) (MINJ : Mem.inject j m tm) (MCS : match_callstack prog j m tm (Frame cenv tfn e lenv te sp lo hi :: cs) (Mem.nextblock m) (Mem.nextblock tm)) (MK : match_cont k tk (fn_return f) cenv xenv cs) (EQ : transl_expr cenv a = OK (x, x0)), exists c2' : CMin_core, exists m2' : mem, corestep_plus CMin_core_sem tge (CMin_State  tfn (Sassign (for_temp id) x) tk (Vptr sp Int.zero) te) tm c2' m2' /\ match_cores (CSharpMin_State f Csharpminor.Sskip k e (PTree.set id v lenv)) j (CSharpMin_State f Csharpminor.Sskip k e (PTree.set id v lenv)) m c2' m2' . (*  exists c' : CSharpMin_core, inj_match_states_star unit match_cores MC_measure (tt,c') j (CSharpMin_State f Csharpminor.Sskip k e (PTree.set id v lenv)) m c2' m2' .*)
Lemma MS_step_case_Store:
forall cenv sz f tfn j m tm e lenv te sp lo hi cs k tk xenv x x0 x1 x2
chunk m' a addr vaddr v
(CH: Mem.storev chunk m vaddr v = Some m')
(EvAddr : Csharpminor.eval_expr ge e lenv m addr vaddr)
(EvA : Csharpminor.eval_expr ge e lenv m a v)
(TRF : transl_funbody cenv sz f = OK tfn)
(MINJ : Mem.inject j m tm)
(MCS : match_callstack prog j m tm (Frame cenv tfn e lenv te sp lo hi :: cs)
(Mem.nextblock m) (Mem.nextblock tm))
(MK : match_cont k tk cenv xenv cs)
(EQ : transl_expr cenv addr = OK (x, x0))
(EQ1 : transl_expr cenv a = OK (x1, x2))