\section{Client Defined Pseudo Ops}
\subsection{Introduction}
\newdef{Pseudo ops}
are client defined instruction stream markers.  They
can be used to represent assembly directives.
Pseudo ops should satisfy the following signature:
\begin{SML}
signature \mlrischref{instructions/pseudoOps.sig}{PSEUDO_OPS} = sig
  type pseudo_op
  val toString : pseudo_op -> string
  val emitValue : {pOp:pseudo_op, loc:int, emit:Word8.word -> unit} -> unit
  val sizeOf : pseudo_op * int -> int
  val adjustLabels : pseudo_op * int -> bool
end
\end{SML}

The method that is required is:
\begin{itemize}
 \item \sml{toString} -- pretty printing the pseudo in assembly format.
\end{itemize}

When machine code generation is used, we also have to implement
the following methods:
\begin{itemize}
 \item \sml{emitValue} --
    emit value of pseudo op give current location counter and output
    stream. The value emitted should respect the endianness of the
    target machine.
 \item \sml{sizeOf} --
    Size of the pseudo op in bytes given the current location counter
    The location counter is provided in case some pseudo ops are 
    dependent on alignment considerations.
 \item \sml{adjustLabels} --
    adjust the value of labels in the pseudo op given the current
    location counter.
\end{itemize}
These methods are involved during the 
\href{span-dep.html}{span dependence resolution} phase to determine
the size and layout of the pseudo ops.
