Remark eval_shift_imm:
forall (P: expr -> Prop) n a0 a1 a2 a3,
(n = Int.zero -> P a0) ->
(0 <= Int.unsigned n < Int.zwordsize ->
Int.ltu n Int.iwordsize = true ->
Int.ltu (Int.sub Int.iwordsize n) Int.iwordsize = true ->
Int.ltu n Int64.iwordsize' = true ->
P a1) ->
(Int.zwordsize <= Int.unsigned n < Int64.zwordsize ->
Int.ltu (Int.sub n Int.iwordsize) Int.iwordsize = true ->
P a2) ->
P a3 ->
P (if Int.eq n Int.zero then a0
else if Int.ltu n Int.iwordsize then a1
else if Int.ltu n Int64.iwordsize' then a2
else a3).

(* Specifications: *)
Lemma eval_shllimm:
forall n,
unary_constructor_sound (fun e => shllimm e n) (fun v => Val.shll v (Vint n)).
Theorem eval_shll: binary_constructor_sound shll Val.shll.
Lemma eval_shrluimm:
forall n,
unary_constructor_sound (fun e => shrluimm e n) (fun v => Val.shrlu v (Vint n)).
Theorem eval_shrlu: binary_constructor_sound shrlu Val.shrlu.
Lemma eval_shrlimm:
forall n,
unary_constructor_sound (fun e => shrlimm e n) (fun v => Val.shrl v (Vint n)).
Theorem eval_shrl: binary_constructor_sound shrl Val.shrl.
Theorem eval_addl: Archi.ptr64 = false -> binary_constructor_sound addl Val.addl.
Theorem eval_subl: Archi.ptr64 = false -> binary_constructor_sound subl Val.subl.
Lemma eval_mull_base: binary_constructor_sound mull_base Val.mull.
Lemma eval_mullimm:
forall n, unary_constructor_sound (mullimm n) (fun v => Val.mull v (Vlong n)).
Theorem eval_mull: binary_constructor_sound mull Val.mull.
Theorem eval_mullhu:
forall n, unary_constructor_sound (fun a => mullhu a n) (fun v => Val.mullhu v (Vlong n)).
Theorem eval_mullhs:
forall n, unary_constructor_sound (fun a => mullhs a n) (fun v => Val.mullhs v (Vlong n)).
Theorem eval_shrxlimm:
forall le a n x z,
Archi.ptr64 = false ->
eval_expr ge sp e m le a x ->
Val.shrxl x (Vint n) = Some z ->
exists v, eval_expr ge sp e m le (shrxlimm a n) v /\ Val.lessdef z v.
Theorem eval_divlu_base:
forall le a b x y z,
eval_expr ge sp e m le a x ->
eval_expr ge sp e m le b y ->
Val.divlu x y = Some z ->
exists v, eval_expr ge sp e m le (divlu_base a b) v /\ Val.lessdef z v.
Theorem eval_modlu_base:
forall le a b x y z,
eval_expr ge sp e m le a x ->
eval_expr ge sp e m le b y ->
Val.modlu x y = Some z ->
exists v, eval_expr ge sp e m le (modlu_base a b) v /\ Val.lessdef z v.
Theorem eval_divls_base:
forall le a b x y z,
eval_expr ge sp e m le a x ->
eval_expr ge sp e m le b y ->
Val.divls x y = Some z ->
exists v, eval_expr ge sp e m le (divls_base a b) v /\ Val.lessdef z v.
Theorem eval_modls_base:
forall le a b x y z,
eval_expr ge sp e m le a x ->
eval_expr ge sp e m le b y ->
Val.modls x y = Some z ->
exists v, eval_expr ge sp e m le (modls_base a b) v /\ Val.lessdef z v.