Dan Sugalski wrote:At 9:16 AM +0200 10/20/04, Leopold Toetsch wrote:
Right. Any time an actual continuation is created we need to walk back up the call chain and mark all the pending return continuations as non-recyclable.
Ok.
If we're not saving much on the register stacks (and with the switch in calls we won't be, which means we can drop the pushtop/poptop stuff on calls) it's easier to go with a one-frame-per-chunk setup.
Yep, it's easier. Let's start with that.
Good. Today I can manage eaiser. I'm not sure past that. :)
r16 = BP_OFFS(r13) # get base bointer from interpreter
What, we have two registers dedicated? One for the interpreter pointer and one for the start of registers? I didn't realize that. If so, then nevermind.
Well, not quite ;) But it's absolutely no problem for e.g. PPC. It got plenty of callee-saved registers. For i386 the frame-pointer is currently being created in %ebx, interpreter access, which is basically rare, needs:
mov -16(%ebp), %eax # get interpreter
And that's needed too for getting the new frame pointer
mov BP_OFFS(%eax), %ebx # only for reload after invoke
Accessing e.g. a non-mapped I2 is already:
mov 8(%ebx), %eax
which isn't worse then the old absolute address thingy.
'Kay, now I'm confused. I thought we were talking about removing the registers from out of the interpreter structure, which'd leave us needing two pointers, one for the interpreter struct and one for the registers. (With no link back from the register stack top to the interpreter) That not the case?
--
Dan
--------------------------------------it's like this------------------- Dan Sugalski even samurai [EMAIL PROTECTED] have teddy bears and even teddy bears get drunk