Proof with eauto with val_renamings.
intros.
erewrite eval_testcond_ren; eauto.
destruct (eval_testcond c rs') as [[|]|];
unfold Val.of_optbool, Vtrue, Vfalse...
Qed.
Hint Resolve compare_floats_ren compare_floats32_ren
compare_ints_ren compare_longs_ren : reg_renamings.
Hint Resolve val_obs_addrmode32 val_obs_addrmode64 val_obs_addrmode val_obs_testcond : val_renamings.

(* Specifications: *)
(** Executing an instruction in related states results in related states: 1. The renaming function is extended to accommodate newly allocated blocks. 2. The extension to the renaming only relates newly allocated blocks 3. The nextblock of the two memories is increased by the same amount of blocks 4. Any newly allocated block on the second memory is mapped by a new block on the first memory (computable inverse) 5. If the initial nextblocks are equal and the two memories were related by an id renaming, then the new memories are still related by an (extended) id renaming*)
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).