use jit_assembler::common::InstructionBuilder;
#[cfg(feature = "riscv64")]
use jit_assembler::riscv64::{reg as riscv_reg, csr, Riscv64InstructionBuilder};
#[cfg(feature = "aarch64")]
use jit_assembler::aarch64::{reg as aarch64_reg, Aarch64InstructionBuilder};
fn main() {
println!("JIT Assembler - JIT Execution Example");
println!("=====================================");
#[cfg(feature = "riscv64")]
riscv_examples();
#[cfg(feature = "aarch64")]
aarch64_examples();
#[cfg(not(any(feature = "riscv64", feature = "aarch64")))]
println!("No architecture features enabled. Enable 'riscv' or 'aarch64' features to see examples.");
}
#[cfg(feature = "riscv64")]
fn riscv_examples() {
println!("\n=== RISC-V Examples ===");
println!("\n1. Creating a function that returns 42...");
let constant_func = unsafe {
Riscv64InstructionBuilder::new()
.addi(riscv_reg::A0, riscv_reg::ZERO, 42) .ret() .function::<fn() -> u64>()
};
match constant_func {
Ok(func) => {
println!(" Function created successfully!");
if cfg!(target_arch = "riscv64") {
let result = func.call();
println!(" Result: {}", result);
} else {
println!(" (Skipping execution - not on RISC-V host)");
}
}
Err(e) => println!(" Failed to create function: {}", e),
}
println!("\n2. Creating a function that adds two numbers...");
let add_func = unsafe {
Riscv64InstructionBuilder::new()
.add(riscv_reg::A0, riscv_reg::A0, riscv_reg::A1) .ret() .function::<fn(u64, u64) -> u64>()
};
match add_func {
Ok(func) => {
println!(" Function created successfully!");
if cfg!(target_arch = "riscv64") {
let result = func.call(10, 20);
println!(" 10 + 20 = {}", result);
} else {
println!(" (Skipping execution - not on RISC-V host)");
}
}
Err(e) => println!(" Failed to create function: {}", e),
}
println!("\n3. Creating a function that computes (x + 100) * 2...");
let complex_func = unsafe {
Riscv64InstructionBuilder::new()
.addi(riscv_reg::A0, riscv_reg::A0, 100) .slli(riscv_reg::A0, riscv_reg::A0, 1) .ret() .function::<fn(u64) -> u64>()
};
match complex_func {
Ok(func) => {
println!(" Function created successfully!");
if cfg!(target_arch = "riscv64") {
let result = func.call(5);
println!(" (5 + 100) * 2 = {}", result);
} else {
println!(" (Skipping execution - not on RISC-V host)");
}
}
Err(e) => println!(" Failed to create function: {}", e),
}
println!("\n4. Creating a function that reads MEPC CSR...");
let csr_func = unsafe {
Riscv64InstructionBuilder::new()
.csrr(riscv_reg::A0, csr::MEPC) .ret() .function::<fn() -> u64>()
};
match csr_func {
Ok(_func) => {
println!(" Function created successfully!");
if cfg!(target_arch = "riscv64") {
println!(" (CSR access requires appropriate privileges)");
} else {
println!(" (Skipping execution - not on RISC-V host)");
}
}
Err(e) => println!(" Failed to create function: {}", e),
}
}
#[cfg(feature = "aarch64")]
fn aarch64_examples() {
println!("\n=== AArch64 Examples ===");
println!("\n1. Creating a function that returns 42...");
let constant_func = unsafe {
Aarch64InstructionBuilder::new()
.mov_imm(aarch64_reg::X0, 42) .ret() .function::<fn() -> u64>()
};
match constant_func {
Ok(func) => {
println!(" Function created successfully!");
if cfg!(target_arch = "aarch64") {
let result = func.call();
println!(" Result: {}", result);
} else {
println!(" (Skipping execution - not on AArch64 host)");
}
}
Err(e) => println!(" Failed to create function: {}", e),
}
println!("\n2. Creating a function that adds two numbers...");
let add_func = unsafe {
Aarch64InstructionBuilder::new()
.add(aarch64_reg::X0, aarch64_reg::X0, aarch64_reg::X1) .ret() .function::<fn(u64, u64) -> u64>()
};
match add_func {
Ok(func) => {
println!(" Function created successfully!");
if cfg!(target_arch = "aarch64") {
let result = func.call(10, 20);
println!(" 10 + 20 = {}", result);
} else {
println!(" (Skipping execution - not on AArch64 host)");
}
}
Err(e) => println!(" Failed to create function: {}", e),
}
println!("\n3. Creating a function that computes (x + 100) * 2...");
let complex_func = unsafe {
Aarch64InstructionBuilder::new()
.addi(aarch64_reg::X0, aarch64_reg::X0, 100) .mov_imm(aarch64_reg::X1, 2) .mul(aarch64_reg::X0, aarch64_reg::X0, aarch64_reg::X1) .ret() .function::<fn(u64) -> u64>()
};
match complex_func {
Ok(func) => {
println!(" Function created successfully!");
if cfg!(target_arch = "aarch64") {
let result = func.call(5);
println!(" (5 + 100) * 2 = {}", result);
} else {
println!(" (Skipping execution - not on AArch64 host)");
}
}
Err(e) => println!(" Failed to create function: {}", e),
}
println!("\nAArch64 examples completed!");
println!("Note: To actually execute these functions, run this example on an AArch64 system.");
}