Added %vm-invoke to pass vm ptr to vm functions (x86.32 only, otherwise uses singleton vm)

db4
Phil Dawes 2009-08-18 21:03:22 +01:00
parent 57011aed51
commit 6a193bb0d5
7 changed files with 18 additions and 6 deletions

View File

@ -297,6 +297,8 @@ M: object %prepare-var-args ;
HOOK: %alien-invoke cpu ( function library -- ) HOOK: %alien-invoke cpu ( function library -- )
HOOK: %vm-invoke cpu ( function library -- )
HOOK: %cleanup cpu ( params -- ) HOOK: %cleanup cpu ( params -- )
M: object %cleanup ( params -- ) drop ; M: object %cleanup ( params -- ) drop ;

View File

@ -47,6 +47,12 @@ M: x86.32 reserved-area-size 0 ;
M: x86.32 %alien-invoke 0 CALL rc-relative rel-dlsym ; M: x86.32 %alien-invoke 0 CALL rc-relative rel-dlsym ;
M: x86.32 %vm-invoke
temp-reg 0 MOV rc-absolute-cell rt-vm rel-fixup ! push the vm ptr as the 3rd argument
temp-reg PUSH
%alien-invoke
temp-reg POP ;
M: x86.32 return-struct-in-registers? ( c-type -- ? ) M: x86.32 return-struct-in-registers? ( c-type -- ? )
c-type c-type
[ return-in-registers?>> ] [ return-in-registers?>> ]

View File

@ -172,6 +172,8 @@ M: x86.64 %alien-invoke
rc-absolute-cell rel-dlsym rc-absolute-cell rel-dlsym
R11 CALL ; R11 CALL ;
M: x86.64 %vm-invoke %alien-invoke ;
M: x86.64 %prepare-alien-indirect ( -- ) M: x86.64 %prepare-alien-indirect ( -- )
"unbox_alien" f %alien-invoke "unbox_alien" f %alien-invoke
RBP RAX MOV ; RBP RAX MOV ;

View File

@ -610,7 +610,7 @@ M:: x86 %call-gc ( gc-root-count -- )
! Pass number of roots as second parameter ! Pass number of roots as second parameter
param-reg-2 gc-root-count MOV param-reg-2 gc-root-count MOV
! Call GC ! Call GC
"inline_gc" f %alien-invoke ; "inline_gc" f %vm-invoke ;
M: x86 %alien-global M: x86 %alien-global
[ 0 MOV ] 2dip rc-absolute-cell rel-dlsym ; [ 0 MOV ] 2dip rc-absolute-cell rel-dlsym ;

View File

@ -7,4 +7,6 @@ register cell ds asm("esi");
register cell rs asm("edi"); register cell rs asm("edi");
#define VM_ASM_API VM_C_API __attribute__ ((regparm (2))) #define VM_ASM_API VM_C_API __attribute__ ((regparm (2)))
#undef VM_PTR
#define VM_PTR myvm
} }

View File

@ -694,7 +694,7 @@ PRIMITIVE(become)
PRIMITIVE_GETVM()->vmprim_become(); PRIMITIVE_GETVM()->vmprim_become();
} }
VM_ASM_API void factorvm::inline_gc(cell *gc_roots_base, cell gc_roots_size) void factorvm::inline_gc(cell *gc_roots_base, cell gc_roots_size)
{ {
for(cell i = 0; i < gc_roots_size; i++) for(cell i = 0; i < gc_roots_size; i++)
gc_locals.push_back((cell)&gc_roots_base[i]); gc_locals.push_back((cell)&gc_roots_base[i]);
@ -705,9 +705,9 @@ VM_ASM_API void factorvm::inline_gc(cell *gc_roots_base, cell gc_roots_size)
gc_locals.pop_back(); gc_locals.pop_back();
} }
VM_ASM_API void inline_gc(cell *gc_roots_base, cell gc_roots_size) VM_ASM_API void inline_gc(cell *gc_roots_base, cell gc_roots_size, factorvm *myvm)
{ {
return vm->inline_gc(gc_roots_base,gc_roots_size); return VM_PTR->inline_gc(gc_roots_base,gc_roots_size);
} }
} }

View File

@ -19,7 +19,7 @@ PRIMITIVE(gc);
PRIMITIVE(gc_stats); PRIMITIVE(gc_stats);
PRIMITIVE(clear_gc_stats); PRIMITIVE(clear_gc_stats);
PRIMITIVE(become); PRIMITIVE(become);
struct factorvm;
VM_ASM_API void inline_gc(cell *gc_roots_base, cell gc_roots_size); VM_ASM_API void inline_gc(cell *gc_roots_base, cell gc_roots_size, factorvm *myvm);
} }