FFI rewrite part 3: eliminate ##push-context-stack and ##pop-context-stack
parent
acfbea3865
commit
4478c3a51a
|
@ -72,13 +72,7 @@ M: reg-class reg-class-full?
|
|||
: parameter-offsets ( types -- offsets )
|
||||
0 [ stack-size + ] accumulate nip ;
|
||||
|
||||
: each-parameter ( parameters quot -- )
|
||||
[ [ parameter-offsets ] keep ] dip 2each ; inline
|
||||
|
||||
: reverse-each-parameter ( parameters quot -- )
|
||||
[ [ parameter-offsets ] keep ] dip 2reverse-each ; inline
|
||||
|
||||
: prepare-unbox-parameters ( parameters -- offsets types indices )
|
||||
: prepare-parameters ( parameters -- offsets types indices )
|
||||
[ length iota <reversed> ] [ parameter-offsets ] [ ] tri ;
|
||||
|
||||
GENERIC: unbox-parameter ( src n c-type -- )
|
||||
|
@ -95,7 +89,7 @@ M: struct-c-type unbox-parameter
|
|||
: unbox-parameters ( offset node -- )
|
||||
parameters>> swap
|
||||
'[
|
||||
prepare-unbox-parameters
|
||||
prepare-parameters
|
||||
[
|
||||
[ <ds-loc> ^^peek ] [ _ + ] [ base-type ] tri*
|
||||
unbox-parameter
|
||||
|
@ -234,13 +228,21 @@ M: struct-c-type box-parameter
|
|||
|
||||
: box-parameters ( params -- )
|
||||
alien-parameters
|
||||
[ base-type box-parameter next-vreg ##push-context-stack ] each-parameter ;
|
||||
[ length ##inc-d ]
|
||||
[
|
||||
prepare-parameters
|
||||
[
|
||||
next-vreg next-vreg ##save-context
|
||||
base-type box-parameter swap <ds-loc> ##replace
|
||||
] 3each
|
||||
] bi ;
|
||||
|
||||
: registers>objects ( node -- )
|
||||
! Generate code for boxing input parameters in a callback.
|
||||
[
|
||||
dup \ ##save-param-reg move-parameters
|
||||
##begin-callback
|
||||
next-vreg next-vreg ##restore-context
|
||||
box-parameters
|
||||
] with-param-regs ;
|
||||
|
||||
|
@ -280,7 +282,7 @@ M: #alien-callback emit-node
|
|||
[ wrap-callback-quot ##alien-callback ]
|
||||
[
|
||||
alien-return [ ##end-callback ] [
|
||||
[ ^^pop-context-stack ] dip
|
||||
[ D 0 ^^peek ] dip
|
||||
##end-callback
|
||||
base-type unbox-return
|
||||
] if-void
|
||||
|
|
|
@ -644,10 +644,6 @@ INSN: ##unbox-small-struct
|
|||
use: src/tagged-rep
|
||||
literal: c-type ;
|
||||
|
||||
INSN: ##pop-context-stack
|
||||
def: dst/tagged-rep
|
||||
temp: temp/int-rep ;
|
||||
|
||||
INSN: ##prepare-box-struct ;
|
||||
|
||||
INSN: ##load-param-reg
|
||||
|
@ -665,10 +661,6 @@ use: src/int-rep ;
|
|||
INSN: ##alien-assembly
|
||||
literal: quot ;
|
||||
|
||||
INSN: ##push-context-stack
|
||||
use: src/tagged-rep
|
||||
temp: temp/int-rep ;
|
||||
|
||||
INSN: ##save-param-reg
|
||||
literal: offset reg rep ;
|
||||
|
||||
|
@ -768,6 +760,9 @@ literal: cc ;
|
|||
INSN: ##save-context
|
||||
temp: temp1/int-rep temp2/int-rep ;
|
||||
|
||||
INSN: ##restore-context
|
||||
temp: temp1/int-rep temp2/int-rep ;
|
||||
|
||||
! GC checks
|
||||
INSN: ##check-nursery-branch
|
||||
literal: size cc
|
||||
|
|
|
@ -246,6 +246,7 @@ CODEGEN: ##compare-integer-imm %compare-integer-imm
|
|||
CODEGEN: ##compare-float-ordered %compare-float-ordered
|
||||
CODEGEN: ##compare-float-unordered %compare-float-unordered
|
||||
CODEGEN: ##save-context %save-context
|
||||
CODEGEN: ##restore-context %restore-context
|
||||
CODEGEN: ##vm-field %vm-field
|
||||
CODEGEN: ##set-vm-field %set-vm-field
|
||||
CODEGEN: ##alien-global %alien-global
|
||||
|
@ -283,13 +284,11 @@ CODEGEN: ##unbox %unbox
|
|||
CODEGEN: ##unbox-long-long %unbox-long-long
|
||||
CODEGEN: ##unbox-large-struct %unbox-large-struct
|
||||
CODEGEN: ##unbox-small-struct %unbox-small-struct
|
||||
CODEGEN: ##pop-context-stack %pop-context-stack
|
||||
CODEGEN: ##prepare-box-struct %prepare-box-struct
|
||||
CODEGEN: ##load-param-reg %load-param-reg
|
||||
CODEGEN: ##alien-invoke %alien-invoke
|
||||
CODEGEN: ##cleanup %cleanup
|
||||
CODEGEN: ##alien-indirect %alien-indirect
|
||||
CODEGEN: ##push-context-stack %push-context-stack
|
||||
CODEGEN: ##save-param-reg %save-param-reg
|
||||
CODEGEN: ##begin-callback %begin-callback
|
||||
CODEGEN: ##alien-callback %alien-callback
|
||||
|
|
|
@ -553,19 +553,8 @@ HOOK: dummy-int-params? cpu ( -- ? )
|
|||
! If t, all int parameters are shadowed by dummy FP parameters
|
||||
HOOK: dummy-fp-params? cpu ( -- ? )
|
||||
|
||||
! Store a value (to the data stack in the VM's current context)
|
||||
! The value is passed to a VM to_*() function -- used for
|
||||
! callback returns
|
||||
HOOK: %pop-context-stack cpu ( dst temp -- )
|
||||
|
||||
! Store a value (to the data stack in the VM's current context)
|
||||
! The value is returned from a VM from_*() function -- used for
|
||||
! callback parameters
|
||||
HOOK: %push-context-stack cpu ( src temp -- )
|
||||
|
||||
! Call a function to convert a tagged pointer returned by
|
||||
! %pop-stack or %pop-context-stack into a value that can be
|
||||
! passed to a C function, or returned from a callback
|
||||
! Call a function to convert a tagged pointer into a value that
|
||||
! can be passed to a C function, or returned from a callback
|
||||
HOOK: %unbox cpu ( src n rep func -- )
|
||||
|
||||
HOOK: %unbox-long-long cpu ( src n func -- )
|
||||
|
@ -576,8 +565,7 @@ HOOK: %unbox-large-struct cpu ( src n c-type -- )
|
|||
|
||||
! Call a function to convert a value into a tagged pointer,
|
||||
! possibly allocating a bignum, float, or alien instance,
|
||||
! which is then pushed on the data stack by %push-stack or
|
||||
! %push-context-stack
|
||||
! which is then pushed on the data stack
|
||||
HOOK: %box cpu ( dst n rep func -- )
|
||||
|
||||
HOOK: %box-long-long cpu ( dst n func -- )
|
||||
|
|
|
@ -195,12 +195,6 @@ M:: x86.32 %box-small-struct ( dst c-type -- )
|
|||
"from_small_struct" f %alien-invoke
|
||||
dst EAX tagged-rep %copy ;
|
||||
|
||||
M:: x86.32 %pop-context-stack ( dst temp -- )
|
||||
temp %context
|
||||
dst temp "datastack" context-field-offset [+] MOV
|
||||
dst dst [] MOV
|
||||
temp "datastack" context-field-offset [+] bootstrap-cell SUB ;
|
||||
|
||||
:: call-unbox-func ( src func -- )
|
||||
EAX src tagged-rep %copy
|
||||
4 save-vm-ptr
|
||||
|
@ -249,10 +243,8 @@ M: x86.32 %begin-callback ( -- )
|
|||
"begin_callback" f %alien-invoke ;
|
||||
|
||||
M: x86.32 %alien-callback ( quot -- )
|
||||
EAX EDX %restore-context
|
||||
EAX swap %load-reference
|
||||
EAX quot-entry-point-offset [+] CALL
|
||||
EAX EDX %save-context ;
|
||||
EAX quot-entry-point-offset [+] CALL ;
|
||||
|
||||
M: x86.32 %end-callback ( -- )
|
||||
0 save-vm-ptr
|
||||
|
|
|
@ -117,12 +117,6 @@ M: x86.64 %load-param-reg [ swap param@ ] dip %copy ;
|
|||
call
|
||||
] with-scope ; inline
|
||||
|
||||
M:: x86.64 %pop-context-stack ( dst temp -- )
|
||||
temp %context
|
||||
dst temp "datastack" context-field-offset [+] MOV
|
||||
dst dst [] MOV
|
||||
temp "datastack" context-field-offset [+] bootstrap-cell SUB ;
|
||||
|
||||
M:: x86.64 %unbox ( src n rep func -- )
|
||||
param-reg-0 src tagged-rep %copy
|
||||
param-reg-1 %mov-vm-ptr
|
||||
|
@ -232,10 +226,8 @@ M: x86.64 %begin-callback ( -- )
|
|||
"begin_callback" f %alien-invoke ;
|
||||
|
||||
M: x86.64 %alien-callback ( quot -- )
|
||||
param-reg-0 param-reg-1 %restore-context
|
||||
param-reg-0 swap %load-reference
|
||||
param-reg-0 quot-entry-point-offset [+] CALL
|
||||
param-reg-0 param-reg-1 %save-context ;
|
||||
param-reg-0 quot-entry-point-offset [+] CALL ;
|
||||
|
||||
M: x86.64 %end-callback ( -- )
|
||||
param-reg-0 %mov-vm-ptr
|
||||
|
|
|
@ -504,12 +504,6 @@ M:: x86 %check-nursery-branch ( label size cc temp1 temp2 -- )
|
|||
M: x86 %alien-global ( dst symbol library -- )
|
||||
[ 0 MOV ] 2dip rc-absolute-cell rel-dlsym ;
|
||||
|
||||
M:: x86 %push-context-stack ( src temp -- )
|
||||
temp %context
|
||||
temp "datastack" context-field-offset [+] bootstrap-cell ADD
|
||||
temp temp "datastack" context-field-offset [+] MOV
|
||||
temp [] src MOV ;
|
||||
|
||||
M: x86 %epilogue ( n -- ) cell - incr-stack-reg ;
|
||||
|
||||
:: (%boolean) ( dst temp insn -- )
|
||||
|
|
Loading…
Reference in New Issue