36 lines
842 B
Go
36 lines
842 B
Go
package optimizer
|
|
|
|
// Optimize applies all enabled peephole passes to the generated ASM lines.
|
|
// Each pass runs sequentially on a parsed representation of the lines.
|
|
// @@OPT markers are stripped from output.
|
|
func Optimize(lines []string, cfg *Config) []string {
|
|
if cfg == nil || !cfg.Any() {
|
|
return lines
|
|
}
|
|
|
|
parsed := parseLines(lines)
|
|
original := parsed
|
|
|
|
if cfg.EnableStoreLoad {
|
|
parsed = passStoreReload(parsed, cfg)
|
|
}
|
|
if cfg.EnableLoad {
|
|
parsed = passLoadElimination(parsed, cfg)
|
|
}
|
|
if cfg.EnableImm {
|
|
parsed = passImmElimination(parsed)
|
|
}
|
|
if cfg.EnableJmp {
|
|
parsed = passJmpNext(parsed)
|
|
}
|
|
if cfg.EnableSelf {
|
|
parsed = passSelfAssignment(parsed)
|
|
}
|
|
|
|
parsed = stripOptMarkers(parsed)
|
|
if cfg.Debug {
|
|
original = stripOptMarkers(original)
|
|
parsed = debugDiff(original, parsed)
|
|
}
|
|
return linesToString(parsed)
|
|
}
|