compiler.cfg.linear-scan: cleanups

db4
Slava Pestov 2010-04-28 03:35:46 -04:00
parent d23bb19b55
commit 43fc230c69
11 changed files with 128 additions and 80 deletions

View File

@ -39,7 +39,7 @@ M: insn compute-stack-frame*
] when ;
! PowerPC backend sets frame-required? for ##integer>float!
\ _spill t frame-required? set-word-prop
\ ##spill t frame-required? set-word-prop
\ ##unary-float-function t frame-required? set-word-prop
\ ##binary-float-function t frame-required? set-word-prop

View File

@ -706,7 +706,22 @@ temp: temp1/int-rep temp2/int-rep ;
INSN: ##call-gc
literal: gc-roots ;
! Spills and reloads, inserted by register allocator
TUPLE: spill-slot { n integer } ;
C: <spill-slot> spill-slot
INSN: ##spill
use: src
literal: rep dst ;
INSN: ##reload
def: dst
literal: rep src ;
! Instructions used by machine IR only.
INSN: _spill-area-size
literal: n ;
INSN: _prologue
literal: stack-frame ;
@ -727,20 +742,6 @@ literal: label ;
INSN: _conditional-branch
literal: label insn ;
TUPLE: spill-slot { n integer } ;
C: <spill-slot> spill-slot
INSN: _spill
use: src
literal: rep dst ;
INSN: _reload
def: dst
literal: rep src ;
INSN: _spill-area-size
literal: n ;
UNION: ##allocation
##allot
##box-alien

View File

@ -9,11 +9,11 @@ compiler.cfg.linear-scan.allocation.state ;
IN: compiler.cfg.linear-scan.allocation
: active-positions ( new assoc -- )
[ vreg>> active-intervals-for ] dip
[ active-intervals-for ] dip
'[ [ 0 ] dip reg>> _ add-use-position ] each ;
: inactive-positions ( new assoc -- )
[ [ vreg>> inactive-intervals-for ] keep ] dip
[ [ inactive-intervals-for ] keep ] dip
'[
[ _ relevant-ranges intersect-live-ranges 1/0. or ] [ reg>> ] bi
_ add-use-position

View File

@ -17,13 +17,13 @@ ERROR: bad-live-ranges interval ;
] [ drop ] if ;
: trim-before-ranges ( live-interval -- )
[ ranges>> ] [ uses>> last n>> 1 + ] bi
[ ranges>> ] [ last-use n>> 1 + ] bi
[ '[ from>> _ <= ] filter! drop ]
[ swap last (>>to) ]
2bi ;
: trim-after-ranges ( live-interval -- )
[ ranges>> ] [ uses>> first n>> ] bi
[ ranges>> ] [ first-use n>> ] bi
[ '[ to>> _ >= ] filter! drop ]
[ swap first (>>from) ]
2bi ;
@ -73,12 +73,12 @@ ERROR: bad-live-ranges interval ;
'[ [ _ find-use-position ] [ reg>> ] bi _ add-use-position ] each ;
: active-positions ( new assoc -- )
[ [ vreg>> active-intervals-for ] keep ] dip
[ [ active-intervals-for ] keep ] dip
find-use-positions ;
: inactive-positions ( new assoc -- )
[
[ vreg>> inactive-intervals-for ] keep
[ inactive-intervals-for ] keep
[ '[ _ intervals-intersect? ] filter ] keep
] dip
find-use-positions ;
@ -89,7 +89,7 @@ ERROR: bad-live-ranges interval ;
>alist alist-max ;
: spill-new? ( new pair -- ? )
[ uses>> first n>> ] [ second ] bi* > ;
[ first-use n>> ] [ second ] bi* > ;
: spill-new ( new pair -- )
drop spill-after add-unhandled ;
@ -103,13 +103,13 @@ ERROR: bad-live-ranges interval ;
! If there is an active interval using 'reg' (there should be at
! most one) are split and spilled and removed from the inactive
! set.
new vreg>> active-intervals-for [ [ reg>> reg = ] find swap dup ] keep
new active-intervals-for [ [ reg>> reg = ] find swap dup ] keep
'[ _ remove-nth! drop new start>> spill ] [ 2drop ] if ;
:: spill-intersecting-inactive ( new reg -- )
! Any inactive intervals using 'reg' are split and spilled
! and removed from the inactive set.
new vreg>> inactive-intervals-for [
new inactive-intervals-for [
dup reg>> reg = [
dup new intervals-intersect? [
new start>> spill f

View File

@ -26,14 +26,14 @@ SYMBOL: registers
! Vector of active live intervals
SYMBOL: active-intervals
: active-intervals-for ( vreg -- seq )
rep-of reg-class-of active-intervals get at ;
: active-intervals-for ( live-interval -- seq )
reg-class>> active-intervals get at ;
: add-active ( live-interval -- )
dup vreg>> active-intervals-for push ;
dup active-intervals-for push ;
: delete-active ( live-interval -- )
dup vreg>> active-intervals-for remove-eq! drop ;
dup active-intervals-for remove-eq! drop ;
: assign-free-register ( new registers -- )
pop >>reg add-active ;
@ -41,14 +41,14 @@ SYMBOL: active-intervals
! Vector of inactive live intervals
SYMBOL: inactive-intervals
: inactive-intervals-for ( vreg -- seq )
rep-of reg-class-of inactive-intervals get at ;
: inactive-intervals-for ( live-interval -- seq )
reg-class>> inactive-intervals get at ;
: add-inactive ( live-interval -- )
dup vreg>> inactive-intervals-for push ;
dup inactive-intervals-for push ;
: delete-inactive ( live-interval -- )
dup vreg>> inactive-intervals-for remove-eq! drop ;
dup inactive-intervals-for remove-eq! drop ;
! Vector of handled live intervals
SYMBOL: handled-intervals
@ -67,7 +67,7 @@ ERROR: register-already-used live-interval ;
: check-activate ( live-interval -- )
check-allocation? get [
dup [ reg>> ] [ vreg>> active-intervals-for [ reg>> ] map ] bi member?
dup [ reg>> ] [ active-intervals-for [ reg>> ] map ] bi member?
[ register-already-used ] [ drop ] if
] [ drop ] if ;
@ -148,7 +148,7 @@ SYMBOL: spill-slots
! A utility used by register-status and spill-status words
: free-positions ( new -- assoc )
vreg>> rep-of reg-class-of registers get at
reg-class>> registers get at
[ 1/0. ] H{ } <linked-assoc> map>assoc ;
: add-use-position ( n reg assoc -- ) [ [ min ] when* ] change-at ;

View File

@ -68,8 +68,10 @@ SYMBOL: register-live-outs
H{ } clone register-live-outs set
init-unhandled ;
: spill-rep ( live-interval -- rep ) vreg>> rep-of ;
: insert-spill ( live-interval -- )
[ reg>> ] [ vreg>> rep-of ] [ spill-to>> ] tri _spill ;
[ reg>> ] [ spill-rep ] [ spill-to>> ] tri ##spill ;
: handle-spill ( live-interval -- )
dup spill-to>> [ insert-spill ] [ drop ] if ;
@ -88,15 +90,17 @@ SYMBOL: register-live-outs
: expire-old-intervals ( n -- )
pending-interval-heap get (expire-old-intervals) ;
: reload-rep ( live-interval -- rep ) vreg>> rep-of ;
: insert-reload ( live-interval -- )
[ reg>> ] [ vreg>> rep-of ] [ reload-from>> ] tri _reload ;
[ reg>> ] [ reload-rep ] [ reload-from>> ] tri ##reload ;
: insert-reload? ( live-interval -- ? )
! Don't insert a reload if the register will be written to
! before being read again.
{
[ reload-from>> ]
[ uses>> first type>> +use+ eq? ]
[ first-use type>> +use+ eq? ]
} 1&& ;
: handle-reload ( live-interval -- )

View File

@ -89,6 +89,7 @@ H{
[
T{ live-interval
{ vreg 1 }
{ reg-class float-regs }
{ start 0 }
{ end 2 }
{ uses V{ T{ vreg-use f 0 } T{ vreg-use f 1 } } }
@ -97,6 +98,7 @@ H{
}
T{ live-interval
{ vreg 1 }
{ reg-class float-regs }
{ start 5 }
{ end 5 }
{ uses V{ T{ vreg-use f 5 } } }
@ -106,6 +108,7 @@ H{
] [
T{ live-interval
{ vreg 1 }
{ reg-class float-regs }
{ start 0 }
{ end 5 }
{ uses V{ T{ vreg-use f 0 } T{ vreg-use f 1 } T{ vreg-use f 5 } } }
@ -116,6 +119,7 @@ H{
[
T{ live-interval
{ vreg 2 }
{ reg-class float-regs }
{ start 0 }
{ end 1 }
{ uses V{ T{ vreg-use f 0 } } }
@ -124,6 +128,7 @@ H{
}
T{ live-interval
{ vreg 2 }
{ reg-class float-regs }
{ start 1 }
{ end 5 }
{ uses V{ T{ vreg-use f 1 } T{ vreg-use f 5 } } }
@ -133,6 +138,7 @@ H{
] [
T{ live-interval
{ vreg 2 }
{ reg-class float-regs }
{ start 0 }
{ end 5 }
{ uses V{ T{ vreg-use f 0 } T{ vreg-use f 1 } T{ vreg-use f 5 } } }
@ -143,6 +149,7 @@ H{
[
T{ live-interval
{ vreg 3 }
{ reg-class float-regs }
{ start 0 }
{ end 1 }
{ uses V{ T{ vreg-use f 0 } } }
@ -151,6 +158,7 @@ H{
}
T{ live-interval
{ vreg 3 }
{ reg-class float-regs }
{ start 20 }
{ end 30 }
{ uses V{ T{ vreg-use f 20 } T{ vreg-use f 30 } } }
@ -160,6 +168,7 @@ H{
] [
T{ live-interval
{ vreg 3 }
{ reg-class float-regs }
{ start 0 }
{ end 30 }
{ uses V{ T{ vreg-use f 0 } T{ vreg-use f 20 } T{ vreg-use f 30 } } }
@ -184,6 +193,7 @@ H{
V{
T{ live-interval
{ vreg 1 }
{ reg-class int-regs }
{ reg 1 }
{ start 1 }
{ end 15 }
@ -191,6 +201,7 @@ H{
}
T{ live-interval
{ vreg 2 }
{ reg-class int-regs }
{ reg 2 }
{ start 3 }
{ end 8 }
@ -198,6 +209,7 @@ H{
}
T{ live-interval
{ vreg 3 }
{ reg-class int-regs }
{ reg 3 }
{ start 3 }
{ end 10 }
@ -209,6 +221,7 @@ H{
H{ } inactive-intervals set
T{ live-interval
{ vreg 1 }
{ reg-class int-regs }
{ start 5 }
{ end 5 }
{ uses V{ T{ vreg-use f 5 } } }
@ -227,6 +240,7 @@ H{
V{
T{ live-interval
{ vreg 1 }
{ reg-class int-regs }
{ reg 1 }
{ start 1 }
{ end 15 }
@ -234,6 +248,7 @@ H{
}
T{ live-interval
{ vreg 2 }
{ reg-class int-regs }
{ reg 2 }
{ start 3 }
{ end 8 }
@ -245,6 +260,7 @@ H{
H{ } inactive-intervals set
T{ live-interval
{ vreg 3 }
{ reg-class int-regs }
{ start 5 }
{ end 5 }
{ uses V{ T{ vreg-use f 5 } } }
@ -258,6 +274,7 @@ H{ { 1 int-rep } { 2 int-rep } } representations set
{
T{ live-interval
{ vreg 1 }
{ reg-class int-regs }
{ start 0 }
{ end 100 }
{ uses V{ T{ vreg-use f 0 } T{ vreg-use f 100 } } }
@ -272,6 +289,7 @@ H{ { 1 int-rep } { 2 int-rep } } representations set
{
T{ live-interval
{ vreg 1 }
{ reg-class int-regs }
{ start 0 }
{ end 10 }
{ uses V{ T{ vreg-use f 0 } T{ vreg-use f 10 } } }
@ -279,6 +297,7 @@ H{ { 1 int-rep } { 2 int-rep } } representations set
}
T{ live-interval
{ vreg 2 }
{ reg-class int-regs }
{ start 11 }
{ end 20 }
{ uses V{ T{ vreg-use f 11 } T{ vreg-use f 20 } } }
@ -293,6 +312,7 @@ H{ { 1 int-rep } { 2 int-rep } } representations set
{
T{ live-interval
{ vreg 1 }
{ reg-class int-regs }
{ start 0 }
{ end 100 }
{ uses V{ T{ vreg-use f 0 } T{ vreg-use f 100 } } }
@ -300,6 +320,7 @@ H{ { 1 int-rep } { 2 int-rep } } representations set
}
T{ live-interval
{ vreg 2 }
{ reg-class int-regs }
{ start 30 }
{ end 60 }
{ uses V{ T{ vreg-use f 30 } T{ vreg-use f 60 } } }
@ -314,6 +335,7 @@ H{ { 1 int-rep } { 2 int-rep } } representations set
{
T{ live-interval
{ vreg 1 }
{ reg-class int-regs }
{ start 0 }
{ end 100 }
{ uses V{ T{ vreg-use f 0 } T{ vreg-use f 100 } } }
@ -321,6 +343,7 @@ H{ { 1 int-rep } { 2 int-rep } } representations set
}
T{ live-interval
{ vreg 2 }
{ reg-class int-regs }
{ start 30 }
{ end 200 }
{ uses V{ T{ vreg-use f 30 } T{ vreg-use f 200 } } }
@ -335,6 +358,7 @@ H{ { 1 int-rep } { 2 int-rep } } representations set
{
T{ live-interval
{ vreg 1 }
{ reg-class int-regs }
{ start 0 }
{ end 100 }
{ uses V{ T{ vreg-use f 0 } T{ vreg-use f 100 } } }
@ -342,6 +366,7 @@ H{ { 1 int-rep } { 2 int-rep } } representations set
}
T{ live-interval
{ vreg 2 }
{ reg-class int-regs }
{ start 30 }
{ end 100 }
{ uses V{ T{ vreg-use f 30 } T{ vreg-use f 100 } } }
@ -365,6 +390,7 @@ H{
{
T{ live-interval
{ vreg 1 }
{ reg-class int-regs }
{ start 0 }
{ end 20 }
{ uses V{ T{ vreg-use f 0 } T{ vreg-use f 10 } T{ vreg-use f 20 } } }
@ -372,6 +398,7 @@ H{
}
T{ live-interval
{ vreg 2 }
{ reg-class int-regs }
{ start 0 }
{ end 20 }
{ uses V{ T{ vreg-use f 0 } T{ vreg-use f 10 } T{ vreg-use f 20 } } }
@ -379,6 +406,7 @@ H{
}
T{ live-interval
{ vreg 3 }
{ reg-class int-regs }
{ start 4 }
{ end 8 }
{ uses V{ T{ vreg-use f 6 } } }
@ -386,6 +414,7 @@ H{
}
T{ live-interval
{ vreg 4 }
{ reg-class int-regs }
{ start 4 }
{ end 8 }
{ uses V{ T{ vreg-use f 8 } } }
@ -395,6 +424,7 @@ H{
! This guy will invoke the 'spill partially available' code path
T{ live-interval
{ vreg 5 }
{ reg-class int-regs }
{ start 4 }
{ end 8 }
{ uses V{ T{ vreg-use f 8 } } }
@ -411,6 +441,7 @@ H{
{
T{ live-interval
{ vreg 1 }
{ reg-class int-regs }
{ start 0 }
{ end 10 }
{ uses V{ T{ vreg-use f 0 } T{ vreg-use f 6 } T{ vreg-use f 10 } } }
@ -420,6 +451,7 @@ H{
! This guy will invoke the 'spill new' code path
T{ live-interval
{ vreg 5 }
{ reg-class int-regs }
{ start 2 }
{ end 8 }
{ uses V{ T{ vreg-use f 8 } } }
@ -491,12 +523,14 @@ H{
[ 5 ] [
T{ live-interval
{ start 0 }
{ reg-class int-regs }
{ end 10 }
{ uses { 0 10 } }
{ ranges V{ T{ live-range f 0 10 } } }
}
T{ live-interval
{ start 5 }
{ reg-class int-regs }
{ end 10 }
{ uses { 5 10 } }
{ ranges V{ T{ live-range f 5 10 } } }
@ -520,6 +554,7 @@ H{
{
T{ live-interval
{ vreg 1 }
{ reg-class int-regs }
{ start 0 }
{ end 20 }
{ reg 0 }
@ -529,6 +564,7 @@ H{
T{ live-interval
{ vreg 2 }
{ reg-class int-regs }
{ start 4 }
{ end 40 }
{ reg 0 }
@ -543,6 +579,7 @@ H{
{
T{ live-interval
{ vreg 3 }
{ reg-class int-regs }
{ start 0 }
{ end 40 }
{ reg 1 }
@ -554,7 +591,8 @@ H{
} active-intervals set
T{ live-interval
{ vreg 4 }
{ vreg 4 }
{ reg-class int-regs }
{ start 8 }
{ end 10 }
{ ranges V{ T{ live-range f 8 10 } } }
@ -924,13 +962,13 @@ test-diamond
[ ] [ { 1 2 } test-linear-scan-on-cfg ] unit-test
[ _spill ] [ 2 get successors>> first instructions>> first class ] unit-test
[ ##spill ] [ 2 get successors>> first instructions>> first class ] unit-test
[ _spill ] [ 3 get instructions>> second class ] unit-test
[ ##spill ] [ 3 get instructions>> second class ] unit-test
[ f ] [ 3 get instructions>> [ _reload? ] any? ] unit-test
[ f ] [ 3 get instructions>> [ ##reload? ] any? ] unit-test
[ _reload ] [ 4 get instructions>> first class ] unit-test
[ ##reload ] [ 4 get instructions>> first class ] unit-test
! Resolve pass
V{
@ -978,11 +1016,11 @@ V{
[ ] [ { 1 2 } test-linear-scan-on-cfg ] unit-test
[ t ] [ 2 get instructions>> [ _spill? ] any? ] unit-test
[ t ] [ 2 get instructions>> [ ##spill? ] any? ] unit-test
[ t ] [ 3 get predecessors>> first instructions>> [ _spill? ] any? ] unit-test
[ t ] [ 3 get predecessors>> first instructions>> [ ##spill? ] any? ] unit-test
[ t ] [ 5 get instructions>> [ _reload? ] any? ] unit-test
[ t ] [ 5 get instructions>> [ ##reload? ] any? ] unit-test
! A more complicated failure case with resolve that came up after the above
! got fixed
@ -1041,13 +1079,13 @@ V{
[ ] [ { 1 2 3 4 } test-linear-scan-on-cfg ] unit-test
[ _spill ] [ 1 get instructions>> second class ] unit-test
[ _reload ] [ 4 get instructions>> 4 swap nth class ] unit-test
[ V{ 3 2 1 } ] [ 8 get instructions>> [ _spill? ] filter [ dst>> n>> cell / ] map ] unit-test
[ V{ 3 2 1 } ] [ 9 get instructions>> [ _reload? ] filter [ src>> n>> cell / ] map ] unit-test
[ ##spill ] [ 1 get instructions>> second class ] unit-test
[ ##reload ] [ 4 get instructions>> 4 swap nth class ] unit-test
[ V{ 3 2 1 } ] [ 8 get instructions>> [ ##spill? ] filter [ dst>> n>> cell / ] map ] unit-test
[ V{ 3 2 1 } ] [ 9 get instructions>> [ ##reload? ] filter [ src>> n>> cell / ] map ] unit-test
! Resolve pass should insert this
[ _reload ] [ 5 get predecessors>> first instructions>> first class ] unit-test
[ ##reload ] [ 5 get predecessors>> first instructions>> first class ] unit-test
! Some random bug
V{
@ -1397,13 +1435,13 @@ test-diamond
[ ] [ { 1 2 } test-linear-scan-on-cfg ] unit-test
[ 0 ] [ 1 get instructions>> [ _spill? ] count ] unit-test
[ 0 ] [ 1 get instructions>> [ ##spill? ] count ] unit-test
[ 1 ] [ 2 get instructions>> [ _spill? ] count ] unit-test
[ 1 ] [ 2 get instructions>> [ ##spill? ] count ] unit-test
[ 1 ] [ 3 get predecessors>> first instructions>> [ _spill? ] count ] unit-test
[ 1 ] [ 3 get predecessors>> first instructions>> [ ##spill? ] count ] unit-test
[ 1 ] [ 4 get instructions>> [ _reload? ] count ] unit-test
[ 1 ] [ 4 get instructions>> [ ##reload? ] count ] unit-test
! Another test case for fencepost error in assignment pass
V{ T{ ##branch } } 0 test-bb
@ -1435,12 +1473,12 @@ test-diamond
[ ] [ { 1 2 } test-linear-scan-on-cfg ] unit-test
[ 0 ] [ 1 get instructions>> [ _spill? ] count ] unit-test
[ 0 ] [ 1 get instructions>> [ ##spill? ] count ] unit-test
[ 1 ] [ 2 get instructions>> [ _spill? ] count ] unit-test
[ 1 ] [ 2 get instructions>> [ ##spill? ] count ] unit-test
[ 1 ] [ 2 get instructions>> [ _reload? ] count ] unit-test
[ 1 ] [ 2 get instructions>> [ ##reload? ] count ] unit-test
[ 0 ] [ 3 get instructions>> [ _spill? ] count ] unit-test
[ 0 ] [ 3 get instructions>> [ ##spill? ] count ] unit-test
[ 0 ] [ 4 get instructions>> [ _reload? ] count ] unit-test
[ 0 ] [ 4 get instructions>> [ ##reload? ] count ] unit-test

View File

@ -3,7 +3,7 @@
USING: namespaces kernel assocs accessors sequences math math.order fry
combinators binary-search compiler.cfg.instructions compiler.cfg.registers
compiler.cfg.def-use compiler.cfg.liveness compiler.cfg.linearization.order
compiler.cfg ;
compiler.cfg cpu.architecture ;
IN: compiler.cfg.linear-scan.live-intervals
TUPLE: live-range from to ;
@ -19,7 +19,12 @@ C: <vreg-use> vreg-use
TUPLE: live-interval
vreg
reg spill-to reload-from
start end ranges uses ;
start end ranges uses
reg-class ;
: first-use ( live-interval -- use ) uses>> first ; inline
: last-use ( live-interval -- use ) uses>> last ; inline
GENERIC: covers? ( insn# obj -- ? )
@ -66,6 +71,7 @@ M: live-interval covers? ( insn# live-interval -- ? )
\ live-interval new
V{ } clone >>uses
V{ } clone >>ranges
over rep-of reg-class-of >>reg-class
swap >>vreg ;
: block-from ( bb -- n ) instructions>> first insn#>> 1 - ;

View File

@ -20,7 +20,7 @@ IN: compiler.cfg.linear-scan.resolve.tests
[
{
T{ _reload { dst 1 } { rep int-rep } { src T{ spill-slot f 0 } } }
T{ ##reload { dst 1 } { rep int-rep } { src T{ spill-slot f 0 } } }
}
] [
[
@ -32,7 +32,7 @@ IN: compiler.cfg.linear-scan.resolve.tests
[
{
T{ _spill { src 1 } { rep int-rep } { dst T{ spill-slot f 0 } } }
T{ ##spill { src 1 } { rep int-rep } { dst T{ spill-slot f 0 } } }
}
] [
[
@ -66,8 +66,8 @@ IN: compiler.cfg.linear-scan.resolve.tests
[
{
T{ _spill { src 0 } { rep int-rep } { dst T{ spill-slot f 0 } } }
T{ _reload { dst 0 } { rep tagged-rep } { src T{ spill-slot f 1 } } }
T{ ##spill { src 0 } { rep int-rep } { dst T{ spill-slot f 0 } } }
T{ ##reload { dst 0 } { rep tagged-rep } { src T{ spill-slot f 1 } } }
T{ ##branch }
}
] [
@ -80,8 +80,8 @@ IN: compiler.cfg.linear-scan.resolve.tests
[
{
T{ _spill { src 0 } { rep int-rep } { dst T{ spill-slot f 1 } } }
T{ _reload { dst 0 } { rep tagged-rep } { src T{ spill-slot f 0 } } }
T{ ##spill { src 0 } { rep int-rep } { dst T{ spill-slot f 1 } } }
T{ ##reload { dst 0 } { rep tagged-rep } { src T{ spill-slot f 0 } } }
T{ ##branch }
}
] [
@ -94,8 +94,8 @@ IN: compiler.cfg.linear-scan.resolve.tests
[
{
T{ _spill { src 0 } { rep int-rep } { dst T{ spill-slot f 1 } } }
T{ _reload { dst 0 } { rep tagged-rep } { src T{ spill-slot f 0 } } }
T{ ##spill { src 0 } { rep int-rep } { dst T{ spill-slot f 1 } } }
T{ ##reload { dst 0 } { rep tagged-rep } { src T{ spill-slot f 0 } } }
T{ ##branch }
}
] [
@ -116,15 +116,15 @@ H{ } clone spill-temps set
}
mapping-instructions {
{
T{ _spill { src 0 } { rep int-rep } { dst T{ spill-slot f 8 } } }
T{ ##spill { src 0 } { rep int-rep } { dst T{ spill-slot f 8 } } }
T{ ##copy { dst 0 } { src 1 } { rep int-rep } }
T{ _reload { dst 1 } { rep int-rep } { src T{ spill-slot f 8 } } }
T{ ##reload { dst 1 } { rep int-rep } { src T{ spill-slot f 8 } } }
T{ ##branch }
}
{
T{ _spill { src 1 } { rep int-rep } { dst T{ spill-slot f 8 } } }
T{ ##spill { src 1 } { rep int-rep } { dst T{ spill-slot f 8 } } }
T{ ##copy { dst 1 } { src 0 } { rep int-rep } }
T{ _reload { dst 0 } { rep int-rep } { src T{ spill-slot f 8 } } }
T{ ##reload { dst 0 } { rep int-rep } { src T{ spill-slot f 8 } } }
T{ ##branch }
}
} member?

View File

@ -51,16 +51,16 @@ SYMBOL: spill-temps
] if ;
: memory->register ( from to -- )
swap [ reg>> ] [ [ rep>> ] [ reg>> ] bi ] bi* _reload ;
swap [ reg>> ] [ [ rep>> ] [ reg>> ] bi ] bi* ##reload ;
: register->memory ( from to -- )
[ [ reg>> ] [ rep>> ] bi ] [ reg>> ] bi* _spill ;
[ [ reg>> ] [ rep>> ] bi ] [ reg>> ] bi* ##spill ;
: temp->register ( from to -- )
nip [ reg>> ] [ rep>> ] [ rep>> spill-temp ] tri _reload ;
nip [ reg>> ] [ rep>> ] [ rep>> spill-temp ] tri ##reload ;
: register->temp ( from to -- )
drop [ [ reg>> ] [ rep>> ] bi ] [ rep>> spill-temp ] bi _spill ;
drop [ [ reg>> ] [ rep>> ] bi ] [ rep>> spill-temp ] bi ##spill ;
: register->register ( from to -- )
swap [ reg>> ] [ [ reg>> ] [ rep>> ] bi ] bi* ##copy ;

View File

@ -200,7 +200,8 @@ CODEGEN: ##vm-field %vm-field
CODEGEN: ##set-vm-field %set-vm-field
CODEGEN: ##alien-global %alien-global
CODEGEN: ##call-gc %call-gc
CODEGEN: ##spill %spill
CODEGEN: ##reload %reload
CODEGEN: ##dispatch %dispatch
: %dispatch-label ( label -- )
@ -210,8 +211,6 @@ CODEGEN: ##dispatch %dispatch
CODEGEN: _label resolve-label
CODEGEN: _dispatch-label %dispatch-label
CODEGEN: _branch %jump-label
CODEGEN: _spill %spill
CODEGEN: _reload %reload
CODEGEN: _loop-entry %loop-entry
GENERIC: generate-conditional-insn ( label insn -- )