aboutsummaryrefslogtreecommitdiffstats
path: root/backend/Stacking.v
diff options
context:
space:
mode:
Diffstat (limited to 'backend/Stacking.v')
-rw-r--r--backend/Stacking.v113
1 files changed, 34 insertions, 79 deletions
diff --git a/backend/Stacking.v b/backend/Stacking.v
index cf797a11..d1c17029 100644
--- a/backend/Stacking.v
+++ b/backend/Stacking.v
@@ -22,88 +22,45 @@ Require Import Bounds Conventions Stacklayout Lineartyping.
(** The machine- and ABI-dependent aspects of the layout are defined
in module [Stacklayout]. *)
-(** Computation the frame offset for the given component of the frame.
- The component is expressed by the following [frame_index] sum type. *)
-
-Inductive frame_index: Type :=
- | FI_link: frame_index
- | FI_retaddr: frame_index
- | FI_local: Z -> typ -> frame_index
- | FI_arg: Z -> typ -> frame_index
- | FI_saved_int: Z -> frame_index
- | FI_saved_float: Z -> frame_index.
-
-Definition offset_of_index (fe: frame_env) (idx: frame_index) :=
- match idx with
- | FI_link => fe.(fe_ofs_link)
- | FI_retaddr => fe.(fe_ofs_retaddr)
- | FI_local x ty => fe.(fe_ofs_local) + 4 * x
- | FI_arg x ty => fe_ofs_arg + 4 * x
- | FI_saved_int x => fe.(fe_ofs_int_callee_save) + 4 * x
- | FI_saved_float x => fe.(fe_ofs_float_callee_save) + 8 * x
- end.
-
-(** * Saving and restoring callee-save registers *)
-
-(** [save_callee_save fe k] adds before [k] the instructions that
- store in the frame the values of callee-save registers used by the
- current function. *)
+(** Offsets (in bytes) corresponding to stack slots. *)
-Definition save_callee_save_reg
- (bound: frame_env -> Z) (number: mreg -> Z) (mkindex: Z -> frame_index)
- (ty: typ) (fe: frame_env) (cs: mreg) (k: Mach.code) :=
- let i := number cs in
- if zlt i (bound fe)
- then Msetstack cs (Int.repr (offset_of_index fe (mkindex i))) ty :: k
- else k.
+Definition offset_local (fe: frame_env) (x: Z) := fe.(fe_ofs_local) + 4 * x.
-Definition save_callee_save_regs
- (bound: frame_env -> Z) (number: mreg -> Z) (mkindex: Z -> frame_index)
- (ty: typ) (fe: frame_env) (csl: list mreg) (k: Mach.code) :=
- List.fold_right (save_callee_save_reg bound number mkindex ty fe) k csl.
+Definition offset_arg (x: Z) := fe_ofs_arg + 4 * x.
-Definition save_callee_save_int (fe: frame_env) :=
- save_callee_save_regs
- fe_num_int_callee_save index_int_callee_save FI_saved_int
- Tany32 fe int_callee_save_regs.
+(** [save_callee_save rl ofs k] adds before [k] the instructions that
+ store in the frame the values of callee-save registers [rl],
+ starting at offset [ofs]. *)
-Definition save_callee_save_float (fe: frame_env) :=
- save_callee_save_regs
- fe_num_float_callee_save index_float_callee_save FI_saved_float
- Tany64 fe float_callee_save_regs.
+Fixpoint save_callee_save_rec (rl: list mreg) (ofs: Z) (k: Mach.code) :=
+ match rl with
+ | nil => k
+ | r :: rl =>
+ let ty := mreg_type r in
+ let sz := AST.typesize ty in
+ let ofs1 := align ofs sz in
+ Msetstack r (Int.repr ofs1) ty :: save_callee_save_rec rl (ofs1 + sz) k
+ end.
Definition save_callee_save (fe: frame_env) (k: Mach.code) :=
- save_callee_save_int fe (save_callee_save_float fe k).
+ save_callee_save_rec fe.(fe_used_callee_save) fe.(fe_ofs_callee_save) k.
(** [restore_callee_save fe k] adds before [k] the instructions that
re-load from the frame the values of callee-save registers used by the
current function, restoring these registers to their initial values. *)
-Definition restore_callee_save_reg
- (bound: frame_env -> Z) (number: mreg -> Z) (mkindex: Z -> frame_index)
- (ty: typ) (fe: frame_env) (cs: mreg) (k: Mach.code) :=
- let i := number cs in
- if zlt i (bound fe)
- then Mgetstack (Int.repr (offset_of_index fe (mkindex i))) ty cs :: k
- else k.
-
-Definition restore_callee_save_regs
- (bound: frame_env -> Z) (number: mreg -> Z) (mkindex: Z -> frame_index)
- (ty: typ) (fe: frame_env) (csl: list mreg) (k: Mach.code) :=
- List.fold_right (restore_callee_save_reg bound number mkindex ty fe) k csl.
-
-Definition restore_callee_save_int (fe: frame_env) :=
- restore_callee_save_regs
- fe_num_int_callee_save index_int_callee_save FI_saved_int
- Tany32 fe int_callee_save_regs.
-
-Definition restore_callee_save_float (fe: frame_env) :=
- restore_callee_save_regs
- fe_num_float_callee_save index_float_callee_save FI_saved_float
- Tany64 fe float_callee_save_regs.
+Fixpoint restore_callee_save_rec (rl: list mreg) (ofs: Z) (k: Mach.code) :=
+ match rl with
+ | nil => k
+ | r :: rl =>
+ let ty := mreg_type r in
+ let sz := AST.typesize ty in
+ let ofs1 := align ofs sz in
+ Mgetstack (Int.repr ofs1) ty r :: restore_callee_save_rec rl (ofs1 + sz) k
+ end.
Definition restore_callee_save (fe: frame_env) (k: Mach.code) :=
- restore_callee_save_int fe (restore_callee_save_float fe k).
+ restore_callee_save_rec fe.(fe_used_callee_save) fe.(fe_ofs_callee_save) k.
(** * Code transformation. *)
@@ -126,7 +83,7 @@ Fixpoint transl_builtin_arg (fe: frame_env) (a: builtin_arg loc) : builtin_arg m
match a with
| BA (R r) => BA r
| BA (S Local ofs ty) =>
- BA_loadstack (chunk_of_type ty) (Int.repr (offset_of_index fe (FI_local ofs ty)))
+ BA_loadstack (chunk_of_type ty) (Int.repr (offset_local fe ofs))
| BA (S _ _ _) => BA_int Int.zero (**r never happens *)
| BA_int n => BA_int n
| BA_long n => BA_long n
@@ -157,20 +114,20 @@ Definition transl_instr
| Lgetstack sl ofs ty r =>
match sl with
| Local =>
- Mgetstack (Int.repr (offset_of_index fe (FI_local ofs ty))) ty r :: k
+ Mgetstack (Int.repr (offset_local fe ofs)) ty r :: k
| Incoming =>
- Mgetparam (Int.repr (offset_of_index fe (FI_arg ofs ty))) ty r :: k
+ Mgetparam (Int.repr (offset_arg ofs)) ty r :: k
| Outgoing =>
- Mgetstack (Int.repr (offset_of_index fe (FI_arg ofs ty))) ty r :: k
+ Mgetstack (Int.repr (offset_arg ofs)) ty r :: k
end
| Lsetstack r sl ofs ty =>
match sl with
| Local =>
- Msetstack r (Int.repr (offset_of_index fe (FI_local ofs ty))) ty :: k
+ Msetstack r (Int.repr (offset_local fe ofs)) ty :: k
| Incoming =>
k (* should not happen *)
| Outgoing =>
- Msetstack r (Int.repr (offset_of_index fe (FI_arg ofs ty))) ty :: k
+ Msetstack r (Int.repr (offset_arg ofs)) ty :: k
end
| Lop op args res =>
Mop (transl_op fe op) args res :: k
@@ -181,8 +138,7 @@ Definition transl_instr
| Lcall sig ros =>
Mcall sig ros :: k
| Ltailcall sig ros =>
- restore_callee_save fe
- (Mtailcall sig ros :: k)
+ restore_callee_save fe (Mtailcall sig ros :: k)
| Lbuiltin ef args dst =>
Mbuiltin ef (map (transl_builtin_arg fe) args) dst :: k
| Llabel lbl =>
@@ -194,8 +150,7 @@ Definition transl_instr
| Ljumptable arg tbl =>
Mjumptable arg tbl :: k
| Lreturn =>
- restore_callee_save fe
- (Mreturn :: k)
+ restore_callee_save fe (Mreturn :: k)
end.
(** Translation of a function. Code that saves the values of used