factor/library/compiler/generator.factor

70 lines
1.7 KiB
Factor
Raw Normal View History

! Copyright (C) 2004, 2005 Slava Pestov.
! See http://factor.sf.net/license.txt for BSD license.
IN: compiler
USING: alien assembler errors inference kernel
2005-12-02 02:25:44 -05:00
kernel-internals lists math 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
[ dup [ generate-node ] with-vop ] each
2004-12-25 02:55:03 -05:00
compile-aligned
compiled-offset r> - ;
: generate-reloc ( -- length )
relocation-table get
2005-12-04 02:30:19 -05:00
dup [ assemble-cell ] each
length cells ;
2004-12-25 02:55:03 -05:00
2004-12-25 15:52:08 -05:00
: (generate) ( word linear -- )
#! Compile a word definition from linear IR.
V{ } 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
] [
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-12-10 01:02:13 -05:00
M: %target-label generate-node ( vop -- )
drop label 0 assemble-cell absolute-cell ;
2006-02-13 22:50:26 -05:00
M: %cleanup generate-node ( vop -- ) drop ;
M: %freg>stack generate-node ( vop -- ) drop ;
M: %stack>freg generate-node ( vop -- ) drop ;
2005-12-24 16:08:15 -05:00
M: %alien-invoke generate-node
#! call a C function.
2006-02-11 02:30:18 -05:00
drop 0 input 1 input compile-c-call ;
2005-12-24 16:08:15 -05:00
2005-12-06 20:42:17 -05:00
: dest/src ( -- dest src ) 0 output-operand 0 input-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
2006-01-31 21:31:53 -05:00
: string-offset 3 cells object-tag - ;