End OVERLAP.
(** These lemmas imply the following correctness theorem for the [parmove2] function, taking partial register overlap into account. *)

(* Specifications: *)
Theorem parmove2_correctness_with_overlap:
forall sl dl,
List.length sl = List.length dl ->
(forall r, In r sl -> disjoint_temps r) ->
(forall r, In r dl -> disjoint_temps r) ->
pairwise_disjoint dl ->
(forall s d, In s sl -> In d dl -> no_overlap s d) ->
(forall t1 t2, is_temp t1 -> is_temp t2 -> no_overlap t1 t2) ->
forall e,
let e' := weak_exec_seq (parmove2 sl dl) e in
List.map e' dl = List.map e sl /\
forall r, disjoint_list r dl -> disjoint_temps r -> e' r = e r.
Theorem parmove2_correctness_with_overlap:
forall sl dl,
List.length sl = List.length dl ->
(forall r, In r sl -> disjoint_temps r) ->
(forall r, In r dl -> disjoint_temps r) ->
pairwise_disjoint dl ->
(forall s d, In s sl -> In d dl -> no_overlap s d) ->
(forall t1 t2, is_temp t1 -> is_temp t2 -> no_overlap t1 t2) ->
forall e,
let e' := weak_exec_seq (parmove2 sl dl) e in
List.map e' dl = List.map e sl /\
forall r, disjoint_list r dl -> disjoint_temps r -> e' r = e r.