Section CONSTRUCTORS.
Variable ge: genv.
Variable fn: function.
(** Properties of comparisons. *)
(** Loading a constant. *)
(** Add integer immediate. *)
(** And integer immediate. *)
(** Or integer immediate. *)
(** Xor integer immediate. *)
(** Rotate and mask. *)
(** Load int64 constant. *)
(** Alternate load int64 immediate *)
(** Add int64 immediate. *)
(** Or int64 immediate. *)
(** Xor int64 immediate. *)
(** And int64 immediate. *)
(** Rotate-and-mask for int64 *)
(** Indexed memory loads. *)
(** Indexed memory stores. *)
(** Float comparisons. *)
(** Translation of conditions. *)
Ltac ArgsInv :=
repeat (match goal with
| [ H: Error _ = OK _ |- _ ] => discriminate
| [ H: match ?args with nil => _ | _ :: _ => _ end = OK _ |- _ ] => destruct args
| [ H: bind _ _ = OK _ |- _ ] => monadInv H
| [ H: match _ with left _ => _ | right _ => assertion_failed end = OK _ |- _ ] => monadInv H; ArgsInv
| [ H: match _ with true => _ | false => assertion_failed end = OK _ |- _ ] => monadInv H; ArgsInv
end);
subst;
repeat (match goal with
| [ H: ireg_of _ = OK _ |- _ ] => simpl in *; rewrite (ireg_of_eq _ _ H) in *
| [ H: freg_of _ = OK _ |- _ ] => simpl in *; rewrite (freg_of_eq _ _ H) in *
end).
(** Translation of condition operators *)
Remark add_carry_eq0:
forall i,
Vint (Int.add (Int.add (Int.sub Int.zero i) i)
(Int.add_carry Int.zero (Int.xor i Int.mone) Int.one)) =
Val.of_bool (Int.eq i Int.zero).
Remark add_carry_ne0:
forall i,
Vint (Int.add (Int.add i (Int.xor (Int.add i Int.mone) Int.mone))
(Int.add_carry i Int.mone Int.zero)) =
Val.of_bool (negb (Int.eq i Int.zero)).

Lemma transl_fselect_op_correct:
forall cond args ty r1 r2 rd k rs m c,
transl_fselect_op cond args r1 r2 rd k = OK c ->
important_preg rd = true -> important_preg r1 = true -> important_preg r2 = true ->
exists rs',
exec_straight ge fn c rs m k rs' m
/\ Val.lessdef (Val.select (eval_condition cond (map rs (map preg_of args)) m) rs#r1 rs#r2 ty) rs'#rd
/\ forall r, important_preg r = true  -> r <> rd -> rs'#r = rs#r.