millfork/src/main/scala/millfork/assembly/opt/FlowAnalyzer.scala

35 lines
1.1 KiB
Scala

package millfork.assembly.opt
import millfork.{CompilationFlag, CompilationOptions}
import millfork.assembly.{AssemblyLine, State}
import millfork.env.NormalFunction
/**
* @author Karol Stasiak
*/
case class FlowInfo(statusBefore: CpuStatus, importanceAfter: CpuImportance) {
def hasClear(state: State.Value): Boolean = statusBefore.hasClear(state)
def hasSet(state: State.Value): Boolean = statusBefore.hasSet(state)
def isUnimportant(state: State.Value): Boolean = importanceAfter.isUnimportant(state)
}
object FlowInfo {
val Default = FlowInfo(CpuStatus(), CpuImportance())
}
object FlowAnalyzer {
def analyze(f: NormalFunction, code: List[AssemblyLine], options: CompilationOptions): List[(FlowInfo, AssemblyLine)] = {
val forwardFlow = if (options.flag(CompilationFlag.DetailedFlowAnalysis)) {
QuantumFlowAnalyzer.analyze(f, code).map(_.collapse)
} else {
CoarseFlowAnalyzer.analyze(f, code)
}
val reverseFlow = ReverseFlowAnalyzer.analyze(f, code)
forwardFlow.zip(reverseFlow).map{case (s,i) => FlowInfo(s,i)}.zip(code)
}
}