wiki:Internals/GarbageCollection

Version 2 (modified by rme, 7 years ago) (diff)

--

IA-32 GC notes

Usual node regs: %temp0/%ecx, %temp1/%edx, %arg_y/%esi, %arg_z/%ebx, %fn/%edi. This list can be modified by tcr.node_regs_mask. If a bit is clear, the corresponding register is to be treated as an immediate register.

/*
 * bits correspond to reg encoding used in instructions
 *   7   6   5   4   3   2   1   0
 *  edi esi ebp esp ebx edx ecx eax
 */

The default node_regs_mask is therefore #b11001110.

Other roots: tcr.save0, tcr.save1, tcr.save2, tcr.save3

We want the lisp heap (and possibly lisp stacks) to start at or above #x01000000. If we can assert that no gc-able lisp object will ever be below the 16 MB line, then we can put unboxed uvector indicies into node registers, and the GC will still be able to distinguish immediate and node values reliably.

This scheme does further wire in the sometimes-limiting ARRAY-TOTAL-SIZE-LIMIT of 16M.