Fixpoint iterShr8 u n :=
  match n with O => u
   | S n' => Int.shru (iterShr8 u n') (Int.repr 8)
  end.

(* Specifications: *)
Lemma Znth_mapVint: forall {d: Inhabitant _} l i, 0<=i< Zlength l -> exists x, Znth i (map Vint l) = Vint x.
Lemma app_inj {A}: forall l l' (L:Zlength l = Zlength l') (m m':list A) (M: Zlength m = Zlength m'), l ++ m = l'++m' -> l=l' /\ m = m'.
Lemma list_eq_dec_app {A} (eq_dec: forall x y : A, {x = y} + {x <> y}): forall l m l' m' (L:Zlength l = Zlength l') (M: Zlength m = Zlength m'), ((if list_eq_dec eq_dec (l++m) (l'++m') then true else false) = ((if list_eq_dec eq_dec l l' then true else false) && (if list_eq_dec eq_dec m m' then true else false)))%bool.
Lemma combine_app {A B}: forall (l1:list A) (m1:list B) l2 m2 (L:Zlength l1 = Zlength m1) (M: Zlength l2 = Zlength m2), combine (l1 ++ l2) (m1 ++ m2) = combine l1 m1 ++ combine l2 m2.
Lemma Byte_zero_ext_8 b: Byte.zero_ext 8 b = b.
Lemma Byte_Int_max_unsigned: Byte.max_unsigned < Int.max_unsigned.
Lemma byte_unsigned_range_int_unsigned_max x: 0 <= Byte.unsigned x <= Int.max_unsigned.
Lemma Zlxor_of_byte_range x y: 0 <= Z.lxor (Byte.unsigned x) (Byte.unsigned y) <= Byte.max_unsigned.
Lemma unsigned_xor_Byte_Int xi yi: Byte.unsigned (Byte.xor xi yi) = Int.unsigned (Int.xor (Int.repr (Byte.unsigned xi)) (Int.repr (Byte.unsigned yi))).
Lemma Z_lxor_byte_neq b1 b2 (B:b1 <> b2): exists b, Z.lxor (Byte.unsigned b1) (Byte.unsigned b2) = Byte.unsigned b /\ b <> Byte.zero.
Lemma Zlor_of_byte_range x y: 0 <= Z.lor (Byte.unsigned x) (Byte.unsigned y) <= Byte.max_unsigned.
Lemma Zlor_Byteor b1 b2: Z.lor (Byte.unsigned b1) (Byte.unsigned b2) = Byte.unsigned (Byte.or b1 b2).
Lemma ByteOr_zero b1 b2 (B: Byte.or b1 b2 = Byte.zero): b1=Byte.zero /\ b2=Byte.zero.