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. It is not required to (simultaneously) implement a garbage collector (4A).
You may choose any JIT compiler design for your project, but 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.
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. You will be given a functional x86-64 assembler that you can call from within your C code.