Remark eval_same_expr:
  forall a1 a2 le v1 v2,
  same_expr_pure a1 a2 = true ->
  eval_expr ge sp e m le a1 v1 ->
  eval_expr ge sp e m le a2 v2 ->
  a1 = a2 /\ v1 = v2.

(* Specifications: *)
Theorem eval_or: binary_constructor_sound or Val.or.
Theorem eval_xorimm: forall n, unary_constructor_sound (xorimm n) (fun x => Val.xor x (Vint n)).
Theorem eval_xor: binary_constructor_sound xor Val.xor.
Theorem eval_divs_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.divs x y = Some z -> exists v, eval_expr ge sp e m le (divs_base a b) v /\ Val.lessdef z v.
Lemma eval_mod_aux: forall divop semdivop, (forall sp x y m, eval_operation ge sp divop (x :: y :: nil) m = semdivop x y) -> 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 -> semdivop x y = Some z -> eval_expr ge sp e m le (mod_aux divop a b) (Val.sub x (Val.mul z y)).
Theorem eval_mods_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.mods x y = Some z -> exists v, eval_expr ge sp e m le (mods_base a b) v /\ Val.lessdef z v.
Theorem eval_divu_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.divu x y = Some z -> exists v, eval_expr ge sp e m le (divu_base a b) v /\ Val.lessdef z v.
Theorem eval_modu_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.modu x y = Some z -> exists v, eval_expr ge sp e m le (modu_base a b) v /\ Val.lessdef z v.
Theorem eval_shrximm: forall le a n x z, eval_expr ge sp e m le a x -> Val.shrx x (Vint n) = Some z -> exists v, eval_expr ge sp e m le (shrximm a n) v /\ Val.lessdef z v.
Theorem eval_shl: binary_constructor_sound shl Val.shl.
Theorem eval_shr: binary_constructor_sound shr Val.shr.
Theorem eval_shru: binary_constructor_sound shru Val.shru.
Theorem eval_negf: unary_constructor_sound negf Val.negf.
Theorem eval_absf: unary_constructor_sound absf Val.absf.
Theorem eval_addf: binary_constructor_sound addf Val.addf.
Theorem eval_subf: binary_constructor_sound subf Val.subf.
Theorem eval_mulf: binary_constructor_sound mulf Val.mulf.
Theorem eval_negfs: unary_constructor_sound negfs Val.negfs.
Theorem eval_absfs: unary_constructor_sound absfs Val.absfs.
Theorem eval_addfs: binary_constructor_sound addfs Val.addfs.
Theorem eval_subfs: binary_constructor_sound subfs Val.subfs.
Theorem eval_mulfs: binary_constructor_sound mulfs Val.mulfs.
Lemma eval_compimm: forall le c a n2 x, eval_expr ge sp e m le a x -> exists v, eval_expr ge sp e m le (compimm default intsem c a n2) v /\ Val.lessdef (sem c x (Vint n2)) v.
Lemma eval_compimm_swap: forall le c a n2 x, eval_expr ge sp e m le a x -> exists v, eval_expr ge sp e m le (compimm default intsem (swap_comparison c) a n2) v /\ Val.lessdef (sem c (Vint n2) x) v.
Theorem eval_comp: forall c, binary_constructor_sound (comp c) (Val.cmp c).
Theorem eval_compu: forall c, binary_constructor_sound (compu c) (Val.cmpu (Mem.valid_pointer m) c).
Theorem eval_compf: forall c, binary_constructor_sound (compf c) (Val.cmpf c).
Theorem eval_compfs: forall c, binary_constructor_sound (compfs c) (Val.cmpfs c).
Theorem eval_cast8signed: unary_constructor_sound cast8signed (Val.sign_ext 8).
Theorem eval_cast8unsigned: unary_constructor_sound cast8unsigned (Val.zero_ext 8).
Theorem eval_cast16signed: unary_constructor_sound cast16signed (Val.sign_ext 16).
Theorem eval_cast16unsigned: unary_constructor_sound cast16unsigned (Val.zero_ext 16).
Theorem eval_singleoffloat: unary_constructor_sound singleoffloat Val.singleoffloat.
Theorem eval_floatofsingle: unary_constructor_sound floatofsingle Val.floatofsingle.
Theorem eval_intoffloat: forall le a x y, eval_expr ge sp e m le a x -> Val.intoffloat x = Some y -> exists v, eval_expr ge sp e m le (intoffloat a) v /\ Val.lessdef y v.
Theorem eval_intuoffloat: forall le a x y, eval_expr ge sp e m le a x -> Val.intuoffloat x = Some y -> exists v, eval_expr ge sp e m le (intuoffloat a) v /\ Val.lessdef y v.
Theorem eval_floatofint: forall le a x y, eval_expr ge sp e m le a x -> Val.floatofint x = Some y -> exists v, eval_expr ge sp e m le (floatofint a) v /\ Val.lessdef y v.
Theorem eval_floatofintu: forall le a x y, eval_expr ge sp e m le a x -> Val.floatofintu x = Some y -> exists v, eval_expr ge sp e m le (floatofintu a) v /\ Val.lessdef y v.
Theorem eval_intofsingle: forall le a x y, eval_expr ge sp e m le a x -> Val.intofsingle x = Some y -> exists v, eval_expr ge sp e m le (intofsingle a) v /\ Val.lessdef y v.
Theorem eval_singleofint: forall le a x y, eval_expr ge sp e m le a x -> Val.singleofint x = Some y -> exists v, eval_expr ge sp e m le (singleofint a) v /\ Val.lessdef y v.
Theorem eval_intuofsingle: forall le a x y, eval_expr ge sp e m le a x -> Val.intuofsingle x = Some y -> exists v, eval_expr ge sp e m le (intuofsingle a) v /\ Val.lessdef y v.
Theorem eval_singleofintu: forall le a x y, eval_expr ge sp e m le a x -> Val.singleofintu x = Some y -> exists v, eval_expr ge sp e m le (singleofintu a) v /\ Val.lessdef y v.
Theorem eval_addressing: forall le chunk a v b ofs, eval_expr ge sp e m le a v -> v = Vptr b ofs -> match addressing chunk a with (mode, args) => exists vl, eval_exprlist ge sp e m le args vl /\ eval_addressing ge sp mode vl = Some v end.
Theorem eval_builtin_arg: forall a v, eval_expr ge sp e m nil a v -> CminorSel.eval_builtin_arg ge sp e m (builtin_arg a) v.
Theorem eval_or: binary_constructor_sound or Val.or.
Theorem eval_xorimm: forall n, unary_constructor_sound (xorimm n) (fun x => Val.xor x (Vint n)).
Theorem eval_xor: binary_constructor_sound xor Val.xor.
Lemma eval_mod_aux: forall divop semdivop, (forall sp x y m, eval_operation ge sp divop (x :: y :: nil) m = semdivop x y) -> 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 -> semdivop x y = Some z -> eval_expr ge sp e m le (mod_aux divop a b) (Val.sub x (Val.mul z y)).
Theorem eval_divs_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.divs x y = Some z -> exists v, eval_expr ge sp e m le (divs_base a b) v /\ Val.lessdef z v.
Theorem eval_mods_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.mods x y = Some z -> exists v, eval_expr ge sp e m le (mods_base a b) v /\ Val.lessdef z v.
Theorem eval_divu_base: forall le a x b y z, eval_expr ge sp e m le a x -> eval_expr ge sp e m le b y -> Val.divu x y = Some z -> exists v, eval_expr ge sp e m le (divu_base a b) v /\ Val.lessdef z v.
Theorem eval_modu_base: forall le a x b y z, eval_expr ge sp e m le a x -> eval_expr ge sp e m le b y -> Val.modu x y = Some z -> exists v, eval_expr ge sp e m le (modu_base a b) v /\ Val.lessdef z v.
Theorem eval_shrximm: forall le a n x z, eval_expr ge sp e m le a x -> Val.shrx x (Vint n) = Some z -> exists v, eval_expr ge sp e m le (shrximm a n) v /\ Val.lessdef z v.
Theorem eval_shl: binary_constructor_sound shl Val.shl.
Theorem eval_shr: binary_constructor_sound shr Val.shr.
Theorem eval_shru: binary_constructor_sound shru Val.shru.
Theorem eval_negf: unary_constructor_sound negf Val.negf.
Theorem eval_absf: unary_constructor_sound absf Val.absf.
Theorem eval_addf: binary_constructor_sound addf Val.addf.
Theorem eval_subf: binary_constructor_sound subf Val.subf.
Theorem eval_mulf: binary_constructor_sound mulf Val.mulf.
Theorem eval_negfs: unary_constructor_sound negfs Val.negfs.
Theorem eval_absfs: unary_constructor_sound absfs Val.absfs.
Theorem eval_addfs: binary_constructor_sound addfs Val.addfs.
Theorem eval_subfs: binary_constructor_sound subfs Val.subfs.
Theorem eval_mulfs: binary_constructor_sound mulfs Val.mulfs.
Lemma eval_compimm: forall le c a n2 x, eval_expr ge sp e m le a x -> exists v, eval_expr ge sp e m le (compimm default intsem c a n2) v /\ Val.lessdef (sem c x (Vint n2)) v.
Lemma eval_compimm_swap: forall le c a n2 x, eval_expr ge sp e m le a x -> exists v, eval_expr ge sp e m le (compimm default intsem (swap_comparison c) a n2) v /\ Val.lessdef (sem c (Vint n2) x) v.
Theorem eval_comp: forall c, binary_constructor_sound (comp c) (Val.cmp c).
Theorem eval_compu: forall c, binary_constructor_sound (compu c) (Val.cmpu (Mem.valid_pointer m) c).
Theorem eval_compf: forall c, binary_constructor_sound (compf c) (Val.cmpf c).
Theorem eval_compfs: forall c, binary_constructor_sound (compfs c) (Val.cmpfs c).
Theorem eval_cast8signed: unary_constructor_sound cast8signed (Val.sign_ext 8).
Theorem eval_cast8unsigned: unary_constructor_sound cast8unsigned (Val.zero_ext 8).
Theorem eval_cast16signed: unary_constructor_sound cast16signed (Val.sign_ext 16).
Theorem eval_cast16unsigned: unary_constructor_sound cast16unsigned (Val.zero_ext 16).
Theorem eval_singleoffloat: unary_constructor_sound singleoffloat Val.singleoffloat.
Theorem eval_floatofsingle: unary_constructor_sound floatofsingle Val.floatofsingle.
Theorem eval_intoffloat: forall le a x y, eval_expr ge sp e m le a x -> Val.intoffloat x = Some y -> exists v, eval_expr ge sp e m le (intoffloat a) v /\ Val.lessdef y v.
Theorem eval_floatofint: forall le a x y, eval_expr ge sp e m le a x -> Val.floatofint x = Some y -> exists v, eval_expr ge sp e m le (floatofint a) v /\ Val.lessdef y v.
Theorem eval_intuoffloat: forall le a x y, eval_expr ge sp e m le a x -> Val.intuoffloat x = Some y -> exists v, eval_expr ge sp e m le (intuoffloat a) v /\ Val.lessdef y v.
Theorem eval_floatofintu: forall le a x y, eval_expr ge sp e m le a x -> Val.floatofintu x = Some y -> exists v, eval_expr ge sp e m le (floatofintu a) v /\ Val.lessdef y v.
Theorem eval_intofsingle: forall le a x y, eval_expr ge sp e m le a x -> Val.intofsingle x = Some y -> exists v, eval_expr ge sp e m le (intofsingle a) v /\ Val.lessdef y v.
Theorem eval_singleofint: forall le a x y, eval_expr ge sp e m le a x -> Val.singleofint x = Some y -> exists v, eval_expr ge sp e m le (singleofint a) v /\ Val.lessdef y v.
Theorem eval_intuofsingle: forall le a x y, eval_expr ge sp e m le a x -> Val.intuofsingle x = Some y -> exists v, eval_expr ge sp e m le (intuofsingle a) v /\ Val.lessdef y v.
Theorem eval_singleofintu: forall le a x y, eval_expr ge sp e m le a x -> Val.singleofintu x = Some y -> exists v, eval_expr ge sp e m le (singleofintu a) v /\ Val.lessdef y v.
Theorem eval_addressing: forall le chunk a v b ofs, eval_expr ge sp e m le a v -> v = Vptr b ofs -> match addressing chunk a with (mode, args) => exists vl, eval_exprlist ge sp e m le args vl /\ eval_addressing ge sp mode vl = Some v end.
Theorem eval_builtin_arg: forall a v, eval_expr ge sp e m nil a v -> CminorSel.eval_builtin_arg ge sp e m (builtin_arg a) v.