Ltac solve_tc_val H :=
  rewrite tc_val_tc_val_PM in H; inv H.Ltac solve_tc_val' H :=
  rewrite tc_val_tc_val_PM' in H; inv H.

(* Specifications: *)
Lemma tc_val_sem_binarith': forall {CS: compspecs} sem_int sem_long sem_float sem_single t1 t2 t v1 v2 deferr reterr rho m (TV2: tc_val t2 v2) (TV1: tc_val t1 v1), (denote_tc_assert (binarithType' t1 t2 t deferr reterr) rho) m -> tc_val t (force_val (Clight_Cop2.sem_binarith (fun s n1 n2 => Some (Vint (sem_int s n1 n2))) (fun s n1 n2 => Some (Vlong (sem_long s n1 n2))) (fun n1 n2 => Some (Vfloat (sem_float n1 n2))) (fun n1 n2 => Some (Vsingle (sem_single n1 n2))) t1 t2 v1 v2)).
Lemma tc_val_sem_cmp_binarith': forall sem_int sem_long sem_float sem_single t1 t2 t v1 v2 (TV2: tc_val t2 v2) (TV1: tc_val t1 v1), is_numeric_type t1 = true -> is_numeric_type t2 = true -> is_int_type t = true -> tc_val t (force_val (Clight_Cop2.sem_binarith (fun s n1 n2 => Some (Val.of_bool (sem_int s n1 n2))) (fun s n1 n2 => Some (Val.of_bool (sem_long s n1 n2))) (fun n1 n2 => Some (Val.of_bool (sem_float n1 n2))) (fun n1 n2 => Some (Val.of_bool (sem_single n1 n2))) t1 t2 v1 v2)).
Lemma negb_true: forall a, negb a = true -> a = false.
Lemma typecheck_Oadd_sound: forall {CS: compspecs} (rho : environ) m (e1 e2 : expr) (t : type) (IBR: denote_tc_assert (isBinOpResultType Oadd e1 e2 t) rho m) (TV2: tc_val (typeof e2) (eval_expr e2 rho)) (TV1: tc_val (typeof e1) (eval_expr e1 rho)), tc_val t (eval_binop Oadd (typeof e1) (typeof e2) (eval_expr e1 rho) (eval_expr e2 rho)).
Lemma peq_eq_block: forall a b A (c d: A), is_true (peq a b) -> (if eq_block a b then c else d) = c.
Lemma typecheck_Osub_sound: forall {CS: compspecs} (rho : environ) m (e1 e2 : expr) (t : type) (IBR: denote_tc_assert (isBinOpResultType Osub e1 e2 t) rho m) (TV2: tc_val (typeof e2) (eval_expr e2 rho)) (TV1: tc_val (typeof e1) (eval_expr e1 rho)), tc_val t (eval_binop Osub (typeof e1) (typeof e2) (eval_expr e1 rho) (eval_expr e2 rho)).
Lemma typecheck_Omul_sound: forall {CS: compspecs} (rho : environ) m (e1 e2 : expr) (t : type) (IBR: denote_tc_assert (isBinOpResultType Omul e1 e2 t) rho m) (TV2: tc_val (typeof e2) (eval_expr e2 rho)) (TV1: tc_val (typeof e1) (eval_expr e1 rho)), tc_val t (eval_binop Omul (typeof e1) (typeof e2) (eval_expr e1 rho) (eval_expr e2 rho)).
Lemma typecheck_Odiv_sound: forall {CS: compspecs} (rho : environ) m (e1 e2 : expr) (t : type) (IBR: denote_tc_assert (isBinOpResultType Odiv e1 e2 t) rho m) (TV2: tc_val (typeof e2) (eval_expr e2 rho)) (TV1: tc_val (typeof e1) (eval_expr e1 rho)), tc_val t (eval_binop Odiv (typeof e1) (typeof e2) (eval_expr e1 rho) (eval_expr e2 rho)).
Lemma typecheck_Omod_sound: forall {CS: compspecs} (rho : environ) m (e1 e2 : expr) (t : type) (IBR: denote_tc_assert (isBinOpResultType Omod e1 e2 t) rho m) (TV2: tc_val (typeof e2) (eval_expr e2 rho)) (TV1: tc_val (typeof e1) (eval_expr e1 rho)), tc_val t (eval_binop Omod (typeof e1) (typeof e2) (eval_expr e1 rho) (eval_expr e2 rho)).
Lemma typecheck_Oshift_sound: forall op {CS: compspecs} (rho : environ) m (e1 e2 : expr) (t : type) (IBR: denote_tc_assert (isBinOpResultType op e1 e2 t) rho m) (TV2: tc_val (typeof e2) (eval_expr e2 rho)) (TV1: tc_val (typeof e1) (eval_expr e1 rho)) (OP: op = Oshl \/ op = Oshr), tc_val t (eval_binop op (typeof e1) (typeof e2) (eval_expr e1 rho) (eval_expr e2 rho)).
Lemma typecheck_Obin_sound: forall op {CS: compspecs} (rho : environ) m (e1 e2 : expr) (t : type) (IBR: denote_tc_assert (isBinOpResultType op e1 e2 t) rho m) (TV2: tc_val (typeof e2) (eval_expr e2 rho)) (TV1: tc_val (typeof e1) (eval_expr e1 rho)) (OP: op = Oand \/ op = Oor \/ op = Oxor), tc_val t (eval_binop op (typeof e1) (typeof e2) (eval_expr e1 rho) (eval_expr e2 rho)).