An x64
jit assembler for learning purpose with the following two main goals:
- Learn about x64 instruction encoding.
- Learn how to use the rust type system to disallow invalid operands.
use juicebox_asm::insn::*;
use juicebox_asm::Runtime;
use juicebox_asm::{Asm, Imm32, Label, Reg32::*};
fn main() {
let mut asm = Asm::new();
// Reference implementation
// int ret = 0;
// int n = 42;
//
// loop:
// ret += n;
// --n;
// if (n != 0) goto loop;
//
// return;
let mut lp = Label::new();
asm.mov(eax, Imm32::from(0));
asm.mov(ecx, Imm32::from(42));
asm.bind(&mut lp);
asm.add(eax, ecx);
asm.dec(ecx);
asm.test(ecx, ecx);
asm.jnz(&mut lp);
asm.ret();
let mut rt = Runtime::new();
let func = unsafe { rt.add_code::<extern "C" fn() -> u32>(&asm.into_code()) };
assert_eq!(func(), (0..=42).into_iter().sum());
}
The examples/
folder provides additional examples:
fib.rs
jit compiles a function to compute thefibonacci
sequence.add.rs
jit compiles a function calling another function compiled into the example binary.tiny_vm.rs
defines a minimalvirtual machine (VM)
with registers, instructions, data & instruction memory. The VM demonstrates a simple jit compiler which has a jit cache and translates each basic block on first execution when running a VM guest image. For reference an interepter is also implemented.
The ci/
checks can be run automatically during local development by
installing the following pre-commit
git hook.
echo 'make -C ci' > .git/hooks/pre-commit
chmod +x .git/hooks/pre-commit
This project is licensed under the MIT license.