: vm-frame-required ( -- )
frame-required
- stack-frame new t >>calls-vm? request-stack-frame ;
+ stack-frame new vm-stack-space >>params request-stack-frame ;
M: ##call-gc compute-stack-frame* drop vm-frame-required ;
M: ##box compute-stack-frame* drop vm-frame-required ;
: <alien-stack-frame> ( stack-size return -- stack-frame )
stack-frame new
swap return-size >>return
- swap >>params
- t >>calls-vm? ;
+ swap >>params ;
: emit-stack-frame ( stack-size params -- )
[ return>> ] [ abi>> ] bi
{ params integer }
{ return integer }
{ spill-area-size integer }
-{ total-size integer }
-{ calls-vm? boolean } ;
+{ total-size integer } ;
! Stack frame utilities
: return-offset ( -- offset )
[ [ params>> ] bi@ max >>params ]
[ [ return>> ] bi@ max >>return ]
[ [ spill-area-size>> ] bi@ max >>spill-area-size ]
- [ [ calls-vm?>> ] bi@ or >>calls-vm? ]
} 2cleave ;
! Callbacks are not allowed to clobber this
HOOK: frame-reg cpu ( -- reg )
+! Parameter space to reserve in anything making VM calls
+HOOK: vm-stack-space cpu ( -- n )
+
+M: object vm-stack-space 0 ;
+
! Specifies if %slot, %set-slot and %write-barrier accept the
! 'scale' and 'tag' parameters, and if %load-memory and
! %store-memory work
M: x86.32 %vm-field-ptr ( dst field -- )
[ 0 MOV ] dip rc-absolute-cell rel-vm ;
-M: x86.32 extra-stack-space calls-vm?>> 16 0 ? ;
-
M: x86.32 %mark-card
drop HEX: ffffffff [+] card-mark <byte> MOV
building get pop
M: x86.32 reserved-stack-space 0 ;
+M: x86.32 vm-stack-space 16 ;
+
: save-vm-ptr ( n -- )
stack@ 0 MOV 0 rc-absolute-cell rel-vm ;
M: x86.64 stack-reg RSP ;
M: x86.64 frame-reg RBP ;
-M: x86.64 extra-stack-space drop 0 ;
-
M: x86.64 machine-registers
{
{ int-regs { RAX RCX RDX RBX RBP RSI RDI R8 R9 R10 R11 R12 } }
HOOK: reserved-stack-space cpu ( -- n )
-HOOK: extra-stack-space cpu ( stack-frame -- n )
-
: stack@ ( n -- op ) stack-reg swap [+] ;
: special-offset ( m -- n )
- stack-frame get extra-stack-space +
reserved-stack-space + ;
: spill@ ( n -- op ) spill-offset special-offset stack@ ;
: align-stack ( n -- n' ) 16 align ;
M: x86 stack-frame-size ( stack-frame -- i )
- [ (stack-frame-size) ]
- [ extra-stack-space ] bi +
+ (stack-frame-size)
reserved-stack-space +
3 cells +
align-stack ;