aboutsummaryrefslogtreecommitdiffstats
path: root/arm/Asmgenproof1.v
diff options
context:
space:
mode:
Diffstat (limited to 'arm/Asmgenproof1.v')
-rw-r--r--arm/Asmgenproof1.v248
1 files changed, 88 insertions, 160 deletions
diff --git a/arm/Asmgenproof1.v b/arm/Asmgenproof1.v
index 98cd5eea..6a02b77f 100644
--- a/arm/Asmgenproof1.v
+++ b/arm/Asmgenproof1.v
@@ -799,10 +799,10 @@ Qed.
Lemma compare_float_spec:
forall rs f1 f2,
let rs1 := nextinstr (compare_float rs (Vfloat f1) (Vfloat f2)) in
- rs1#CN = Val.of_bool (Float.cmp Clt f1 f2)
- /\ rs1#CZ = Val.of_bool (Float.cmp Ceq f1 f2)
- /\ rs1#CC = Val.of_bool (negb (Float.cmp Clt f1 f2))
- /\ rs1#CV = Val.of_bool (negb (Float.cmp Ceq f1 f2 || Float.cmp Clt f1 f2 || Float.cmp Cgt f1 f2)).
+ rs1#CN = Val.of_bool (Float.cmp FClt f1 f2)
+ /\ rs1#CZ = Val.of_bool (Float.cmp FCeq f1 f2)
+ /\ rs1#CC = Val.of_bool (negb (Float.cmp FClt f1 f2))
+ /\ rs1#CV = Val.of_bool (negb (Float.cmp FCeq f1 f2 || Float.cmp FClt f1 f2 || Float.cmp FCgt f1 f2)).
Proof.
intros. intuition.
Qed.
@@ -838,65 +838,48 @@ Proof.
intros [A [B [C D]]].
unfold eval_testcond. rewrite A; rewrite B; rewrite C; rewrite D.
destruct c; simpl.
-(* eq *)
- destruct (Float.cmp Ceq n1 n2); auto.
-(* ne *)
- rewrite Float.cmp_ne_eq. destruct (Float.cmp Ceq n1 n2); auto.
-(* lt *)
- destruct (Float.cmp Clt n1 n2); auto.
-(* le *)
+- (* eq *)
+ destruct (Float.cmp FCeq n1 n2); auto.
+- (* ne *)
+ rewrite Float.cmp_ne_eq. destruct (Float.cmp FCeq n1 n2); auto.
+- (* lt *)
+ destruct (Float.cmp FClt n1 n2); auto.
+- (* le *)
rewrite Float.cmp_le_lt_eq.
- destruct (Float.cmp Clt n1 n2); destruct (Float.cmp Ceq n1 n2); auto.
-(* gt *)
- destruct (Float.cmp Ceq n1 n2) eqn:EQ;
- destruct (Float.cmp Clt n1 n2) eqn:LT;
- destruct (Float.cmp Cgt n1 n2) eqn:GT; auto.
+ destruct (Float.cmp FClt n1 n2); destruct (Float.cmp FCeq n1 n2); auto.
+- (* gt *)
+ destruct (Float.cmp FCeq n1 n2) eqn:EQ;
+ destruct (Float.cmp FClt n1 n2) eqn:LT;
+ destruct (Float.cmp FCgt n1 n2) eqn:GT; auto.
exfalso; eapply Float.cmp_lt_gt_false; eauto.
exfalso; eapply Float.cmp_gt_eq_false; eauto.
exfalso; eapply Float.cmp_lt_gt_false; eauto.
-(* ge *)
+- (* ge *)
rewrite Float.cmp_ge_gt_eq.
- destruct (Float.cmp Ceq n1 n2) eqn:EQ;
- destruct (Float.cmp Clt n1 n2) eqn:LT;
- destruct (Float.cmp Cgt n1 n2) eqn:GT; auto.
+ destruct (Float.cmp FCeq n1 n2) eqn:EQ;
+ destruct (Float.cmp FClt n1 n2) eqn:LT;
+ destruct (Float.cmp FCgt n1 n2) eqn:GT; auto.
exfalso; eapply Float.cmp_lt_eq_false; eauto.
exfalso; eapply Float.cmp_lt_eq_false; eauto.
exfalso; eapply Float.cmp_lt_gt_false; eauto.
-Qed.
-
-Lemma cond_for_float_not_cmp_correct:
- forall c n1 n2 rs,
- eval_testcond (cond_for_float_not_cmp c)
- (nextinstr (compare_float rs (Vfloat n1) (Vfloat n2)))=
- Some(negb(Float.cmp c n1 n2)).
-Proof.
- intros.
- generalize (compare_float_spec rs n1 n2).
- set (rs' := nextinstr (compare_float rs (Vfloat n1) (Vfloat n2))).
- intros [A [B [C D]]].
- unfold eval_testcond. rewrite A; rewrite B; rewrite C; rewrite D.
- destruct c; simpl.
-(* eq *)
- destruct (Float.cmp Ceq n1 n2); auto.
-(* ne *)
- rewrite Float.cmp_ne_eq. destruct (Float.cmp Ceq n1 n2); auto.
-(* lt *)
- destruct (Float.cmp Clt n1 n2); auto.
-(* le *)
- rewrite Float.cmp_le_lt_eq.
- destruct (Float.cmp Clt n1 n2) eqn:LT; destruct (Float.cmp Ceq n1 n2) eqn:EQ; auto.
-(* gt *)
- destruct (Float.cmp Ceq n1 n2) eqn:EQ;
- destruct (Float.cmp Clt n1 n2) eqn:LT;
- destruct (Float.cmp Cgt n1 n2) eqn:GT; auto.
+- (* lt *)
+ rewrite (Float.cmp_negate FClt). destruct (Float.cmp FClt n1 n2); auto.
+- (* le *)
+ rewrite (Float.cmp_negate FCle), Float.cmp_le_lt_eq.
+ destruct (Float.cmp FClt n1 n2) eqn:LT; destruct (Float.cmp FCeq n1 n2) eqn:EQ; auto.
+- (* gt *)
+ rewrite (Float.cmp_negate FCgt).
+ destruct (Float.cmp FCeq n1 n2) eqn:EQ;
+ destruct (Float.cmp FClt n1 n2) eqn:LT;
+ destruct (Float.cmp FCgt n1 n2) eqn:GT; auto.
exfalso; eapply Float.cmp_lt_gt_false; eauto.
exfalso; eapply Float.cmp_gt_eq_false; eauto.
exfalso; eapply Float.cmp_lt_gt_false; eauto.
-(* ge *)
- rewrite Float.cmp_ge_gt_eq.
- destruct (Float.cmp Ceq n1 n2) eqn:EQ;
- destruct (Float.cmp Clt n1 n2) eqn:LT;
- destruct (Float.cmp Cgt n1 n2) eqn:GT; auto.
+- (* ge *)
+ rewrite (Float.cmp_negate FCge), Float.cmp_ge_gt_eq.
+ destruct (Float.cmp FCeq n1 n2) eqn:EQ;
+ destruct (Float.cmp FClt n1 n2) eqn:LT;
+ destruct (Float.cmp FCgt n1 n2) eqn:GT; auto.
exfalso; eapply Float.cmp_lt_eq_false; eauto.
exfalso; eapply Float.cmp_lt_eq_false; eauto.
exfalso; eapply Float.cmp_lt_gt_false; eauto.
@@ -905,10 +888,10 @@ Qed.
Lemma compare_float32_spec:
forall rs f1 f2,
let rs1 := nextinstr (compare_float32 rs (Vsingle f1) (Vsingle f2)) in
- rs1#CN = Val.of_bool (Float32.cmp Clt f1 f2)
- /\ rs1#CZ = Val.of_bool (Float32.cmp Ceq f1 f2)
- /\ rs1#CC = Val.of_bool (negb (Float32.cmp Clt f1 f2))
- /\ rs1#CV = Val.of_bool (negb (Float32.cmp Ceq f1 f2 || Float32.cmp Clt f1 f2 || Float32.cmp Cgt f1 f2)).
+ rs1#CN = Val.of_bool (Float32.cmp FClt f1 f2)
+ /\ rs1#CZ = Val.of_bool (Float32.cmp FCeq f1 f2)
+ /\ rs1#CC = Val.of_bool (negb (Float32.cmp FClt f1 f2))
+ /\ rs1#CV = Val.of_bool (negb (Float32.cmp FCeq f1 f2 || Float32.cmp FClt f1 f2 || Float32.cmp FCgt f1 f2)).
Proof.
intros. intuition.
Qed.
@@ -944,65 +927,48 @@ Proof.
intros [A [B [C D]]].
unfold eval_testcond. rewrite A; rewrite B; rewrite C; rewrite D.
destruct c; simpl.
-(* eq *)
- destruct (Float32.cmp Ceq n1 n2); auto.
-(* ne *)
- rewrite Float32.cmp_ne_eq. destruct (Float32.cmp Ceq n1 n2); auto.
-(* lt *)
- destruct (Float32.cmp Clt n1 n2); auto.
-(* le *)
+- (* eq *)
+ destruct (Float32.cmp FCeq n1 n2); auto.
+- (* ne *)
+ rewrite Float32.cmp_ne_eq. destruct (Float32.cmp FCeq n1 n2); auto.
+- (* lt *)
+ destruct (Float32.cmp FClt n1 n2); auto.
+- (* le *)
rewrite Float32.cmp_le_lt_eq.
- destruct (Float32.cmp Clt n1 n2); destruct (Float32.cmp Ceq n1 n2); auto.
-(* gt *)
- destruct (Float32.cmp Ceq n1 n2) eqn:EQ;
- destruct (Float32.cmp Clt n1 n2) eqn:LT;
- destruct (Float32.cmp Cgt n1 n2) eqn:GT; auto.
+ destruct (Float32.cmp FClt n1 n2); destruct (Float32.cmp FCeq n1 n2); auto.
+- (* gt *)
+ destruct (Float32.cmp FCeq n1 n2) eqn:EQ;
+ destruct (Float32.cmp FClt n1 n2) eqn:LT;
+ destruct (Float32.cmp FCgt n1 n2) eqn:GT; auto.
exfalso; eapply Float32.cmp_lt_gt_false; eauto.
exfalso; eapply Float32.cmp_gt_eq_false; eauto.
exfalso; eapply Float32.cmp_lt_gt_false; eauto.
-(* ge *)
+- (* ge *)
rewrite Float32.cmp_ge_gt_eq.
- destruct (Float32.cmp Ceq n1 n2) eqn:EQ;
- destruct (Float32.cmp Clt n1 n2) eqn:LT;
- destruct (Float32.cmp Cgt n1 n2) eqn:GT; auto.
+ destruct (Float32.cmp FCeq n1 n2) eqn:EQ;
+ destruct (Float32.cmp FClt n1 n2) eqn:LT;
+ destruct (Float32.cmp FCgt n1 n2) eqn:GT; auto.
exfalso; eapply Float32.cmp_lt_eq_false; eauto.
exfalso; eapply Float32.cmp_lt_eq_false; eauto.
exfalso; eapply Float32.cmp_lt_gt_false; eauto.
-Qed.
-
-Lemma cond_for_float32_not_cmp_correct:
- forall c n1 n2 rs,
- eval_testcond (cond_for_float_not_cmp c)
- (nextinstr (compare_float32 rs (Vsingle n1) (Vsingle n2)))=
- Some(negb(Float32.cmp c n1 n2)).
-Proof.
- intros.
- generalize (compare_float32_spec rs n1 n2).
- set (rs' := nextinstr (compare_float32 rs (Vsingle n1) (Vsingle n2))).
- intros [A [B [C D]]].
- unfold eval_testcond. rewrite A; rewrite B; rewrite C; rewrite D.
- destruct c; simpl.
-(* eq *)
- destruct (Float32.cmp Ceq n1 n2); auto.
-(* ne *)
- rewrite Float32.cmp_ne_eq. destruct (Float32.cmp Ceq n1 n2); auto.
-(* lt *)
- destruct (Float32.cmp Clt n1 n2); auto.
-(* le *)
- rewrite Float32.cmp_le_lt_eq.
- destruct (Float32.cmp Clt n1 n2) eqn:LT; destruct (Float32.cmp Ceq n1 n2) eqn:EQ; auto.
-(* gt *)
- destruct (Float32.cmp Ceq n1 n2) eqn:EQ;
- destruct (Float32.cmp Clt n1 n2) eqn:LT;
- destruct (Float32.cmp Cgt n1 n2) eqn:GT; auto.
+- (* lt *)
+ rewrite (Float32.cmp_negate FClt). destruct (Float32.cmp FClt n1 n2); auto.
+- (* le *)
+ rewrite (Float32.cmp_negate FCle), Float32.cmp_le_lt_eq.
+ destruct (Float32.cmp FClt n1 n2) eqn:LT; destruct (Float32.cmp FCeq n1 n2) eqn:EQ; auto.
+- (* gt *)
+ rewrite (Float32.cmp_negate FCgt).
+ destruct (Float32.cmp FCeq n1 n2) eqn:EQ;
+ destruct (Float32.cmp FClt n1 n2) eqn:LT;
+ destruct (Float32.cmp FCgt n1 n2) eqn:GT; auto.
exfalso; eapply Float32.cmp_lt_gt_false; eauto.
exfalso; eapply Float32.cmp_gt_eq_false; eauto.
exfalso; eapply Float32.cmp_lt_gt_false; eauto.
-(* ge *)
- rewrite Float32.cmp_ge_gt_eq.
- destruct (Float32.cmp Ceq n1 n2) eqn:EQ;
- destruct (Float32.cmp Clt n1 n2) eqn:LT;
- destruct (Float32.cmp Cgt n1 n2) eqn:GT; auto.
+- (* ge *)
+ rewrite (Float32.cmp_negate FCge), Float32.cmp_ge_gt_eq.
+ destruct (Float32.cmp FCeq n1 n2) eqn:EQ;
+ destruct (Float32.cmp FClt n1 n2) eqn:LT;
+ destruct (Float32.cmp FCgt n1 n2) eqn:GT; auto.
exfalso; eapply Float32.cmp_lt_eq_false; eauto.
exfalso; eapply Float32.cmp_lt_eq_false; eauto.
exfalso; eapply Float32.cmp_lt_gt_false; eauto.
@@ -1029,8 +995,7 @@ Lemma transl_cond_correct:
exec_straight ge fn c rs m k rs' m
/\ match eval_condition cond (map rs (map preg_of args)) m with
| Some b => eval_testcond (cond_for_cond cond) rs' = Some b
- /\ eval_testcond (cond_for_cond (negate_condition cond)) rs' = Some (negb b)
- | None => True
+ | None => True
end
/\ forall r, data_preg r = true -> rs'#r = rs r.
Proof.
@@ -1040,34 +1005,34 @@ Proof.
econstructor.
split. apply exec_straight_one. simpl. eauto. auto.
split. destruct (Val.cmp_bool c0 (rs x) (rs x0)) eqn:CMP; auto.
- split; apply cond_for_signed_cmp_correct; auto. rewrite Val.negate_cmp_bool, CMP; auto.
+ apply cond_for_signed_cmp_correct; auto.
apply compare_int_inv.
- (* Ccompu *)
econstructor.
split. apply exec_straight_one. simpl. eauto. auto.
split. destruct (Val.cmpu_bool (Mem.valid_pointer m) c0 (rs x) (rs x0)) eqn:CMP; auto.
- split; apply cond_for_unsigned_cmp_correct; auto. rewrite Val.negate_cmpu_bool, CMP; auto.
+ apply cond_for_unsigned_cmp_correct; auto.
apply compare_int_inv.
- (* Ccompshift *)
econstructor.
split. apply exec_straight_one. simpl. eauto. auto.
split. rewrite transl_shift_correct.
destruct (Val.cmp_bool c0 (rs x) (eval_shift s (rs x0))) eqn:CMP; auto.
- split; apply cond_for_signed_cmp_correct; auto. rewrite Val.negate_cmp_bool, CMP; auto.
+ apply cond_for_signed_cmp_correct; auto.
apply compare_int_inv.
- (* Ccompushift *)
econstructor.
split. apply exec_straight_one. simpl. eauto. auto.
split. rewrite transl_shift_correct.
destruct (Val.cmpu_bool (Mem.valid_pointer m) c0 (rs x) (eval_shift s (rs x0))) eqn:CMP; auto.
- split; apply cond_for_unsigned_cmp_correct; auto. rewrite Val.negate_cmpu_bool, CMP; auto.
+ apply cond_for_unsigned_cmp_correct; auto.
apply compare_int_inv.
- (* Ccompimm *)
destruct (is_immed_arith i).
econstructor.
split. apply exec_straight_one. simpl. eauto. auto.
split. destruct (Val.cmp_bool c0 (rs x) (Vint i)) eqn:CMP; auto.
- split; apply cond_for_signed_cmp_correct; auto. rewrite Val.negate_cmp_bool, CMP; auto.
+ apply cond_for_signed_cmp_correct; auto.
apply compare_int_inv.
destruct (is_immed_arith (Int.neg i)).
econstructor.
@@ -1082,14 +1047,14 @@ Proof.
rewrite Q. rewrite R; eauto with asmgen. auto.
split. rewrite <- R by (eauto with asmgen).
destruct (Val.cmp_bool c0 (rs' x) (Vint i)) eqn:CMP; auto.
- split; apply cond_for_signed_cmp_correct; auto. rewrite Val.negate_cmp_bool, CMP; auto.
+ apply cond_for_signed_cmp_correct; auto.
intros. rewrite compare_int_inv by auto. auto with asmgen.
- (* Ccompuimm *)
destruct (is_immed_arith i).
econstructor.
split. apply exec_straight_one. simpl. eauto. auto.
split. destruct (Val.cmpu_bool (Mem.valid_pointer m) c0 (rs x) (Vint i)) eqn:CMP; auto.
- split; apply cond_for_unsigned_cmp_correct; auto. rewrite Val.negate_cmpu_bool, CMP; auto.
+ apply cond_for_unsigned_cmp_correct; auto.
apply compare_int_inv.
destruct (is_immed_arith (Int.neg i)).
econstructor.
@@ -1104,76 +1069,39 @@ Proof.
rewrite Q. rewrite R; eauto with asmgen. auto.
split. rewrite <- R by (eauto with asmgen).
destruct (Val.cmpu_bool (Mem.valid_pointer m) c0 (rs' x) (Vint i)) eqn:CMP; auto.
- split; apply cond_for_unsigned_cmp_correct; auto. rewrite Val.negate_cmpu_bool, CMP; auto.
+ apply cond_for_unsigned_cmp_correct; auto.
intros. rewrite compare_int_inv by auto. auto with asmgen.
- (* Ccompf *)
econstructor.
split. apply exec_straight_one. simpl. eauto. apply compare_float_nextpc.
- split. destruct (Val.cmpf_bool c0 (rs x) (rs x0)) eqn:CMP; auto.
- destruct (rs x); try discriminate. destruct (rs x0); try discriminate.
- simpl in CMP. inv CMP.
- split. apply cond_for_float_cmp_correct. apply cond_for_float_not_cmp_correct.
- apply compare_float_inv.
-- (* Cnotcompf *)
- econstructor.
- split. apply exec_straight_one. simpl. eauto. apply compare_float_nextpc.
- split. destruct (Val.cmpf_bool c0 (rs x) (rs x0)) eqn:CMP; auto.
+ split. destruct (Val.cmpf_bool f (rs x) (rs x0)) eqn:CMP; auto.
destruct (rs x); try discriminate. destruct (rs x0); try discriminate.
simpl in CMP. inv CMP.
-Local Opaque compare_float. simpl.
- split. apply cond_for_float_not_cmp_correct. rewrite negb_involutive. apply cond_for_float_cmp_correct.
- exact I.
+ apply cond_for_float_cmp_correct.
apply compare_float_inv.
- (* Ccompfzero *)
econstructor.
split. apply exec_straight_one. simpl. eauto. apply compare_float_nextpc.
- split. destruct (Val.cmpf_bool c0 (rs x) (Vfloat Float.zero)) eqn:CMP; auto.
+ split. destruct (Val.cmpf_bool f (rs x) (Vfloat Float.zero)) eqn:CMP; auto.
destruct (rs x); try discriminate.
simpl in CMP. inv CMP.
- split. apply cond_for_float_cmp_correct. apply cond_for_float_not_cmp_correct.
- apply compare_float_inv.
-- (* Cnotcompfzero *)
- econstructor.
- split. apply exec_straight_one. simpl. eauto. apply compare_float_nextpc.
- split. destruct (Val.cmpf_bool c0 (rs x) (Vfloat Float.zero)) eqn:CMP; auto.
- destruct (rs x); try discriminate. simpl in CMP. inv CMP.
-Local Opaque compare_float. simpl.
- split. apply cond_for_float_not_cmp_correct. rewrite negb_involutive. apply cond_for_float_cmp_correct.
- exact I.
+ apply cond_for_float_cmp_correct.
apply compare_float_inv.
- (* Ccompfs *)
econstructor.
split. apply exec_straight_one. simpl. eauto. apply compare_float32_nextpc.
- split. destruct (Val.cmpfs_bool c0 (rs x) (rs x0)) eqn:CMP; auto.
- destruct (rs x); try discriminate. destruct (rs x0); try discriminate.
- simpl in CMP. inv CMP.
- split. apply cond_for_float32_cmp_correct. apply cond_for_float32_not_cmp_correct.
- apply compare_float32_inv.
-- (* Cnotcompfs *)
- econstructor.
- split. apply exec_straight_one. simpl. eauto. apply compare_float32_nextpc.
- split. destruct (Val.cmpfs_bool c0 (rs x) (rs x0)) eqn:CMP; auto.
+ split. destruct (Val.cmpfs_bool f (rs x) (rs x0)) eqn:CMP; auto.
destruct (rs x); try discriminate. destruct (rs x0); try discriminate.
simpl in CMP. inv CMP.
-Local Opaque compare_float32. simpl.
- split. apply cond_for_float32_not_cmp_correct. rewrite negb_involutive. apply cond_for_float32_cmp_correct.
- exact I.
+ apply cond_for_float32_cmp_correct.
apply compare_float32_inv.
- (* Ccompfszero *)
econstructor.
split. apply exec_straight_one. simpl. eauto. apply compare_float32_nextpc.
- split. destruct (Val.cmpfs_bool c0 (rs x) (Vsingle Float32.zero)) eqn:CMP; auto.
+ split. destruct (Val.cmpfs_bool f (rs x) (Vsingle Float32.zero)) eqn:CMP; auto.
destruct (rs x); try discriminate.
simpl in CMP. inv CMP.
- split. apply cond_for_float32_cmp_correct. apply cond_for_float32_not_cmp_correct.
- apply compare_float32_inv.
-- (* Cnotcompfzero *)
- econstructor.
- split. apply exec_straight_one. simpl. eauto. apply compare_float32_nextpc.
- split. destruct (Val.cmpfs_bool c0 (rs x) (Vsingle Float32.zero)) eqn:CMP; auto.
- destruct (rs x); try discriminate. simpl in CMP. inv CMP.
- simpl. split. apply cond_for_float32_not_cmp_correct. rewrite negb_involutive. apply cond_for_float32_cmp_correct.
- exact I.
+ apply cond_for_float32_cmp_correct.
apply compare_float32_inv.
Qed.
@@ -1367,7 +1295,7 @@ Proof.
eapply exec_straight_trans. eexact A. apply exec_straight_one. simpl; eauto. auto.
split; intros; Simpl.
destruct (eval_condition c0 rs ## (preg_of ## args) m) as [b|]; simpl; auto.
- destruct B as [B1 B2]; rewrite B1. destruct b; auto.
+ rewrite B; destruct b; auto.
Qed.
(** Translation of loads and stores. *)