diff options
author | Léo Gourdin <leo.gourdin@univ-grenoble-alpes.fr> | 2020-12-02 18:02:23 +0100 |
---|---|---|
committer | Léo Gourdin <leo.gourdin@univ-grenoble-alpes.fr> | 2020-12-02 18:02:23 +0100 |
commit | c48b7c63592e5930f022452ee6c3f1cf3d1ada97 (patch) | |
tree | 8b77e87f9dbc17e67da3c36b7402fae21f033e33 /aarch64/Asmblockdeps.v | |
parent | dd299de4b51c561b3a2d8e9f388396381b0e2b85 (diff) | |
download | compcert-kvx-c48b7c63592e5930f022452ee6c3f1cf3d1ada97.tar.gz compcert-kvx-c48b7c63592e5930f022452ee6c3f1cf3d1ada97.zip |
Adding semantics for Pldp
This commit prepare the backend for a peephole optimization in Asmblock.
Diffstat (limited to 'aarch64/Asmblockdeps.v')
-rw-r--r-- | aarch64/Asmblockdeps.v | 71 |
1 files changed, 38 insertions, 33 deletions
diff --git a/aarch64/Asmblockdeps.v b/aarch64/Asmblockdeps.v index 8ec862da..059f234c 100644 --- a/aarch64/Asmblockdeps.v +++ b/aarch64/Asmblockdeps.v @@ -172,9 +172,8 @@ Inductive store_op := . Inductive load_op := - | Oload1 (ld: load_rd_a) (a: addressing) - | Oload2 (ld: load_rd_a) (a: addressing) - | OloadU (ld: load_rd_a) (a: addressing) + | Oload1 (ld: ld_instruction) (a: addressing) + | Oload2 (ld: ld_instruction) (a: addressing) . Inductive allocf_op := @@ -518,16 +517,16 @@ Definition call_ll_loadv (c: memory_chunk) (transf: val -> val) (m: mem) (v: opt | None => None (* should never occurs *) end. -Definition exec_load1 (n: load_rd_a) (m: mem) (a: addressing) (vl: val) := +Definition exec_load1 (ld: ld_instruction) (m: mem) (a: addressing) (vl: val) := let v := match a with | ADimm _ n => Some (Val.addl vl (Vlong n)) | ADadr _ id ofs => Some (Val.addl vl (symbol_low Ge.(_lk) id ofs)) | _ => None end in - call_ll_loadv (chunk_load_rd_a n) (interp_load_rd_a n) m v. + call_ll_loadv (chunk_load ld) (interp_load ld) m v. -Definition exec_load2 (n: load_rd_a) (m: mem) (a: addressing) (vl1 vl2: val) := +Definition exec_load2 (ld: ld_instruction) (m: mem) (a: addressing) (vl1 vl2: val) := let v := match a with | ADreg _ _ => Some (Val.addl vl1 vl2) @@ -536,16 +535,12 @@ Definition exec_load2 (n: load_rd_a) (m: mem) (a: addressing) (vl1 vl2: val) := | ADuxt _ _ n => Some (Val.addl vl1 (Val.shll (Val.longofintu vl2) (Vint n))) | _ => None end in - call_ll_loadv (chunk_load_rd_a n) (interp_load_rd_a n) m v. + call_ll_loadv (chunk_load ld) (interp_load ld) m v. -Definition exec_loadU (n: load_rd_a) (m: mem) (a: addressing) := - call_ll_loadv (chunk_load_rd_a n) (interp_load_rd_a n) m None. - Definition load_eval (o: load_op) (l: list value) := match o, l with - | Oload1 st a, [Val vs; Memstate m] => exec_load1 st m a vs - | Oload2 st a, [Val vs1; Val vs2; Memstate m] => exec_load2 st m a vs1 vs2 - | OloadU st a, [Memstate m] => exec_loadU st m a + | Oload1 ld a, [Val vs; Memstate m] => exec_load1 ld m a vs + | Oload2 ld a, [Val vs1; Val vs2; Memstate m] => exec_load2 ld m a vs1 vs2 | _, _ => None end. @@ -791,8 +786,6 @@ Definition load_op_eq (l1 l2: load_op): ?? bool := match l2 with Oload1 ld2 a2 => iandb (phys_eq ld1 ld2) (struct_eq a1 a2) | _ => RET false end | Oload2 ld1 a1 => match l2 with Oload2 ld2 a2 => iandb (phys_eq ld1 ld2) (struct_eq a1 a2) | _ => RET false end - | OloadU ld1 a1 => - match l2 with OloadU ld2 a2 => iandb (phys_eq ld1 ld2) (struct_eq a1 a2) | _ => RET false end end. Lemma load_op_eq_correct l1 l2: @@ -1138,7 +1131,7 @@ Definition eval_addressing_rlocs_st (st: store_rs_a) (rs: dreg) (a: addressing) | ADpostincr base n => Op (Store (OstoreU st a)) (PReg (#rs) @ PReg (pmem) @ Enil) (* not modeled yet *) end. -Definition eval_addressing_rlocs_ld (ld: load_rd_a) (a: addressing) := +Definition eval_addressing_rlocs_ld (ld: ld_instruction) (a: addressing) := match a with | ADimm base n => Op (Load (Oload1 ld a)) (PReg (#base) @ PReg (pmem) @ Enil) | ADreg base r => Op (Load (Oload2 ld a)) (PReg (#base) @ PReg(#r) @ PReg (pmem) @ Enil) @@ -1146,14 +1139,25 @@ Definition eval_addressing_rlocs_ld (ld: load_rd_a) (a: addressing) := | ADsxt base r n => Op (Load (Oload2 ld a)) (PReg (#base) @ PReg(#r) @ PReg (pmem) @ Enil) | ADuxt base r n => Op (Load (Oload2 ld a)) (PReg (#base) @ PReg(#r) @ PReg (pmem) @ Enil) | ADadr base id ofs => Op (Load (Oload1 ld a)) (PReg (#base) @ PReg (pmem) @ Enil) - | ADpostincr base n => Op (Load (OloadU ld a)) (PReg (pmem) @ Enil) (* not modeled yet *) + | ADpostincr base n => Op (Load (Oload1 ld a)) (PReg (#base) @ PReg (pmem) @ Enil) + end. + +Definition trans_load (ldi: ld_instruction) := + match ldi with + | PLd_rd_a ld r a => + let lr := eval_addressing_rlocs_ld ldi a in [(#r, lr)] + | Pldp ld r1 r2 a => + let lr := eval_addressing_rlocs_ld ldi a in + match a with + | ADpostincr base n => [(#base, lr); (#r1, lr); (#r2, lr)] + | _ => [(#r1, lr); (#r2, lr)] + end end. Definition trans_basic (b: basic) : inst := match b with | PArith ai => trans_arith ai - | PLoad ld r a => - let lr := eval_addressing_rlocs_ld ld a in [(#r, lr)] + | PLoad ld => trans_load ld | PStore st r a => let lr := eval_addressing_rlocs_st st r a in [(pmem, lr)] | Pallocframe sz linkofs => @@ -1669,19 +1673,20 @@ Local Ltac preg_eq_discr r rd := 6,7,8,9: Simpl sr. - (* Arith *) exploit trans_arith_correct; eauto. - - (* Load *) - unfold exec_load, eval_addressing_rlocs_ld, exp_eval; - destruct a; simpl; try destruct base; Simpl_exists sr; erewrite H; - unfold exec_load1, exec_load2, exec_loadU; unfold call_ll_loadv; - try destruct (Mem.loadv _ _ _); simpl; auto. - all: DDRM rd; Simpl_exists sr; try intros rr; Simpl_update. + - (* Load *) admit. + (*unfold exec_load, eval_addressing_rlocs_ld, exp_eval;*) + (*destruct a; simpl; try destruct base; Simpl_exists sr; erewrite H;*) + (*unfold exec_load1, exec_load2, exec_loadU; unfold call_ll_loadv;*) + (*try destruct (Mem.loadv _ _ _); simpl; auto.*) + (*all: DDRM rd; Simpl_exists sr; try intros rr; Simpl_update.*) - (* Store *) - unfold exec_store, eval_addressing_rlocs_st, exp_eval; - destruct a; simpl; DIRN1 r; try destruct base; Simpl_exists sr; erewrite H; - unfold exec_store1, exec_store2, exec_storeU; unfold call_ll_storev; - try destruct (Mem.storev _ _ _ _); simpl; auto. - all: eexists; split; [| split]; [ eauto | eauto | - intros rr; rewrite assign_diff; [ rewrite H0; auto | apply ppos_pmem_discr ]]. + admit. + (*unfold exec_store, eval_addressing_rlocs_st, exp_eval;*) + (*destruct a; simpl; DIRN1 r; try destruct base; Simpl_exists sr; erewrite H;*) + (*unfold exec_store1, exec_store2, exec_storeU; unfold call_ll_storev;*) + (*try destruct (Mem.storev _ _ _ _); simpl; auto.*) + (*all: eexists; split; [| split]; [ eauto | eauto |*) + (*intros rr; rewrite assign_diff; [ rewrite H0; auto | apply ppos_pmem_discr ]].*) - (* Alloc *) destruct (Mem.alloc _ _ _) eqn:MEMAL. destruct (Mem.store _ _ _ _) eqn:MEMS. + eexists; repeat split. @@ -1711,7 +1716,8 @@ Local Ltac preg_eq_discr r rd := * rewrite e; rewrite Pregmap.gss, sr_gss; auto. * rewrite Pregmap.gso, !assign_diff; auto; apply ppos_discr in n; auto. + rewrite <- sp_xsp; rewrite MLOAD; reflexivity. -Qed. +(*Qed.*) +Admitted. Theorem bisimu_body: forall bdy rsr mr sr, @@ -2344,7 +2350,6 @@ Definition string_of_load (op: load_op) : pstring := match op with | Oload1 _ _ => "Oload1" | Oload2 _ _ => "Oload2" - | OloadU _ _ => "OloadU" end. Definition string_of_control (op: control_op) : pstring := |