c65gm/internal/optimizer/optimizer.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)
}