(** ** Construction 1: allocating the stack frame at function entry *)

Ltac splitall := repeat (match goal with |- _ /\ _ => split end).

Theorem external_call_match: forall ef (ge: genv) vargs m t vres m' bc rm am, external_call ef ge vargs m t vres m' -> genv_match bc ge -> (forall v, In v vargs -> vmatch bc v Vtop) -> romatch bc m rm -> mmatch bc m am -> bc_nostack bc -> exists bc', bc_incr bc bc' /\ (forall b, Plt b (Mem.nextblock m) -> bc' b = bc b) /\ vmatch bc' vres Vtop /\ genv_match bc' ge /\ romatch bc' m' rm /\ mmatch bc' m' mtop /\ bc_nostack bc' /\ (forall b ofs n, Mem.valid_block m b -> bc b = BCinvalid -> Mem.loadbytes m' b ofs n = Mem.loadbytes m b ofs n).