Hint Resolve make_cast_int_correct make_longofint_correct: cshm.
Ltac InvEval :=
match goal with
| [ H: None = Some _ |- _ ] => discriminate
| [ H: Some _ = Some _ |- _ ] => inv H; InvEval
| [ H: match ?x with Some _ => _ | None => _ end = Some _ |- _ ] => destruct x eqn:?; InvEval
| [ H: match ?x with true => _ | false => _ end = Some _ |- _ ] => destruct x eqn:?; InvEval
| _ => idtac
end.

(* Specifications: *)
Lemma make_cast_correct:
forall e le m a b v ty1 ty2 v',
make_cast ty1 ty2 a = OK b ->
eval_expr ge e le m a v ->
sem_cast v ty1 ty2 m = Some v' ->
eval_expr ge e le m b v'.
Lemma make_boolean_correct:
forall e le m a v ty b,
eval_expr ge e le m a v ->
bool_val v ty m = Some b ->
exists vb,
eval_expr ge e le m (make_boolean a ty) vb
/\ Val.bool_of_val vb b.
Lemma make_neg_correct:
forall a tya c va v e le m,
sem_neg va tya = Some v ->
make_neg a tya = OK c ->
eval_expr ge e le m a va ->
eval_expr ge e le m c v.
Lemma make_absfloat_correct:
forall a tya c va v e le m,
sem_absfloat va tya = Some v ->
make_absfloat a tya = OK c ->
eval_expr ge e le m a va ->
eval_expr ge e le m c v.
Lemma make_notbool_correct:
forall a tya c va v e le m,
sem_notbool va tya m = Some v ->
make_notbool a tya = OK c ->
eval_expr ge e le m a va ->
eval_expr ge e le m c v.
Lemma make_notint_correct:
forall a tya c va v e le m,
sem_notint va tya = Some v ->
make_notint a tya = OK c ->
eval_expr ge e le m a va ->
eval_expr ge e le m c v.