Definition unary_constructor_sound (cstr: expr -> expr) (sem: val -> val) : Prop :=
  forall le a x,
  eval_expr ge sp e m le a x ->
  exists v, eval_expr ge sp e m le (cstr a) v /\ Val.lessdef (sem x) v.Definition binary_constructor_sound (cstr: expr -> expr -> expr) (sem: val -> val -> val) : Prop :=
  forall le a x b y,
  eval_expr ge sp e m le a x ->
  eval_expr ge sp e m le b y ->
  exists v, eval_expr ge sp e m le (cstr a b) v /\ Val.lessdef (sem x y) v.

Lemma eval_splitlong2_strict: forall le a b f va vb v, eval_expr ge sp e m le a (Vlong va) -> eval_expr ge sp e m le b (Vlong vb) -> (forall le a1 a2 b1 b2, eval_expr ge sp e m le a1 (Vint (Int64.hiword va)) -> eval_expr ge sp e m le a2 (Vint (Int64.loword va)) -> eval_expr ge sp e m le b1 (Vint (Int64.hiword vb)) -> eval_expr ge sp e m le b2 (Vint (Int64.loword vb)) -> eval_expr ge sp e m le (f a1 a2 b1 b2) v) -> eval_expr ge sp e m le (splitlong2 a b f) v.