<magnus--> http://www.caddr.com/macho/archives/sbcl-devel/2005-3/4764.html\r
<magnus--> http://clozure.com/cgi-bin/viewcvs.cgi/ccl/lisp-kernel/lisp-exceptions.c?rev=1.9&content-type=text/vnd.viewcvs-markup\r
\r
+- alien-global type wrong\r
- simplifier:\r
- dead loads not optimized out\r
- kill tag-fixnum/untag-fixnum\r
\ alien-invoke [ infer-alien-invoke ] "infer" set-word-prop
+: alien-global ( type library name -- value )
+ #! Fetch the value of C global variable.
+ #! 'type' is a type spec. 'library' is an entry in the
+ #! "libraries" namespace.
+ <alien-error> throw ;
+
+: alien-global-node ( type name library -- )
+ 2dup ensure-dlsym
+ cons \ alien-global dataflow,
+ set-alien-returns ;
+
+: infer-alien-global ( -- )
+ \ alien-global "infer-effect" word-prop car ensure-d
+ pop-literal
+ pop-literal
+ pop-literal -rot
+ alien-global-node ;
+
+: linearize-alien-global ( node -- )
+ dup [ node-param get ] bind %alien-global ,
+ linearize-returns ;
+
+\ alien-global [ linearize-alien-global ] "linearizer" set-word-prop
+
+\ alien-global [ [ string string string ] [ object ] ] "infer-effect" set-word-prop
+
+\ alien-global [ infer-alien-global ] "infer" set-word-prop
+
global [
"libraries" get [ <namespace> "libraries" set ] unless
] bind
] ifte out-1
] "linearizer" set-word-prop
-! \ set-slot intrinsic
-!
-! \ set-slot [
-! dup typed-literal? [
-! 1 %dec-d ,
-! in-2
-! 2 %dec-d ,
-! slot@ >r 0 1 r> %fast-set-slot ,
-! ] [
-! drop
-! in-3
-! 3 %dec-d ,
-! 1 %untag ,
-! 0 1 2 %set-slot ,
-! ] ifte
-! ] "linearizer" set-word-prop
+\ set-slot intrinsic
+
+\ set-slot [
+ dup typed-literal? [
+ 1 %dec-d ,
+ in-2
+ 2 %dec-d ,
+ slot@ >r 0 1 r> %fast-set-slot ,
+ ] [
+ drop
+ in-3
+ 3 %dec-d ,
+ 1 %untag ,
+ 0 1 2 %set-slot ,
+ ] ifte
+] "linearizer" set-word-prop
\ type intrinsic
out-1
] "linearizer" set-word-prop
+\ getenv intrinsic
+
+\ getenv [
+ 1 %dec-d ,
+ node-peek literal-value 0 <vreg> swap %getenv ,
+ 1 %inc-d ,
+ out-1
+] "linearizer" set-word-prop
+
+\ setenv intrinsic
+
+\ setenv [
+ 1 %dec-d ,
+ in-1
+ node-peek literal-value 0 <vreg> swap %setenv ,
+ 1 %dec-d ,
+] "linearizer" set-word-prop
+
: binary-op-reg ( op out -- )
>r in-2
1 %dec-d ,
over [ 2drop ] [ 2 rel-type, relocating 0 rel, ] ifte ;
: rel-word ( word rel/abs 16/16 -- )
- #! If flag is true; relative.
- over primitive? [ rel-primitive ] [ nip rel-address ] ifte ;
+ pick primitive? [
+ rel-primitive
+ ] [
+ rot drop rel-address
+ ] ifte ;
: dest-vop ( dest) f swap f f ;
: src/dest-vop ( src dest) f f ;
: literal-vop ( literal) >r f f r> f ;
+: src/literal-vop ( src literal) f swap f ;
+: dest/literal-vop ( dest literal) >r f swap r> f ;
! miscellanea
VOP: %prologue
: check-dest ( vop reg -- )
swap vop-dest = [ "invalid VOP destination" throw ] unless ;
+VOP: %getenv
+: %getenv dest/literal-vop <%getenv> ;
+
+VOP: %setenv
+: %setenv src/literal-vop <%setenv> ;
+
! alien operations
VOP: %parameters
: %parameters ( n -- vop ) literal-vop <%parameters> ;
VOP: %alien-invoke
: %alien-invoke ( func -- vop ) literal-vop <%alien-invoke> ;
+
+VOP: %alien-global
+: %alien-global ( global -- vop ) literal-vop <%alien-global> ;
! Copyright (C) 2005 Slava Pestov.
! See http://factor.sf.net/license.txt for BSD license.
IN: compiler-backend
-USING: alien assembler inference kernel kernel-internals lists
-math memory namespaces words ;
+USING: alien assembler compiler inference kernel
+kernel-internals lists math memory namespaces words ;
M: %alien-invoke generate-node
#! call a C function.
vop-literal uncons load-library compile-c-call ;
+M: %alien-global generate-node
+ vop-literal uncons load-library
+ 2dup dlsym EAX swap unit MOV 0 0 rel-dlsym ;
+
M: %parameters generate-node
#! x86 does not pass parameters in registers
drop ;
dup vop-literal swap vop-dest v>operand tuck >r 2list r>
swap MOV ;
-! : card-bits 5 ;
-!
-! : card-offset ( -- n )
-! #! We add this to an address that was shifted by card-bits
-! #! to get the address of its card.
-!
-! ;
-!
-! : write-barrier ( vreg -- )
-! #! Mark the card pointed to by vreg.
-!
-! ;
+: card-bits
+ #! must be the same as CARD_BITS in native/cards.h.
+ 7 ;
+
+: card-offset 1 getenv ;
+: card-mark HEX: 80 ;
+
+: write-barrier ( reg -- )
+ #! Mark the card pointed to by vreg.
+ dup card-bits SHR
+ card-offset 2list card-mark OR ;
M: %set-slot generate-node ( vop -- )
#! the untagged object is in vop-dest, the new value is in
dup vop-literal v>operand over vop-dest v>operand
! turn tagged fixnum slot # into an offset, multiple of 4
over 1 SHR
- ! compute slot address in vop-dest
- dupd ADD
+ ! compute slot address in vop-literal
+ 2dup ADD
! store new slot value
- >r vop-source v>operand r> unit swap MOV ;
+ >r >r vop-source v>operand r> unit swap MOV r>
+ write-barrier ;
M: %fast-set-slot generate-node ( vop -- )
#! the tagged object is in vop-dest, the new value is in
#! vop-source, the pointer offset is in vop-literal. the
#! offset already takes the type tag into account, so its
#! just one instruction to load.
- dup vop-literal over vop-dest v>operand swap 2list
- swap vop-source v>operand MOV ;
+ dup vop-literal over vop-dest v>operand
+ [ swap 2list swap vop-source v>operand MOV ] keep
+ write-barrier ;
+
+: userenv@ ( n -- addr )
+ cell * "userenv" f dlsym + ;
+
+M: %getenv generate-node ( vop -- )
+ dup vop-dest v>operand swap vop-literal userenv@ unit MOV ;
+
+M: %setenv generate-node ( vop -- )
+ dup vop-literal userenv@ unit swap vop-source v>operand MOV ;
CELL young_size, CELL aging_size,
CELL code_size, CELL literal_size)
{
- srand((unsigned)time(NULL)); /* initialize random number generator */
+ /* initialize random number generator */
+ srand((unsigned)time(NULL));
init_ffi();
init_arena(young_size,aging_size);
init_compiler(code_size);
userenv[CPU_ENV] = tag_object(from_c_string(FACTOR_CPU_STRING));
userenv[OS_ENV] = tag_object(from_c_string(FACTOR_OS_STRING));
userenv[GEN_ENV] = tag_fixnum(GC_GENERATIONS);
+ userenv[CARD_OFF_ENV] = tag_cell((CELL)cards - (heap_start >> CARD_BITS));
}
INLINE bool factor_arg(const char* str, const char* arg, CELL* value)
#define USER_ENV 16
+#define CARD_OFF_ENV 1 /* for compiling set-slot */
+#define UNUSED_ENV 2
#define NAMESTACK_ENV 3 /* used by library only */
#define GLOBAL_ENV 4
#define BREAK_ENV 5
#define GEN_ENV 15 /* set to GC_GENERATIONS constant */
/* TAGGED user environment data; see getenv/setenv prims */
-CELL userenv[USER_ENV];
+DLLEXPORT CELL userenv[USER_ENV];
/* Profiling timer */
#ifndef WIN32