57 lines
1.3 KiB
Markdown
57 lines
1.3 KiB
Markdown
|
||
# 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
|