(** Injections on registers *)

  Definition reg_ren f (r:PregEq.t) (rs rs' : regset) : Prop :=
    val_obs f (Pregmap.get r rs) (Pregmap.get r rs').Definition regset_ren f rs rs' : Prop :=
    forall r, reg_ren f r rs rs'.Definition core_inj f c c' :=
    match c, c' with State rs _, State rs' _ => regset_ren f rs rs' end.

Lemma exec_instr_ren: forall (g : genv) (fn : function) (i : instruction) (rs rs' rs2: regset) (m m' m2 : mem) (f fg: memren) (Hmem_obs_eq: mem_obs_eq f m m') (Hrs_eq: regset_ren f rs rs') (Hfg: forall b1 b2, fg b1 = Some b2 -> b1 = b2) (Hge_wd: ge_wd fg g) (Hincr: ren_incr fg f) (Hexec: exec_instr g fn i rs m = Next rs2 m2), exists f' rs2' m2', exec_instr g fn i rs' m' = Next rs2' m2' /\ regset_ren f' rs2 rs2' /\ mem_obs_eq f' m2 m2' /\ ren_incr f f' /\ ren_separated f f' m m' /\ ((exists p : positive, Mem.nextblock m2 = (Mem.nextblock m + p)%positive /\ Mem.nextblock m2' = (Mem.nextblock m' + p)%positive) \/ Mem.nextblock m2 = Mem.nextblock m /\ Mem.nextblock m2' = Mem.nextblock m') /\ (forall b0 : block, Mem.valid_block m2' b0 -> ~ Mem.valid_block m' b0 -> f' (Z.to_pos match (- Z.pos_sub (Mem.nextblock m') (Mem.nextblock m))%Z with | 0%Z => Z.pos b0 | Z.pos y' => Z.pos (b0 + y') | Z.neg y' => Z.pos_sub b0 y' end) = Some b0 /\ f (Z.to_pos match (- Z.pos_sub (Mem.nextblock m') (Mem.nextblock m))%Z with | 0%Z => Z.pos b0 | Z.pos y' => Z.pos (b0 + y') | Z.neg y' => Z.pos_sub b0 y' end) = None) /\ (Mem.nextblock m = Mem.nextblock m' -> (forall b1 b3 : block, f b1 = Some b3 -> b1 = b3) -> forall b1 b0 : block, f' b1 = Some b0 -> b1 = b0) /\ (forall b2 : block, ~ (exists b1 : block, f' b1 = Some b2) -> forall ofs : Z, permissions.permission_at m' b2 ofs Cur = permissions.permission_at m2' b2 ofs Cur).