| parrotcode: Register handling routines | |
| Contents | C |

src/gc/register.c - Register handling routines

Parrot has 4 register sets, one for each of its basic types. The number of registers in each set varies depending on the use counts of the subroutine and is determined by the PASM/PIR compiler in the register allocation pass (imcc/reg_alloc.c).

+----------++----+------+------------+----+
| context || N | I | P | S +
+----------++----+------+------------+----+
^ ^ ^ ^
| | ctx.bp ctx.bp_ps
ctx.state opt
padding
Registers are addressed as usual via the register base pointer ctx.bp.
The macro CONTEXT() hides these details

There are two allocation strategies: chunked memory and malloced with a free list.
CHUNKED_CTX_MEM = 1
ctx_mem.data is a pointer to an allocated chunk of memory. The pointer ctx_mem.free holds the next usable location. With (full) continuations the ctx_mem.free pointer can't be moved below the ctx_mem.threshold, which is the highest context pointer of all active continuations.
[the code for this is incomplete; it had suffered some bit-rot and was getting in the way of maintaining the other case. -- rgr, 4-Feb-06.]
RT #46177 GC has to lower this threshold when collecting continuations.
CHUNKED_CTX_MEM = 0
Context/register memory is malloced. ctx_mem.free is used as a free list of reusable items.
Round register allocation size up to the nearest multiple of 8. A granularity of 8 is arbitrary, it could have been some bigger power of 2. A "slot" is an index into the free_list array. Each slot in free_list has a linked list of pointers to already allocated contexts available for (re)use. The slot where an available context is stored corresponds to the size of the context.

void destroy_contextvoid create_initial_contextvoid parrot_gc_contextstatic void clear_regsstatic void init_contextParrot_Context *Parrot_dup_contextParrot_Context *Parrot_push_contextcaller_ctx. Suitable to use with Parrot_pop_context.void Parrot_pop_contextParrot_push_context and restores the previous context (the caller context).Parrot_Context *Parrot_alloc_contextn_regs_used is copied.void Parrot_free_contextre_use is true, this function is called by a return continuation invoke, else from the destructor of a continuation.void Parrot_set_context_threshold
void Parrot_clear_ivoid Parrot_clear_svoid Parrot_clear_pvoid Parrot_clear_n
include/parrot/register.h and src/stacks.c.
|
|
|