Remark eval_builtin_args_trivial:
forall (ge: RTL.genv) (rs: regset) sp m rl,
eval_builtin_args ge (fun r => rs#r) sp m (List.map (@BA reg) rl) rs##rl.

(* Specifications: *)
Lemma transl_expr_Ebuiltin_correct:
forall le ef al vl v,
eval_exprlist ge sp e m le al vl ->
transl_exprlist_prop le al vl ->
external_call ef ge vl m E0 v m ->
transl_expr_prop le (Ebuiltin ef al) v.
Lemma transl_expr_Eexternal_correct:
forall le id sg al b ef vl v,
Genv.find_symbol ge id = Some b ->
Genv.find_funct_ptr ge b = Some (External ef) ->
ef_sig ef = sg ->
eval_exprlist ge sp e m le al vl ->
transl_exprlist_prop le al vl ->
external_call ef ge vl m E0 v m ->
transl_expr_prop le (Eexternal id sg al) v.
Lemma transl_exprlist_Enil_correct:
forall (le : letenv),
transl_exprlist_prop le Enil nil.
Lemma transl_exprlist_Econs_correct:
forall (le : letenv) (a1 : expr) (al : exprlist) (v1 : val)
(vl : list val),
eval_expr ge sp e m le a1 v1 ->
transl_expr_prop le a1 v1 ->
eval_exprlist ge sp e m le al vl ->
transl_exprlist_prop le al vl ->
transl_exprlist_prop le (Econs a1 al) (v1 :: vl).
Lemma transl_condexpr_CEcond_correct:
forall le cond al vl vb,
eval_exprlist ge sp e m le al vl ->
transl_exprlist_prop le al vl ->
eval_condition cond vl m = Some vb ->
transl_condexpr_prop le (CEcond cond al) vb.
Lemma transl_condexpr_CEcondition_correct:
forall le a b c va v,
eval_condexpr ge sp e m le a va ->
transl_condexpr_prop le a va ->
eval_condexpr ge sp e m le (if va then b else c) v ->
transl_condexpr_prop le (if va then b else c) v ->
transl_condexpr_prop le (CEcondition a b c) v.
Lemma transl_condexpr_CElet_correct:
forall le a b v1 v2,
eval_expr ge sp e m le a v1 ->
transl_expr_prop le a v1 ->
eval_condexpr ge sp e m (v1 :: le) b v2 ->
transl_condexpr_prop (v1 :: le) b v2 ->
transl_condexpr_prop le (CElet a b) v2.
Theorem transl_expr_correct:
forall le a v,
eval_expr ge sp e m le a v ->
transl_expr_prop le a v.