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.

(* Specifications: *)
Lemma tc_andp_TT2: forall e, tc_andp e tc_TT = e.
Lemma tc_andp_TT1: forall e, tc_andp tc_TT e = e.
Lemma or_False: forall x, (x \/ False) = x.
Lemma or_True: forall x, (x \/ True) = True.
Lemma True_or: forall x, (True \/ x) = True.
Lemma False_or: forall x, (False \/ x) = x.
Lemma tc_orp_sound : forall {CS: compspecs} a1 a2 rho m, denote_tc_assert (tc_orp a1 a2) rho m <-> denote_tc_assert (tc_orp' a1 a2) rho m.
Lemma denote_tc_assert_orp: forall {CS: compspecs} x y rho, denote_tc_assert (tc_orp x y) rho = orp (denote_tc_assert x rho) (denote_tc_assert y rho).
Lemma is_true_true: is_true true = True.
Lemma is_true_false: is_true false = False.
Lemma denote_tc_assert_iszero: forall {CS: compspecs} e rho, denote_tc_assert (tc_iszero e) rho = match (eval_expr e rho) with | Vint i => prop (is_true (Int.eq i Int.zero)) | Vlong i => prop (is_true (Int64.eq i Int64.zero)) | _ => FF end.
Lemma denote_tc_assert_iszero': forall {CS: compspecs} e, denote_tc_assert (tc_iszero e) = denote_tc_assert (tc_iszero' e).
Lemma denote_tc_assert_nonzero: forall {CS: compspecs} e rho, denote_tc_assert (tc_nonzero e) rho = match (eval_expr e rho) with | Vint i => prop (i <> Int.zero) | Vlong i =>prop (i <> Int64.zero) | _ => FF end.
Lemma denote_tc_assert_nonzero': forall {CS: compspecs} e, denote_tc_assert (tc_nonzero e) = denote_tc_assert (tc_nonzero' e).
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.
Lemma denote_tc_assert_nodivover': forall {CS: compspecs} e1 e2, denote_tc_assert (tc_nodivover e1 e2) = denote_tc_assert (tc_nodivover' e1 e2).
Lemma denote_tc_assert_andp'': forall {CS: compspecs} a b rho, denote_tc_assert (tc_andp' a b) rho = andp (denote_tc_assert a rho) (denote_tc_assert b rho).
Lemma denote_tc_assert_orp'': forall {CS: compspecs} a b rho, denote_tc_assert (tc_orp' a b) rho = orp (denote_tc_assert a rho) (denote_tc_assert b rho).
Lemma denote_tc_assert_andp': forall {CS: compspecs} a b, denote_tc_assert (tc_andp a b) = denote_tc_assert (tc_andp' a b).
Lemma denote_tc_assert_orp': forall {CS: compspecs} a b, denote_tc_assert (tc_orp a b) = denote_tc_assert (tc_orp' a b).
Lemma denote_tc_assert_test_eq': forall {CS: compspecs} a b, denote_tc_assert (tc_test_eq a b) = denote_tc_assert (tc_test_eq' a b).
Lemma denote_tc_assert_test_order': forall {CS: compspecs} a b, denote_tc_assert (tc_test_order a b) = denote_tc_assert (tc_test_order' a b).