diff --git a/basis/compiler/cfg/linear-scan/allocation/spilling/spilling.factor b/basis/compiler/cfg/linear-scan/allocation/spilling/spilling.factor index 8a671d4455..73d4570b02 100644 --- a/basis/compiler/cfg/linear-scan/allocation/spilling/spilling.factor +++ b/basis/compiler/cfg/linear-scan/allocation/spilling/spilling.factor @@ -26,13 +26,13 @@ ERROR: bad-live-ranges interval ; [ drop ] [ bad-live-ranges ] if ] [ drop ] if ; -: trim-before-ranges ( live-interval n -- ) +: trim-before-ranges ( live-interval -- ) [ ranges>> ] [ uses>> last ] bi [ '[ from>> _ <= ] filter-here ] [ swap last (>>to) ] 2bi ; -: trim-after-ranges ( live-interval n -- ) +: trim-after-ranges ( live-interval -- ) [ ranges>> ] [ uses>> first ] bi [ '[ to>> _ >= ] filter-here ] [ swap first (>>from) ] @@ -56,7 +56,7 @@ ERROR: bad-live-ranges interval ; over spill-to>> >>reload-from ; : split-and-spill ( new existing -- before after ) - swap start>> split-for-spill assign-spill assign-reload ; + swap start>> split-for-spill [ assign-spill ] dip assign-reload ; : reuse-register ( new existing -- ) [ nip delete-active ] diff --git a/basis/stuff.factor b/basis/stuff.factor new file mode 100644 index 0000000000..2e5fa2dfae --- /dev/null +++ b/basis/stuff.factor @@ -0,0 +1,20 @@ + +: spill-integer-base ( -- n ) + stack-frame get spill-counts>> double-float-regs swap at + double-float-regs reg-size * ; + +: spill-integer@ ( n -- offset ) + cells spill-integer-base + param@ ; + +: spill-float@ ( n -- offset ) + double-float-regs reg-size * param@ ; + +: (stack-frame-size) ( stack-frame -- n ) + [ + { + [ spill-counts>> [ swap reg-size * ] { } assoc>map sum ] + [ gc-roots>> cells ] + [ params>> ] + [ return>> ] + } cleave + ] sum-outputs ; \ No newline at end of file