(* TODO put this into client_lemmas.v (contains already repable_signed, which is similar but does not
   know all of them *)

(* Equality proofs for all constants from the Compcert Int module: *)
Definition int_wordsize_eq : Int.wordsize = 32%nat := eq_refl.Definition int_zwordsize_eq : Int.zwordsize = 32 := eq_refl.Definition int_modulus_eq : Int.modulus = 4294967296 := eq_refl.Definition int_half_modulus_eq : Int.half_modulus = 2147483648 := eq_refl.Definition int_max_unsigned_eq : Int.max_unsigned = 4294967295 := eq_refl.Definition int_max_signed_eq : Int.max_signed = 2147483647 := eq_refl.Definition int_min_signed_eq : Int.min_signed = -2147483648 := eq_refl.Ltac my_repable_signed :=
   pose proof int_wordsize_eq;
   pose proof int_zwordsize_eq;
   pose proof int_modulus_eq;
   pose proof int_half_modulus_eq;
   pose proof int_max_unsigned_eq;
   pose proof int_max_signed_eq;
   pose proof int_min_signed_eq;
   unfold repable_signed in *;
   omega.

(* Specifications: *)
Lemma xtime_zero: forall (i : int), 0 <= (Int.unsigned i) < 256 -> xtime i = Int.zero -> i = Int.zero.
Lemma fast_times3: forall (i : int), 0 <= (Int.unsigned i) < 256 -> Int.xor i (xtime i) = ff_mult (Int.repr 3) i.
Lemma ff_exp_step: forall a e, 0 <= Int.unsigned a < 256 -> 0 <= e < Int.max_signed -> ff_exp a (Int.repr (1 + e)) = ff_mult a (ff_exp a (Int.repr e)).
Lemma exp3_step: forall e, 0 <= e < Int.max_signed -> ff_exp (Int.repr 3) (Int.repr (1 + e)) = ff_mult (Int.repr 3) (ff_exp (Int.repr 3) (Int.repr e)).