From 865c1d3231fd57c648121d961be91793d0bfe690 Mon Sep 17 00:00:00 2001 From: johannst Date: Sun, 5 Mar 2023 20:47:28 +0000 Subject: deploy: 1ea7de2ba46b58b4afe3e65b95d8a45160218a5c --- juicebox_asm/index.html | 73 ++++++++++++++++++++++++++++++++++++++++++++++++- 1 file changed, 72 insertions(+), 1 deletion(-) (limited to 'juicebox_asm/index.html') diff --git a/juicebox_asm/index.html b/juicebox_asm/index.html index a58f940..226978d 100644 --- a/juicebox_asm/index.html +++ b/juicebox_asm/index.html @@ -1 +1,72 @@ -juicebox_asm - Rust
\ No newline at end of file +juicebox_asm - Rust

Crate juicebox_asm

source ·
Expand description

A simple x64 jit assembler with a minimal runtime to execute emitted code for fun.

+

The following is an fibonacci example implementation.

+ +
use juicebox_asm::prelude::*;
+use juicebox_asm::Runtime;
+
+const fn fib_rs(n: u64) -> u64 {
+    match n {
+        0 => 0,
+        1 => 1,
+        _ => fib_rs(n - 2) + fib_rs(n - 1),
+    }
+}
+
+fn main() {
+    let mut asm = Asm::new();
+
+    let mut lp = Label::new();
+    let mut end = Label::new();
+
+    // Reference implementation:
+    //
+    // int fib(int n) {
+    //   int tmp = 0;
+    //   int prv = 1;
+    //   int sum = 0;
+    // loop:
+    //   if (n == 0) goto end;
+    //   tmp = sum;
+    //   sum += prv;
+    //   prv = tmp;
+    //   --n;
+    //   goto loop;
+    // end:
+    //   return sum;
+    // }
+
+    // SystemV abi:
+    //   rdi -> first argument
+    //   rax -> return value
+    let n = Reg64::rdi;
+    let sum = Reg64::rax;
+
+    let tmp = Reg64::rcx;
+    let prv = Reg64::rbx;
+
+    asm.mov(tmp, Imm64::from(0));
+    asm.mov(prv, Imm64::from(1));
+    asm.mov(sum, Imm64::from(0));
+
+    asm.bind(&mut lp);
+    asm.test(n, n);
+    asm.jz(&mut end);
+    asm.mov(tmp, sum);
+    asm.add(sum, prv);
+    asm.mov(prv, tmp);
+    asm.dec(n);
+    asm.jmp(&mut lp);
+    asm.bind(&mut end);
+    asm.ret();
+
+    // Move code into executable page and get function pointer to it.
+    let rt = Runtime::new(&asm.into_code());
+    let fib = unsafe { rt.as_fn::<extern "C" fn(u64) -> u64>() };
+
+    for n in 0..15 {
+        let fib_jit = fib(n);
+        println!("fib({}) = {}", n, fib_jit);
+        assert_eq!(fib_jit, fib_rs(n));
+    }
+}
+

Modules

Crate prelude, which can be used to import the most important types at once.

Structs

x64 jit assembler.
Type representing an 8 bit immediate.
Type representing a 16 bit immediate.
Type representing a 32 bit immediate.
Type representing a 64 bit immediate.
A label which is used as target for jump instructions.
A simple mmaped runtime with executable pages.

Enums

Type representing a memory operand.
Definition of 8 bit registers.
Definition of 16 bit registers.
Definition of 32 bit registers.
Definition of 64 bit registers.
\ No newline at end of file -- cgit v1.2.3