Remark in_elements_between_1:
forall r1 s q,
EqSet.In q (EqSet.elements_between (select_reg_l r1) (select_reg_h r1) s) <-> EqSet.In q s /\ ereg q = r1.

(* Specifications: *)
Lemma in_subst_reg:
forall r1 r2 q (e: eqs),
EqSet.In q e ->
ereg q = r1 /\ EqSet.In (Eq (ekind q) r2 (eloc q)) (subst_reg r1 r2 e)
\/ ereg q <> r1 /\ EqSet.In q (subst_reg r1 r2 e).
Lemma subst_reg_satisf:
forall src dst rs ls e,
satisf rs ls (subst_reg dst src e) ->
satisf (rs#dst <- (rs#src)) ls e.
Lemma in_subst_reg_kind:
forall r1 k1 r2 k2 q (e: eqs),
EqSet.In q e ->
(ereg q, ekind q) = (r1, k1) /\ EqSet.In (Eq k2 r2 (eloc q)) (subst_reg_kind r1 k1 r2 k2 e)
\/ EqSet.In q (subst_reg_kind r1 k1 r2 k2 e).
Lemma subst_reg_kind_satisf_makelong:
forall src1 src2 dst rs ls e,
let e1 := subst_reg_kind dst High src1 Full e in
let e2 := subst_reg_kind dst Low src2 Full e1 in
reg_unconstrained dst e2 = true ->
satisf rs ls e2 ->
satisf (rs#dst <- (Val.longofwords rs#src1 rs#src2)) ls e.
Lemma subst_reg_kind_satisf_lowlong:
forall src dst rs ls e,
let e1 := subst_reg_kind dst Full src Low e in
reg_unconstrained dst e1 = true ->
satisf rs ls e1 ->
satisf (rs#dst <- (Val.loword rs#src)) ls e.
Lemma subst_reg_kind_satisf_highlong:
forall src dst rs ls e,
let e1 := subst_reg_kind dst Full src High e in
reg_unconstrained dst e1 = true ->
satisf rs ls e1 ->
satisf (rs#dst <- (Val.hiword rs#src)) ls e.