Inductive match_frames: RTL.stackframe -> RTL.stackframe -> Prop :=
| match_frames_intro: forall res f sp pc rs
(REACH: reach f pc),
match_frames (Stackframe res f sp pc rs)
(Stackframe res (transf_function f) sp (renum_pc (pnum f) pc) rs).
Inductive match_states: RTL.state -> RTL.state -> Prop :=
| match_regular_states: forall stk f sp pc rs m stk'
(STACKS: list_forall2 match_frames stk stk')
(REACH: reach f pc),
match_states (State stk f sp pc rs m)
(State stk' (transf_function f) sp (renum_pc (pnum f) pc) rs m)
| match_callstates: forall stk f args m stk'
(STACKS: list_forall2 match_frames stk stk'),
match_states (Callstate stk f args m)
(Callstate stk' (transf_fundef f) args m)
| match_returnstates: forall stk v m stk'
(STACKS: list_forall2 match_frames stk stk'),
match_states (Returnstate stk v m)
(Returnstate stk' v m).

(* Specifications: *)
Lemma step_simulation:
forall S1 t S2, RTL.step ge S1 t S2 ->
forall S1', match_states S1 S1' ->
exists S2', RTL.step tge S1' t S2' /\ match_states S2 S2'.
Lemma transf_initial_states:
forall S1, RTL.initial_state prog S1 ->
exists S2, RTL.initial_state tprog S2 /\ match_states S1 S2.
Lemma transf_final_states:
forall S1 S2 r, match_states S1 S2 -> RTL.final_state S1 r -> RTL.final_state S2 r.
Theorem transf_program_correct:
forward_simulation (RTL.semantics prog) (RTL.semantics tprog).