2005-05-24 19:59:21 -04:00
|
|
|
! Copyright (C) 2005 Slava Pestov.
|
|
|
|
! See http://factor.sf.net/license.txt for BSD license.
|
|
|
|
IN: compiler-backend
|
|
|
|
USING: alien assembler compiler inference kernel
|
|
|
|
kernel-internals lists math memory namespaces sequences words ;
|
|
|
|
|
2005-05-28 20:52:23 -04:00
|
|
|
M: %slot generate-node ( vop -- )
|
|
|
|
dest/src
|
|
|
|
! turn tagged fixnum slot # into an offset, multiple of 4
|
|
|
|
dup dup 1 SRAWI
|
2005-09-08 22:23:54 -04:00
|
|
|
! compute slot address in 0 vop-out
|
2005-05-28 20:52:23 -04:00
|
|
|
>r dup dup r> ADD
|
2005-09-08 22:23:54 -04:00
|
|
|
! load slot value in 0 vop-out
|
2005-05-28 20:52:23 -04:00
|
|
|
dup 0 LWZ ;
|
|
|
|
|
|
|
|
M: %fast-slot generate-node ( vop -- )
|
2005-09-08 22:23:54 -04:00
|
|
|
dup 0 vop-out v>operand dup rot 0 vop-in LWZ ;
|
2005-05-28 20:52:23 -04:00
|
|
|
|
2005-05-30 00:21:17 -04:00
|
|
|
M: %set-slot generate-node ( vop -- )
|
2005-09-08 22:23:54 -04:00
|
|
|
dup 2 vop-in v>operand over 1 vop-in v>operand
|
2005-05-30 00:21:17 -04:00
|
|
|
! turn tagged fixnum slot # into an offset, multiple of 4
|
|
|
|
over dup 1 SRAWI
|
2005-09-08 22:23:54 -04:00
|
|
|
! compute slot address in 1 vop-in
|
2005-06-04 02:20:54 -04:00
|
|
|
over dup rot ADD
|
2005-05-30 00:21:17 -04:00
|
|
|
! store new slot value
|
2005-09-08 22:23:54 -04:00
|
|
|
>r 0 vop-in v>operand r> 0 STW ;
|
2005-05-30 00:21:17 -04:00
|
|
|
|
|
|
|
M: %fast-set-slot generate-node ( vop -- )
|
2005-09-08 22:23:54 -04:00
|
|
|
[ 0 vop-in v>operand ] keep
|
|
|
|
[ 1 vop-in v>operand ] keep
|
|
|
|
2 vop-in STW ;
|
2005-06-04 02:20:54 -04:00
|
|
|
|
|
|
|
M: %write-barrier generate-node ( vop -- )
|
|
|
|
#! Mark the card pointed to by vreg.
|
2005-09-04 20:23:18 -04:00
|
|
|
#! Uses r6 for storage.
|
2005-09-08 22:23:54 -04:00
|
|
|
0 vop-in v>operand
|
2005-06-04 02:20:54 -04:00
|
|
|
dup dup card-bits SRAWI
|
|
|
|
dup dup 16 ADD
|
2005-09-04 20:23:18 -04:00
|
|
|
6 over 0 LBZ
|
|
|
|
6 6 card-mark ORI
|
|
|
|
6 swap 0 STB ;
|
2005-05-30 00:21:17 -04:00
|
|
|
|
2005-05-28 20:52:23 -04:00
|
|
|
: userenv ( reg -- )
|
2005-05-24 19:59:21 -04:00
|
|
|
#! Load the userenv pointer in a virtual register.
|
2005-05-28 20:52:23 -04:00
|
|
|
"userenv" f dlsym swap LOAD32 0 1 rel-userenv ;
|
2005-05-24 19:59:21 -04:00
|
|
|
|
|
|
|
M: %getenv generate-node ( vop -- )
|
2005-09-08 22:23:54 -04:00
|
|
|
dup 0 vop-out v>operand dup userenv
|
|
|
|
dup rot 0 vop-in cell * LWZ ;
|
2005-05-24 19:59:21 -04:00
|
|
|
|
|
|
|
M: %setenv generate-node ( vop -- )
|
2005-05-28 20:52:23 -04:00
|
|
|
! bad! need to formalize scratch register usage
|
|
|
|
4 <vreg> v>operand dup userenv >r
|
2005-09-08 22:23:54 -04:00
|
|
|
dup 0 vop-in v>operand r> rot 1 vop-in cell * STW ;
|