Remark eq_same_bits:
  forall i x y, x = y -> Int.testbit x i = Int.testbit y i.

(* Specifications: *)
Lemma iagree_and_eq: forall x y mask, iagree x y mask <-> Int.and x mask = Int.and y mask.
Lemma iagree_mone: forall p q, iagree p q Int.mone -> p = q.
Lemma iagree_zero: forall p q, iagree p q Int.zero.
Lemma iagree_and: forall x y n m, iagree x y (Int.and m n) -> iagree (Int.and x n) (Int.and y n) m.
Lemma iagree_not: forall x y m, iagree x y m -> iagree (Int.not x) (Int.not y) m.
Lemma iagree_not': forall x y m, iagree (Int.not x) (Int.not y) m -> iagree x y m.
Lemma iagree_or: forall x y n m, iagree x y (Int.and m (Int.not n)) -> iagree (Int.or x n) (Int.or y n) m.
Lemma iagree_bitwise_binop: forall sem f, (forall x y i, 0 <= i < Int.zwordsize -> Int.testbit (f x y) i = sem (Int.testbit x i) (Int.testbit y i)) -> forall x1 x2 y1 y2 m, iagree x1 y1 m -> iagree x2 y2 m -> iagree (f x1 x2) (f y1 y2) m.
Lemma iagree_shl: forall x y m n, iagree x y (Int.shru m n) -> iagree (Int.shl x n) (Int.shl y n) m.
Lemma iagree_shru: forall x y m n, iagree x y (Int.shl m n) -> iagree (Int.shru x n) (Int.shru y n) m.
Lemma iagree_shr_1: forall x y m n, Int.shru (Int.shl m n) n = m -> iagree x y (Int.shl m n) -> iagree (Int.shr x n) (Int.shr y n) m.
Lemma iagree_shr: forall x y m n, iagree x y (Int.or (Int.shl m n) (Int.repr Int.min_signed)) -> iagree (Int.shr x n) (Int.shr y n) m.
Lemma iagree_rol: forall p q m amount, iagree p q (Int.ror m amount) -> iagree (Int.rol p amount) (Int.rol q amount) m.
Lemma iagree_ror: forall p q m amount, iagree p q (Int.rol m amount) -> iagree (Int.ror p amount) (Int.ror q amount) m.
Lemma eqmod_iagree: forall m x y, Int.eqmod (two_p (Int.size m)) x y -> iagree (Int.repr x) (Int.repr y) m.