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: forall le a b f va vb sem, (forall le a1 a2 b1 b2 x1 x2 y1 y2, eval_expr ge sp e m le a1 x1 -> eval_expr ge sp e m le a2 x2 -> eval_expr ge sp e m le b1 y1 -> eval_expr ge sp e m le b2 y2 -> exists v, eval_expr ge sp e m le (f a1 a2 b1 b2) v /\ (forall p1 p2 q1 q2, x1 = Vint p1 -> x2 = Vint p2 -> y1 = Vint q1 -> y2 = Vint q2 -> v = sem (Vlong (Int64.ofwords p1 p2)) (Vlong (Int64.ofwords q1 q2)))) -> match va, vb with Vlong _, Vlong _ => True | _, _ => sem va vb = Vundef end -> eval_expr ge sp e m le a va -> eval_expr ge sp e m le b vb -> exists v, eval_expr ge sp e m le (splitlong2 a b f) v /\ Val.lessdef (sem va vb) v.