You may choose any design for your JIT compiler as long as the JIT compiler is capable of running all test programs (i.e. no fallback to interpreter) without crashing. Keep in mind that time is limited and more complex designs are more risky. For simplicity and easier debugging, we recommend a single-pass compiler design without an IR and simple register allocation only. You may build upon these components once you have a fully working minimal compiler. It is not required to (simultaneously) implement a garbage collector (3A).
Your JIT must generate assembly directly, i.e. no reusing LLVM or another JIT compiler.
Your project will be evaluated for functional correctness and performance.
Your project is required to run on Linux x86-64 and may be written in the language of your choice. The starter code provides functional x86-64 assembler (Xbyak) in C++. For Rust, you may use monoasm. If you are using any other language and require an assembler, please contact us before using it so we can validate it first.