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
|
functor RASpillTypes(I : INSTRUCTIONS) =
struct
structure G = RAGraph
structure C = I.C
structure CB = CellsBasis
type copyInstr =
(CB.cell list * CB.cell list) * I.instruction -> I.instruction list
(*
* Spill the value associated with reg into spillLoc.
* All definitions of instr should be renamed to a new temporary newReg.
*)
type spill =
{instr : I.instruction, (* instruction where spill is to occur *)
reg : CB.cell, (* register to spill *)
spillLoc : G.spillLoc, (* logical spill location *)
kill : bool, (* can we kill the current node? *)
annotations : Annotations.annotations ref (* annotations *)
} ->
{code : I.instruction list, (* instruction + spill code *)
proh : CB.cell list, (* prohibited from future spilling *)
newReg : CB.cell option (* the spilled value is available here *)
}
(* Spill the register src into spillLoc.
* The value is originally from register reg.
*)
type spillSrc =
{src : CB.cell, (* register to spill from *)
reg : CB.cell, (* the register *)
spillLoc : G.spillLoc, (* logical spill location *)
annotations : Annotations.annotations ref (* annotations *)
} -> I.instruction list (* spill code *)
(*
* Spill the temporary associated with a copy into spillLoc
*)
type spillCopyTmp =
{copy : I.instruction, (* copy to spill *)
reg : CB.cell, (* the register *)
spillLoc : G.spillLoc, (* logical spill location *)
annotations : Annotations.annotations ref (* annotations *)
} -> I.instruction (* spill code *)
(*
* Reload the value associated with reg from spillLoc.
* All uses of instr should be renamed to a new temporary newReg.
*)
type reload =
{instr : I.instruction, (* instruction where spill is to occur *)
reg : CB.cell, (* register to spill *)
spillLoc : G.spillLoc, (* logical spill location *)
annotations : Annotations.annotations ref (* annotations *)
} ->
{code : I.instruction list, (* instr + reload code *)
proh : CB.cell list, (* prohibited from future spilling *)
newReg : CB.cell option (* the reloaded value is here *)
}
(*
* Rename all uses fromSrc to toSrc
*)
type renameSrc =
{instr : I.instruction, (* instruction where spill is to occur *)
fromSrc : CB.cell, (* register to rename *)
toSrc : CB.cell (* register to rename to *)
} ->
{code : I.instruction list, (* renamed instr *)
proh : CB.cell list, (* prohibited from future spilling *)
newReg : CB.cell option (* the renamed value is here *)
}
(* Reload the register dst from spillLoc.
* The value is originally from register reg.
*)
type reloadDst =
{dst : CB.cell, (* register to reload to *)
reg : CB.cell, (* the register *)
spillLoc : G.spillLoc, (* logical spill location *)
annotations : Annotations.annotations ref (* annotations *)
} -> I.instruction list (* reload code *)
end
|