2005-02-22 23:07:47 -05:00
|
|
|
! Copyright (C) 2004, 2005 Slava Pestov.
|
|
|
|
! See http://factor.sf.net/license.txt for BSD license.
|
2005-05-09 02:34:15 -04:00
|
|
|
IN: compiler-backend
|
|
|
|
USING: assembler compiler errors inference kernel lists math
|
2005-09-03 18:34:50 -04:00
|
|
|
memory namespaces sequences strings vectors words ;
|
2005-05-09 02:34:15 -04:00
|
|
|
|
|
|
|
! Compile a VOP.
|
|
|
|
GENERIC: generate-node ( vop -- )
|
2004-12-25 02:55:03 -05:00
|
|
|
|
|
|
|
: generate-code ( word linear -- length )
|
|
|
|
compiled-offset >r
|
|
|
|
compile-aligned
|
|
|
|
swap save-xt
|
2005-09-09 00:17:19 -04:00
|
|
|
[ [ generate-node ] each ] each
|
2004-12-25 02:55:03 -05:00
|
|
|
compile-aligned
|
|
|
|
compiled-offset r> - ;
|
|
|
|
|
|
|
|
: generate-reloc ( -- length )
|
|
|
|
relocation-table get
|
2005-05-14 17:18:45 -04:00
|
|
|
dup [ compile-cell ] each
|
2005-04-26 00:35:55 -04:00
|
|
|
length cell * ;
|
2004-12-25 02:55:03 -05:00
|
|
|
|
2004-12-25 15:52:08 -05:00
|
|
|
: (generate) ( word linear -- )
|
2004-12-01 19:48:08 -05:00
|
|
|
#! Compile a word definition from linear IR.
|
2005-09-11 21:18:19 -04:00
|
|
|
{ } clone relocation-table set
|
2004-12-25 02:55:03 -05:00
|
|
|
begin-assembly swap >r >r
|
|
|
|
generate-code
|
|
|
|
generate-reloc
|
|
|
|
r> set-compiled-cell
|
|
|
|
r> set-compiled-cell ;
|
2004-12-04 23:45:41 -05:00
|
|
|
|
2004-12-25 15:52:08 -05:00
|
|
|
SYMBOL: previous-offset
|
|
|
|
|
|
|
|
: generate ( word linear -- )
|
|
|
|
#! If generation fails, reset compiled offset.
|
|
|
|
[
|
|
|
|
compiled-offset previous-offset set
|
|
|
|
(generate)
|
2005-09-21 01:12:16 -04:00
|
|
|
] [
|
2005-09-20 20:18:01 -04:00
|
|
|
previous-offset get set-compiled-offset
|
|
|
|
rethrow
|
2005-09-21 01:12:16 -04:00
|
|
|
] recover ;
|
2004-12-25 15:52:08 -05:00
|
|
|
|
2005-05-06 18:33:40 -04:00
|
|
|
! A few VOPs have trivial generators.
|
2004-12-31 02:17:45 -05:00
|
|
|
|
2005-05-06 18:33:40 -04:00
|
|
|
M: %label generate-node ( vop -- )
|
|
|
|
vop-label save-xt ;
|
2005-01-17 15:33:12 -05:00
|
|
|
|
2005-05-06 18:33:40 -04:00
|
|
|
M: %end-dispatch generate-node ( vop -- ) drop ;
|
2005-03-15 22:23:52 -05:00
|
|
|
|
2005-03-19 21:23:21 -05:00
|
|
|
: compile-target ( word -- ) 0 compile-cell absolute ;
|
|
|
|
|
2005-05-06 18:33:40 -04:00
|
|
|
M: %target-label generate-node vop-label compile-target ;
|
2005-03-19 21:23:21 -05:00
|
|
|
|
2005-05-06 18:33:40 -04:00
|
|
|
M: %target generate-node
|
|
|
|
vop-label dup postpone-word compile-target ;
|
2005-05-28 20:52:23 -04:00
|
|
|
|
|
|
|
GENERIC: v>operand
|
|
|
|
|
2005-09-03 18:34:50 -04:00
|
|
|
M: integer v>operand tag-bits shift ;
|
|
|
|
|
|
|
|
M: f v>operand address ;
|
|
|
|
|
2005-05-28 20:52:23 -04:00
|
|
|
: dest/src ( vop -- dest src )
|
2005-09-08 22:23:54 -04:00
|
|
|
dup 0 vop-out v>operand swap 0 vop-in v>operand ;
|
2005-05-30 00:21:17 -04:00
|
|
|
|
|
|
|
! These constants must match native/card.h
|
|
|
|
: card-bits 7 ;
|
|
|
|
: card-mark HEX: 80 ;
|
2005-06-07 03:44:34 -04:00
|
|
|
|
|
|
|
: shift-add ( by -- n )
|
|
|
|
#! Used in fixnum-shift overflow check.
|
2005-09-16 22:47:28 -04:00
|
|
|
1 swap cell 8 * swap 1- - shift ;
|