# Milestones ## Clean codebase structure 0. Prelude classes like FileIO, strings null-termination etc. 1. Diagnostic helper class for logging 2. Remove "void" valuehandle class and use it as ValueHandle::Type instead 3. Function multiple arguments support 4. Implement if-else and while statements ## Types support in language ## Stack based code generation 0. Stack based codegen, i.e. for fasm x86_64 ## IR Optimizations aka const folding, deadcode elimination ## Register allocation ## First beta assembly code generation with registers ## ... ------------------------------------------------- # References for IR optimizations 2. Find out what use[B] and def[B] are for each block 3. Define successors and predecessors of each block and make them accessible 4. Compute liveIn[B] and liveOut[B] for each block Classic equations: liveIn[B] = use[B] ∪ (liveOut[B] - def[B]) liveOut[B] = ⋃ liveIn[S] for S in succ[B] 5. Linear scan register allocation - Instruction numbering + per-instruction liveness - Live intervals - Linear scan allocator with ~6 fake regs - Spill to stack slots - Add “CALL clobbers regs” rule # References for register allocation function's reserved registers: EAX, ECX, EDX return registers: int => EAX float => ST0