[gambit-list] A register is not initialized in gvm code?
Marc Feeley
feeley at iro.umontreal.ca
Thu Nov 18 09:56:42 EST 2010
On 2010-11-18, at 8:11 AM, Oleg Parashchenko wrote:
> Hello,
>
> I compiled to GVM the following test program:
>
> (declare (standard-bindings) (fixnum) (not safe))
> (define mkadder
> (lambda (n)
> (lambda (x)
> (+ x n))))
> (define add1 (mkadder 1))
> (add1 1)
>
> In the produced GVM code (below, slightly edited for mail posting), I see
> that the code of the lambda uses a closure in the register 4, but nowhere
> in the code I see an assigment to this register. What do I miss?
>
> **** #<primitive | test2.o7|> =
> #line 2 "............"
> #1 0 entry-point 0 ()
> ~#mkadder = '#<procedure ~#mkadder>
> #line 6
> -1 = +0
> +1 = '1
> +0 = #3
> -2 = .
> -3 = .
> -4 = .
> jump* 4 #2
> #2 4
> jump 4 ~#mkadder 1
> #3 4 return-point
> ~#add1 = +1
> #line 7
> +1 = '1
> +0 = -1
> jump* 4 #4
> #4 4
> jump 0 ~#add1 1
>
> **** #<procedure ~#mkadder> =
> #line 2 "................"
> #1 0 entry-point 1 ()
> close -1 = (#2 +1)
> +1 = -1
> jump 0 +0
> #2 0 closure-entry-point 1 ()
> +4 = +4(1)
> +1 = (##fx+ +1 +4)
> jump 0 +0
The setting of register 4 (i.e. "+4" in the GVM code) is a side effect of the jump instruction when a closure is being jumped to. Note that register 4 is unused at the moment of the jump because parameters are passed in 4 registers (+0=return address, +1=1st param, +2=2nd param, +3=3rd param). Register 4 will be set to the closure being called (i.e. register 4 is a "self" pointer). In your code this happens in the instruction "jump 0 +#add1 1" (the 0 is the new frame size and 1 is the argument count). The jumps with a star, i.e. "jump*", indicate that the jump includes a poll instruction (to check for stack overflow and interrupts).
What is your interest in the GVM code generated by Gambit?
Marc
More information about the Gambit-list
mailing list