2010-05-09 21:36:52 -04:00
|
|
|
! Copyright (C) 2009, 2010 Slava Pestov.
|
2009-07-23 21:54:38 -04:00
|
|
|
! See http://factorcode.org/license.txt for BSD license.
|
2014-12-13 19:10:21 -05:00
|
|
|
USING: accessors arrays compiler.cfg compiler.cfg.instructions
|
2016-09-05 06:12:01 -04:00
|
|
|
compiler.cfg.registers compiler.cfg.stacks.local
|
|
|
|
compiler.cfg.utilities kernel make math namespaces sequences ;
|
2009-07-23 21:54:38 -04:00
|
|
|
IN: compiler.cfg.builder.blocks
|
2016-03-16 09:08:49 -04:00
|
|
|
SLOT: in-d
|
|
|
|
SLOT: out-d
|
2009-07-23 21:54:38 -04:00
|
|
|
|
|
|
|
: set-basic-block ( basic-block -- )
|
2016-03-16 06:48:31 -04:00
|
|
|
dup begin-local-analysis instructions>> building set ;
|
2009-07-23 21:54:38 -04:00
|
|
|
|
2015-11-18 18:53:46 -05:00
|
|
|
: end-basic-block ( block -- )
|
2016-04-30 03:27:27 -04:00
|
|
|
end-local-analysis building off ;
|
2009-07-23 21:54:38 -04:00
|
|
|
|
2016-03-06 22:42:28 -05:00
|
|
|
: (begin-basic-block) ( block -- block' )
|
2016-04-30 03:27:27 -04:00
|
|
|
<basic-block> dup set-basic-block [ connect-bbs ] keep ;
|
2009-07-23 21:54:38 -04:00
|
|
|
|
2016-03-06 22:42:28 -05:00
|
|
|
: begin-basic-block ( block -- block' )
|
2016-03-16 06:48:31 -04:00
|
|
|
dup end-basic-block (begin-basic-block) ;
|
2009-07-23 21:54:38 -04:00
|
|
|
|
2016-03-07 00:40:27 -05:00
|
|
|
: emit-trivial-block ( block quot: ( ..a block' -- ..b ) -- block' )
|
|
|
|
##branch, swap begin-basic-block
|
2016-03-06 22:42:28 -05:00
|
|
|
[ swap call ] keep
|
2016-03-07 00:40:27 -05:00
|
|
|
##branch, begin-basic-block ; inline
|
2009-07-23 21:54:38 -04:00
|
|
|
|
|
|
|
: call-height ( #call -- n )
|
|
|
|
[ out-d>> length ] [ in-d>> length ] bi - ;
|
|
|
|
|
2015-11-21 19:06:11 -05:00
|
|
|
: emit-call-block ( word height block -- )
|
2016-09-05 06:12:01 -04:00
|
|
|
t swap kill-block?<<
|
|
|
|
<ds-loc> inc-stack ##call, ;
|
2015-05-07 07:34:48 -04:00
|
|
|
|
2016-03-08 08:38:48 -05:00
|
|
|
: emit-trivial-call ( block word height -- block' )
|
|
|
|
rot [ emit-call-block ] emit-trivial-block ;
|
|
|
|
|
|
|
|
: emit-primitive ( block #call -- block' )
|
|
|
|
[ word>> ] [ call-height ] bi emit-trivial-call ;
|
2009-07-23 21:54:38 -04:00
|
|
|
|
2016-03-06 22:42:28 -05:00
|
|
|
: begin-branch ( block -- block' )
|
2016-09-06 09:44:07 -04:00
|
|
|
height-state [ clone ] change (begin-basic-block) ;
|
2009-07-23 21:54:38 -04:00
|
|
|
|
2016-05-24 11:22:38 -04:00
|
|
|
: end-branch ( block/f -- pair/f )
|
2015-11-18 18:53:46 -05:00
|
|
|
dup [
|
2011-11-11 22:48:38 -05:00
|
|
|
##branch,
|
2009-07-23 21:54:38 -04:00
|
|
|
end-local-analysis
|
2016-09-06 09:44:07 -04:00
|
|
|
height-state get clone 2array
|
2015-03-31 19:34:56 -04:00
|
|
|
] when* ;
|
2009-07-23 21:54:38 -04:00
|
|
|
|
2016-03-07 00:40:27 -05:00
|
|
|
: with-branch ( block quot: ( ..a block -- ..b block' ) -- pair/f )
|
|
|
|
[ [ begin-branch ] dip call end-branch ] with-scope ; inline
|
2009-07-23 21:54:38 -04:00
|
|
|
|
2016-03-16 06:48:31 -04:00
|
|
|
: emit-conditional ( block branches -- block'/f )
|
2016-03-06 22:42:28 -05:00
|
|
|
swap end-basic-block
|
|
|
|
sift [ f ] [
|
2015-03-15 19:14:41 -04:00
|
|
|
dup first second height-state set
|
2016-03-06 22:42:28 -05:00
|
|
|
[ first ] map
|
2016-04-30 03:27:27 -04:00
|
|
|
<basic-block> dup set-basic-block
|
2016-03-06 22:42:28 -05:00
|
|
|
[ connect-Nto1-bbs ] keep
|
|
|
|
] if-empty ;
|