Definition helper_declared {F V: Type} (p: AST.program (AST.fundef F) V) (id: ident) (name: string) (sg: signature) : Prop :=
(prog_defmap p)!id = Some (Gfun (External (EF_runtime name sg))).
Definition helper_functions_declared {F V: Type} (p: AST.program (AST.fundef F) V) (hf: helper_functions) : Prop :=
helper_declared p i64_dtos "__compcert_i64_dtos" sig_f_l
/\ helper_declared p i64_dtou "__compcert_i64_dtou" sig_f_l
/\ helper_declared p i64_stod "__compcert_i64_stod" sig_l_f
/\ helper_declared p i64_utod "__compcert_i64_utod" sig_l_f
/\ helper_declared p i64_stof "__compcert_i64_stof" sig_l_s
/\ helper_declared p i64_utof "__compcert_i64_utof" sig_l_s
/\ helper_declared p i64_sdiv "__compcert_i64_sdiv" sig_ll_l
/\ helper_declared p i64_udiv "__compcert_i64_udiv" sig_ll_l
/\ helper_declared p i64_smod "__compcert_i64_smod" sig_ll_l
/\ helper_declared p i64_umod "__compcert_i64_umod" sig_ll_l
/\ helper_declared p i64_shl "__compcert_i64_shl" sig_li_l
/\ helper_declared p i64_shr "__compcert_i64_shr" sig_li_l
/\ helper_declared p i64_sar "__compcert_i64_sar" sig_li_l
/\ helper_declared p i64_umulh "__compcert_i64_umulh" sig_ll_l
/\ helper_declared p i64_smulh "__compcert_i64_smulh" sig_ll_l.
(** * Correctness of the instruction selection functions for 64-bit operators *)
Section CMCONSTR.
Variable prog: program.
Variable hf: helper_functions.
Hypothesis HELPERS: helper_functions_declared prog hf.
Let ge := Genv.globalenv prog.
Variable sp: val.
Variable e: env.
Variable m: mem.
Ltac UseHelper := decompose [Logic.and] i64_helpers_correct; eauto.
Ltac DeclHelper := red in HELPERS; decompose [Logic.and] HELPERS; eauto.

(* Specifications: *)
Lemma eval_helper:
forall le id name sg args vargs vres,
eval_exprlist ge sp e m le args vargs ->
helper_declared prog id name sg  ->
external_implements name sg vargs vres ->
eval_expr ge sp e m le (Eexternal id sg args) vres.
Corollary eval_helper_1:
forall le id name sg arg1 varg1 vres,
eval_expr ge sp e m le arg1 varg1 ->
helper_declared prog id name sg  ->
external_implements name sg (varg1::nil) vres ->
eval_expr ge sp e m le (Eexternal id sg (arg1 ::: Enil)) vres.
Corollary eval_helper_2:
forall le id name sg arg1 arg2 varg1 varg2 vres,
eval_expr ge sp e m le arg1 varg1 ->
eval_expr ge sp e m le arg2 varg2 ->
helper_declared prog id name sg  ->
external_implements name sg (varg1::varg2::nil) vres ->
eval_expr ge sp e m le (Eexternal id sg (arg1 ::: arg2 ::: Enil)) vres.