Ltac cleanup_repr H :=
rewrite ?mul_repr, ?add_repr, ?sub_repr in H;
match type of H with
 | _ (Int.signed (Int.repr ?A)) (Int.signed (Int.repr ?B)) =>
    try (rewrite (Int.signed_repr A) in H by rep_omega);
    try (rewrite (Int.signed_repr B) in H by rep_omega)
 | _ (Int.unsigned (Int.repr ?A)) (Int.unsigned (Int.repr ?B)) =>
    try (rewrite (Int.unsigned_repr A) in H by rep_omega);
    try (rewrite (Int.unsigned_repr B) in H by rep_omega)
 | context [Int.signed (Int.repr ?A) ] =>
    try (rewrite (Int.signed_repr A) in H by rep_omega)
 | context [Int.unsigned (Int.repr ?A) ] =>
    try (rewrite (Int.unsigned_repr A) in H by rep_omega)
end.

Lemma int_repr_byte_signed_eq0: forall c, (Int.repr (Byte.signed c) = Int.zero) = (c = Byte.zero).