2 vm-reg vm-context-offset STW\r
\r
! Save C callstack pointer\r
- 2 context-callstack-save-offset 1 STW\r
+ 1 2 context-callstack-save-offset STW\r
\r
! Load Factor callstack pointer\r
1 2 context-callstack-bottom-offset LWZ\r
2 MTLR\r
BLRL\r
\r
+ ! Load VM again, pointlessly\r
+ 0 vm-reg LOAD32 rc-absolute-ppc-2/2 rt-vm jit-rel\r
+\r
! Load C callstack pointer\r
2 vm-reg vm-context-offset LWZ\r
1 2 context-callstack-save-offset LWZ\r
rs-reg ctx-reg context-retainstack-offset STW ;\r
\r
: jit-restore-context ( -- )\r
- jit-load-context\r
ds-reg ctx-reg context-datastack-offset LWZ\r
rs-reg ctx-reg context-retainstack-offset LWZ ;\r
\r
3 6 MR\r
4 vm-reg MR\r
"inline_cache_miss" jit-call\r
+ jit-load-context\r
jit-restore-context ;\r
\r
[ jit-load-return-address jit-inline-cache-miss ]\r
3 vm-reg MR\r
"begin_callback" jit-call\r
\r
+ jit-load-context\r
jit-restore-context\r
\r
! Call quotation\r
+ 3 nv-reg MR\r
jit-call-quot\r
\r
jit-save-context\r
0 vm-reg LOAD32 0 rc-absolute-ppc-2/2 jit-vm\r
\r
! Load ds and rs registers\r
+ jit-load-context\r
jit-restore-context\r
\r
! We have changed the stack; load return address again\r
: jit-pop-context-and-param ( -- )\r
3 ds-reg 0 LWZ\r
3 3 alien-offset LWZ\r
- 4 ds-reg -8 LWZ\r
- ds-reg ds-reg 16 SUBI ;\r
+ 4 ds-reg -4 LWZ\r
+ ds-reg ds-reg 8 SUBI ;\r
\r
: jit-push-param ( -- )\r
- ds-reg ds-reg 8 ADDI\r
+ ds-reg ds-reg 4 ADDI\r
4 ds-reg 0 STW ;\r
\r
: jit-set-context ( -- )\r
jit-pop-context-and-param\r
- 4 jit-switch-context\r
+ 3 jit-switch-context\r
jit-push-param ;\r
\r
[ jit-set-context ] \ (set-context) define-sub-primitive\r
\r
: jit-pop-quot-and-param ( -- )\r
3 ds-reg 0 LWZ\r
- 4 ds-reg -8 LWZ\r
- ds-reg ds-reg 16 SUBI ;\r
+ 4 ds-reg -4 LWZ\r
+ ds-reg ds-reg 8 SUBI ;\r
\r
: jit-start-context ( -- )\r
! Create the new context in return-reg\r
3 vm-reg MR\r
"new_context" jit-call\r
+ 6 3 MR\r
\r
jit-pop-quot-and-param\r
\r
- 3 jit-switch-context\r
+ 6 jit-switch-context\r
\r
jit-push-param\r
\r