Remark int_ltu_2_inv:
forall y z,
Int.ltu y iwordsize' = true ->
Int.ltu z iwordsize' = true ->
Int.unsigned (Int.add y z) <= Int.unsigned iwordsize' ->
let y' := repr (Int.unsigned y) in
let z' := repr (Int.unsigned z) in
Int.unsigned y = unsigned y'
/\ Int.unsigned z = unsigned z'
/\ ltu y' iwordsize = true
/\ ltu z' iwordsize = true
/\ Int.unsigned (Int.add y z) = unsigned (add y' z')
/\ add y' z' = repr (Int.unsigned (Int.add y z)).

(* Specifications: *)
Theorem or_ror':
forall x y z,
Int.ltu y iwordsize' = true ->
Int.ltu z iwordsize' = true ->
Int.add y z = iwordsize' ->
ror x (repr (Int.unsigned z)) = or (shl' x y) (shru' x z).
Theorem shl'_shl':
forall x y z,
Int.ltu y iwordsize' = true ->
Int.ltu z iwordsize' = true ->
Int.ltu (Int.add y z) iwordsize' = true ->
shl' (shl' x y) z = shl' x (Int.add y z).
Theorem shru'_shru':
forall x y z,
Int.ltu y iwordsize' = true ->
Int.ltu z iwordsize' = true ->
Int.ltu (Int.add y z) iwordsize' = true ->
shru' (shru' x y) z = shru' x (Int.add y z).
Theorem shr'_shr':
forall x y z,
Int.ltu y iwordsize' = true ->
Int.ltu z iwordsize' = true ->
Int.ltu (Int.add y z) iwordsize' = true ->
shr' (shr' x y) z = shr' x (Int.add y z).
Theorem or_ror':
forall x y z,
Int.ltu y iwordsize' = true ->
Int.ltu z iwordsize' = true ->
Int.add y z = iwordsize' ->
ror x (repr (Int.unsigned z)) = or (shl' x y) (shru' x z).
Theorem shl'_shl':
forall x y z,
Int.ltu y iwordsize' = true ->
Int.ltu z iwordsize' = true ->
Int.ltu (Int.add y z) iwordsize' = true ->
shl' (shl' x y) z = shl' x (Int.add y z).
Theorem shru'_shru':
forall x y z,
Int.ltu y iwordsize' = true ->
Int.ltu z iwordsize' = true ->
Int.ltu (Int.add y z) iwordsize' = true ->
shru' (shru' x y) z = shru' x (Int.add y z).
Theorem shr'_shr':
forall x y z,
Int.ltu y iwordsize' = true ->
Int.ltu z iwordsize' = true ->
Int.ltu (Int.add y z) iwordsize' = true ->
shr' (shr' x y) z = shr' x (Int.add y z).