Performance and Evaluation of Lisp Systems - Dreamsongs
Performance and Evaluation of Lisp Systems - Dreamsongs
Performance and Evaluation of Lisp Systems - Dreamsongs
You also want an ePaper? Increase the reach of your titles
YUMPU automatically turns print PDFs into web optimized ePapers that Google loves.
44<br />
bits in the tag field <strong>of</strong> every object indicate where the CDR <strong>of</strong> that object (if any<br />
exists) is to be found. If the CDR-code has the value CDR-normal, then the CDR<br />
<strong>of</strong> the object is found by following the pointer in the next higher location. If<br />
the CDR-code has the value CDR-next, then the CDR object is the next higher<br />
location. If the CDR-code is CDR-NIL, then the CDR <strong>of</strong> the object is NIL. CDR-<br />
coding is completely transparent to the user <strong>and</strong> reduces the space needed to store<br />
list structure by nearly 50%. This scheme is essentially the same as that used on<br />
the 3600.<br />
2.4.4 The Microcompiler<br />
The optimizing microcompiler eliminates all the overhead <strong>of</strong> macroinstruc-<br />
tion processing <strong>and</strong> speeds up control flow <strong>and</strong> most forms <strong>of</strong> data manipulation.<br />
Compile-time declarations (using Common <strong>Lisp</strong> syntax) allow further optimiza-<br />
tion <strong>of</strong> function calling <strong>and</strong> open-coding <strong>of</strong> fixnum arithmetic.<br />
As has been <strong>of</strong>ten noted, function-calling speed is quite central to the per-<br />
formance <strong>of</strong> most <strong>Lisp</strong> programs. When generating a call from one microcoded<br />
function to another, the microcompiler can generate a particularly fast form <strong>of</strong><br />
function call termed a ‘micro-micro’ call. In the micro-micro function call, the<br />
call <strong>and</strong> return are only one microinstruction each <strong>and</strong> are pipelined using the<br />
delayed-branch mechanism <strong>of</strong> the Lambda micromachine. The overhead <strong>of</strong> calling<br />
<strong>and</strong> returning from a function is only 200 nanoseconds. Argument transmission<br />
is also efficient under microcompilation.<br />
To produce optimal code the microcompiler requires special declarations<br />
in much the same manner as do <strong>Lisp</strong>s running on conventional architectures.<br />
Microcode-to-microcode (micro-micro) calls can only be produced using appro-<br />
priate declarations. First, the microcompiler needs assurance that the target<br />
function will indeed be microcoded <strong>and</strong> will reside in the control store when it is<br />
called. Second, the micro-micro call pushes return addresses on a special stack,<br />
256-words deep, in the Lambda micromachine. Deeply recursing functions must<br />
arrange to check this stack for overflow occasionally—this process is controlled by<br />
declarations. It is interesting to note, however, that all <strong>of</strong> these benchmarks were<br />
run without overflow checks <strong>and</strong> without microstack overflow.<br />
There are several language constructs that cannot appear in microcompiled<br />
functions. Currently these include &REST arguments, CATCH/THROW control