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.

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)).