2014-12-27 07:18:58 -05:00
USING: assocs compiler.cfg compiler.cfg.registers help.markup help.syntax math
sequences ;
2014-05-06 12:09:34 -04:00
IN: compiler.cfg.stacks.local
2014-12-27 07:18:58 -05:00
HELP: replace-mapping
{ $var-description "An " { $link assoc } " that maps from stack locations to virtual registers that were put on the stack." }
{ $see-also replace-loc } ;
2014-05-06 12:09:34 -04:00
HELP: current-height
2014-07-18 04:47:08 -04:00
{ $class-description "A tuple used to keep track of the heights of the data and retain stacks in a " { $link basic-block } " The idea is that if the stack change instructions are tracked, then multiple changes can be folded into one. It has the following slots:"
{ $table
{ { $slot "d" } { "Current datastack height." } }
{ { $slot "r" } { "Current retainstack height." } }
{ { $slot "emit-d" } { "Queued up datastack height change." } }
{ { $slot "emit-r" } { "Queued up retainstack height change." } }
}
} ;
2014-05-06 12:09:34 -04:00
2014-12-27 07:18:58 -05:00
HELP: loc>vreg
{ $values { "loc" loc } { "vreg" "virtual register" } }
{ $description "Maps a stack location to a virtual register." } ;
HELP: replace-loc
{ $values { "vreg" "virtual register" } { "loc" loc } }
{ $description "Registers that the absolute stack location " { $snippet "loc" } " should be overwritten with the contents of the virtual register." } ;
HELP: peek-loc
{ $values { "loc" loc } { "vreg" "virtaul register" } }
{ $description "Retrieves the virtual register and the given stack location." } ;
2014-05-16 12:15:14 -04:00
HELP: translate-local-loc
{ $values { "loc" loc } { "loc'" loc } }
{ $description "Translates an absolute stack location to one that is relative to the current stacks height as given in " { $link current-height } "." }
{ $examples
{ $example
2014-10-22 13:31:27 -04:00
"USING: compiler.cfg.stacks.local compiler.cfg.registers compiler.cfg.debugger namespaces prettyprint ;"
2014-05-16 12:15:14 -04:00
"T{ current-height { d 3 } } current-height set D 7 translate-local-loc ."
2014-10-22 13:31:27 -04:00
"D 4"
2014-05-16 12:15:14 -04:00
}
} ;
2014-12-27 07:18:58 -05:00
HELP: height-changes
{ $values { "current-height" current-height } { "insns" sequence } }
{ $description "Converts a " { $link current-height } " tuple to 0-2 stack height change instructions." }
2014-05-06 12:09:34 -04:00
{ $examples
{ $example
2015-01-17 17:02:59 -05:00
"USING: compiler.cfg.stacks.local prettyprint ;"
2014-12-27 07:18:58 -05:00
"T{ current-height { emit-d 4 } { emit-r -2 } } height-changes ."
2014-05-06 12:09:34 -04:00
"{ T{ ##inc-d { n 4 } } T{ ##inc-r { n -2 } } }"
}
} ;
2014-12-18 11:38:09 -05:00
2014-12-27 07:18:58 -05:00
HELP: emit-changes
2014-12-30 20:46:35 -05:00
{ $description "Insert height and stack changes prior to the last instruction." } ;
2014-12-27 07:18:58 -05:00
HELP: inc-d
{ $values { "n" number } }
{ $description "Increases or decreases the current datastacks height." } ;
2014-12-18 11:38:09 -05:00
ARTICLE: "compiler.cfg.stacks.local" "Local stack analysis"
"Local stack analysis. We build three sets for every basic block in the CFG:"
{ $list
"peek-set: all stack locations that the block reads before writing"
"replace-set: all stack locations that the block writes"
"kill-set: all stack locations which become unavailable after the block ends because of the stack height being decremented" }
"This is done while constructing the CFG." ;
ABOUT: "compiler.cfg.stacks.local"