Explanation by gb: Memory allocation is per-thread; a thread conses within a private "chunk" of memory by decrementing a per-thread pointer that starts at the high end of its current chunk and comparing that pointer to the low end of the chunk; if the pointer's above the limit, we use the memory, otherwise we need a new chunk: {{{ [21] (subl ($ 7) (@ (% fs) 132)) ; subtract the size of a cons - the tag of a cons ; from the per-thread pointer [30] (movl (@ (% fs) 132) (% temp0)) ; load the per-thread pointer into a temp reg [38] (cmpl (@ (% fs) 136) (% temp0)) ; compare to limit [46] (ja L50) ; continue if above limit [48] (uuo-alloc) ; trap, get a new chunk L50 [50] (andb ($ 248) (@ (% fs) 132)) ; clear tag bits in thread-local storage [59] (movl (% arg_y) (@ 3 (% temp0))) ; store car [62] (movl (% arg_z) (@ -1 (% temp0))) ; store cdr [65] (movl (% temp0) (% arg_z)) ; return cons cell }}}