blob: 622cddfe3296d09738b3bbbd18a3d0cd1d7c827c (
plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
|
(* *********************************************************************)
(* *)
(* The Compcert verified compiler *)
(* *)
(* Xavier Leroy, INRIA Paris-Rocquencourt *)
(* *)
(* Copyright Institut National de Recherche en Informatique et en *)
(* Automatique. All rights reserved. This file is distributed *)
(* under the terms of the INRIA Non-Commercial License Agreement. *)
(* *)
(* *********************************************************************)
(** Pseudo-registers and register states.
This library defines the type of pseudo-registers (also known as
"temporaries" in compiler literature) used in the RTL
intermediate language. We also define finite sets and finite maps
over pseudo-registers. *)
Require Import Coqlib.
Require Import AST.
Require Import Maps.
Require Import Ordered.
Require FSetAVL.
Require Import Values.
Definition reg: Type := positive.
Module Reg.
Definition eq := peq.
Definition typenv := PMap.t typ.
End Reg.
(** Mappings from registers to some type. *)
Module Regmap := PMap.
Set Implicit Arguments.
Definition regmap_optget
(A: Type) (or: option reg) (dfl: A) (rs: Regmap.t A) : A :=
match or with
| None => dfl
| Some r => Regmap.get r rs
end.
Definition regmap_optset
(A: Type) (or: option reg) (v: A) (rs: Regmap.t A) : Regmap.t A :=
match or with
| None => rs
| Some r => Regmap.set r v rs
end.
Definition regmap_setres
(A: Type) (res: builtin_res reg) (v: A) (rs: Regmap.t A) : Regmap.t A :=
match res with
| BR r => Regmap.set r v rs
| _ => rs
end.
Notation "a # b" := (Regmap.get b a) (at level 1) : rtl.
Notation "a ## b" := (List.map (fun r => Regmap.get r a) b) (at level 1) : rtl.
Notation "a # b <- c" := (Regmap.set b c a) (at level 1, b at next level) : rtl.
Open Scope rtl.
(** Pointwise "less defined than" relation between register maps. *)
Definition regs_lessdef (rs1 rs2: Regmap.t val) : Prop :=
forall r, Val.lessdef (rs1#r) (rs2#r).
Lemma regs_lessdef_regs:
forall rs1 rs2, regs_lessdef rs1 rs2 ->
forall rl, Val.lessdef_list rs1##rl rs2##rl.
Proof.
induction rl; constructor; auto.
Qed.
Lemma set_reg_lessdef:
forall r v1 v2 rs1 rs2,
Val.lessdef v1 v2 -> regs_lessdef rs1 rs2 -> regs_lessdef (rs1#r <- v1) (rs2#r <- v2).
Proof.
intros; red; intros. repeat rewrite Regmap.gsspec.
destruct (peq r0 r); auto.
Qed.
Lemma set_res_lessdef:
forall res v1 v2 rs1 rs2,
Val.lessdef v1 v2 -> regs_lessdef rs1 rs2 ->
regs_lessdef (regmap_setres res v1 rs1) (regmap_setres res v2 rs2).
Proof.
intros. destruct res; simpl; auto. apply set_reg_lessdef; auto.
Qed.
(** Sets of registers *)
Module Regset := FSetAVL.Make(OrderedPositive).
|