missing file
parent
fa1e1a4801
commit
989a330f67
|
@ -0,0 +1,97 @@
|
||||||
|
! Copyright (C) 2005 Slava Pestov.
|
||||||
|
! See http://factor.sf.net/license.txt for BSD license.
|
||||||
|
IN: compiler-frontend
|
||||||
|
USING: compiler-backend generic inference kernel math namespaces
|
||||||
|
sequences vectors words ;
|
||||||
|
|
||||||
|
: immediate? ( obj -- ? )
|
||||||
|
#! fixnums and f have a pointerless representation, and
|
||||||
|
#! are compiled immediately. Everything else can be moved
|
||||||
|
#! by GC, and is indexed through a table.
|
||||||
|
dup fixnum? swap f eq? or ;
|
||||||
|
|
||||||
|
GENERIC: load-value ( vreg n value -- )
|
||||||
|
|
||||||
|
M: object load-value ( vreg n value -- )
|
||||||
|
drop %peek-d , ;
|
||||||
|
|
||||||
|
: load-literal ( vreg obj -- )
|
||||||
|
dup immediate? [ %immediate ] [ %indirect ] ifte , ;
|
||||||
|
|
||||||
|
M: literal load-value ( vreg n value -- )
|
||||||
|
nip literal-value load-literal ;
|
||||||
|
|
||||||
|
SYMBOL: vreg-allocator
|
||||||
|
SYMBOL: live-d
|
||||||
|
SYMBOL: live-r
|
||||||
|
|
||||||
|
: value-dropped? ( value -- ? )
|
||||||
|
dup literal?
|
||||||
|
over live-d get member? not
|
||||||
|
rot live-r get member? not and
|
||||||
|
or ;
|
||||||
|
|
||||||
|
: stack>vreg ( value stack-pos loader -- )
|
||||||
|
pick >r vreg-allocator get r> set
|
||||||
|
pick value-dropped? [ pick get pick pick execute , ] unless
|
||||||
|
3drop vreg-allocator inc ; inline
|
||||||
|
|
||||||
|
: (stacks>vregs) ( stack loader -- )
|
||||||
|
swap reverse-slice dup length
|
||||||
|
[ pick stack>vreg ] 2each drop ; inline
|
||||||
|
|
||||||
|
: stacks>vregs ( #shuffle -- )
|
||||||
|
dup
|
||||||
|
node-in-d \ %peek-d (stacks>vregs)
|
||||||
|
node-in-r \ %peek-r (stacks>vregs) ;
|
||||||
|
|
||||||
|
: shuffle-height ( #shuffle -- )
|
||||||
|
dup node-out-d length over node-in-d length - %inc-d ,
|
||||||
|
dup node-out-r length swap node-in-r length - %inc-r , ;
|
||||||
|
|
||||||
|
: literal>stack ( stack-pos value storer -- )
|
||||||
|
>r literal-value r> fixnum-imm? pick immediate? and [
|
||||||
|
>r 0 swap load-literal 0 <vreg> r>
|
||||||
|
] unless swapd execute , ; inline
|
||||||
|
|
||||||
|
: computed>stack >r get <vreg> swap r> execute , ;
|
||||||
|
|
||||||
|
: vreg>stack ( stack-pos value storer -- )
|
||||||
|
@{
|
||||||
|
@{ [ over not ] [ 3drop ] }@
|
||||||
|
@{ [ over literal? ] [ literal>stack ] }@
|
||||||
|
@{ [ t ] [ computed>stack ] }@
|
||||||
|
}@ cond ; inline
|
||||||
|
|
||||||
|
: (vregs>stack) ( stack storer -- )
|
||||||
|
swap reverse-slice [ length ] keep
|
||||||
|
[ pick vreg>stack ] 2each drop ; inline
|
||||||
|
|
||||||
|
: (vregs>stacks) ( stack stack -- )
|
||||||
|
\ %replace-r (vregs>stack) \ %replace-d (vregs>stack) ;
|
||||||
|
|
||||||
|
: literals/computed ( stack -- literals computed )
|
||||||
|
dup [ dup literal? [ drop f ] unless ] map
|
||||||
|
swap [ dup literal? [ drop f ] when ] map ;
|
||||||
|
|
||||||
|
: vregs>stacks ( -- )
|
||||||
|
live-d get literals/computed
|
||||||
|
live-r get literals/computed
|
||||||
|
swapd (vregs>stacks) (vregs>stacks) ;
|
||||||
|
|
||||||
|
: ?nth ( n seq -- elt/f )
|
||||||
|
2dup length >= [ 2drop f ] [ nth ] ifte ;
|
||||||
|
|
||||||
|
: live-stores ( instack outstack -- stack )
|
||||||
|
#! Avoid storing a value into its former position.
|
||||||
|
dup length [ pick ?nth dupd eq? [ drop f ] when ] 2map nip ;
|
||||||
|
|
||||||
|
M: #shuffle linearize* ( #shuffle -- )
|
||||||
|
[
|
||||||
|
0 vreg-allocator set
|
||||||
|
dup node-in-d over node-out-d live-stores live-d set
|
||||||
|
dup node-in-r over node-out-r live-stores live-r set
|
||||||
|
dup stacks>vregs
|
||||||
|
dup shuffle-height
|
||||||
|
vregs>stacks
|
||||||
|
] with-scope linearize-next ;
|
|
@ -0,0 +1,51 @@
|
||||||
|
IN: inference
|
||||||
|
USING: generic interpreter kernel lists math namespaces
|
||||||
|
sequences words ;
|
||||||
|
|
||||||
|
: infer-shuffle-inputs ( shuffle node -- )
|
||||||
|
>r dup shuffle-in-d length swap shuffle-in-r length r>
|
||||||
|
node-inputs ;
|
||||||
|
|
||||||
|
: shuffle-stacks ( shuffle -- )
|
||||||
|
#! Shuffle simulated stacks.
|
||||||
|
meta-d get meta-r get rot shuffle meta-r set meta-d set ;
|
||||||
|
|
||||||
|
: infer-shuffle-outputs ( shuffle node -- )
|
||||||
|
>r dup shuffle-out-d length swap shuffle-out-r length r>
|
||||||
|
node-outputs ;
|
||||||
|
|
||||||
|
: infer-shuffle ( shuffle -- )
|
||||||
|
#shuffle
|
||||||
|
2dup infer-shuffle-inputs
|
||||||
|
over shuffle-stacks
|
||||||
|
tuck infer-shuffle-outputs
|
||||||
|
node, ;
|
||||||
|
|
||||||
|
: shuffle>effect ( shuffle -- effect )
|
||||||
|
dup shuffle-in-d [ drop object ] map
|
||||||
|
swap shuffle-out-d [ drop object ] map 2list ;
|
||||||
|
|
||||||
|
: define-shuffle ( word shuffle -- )
|
||||||
|
[ shuffle>effect "infer-effect" set-word-prop ] 2keep
|
||||||
|
[ , \ infer-shuffle , ] [ ] make "infer" set-word-prop ;
|
||||||
|
|
||||||
|
{
|
||||||
|
{ drop << shuffle f 1 0 { } { } >> }
|
||||||
|
{ 2drop << shuffle f 2 0 { } { } >> }
|
||||||
|
{ 3drop << shuffle f 3 0 { } { } >> }
|
||||||
|
{ dup << shuffle f 1 0 { 0 0 } { } >> }
|
||||||
|
{ 2dup << shuffle f 2 0 { 0 1 0 1 } { } >> }
|
||||||
|
{ 3dup << shuffle f 3 0 { 0 1 2 0 1 2 } { } >> }
|
||||||
|
{ rot << shuffle f 3 0 { 1 2 0 } { } >> }
|
||||||
|
{ -rot << shuffle f 3 0 { 2 0 1 } { } >> }
|
||||||
|
{ dupd << shuffle f 2 0 { 0 0 1 } { } >> }
|
||||||
|
{ swapd << shuffle f 3 0 { 1 0 2 } { } >> }
|
||||||
|
{ nip << shuffle f 2 0 { 1 } { } >> }
|
||||||
|
{ 2nip << shuffle f 3 0 { 2 } { } >> }
|
||||||
|
{ tuck << shuffle f 2 0 { 1 0 1 } { } >> }
|
||||||
|
{ over << shuffle f 2 0 { 0 1 0 } { } >> }
|
||||||
|
{ pick << shuffle f 3 0 { 0 1 2 0 } { } >> }
|
||||||
|
{ swap << shuffle f 2 0 { 1 0 } { } >> }
|
||||||
|
{ >r << shuffle f 1 0 { } { 0 } >> }
|
||||||
|
{ r> << shuffle f 0 1 { 0 } { } >> }
|
||||||
|
} [ first2 define-shuffle ] each
|
Loading…
Reference in New Issue