added code to pass vm ptr to some unboxers

db4
Phil Dawes 2009-08-21 21:24:53 +01:00
parent c5119218c5
commit ff54a57eb3
9 changed files with 36 additions and 27 deletions

View File

@ -298,7 +298,7 @@ M: object %prepare-var-args ;
HOOK: %alien-invoke cpu ( function library -- ) HOOK: %alien-invoke cpu ( function library -- )
HOOK: %vm-invoke cpu ( function library -- ) HOOK: %vm-invoke cpu ( function -- )
HOOK: %cleanup cpu ( params -- ) HOOK: %cleanup cpu ( params -- )

View File

@ -47,10 +47,10 @@ 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 M: x86.32 %vm-invoke ( function -- )
temp-reg 0 MOV rc-absolute-cell rt-vm rel-fixup ! push the vm ptr as the 3rd argument temp-reg 0 MOV rc-absolute-cell rt-vm rel-fixup ! push the vm ptr as an argument
temp-reg PUSH temp-reg PUSH
%alien-invoke f %alien-invoke
temp-reg POP ; temp-reg POP ;
M: x86.32 return-struct-in-registers? ( c-type -- ? ) M: x86.32 return-struct-in-registers? ( c-type -- ? )
@ -163,7 +163,10 @@ M: x86.32 %prepare-unbox ( -- )
ESI 4 SUB ; ESI 4 SUB ;
: call-unbox-func ( func -- ) : call-unbox-func ( func -- )
4 [ 8 [
! push vm ptr
temp-reg 0 MOV rc-absolute-cell rt-vm rel-fixup ! push the vm ptr as an argument
temp-reg PUSH
! Push parameter ! Push parameter
EAX PUSH EAX PUSH
! Call the unboxer ! Call the unboxer

View File

@ -172,7 +172,7 @@ 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 %vm-invoke ( function -- ) f %alien-invoke ;
M: x86.64 %prepare-alien-indirect ( -- ) M: x86.64 %prepare-alien-indirect ( -- )
"unbox_alien" f %alien-invoke "unbox_alien" f %alien-invoke

View File

@ -615,7 +615,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 %vm-invoke ; "inline_gc" %vm-invoke ;
M: x86 %alien-global ( dst symbol library -- ) M: x86 %alien-global ( dst symbol library -- )
[ 0 MOV ] 2dip rc-absolute-cell rel-dlsym ; [ 0 MOV ] 2dip rc-absolute-cell rel-dlsym ;

View File

@ -108,7 +108,7 @@ void *alien_pointer()
PRIMITIVE(set_alien_##name) \ PRIMITIVE(set_alien_##name) \
{ \ { \
type *ptr = (type *)PRIMITIVE_GETVM()->alien_pointer(); \ type *ptr = (type *)PRIMITIVE_GETVM()->alien_pointer(); \
type value = to(dpop()); \ type value = PRIMITIVE_GETVM()->to(dpop()); \
*ptr = value; \ *ptr = value; \
} }
@ -124,7 +124,7 @@ DEFINE_ALIEN_ACCESSOR(signed_1,s8,box_signed_1,to_fixnum)
DEFINE_ALIEN_ACCESSOR(unsigned_1,u8,box_unsigned_1,to_cell) DEFINE_ALIEN_ACCESSOR(unsigned_1,u8,box_unsigned_1,to_cell)
DEFINE_ALIEN_ACCESSOR(float,float,box_float,to_float) DEFINE_ALIEN_ACCESSOR(float,float,box_float,to_float)
DEFINE_ALIEN_ACCESSOR(double,double,box_double,to_double) DEFINE_ALIEN_ACCESSOR(double,double,box_double,to_double)
DEFINE_ALIEN_ACCESSOR(cell,void *,box_alien,PRIMITIVE_GETVM()->pinned_alien_offset) DEFINE_ALIEN_ACCESSOR(cell,void *,box_alien,pinned_alien_offset)
/* open a native library and push a handle */ /* open a native library and push a handle */
inline void factorvm::vmprim_dlopen() inline void factorvm::vmprim_dlopen()

View File

@ -9,4 +9,6 @@ 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 #undef VM_PTR
#define VM_PTR myvm #define VM_PTR myvm
#undef ASSERTVM
#define ASSERTVM() assert(vm==myvm)
} }

View File

@ -618,9 +618,9 @@ fixnum factorvm::to_fixnum(cell tagged)
} }
} }
VM_C_API fixnum to_fixnum(cell tagged) VM_C_API fixnum to_fixnum(cell tagged,factorvm *myvm)
{ {
return vm->to_fixnum(tagged); return VM_PTR->to_fixnum(tagged);
} }
cell factorvm::to_cell(cell tagged) cell factorvm::to_cell(cell tagged)
@ -628,9 +628,9 @@ cell factorvm::to_cell(cell tagged)
return (cell)to_fixnum(tagged); return (cell)to_fixnum(tagged);
} }
VM_C_API cell to_cell(cell tagged) VM_C_API cell to_cell(cell tagged, factorvm *myvm)
{ {
return vm->to_cell(tagged); return VM_PTR->to_cell(tagged);
} }
void factorvm::box_signed_1(s8 n) void factorvm::box_signed_1(s8 n)
@ -740,9 +740,10 @@ s64 factorvm::to_signed_8(cell obj)
} }
} }
VM_C_API s64 to_signed_8(cell obj) VM_C_API s64 to_signed_8(cell obj,factorvm *myvm)
{ {
return vm->to_signed_8(obj); ASSERTVM();
return VM_PTR->to_signed_8(obj);
} }
void factorvm::box_unsigned_8(u64 n) void factorvm::box_unsigned_8(u64 n)
@ -772,9 +773,10 @@ u64 factorvm::to_unsigned_8(cell obj)
} }
} }
VM_C_API u64 to_unsigned_8(cell obj) VM_C_API u64 to_unsigned_8(cell obj,factorvm *myvm)
{ {
return vm->to_unsigned_8(obj); ASSERTVM();
return VM_PTR->to_unsigned_8(obj);
} }
void factorvm::box_float(float flo) void factorvm::box_float(float flo)
@ -792,9 +794,9 @@ float factorvm::to_float(cell value)
return untag_float_check(value); return untag_float_check(value);
} }
VM_C_API float to_float(cell value) VM_C_API float to_float(cell value,factorvm *myvm)
{ {
return vm->to_float(value); return VM_PTR->to_float(value);
} }
void factorvm::box_double(double flo) void factorvm::box_double(double flo)
@ -812,9 +814,9 @@ double factorvm::to_double(cell value)
return untag_float_check(value); return untag_float_check(value);
} }
VM_C_API double to_double(cell value) VM_C_API double to_double(cell value,factorvm *myvm)
{ {
return vm->to_double(value); return VM_PTR->to_double(value);
} }
/* The fixnum+, fixnum- and fixnum* primitives are defined in cpu_*.S. On /* The fixnum+, fixnum- and fixnum* primitives are defined in cpu_*.S. On

View File

@ -61,9 +61,9 @@ PRIMITIVE(double_bits);
PRIMITIVE(bits_double); PRIMITIVE(bits_double);
VM_C_API void box_float(float flo); VM_C_API void box_float(float flo);
VM_C_API float to_float(cell value); VM_C_API float to_float(cell value, factorvm *vm);
VM_C_API void box_double(double flo); VM_C_API void box_double(double flo);
VM_C_API double to_double(cell value); VM_C_API double to_double(cell value, factorvm *vm);
VM_C_API void box_signed_1(s8 n); VM_C_API void box_signed_1(s8 n);
VM_C_API void box_unsigned_1(u8 n); VM_C_API void box_unsigned_1(u8 n);
@ -76,11 +76,11 @@ VM_C_API void box_unsigned_cell(cell cell);
VM_C_API void box_signed_8(s64 n); VM_C_API void box_signed_8(s64 n);
VM_C_API void box_unsigned_8(u64 n); VM_C_API void box_unsigned_8(u64 n);
VM_C_API s64 to_signed_8(cell obj); VM_C_API s64 to_signed_8(cell obj, factorvm *vm);
VM_C_API u64 to_unsigned_8(cell obj); VM_C_API u64 to_unsigned_8(cell obj, factorvm *vm);
VM_C_API fixnum to_fixnum(cell tagged); VM_C_API fixnum to_fixnum(cell tagged, factorvm *vm);
VM_C_API cell to_cell(cell tagged); VM_C_API cell to_cell(cell tagged, factorvm *vm);
VM_ASM_API void overflow_fixnum_add(fixnum x, fixnum y); VM_ASM_API void overflow_fixnum_add(fixnum x, fixnum y);
VM_ASM_API void overflow_fixnum_subtract(fixnum x, fixnum y); VM_ASM_API void overflow_fixnum_subtract(fixnum x, fixnum y);

View File

@ -12,4 +12,6 @@ namespace factor
#endif #endif
extern const primitive_type primitives[]; extern const primitive_type primitives[];
#define VM_PTR vm
#define ASSERTVM()
} }