Definition denote_tc_assert' {CS: compspecs} (a: tc_assert) (rho: environ) : mpred.
pose (P := denote_tc_assert a rho).
unfold denote_tc_assert in P.
super_unfold_lift.
destruct a; apply P.
Defined.
Definition check_pp_int' e1 e2 op t e :=
match op with
| Cop.Oeq | Cop.One =>
tc_andp'
(tc_test_eq' e1 e2)
(tc_bool (is_int_type t) (op_result_type e))
| Cop.Ole | Cop.Olt | Cop.Oge | Cop.Ogt =>
tc_andp'
(tc_test_order' e1 e2)
(tc_bool (is_int_type t) (op_result_type e))
| _ => tc_noproof
end.
(* Definition check_pl_long' e2 op t e := match op with | Cop.Oeq | Cop.One => tc_andp' (tc_iszero' e2) (tc_bool (is_int_type t) (op_result_type e)) | _ => tc_noproof end. *)

Lemma denote_tc_assert_nodivover: forall {CS: compspecs} e1 e2 rho,
denote_tc_assert (tc_nodivover e1 e2) rho =
match eval_expr e1 rho, eval_expr e2 rho with
| Vint n1, Vint n2 => prop (~(n1 = Int.repr Int.min_signed /\ n2 = Int.mone))
| Vlong n1, Vlong n2 => prop (~(n1 = Int64.repr Int64.min_signed /\ n2 = Int64.mone))
| Vint n1, Vlong n2 => TT
| Vlong n1, Vint n2 => prop (~ (n1 = Int64.repr Int64.min_signed  /\ n2 = Int.mone))
| _ , _ => FF
end.