Proof with eauto with reg_renamings val_renamings.
intros.
inversion Harg; subst.
eapply extcall_arg_reg in H; eauto.
destruct H as [arg' [Harg' Hobs_arg]].
exists arg'.
split...
constructor; auto.
eapply extcall_arg_reg in H; eauto.
eapply extcall_arg_reg in H0; eauto.
destruct H as [vhi' [Hhi' Hobs_hi]].
destruct H0 as [vlo' [Hlo' Hobs_lo]].
exists (Val.longofwords vhi' vlo').
split...
constructor; auto.
Qed.

(* Specifications: *)
Lemma extcall_arguments_ren:
forall f m m' ef args rs rs'
(Hexternal: extcall_arguments rs m (ef_sig ef) args)
(Hmem_obs_eq: mem_obs_eq f m m')
(Hrs_ren: regset_ren f rs rs'),
exists args',
extcall_arguments rs' m' (ef_sig ef) args' /\
val_obs_list f args args'.
Lemma core_inj_wd:
forall f c c',
core_inj f c c' ->
core_wd f c.
Lemma corestep_obs_eq:
forall the_ge (Hsafe : safe_genv the_ge) (cc cf cc' : state) (mc mf mc' : mem) f fg,
mem_obs_eq f mc mf ->
core_inj f cc cf ->
(forall b1 b2, fg b1 = Some b2 -> b1 = b2) ->
ge_wd fg the_ge ->
ren_incr fg f ->
corestep (Asm_core_sem the_ge) cc mc cc' mc' ->
exists (cf' : state) (mf' : mem) (f' : Renamings.memren),
corestep (Asm_core_sem the_ge) cf mf cf' mf' /\
core_inj f' cc' cf' /\
mem_obs_eq f' mc' mf' /\
ren_incr f f' /\
ren_separated f f' mc mf /\
((exists p : positive,
Mem.nextblock mc' = (Mem.nextblock mc + p)%positive /\
Mem.nextblock mf' = (Mem.nextblock mf + p)%positive) \/
Mem.nextblock mc' = Mem.nextblock mc /\
Mem.nextblock mf' = Mem.nextblock mf) /\
(forall b : block,
Mem.valid_block mf' b ->
~ Mem.valid_block mf b ->
let bz :=
(Z.pos b - (Z.pos (Mem.nextblock mf) - Z.pos (Mem.nextblock mc)))%Z in
f' (Z.to_pos bz) = Some b /\ f (Z.to_pos bz) = None) /\
(Mem.nextblock mc = Mem.nextblock mf ->
(forall b1 b2 : block, f b1 = Some b2 -> b1 = b2) ->
forall b1 b2 : block, f' b1 = Some b2 -> b1 = b2) /\
(forall b2 : block,
~ (exists b1 : block, f' b1 = Some b2) ->
forall ofs : Z,
permissions.permission_at mf b2 ofs Cur = permissions.permission_at mf' b2 ofs Cur).