\section{Client Defined Constants}
\subsubsection{Introduction}
MLRISC allows the client to inject abstract 
\newdef{constants} that are resolved
only at the end of the compilation phase into the instruction stream.
These constants can be used whereever an integer literal is expected.
Typical usage are stack frame offsets for spill locations which are only
known after register allocation, 
and garbage collection and exception map which are resolved only
when all address calculation are performed.

\subsubsection{The Details}
Client defined constants should satsify the following signature:
\begin{SML}
signature \mlrischref{instructions/constant.sig}{CONSTANT} = sig
   type const

   val toString : const -> string
   val valueOf  : const -> int
   val hash     : const -> word
   val ==       : const * const -> bool
end
\end{SML}

The methods are:
\begin{methods}
 toString & a pretty printing function \\
 valueOf & returns the value of the constant \\
 hash & returns the hash value of the constant \\
 == & compare two constants for identity \\
\end{methods}

The method \sml{toString} should be implemented in all cases.
The method \sml{valueOf} is necessary only if machine code generation
is used.  The last two methods, \sml{hash} and \sml{==} are necessary
only if SSA optimizations are used.
