Piers Cawley <[EMAIL PROTECTED]> wrote:

> The thing is, 'pushtop' is almost certainly the wrong thing to do. You
> should only push the registers you care about onto the register
> stacks.

Yes:

$ time parrot -j  oofib.imc
fib(28) = 317811 3.050051s

real    0m3.077s

$ time parrot -j -Oc  oofib.imc
fib(28) = 317811 2.234049s

real    0m2.262s

C<savetop> becomes C<pushtopp> if only P-registers are used. Saving only
3 or 5 registers isn't possible yet. We have no opcodes for that.

> The catch is that, whilst I know which registers *I* care about, I don't
> know which registers IMCC cares about. So maybe IMCC's 'newcont' should
> expand to:

>      save 'imcc_magic_register1'
>      save 'imcc_magic_register2'
>      target = newsub .Continuation, dest
>      restore 'imcc_magic_register2'
>      restore 'imcc_magic_register1'

> Notice how making a continuation looks remarkably like making a function
> call.

The usage of above Continuation would be to pass it on into a subroutine
and eventually return through it to an alternate position? If yes, then
the Continuation should be created inside the call sequence to avoid
duplicate register saving and restoring code:

  res = subroutine(args, NEWCONT)

But that's only one side of the business. The code at the return label
C<dest>) has to restore the same registers too.

If the target of the Continuation isn't the function return, it has to
look somethin like this:

      goto around_cont_ret
  cont_ret_target:
      restoretop   # or whatever was saved
  around_cont_ret:

> If the destination of the continuation is within the current
> compilation unit (which it probably should be, or things get *very*
> weird) then, potentially, IMCC knows what registers the continuation
> target cares about and can automagically save the current .locals as
> well.

Yes.

> Would it be possible to arrange things so that

>      $P0 = new .Continuation
>      $P0 = P1 # The current RetContinuation

> makes $P0 into a full continuation equivalent to the RetContinuation?

Sure. It depends on what part of the context should be copied into the
Continuation:

  get_addr Idest, P1
  set_addr $P0, Idest   # assign dest - implemented

or

  assign $P0, P1       # vtable->set_pmc  (N/Y)

which could do whatever is appropriate.

($P0 = P1 just aliases the two and isn't usable for assignment)

leo

Reply via email to