Piers Cawley <[EMAIL PROTECTED]> wrote:
> Leopold Toetsch <[EMAIL PROTECTED]> writes:

>> And finally: I really don't know, if a Continuation needs just pointers
>> to the stacks (and to which) or (COWed) copies (to which).

> If a 'single object per stack frame' approah, the continuation only
> needs pointers to the various stacktops. In fact all that anything will
> need for dealing with such stacks is a pointer to their current
> stacktop.

That could work fine for register frames, which are big anyway. OTOH
control, user, and pad stacks items are single pointers. Accessing single
items as frames isn't really optimal.

>> *Will please somebody describe all the semantics of Continuation usage.*

> When the continuation is invoked using, say, "cont("Result1", 2, "bibble")
> the registers and user stacks should look exactly the same as if you
> had just returned from a normal function call that looked like:

>     a_function_call()
>   here:

That's clear. The problem is actually, how to create the continuation,
so that everything looks like a proper function call. The call
sequence of a .pcc_call maps to the creation of a continuation:

    .pcc_begin
    .arg x
    .arg y
    .create_call conti, label
    .pcc_end

The return is usually a different location:

    .pcc_begin
  label:
    .ret_from conti
    .result r1
    .result r2
    .pcc_end

This OTOH doesn't really cover the usage of a continuation that is
passed on to a function or method call as an argument.

> Given the way that the stack stuff works, I wonder if there's a case
> for rejigging the calling conventions so that the control registers
> (current continuation, self, (methodName?)) are contiguous with the
> user registers. If we made P15 the current object, P14 the current
> continuation, and S15 the methodname, then savetop could include them
> efficiently without IMCC having to do 'set P20 = P1' at the start of
> every sub that makes a function call.

Interesting idea. OTOH these register moves are really fast. C<set_p_p>
is two CPU instructions only in the (i386) JIT core.

> If IMCC were then to always allocate 'user' register in ascending order
> from 16, presumably it'd be possible to introduce a new op:

>     saverangep 14, 20

  pushp from, to

could replace all variants we now have:

  pushp        # 0..31
  pushtopp     # 16..31
  pushbottomp  # 0..15

That would need variable sized register frame chunks. But looking at
current memory costs of C<pushtopp> and friends, it could be a good
optimization.

leo

Reply via email to