Require Coq.funind.Recdef.

(* Specifications: *)
Lemma power_nat_one_divede_other: forall n m : nat,
(two_power_nat n | two_power_nat m) \/ (two_power_nat m | two_power_nat n).
Lemma multiple_divide_mod: forall a b c, b > 0 -> ((a | b) \/ (b | a)) -> (a | (c * a mod b)).
Lemma divide_align: forall x y: Z, x > 0 -> Z.divide x y -> align y x = y.
Lemma arith_aux00: forall a b, b <= a -> 0%nat = nat_of_Z (a - b) -> a - b = 0.
Lemma arith_aux01: forall a b n, S n = nat_of_Z (a - b) -> b < a.
Lemma arith_aux02: forall n a b, S n = nat_of_Z (a - b) -> n = nat_of_Z (a - Z.succ b).
Lemma arith_aux03: forall a b c,
0 <= b ->
0 <= a + b * c ->
0 <= a + b * Z.succ c.
Lemma arith_aux04: forall a b c,
0 <= b <= c ->
(a | b) ->
(a | b mod c).
Lemma arith_aux05: forall lo hi, 0 <= lo -> 0 <= hi ->
0 <= Z.max 0 (hi - lo) <= hi.
Lemma arith_aux06: forall lo hi n, 0 <= lo <= n -> 0 <= hi <= n -> 0 <= lo + Z.max 0 (hi - lo) <= n.
Ltac inv_int i :=
let ofs := fresh "ofs" in
let H := fresh "H" in
let H0 := fresh "H" in
let H1 := fresh "H" in
match type of i with
| int =>
pose proof Int.repr_unsigned i as H;
pose proof Int.unsigned_range i as H0;
remember (Int.unsigned i) as ofs eqn:H1;
rewrite <- H in *;
clear H H1; try clear i
| ptrofs =>
pose proof Ptrofs.repr_unsigned i as H;
pose proof Ptrofs.unsigned_range i as H0;
remember (Ptrofs.unsigned i) as ofs eqn:H1;
rewrite <- H in *;
clear H H1; try clear i
end.