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: %vm-invoke cpu ( function library -- )
HOOK: %cleanup cpu ( params -- )
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 %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 -- ? )
c-type
[ return-in-registers?>> ]

View File

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

View File

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

View File

@ -7,4 +7,6 @@ register cell ds asm("esi");
register cell rs asm("edi");
#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();
}
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++)
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();
}
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(clear_gc_stats);
PRIMITIVE(become);
VM_ASM_API void inline_gc(cell *gc_roots_base, cell gc_roots_size);
struct factorvm;
VM_ASM_API void inline_gc(cell *gc_roots_base, cell gc_roots_size, factorvm *myvm);
}