@@ -1107,5 +1107,52 @@ Proof.
11071107 rewrite Int64.decompose_le. rewrite Int.eq_sym. auto.
11081108Qed .
11091109
1110+ Remark select_int_supported: select_supported Tint = true.
1111+ Proof . reflexivity. Qed .
1112+
1113+ Remark select_long_unsupported: select_supported Tlong = false -> Archi.ptr64 = false.
1114+ Proof .
1115+ unfold select_supported; intros; auto; congruence.
1116+ Qed .
1117+
1118+ Theorem eval_select_long:
1119+ forall le cond al vl a1 v1 a2 v2,
1120+ eval_exprlist ge sp e m le al vl ->
1121+ eval_expr ge sp e m le a1 v1 ->
1122+ eval_expr ge sp e m le a2 v2 ->
1123+ exists v,
1124+ eval_expr ge sp e m le (select_long cond al a1 a2) v
1125+ /\ Val.lessdef (Val.select (eval_condition cond vl m) v1 v2 Tlong) v.
1126+ Proof .
1127+ unfold select_long; intros. destruct (select_supported Tlong) eqn:SUP.
1128+ - eapply eval_select; eauto.
1129+ - assert (NOT64: Archi.ptr64 = false) by auto using select_long_unsupported.
1130+ assert (AUX: forall v vhi vlo,
1131+ Val.lessdef (Val.normalize (Val.hiword v) Tint) vhi ->
1132+ Val.lessdef (Val.normalize (Val.loword v) Tint) vlo ->
1133+ Val.lessdef (Val.normalize v Tlong) (Val.longofwords vhi vlo)).
1134+ { intros. unfold Val.normalize. rewrite NOT64. destruct v; auto.
1135+ simpl in *. inv H2; inv H3. simpl. rewrite Int64.ofwords_recompose. auto. }
1136+ eapply eval_bind_exprs_gen with (P := Val.lessdef (Val.select (eval_condition cond vl m) v1 v2 Tlong)); eauto using eval_exprlist.
1137+ intros args EV. set (le' := app (rev (v1 :: v2 :: vl)) le) in *.
1138+ inv EV. inv H7. rename a0 into b1. rename a3 into b2. rename al1 into bl.
1139+ exploit eval_select.
1140+ apply select_int_supported.
1141+ eexact H9.
1142+ eapply eval_Eop with (op := Ohighlong) (al := b1 ::: Enil); eauto using eval_exprlist. simpl; eauto.
1143+ eapply eval_Eop with (op := Ohighlong) (al := b2 ::: Enil); eauto using eval_exprlist. simpl; eauto.
1144+ intros (vhi & EHI & LHI).
1145+ exploit eval_select.
1146+ apply select_int_supported.
1147+ eexact H9.
1148+ eapply eval_Eop with (op := Olowlong) (al := b1 ::: Enil); eauto using eval_exprlist. simpl; eauto.
1149+ eapply eval_Eop with (op := Olowlong) (al := b2 ::: Enil); eauto using eval_exprlist. simpl; eauto.
1150+ intros (vlo & ELO & LLO).
1151+ exists (Val.longofwords vhi vlo); split.
1152+ eapply eval_Eop; eauto using eval_exprlist.
1153+ destruct (eval_condition cond vl m) as [b|]; simpl in *; auto.
1154+ destruct b; apply AUX; auto.
1155+ Qed .
1156+
11101157End CMCONSTR.
11111158
0 commit comments