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-12-07 21:46:54 -05:00
|
|
|
: generate-slot ( size quot -- )
|
2005-12-09 00:02:41 -05:00
|
|
|
>r >r
|
2005-05-28 20:52:23 -04:00
|
|
|
! turn tagged fixnum slot # into an offset, multiple of 4
|
2005-12-07 21:46:54 -05:00
|
|
|
0 input-operand dup tag-bits r> - SRAWI
|
|
|
|
! compute slot address
|
|
|
|
0 output-operand dup 0 input-operand ADD
|
|
|
|
! load slot value
|
|
|
|
0 output-operand dup r> call ; inline
|
2005-11-13 22:04:14 -05:00
|
|
|
|
|
|
|
M: %slot generate-node ( vop -- )
|
2005-12-09 00:02:41 -05:00
|
|
|
drop cell log2 [ 0 LWZ ] generate-slot ;
|
2005-05-28 20:52:23 -04:00
|
|
|
|
|
|
|
M: %fast-slot generate-node ( vop -- )
|
2005-12-07 21:46:54 -05:00
|
|
|
drop 0 output-operand dup 0 input LWZ ;
|
2005-05-28 20:52:23 -04:00
|
|
|
|
2005-12-07 21:46:54 -05:00
|
|
|
: generate-set-slot ( size quot -- )
|
|
|
|
>r >r
|
2005-05-30 00:21:17 -04:00
|
|
|
! turn tagged fixnum slot # into an offset, multiple of 4
|
2005-12-07 21:46:54 -05:00
|
|
|
2 input-operand dup tag-bits r> - SRAWI
|
|
|
|
! compute slot address in 1st input
|
|
|
|
2 input-operand dup 1 input-operand ADD
|
2005-05-30 00:21:17 -04:00
|
|
|
! store new slot value
|
2005-12-09 00:02:41 -05:00
|
|
|
0 input-operand 2 input-operand r> call ; inline
|
2005-11-13 22:04:14 -05:00
|
|
|
|
|
|
|
M: %set-slot generate-node ( vop -- )
|
2005-12-07 21:46:54 -05:00
|
|
|
drop cell log2 [ 0 STW ] generate-set-slot ;
|
2005-05-30 00:21:17 -04:00
|
|
|
|
|
|
|
M: %fast-set-slot generate-node ( vop -- )
|
2005-12-07 21:46:54 -05:00
|
|
|
drop 0 input-operand 1 input-operand 2 input STW ;
|
2005-06-04 02:20:54 -04:00
|
|
|
|
|
|
|
M: %write-barrier generate-node ( vop -- )
|
|
|
|
#! Mark the card pointed to by vreg.
|
2005-12-07 21:46:54 -05:00
|
|
|
drop
|
2005-12-09 00:02:41 -05:00
|
|
|
0 input-operand dup card-bits SRAWI
|
2005-12-07 21:46:54 -05:00
|
|
|
0 input-operand dup 16 ADD
|
|
|
|
0 scratch 0 input-operand 0 LBZ
|
|
|
|
0 scratch dup card-mark ORI
|
|
|
|
0 scratch 0 input-operand 0 STB ;
|
2005-05-30 00:21:17 -04:00
|
|
|
|
2005-11-13 22:04:14 -05:00
|
|
|
: string-offset cell 3 * object-tag - ;
|
|
|
|
|
|
|
|
M: %char-slot generate-node ( vop -- )
|
2005-12-07 21:46:54 -05:00
|
|
|
drop 1 [ string-offset LHZ ] generate-slot
|
|
|
|
0 output-operand dup tag-fixnum ;
|
2005-11-13 22:04:14 -05:00
|
|
|
|
|
|
|
M: %set-char-slot generate-node ( vop -- )
|
2005-12-07 21:46:54 -05:00
|
|
|
! untag the new value in 0th input
|
|
|
|
drop 0 input-operand dup untag-fixnum
|
2005-11-13 22:04:14 -05:00
|
|
|
1 [ string-offset STH ] generate-set-slot ;
|
|
|
|
|
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-12-11 15:14:41 -05:00
|
|
|
"userenv" f dlsym swap LOAD32 rel-2/2 rel-userenv ;
|
2005-05-24 19:59:21 -04:00
|
|
|
|
|
|
|
M: %getenv generate-node ( vop -- )
|
2005-12-07 21:46:54 -05:00
|
|
|
drop 0 output-operand dup dup userenv 0 input cell * LWZ ;
|
2005-05-24 19:59:21 -04:00
|
|
|
|
|
|
|
M: %setenv generate-node ( vop -- )
|
2005-12-07 21:46:54 -05:00
|
|
|
drop 0 scratch userenv
|
|
|
|
0 input-operand 0 scratch 1 input cell * STW ;
|