\section{Cells} MLRISC uses the \mlrischref{instructions/cells.sig}{CELLS} interface to define all readable/writable resources in a machine architecture, or \emph{cells} The types defined herein are: \begin{itemize} \item \sml{cellkind} -- different classes of cells are assigned difference cellkinds. The following cellkinds should be present \begin{itemize} \item \sml{GP} -- general purpose registers. \item \sml{FP} -- floating point registers. \item \sml{CC} -- condition code registers. \end{itemize} In addition, the cellkinds \sml{MEM} and \sml{CTRL} should also be defined. These are used for representing memory based data dependence and control dependence. \begin{itemize} \item \sml{MEM} -- memory \item \sml{CTRL} -- control dependence \end{itemize} \item \sml{regmap} -- \href{regmap.html}{register map} \item \sml{cellset} -- a cellset represent a set of cells. This type can be used to denote live-in/live-out information. Cellsets are implemented as immutable abstract types. \end{itemize} These core definitions are defined in the following signature \begin{SML} signature \mlrischref{instructions/cells.sig}{CELLS\_BASIS} = sig eqtype cellkind type cell = int type regmap = cell Intmap.intmap exception Cells val cellkinds : cellkind list val cellkindToString : cellkind -> string val firstPseudo : cell val Reg : cellkind -> int -> cell val GPReg : int -> cell val FPReg : int -> cell val cellRange : cellkind -> {low:int, high:int} val newCell : cellkind -> 'a -> cell val cellKind : cell -> cellkind val updateCellKind : cell * cellkind -> unit val numCell : cellkind -> unit -> int val maxCell : unit -> cell val newReg : 'a -> cell val newFreg : 'a -> cell val newVar : cell -> cell val regmap : unit -> regmap val lookup : regmap -> cell -> cell val reset : unit -> unit end \end{SML} \begin{itemize} \item\sml{cellkinds} -- this is a list of all the cellkinds defined in the architecture \item\sml{cellkindToString} -- this function maps a cellkind into its name \item\sml{firstPseudo} -- MLRISC numbered physical resources in the architecture from 0 to firstPseudo-1. This is the first usable virtual register number. \item\sml{Reg} -- This function maps the $i$th physical resource of a particular cellkind to its internal encoding used by MLRISC. Note that all resources in MLRISC are named uniquely. \item\sml{GPReg} -- abbreviation for \sml{Reg GP} \item\sml{FPReg} -- abbreviation for \sml{Reg FP} \item \sml{cellRange} -- this returns a range \sml{{low, high}} when given a cellkind, with denotes the range of physical resources \item \sml{newCell} -- This function returns a new virtual register of a particular cellkind. \item \sml{newReg} -- abbreviation as \sml{newCell GP} \item \sml{newFreg} -- abbreviation as \sml{newCell FP} \item \sml{cellKind} -- When given a cell number, this returns its cellkind. Note that this feature is not enabled by default. \item \sml{updateCellKind} -- updates the cellkind of a cell. \item \sml{numCell} -- returns the number of virtual cells allocated for one cellkind. \item \sml{maxCell} -- returns the next virtual cell id. \item \sml{newVar} -- given a cell id, return a new cell id of the same cellkind. \item \sml{regmap} -- This function returns a new empty regmap \item \sml{lookup} -- This converts a regmap into a lookup function. \item \sml{reset} -- This function resets all counters associated with all virtual cells. \end{itemize} \begin{SML} signature CELLS = sig include CELLS_BASIS val GP : cellkind val FP : cellkind val CC : cellkind val MEM : cellkind val CTRL : cellkind val toString : cellkind -> cell -> string val stackptrR : cell val asmTmpR : cell val fasmTmp : cell val zeroReg : cellkind -> cell option type cellset val empty : cellset val addCell : cellkind -> cell * cellset -> cellset val rmvCell : cellkind -> cell * cellset -> cellset val addReg : cell * cellset -> cellset val rmvReg : cell * cellset -> cellset val addFreg : cell * cellset -> cellset val rmvFreg : cell * cellset -> cellset val getCell : cellkind -> cellset -> cell list val updateCell : cellkind -> cellset * cell list -> cellset val cellsetToString : cellset -> string val cellsetToString' : (cell -> cell) -> cellset -> string val cellsetToCells : cellset -> cell list end \end{SML} \begin{itemize} \item \sml{toString} -- convert a cell id of a certain cellkind into its assembly name. \item \sml{stackptrR} -- the cell id of the stack pointer register. \item \sml{asmTmpR} -- the cell id of the assembly temporary \item \sml{fasmTmp} -- the cell id of the floating point temporary \item \sml{zeroReg} -- given the cellkind, returns the cell id of the source that always hold the value of zero, if there is any. \item \sml{empty} -- an empty cellset \item \sml{addCell} -- inserts a cell into a cellset \item \sml{rmvCell} -- remove a cell from a cellset \item \sml{addReg} -- abbreviation for \sml{addCell GP} \item \sml{rmvReg} -- abbreviation for \sml{rmvCell GP} \item \sml{addFreg} -- abbreviation for \sml{addCell FP} \item \sml{rmvFreg} -- abbreviation for \sml{rmvCell FP} \item \sml{getCell} -- lookup all cells of a particular cellkind from the cellset \item \sml{updateCell} -- replace all cells of a particular cellkind from the cellset. \item \sml{cellsetToString} -- pretty print a cellset \item \sml{cellsetToString'} -- pretty print a cellset, but first apply a regmap function. \item \sml{cellsetToCells} -- convert a cellset into list form. \end{itemize}