Jeremy Siek 4 years ago
parent
commit
c49149826d
1 changed files with 20 additions and 29 deletions
  1. 20 29
      book.tex

+ 20 - 29
book.tex

@@ -10487,8 +10487,6 @@ auxiliary function \code{apply-project} is in Figure~\ref{fig:apply-project}.
 \label{fig:type-check-R6-aux}
 \end{figure}
 
-% to do: add rules for vector-ref, etc. for Vectorof
-%Also, \key{eq?} is extended to operate on values of type \key{Any}.
 
 \begin{figure}[btp]
 \begin{lstlisting}
@@ -10593,20 +10591,10 @@ perform bounds checking at runtime.
         (exit))))
 \end{lstlisting}
 
-\begin{lstlisting}
-(vector-set! |$e_1$| |$e_2$| |$e_3$|)
-|$\Rightarrow$|
-(let ([v |$e'_1$|])
-  (let ([i |$e'_2$|])
-    (if (and (<= 0 i) (< i (vector-length v)))
-        (vector-set! v i |$e'_3$|)
-        (exit))))
-\end{lstlisting}
-
-Note that in the compiler for $R_7$, this pass comes after
-\code{shrink} so you should not literally use \code{and} and \code{<=}
-in the generated code for bounds checking, but instead expand those
-forms in the same way as \code{shrink}.
+In the compiler for $R_7$, this pass should come after \code{shrink},
+so you should not literally use \code{and} and \code{<=} in the
+generated code for bounds checking, but instead expand those forms in
+the same way as \code{shrink}.
 
 Because this pass depends on type information, we recommend
 implementing it as an extension to the type checker for $R_6$, as
@@ -10679,7 +10667,7 @@ of parameters in the function type matches the function's arity (using
 
 Regarding \code{inject}, we recommend compiling it to a slightly
 lower-level primitive operation named \code{make-any}. This operation
-takes a tag instead of a type. \\
+takes a tag instead of a type.
 \begin{center}
 \begin{minipage}{1.0\textwidth}
 \begin{lstlisting}
@@ -10690,8 +10678,9 @@ takes a tag instead of a type. \\
 \end{minipage}
 \end{center}
 
-We recommend translating the type predicates (\code{boolean?}, etc.)
-into uses of \code{tag-of-any} and \code{eq?}.
+The type predicates (\code{boolean?}, etc.) can be translated into
+uses of \code{tag-of-any} and \code{eq?} in a similar way as in the
+translation of \code{Project}.
 
 \section{Remove Complex Operands}
 \label{sec:rco-r6}
@@ -10705,7 +10694,7 @@ The subexpression of \code{ValueOf} must be atomic.
 The output of \code{explicate-control} is the $C_5$ language whose
 syntax is defined in Figure~\ref{fig:c5-syntax}. The \code{ValueOf}
 form that we added to $R_6$ remains an expression and the \code{Exit}
-expression becomes a statement.
+expression becomes a $\Tail$.
 
 
 \begin{figure}[tp]
@@ -10771,9 +10760,9 @@ movq 0(%r11) |$\itm{lhs'}$|
 
 \paragraph{Vector-set!}
 
-The same issue discussed above for \code{vector-ref} also applies to
-\code{vector-set!}.  The index may be an arbitrary expression so one
-must generate instructions to compute the offset at runtime.
+The above issue also applies to \code{vector-set!}.  The index may be
+an arbitrary expression so one must generate instructions to compute
+the offset at runtime.
 
 
 %% The same idea applies to `vector-set!`.
@@ -10795,8 +10784,8 @@ orq $|$\itm{tag}$|, |\itm{lhs'}|
 \end{lstlisting}
 The instruction selection for vectors and procedures is different
 because their is no need to shift them to the left. The rightmost 3
-bits are already zeros as described above. So we just combine the
-value and the tag using \key{orq}.  \\
+bits are already zeros as described at the beginning of this
+chapter. So we just combine the value and the tag using \key{orq}.  \\
 \begin{lstlisting}
 (Assign |\itm{lhs}| (Prim 'make-any (list |$e$| (Int |$\itm{tag}$|))))
 |$\Rightarrow$|
@@ -10853,10 +10842,11 @@ andq |$e'$|, |\itm{lhs'}|
 \label{sec:register-allocation-r6}
 \index{register allocation}
 
-As mentioned above, a variable of type \code{Any} might refer to a
-vector. Thus, the register allocator for $R_6$ needs to treat variable
-of type \code{Any} in the same way that it treats variables of type
-\code{Vector} for purposes of garbage collection. In particular,
+At the beginning of this chapter we discussed how a variable of type
+\code{Any} might refer to a vector. Thus, the register allocator for
+$R_6$ needs to treat variable of type \code{Any} in the same way that
+it treats variables of type \code{Vector} for purposes of garbage
+collection. In particular,
 \begin{itemize}
 \item If a variable of type \code{Any} is live during a function call,
   then it must be spilled. One way to accomplish this is to augment
@@ -10878,6 +10868,7 @@ previously created test programs.
 \section{Compiling $R_7$ to $R_6$}
 \label{sec:compile-r7}
 
+The \code{cast-insert} pass compiles from $R_7$ to $R_6$.
 Figure~\ref{fig:compile-r7-r6} shows the compilation of many of the
 $R_7$ forms into $R_6$. An important invariant of this pass is that
 given a subexpression $e$ in the $R_7$ program, the pass will produce