23.03.2013 Views

Performance and Evaluation of Lisp Systems - Dreamsongs

Performance and Evaluation of Lisp Systems - Dreamsongs

Performance and Evaluation of Lisp Systems - Dreamsongs

SHOW MORE
SHOW LESS

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

Hooray! Your file is uploaded and ready to be published.

Saved successfully!

Ooh no, something went wrong!