aboutsummaryrefslogtreecommitdiffstats
path: root/riscV/RTLpathSE_simplify.v
diff options
context:
space:
mode:
authorLéo Gourdin <leo.gourdin@univ-grenoble-alpes.fr>2021-02-23 19:30:24 +0100
committerLéo Gourdin <leo.gourdin@univ-grenoble-alpes.fr>2021-02-23 19:30:24 +0100
commit313443c86dfecd9058949ccf58800874eebd22f6 (patch)
tree582ee8db166f0fea83c7f47324614cd4d25b3903 /riscV/RTLpathSE_simplify.v
parent7bc14dbf6e676bcdd0699fc4d4cd0d2a1e495c74 (diff)
downloadcompcert-kvx-313443c86dfecd9058949ccf58800874eebd22f6.tar.gz
compcert-kvx-313443c86dfecd9058949ccf58800874eebd22f6.zip
[Intermediate] Adding fake hsval for Ccomp expansion
Diffstat (limited to 'riscV/RTLpathSE_simplify.v')
-rw-r--r--riscV/RTLpathSE_simplify.v111
1 files changed, 108 insertions, 3 deletions
diff --git a/riscV/RTLpathSE_simplify.v b/riscV/RTLpathSE_simplify.v
index 4fadcfdc..b9fe504e 100644
--- a/riscV/RTLpathSE_simplify.v
+++ b/riscV/RTLpathSE_simplify.v
@@ -1,9 +1,114 @@
+Require Import Integers.
Require Import Op Registers.
Require Import RTLpathSE_theory.
Require Import RTLpathSE_simu_specs.
+(* Useful functions for conditions/branches expansion *)
+
+Definition is_inv_cmp_int (cmp: comparison) : bool :=
+ match cmp with | Cle | Cgt => true | _ => false end.
+
+Definition is_inv_cmp_float (cmp: comparison) : bool :=
+ match cmp with | Cge | Cgt => true | _ => false end.
+
+Definition make_optR0 (is_x0 is_inv: bool) : option bool :=
+ if is_x0 then Some is_inv else None.
+
+(* Functions to manage lists of "fake" values *)
+
+Definition make_lhsv_cmp (is_inv: bool) (hv1 hv2: hsval) : list_hsval :=
+ let (hvfirst, hvsec) := if is_inv then (hv1, hv2) else (hv2, hv1) in
+ let lhsv := fScons hvfirst fSnil in
+ fScons hvsec lhsv.
+
+Definition make_lhsv_single (hvs: hsval) : list_hsval :=
+ fScons hvs fSnil.
+
+(* Expansion functions *)
+
+Definition cond_int32s (cmp: comparison) (lhsv: list_hsval) (optR0: option bool) :=
+ match cmp with
+ | Ceq => fSop (OEseqw optR0) lhsv
+ | Cne => fSop (OEsnew optR0) lhsv
+ | Clt | Cgt => fSop (OEsltw optR0) lhsv
+ | Cle | Cge =>
+ let hvs := (fSop (OEsltw optR0) lhsv) in
+ let hl := make_lhsv_single hvs in
+ fSop (OExoriw Int.one) hl
+ end.
+
+(* Target op simplifications using "fake" values *)
+
Definition target_op_simplify (op: operation) (lr: list reg) (hst: hsistate_local): option hsval :=
- None. (* default implementation *)
+ match op, lr with
+ | Ocmp (Ccomp c), a1 :: a2 :: nil =>
+ let fv1 := fsi_sreg_get hst a1 in
+ let fv2 := fsi_sreg_get hst a2 in
+ let is_inv := is_inv_cmp_int c in
+ let optR0 := make_optR0 false is_inv in
+ let lhsv := make_lhsv_cmp is_inv fv1 fv2 in
+ Some (cond_int32s c lhsv optR0)
+
+ (*| Ocmp (Ccompu c), a1 :: a2 :: nil =>
+ DO hv1 <~ hsi_sreg_get hst a1;;
+ DO hv2 <~ hsi_sreg_get hst a2;;
+ let is_inv := is_inv_cmp_int c in
+ let optR0 := make_optR0 false is_inv in
+ DO lhsv <~ make_lhsv_cmp is_inv hv1 hv2;;
+ cond_int32u c lhsv optR0
+ | Ocmp (Ccompimm c imm), a1 :: nil =>
+ DO hv1 <~ hsi_sreg_get hst a1;;
+ expanse_condimm_int32s c hv1 imm
+ | Ocmp (Ccompuimm c imm), a1 :: nil =>
+ DO hv1 <~ hsi_sreg_get hst a1;;
+ expanse_condimm_int32u c hv1 imm
+ | Ocmp (Ccompl c), a1 :: a2 :: nil =>
+ DO hv1 <~ hsi_sreg_get hst a1;;
+ DO hv2 <~ hsi_sreg_get hst a2;;
+ let is_inv := is_inv_cmp_int c in
+ let optR0 := make_optR0 false is_inv in
+ DO lhsv <~ make_lhsv_cmp is_inv hv1 hv2;;
+ cond_int64s c lhsv optR0
+ | Ocmp (Ccomplu c), a1 :: a2 :: nil =>
+ DO hv1 <~ hsi_sreg_get hst a1;;
+ DO hv2 <~ hsi_sreg_get hst a2;;
+ let is_inv := is_inv_cmp_int c in
+ let optR0 := make_optR0 false is_inv in
+ DO lhsv <~ make_lhsv_cmp is_inv hv1 hv2;;
+ cond_int64u c lhsv optR0
+ | Ocmp (Ccomplimm c imm), a1 :: nil =>
+ DO hv1 <~ hsi_sreg_get hst a1;;
+ expanse_condimm_int64s c hv1 imm
+ | Ocmp (Ccompluimm c imm), a1 :: nil =>
+ DO hv1 <~ hsi_sreg_get hst a1;;
+ expanse_condimm_int64u c hv1 imm
+ | Ocmp (Ccompf c), f1 :: f2 :: nil =>
+ DO hv1 <~ hsi_sreg_get hst f1;;
+ DO hv2 <~ hsi_sreg_get hst f2;;
+ let is_inv := is_inv_cmp_float c in
+ DO lhsv <~ make_lhsv_cmp is_inv hv1 hv2;;
+ expanse_cond_fp false cond_float c lhsv
+ | Ocmp (Cnotcompf c), f1 :: f2 :: nil =>
+ DO hv1 <~ hsi_sreg_get hst f1;;
+ DO hv2 <~ hsi_sreg_get hst f2;;
+ let is_inv := is_inv_cmp_float c in
+ DO lhsv <~ make_lhsv_cmp is_inv hv1 hv2;;
+ expanse_cond_fp true cond_float c lhsv
+ | Ocmp (Ccompfs c), f1 :: f2 :: nil =>
+ DO hv1 <~ hsi_sreg_get hst f1;;
+ DO hv2 <~ hsi_sreg_get hst f2;;
+ let is_inv := is_inv_cmp_float c in
+ DO lhsv <~ make_lhsv_cmp is_inv hv1 hv2;;
+ expanse_cond_fp false cond_single c lhsv
+ | Ocmp (Cnotcompfs c), f1 :: f2 :: nil =>
+ DO hv1 <~ hsi_sreg_get hst f1;;
+ DO hv2 <~ hsi_sreg_get hst f2;;
+ let is_inv := is_inv_cmp_float c in
+ DO lhsv <~ make_lhsv_cmp is_inv hv1 hv2;;
+ expanse_cond_fp true cond_single c lhsv*)
+ | _, _ => None
+ end.
+
Lemma target_op_simplify_correct op lr hst fsv ge sp rs0 m0 st args m: forall
(H: target_op_simplify op lr hst = Some fsv)
@@ -12,8 +117,8 @@ Lemma target_op_simplify_correct op lr hst fsv ge sp rs0 m0 st args m: forall
(OK1: seval_list_sval ge sp (list_sval_inj (map (si_sreg st) lr)) rs0 m0 = Some args)
(OK2: seval_smem ge sp (si_smem st) rs0 m0 = Some m),
seval_sval ge sp (hsval_proj fsv) rs0 m0 = eval_operation ge sp op args m.
-Proof.
+Proof. Admitted. (*
unfold target_op_simplify; simpl. congruence.
-Qed.
+ Qed.*)
Global Opaque target_op_simplify.