From b662904c11e55263af6472aebda3b7e27006e33d Mon Sep 17 00:00:00 2001 From: fmoletta Date: Wed, 10 Dec 2025 18:09:37 -0300 Subject: [PATCH 01/27] fix jalr load and store bugs --- src/vm/execution.rs | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/src/vm/execution.rs b/src/vm/execution.rs index aaa5d8f4c..53d919ac3 100644 --- a/src/vm/execution.rs +++ b/src/vm/execution.rs @@ -87,6 +87,7 @@ fn run_instruction( } Instruction::JumpAndLink { dst, offset } => { registers.0[*dst as usize] = *pc; + *pc -= 4; *pc += offset; } Instruction::Store { @@ -101,7 +102,9 @@ fn run_instruction( LoadStoreWidth::Half => todo!(), LoadStoreWidth::Word => value, }; - memory.0.insert(*base + *offset, value); + memory + .0 + .insert((registers.0[*base as usize] + *offset), value); } Instruction::Load { dst, @@ -109,7 +112,7 @@ fn run_instruction( base, width, } => { - let value = memory.0[&(*base + *offset)]; + let value = memory.0[&(registers.0[*base as usize] + *offset)]; let value = match width { LoadStoreWidth::Byte => todo!(), LoadStoreWidth::Half => todo!(), From 7ad729de7c777867eec1577880adaee9c23dd6eb Mon Sep 17 00:00:00 2001 From: fmoletta Date: Wed, 10 Dec 2025 18:25:34 -0300 Subject: [PATCH 02/27] JALR/JAL: do not write next pc into zero --- src/vm/execution.rs | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/src/vm/execution.rs b/src/vm/execution.rs index 53d919ac3..93200955c 100644 --- a/src/vm/execution.rs +++ b/src/vm/execution.rs @@ -82,11 +82,15 @@ fn run_instruction( registers.0[*dst as usize] = res; } Instruction::JumpAndLinkRegister { dst, base, offset } => { - registers.0[*dst as usize] = *pc; + if *dst != 0 { + registers.0[*dst as usize] = *pc; + } *pc = registers.0[*base as usize] + offset; } Instruction::JumpAndLink { dst, offset } => { - registers.0[*dst as usize] = *pc; + if *dst != 0 { + registers.0[*dst as usize] = *pc; + } *pc -= 4; *pc += offset; } From 4457a67ececc50f479783f01072f17e45abec417 Mon Sep 17 00:00:00 2001 From: fmoletta Date: Wed, 10 Dec 2025 18:58:07 -0300 Subject: [PATCH 03/27] MultipleOpcodes: use i32 for immediates --- src/vm/execution.rs | 12 +++++++----- src/vm/instructions.rs | 23 ++++++++++++++++------- 2 files changed, 23 insertions(+), 12 deletions(-) diff --git a/src/vm/execution.rs b/src/vm/execution.rs index 93200955c..c0a800785 100644 --- a/src/vm/execution.rs +++ b/src/vm/execution.rs @@ -20,6 +20,8 @@ fn load_program(instruction_map: BTreeMap, memory: &mut Memory) { fn run_from_entrypoint(memory: &mut Memory, entrypoint: u32) -> (u32, u32) { let mut pc = entrypoint; let mut registers = Registers::default(); + // TODO: find what the starting value should be + registers.0[2] = 16; while pc != registers.0[1] { let next_instruction = memory.0[&pc]; let instruction = Instruction::parse(next_instruction); @@ -74,25 +76,25 @@ fn run_instruction( *pc += 4; match inst { Instruction::ArithImm { dst, src, imm, op } => { - let (a, b) = (registers.0[*src as usize], imm); + let (a, b) = (registers.0[*src as usize] as i32, imm); let res = match op { ArithOp::Add => a + b, _ => unimplemented!(), }; - registers.0[*dst as usize] = res; + registers.0[*dst as usize] = res as u32; } Instruction::JumpAndLinkRegister { dst, base, offset } => { if *dst != 0 { registers.0[*dst as usize] = *pc; } - *pc = registers.0[*base as usize] + offset; + *pc = (registers.0[*base as usize] as i32 + offset) as u32; } Instruction::JumpAndLink { dst, offset } => { if *dst != 0 { registers.0[*dst as usize] = *pc; } *pc -= 4; - *pc += offset; + *pc = (*pc as i32 + offset) as u32; } Instruction::Store { src, @@ -116,7 +118,7 @@ fn run_instruction( base, width, } => { - let value = memory.0[&(registers.0[*base as usize] + *offset)]; + let value = memory.0[&((registers.0[*base as usize] as i32 + *offset) as u32)]; let value = match width { LoadStoreWidth::Byte => todo!(), LoadStoreWidth::Half => todo!(), diff --git a/src/vm/instructions.rs b/src/vm/instructions.rs index 36e2c0fa7..cd2b9f0e3 100644 --- a/src/vm/instructions.rs +++ b/src/vm/instructions.rs @@ -113,17 +113,17 @@ pub enum Instruction { ArithImm { dst: u32, src: u32, - imm: u32, + imm: i32, op: ArithOp, }, JumpAndLink { dst: u32, - offset: u32, + offset: i32, }, JumpAndLinkRegister { base: u32, dst: u32, - offset: u32, + offset: i32, }, Store { src: u32, @@ -133,7 +133,7 @@ pub enum Instruction { }, Load { dst: u32, - offset: u32, + offset: i32, base: u32, width: LoadStoreWidth, }, @@ -232,11 +232,15 @@ const SLTU_FUNC_IDENTIFIER: u32 = 0x3; // | imm | rs1 |funct3| rd |opcode| // |31..20|19..15|14..12|11..7| 6..0 | fn parse_i_instruction(instruction: u32, opcode: Opcode) -> Instruction { - let func7 = (instruction & FUNC7_MASK) >> 25; let func3 = (instruction & FUNC3_MASK) >> 12; - let rs2 = (instruction & RS2_MASK) >> 20; let rs1 = (instruction & RS1_MASK) >> 15; - let mut imm = func7 | rs2; + let imm = ((instruction >> 20) & 0x7ff) as i32; + let mut imm: i32 = if (instruction & 0x8000_0000) != 0 { + imm as i32 - (1 << 11) + } else { + imm as i32 + }; + let rd = (instruction & RD_MASK) >> 7; match opcode { Opcode::ArithImm => { @@ -354,6 +358,11 @@ fn parse_b_instruction(instruction: u32, opcode: Opcode) -> Instruction { fn parse_j_instruction(instruction: u32, opcode: Opcode) -> Instruction { let imm = instruction & 0xff000 | ((instruction & 0x100000) >> 9) | ((instruction >> 20) & 0x7fe); + let imm: i32 = if (instruction & 0x8000_0000) != 0 { + imm as i32 - (1 << 20) + } else { + imm as i32 + }; let rd = (instruction & RD_MASK) >> 7; match opcode { Opcode::JumpAndLink => Instruction::JumpAndLink { From efa652c9b6d6c9ca8119f91e1e2a57e2d91f21d0 Mon Sep 17 00:00:00 2001 From: fmoletta Date: Thu, 11 Dec 2025 10:10:01 -0300 Subject: [PATCH 04/27] fix(dirty): handle mem & register values as i32 + implement missing arithImm operations --- src/vm/execution.rs | 35 ++++++++++++++++++++++------------- 1 file changed, 22 insertions(+), 13 deletions(-) diff --git a/src/vm/execution.rs b/src/vm/execution.rs index c0a800785..5968f696e 100644 --- a/src/vm/execution.rs +++ b/src/vm/execution.rs @@ -5,7 +5,7 @@ use std::{ use crate::vm::instructions::{ArithOp, Comparison, Instruction, LoadStoreWidth}; -pub fn run_program(instruction_map: BTreeMap, entrypoint: u32) -> (u32, u32) { +pub fn run_program(instruction_map: BTreeMap, entrypoint: u32) -> (i32, i32) { let mut memory = Memory::default(); load_program(instruction_map, &mut memory); run_from_entrypoint(&mut memory, entrypoint) @@ -13,17 +13,17 @@ pub fn run_program(instruction_map: BTreeMap, entrypoint: u32) -> (u32 fn load_program(instruction_map: BTreeMap, memory: &mut Memory) { for (addr, instruction) in instruction_map { - memory.0.insert(addr, instruction); + memory.0.insert(addr, instruction as i32); } } -fn run_from_entrypoint(memory: &mut Memory, entrypoint: u32) -> (u32, u32) { +fn run_from_entrypoint(memory: &mut Memory, entrypoint: u32) -> (i32, i32) { let mut pc = entrypoint; let mut registers = Registers::default(); // TODO: find what the starting value should be registers.0[2] = 16; - while pc != registers.0[1] { - let next_instruction = memory.0[&pc]; + while pc as i32 != registers.0[1] { + let next_instruction = memory.0[&pc] as u32; let instruction = Instruction::parse(next_instruction); run_instruction(&instruction, &mut registers, &mut pc, memory); } @@ -35,10 +35,10 @@ fn run_from_entrypoint(memory: &mut Memory, entrypoint: u32) -> (u32, u32) { // Toy Memory, TODO: Make expandable memory #[derive(Default, Debug)] -struct Memory(BTreeMap); +struct Memory(BTreeMap); #[derive(Default, Debug)] -struct Registers([u32; 32]); +struct Registers([i32; 32]); // Registers: // 0x zero // a0-ax function arguments: 0x10 -etc @@ -47,6 +47,7 @@ struct Registers([u32; 32]); impl Display for Registers { fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { writeln!(f, "Registers:")?; + writeln!(f, "Zero(zero): {}", self.0[0])?; writeln!(f, "ReturnAddress(ra): {}", self.0[1])?; writeln!(f, "StackPointer(sp): {}", self.0[2])?; // Not used for now @@ -76,22 +77,30 @@ fn run_instruction( *pc += 4; match inst { Instruction::ArithImm { dst, src, imm, op } => { - let (a, b) = (registers.0[*src as usize] as i32, imm); + let (a, b) = (registers.0[*src as usize], *imm); let res = match op { ArithOp::Add => a + b, - _ => unimplemented!(), + ArithOp::Sub => panic!("SubImm not supported"), + ArithOp::Xor => a ^ b, + ArithOp::Or => a | b, + ArithOp::And => a & b, + ArithOp::ShiftLeftLogical => a << b, + ArithOp::ShiftRightLogical => a >> b, + ArithOp::ShiftRightArith => a >> b, + ArithOp::SetLessThan => ((a as i32) < b) as i32, + ArithOp::SetLessThanU => ((a as u32) < (b as u32)) as i32, }; - registers.0[*dst as usize] = res as u32; + registers.0[*dst as usize] = res; } Instruction::JumpAndLinkRegister { dst, base, offset } => { if *dst != 0 { - registers.0[*dst as usize] = *pc; + registers.0[*dst as usize] = *pc as i32; } *pc = (registers.0[*base as usize] as i32 + offset) as u32; } Instruction::JumpAndLink { dst, offset } => { if *dst != 0 { - registers.0[*dst as usize] = *pc; + registers.0[*dst as usize] = *pc as i32; } *pc -= 4; *pc = (*pc as i32 + offset) as u32; @@ -110,7 +119,7 @@ fn run_instruction( }; memory .0 - .insert((registers.0[*base as usize] + *offset), value); + .insert(registers.0[*base as usize] as u32 + *offset, value); } Instruction::Load { dst, From 2e418d1357f7fc1920a6879b209913cf2a32ebaa Mon Sep 17 00:00:00 2001 From: fmoletta Date: Thu, 11 Dec 2025 10:14:25 -0300 Subject: [PATCH 05/27] clipppy --- src/vm/execution.rs | 6 +++--- src/vm/instructions.rs | 4 ++-- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/src/vm/execution.rs b/src/vm/execution.rs index 5968f696e..5041e63e1 100644 --- a/src/vm/execution.rs +++ b/src/vm/execution.rs @@ -87,7 +87,7 @@ fn run_instruction( ArithOp::ShiftLeftLogical => a << b, ArithOp::ShiftRightLogical => a >> b, ArithOp::ShiftRightArith => a >> b, - ArithOp::SetLessThan => ((a as i32) < b) as i32, + ArithOp::SetLessThan => (a < b) as i32, ArithOp::SetLessThanU => ((a as u32) < (b as u32)) as i32, }; registers.0[*dst as usize] = res; @@ -96,7 +96,7 @@ fn run_instruction( if *dst != 0 { registers.0[*dst as usize] = *pc as i32; } - *pc = (registers.0[*base as usize] as i32 + offset) as u32; + *pc = (registers.0[*base as usize] + offset) as u32; } Instruction::JumpAndLink { dst, offset } => { if *dst != 0 { @@ -127,7 +127,7 @@ fn run_instruction( base, width, } => { - let value = memory.0[&((registers.0[*base as usize] as i32 + *offset) as u32)]; + let value = memory.0[&((registers.0[*base as usize] + *offset) as u32)]; let value = match width { LoadStoreWidth::Byte => todo!(), LoadStoreWidth::Half => todo!(), diff --git a/src/vm/instructions.rs b/src/vm/instructions.rs index cd2b9f0e3..252ac0d55 100644 --- a/src/vm/instructions.rs +++ b/src/vm/instructions.rs @@ -236,9 +236,9 @@ fn parse_i_instruction(instruction: u32, opcode: Opcode) -> Instruction { let rs1 = (instruction & RS1_MASK) >> 15; let imm = ((instruction >> 20) & 0x7ff) as i32; let mut imm: i32 = if (instruction & 0x8000_0000) != 0 { - imm as i32 - (1 << 11) + imm - (1 << 11) } else { - imm as i32 + imm }; let rd = (instruction & RD_MASK) >> 7; From 3154d0fbaee0df5ca25ff21134b1bdcd26deab66 Mon Sep 17 00:00:00 2001 From: Gianbelinche <39842759+gianbelinche@users.noreply.github.com> Date: Thu, 11 Dec 2025 11:07:06 -0300 Subject: [PATCH 06/27] Move inside workspace --- .gitignore | 3 +- Cargo.lock | 4 + Cargo.toml | 14 +- null-vm/.gitignore | 2 + null-vm/Cargo.lock | 169 ++++++++++++++++++ null-vm/Cargo.toml | 9 + Makefile => null-vm/Makefile | 0 .../programs}/asm/basic_program.s | 0 .../programs}/rust/basic_rust/Cargo.lock | 0 .../programs}/rust/basic_rust/Cargo.toml | 2 + .../programs}/rust/basic_rust/src/main.rs | 0 {src => null-vm/src}/elf.rs | 0 {src => null-vm/src}/lib.rs | 0 {src => null-vm/src}/main.rs | 0 {src => null-vm/src}/vm/execution.rs | 0 {src => null-vm/src}/vm/instructions.rs | 0 {src => null-vm/src}/vm/mod.rs | 0 {tests => null-vm/tests}/asm.rs | 0 {tests => null-vm/tests}/rust.rs | 0 riscv-prover/Cargo.toml | 6 + riscv-prover/src/main.rs | 3 + 21 files changed, 201 insertions(+), 11 deletions(-) create mode 100644 null-vm/.gitignore create mode 100644 null-vm/Cargo.lock create mode 100644 null-vm/Cargo.toml rename Makefile => null-vm/Makefile (100%) rename {programs => null-vm/programs}/asm/basic_program.s (100%) rename {programs => null-vm/programs}/rust/basic_rust/Cargo.lock (100%) rename {programs => null-vm/programs}/rust/basic_rust/Cargo.toml (86%) rename {programs => null-vm/programs}/rust/basic_rust/src/main.rs (100%) rename {src => null-vm/src}/elf.rs (100%) rename {src => null-vm/src}/lib.rs (100%) rename {src => null-vm/src}/main.rs (100%) rename {src => null-vm/src}/vm/execution.rs (100%) rename {src => null-vm/src}/vm/instructions.rs (100%) rename {src => null-vm/src}/vm/mod.rs (100%) rename {tests => null-vm/tests}/asm.rs (100%) rename {tests => null-vm/tests}/rust.rs (100%) create mode 100644 riscv-prover/Cargo.toml create mode 100644 riscv-prover/src/main.rs diff --git a/.gitignore b/.gitignore index 361f8f81a..2f7896d1d 100644 --- a/.gitignore +++ b/.gitignore @@ -1,2 +1 @@ -/target -/program_artifacts +target/ diff --git a/Cargo.lock b/Cargo.lock index ec257c825..ff5d0eacd 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -76,6 +76,10 @@ dependencies = [ "proc-macro2", ] +[[package]] +name = "riscv-prover" +version = "0.1.0" + [[package]] name = "serde" version = "1.0.228" diff --git a/Cargo.toml b/Cargo.toml index deea1b4bd..8df724463 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -1,9 +1,5 @@ -[package] -name = "null-vm" -version = "0.1.0" -edition = "2024" - -[dependencies] -elf = "0.7.4" -hashbrown = { version = "0.14.5", features = ["serde", "inline-more"] } -thiserror = "1.0.68" +[workspace] +members = [ + "null-vm", + "riscv-prover", +] diff --git a/null-vm/.gitignore b/null-vm/.gitignore new file mode 100644 index 000000000..361f8f81a --- /dev/null +++ b/null-vm/.gitignore @@ -0,0 +1,2 @@ +/target +/program_artifacts diff --git a/null-vm/Cargo.lock b/null-vm/Cargo.lock new file mode 100644 index 000000000..ec257c825 --- /dev/null +++ b/null-vm/Cargo.lock @@ -0,0 +1,169 @@ +# This file is automatically @generated by Cargo. +# It is not intended for manual editing. +version = 4 + +[[package]] +name = "ahash" +version = "0.8.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5a15f179cd60c4584b8a8c596927aadc462e27f2ca70c04e0071964a73ba7a75" +dependencies = [ + "cfg-if", + "once_cell", + "version_check", + "zerocopy", +] + +[[package]] +name = "allocator-api2" +version = "0.2.21" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "683d7910e743518b0e34f1186f92494becacb047c7b6bf616c96772180fef923" + +[[package]] +name = "cfg-if" +version = "1.0.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9330f8b2ff13f34540b44e946ef35111825727b38d33286ef986142615121801" + +[[package]] +name = "elf" +version = "0.7.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4445909572dbd556c457c849c4ca58623d84b27c8fff1e74b0b4227d8b90d17b" + +[[package]] +name = "hashbrown" +version = "0.14.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e5274423e17b7c9fc20b6e7e208532f9b19825d82dfd615708b70edd83df41f1" +dependencies = [ + "ahash", + "allocator-api2", + "serde", +] + +[[package]] +name = "null-vm" +version = "0.1.0" +dependencies = [ + "elf", + "hashbrown", + "thiserror", +] + +[[package]] +name = "once_cell" +version = "1.21.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "42f5e15c9953c5e4ccceeb2e7382a716482c34515315f7b03532b8b4e8393d2d" + +[[package]] +name = "proc-macro2" +version = "1.0.103" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5ee95bc4ef87b8d5ba32e8b7714ccc834865276eab0aed5c9958d00ec45f49e8" +dependencies = [ + "unicode-ident", +] + +[[package]] +name = "quote" +version = "1.0.42" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a338cc41d27e6cc6dce6cefc13a0729dfbb81c262b1f519331575dd80ef3067f" +dependencies = [ + "proc-macro2", +] + +[[package]] +name = "serde" +version = "1.0.228" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9a8e94ea7f378bd32cbbd37198a4a91436180c5bb472411e48b5ec2e2124ae9e" +dependencies = [ + "serde_core", +] + +[[package]] +name = "serde_core" +version = "1.0.228" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "41d385c7d4ca58e59fc732af25c3983b67ac852c1a25000afe1175de458b67ad" +dependencies = [ + "serde_derive", +] + +[[package]] +name = "serde_derive" +version = "1.0.228" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d540f220d3187173da220f885ab66608367b6574e925011a9353e4badda91d79" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "syn" +version = "2.0.111" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "390cc9a294ab71bdb1aa2e99d13be9c753cd2d7bd6560c77118597410c4d2e87" +dependencies = [ + "proc-macro2", + "quote", + "unicode-ident", +] + +[[package]] +name = "thiserror" +version = "1.0.69" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b6aaf5339b578ea85b50e080feb250a3e8ae8cfcdff9a461c9ec2904bc923f52" +dependencies = [ + "thiserror-impl", +] + +[[package]] +name = "thiserror-impl" +version = "1.0.69" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4fee6c4efc90059e10f81e6d42c60a18f76588c3d74cb83a0b242a2b6c7504c1" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "unicode-ident" +version = "1.0.22" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9312f7c4f6ff9069b165498234ce8be658059c6728633667c526e27dc2cf1df5" + +[[package]] +name = "version_check" +version = "0.9.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0b928f33d975fc6ad9f86c8f283853ad26bdd5b10b7f1542aa2fa15e2289105a" + +[[package]] +name = "zerocopy" +version = "0.8.31" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fd74ec98b9250adb3ca554bdde269adf631549f51d8a8f8f0a10b50f1cb298c3" +dependencies = [ + "zerocopy-derive", +] + +[[package]] +name = "zerocopy-derive" +version = "0.8.31" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d8a8d209fdf45cf5138cbb5a506f6b52522a25afccc534d1475dad8e31105c6a" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] diff --git a/null-vm/Cargo.toml b/null-vm/Cargo.toml new file mode 100644 index 000000000..deea1b4bd --- /dev/null +++ b/null-vm/Cargo.toml @@ -0,0 +1,9 @@ +[package] +name = "null-vm" +version = "0.1.0" +edition = "2024" + +[dependencies] +elf = "0.7.4" +hashbrown = { version = "0.14.5", features = ["serde", "inline-more"] } +thiserror = "1.0.68" diff --git a/Makefile b/null-vm/Makefile similarity index 100% rename from Makefile rename to null-vm/Makefile diff --git a/programs/asm/basic_program.s b/null-vm/programs/asm/basic_program.s similarity index 100% rename from programs/asm/basic_program.s rename to null-vm/programs/asm/basic_program.s diff --git a/programs/rust/basic_rust/Cargo.lock b/null-vm/programs/rust/basic_rust/Cargo.lock similarity index 100% rename from programs/rust/basic_rust/Cargo.lock rename to null-vm/programs/rust/basic_rust/Cargo.lock diff --git a/programs/rust/basic_rust/Cargo.toml b/null-vm/programs/rust/basic_rust/Cargo.toml similarity index 86% rename from programs/rust/basic_rust/Cargo.toml rename to null-vm/programs/rust/basic_rust/Cargo.toml index ad1faaaaf..78207ee92 100644 --- a/programs/rust/basic_rust/Cargo.toml +++ b/null-vm/programs/rust/basic_rust/Cargo.toml @@ -1,3 +1,5 @@ +[workspace] + [package] name = "basic_rust" version = "0.1.0" diff --git a/programs/rust/basic_rust/src/main.rs b/null-vm/programs/rust/basic_rust/src/main.rs similarity index 100% rename from programs/rust/basic_rust/src/main.rs rename to null-vm/programs/rust/basic_rust/src/main.rs diff --git a/src/elf.rs b/null-vm/src/elf.rs similarity index 100% rename from src/elf.rs rename to null-vm/src/elf.rs diff --git a/src/lib.rs b/null-vm/src/lib.rs similarity index 100% rename from src/lib.rs rename to null-vm/src/lib.rs diff --git a/src/main.rs b/null-vm/src/main.rs similarity index 100% rename from src/main.rs rename to null-vm/src/main.rs diff --git a/src/vm/execution.rs b/null-vm/src/vm/execution.rs similarity index 100% rename from src/vm/execution.rs rename to null-vm/src/vm/execution.rs diff --git a/src/vm/instructions.rs b/null-vm/src/vm/instructions.rs similarity index 100% rename from src/vm/instructions.rs rename to null-vm/src/vm/instructions.rs diff --git a/src/vm/mod.rs b/null-vm/src/vm/mod.rs similarity index 100% rename from src/vm/mod.rs rename to null-vm/src/vm/mod.rs diff --git a/tests/asm.rs b/null-vm/tests/asm.rs similarity index 100% rename from tests/asm.rs rename to null-vm/tests/asm.rs diff --git a/tests/rust.rs b/null-vm/tests/rust.rs similarity index 100% rename from tests/rust.rs rename to null-vm/tests/rust.rs diff --git a/riscv-prover/Cargo.toml b/riscv-prover/Cargo.toml new file mode 100644 index 000000000..399ff055e --- /dev/null +++ b/riscv-prover/Cargo.toml @@ -0,0 +1,6 @@ +[package] +name = "riscv-prover" +version = "0.1.0" +edition = "2024" + +[dependencies] diff --git a/riscv-prover/src/main.rs b/riscv-prover/src/main.rs new file mode 100644 index 000000000..e7a11a969 --- /dev/null +++ b/riscv-prover/src/main.rs @@ -0,0 +1,3 @@ +fn main() { + println!("Hello, world!"); +} From d99b6ca32eed7437f0fd54808d455aae22b908b6 Mon Sep 17 00:00:00 2001 From: Gianbelinche <39842759+gianbelinche@users.noreply.github.com> Date: Thu, 11 Dec 2025 12:24:46 -0300 Subject: [PATCH 07/27] Add addi tests --- null-vm/programs/asm/addi_max.s | 8 ++ null-vm/programs/asm/addi_min.s | 8 ++ null-vm/programs/asm/addi_minus_one.s | 8 ++ null-vm/programs/asm/addi_one.s | 8 ++ null-vm/programs/asm/addi_reg.s | 9 +++ null-vm/programs/asm/addi_reg_max.s | 9 +++ null-vm/programs/asm/addi_reg_min.s | 9 +++ null-vm/tests/asm.rs | 112 ++++++++++++++++++++++++++ 8 files changed, 171 insertions(+) create mode 100644 null-vm/programs/asm/addi_max.s create mode 100644 null-vm/programs/asm/addi_min.s create mode 100644 null-vm/programs/asm/addi_minus_one.s create mode 100644 null-vm/programs/asm/addi_one.s create mode 100644 null-vm/programs/asm/addi_reg.s create mode 100644 null-vm/programs/asm/addi_reg_max.s create mode 100644 null-vm/programs/asm/addi_reg_min.s diff --git a/null-vm/programs/asm/addi_max.s b/null-vm/programs/asm/addi_max.s new file mode 100644 index 000000000..4931d2547 --- /dev/null +++ b/null-vm/programs/asm/addi_max.s @@ -0,0 +1,8 @@ + .attribute 5, "rv32i2p1_m2p0_zmmul1p0" +.Lfunc_end0: + .globl main +main: + addi a0, zero, 2047 + jalr zero, 0(ra) +.Lfunc_end1: + .size main, .Lfunc_end1-main diff --git a/null-vm/programs/asm/addi_min.s b/null-vm/programs/asm/addi_min.s new file mode 100644 index 000000000..c1afcb5ac --- /dev/null +++ b/null-vm/programs/asm/addi_min.s @@ -0,0 +1,8 @@ + .attribute 5, "rv32i2p1_m2p0_zmmul1p0" +.Lfunc_end0: + .globl main +main: + addi a0, zero, -2048 + jalr zero, 0(ra) +.Lfunc_end1: + .size main, .Lfunc_end1-main diff --git a/null-vm/programs/asm/addi_minus_one.s b/null-vm/programs/asm/addi_minus_one.s new file mode 100644 index 000000000..aee9dc82e --- /dev/null +++ b/null-vm/programs/asm/addi_minus_one.s @@ -0,0 +1,8 @@ + .attribute 5, "rv32i2p1_m2p0_zmmul1p0" +.Lfunc_end0: + .globl main +main: + addi a0, zero, -1 + jalr zero, 0(ra) +.Lfunc_end1: + .size main, .Lfunc_end1-main diff --git a/null-vm/programs/asm/addi_one.s b/null-vm/programs/asm/addi_one.s new file mode 100644 index 000000000..98dfaf2bc --- /dev/null +++ b/null-vm/programs/asm/addi_one.s @@ -0,0 +1,8 @@ + .attribute 5, "rv32i2p1_m2p0_zmmul1p0" +.Lfunc_end0: + .globl main +main: + addi a0, zero, 1 + jalr zero, 0(ra) +.Lfunc_end1: + .size main, .Lfunc_end1-main diff --git a/null-vm/programs/asm/addi_reg.s b/null-vm/programs/asm/addi_reg.s new file mode 100644 index 000000000..3e74d7be1 --- /dev/null +++ b/null-vm/programs/asm/addi_reg.s @@ -0,0 +1,9 @@ + .attribute 5, "rv32i2p1_m2p0_zmmul1p0" +.Lfunc_end0: + .globl main +main: + addi a2, zero, 10 + addi a0, a2, 20 + jalr zero, 0(ra) +.Lfunc_end1: + .size main, .Lfunc_end1-main diff --git a/null-vm/programs/asm/addi_reg_max.s b/null-vm/programs/asm/addi_reg_max.s new file mode 100644 index 000000000..0be5e0f02 --- /dev/null +++ b/null-vm/programs/asm/addi_reg_max.s @@ -0,0 +1,9 @@ + .attribute 5, "rv32i2p1_m2p0_zmmul1p0" +.Lfunc_end0: + .globl main +main: + addi a2, zero, 2047 + addi a0, a2, 33 + jalr zero, 0(ra) +.Lfunc_end1: + .size main, .Lfunc_end1-main diff --git a/null-vm/programs/asm/addi_reg_min.s b/null-vm/programs/asm/addi_reg_min.s new file mode 100644 index 000000000..b61156f09 --- /dev/null +++ b/null-vm/programs/asm/addi_reg_min.s @@ -0,0 +1,9 @@ + .attribute 5, "rv32i2p1_m2p0_zmmul1p0" +.Lfunc_end0: + .globl main +main: + addi a2, zero, -2048 + addi a0, a2, -22 + jalr zero, 0(ra) +.Lfunc_end1: + .size main, .Lfunc_end1-main diff --git a/null-vm/tests/asm.rs b/null-vm/tests/asm.rs index b98669a96..442ce3c69 100644 --- a/null-vm/tests/asm.rs +++ b/null-vm/tests/asm.rs @@ -13,3 +13,115 @@ fn test_basic_program() { assert!(results.0 == 0); } + +#[test] +fn test_addi_one() { + println!("Testing addi_one.elf"); + let elf_data = std::fs::read("./program_artifacts/asm/addi_one.elf").unwrap(); + let program = Elf::load(&elf_data).unwrap(); + println!("Program entry: 0x{:08x}", program.entry_point); + program.image.iter().for_each(|(addr, word)| { + println!("0x{:08x}: 0x{:08x}", addr, word); + }); + let results = run_program(program.image, program.entry_point); + + assert!(results.0 == 1); +} + +#[test] +fn test_addi_minus_one() { + println!("Testing addi_minus_one.elf"); + let elf_data = std::fs::read("./program_artifacts/asm/addi_minus_one.elf").unwrap(); + let program = Elf::load(&elf_data).unwrap(); + println!("Program entry: 0x{:08x}", program.entry_point); + program.image.iter().for_each(|(addr, word)| { + println!("0x{:08x}: 0x{:08x}", addr, word); + }); + let results = run_program(program.image, program.entry_point); + + assert!(results.0 == -1); +} + +#[test] +fn test_addi_max() { + println!("Testing addi_max.elf"); + let elf_data = std::fs::read("./program_artifacts/asm/addi_max.elf").unwrap(); + let program = Elf::load(&elf_data).unwrap(); + println!("Program entry: 0x{:08x}", program.entry_point); + program.image.iter().for_each(|(addr, word)| { + println!("0x{:08x}: 0x{:08x}", addr, word); + }); + let results = run_program(program.image, program.entry_point); + + assert!(results.0 == 2047); +} + +#[test] +fn test_addi_min() { + println!("Testing addi_min.elf"); + let elf_data = std::fs::read("./program_artifacts/asm/addi_min.elf").unwrap(); + let program = Elf::load(&elf_data).unwrap(); + println!("Program entry: 0x{:08x}", program.entry_point); + program.image.iter().for_each(|(addr, word)| { + println!("0x{:08x}: 0x{:08x}", addr, word); + }); + let results = run_program(program.image, program.entry_point); + + assert!(results.0 == -2048); +} + +#[test] +fn test_addi_reg() { + println!("Testing addi_reg.elf"); + let elf_data = std::fs::read("./program_artifacts/asm/addi_reg.elf").unwrap(); + let program = Elf::load(&elf_data).unwrap(); + println!("Program entry: 0x{:08x}", program.entry_point); + program.image.iter().for_each(|(addr, word)| { + println!("0x{:08x}: 0x{:08x}", addr, word); + }); + let results = run_program(program.image, program.entry_point); + + assert!(results.0 == 30); +} + +#[test] +fn test_addi_reg_max() { + println!("Testing addi_reg_max.elf"); + let elf_data = std::fs::read("./program_artifacts/asm/addi_reg_max.elf").unwrap(); + let program = Elf::load(&elf_data).unwrap(); + println!("Program entry: 0x{:08x}", program.entry_point); + program.image.iter().for_each(|(addr, word)| { + println!("0x{:08x}: 0x{:08x}", addr, word); + }); + let results = run_program(program.image, program.entry_point); + + assert!(results.0 == 2080); +} + +#[test] +fn test_addi_reg_min() { + println!("Testing addi_reg_min.elf"); + let elf_data = std::fs::read("./program_artifacts/asm/addi_reg_min.elf").unwrap(); + let program = Elf::load(&elf_data).unwrap(); + println!("Program entry: 0x{:08x}", program.entry_point); + program.image.iter().for_each(|(addr, word)| { + println!("0x{:08x}: 0x{:08x}", addr, word); + }); + let results = run_program(program.image, program.entry_point); + + assert!(results.0 == -2070); +} + +#[test] +fn test_add() { + println!("Testing add.elf"); + let elf_data = std::fs::read("./program_artifacts/asm/add.elf").unwrap(); + let program = Elf::load(&elf_data).unwrap(); + println!("Program entry: 0x{:08x}", program.entry_point); + program.image.iter().for_each(|(addr, word)| { + println!("0x{:08x}: 0x{:08x}", addr, word); + }); + let results = run_program(program.image, program.entry_point); + + assert!(results.0 == 30); +} From 4333a9a14ba753c71de047a652eb5ec4c7d38fa3 Mon Sep 17 00:00:00 2001 From: Gianbelinche <39842759+gianbelinche@users.noreply.github.com> Date: Thu, 11 Dec 2025 14:00:43 -0300 Subject: [PATCH 08/27] Add add tests --- null-vm/programs/asm/add.s | 10 ++++ null-vm/programs/asm/add_max.s | 30 ++++++++++ null-vm/programs/asm/add_max_plus_one.s | 31 +++++++++++ null-vm/programs/asm/add_min.s | 30 ++++++++++ null-vm/programs/asm/add_min_minus_one.s | 31 +++++++++++ null-vm/programs/asm/add_neg.s | 10 ++++ null-vm/src/vm/execution.rs | 18 +++++- null-vm/tests/asm.rs | 70 ++++++++++++++++++++++++ 8 files changed, 229 insertions(+), 1 deletion(-) create mode 100644 null-vm/programs/asm/add.s create mode 100644 null-vm/programs/asm/add_max.s create mode 100644 null-vm/programs/asm/add_max_plus_one.s create mode 100644 null-vm/programs/asm/add_min.s create mode 100644 null-vm/programs/asm/add_min_minus_one.s create mode 100644 null-vm/programs/asm/add_neg.s diff --git a/null-vm/programs/asm/add.s b/null-vm/programs/asm/add.s new file mode 100644 index 000000000..f20b31bcb --- /dev/null +++ b/null-vm/programs/asm/add.s @@ -0,0 +1,10 @@ + .attribute 5, "rv32i2p1_m2p0_zmmul1p0" +.Lfunc_end0: + .globl main +main: + addi a2, zero, 10 + addi a3, zero, 20 + add a0, a2, a3 + jalr zero, 0(ra) +.Lfunc_end1: + .size main, .Lfunc_end1-main diff --git a/null-vm/programs/asm/add_max.s b/null-vm/programs/asm/add_max.s new file mode 100644 index 000000000..b250980b4 --- /dev/null +++ b/null-vm/programs/asm/add_max.s @@ -0,0 +1,30 @@ + .attribute 5, "rv32i2p1_m2p0_zmmul1p0" +.Lfunc_end0: + .globl main +main: + addi a2, zero, 2047 # 2_047 + add a2, a2, a2 # 4_094 + add a2, a2, a2 # 8_188 + add a2, a2, a2 # 16_376 + add a2, a2, a2 # 32_752 + add a2, a2, a2 # 65_504 + add a2, a2, a2 # 131_008 + add a2, a2, a2 # 262_016 + add a2, a2, a2 # 524_032 + add a3, a2, a2 # 1_048_064 + add a2, a3, a3 # 2_096_128 + add a2, a2, a2 # 4_192_256 + add a2, a2, a2 # 8_384_512 + add a2, a2, a2 # 16_769_024 + add a2, a2, a2 # 33_538_048 + add a2, a2, a2 # 67_076_096 + add a2, a2, a2 # 134_152_192 + add a2, a2, a2 # 268_304_384 + add a2, a2, a2 # 536_608_768 + add a2, a2, a2 # 1_073_217_536 + add a2, a2, a2 # 2_146_435_072 + add a2, a2, a3 # 2_147_483_136 + addi a0, a2, 511 # 2_147_483_647 + jalr zero, 0(ra) +.Lfunc_end1: + .size main, .Lfunc_end1-main diff --git a/null-vm/programs/asm/add_max_plus_one.s b/null-vm/programs/asm/add_max_plus_one.s new file mode 100644 index 000000000..0a6b5e152 --- /dev/null +++ b/null-vm/programs/asm/add_max_plus_one.s @@ -0,0 +1,31 @@ + .attribute 5, "rv32i2p1_m2p0_zmmul1p0" +.Lfunc_end0: + .globl main +main: + addi a2, zero, 2047 # 2_047 + add a2, a2, a2 # 4_094 + add a2, a2, a2 # 8_188 + add a2, a2, a2 # 16_376 + add a2, a2, a2 # 32_752 + add a2, a2, a2 # 65_504 + add a2, a2, a2 # 131_008 + add a2, a2, a2 # 262_016 + add a2, a2, a2 # 524_032 + add a3, a2, a2 # 1_048_064 + add a2, a3, a3 # 2_096_128 + add a2, a2, a2 # 4_192_256 + add a2, a2, a2 # 8_384_512 + add a2, a2, a2 # 16_769_024 + add a2, a2, a2 # 33_538_048 + add a2, a2, a2 # 67_076_096 + add a2, a2, a2 # 134_152_192 + add a2, a2, a2 # 268_304_384 + add a2, a2, a2 # 536_608_768 + add a2, a2, a2 # 1_073_217_536 + add a2, a2, a2 # 2_146_435_072 + add a2, a2, a3 # 2_147_483_136 + addi a0, a2, 511 # 2_147_483_647 + addi a0, a0, 1 # -2_147_483_648 (overflow) + jalr zero, 0(ra) +.Lfunc_end1: + .size main, .Lfunc_end1-main diff --git a/null-vm/programs/asm/add_min.s b/null-vm/programs/asm/add_min.s new file mode 100644 index 000000000..14fbeb7da --- /dev/null +++ b/null-vm/programs/asm/add_min.s @@ -0,0 +1,30 @@ + .attribute 5, "rv32i2p1_m2p0_zmmul1p0" +.Lfunc_end0: + .globl main +main: + addi a2, zero, -2047 # -2_047 + add a2, a2, a2 # -4_094 + add a2, a2, a2 # -8_188 + add a2, a2, a2 # -16_376 + add a2, a2, a2 # -32_752 + add a2, a2, a2 # -65_504 + add a2, a2, a2 # -131_008 + add a2, a2, a2 # -262_016 + add a2, a2, a2 # -524_032 + add a3, a2, a2 # -1_048_064 + add a2, a3, a3 # -2_096_128 + add a2, a2, a2 # -4_192_256 + add a2, a2, a2 # -8_384_512 + add a2, a2, a2 # -16_769_024 + add a2, a2, a2 # -33_538_048 + add a2, a2, a2 # -67_076_096 + add a2, a2, a2 # -134_152_192 + add a2, a2, a2 # -268_304_384 + add a2, a2, a2 # -536_608_768 + add a2, a2, a2 # -1_073_217_536 + add a2, a2, a2 # -2_146_435_072 + add a2, a2, a3 # -2_147_483_136 + addi a0, a2, -512 # -2_147_483_648 + jalr zero, 0(ra) +.Lfunc_end1: + .size main, .Lfunc_end1-main diff --git a/null-vm/programs/asm/add_min_minus_one.s b/null-vm/programs/asm/add_min_minus_one.s new file mode 100644 index 000000000..5638b6fd3 --- /dev/null +++ b/null-vm/programs/asm/add_min_minus_one.s @@ -0,0 +1,31 @@ + .attribute 5, "rv32i2p1_m2p0_zmmul1p0" +.Lfunc_end0: + .globl main +main: + addi a2, zero, -2047 # -2_047 + add a2, a2, a2 # -4_094 + add a2, a2, a2 # -8_188 + add a2, a2, a2 # -16_376 + add a2, a2, a2 # -32_752 + add a2, a2, a2 # -65_504 + add a2, a2, a2 # -131_008 + add a2, a2, a2 # -262_016 + add a2, a2, a2 # -524_032 + add a3, a2, a2 # -1_048_064 + add a2, a3, a3 # -2_096_128 + add a2, a2, a2 # -4_192_256 + add a2, a2, a2 # -8_384_512 + add a2, a2, a2 # -16_769_024 + add a2, a2, a2 # -33_538_048 + add a2, a2, a2 # -67_076_096 + add a2, a2, a2 # -134_152_192 + add a2, a2, a2 # -268_304_384 + add a2, a2, a2 # -536_608_768 + add a2, a2, a2 # -1_073_217_536 + add a2, a2, a2 # -2_146_435_072 + add a2, a2, a3 # -2_147_483_136 + addi a0, a2, -512 # -2_147_483_648 + addi a0, a0, -1 # 2_147_483_647 (overflow) + jalr zero, 0(ra) +.Lfunc_end1: + .size main, .Lfunc_end1-main diff --git a/null-vm/programs/asm/add_neg.s b/null-vm/programs/asm/add_neg.s new file mode 100644 index 000000000..c20fc5edd --- /dev/null +++ b/null-vm/programs/asm/add_neg.s @@ -0,0 +1,10 @@ + .attribute 5, "rv32i2p1_m2p0_zmmul1p0" +.Lfunc_end0: + .globl main +main: + addi a2, zero, -10 + addi a3, zero, 20 + add a0, a2, a3 + jalr zero, 0(ra) +.Lfunc_end1: + .size main, .Lfunc_end1-main diff --git a/null-vm/src/vm/execution.rs b/null-vm/src/vm/execution.rs index 5041e63e1..b7162d60a 100644 --- a/null-vm/src/vm/execution.rs +++ b/null-vm/src/vm/execution.rs @@ -79,7 +79,7 @@ fn run_instruction( Instruction::ArithImm { dst, src, imm, op } => { let (a, b) = (registers.0[*src as usize], *imm); let res = match op { - ArithOp::Add => a + b, + ArithOp::Add => a.wrapping_add(b), ArithOp::Sub => panic!("SubImm not supported"), ArithOp::Xor => a ^ b, ArithOp::Or => a | b, @@ -152,6 +152,22 @@ fn run_instruction( *pc += offset } } + Instruction::Arith { dst, src1, src2, op } => { + let (a, b) = (registers.0[*src1 as usize], registers.0[*src2 as usize]); + let res = match op { + ArithOp::Add => a.wrapping_add(b), + ArithOp::Sub => a - b, + ArithOp::Xor => a ^ b, + ArithOp::Or => a | b, + ArithOp::And => a & b, + ArithOp::ShiftLeftLogical => a << b, + ArithOp::ShiftRightLogical => ((a as u32) >> (b as u32)) as i32, + ArithOp::ShiftRightArith => a >> b, + ArithOp::SetLessThan => (a < b) as i32, + ArithOp::SetLessThanU => ((a as u32) < (b as u32)) as i32, + }; + registers.0[*dst as usize] = res; + } _ => unimplemented!(), } } diff --git a/null-vm/tests/asm.rs b/null-vm/tests/asm.rs index 442ce3c69..36b56c98e 100644 --- a/null-vm/tests/asm.rs +++ b/null-vm/tests/asm.rs @@ -125,3 +125,73 @@ fn test_add() { assert!(results.0 == 30); } + +#[test] +fn test_add_neg() { + println!("Testing add_neg.elf"); + let elf_data = std::fs::read("./program_artifacts/asm/add_neg.elf").unwrap(); + let program = Elf::load(&elf_data).unwrap(); + println!("Program entry: 0x{:08x}", program.entry_point); + program.image.iter().for_each(|(addr, word)| { + println!("0x{:08x}: 0x{:08x}", addr, word); + }); + let results = run_program(program.image, program.entry_point); + + assert!(results.0 == 10); +} + +#[test] +fn test_add_max() { + println!("Testing add_max.elf"); + let elf_data = std::fs::read("./program_artifacts/asm/add_max.elf").unwrap(); + let program = Elf::load(&elf_data).unwrap(); + println!("Program entry: 0x{:08x}", program.entry_point); + program.image.iter().for_each(|(addr, word)| { + println!("0x{:08x}: 0x{:08x}", addr, word); + }); + let results = run_program(program.image, program.entry_point); + + assert!(results.0 == i32::MAX); +} + +#[test] +fn test_add_max_plus_one() { + println!("Testing add_plus_one.elf"); + let elf_data = std::fs::read("./program_artifacts/asm/add_max_plus_one.elf").unwrap(); + let program = Elf::load(&elf_data).unwrap(); + println!("Program entry: 0x{:08x}", program.entry_point); + program.image.iter().for_each(|(addr, word)| { + println!("0x{:08x}: 0x{:08x}", addr, word); + }); + let results = run_program(program.image, program.entry_point); + + assert!(results.0 == i32::MIN); +} + +#[test] +fn test_add_min() { + println!("Testing add_min.elf"); + let elf_data = std::fs::read("./program_artifacts/asm/add_min.elf").unwrap(); + let program = Elf::load(&elf_data).unwrap(); + println!("Program entry: 0x{:08x}", program.entry_point); + program.image.iter().for_each(|(addr, word)| { + println!("0x{:08x}: 0x{:08x}", addr, word); + }); + let results = run_program(program.image, program.entry_point); + + assert!(results.0 == i32::MIN); +} + +#[test] +fn test_add_min_minus_one() { + println!("Testing add_min_minus_one.elf"); + let elf_data = std::fs::read("./program_artifacts/asm/add_min_minus_one.elf").unwrap(); + let program = Elf::load(&elf_data).unwrap(); + println!("Program entry: 0x{:08x}", program.entry_point); + program.image.iter().for_each(|(addr, word)| { + println!("0x{:08x}: 0x{:08x}", addr, word); + }); + let results = run_program(program.image, program.entry_point); + + assert!(results.0 == i32::MAX); +} From ac54b8720bb330a5b3994e8b712d2e41b4519fd8 Mon Sep 17 00:00:00 2001 From: Gianbelinche <39842759+gianbelinche@users.noreply.github.com> Date: Thu, 11 Dec 2025 14:05:43 -0300 Subject: [PATCH 09/27] Refactor tests --- null-vm/tests/asm.rs | 160 +++++++------------------------------------ 1 file changed, 25 insertions(+), 135 deletions(-) diff --git a/null-vm/tests/asm.rs b/null-vm/tests/asm.rs index 36b56c98e..eb181bb6e 100644 --- a/null-vm/tests/asm.rs +++ b/null-vm/tests/asm.rs @@ -1,9 +1,8 @@ use null_vm::{elf::Elf, vm::execution::run_program}; -#[test] -fn test_basic_program() { - println!("Testing basic_program.elf"); - let elf_data = std::fs::read("./program_artifacts/asm/basic_program.elf").unwrap(); +fn run_program_and_check_output(elf_path: &str, expected_output: i32) { + println!("Testing {}", elf_path); + let elf_data = std::fs::read(elf_path).unwrap(); let program = Elf::load(&elf_data).unwrap(); println!("Program entry: 0x{:08x}", program.entry_point); program.image.iter().for_each(|(addr, word)| { @@ -11,187 +10,78 @@ fn test_basic_program() { }); let results = run_program(program.image, program.entry_point); - assert!(results.0 == 0); + assert!(results.0 == expected_output); } #[test] -fn test_addi_one() { - println!("Testing addi_one.elf"); - let elf_data = std::fs::read("./program_artifacts/asm/addi_one.elf").unwrap(); - let program = Elf::load(&elf_data).unwrap(); - println!("Program entry: 0x{:08x}", program.entry_point); - program.image.iter().for_each(|(addr, word)| { - println!("0x{:08x}: 0x{:08x}", addr, word); - }); - let results = run_program(program.image, program.entry_point); +fn test_basic_program() { + run_program_and_check_output( + "./program_artifacts/asm/basic_program.elf", + 0, + ); +} - assert!(results.0 == 1); +#[test] +fn test_addi_one() { + run_program_and_check_output("./program_artifacts/asm/addi_one.elf", 1); } #[test] fn test_addi_minus_one() { - println!("Testing addi_minus_one.elf"); - let elf_data = std::fs::read("./program_artifacts/asm/addi_minus_one.elf").unwrap(); - let program = Elf::load(&elf_data).unwrap(); - println!("Program entry: 0x{:08x}", program.entry_point); - program.image.iter().for_each(|(addr, word)| { - println!("0x{:08x}: 0x{:08x}", addr, word); - }); - let results = run_program(program.image, program.entry_point); - - assert!(results.0 == -1); + run_program_and_check_output("./program_artifacts/asm/addi_minus_one.elf", -1); } #[test] fn test_addi_max() { - println!("Testing addi_max.elf"); - let elf_data = std::fs::read("./program_artifacts/asm/addi_max.elf").unwrap(); - let program = Elf::load(&elf_data).unwrap(); - println!("Program entry: 0x{:08x}", program.entry_point); - program.image.iter().for_each(|(addr, word)| { - println!("0x{:08x}: 0x{:08x}", addr, word); - }); - let results = run_program(program.image, program.entry_point); - - assert!(results.0 == 2047); + run_program_and_check_output("./program_artifacts/asm/addi_max.elf", 2047); } #[test] fn test_addi_min() { - println!("Testing addi_min.elf"); - let elf_data = std::fs::read("./program_artifacts/asm/addi_min.elf").unwrap(); - let program = Elf::load(&elf_data).unwrap(); - println!("Program entry: 0x{:08x}", program.entry_point); - program.image.iter().for_each(|(addr, word)| { - println!("0x{:08x}: 0x{:08x}", addr, word); - }); - let results = run_program(program.image, program.entry_point); - - assert!(results.0 == -2048); + run_program_and_check_output("./program_artifacts/asm/addi_min.elf", -2048); } #[test] fn test_addi_reg() { - println!("Testing addi_reg.elf"); - let elf_data = std::fs::read("./program_artifacts/asm/addi_reg.elf").unwrap(); - let program = Elf::load(&elf_data).unwrap(); - println!("Program entry: 0x{:08x}", program.entry_point); - program.image.iter().for_each(|(addr, word)| { - println!("0x{:08x}: 0x{:08x}", addr, word); - }); - let results = run_program(program.image, program.entry_point); - - assert!(results.0 == 30); + run_program_and_check_output("./program_artifacts/asm/addi_reg.elf", 30); } #[test] fn test_addi_reg_max() { - println!("Testing addi_reg_max.elf"); - let elf_data = std::fs::read("./program_artifacts/asm/addi_reg_max.elf").unwrap(); - let program = Elf::load(&elf_data).unwrap(); - println!("Program entry: 0x{:08x}", program.entry_point); - program.image.iter().for_each(|(addr, word)| { - println!("0x{:08x}: 0x{:08x}", addr, word); - }); - let results = run_program(program.image, program.entry_point); - - assert!(results.0 == 2080); + run_program_and_check_output("./program_artifacts/asm/addi_reg_max.elf", 2080); } #[test] fn test_addi_reg_min() { - println!("Testing addi_reg_min.elf"); - let elf_data = std::fs::read("./program_artifacts/asm/addi_reg_min.elf").unwrap(); - let program = Elf::load(&elf_data).unwrap(); - println!("Program entry: 0x{:08x}", program.entry_point); - program.image.iter().for_each(|(addr, word)| { - println!("0x{:08x}: 0x{:08x}", addr, word); - }); - let results = run_program(program.image, program.entry_point); - - assert!(results.0 == -2070); + run_program_and_check_output("./program_artifacts/asm/addi_reg_min.elf", -2070); } #[test] fn test_add() { - println!("Testing add.elf"); - let elf_data = std::fs::read("./program_artifacts/asm/add.elf").unwrap(); - let program = Elf::load(&elf_data).unwrap(); - println!("Program entry: 0x{:08x}", program.entry_point); - program.image.iter().for_each(|(addr, word)| { - println!("0x{:08x}: 0x{:08x}", addr, word); - }); - let results = run_program(program.image, program.entry_point); - - assert!(results.0 == 30); + run_program_and_check_output("./program_artifacts/asm/add.elf", 30); } #[test] fn test_add_neg() { - println!("Testing add_neg.elf"); - let elf_data = std::fs::read("./program_artifacts/asm/add_neg.elf").unwrap(); - let program = Elf::load(&elf_data).unwrap(); - println!("Program entry: 0x{:08x}", program.entry_point); - program.image.iter().for_each(|(addr, word)| { - println!("0x{:08x}: 0x{:08x}", addr, word); - }); - let results = run_program(program.image, program.entry_point); - - assert!(results.0 == 10); + run_program_and_check_output("./program_artifacts/asm/add_neg.elf", 10); } #[test] fn test_add_max() { - println!("Testing add_max.elf"); - let elf_data = std::fs::read("./program_artifacts/asm/add_max.elf").unwrap(); - let program = Elf::load(&elf_data).unwrap(); - println!("Program entry: 0x{:08x}", program.entry_point); - program.image.iter().for_each(|(addr, word)| { - println!("0x{:08x}: 0x{:08x}", addr, word); - }); - let results = run_program(program.image, program.entry_point); - - assert!(results.0 == i32::MAX); + run_program_and_check_output("./program_artifacts/asm/add_max.elf", i32::MAX); } #[test] fn test_add_max_plus_one() { - println!("Testing add_plus_one.elf"); - let elf_data = std::fs::read("./program_artifacts/asm/add_max_plus_one.elf").unwrap(); - let program = Elf::load(&elf_data).unwrap(); - println!("Program entry: 0x{:08x}", program.entry_point); - program.image.iter().for_each(|(addr, word)| { - println!("0x{:08x}: 0x{:08x}", addr, word); - }); - let results = run_program(program.image, program.entry_point); - - assert!(results.0 == i32::MIN); + run_program_and_check_output("./program_artifacts/asm/add_max_plus_one.elf", i32::MIN); } #[test] fn test_add_min() { - println!("Testing add_min.elf"); - let elf_data = std::fs::read("./program_artifacts/asm/add_min.elf").unwrap(); - let program = Elf::load(&elf_data).unwrap(); - println!("Program entry: 0x{:08x}", program.entry_point); - program.image.iter().for_each(|(addr, word)| { - println!("0x{:08x}: 0x{:08x}", addr, word); - }); - let results = run_program(program.image, program.entry_point); - - assert!(results.0 == i32::MIN); + run_program_and_check_output("./program_artifacts/asm/add_min.elf", i32::MIN); } #[test] fn test_add_min_minus_one() { - println!("Testing add_min_minus_one.elf"); - let elf_data = std::fs::read("./program_artifacts/asm/add_min_minus_one.elf").unwrap(); - let program = Elf::load(&elf_data).unwrap(); - println!("Program entry: 0x{:08x}", program.entry_point); - program.image.iter().for_each(|(addr, word)| { - println!("0x{:08x}: 0x{:08x}", addr, word); - }); - let results = run_program(program.image, program.entry_point); - - assert!(results.0 == i32::MAX); + run_program_and_check_output("./program_artifacts/asm/add_min_minus_one.elf", i32::MAX); } From 4c9f348eba769b64d34b61029c08184a65a35137 Mon Sep 17 00:00:00 2001 From: Gianbelinche <39842759+gianbelinche@users.noreply.github.com> Date: Thu, 11 Dec 2025 15:00:35 -0300 Subject: [PATCH 10/27] Add and tests --- null-vm/programs/asm/andi.s | 8 ++++++++ null-vm/programs/asm/andi_max.s | 9 +++++++++ null-vm/programs/asm/andi_one.s | 9 +++++++++ null-vm/programs/asm/andi_one_and_two.s | 9 +++++++++ null-vm/programs/asm/andi_one_and_zero.s | 8 ++++++++ null-vm/tests/asm.rs | 25 ++++++++++++++++++++++++ 6 files changed, 68 insertions(+) create mode 100644 null-vm/programs/asm/andi.s create mode 100644 null-vm/programs/asm/andi_max.s create mode 100644 null-vm/programs/asm/andi_one.s create mode 100644 null-vm/programs/asm/andi_one_and_two.s create mode 100644 null-vm/programs/asm/andi_one_and_zero.s diff --git a/null-vm/programs/asm/andi.s b/null-vm/programs/asm/andi.s new file mode 100644 index 000000000..67cae5d58 --- /dev/null +++ b/null-vm/programs/asm/andi.s @@ -0,0 +1,8 @@ + .attribute 5, "rv32i2p1_m2p0_zmmul1p0" +.Lfunc_end0: + .globl main +main: + andi a0, zero, 0x00 + jalr zero, 0(ra) +.Lfunc_end1: + .size main, .Lfunc_end1-main diff --git a/null-vm/programs/asm/andi_max.s b/null-vm/programs/asm/andi_max.s new file mode 100644 index 000000000..d0875da8f --- /dev/null +++ b/null-vm/programs/asm/andi_max.s @@ -0,0 +1,9 @@ + .attribute 5, "rv32i2p1_m2p0_zmmul1p0" +.Lfunc_end0: + .globl main +main: + addi a2, zero, 0xFFFFFFFF # -1 + andi a0, a2, 0xFFFFFFFF + jalr zero, 0(ra) +.Lfunc_end1: + .size main, .Lfunc_end1-main diff --git a/null-vm/programs/asm/andi_one.s b/null-vm/programs/asm/andi_one.s new file mode 100644 index 000000000..409b0208d --- /dev/null +++ b/null-vm/programs/asm/andi_one.s @@ -0,0 +1,9 @@ + .attribute 5, "rv32i2p1_m2p0_zmmul1p0" +.Lfunc_end0: + .globl main +main: + addi a2, zero, 0x01 + andi a0, a2, 0x01 + jalr zero, 0(ra) +.Lfunc_end1: + .size main, .Lfunc_end1-main diff --git a/null-vm/programs/asm/andi_one_and_two.s b/null-vm/programs/asm/andi_one_and_two.s new file mode 100644 index 000000000..d4731fbc1 --- /dev/null +++ b/null-vm/programs/asm/andi_one_and_two.s @@ -0,0 +1,9 @@ + .attribute 5, "rv32i2p1_m2p0_zmmul1p0" +.Lfunc_end0: + .globl main +main: + addi a2, zero, 0x01 + andi a0, a2, 0x02 + jalr zero, 0(ra) +.Lfunc_end1: + .size main, .Lfunc_end1-main diff --git a/null-vm/programs/asm/andi_one_and_zero.s b/null-vm/programs/asm/andi_one_and_zero.s new file mode 100644 index 000000000..ec0f7a06e --- /dev/null +++ b/null-vm/programs/asm/andi_one_and_zero.s @@ -0,0 +1,8 @@ + .attribute 5, "rv32i2p1_m2p0_zmmul1p0" +.Lfunc_end0: + .globl main +main: + andi a0, zero, 0x01 + jalr zero, 0(ra) +.Lfunc_end1: + .size main, .Lfunc_end1-main diff --git a/null-vm/tests/asm.rs b/null-vm/tests/asm.rs index eb181bb6e..80cfe8076 100644 --- a/null-vm/tests/asm.rs +++ b/null-vm/tests/asm.rs @@ -85,3 +85,28 @@ fn test_add_min() { fn test_add_min_minus_one() { run_program_and_check_output("./program_artifacts/asm/add_min_minus_one.elf", i32::MAX); } + +#[test] +fn test_andi() { + run_program_and_check_output("./program_artifacts/asm/andi.elf", 0x00); +} + +#[test] +fn test_andi_one() { + run_program_and_check_output("./program_artifacts/asm/andi_one.elf", 0x01); +} + +#[test] +fn test_andi_one_and_zero() { + run_program_and_check_output("./program_artifacts/asm/andi_one_and_zero.elf", 0x00); +} + +#[test] +fn test_andi_one_and_two() { + run_program_and_check_output("./program_artifacts/asm/andi_one_and_two.elf", 0x00); +} + +#[test] +fn test_andi_max() { + run_program_and_check_output("./program_artifacts/asm/andi_max.elf", 0xFFFFFFFFu32 as i32); +} From 119b7cf2f922abe67856d9123e18f416785bd12c Mon Sep 17 00:00:00 2001 From: Gianbelinche <39842759+gianbelinche@users.noreply.github.com> Date: Thu, 11 Dec 2025 15:30:20 -0300 Subject: [PATCH 11/27] Change names --- Cargo.lock | 26 +++++++++---------- Cargo.toml | 4 +-- {riscv-prover => prover}/Cargo.toml | 2 +- {riscv-prover => prover}/src/main.rs | 0 {null-vm => vm}/.gitignore | 0 {null-vm => vm}/Cargo.lock | 0 {null-vm => vm}/Cargo.toml | 2 +- {null-vm => vm}/Makefile | 0 {null-vm => vm}/programs/asm/add.s | 0 {null-vm => vm}/programs/asm/add_max.s | 0 .../programs/asm/add_max_plus_one.s | 0 {null-vm => vm}/programs/asm/add_min.s | 0 .../programs/asm/add_min_minus_one.s | 0 {null-vm => vm}/programs/asm/add_neg.s | 0 {null-vm => vm}/programs/asm/addi_max.s | 0 {null-vm => vm}/programs/asm/addi_min.s | 0 {null-vm => vm}/programs/asm/addi_minus_one.s | 0 {null-vm => vm}/programs/asm/addi_one.s | 0 {null-vm => vm}/programs/asm/addi_reg.s | 0 {null-vm => vm}/programs/asm/addi_reg_max.s | 0 {null-vm => vm}/programs/asm/addi_reg_min.s | 0 {null-vm => vm}/programs/asm/andi.s | 0 {null-vm => vm}/programs/asm/andi_max.s | 0 {null-vm => vm}/programs/asm/andi_one.s | 0 .../programs/asm/andi_one_and_two.s | 0 .../programs/asm/andi_one_and_zero.s | 0 {null-vm => vm}/programs/asm/basic_program.s | 0 .../programs/rust/basic_rust/Cargo.lock | 0 .../programs/rust/basic_rust/Cargo.toml | 0 .../programs/rust/basic_rust/src/main.rs | 0 {null-vm => vm}/src/elf.rs | 0 {null-vm => vm}/src/lib.rs | 0 {null-vm => vm}/src/main.rs | 2 +- {null-vm => vm}/src/vm/execution.rs | 0 {null-vm => vm}/src/vm/instructions.rs | 0 {null-vm => vm}/src/vm/mod.rs | 0 {null-vm => vm}/tests/asm.rs | 0 {null-vm => vm}/tests/rust.rs | 2 +- 38 files changed, 19 insertions(+), 19 deletions(-) rename {riscv-prover => prover}/Cargo.toml (73%) rename {riscv-prover => prover}/src/main.rs (100%) rename {null-vm => vm}/.gitignore (100%) rename {null-vm => vm}/Cargo.lock (100%) rename {null-vm => vm}/Cargo.toml (90%) rename {null-vm => vm}/Makefile (100%) rename {null-vm => vm}/programs/asm/add.s (100%) rename {null-vm => vm}/programs/asm/add_max.s (100%) rename {null-vm => vm}/programs/asm/add_max_plus_one.s (100%) rename {null-vm => vm}/programs/asm/add_min.s (100%) rename {null-vm => vm}/programs/asm/add_min_minus_one.s (100%) rename {null-vm => vm}/programs/asm/add_neg.s (100%) rename {null-vm => vm}/programs/asm/addi_max.s (100%) rename {null-vm => vm}/programs/asm/addi_min.s (100%) rename {null-vm => vm}/programs/asm/addi_minus_one.s (100%) rename {null-vm => vm}/programs/asm/addi_one.s (100%) rename {null-vm => vm}/programs/asm/addi_reg.s (100%) rename {null-vm => vm}/programs/asm/addi_reg_max.s (100%) rename {null-vm => vm}/programs/asm/addi_reg_min.s (100%) rename {null-vm => vm}/programs/asm/andi.s (100%) rename {null-vm => vm}/programs/asm/andi_max.s (100%) rename {null-vm => vm}/programs/asm/andi_one.s (100%) rename {null-vm => vm}/programs/asm/andi_one_and_two.s (100%) rename {null-vm => vm}/programs/asm/andi_one_and_zero.s (100%) rename {null-vm => vm}/programs/asm/basic_program.s (100%) rename {null-vm => vm}/programs/rust/basic_rust/Cargo.lock (100%) rename {null-vm => vm}/programs/rust/basic_rust/Cargo.toml (100%) rename {null-vm => vm}/programs/rust/basic_rust/src/main.rs (100%) rename {null-vm => vm}/src/elf.rs (100%) rename {null-vm => vm}/src/lib.rs (100%) rename {null-vm => vm}/src/main.rs (88%) rename {null-vm => vm}/src/vm/execution.rs (100%) rename {null-vm => vm}/src/vm/instructions.rs (100%) rename {null-vm => vm}/src/vm/mod.rs (100%) rename {null-vm => vm}/tests/asm.rs (100%) rename {null-vm => vm}/tests/rust.rs (90%) diff --git a/Cargo.lock b/Cargo.lock index ff5d0eacd..fc924a2b6 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -43,15 +43,6 @@ dependencies = [ "serde", ] -[[package]] -name = "null-vm" -version = "0.1.0" -dependencies = [ - "elf", - "hashbrown", - "thiserror", -] - [[package]] name = "once_cell" version = "1.21.3" @@ -67,6 +58,10 @@ dependencies = [ "unicode-ident", ] +[[package]] +name = "prover" +version = "0.1.0" + [[package]] name = "quote" version = "1.0.42" @@ -76,10 +71,6 @@ dependencies = [ "proc-macro2", ] -[[package]] -name = "riscv-prover" -version = "0.1.0" - [[package]] name = "serde" version = "1.0.228" @@ -152,6 +143,15 @@ version = "0.9.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "0b928f33d975fc6ad9f86c8f283853ad26bdd5b10b7f1542aa2fa15e2289105a" +[[package]] +name = "vm" +version = "0.1.0" +dependencies = [ + "elf", + "hashbrown", + "thiserror", +] + [[package]] name = "zerocopy" version = "0.8.31" diff --git a/Cargo.toml b/Cargo.toml index 8df724463..3f4944bc3 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -1,5 +1,5 @@ [workspace] members = [ - "null-vm", - "riscv-prover", + "vm", + "prover", ] diff --git a/riscv-prover/Cargo.toml b/prover/Cargo.toml similarity index 73% rename from riscv-prover/Cargo.toml rename to prover/Cargo.toml index 399ff055e..36ce7fe05 100644 --- a/riscv-prover/Cargo.toml +++ b/prover/Cargo.toml @@ -1,5 +1,5 @@ [package] -name = "riscv-prover" +name = "prover" version = "0.1.0" edition = "2024" diff --git a/riscv-prover/src/main.rs b/prover/src/main.rs similarity index 100% rename from riscv-prover/src/main.rs rename to prover/src/main.rs diff --git a/null-vm/.gitignore b/vm/.gitignore similarity index 100% rename from null-vm/.gitignore rename to vm/.gitignore diff --git a/null-vm/Cargo.lock b/vm/Cargo.lock similarity index 100% rename from null-vm/Cargo.lock rename to vm/Cargo.lock diff --git a/null-vm/Cargo.toml b/vm/Cargo.toml similarity index 90% rename from null-vm/Cargo.toml rename to vm/Cargo.toml index deea1b4bd..5cf4a4c90 100644 --- a/null-vm/Cargo.toml +++ b/vm/Cargo.toml @@ -1,5 +1,5 @@ [package] -name = "null-vm" +name = "vm" version = "0.1.0" edition = "2024" diff --git a/null-vm/Makefile b/vm/Makefile similarity index 100% rename from null-vm/Makefile rename to vm/Makefile diff --git a/null-vm/programs/asm/add.s b/vm/programs/asm/add.s similarity index 100% rename from null-vm/programs/asm/add.s rename to vm/programs/asm/add.s diff --git a/null-vm/programs/asm/add_max.s b/vm/programs/asm/add_max.s similarity index 100% rename from null-vm/programs/asm/add_max.s rename to vm/programs/asm/add_max.s diff --git a/null-vm/programs/asm/add_max_plus_one.s b/vm/programs/asm/add_max_plus_one.s similarity index 100% rename from null-vm/programs/asm/add_max_plus_one.s rename to vm/programs/asm/add_max_plus_one.s diff --git a/null-vm/programs/asm/add_min.s b/vm/programs/asm/add_min.s similarity index 100% rename from null-vm/programs/asm/add_min.s rename to vm/programs/asm/add_min.s diff --git a/null-vm/programs/asm/add_min_minus_one.s b/vm/programs/asm/add_min_minus_one.s similarity index 100% rename from null-vm/programs/asm/add_min_minus_one.s rename to vm/programs/asm/add_min_minus_one.s diff --git a/null-vm/programs/asm/add_neg.s b/vm/programs/asm/add_neg.s similarity index 100% rename from null-vm/programs/asm/add_neg.s rename to vm/programs/asm/add_neg.s diff --git a/null-vm/programs/asm/addi_max.s b/vm/programs/asm/addi_max.s similarity index 100% rename from null-vm/programs/asm/addi_max.s rename to vm/programs/asm/addi_max.s diff --git a/null-vm/programs/asm/addi_min.s b/vm/programs/asm/addi_min.s similarity index 100% rename from null-vm/programs/asm/addi_min.s rename to vm/programs/asm/addi_min.s diff --git a/null-vm/programs/asm/addi_minus_one.s b/vm/programs/asm/addi_minus_one.s similarity index 100% rename from null-vm/programs/asm/addi_minus_one.s rename to vm/programs/asm/addi_minus_one.s diff --git a/null-vm/programs/asm/addi_one.s b/vm/programs/asm/addi_one.s similarity index 100% rename from null-vm/programs/asm/addi_one.s rename to vm/programs/asm/addi_one.s diff --git a/null-vm/programs/asm/addi_reg.s b/vm/programs/asm/addi_reg.s similarity index 100% rename from null-vm/programs/asm/addi_reg.s rename to vm/programs/asm/addi_reg.s diff --git a/null-vm/programs/asm/addi_reg_max.s b/vm/programs/asm/addi_reg_max.s similarity index 100% rename from null-vm/programs/asm/addi_reg_max.s rename to vm/programs/asm/addi_reg_max.s diff --git a/null-vm/programs/asm/addi_reg_min.s b/vm/programs/asm/addi_reg_min.s similarity index 100% rename from null-vm/programs/asm/addi_reg_min.s rename to vm/programs/asm/addi_reg_min.s diff --git a/null-vm/programs/asm/andi.s b/vm/programs/asm/andi.s similarity index 100% rename from null-vm/programs/asm/andi.s rename to vm/programs/asm/andi.s diff --git a/null-vm/programs/asm/andi_max.s b/vm/programs/asm/andi_max.s similarity index 100% rename from null-vm/programs/asm/andi_max.s rename to vm/programs/asm/andi_max.s diff --git a/null-vm/programs/asm/andi_one.s b/vm/programs/asm/andi_one.s similarity index 100% rename from null-vm/programs/asm/andi_one.s rename to vm/programs/asm/andi_one.s diff --git a/null-vm/programs/asm/andi_one_and_two.s b/vm/programs/asm/andi_one_and_two.s similarity index 100% rename from null-vm/programs/asm/andi_one_and_two.s rename to vm/programs/asm/andi_one_and_two.s diff --git a/null-vm/programs/asm/andi_one_and_zero.s b/vm/programs/asm/andi_one_and_zero.s similarity index 100% rename from null-vm/programs/asm/andi_one_and_zero.s rename to vm/programs/asm/andi_one_and_zero.s diff --git a/null-vm/programs/asm/basic_program.s b/vm/programs/asm/basic_program.s similarity index 100% rename from null-vm/programs/asm/basic_program.s rename to vm/programs/asm/basic_program.s diff --git a/null-vm/programs/rust/basic_rust/Cargo.lock b/vm/programs/rust/basic_rust/Cargo.lock similarity index 100% rename from null-vm/programs/rust/basic_rust/Cargo.lock rename to vm/programs/rust/basic_rust/Cargo.lock diff --git a/null-vm/programs/rust/basic_rust/Cargo.toml b/vm/programs/rust/basic_rust/Cargo.toml similarity index 100% rename from null-vm/programs/rust/basic_rust/Cargo.toml rename to vm/programs/rust/basic_rust/Cargo.toml diff --git a/null-vm/programs/rust/basic_rust/src/main.rs b/vm/programs/rust/basic_rust/src/main.rs similarity index 100% rename from null-vm/programs/rust/basic_rust/src/main.rs rename to vm/programs/rust/basic_rust/src/main.rs diff --git a/null-vm/src/elf.rs b/vm/src/elf.rs similarity index 100% rename from null-vm/src/elf.rs rename to vm/src/elf.rs diff --git a/null-vm/src/lib.rs b/vm/src/lib.rs similarity index 100% rename from null-vm/src/lib.rs rename to vm/src/lib.rs diff --git a/null-vm/src/main.rs b/vm/src/main.rs similarity index 88% rename from null-vm/src/main.rs rename to vm/src/main.rs index 24e74d38e..be3a3379f 100644 --- a/null-vm/src/main.rs +++ b/vm/src/main.rs @@ -1,4 +1,4 @@ -use null_vm::{elf::Elf, vm::execution::run_program}; +use vm::{elf::Elf, vm::execution::run_program}; fn main() { println!("Reading elf"); diff --git a/null-vm/src/vm/execution.rs b/vm/src/vm/execution.rs similarity index 100% rename from null-vm/src/vm/execution.rs rename to vm/src/vm/execution.rs diff --git a/null-vm/src/vm/instructions.rs b/vm/src/vm/instructions.rs similarity index 100% rename from null-vm/src/vm/instructions.rs rename to vm/src/vm/instructions.rs diff --git a/null-vm/src/vm/mod.rs b/vm/src/vm/mod.rs similarity index 100% rename from null-vm/src/vm/mod.rs rename to vm/src/vm/mod.rs diff --git a/null-vm/tests/asm.rs b/vm/tests/asm.rs similarity index 100% rename from null-vm/tests/asm.rs rename to vm/tests/asm.rs diff --git a/null-vm/tests/rust.rs b/vm/tests/rust.rs similarity index 90% rename from null-vm/tests/rust.rs rename to vm/tests/rust.rs index 2f455a9bc..9a6343ccc 100644 --- a/null-vm/tests/rust.rs +++ b/vm/tests/rust.rs @@ -1,4 +1,4 @@ -use null_vm::{elf::Elf, vm::execution::run_program}; +use vm::{elf::Elf, vm::execution::run_program}; #[test] fn test_basic_rust() { From 1a2419152efff4ad8651186862adb6a2850261c8 Mon Sep 17 00:00:00 2001 From: Gianbelinche <39842759+gianbelinche@users.noreply.github.com> Date: Thu, 11 Dec 2025 15:31:44 -0300 Subject: [PATCH 12/27] Add artifacts --- vm/program_artifacts/asm/add.elf | Bin 0 -> 792 bytes vm/program_artifacts/asm/add_max.elf | Bin 0 -> 876 bytes vm/program_artifacts/asm/add_max_plus_one.elf | Bin 0 -> 888 bytes vm/program_artifacts/asm/add_min.elf | Bin 0 -> 876 bytes vm/program_artifacts/asm/add_min_minus_one.elf | Bin 0 -> 888 bytes vm/program_artifacts/asm/add_neg.elf | Bin 0 -> 796 bytes vm/program_artifacts/asm/addi_max.elf | Bin 0 -> 788 bytes vm/program_artifacts/asm/addi_min.elf | Bin 0 -> 788 bytes vm/program_artifacts/asm/addi_minus_one.elf | Bin 0 -> 796 bytes vm/program_artifacts/asm/addi_one.elf | Bin 0 -> 788 bytes vm/program_artifacts/asm/addi_reg.elf | Bin 0 -> 792 bytes vm/program_artifacts/asm/addi_reg_max.elf | Bin 0 -> 796 bytes vm/program_artifacts/asm/addi_reg_min.elf | Bin 0 -> 796 bytes vm/program_artifacts/asm/andi.elf | Bin 0 -> 784 bytes vm/program_artifacts/asm/andi_max.elf | Bin 0 -> 792 bytes vm/program_artifacts/asm/andi_one.elf | Bin 0 -> 792 bytes vm/program_artifacts/asm/andi_one_and_two.elf | Bin 0 -> 800 bytes vm/program_artifacts/asm/andi_one_and_zero.elf | Bin 0 -> 796 bytes 18 files changed, 0 insertions(+), 0 deletions(-) create mode 100755 vm/program_artifacts/asm/add.elf create mode 100755 vm/program_artifacts/asm/add_max.elf create mode 100755 vm/program_artifacts/asm/add_max_plus_one.elf create mode 100755 vm/program_artifacts/asm/add_min.elf create mode 100755 vm/program_artifacts/asm/add_min_minus_one.elf create mode 100755 vm/program_artifacts/asm/add_neg.elf create mode 100755 vm/program_artifacts/asm/addi_max.elf create mode 100755 vm/program_artifacts/asm/addi_min.elf create mode 100755 vm/program_artifacts/asm/addi_minus_one.elf create mode 100755 vm/program_artifacts/asm/addi_one.elf create mode 100755 vm/program_artifacts/asm/addi_reg.elf create mode 100755 vm/program_artifacts/asm/addi_reg_max.elf create mode 100755 vm/program_artifacts/asm/addi_reg_min.elf create mode 100755 vm/program_artifacts/asm/andi.elf create mode 100755 vm/program_artifacts/asm/andi_max.elf create mode 100755 vm/program_artifacts/asm/andi_one.elf create mode 100755 vm/program_artifacts/asm/andi_one_and_two.elf create mode 100755 vm/program_artifacts/asm/andi_one_and_zero.elf diff --git a/vm/program_artifacts/asm/add.elf b/vm/program_artifacts/asm/add.elf new file mode 100755 index 0000000000000000000000000000000000000000..8bb0ec36a8b8aecbfd2986df40c925334239713a GIT binary patch literal 792 zcma)4%}T>S5dM-j6$PQH< z*}$4boF&hDSKVU9S~i0Wd0;>HhS%JsRy97*e+KGjln>nSZUXIyLL-<|D{jRv3$Nmr z#G~hp2W7uRmEYidGBRtY#$4aXWbyUAMTJDqx7=aj5;}G%o*l&f@}xgzo=>=j^Ax{G z@iuYpPoGGpp_8iLrnr^jkhX1(P?(}%Lx}!hWXXZ>NA6HLL4h*8X8oov8m;zqR|w*b zUQe{T%_z3QP=rbb3Z8U_RNT}$wp0?r8QOpuK6px6L0ov6U10F literal 0 HcmV?d00001 diff --git a/vm/program_artifacts/asm/add_max.elf b/vm/program_artifacts/asm/add_max.elf new file mode 100755 index 0000000000000000000000000000000000000000..6133405d6f08661b0b26faba2c36e11a1b6856b4 GIT binary patch literal 876 zcma)4T}vB56g|8701+g`mqHO01Li4c;(Li0MHDHd@8iVX+NIfK*&QWH!9Mwi`XBlW zLY{o^Cn$nX1$*wU6O$D}58OTX%>9_1nS0Yd-gg`a7A~G3%J92G{^=ssJ6MB@8pki?6tnO)NcFW@I)!<-A+ffPxey3nd94T zbeC-6jK5pY_(Oww`W|&{OdNDCjGypd{}-Q_D7RLo$$c2|Db0c-nqr;b0%!A8rZZ<} vQ`WMZ&)C+;`d`{TP3Bkj5ayU-fyRCl+_AxriF)fN?>wD%z~=I{7Ixo%n9+27 literal 0 HcmV?d00001 diff --git a/vm/program_artifacts/asm/add_max_plus_one.elf b/vm/program_artifacts/asm/add_max_plus_one.elf new file mode 100755 index 0000000000000000000000000000000000000000..82416a2a073a4e908cddc7fd5d93cbee53c64453 GIT binary patch literal 888 zcma)4O-sW-5S^q=!CR$@qKFCwJxHmoM=vd{A0WN77f;L91RH3YkZh%T(UbUp{15(w z(qn&uB6!s|Nmp%z;=t^ixAS)PYwnvDCx&5=Hk00onZkGkd@?EKN3=sG?Ng2{$`Az; zy#TmBi?cvp`%^7ptYx?0lqV|WUhk{97h2@coPQiI)Xc9RQ^ES!E?BE{{XkUP!(O2q zUEPqeh0qFbsui~q915=zl*OIr4f}^d8JWMvcW2A|x=F&#xtT1zeXby(^?dU+7Ji#a z8;B?CNxeMu2h8)D8+4rFXDQwR=lV7<54=p}dnxXxI7!`n5kycd=&ESzUMf}*MTEK^Qxi4Vv>_QqMbMQ$`g9^GnP))BR?X}4|$@$E9 zI=IrPX75q;v`)hIg$`2w>whuJM7cGGCikJqM>GSDXodxTOPtLwna!M;O+iGyP3Bkj5ayU-oW_1bys*LfP<{84cmA2T&F1p924>$+g^Y7; literal 0 HcmV?d00001 diff --git a/vm/program_artifacts/asm/add_min_minus_one.elf b/vm/program_artifacts/asm/add_min_minus_one.elf new file mode 100755 index 0000000000000000000000000000000000000000..9f54ef4d358ed331f8c9325f20d0b11e32ec7dc3 GIT binary patch literal 888 zcma)4OH0E*5T2w>z+0pU1rZbq_G0Mk>Y=4o3erpM#mllWp$3`<$+lE4_9Xrv|ARlF z^w_^3;wWQ{fYc2^<@UuPP+G0jHos8FbJf2M{jg z0>tt<&Lh&=ZMBq;m_Ses$py|tk_O%+$0Gj8xSLDX` z6Hrbt)S^kf=GMY0^J-y*J$c@ER1GVb`Dt`_vfR#1Qm*dJ|GA0VgtHll%em&v;s9%eXj+h(5YlaFH-_>LJsX$mD97#ofP zi;q|sxV~_r63+D7&D$nxb*{TT#*nxAeb(uzv#XJMsqx@$|Th*E@lUlS8+ut`I*E!B%2di3Vs@b`H3 zFNg<^btdWdBVK$knRzpBXE(d^+`c^3Gz|(mzQIh=w@&^@N6hQkgN`B$13 bWYlktS8DJuXN!LP&da(V((&6WsC|C{U=3Qp literal 0 HcmV?d00001 diff --git a/vm/program_artifacts/asm/addi_max.elf b/vm/program_artifacts/asm/addi_max.elf new file mode 100755 index 0000000000000000000000000000000000000000..f120b83dcc04c7bd5fe900beca85e20fc3d237df GIT binary patch literal 788 zcma)4+e*Vg5S^q=Q4oy!B8Z?6uuq}453r?Ggi?_DzHUsYfu;?~R;m>0gP-Du`3V(2 zK+hyiFVP1FCTGsf+1X_>^G^3l(=^IVr!Qir@NEDsof6)lGt#L{B{HZ$6wa~(!16LK z0{QH^Tgq6=ZotVTIx-gX!7EYo0zC5LhbPib5gO4`z2?`#st9UfMZ5&TWLOO=sQfm5 zA6sGLwv_8znIe6D@1c&yZr(LTt8;zR69T-|?~6{aoy1NY zi&)7>Q6T*hirZSxl}eKEMlO*ZKL<)WKozCc#$*3!C(!ZK zN^qWs0`g2U!zv|qjxX=fk|w*6?GWeE$)}i|;ru)N1I~NKcQ9g|XcvxtD|O;L-zv#3s~R) literal 0 HcmV?d00001 diff --git a/vm/program_artifacts/asm/addi_min.elf b/vm/program_artifacts/asm/addi_min.elf new file mode 100755 index 0000000000000000000000000000000000000000..b673eb92df247ecfed849658d63480bce2d199f1 GIT binary patch literal 788 zcma)4+e*Vg5S^q=Q4oy!B8Z?6uuq}453r?Ggi?_Dz9uHrK$3=JTdEZ7gP-Du`3Z_2 zpl6b%m*|57lQU=L?Cdg`mtOx$Q54Eer7vP8@ofPOl~UfKGg7Ha71F3g6wUJk!0IwC z1NrQ_TgF(+uE9wsI?`w{S`f7_z+*3Yn38geP>ZL{hS!MdB4|W4@f-vbzaG_4`EC3@ zw$jFJ8CSP5W%~TyLm}7m>-Jf=GL;Sy&yTZyI`jr}J?GgRHu+_t-UsLYJ3t+HTd3a` z_^80iavVwVTfT_KUMStzKxWu&-?c@jcYQMu0=zREir%1`#&(j3 zL|U<=!16*Ax3#WgNsELVIz(pj6iCYk$~eQvJd*BAl9~Px(~>gw?1^*}JocY<0v%7S z0_S;1AkQQ>tWs*{`0@@dX}TNv4skAEvO2w7F5KO=Z%Nepn}S8 zfx{=A#=X@81RL{5DXW`ORDk7d0lYTn%r_A+~D|DXW-3-45=l)wj9eA6m z-)Fd&;bhvjD?Ha9M`GkV#)wK&D%m8&U^ueOp$JBG~*cY8~5@CJD#4iHzvclcoifVS*27B%P@wBmNe{lrnU!v2-F_ z`QLT`CBI$)&hH|D{5Gj!q+&b9%Coef@rJR(FX@6XU@#o*<~`%gW-juC{&nAU&Kt}+W{IXWxPWtq*9$~q)~+^o)-sz^+j9- z^4V3loUxW&gOg5lpy@PuA?luiCti9tBjp&Omdx5MuN5~%(25)4DF~*1Gj5>r+xUHK zm9^V)u5M(i^!dGmLZRo^?XqxbD(xelALjjZ=ndw2!Sgw+^Yc=D2+sYtfI9HHRKG3p zNr{u?IG%_?*Nn(`Aj2UcCVpgFzKA0)lx|`mGwye9x}rC@yc!7s-W!j_VARiIJ55C@ ztwd5_c_E6MTGz3pMZygoA~Ssqq-6tTlH+|5N%ujLnf(yck}~n^sdQ63_MdhH9Z#(W z=XppV&!jM{Qf8<4@(wL%wj0F`aW0>Hj>Q?yzro+(yk~p|Bi4zw;pn%tS2XaKY}IcM MxpmzKbnQQMKV+R(eE1Vj~v-}0o zy`D*$KB5Z;CTGsfxpOa*dF~GfilR_%Dt!_&iEkTNQz_+bIwO^8R3VK@MA0%oz?xND z2J+cWw~Q^3W7puM6ICm(RMiHGhh*mhx!6zc=cJq>)Z%%o={KW>2%Aw|JcZ#bXhd~X zejC4$t+aJx#?_rnnLfVvQONcD!UGnrO{F8m%j2w{4!yx#&v`bBZGKs(55c)V-=hO> z3iZ1J_X?aW$MHq%dghdj1sM(r;RRFM3Pd#ZC(?}#WX8SDZAWzbSJxvUz`NtI=#P47 zY$u6Gq!mjFEq{XIuGV!dX_0Uz4w0EWhSIWuGS2WJkEFYhWTrpFw4{uEdnVlkkNu~e zK*v+7zy+9#zPv{(n(jxwN1V$hpJ9H6^KbBXcp1)jFk+=>4~~9odqIO> R%{KiGk=xdNLD%|2_XAv-Sgim6 literal 0 HcmV?d00001 diff --git a/vm/program_artifacts/asm/addi_reg_max.elf b/vm/program_artifacts/asm/addi_reg_max.elf new file mode 100755 index 0000000000000000000000000000000000000000..42e0885b88a65aafe83250787a968935f75c6345 GIT binary patch literal 796 zcma)4O-sW-5S^q=LGTbM6hQ=qf;~v+*THK`s|Zqr>Ur6iP=ieyl5MG8nxj9(pXEw0326ge``?GN) zs3Y=MxJQ=4)`=QsRhAExz8^>)^H0DuNWDdR{gr)L@f_WLv5ibM%*pKg+)$ zUOcI9lBOT=;=t^iH#0jsyF1VQt8-1$C>NbRiJ8LM0iNiT@(vx6PIan~K_#Lv$u|J& z3%d;Dy{l>&OWa+_h*~{vg$mcsHX3jM_E%07}UxRZ$ z+dva|TZlUa{!ri~9mf-qI}*MZSQDzvspgOnqw&O+V-ZfgK)F#3o?)+h(-mj^i_3u! z;Ag|3=ns0SZO5^Qm5dbm(hCsW%yk{9BndY_H&*=UD`^8&l;M4DDR-{ON@dd;teRT0#}ig*fw>8Ki3DD&I6 zKepV)YbiIkPV)Ht-lc@rb9ehJT$zajiWkReJ&W{3=9cCLxPwi8k>S_Gxjw&R5#D9; z4;kLiaLBRi+Y^-LD7g?~Fq$}WB*KY5R$f%1lU}=d-xRIR)lF9j;;mj!bh_;%cH&sX zN=6ES^v9Ik)_Sf~62cq1fE_;uN;-rpN^z(o<;@lB?-v20ajW?Cx~IDkfb5GE!B-(`YC>vpP(pi z>zSnKBf4;4a^}pOJNGh~=U)G^P$*Dl8hsKog>M^J(Iw6f}RG~5ziNbkyfHljw z1mv^pZYi51$6kh$PE@VDFRGL8#R$pH8FG;u-%qJ*C4xCtf40 zqw?GMjcmn@8&j@rWlHq1*hL}J^9%P_xH63n5YG?Oeme99b3NnfEH?RhuHFad{(O%P zyvfz?a(tBIBm>(OzMPq3GG=7hB*e%YThbHZ*bS5u8ORK~o!gGM=v`e8gaE%74n=R! zO=2sKMXY3`$d_(_;pzC`4qD=oPUMC!Ao$ygApr5J8<+{*$WzY RE4J>pkKCs23%b@Hx*v1YTr2

$HJ9qbbxqql=su2H<;^+=d;-47lrx=ocr@VI`F1Y zzbo)*fs++Fo`^!%jL3K-!yzH2eq>v|h$AnQZek!a8T4*@qCdR49t#29pG?GXJjh}@ zO+_lLL{eaRA&T2t*RiBU!VMiFGkprAWdmiBDcXUf-^yOmz+bU- PzkTF3bzjhR{?PpZoNZWY literal 0 HcmV?d00001 diff --git a/vm/program_artifacts/asm/andi_one_and_two.elf b/vm/program_artifacts/asm/andi_one_and_two.elf new file mode 100755 index 0000000000000000000000000000000000000000..bd48790c4930b59acd2e90bd977b84d0574bcb34 GIT binary patch literal 800 zcma)4OH0E*5T2wD5IjUGD2kv^vTyUh*&_?Feoup0%1@GinIG8P&zJ?@uR< zsE*8E@EsY2wG%U~Z$ygp@x6)Z*qDF&HcB* z2KYXgALn$K(_{sXC&IuLaD;pe&5){dsyZaZXcF4iL`0z%NH?w`GU&F4ZPDpn-}Z%o z?hFQ^*YBpjog^ZWRxHW4ya36~TGz3pMZygnA~SjNrDcOX^IZ^Y(vFryjR(m-9278C`%<&n_7%kd@ aq2CIxXuxMHsD3*Ltk-=Z(NaZVRrdp%hg>ZH literal 0 HcmV?d00001 diff --git a/vm/program_artifacts/asm/andi_one_and_zero.elf b/vm/program_artifacts/asm/andi_one_and_zero.elf new file mode 100755 index 0000000000000000000000000000000000000000..7e56b48fc2baafbb1a5865cb27a3c10e5b4dda50 GIT binary patch literal 796 zcma)4OH0E*5T2wD^cE4JAc8`{9yIiI_0ZBP1?i=F@vmUHE8@o)Hwx@z2tsI+7ZH1JZm+*X4DXVGpdWZ?@uRRaNftb5-XoggMq^d(gj3=ROO+*xWfpp_4GNWGSrX#xjtHDqR@a||N z`omrt+eso4X~mL!%L`E4*1C=*EfQ|v5Shu7FD)A=;|w2EB;7|zX8JRxC1vc{Q|TtS z_5Y0DlV7h4=Xa4nej8;Nsnkxe@+>WBIwNY9IG6oEhH4Mz-{9|Xo;N;&5o1NWaP(W* UD;i8!Y~61UxlP>{bge&hKk3F?8~^|S literal 0 HcmV?d00001 From 10e264dc5aa750dfd690066fd6e7cfdfef3723ee Mon Sep 17 00:00:00 2001 From: Gianbelinche <39842759+gianbelinche@users.noreply.github.com> Date: Thu, 11 Dec 2025 15:46:32 -0300 Subject: [PATCH 13/27] Add ori tests --- vm/program_artifacts/asm/ori.elf | Bin 0 -> 784 bytes .../asm/ori_five_and_four.elf | Bin 0 -> 800 bytes vm/program_artifacts/asm/ori_max.elf | Bin 0 -> 792 bytes vm/program_artifacts/asm/ori_one.elf | Bin 0 -> 788 bytes vm/program_artifacts/asm/ori_one_and_one.elf | Bin 0 -> 800 bytes .../asm/ori_three_and_five.elf | Bin 0 -> 804 bytes vm/program_artifacts/asm/ori_two_and_one.elf | Bin 0 -> 800 bytes vm/program_artifacts/rust/basic_rust.elf | Bin 904 -> 0 bytes vm/programs/asm/ori.s | 8 ++++ vm/programs/asm/ori_five_and_four.s | 9 +++++ vm/programs/asm/ori_max.s | 9 +++++ vm/programs/asm/ori_one.s | 8 ++++ vm/programs/asm/ori_one_and_one.s | 9 +++++ vm/programs/asm/ori_three_and_five.s | 9 +++++ vm/programs/asm/ori_two_and_one.s | 9 +++++ vm/tests/asm.rs | 37 ++++++++++++++++++ 16 files changed, 98 insertions(+) create mode 100755 vm/program_artifacts/asm/ori.elf create mode 100755 vm/program_artifacts/asm/ori_five_and_four.elf create mode 100755 vm/program_artifacts/asm/ori_max.elf create mode 100755 vm/program_artifacts/asm/ori_one.elf create mode 100755 vm/program_artifacts/asm/ori_one_and_one.elf create mode 100755 vm/program_artifacts/asm/ori_three_and_five.elf create mode 100755 vm/program_artifacts/asm/ori_two_and_one.elf delete mode 100755 vm/program_artifacts/rust/basic_rust.elf create mode 100644 vm/programs/asm/ori.s create mode 100644 vm/programs/asm/ori_five_and_four.s create mode 100644 vm/programs/asm/ori_max.s create mode 100644 vm/programs/asm/ori_one.s create mode 100644 vm/programs/asm/ori_one_and_one.s create mode 100644 vm/programs/asm/ori_three_and_five.s create mode 100644 vm/programs/asm/ori_two_and_one.s diff --git a/vm/program_artifacts/asm/ori.elf b/vm/program_artifacts/asm/ori.elf new file mode 100755 index 0000000000000000000000000000000000000000..99c31ef5b04d160781e77452f32fc84031f5cccf GIT binary patch literal 784 zcma)4O-sW-5PeB){Qx22MG&ztaA5N0&AgpmCiB$lTo{Id%uIYjnC7=ZESpGp17(<~qJ$y}K=_y)AXaDb z3Q^83x}{9C;zc?vVA}%*&p`8#Jo4k4DU3aa#b|m`_v_)Y3hH4^Jp{pIcpTPP`EBw( zvBJ`ADK~#)R`Bt)%0i}>*KLS!ZYDMvKklUcEb8}#TNyWSl;fv4-X@p+Yeb9K$#0`vJc->nR zjll6oEdJDbeMdV`-lz}Q@qM5jm#Cu@Z?i~ycN%u`FKkEa$ag2&i}}v~+Af7Mu@YTo zp@}k&%(zC09q=prGo#5~Wcwqzbm}Q)XC(hhf1}He$sK}RC9KogZ*DJaFqpGNzb)pL Lb??-j{Gs~>khN8$ literal 0 HcmV?d00001 diff --git a/vm/program_artifacts/asm/ori_five_and_four.elf b/vm/program_artifacts/asm/ori_five_and_four.elf new file mode 100755 index 0000000000000000000000000000000000000000..01dc3a35c81a24efeefa7833361761930ee58514 GIT binary patch literal 800 zcma)4O-sW-5S^s0Ab5xrp&)`n!Cnmgx(c?mNA z;#u@f()1&G@WJexH#0lC?9NO7`chF8%AnFGv65KZ;JQkQZqqTTRHGd#QGqB}WE;S> zrC$W|-gUQBEf8ZX!AK)2k1wcf-_ZoY&M9J{6FtmGIf7dXXRW5w3>w0126gf5y79CT z)RFlOz9XZsabl{~tw@nRz7LSd>iLEhE?hySL->nI+D}9M8EY-m3Z3WlAg6Dkx&Izm z1K;QJPEH3oO@8Qzu`{!U;aOtr$D!_1bxu`_gqTcy)0m3DcRXo_RYXR;&P_*j`&WaZ z5YXMxNc4xj#5bczMA8T)xrXB*xm{~phBQdno<*cbPp&jfunbdv%sgq&CF#k}=!TS` zW5&{saO?kp-;-Z&2gdIr!TdHEFjfgpu<|@DWilt(JaH`jft0g79Djqo!-_CIgBhbm ayD;=y;S~+ym0I`PM{Kk13w5nO>V5zVTU}uQ literal 0 HcmV?d00001 diff --git a/vm/program_artifacts/asm/ori_max.elf b/vm/program_artifacts/asm/ori_max.elf new file mode 100755 index 0000000000000000000000000000000000000000..f5689f3f8b4ef049e81711dc5469c552d0130d0f GIT binary patch literal 792 zcma)4O-sW-5S^qSAc{nK5kycd*i-1&U0Pa2lp@sovax9mHf>1OQoY!tKgFNrPf!Y8 z>zkz8k9hIH?3*_;JG<=8Tl@CXFbvW#X-=#Z);hRkQmpHALMD|cPdUmE1v9;YYnFZ% z%zM|}5;a4NEe9iusL=mf6x^T10KvvNVxbp3OvpHfn+qqks#gsv!mkEp@#_1}!%9#_ z<}dh;jLgP~i8i+)S^8e=BBAT~hWlK&f=LJPXNO5Y3-xELEv*fzrSwHg-#~N!J+KA7 zOXWpM_fwk2p(lJfwZ~MPQn5!u42EMz4n;8bM#>F~h;&^an+3|naQmN2$o|PNnuK&dm z3i;LYFn$jO<~Py6IK?={%5$`o@qFkx;#l(X3F|!^|A2kMc-Hs~W{ec=z|e1ncQklf SsdYd8=gqn~>iBOp^tr$1w_F|o literal 0 HcmV?d00001 diff --git a/vm/program_artifacts/asm/ori_one.elf b/vm/program_artifacts/asm/ori_one.elf new file mode 100755 index 0000000000000000000000000000000000000000..c0e1a7a0e1d3bea7b788e3d0c92f062d6062ab66 GIT binary patch literal 788 zcma)4+e*Vg5IspRD1tE2vung#_O-(V$aZ4#S0Qr*NcbW~7A2?ZdUs{_Q9gRbM2y+T^03n8>(6L7%3cWzOu}M4qPV25E+TF{mo)Dzl{l4h-I;rm@iAba! zOZc`IP;fKX9oW)_aDxG0B{N^z4zY|gepH@xrxI5BAC@g;>^WoUCiK?-;*b)#Yh^O- zha~2nD9|XSIH8qiXd%GlyX4$OY@&1;9K>h`DLvf8R3w&JQ7C86c2O7Y; zLVQ}_VS!VW_#z5DVTUfG8Bybj8ZHSjokfm46LI8+(n}ifSi}BpUkpa$>xmHH1IrSl z$uP5>G!?0|6G?&XhY0TGdaf;P5?<&Mndx&NZ3ifm93Pb>y(dX#_AjO_W#T(?>7|(Y zzjBO3e!VJ`-$erXZIocGGC9M^`?R9jo~V6dU;YC*sv7pcLqDLrb9@IQR*Uwa=(m

t#UA}B{w)83 zcvs&fO+TUsAI!daGqbbH?!2^bE;LP}1Uh{ZD}}WVuIm)(I-QVCCEB7KWr+NFvH@IL z_*pRTU3H7q95J>WjPgWKXNUz(ct0iW7;Y|@)~Zg`uL!s5m&LQ|PDT~K zjLdKF9T}Om6JxD!M6&epy@y0n&o?~a!XrpCs9_+bFg;uJovAd&RGd-KCLso+v1N{gKXyDNgCZi`R^zrIn(fQ0 zju6nzZdbHBt;n~+P=v}16uGA3A-P#AZBv;fq-PTu;ghRO3#@{ehl!`;Opy_NjbSPk zIMzhT5ZC@U4pGT3xCP_4QDA=qeZk}3Niy*zkgSRCyu?Ct4$+lK6_UKRXXZaVz zqX+#a>GlyX4$OY@&1;9h69mcqu38P~TwMf&`yAfWPj!hKF$iB5;G7YA8C1Nj%s4aGIO%<*B4o8a7k7ia+Q za`ADF2RTk*>s-M@Zz?D?|BRB#_@m3Dzo=Q=Gg{OPcP9+9&p9KaioSVgEby1IjzccQ9hLXa|aZ WD|thM&AC;-yC33l;gQC-?=kB`Sxz{-Y^W(=+R$-cR4V~<+bW{8JA4z(})iF`Itk< zxm*eUU>iKR;axXa23_(KM4kqSbUyX~kJtzMOyocOQ3=e4z`npE9_#DfCiI$PAo?Tx zlp8I-vr%sv6`NaGH`%&0ZEG$pF)6dXAp6`3XOh%3! z2@%fH9(GbeK@`>b#(aduG@o7}Dh z=N{nR@%h|W*UvbQyX;`l^S$~Wz1;J!u7~XFyMKaPvy|K^!r2O0veAxZg-X>~v{AAl zt2r-J81cGlRNYzKO3s(at!7yo?sg(i(s?;=nzWFOqT!B)34TSGm3t%n$H7TJeDhW( zyh0-yt(Mq1WTH-A(QmeYGBtD`mQ|}89fy9P84c6{ub4NIZ~b4K_{bLKfIhJ=df{Ex b;Vq8%r8l=;Hxpd^Pwv;9avi?9hTiud%(!@B diff --git a/vm/programs/asm/ori.s b/vm/programs/asm/ori.s new file mode 100644 index 000000000..ce4fd062a --- /dev/null +++ b/vm/programs/asm/ori.s @@ -0,0 +1,8 @@ + .attribute 5, "rv32i2p1_m2p0_zmmul1p0" +.Lfunc_end0: + .globl main +main: + ori a0, zero, 0x00 + jalr zero, 0(ra) +.Lfunc_end1: + .size main, .Lfunc_end1-main diff --git a/vm/programs/asm/ori_five_and_four.s b/vm/programs/asm/ori_five_and_four.s new file mode 100644 index 000000000..58273ffc4 --- /dev/null +++ b/vm/programs/asm/ori_five_and_four.s @@ -0,0 +1,9 @@ + .attribute 5, "rv32i2p1_m2p0_zmmul1p0" +.Lfunc_end0: + .globl main +main: + ori a2, zero, 0x04 + ori a0, a2, 0x05 + jalr zero, 0(ra) +.Lfunc_end1: + .size main, .Lfunc_end1-main diff --git a/vm/programs/asm/ori_max.s b/vm/programs/asm/ori_max.s new file mode 100644 index 000000000..29f3ad032 --- /dev/null +++ b/vm/programs/asm/ori_max.s @@ -0,0 +1,9 @@ + .attribute 5, "rv32i2p1_m2p0_zmmul1p0" +.Lfunc_end0: + .globl main +main: + ori a2, zero, 0xFFFFFFFF + ori a0, a2, 0xFFFFFFFF + jalr zero, 0(ra) +.Lfunc_end1: + .size main, .Lfunc_end1-main diff --git a/vm/programs/asm/ori_one.s b/vm/programs/asm/ori_one.s new file mode 100644 index 000000000..376c1b295 --- /dev/null +++ b/vm/programs/asm/ori_one.s @@ -0,0 +1,8 @@ + .attribute 5, "rv32i2p1_m2p0_zmmul1p0" +.Lfunc_end0: + .globl main +main: + ori a0, zero, 0x01 + jalr zero, 0(ra) +.Lfunc_end1: + .size main, .Lfunc_end1-main diff --git a/vm/programs/asm/ori_one_and_one.s b/vm/programs/asm/ori_one_and_one.s new file mode 100644 index 000000000..fdbb73c3f --- /dev/null +++ b/vm/programs/asm/ori_one_and_one.s @@ -0,0 +1,9 @@ + .attribute 5, "rv32i2p1_m2p0_zmmul1p0" +.Lfunc_end0: + .globl main +main: + ori a2, zero, 0x01 + ori a0, a2, 0x01 + jalr zero, 0(ra) +.Lfunc_end1: + .size main, .Lfunc_end1-main diff --git a/vm/programs/asm/ori_three_and_five.s b/vm/programs/asm/ori_three_and_five.s new file mode 100644 index 000000000..9b8743e2f --- /dev/null +++ b/vm/programs/asm/ori_three_and_five.s @@ -0,0 +1,9 @@ + .attribute 5, "rv32i2p1_m2p0_zmmul1p0" +.Lfunc_end0: + .globl main +main: + ori a2, zero, 0x03 # 0011 + ori a0, a2, 0x05 # 0101 + jalr zero, 0(ra) +.Lfunc_end1: + .size main, .Lfunc_end1-main diff --git a/vm/programs/asm/ori_two_and_one.s b/vm/programs/asm/ori_two_and_one.s new file mode 100644 index 000000000..42d30e3f5 --- /dev/null +++ b/vm/programs/asm/ori_two_and_one.s @@ -0,0 +1,9 @@ + .attribute 5, "rv32i2p1_m2p0_zmmul1p0" +.Lfunc_end0: + .globl main +main: + ori a2, zero, 0x01 + ori a0, a2, 0x02 + jalr zero, 0(ra) +.Lfunc_end1: + .size main, .Lfunc_end1-main diff --git a/vm/tests/asm.rs b/vm/tests/asm.rs index 14341d970..8b32e9f44 100644 --- a/vm/tests/asm.rs +++ b/vm/tests/asm.rs @@ -110,3 +110,40 @@ fn test_andi_one_and_two() { fn test_andi_max() { run_program_and_check_output("./program_artifacts/asm/andi_max.elf", 0xFFFFFFFFu32 as i32); } + +#[test] +fn test_ori() { + run_program_and_check_output("./program_artifacts/asm/ori.elf", 0x00); +} + +#[test] +fn test_ori_one() { + run_program_and_check_output("./program_artifacts/asm/ori_one.elf", 0x01); +} + +#[test] +fn test_ori_one_and_one() { + run_program_and_check_output("./program_artifacts/asm/ori_one_and_one.elf", 0x01); +} + +#[test] +fn test_ori_two_and_one() { + run_program_and_check_output("./program_artifacts/asm/ori_two_and_one.elf", 0x03); +} + +#[test] +fn test_ori_five_and_four() { + run_program_and_check_output("./program_artifacts/asm/ori_five_and_four.elf", 0x05); +} + +#[test] +fn test_ori_three_and_five() { + run_program_and_check_output("./program_artifacts/asm/ori_three_and_five.elf", 0x07); +} + +#[test] +fn test_ori_max() { + run_program_and_check_output("./program_artifacts/asm/ori_max.elf", 0xFFFFFFFFu32 as i32); +} + + From e15cab8aa76a9b91d983dae6056f1735afbede18 Mon Sep 17 00:00:00 2001 From: Gianbelinche <39842759+gianbelinche@users.noreply.github.com> Date: Thu, 11 Dec 2025 15:56:56 -0300 Subject: [PATCH 14/27] Add xori tests --- vm/program_artifacts/asm/xori.elf | Bin 0 -> 784 bytes vm/program_artifacts/asm/xori_max.elf | Bin 0 -> 788 bytes vm/program_artifacts/asm/xori_negate.elf | Bin 0 -> 796 bytes vm/program_artifacts/asm/xori_one.elf | Bin 0 -> 788 bytes vm/program_artifacts/asm/xori_one_and_one.elf | Bin 0 -> 800 bytes vm/programs/asm/xori.s | 8 ++++++ vm/programs/asm/xori_max.s | 8 ++++++ vm/programs/asm/xori_negate.s | 9 +++++++ vm/programs/asm/xori_one.s | 8 ++++++ vm/programs/asm/xori_one_and_one.s | 9 +++++++ vm/tests/asm.rs | 24 ++++++++++++++++++ 11 files changed, 66 insertions(+) create mode 100755 vm/program_artifacts/asm/xori.elf create mode 100755 vm/program_artifacts/asm/xori_max.elf create mode 100755 vm/program_artifacts/asm/xori_negate.elf create mode 100755 vm/program_artifacts/asm/xori_one.elf create mode 100755 vm/program_artifacts/asm/xori_one_and_one.elf create mode 100644 vm/programs/asm/xori.s create mode 100644 vm/programs/asm/xori_max.s create mode 100644 vm/programs/asm/xori_negate.s create mode 100644 vm/programs/asm/xori_one.s create mode 100644 vm/programs/asm/xori_one_and_one.s diff --git a/vm/program_artifacts/asm/xori.elf b/vm/program_artifacts/asm/xori.elf new file mode 100755 index 0000000000000000000000000000000000000000..43dac4a6587c9d5769d253db137cb4d5adde32db GIT binary patch literal 784 zcma)4%Syvg5Isp-Q3R>D5k#m^u&dJ7(oIY21GJmE6fS8S+CbBW#EVZx@jv#-sp5xtKAIaZV;$I zTfT;CIb$ZbwRYdq7L+~i1I6Ic)mE3N{RoF~r0uyzG5i@tOKachPPHAd(SO{ICN18iv&p%kRPuZayckTfCLN|b^=_$hvvpHT4w z>Y1eJCHmmNibA=m^i9kpzHOkcQp($OMk>{)N);**g|qwsu(piL zKt8+fmNC|{SKy=(9hvjR_>HJ@0Uo*W!xJf|2rJQ3tLZkwhVYwVUA*}I)N6!wRDK)3 zkFB(ETgKI`OqsqGdnn|3e%(F`SEkY-;@NT5PlH}(uH`(N!zRBh)cfGve+Q@mZwvMN z0v{JRB|+p0-%5;t^n~;g2{HBp+ww#hxD)9_Ix@pv=dL5V=Jm}$2=MN3D9k}GjqNxV zv9uydzU59(+}1iHOIjqH$%x2^pM7cBKpAEDm`Bn{BpK-sF)S$~*Pcoz#$*3!C(!ZK zs&Jl%1oBLB!z!hAjxX=flBT^Qzx>6h)!LRQe=l65j^!N~MT5=$uq4Q=W2^A@b+R0bqF* zXMucn(=BFmXzV#S6^M$R#j>b>Ek_WWm(T(`985_$LzoMu^_pGttHP=I74hOYlX2Cr zAoJUJMz+k>jWJhulq`KL50FUedBP(uT$@VAi03D9zXIxcta%~f3SFo8O^QE&bN_u{ z0oYIF2PyuP;xzLDTe#N9ke23AX-1_X2{9UbrZE=2XS>o0N>F<3X1^&~`t4m;2=G>~ zC-iPRip?+-p)>+Xj$ykCA$63Fk87*;B>3w(K(Ry5j?WS3ZrUq8m=4D0Xk1)TSd?_k7Q(H;kGda>PhF@0 literal 0 HcmV?d00001 diff --git a/vm/program_artifacts/asm/xori_one.elf b/vm/program_artifacts/asm/xori_one.elf new file mode 100755 index 0000000000000000000000000000000000000000..7499e8e850819d4a666ad77abceaebc29ad9a0a9 GIT binary patch literal 788 zcma)4+e*Vg5S^qK6a=Hb2qGv1>{ICN18iv(p%kRPuZayckQ>QXsuc9WPw~V21jP@~ zGfB6X=z{~3GiT=P>@u0>{@_B>G*YJ17crCgwt=Qj8E?}G=~SaCRj5Q1&(#57Z4sA& ze0J3>XRKwfz{wyw=o>V7A?logCtiB@K-w|FO7hTZdd;{Yf@WM7PeCyC8*v?#-^TA_ zE3Ms@bA2OIrqAyk6qKG{x68t%>9mh{ewg<&pf{Ntisy4!=jVm`0G#`80S(}Fp?+K7 zlLDt%lz1WvT`MAUM&_7=nD~)n`y!6KP`ZhU%&6D7>4Hj_M5O-{9|X-ZQ>~5$iU=I@db@bBGRt4#$y?9y@6WT!YL9#8?i#_^N{8|15 z@ha$>q+8o~@xknyH#0lC?9NN?zOQK-Dd_Y`tR&VJxTaI8TXar3RcVJxR3M6$Y6G~s z@{3^J``ay3OT^epFfxeBeS^xqLmDI4zCSa0 zHDvyR@5m@@oS12SD^jG7?*k-MJ>T$%3)j%;1pe|k>t~?;inXD%M%Ougo6{p`?!N~% zzz@0nB&WlirbQTgA`Dz%1rD Date: Thu, 11 Dec 2025 16:04:05 -0300 Subject: [PATCH 15/27] Add slti tests --- vm/program_artifacts/asm/slti.elf | Bin 0 -> 784 bytes vm/program_artifacts/asm/slti_minus_one.elf | Bin 0 -> 796 bytes vm/program_artifacts/asm/slti_negative.elf | Bin 0 -> 796 bytes .../asm/slti_negative_minus.elf | Bin 0 -> 804 bytes vm/program_artifacts/asm/slti_one.elf | Bin 0 -> 788 bytes vm/programs/asm/slti.s | 8 ++++++ vm/programs/asm/slti_minus_one.s | 8 ++++++ vm/programs/asm/slti_negative.s | 9 +++++++ vm/programs/asm/slti_negative_minus.s | 9 +++++++ vm/programs/asm/slti_one.s | 8 ++++++ vm/tests/asm.rs | 25 ++++++++++++++++++ 11 files changed, 67 insertions(+) create mode 100755 vm/program_artifacts/asm/slti.elf create mode 100755 vm/program_artifacts/asm/slti_minus_one.elf create mode 100755 vm/program_artifacts/asm/slti_negative.elf create mode 100755 vm/program_artifacts/asm/slti_negative_minus.elf create mode 100755 vm/program_artifacts/asm/slti_one.elf create mode 100644 vm/programs/asm/slti.s create mode 100644 vm/programs/asm/slti_minus_one.s create mode 100644 vm/programs/asm/slti_negative.s create mode 100644 vm/programs/asm/slti_negative_minus.s create mode 100644 vm/programs/asm/slti_one.s diff --git a/vm/program_artifacts/asm/slti.elf b/vm/program_artifacts/asm/slti.elf new file mode 100755 index 0000000000000000000000000000000000000000..1539f8d2074db0acb98a86cb3287ad3c3a0dac68 GIT binary patch literal 784 zcma)4%Syvg5IspBD1ubn2qILd*j4Fk>87Ri0oqMn3YWAEZJ=pGa$Bktbm6D?VSa!c z@dNZs()6VZ2PS9Eopa|7lX-65UK)mh*i3vunC7=i%$f*!6DMKZ@#QsLu+|#N2>%u+A^G_%*rImv=J6yRH1g z7VmCx1Vil<#>mZ(>p`jhaNMzm${RZ)ZTmT%v>UbinyNRiZdyu_*V}E?Y&F8T69g*I zmapMj&WOoPt=+S<1!a$VKp}W^wbdbNKf*yAX?vzo2!BSw(%N@A6Kw}<^q+Q2olGoE zmsx0{%p*3gQD~?9%Kj{9xEJ}D5TmI_7~hff8~vRwJ0@=ka+R=4XT7DpvcO=;R`m{e Mwyyi2uJVWO2YR_x;s5{u literal 0 HcmV?d00001 diff --git a/vm/program_artifacts/asm/slti_minus_one.elf b/vm/program_artifacts/asm/slti_minus_one.elf new file mode 100755 index 0000000000000000000000000000000000000000..08a70fb00c235ddd7858ef017061d4a3913b5bf6 GIT binary patch literal 796 zcma)4OH0E*5T2wD^cEFC5J9105ea>rytT9yL3*%)$0f0`2J#}=mMR53_*490{scwv zTE9t}KB5N)X21DnzMWlm=ecv$RTPC%Q|XJCNvsXvnMyHl&>^W*rXm$6M-)uc4Z!j| z&I5VxvRlGf%U*z!MznMMF&n-RHBZ1pJGvW_a)7W9j_WnM7F2~>3o7Etbw^G$sG#!O z_sbbQlrMBv+=w89cH{dV)FDO#P2%bpP6t$ts0 zdhIwiqew*32qn3O?V-4?wFZVXNLb#0NRJ*}X_!D6Cisv>(wa!p<8RRoDMQ;FNh`vY z|84tF^6M4h{4Ns6Z<88EDz+o6JWF#L&qz8;oJ)Qn!E_Jj-{9|Xo;N;&5o1N0aP(W) UD;k6gw(Pfs+^X&yy80iwAJYh2fdBvi literal 0 HcmV?d00001 diff --git a/vm/program_artifacts/asm/slti_negative.elf b/vm/program_artifacts/asm/slti_negative.elf new file mode 100755 index 0000000000000000000000000000000000000000..4c5a21ddce0bdeb8768f127d0bac568e9a479a60 GIT binary patch literal 796 zcma)4%Syvg5S^qC5L`qmDu|#^v4VuYHZEHlMUaA2++GqJY9L8ta$Bk!yYy51EI&bU z<*J@Znm(cn2PS9E%(-(flX)?&FBCcG6 z9_N94cG)dqQ{>nSaMFlM#gAF(c!vf^woZ@>o#=i{$^pVcIBwLPdQcNyJ*bLj&l|b5 zpo+?G<2SP9R&GqVx|Ye)=WGjwRL?KmX5qqA+C@CwOZsWhpEB1{uF!dg8yS8B&iyxm z8t^Vtw=>+$aEe^%2;Ux<(iz+OkjfJ(_eqF>JG4w!1VhJ{c34KH*J<6hMBBK$>Iwng z?)8Mx?ZmMaMIw@BD9JM&AH{X8-8ZF4!uI<_di3N;(*nvc!G|=G_C%5%{}tVoGIXqw zv?ILuf3^=9Pp$~(nMfedB{i&6Y)AO=F3oAYBk3-2E}4FU=^4(y!QbJ$Z+r(M)`~XZ X=(n&}GP%4-N=>D2VkWURflZZS-lPLksX|36P>#r-r5k{i zd7KCG-etFh&5&a+z)2%26+ffW(ML2yvUQAHV25`TQuYxRf=Q!p*ZrDs>wZ-{yYASj z`BhYY8{d&Fw{l{_)wN8XzM^duQa#^rmxT*ciO-(xB>gn#Pnc^dSLiguFEjiGocnJA zHQ;Tg{*d88hEwQBTX@#ckoLq9uI-IOeMIFcl?Nom&>5MABm9x=Nh>HL)9BN$}=^m@vNjX#ku4c5={4S{tf;P=egrE d7%^V70Y|@uy`sV6f-U=PA-AfFplkf0`vJ8(VH5xW literal 0 HcmV?d00001 diff --git a/vm/program_artifacts/asm/slti_one.elf b/vm/program_artifacts/asm/slti_one.elf new file mode 100755 index 0000000000000000000000000000000000000000..25fcc241dcb9a18c21dde935e602ac6fab502727 GIT binary patch literal 788 zcma)4+e*Vg5S^wM6a=Hb2qGv%>{ICN18iv(p%kRPuZayckQ>RiR4M3#pW=u435p+} zXOeC&(FX@6XU@#o*<~`%z5ZpPP#|R*eGxN>ZwqK>l=2pxkVaLiP??HE(Oew>Ru^#z z$Y)pGGR9i=GMsdxgEO7RFGTHg@Yqf6r&KsbSdOR7hTDkh!f!-1@#OmxuO8J<`EC3@ zw&L1t8P_&4CHnl{K|$&Hb-OHFnnwGG=Z9H89eRVgu6Q Date: Thu, 11 Dec 2025 16:22:41 -0300 Subject: [PATCH 16/27] Add sltiu tests --- vm/program_artifacts/asm/sltiu.elf | Bin 0 -> 784 bytes vm/program_artifacts/asm/sltiu_negative.elf | Bin 0 -> 800 bytes vm/program_artifacts/asm/sltiu_one.elf | Bin 0 -> 788 bytes .../asm/sltiu_two_negatives.elf | Bin 0 -> 804 bytes vm/programs/asm/sltiu.s | 8 +++++++ vm/programs/asm/sltiu_negative.s | 9 ++++++++ vm/programs/asm/sltiu_one.s | 8 +++++++ vm/programs/asm/sltiu_two_negatives.s | 9 ++++++++ vm/tests/asm.rs | 21 ++++++++++++++++++ 9 files changed, 55 insertions(+) create mode 100755 vm/program_artifacts/asm/sltiu.elf create mode 100755 vm/program_artifacts/asm/sltiu_negative.elf create mode 100755 vm/program_artifacts/asm/sltiu_one.elf create mode 100755 vm/program_artifacts/asm/sltiu_two_negatives.elf create mode 100644 vm/programs/asm/sltiu.s create mode 100644 vm/programs/asm/sltiu_negative.s create mode 100644 vm/programs/asm/sltiu_one.s create mode 100644 vm/programs/asm/sltiu_two_negatives.s diff --git a/vm/program_artifacts/asm/sltiu.elf b/vm/program_artifacts/asm/sltiu.elf new file mode 100755 index 0000000000000000000000000000000000000000..bc95807067dbe9ee9f53c61d55306dc8f091cb23 GIT binary patch literal 784 zcma)4%Syvg5Isp-Q4p-S5k#m^u&dISOBXGzQjl)yRxXJRHPEynxh+)+y6{u{Fn_>> z_yKw*Y5IsR9GILrGw05|Oy;?Bb7dF?5;O4yVVd6tv0x(N4HRIagdOCN0sKXBfLL0_ zS)!a>cZ->5#dCDzfujpx_yRP~$pbgMpTRg~m-I&sG7|@k7sqkGJoRV7^9eUlP4UYV?~+UZU1FZtOV#gE ze30S@N7|j1Cn(NQ96+hzXkuF<=AaVW>iF z1sa~^j#=E+Is;2vP|ldwmcvI+TQ*S#F+L=bcIF!8=x>xQtpnGdYA57N|7RzZ$;5W( zG7C+Vc_hX)icDrJ`?I9cUL^Y?xp?X^CTAr7Mt`Tvj>#Q@TqVfAWxtiZvVpr|>wbsK MZR$R#tN)?<0XbAwa{vGU literal 0 HcmV?d00001 diff --git a/vm/program_artifacts/asm/sltiu_negative.elf b/vm/program_artifacts/asm/sltiu_negative.elf new file mode 100755 index 0000000000000000000000000000000000000000..074aea25177df3744519ff701ec6e1693cb0f669 GIT binary patch literal 800 zcma)4O-sW-5S^qSAb5xtr67Vr!QvtGLoeQ1+KM1OSi$3x*jNKe8&!FF;@-3THmq}WyH%?C(n6+yeO?uW#NHjo?1v{WhR!bkDJe1+lz z=zo%?m*~PDPX763&YT%0=XG#*ttblRQt6ABB)(m^u2RZfIwzGHRHX`)h@xe_0p3`T z%W&Sit(Fnza#Rqc5!LD%P2PyiOK|KaPjgbvFs#J$PTOrqE#bGLrg-uFnb(S%Sotl! zAFH%;TE^<$Oqo{SM_9=7`F6O%j#R3FmM2*~4f%CuEoX(U3Tzhm9?bO*;2Qj)ux=H2 zT3|{%>CQwLI7UeNg7h&7G4Vp%@?IaP2 zv|>rVM4;YA@7U;XXj|_X NbGvyf literal 0 HcmV?d00001 diff --git a/vm/program_artifacts/asm/sltiu_two_negatives.elf b/vm/program_artifacts/asm/sltiu_two_negatives.elf new file mode 100755 index 0000000000000000000000000000000000000000..43ff0e85df5342982dc9483ac43ebd83a06dec5c GIT binary patch literal 804 zcma)4%}T>S5T2wzAb5!MpeTYu!JcAU>seY_MU-ADcoEjbh8j%LkZgbSVvjzGPvG6@5ItPNm8rInNX@F2q}bfi5JaxxU2H87+-wnBYKB*efOnua6%q3ua4C?nHrH*cDv z)w#Ir3IX2g^+c!Jj$<WsU$uA z8{LpHu+5RQLfremwg(})kV;q{Gs~+0cl`* literal 0 HcmV?d00001 diff --git a/vm/programs/asm/sltiu.s b/vm/programs/asm/sltiu.s new file mode 100644 index 000000000..23ab35a66 --- /dev/null +++ b/vm/programs/asm/sltiu.s @@ -0,0 +1,8 @@ + .attribute 5, "rv32i2p1_m2p0_zmmul1p0" +.Lfunc_end0: + .globl main +main: + sltiu a0, zero, 0 + jalr zero, 0(ra) +.Lfunc_end1: + .size main, .Lfunc_end1-main diff --git a/vm/programs/asm/sltiu_negative.s b/vm/programs/asm/sltiu_negative.s new file mode 100644 index 000000000..bdaaded24 --- /dev/null +++ b/vm/programs/asm/sltiu_negative.s @@ -0,0 +1,9 @@ + .attribute 5, "rv32i2p1_m2p0_zmmul1p0" +.Lfunc_end0: + .globl main +main: + addi a2, zero, -1 + sltiu a0, a2, 1 + jalr zero, 0(ra) +.Lfunc_end1: + .size main, .Lfunc_end1-main diff --git a/vm/programs/asm/sltiu_one.s b/vm/programs/asm/sltiu_one.s new file mode 100644 index 000000000..ae2738bb5 --- /dev/null +++ b/vm/programs/asm/sltiu_one.s @@ -0,0 +1,8 @@ + .attribute 5, "rv32i2p1_m2p0_zmmul1p0" +.Lfunc_end0: + .globl main +main: + slti a0, zero, 1 + jalr zero, 0(ra) +.Lfunc_end1: + .size main, .Lfunc_end1-main diff --git a/vm/programs/asm/sltiu_two_negatives.s b/vm/programs/asm/sltiu_two_negatives.s new file mode 100644 index 000000000..63461155f --- /dev/null +++ b/vm/programs/asm/sltiu_two_negatives.s @@ -0,0 +1,9 @@ + .attribute 5, "rv32i2p1_m2p0_zmmul1p0" +.Lfunc_end0: + .globl main +main: + addi a2, zero, -10 + sltiu a0, a2, -5 + jalr zero, 0(ra) +.Lfunc_end1: + .size main, .Lfunc_end1-main diff --git a/vm/tests/asm.rs b/vm/tests/asm.rs index cdc050b77..02c0f32f3 100644 --- a/vm/tests/asm.rs +++ b/vm/tests/asm.rs @@ -196,3 +196,24 @@ fn test_slti_negative() { fn test_slti_negative_minus() { run_program_and_check_output("./program_artifacts/asm/slti_negative_minus.elf", 0); } + +#[test] +fn test_sltiu() { + run_program_and_check_output("./program_artifacts/asm/sltiu.elf", 0); +} + +#[test] +fn test_sltiu_one() { + run_program_and_check_output("./program_artifacts/asm/sltiu_one.elf", 1); +} + +#[test] +fn test_sltiu_negative() { + run_program_and_check_output("./program_artifacts/asm/sltiu_negative.elf", 0); +} + +#[test] +fn test_sltiu_two_negatives() { + run_program_and_check_output("./program_artifacts/asm/sltiu_two_negatives.elf", 1); +} + From 0f50b3b1e5c31b18c2253020d55057b4c8da6f91 Mon Sep 17 00:00:00 2001 From: Gianbelinche <39842759+gianbelinche@users.noreply.github.com> Date: Thu, 11 Dec 2025 16:35:47 -0300 Subject: [PATCH 17/27] Add basic rust elf --- vm/program_artifacts/rust/basic_rust.elf | Bin 0 -> 904 bytes 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100755 vm/program_artifacts/rust/basic_rust.elf diff --git a/vm/program_artifacts/rust/basic_rust.elf b/vm/program_artifacts/rust/basic_rust.elf new file mode 100755 index 0000000000000000000000000000000000000000..0427f1f37076a4599e1d3aa348d601b880c973b1 GIT binary patch literal 904 zcmah|%Wl&^6uk}&?J|NT5*U<4f)r=$_|a5skP548_=4icI5F6cu_sYl3Bjkpjt}aR zEgw+v0p%XM(>C33l;gQC-?=kB`Sxz{-Y^W(=+R$-cR4V~<+bW{8JA4z(})iF`Itk< zxm*eUU>iKR;axXa23_(KM4kqSbUyX~kJtzMOyocOQ3=e4z`npE9_#DfCiI$PAo?Tx zlp8I-vr%sv6`NaGH`%&0ZEG$pF)6dXAp6`3XOh%3! z2@%fH9(GbeK@`>b#(aduG@o7}Dh z=N{nR@%h|W*UvbQyX;`l^S$~Wz1;J!u7~XFyMKaPvy|K^!r2O0veAxZg-X>~v{AAl zt2r-J81cGlRNYzKO3s(at!7yo?sg(i(s?;=nzWFOqT!B)34TSGm3t%n$H7TJeDhW( zyh0-yt(Mq1WTH-A(QmeYGBtD`mQ|}89fy9P84c6{ub4NIZ~b4K_{bLKfIhJ=df{Ex b;Vq8%r8l=;Hxpd^Pwv;9avi?9hTiud%(!@B literal 0 HcmV?d00001 From 4c41a82a769a44d26caaa453d0bda9ebf5651255 Mon Sep 17 00:00:00 2001 From: Gianbelinche <39842759+gianbelinche@users.noreply.github.com> Date: Thu, 11 Dec 2025 16:40:07 -0300 Subject: [PATCH 18/27] Clean only run files --- vm/Makefile | 10 +++++++--- 1 file changed, 7 insertions(+), 3 deletions(-) diff --git a/vm/Makefile b/vm/Makefile index 0c18abfc5..21c8aaddd 100644 --- a/vm/Makefile +++ b/vm/Makefile @@ -12,9 +12,9 @@ RUST_PROGRAM_DIRS := $(dir $(wildcard $(RUST_PROGRAMS_DIR)/*/Cargo.toml)) RUST_PROGRAMS := $(notdir $(basename $(RUST_PROGRAM_DIRS:%/=%))) RUST_ARTIFACTS := $(addprefix $(RUST_ARTIFACTS_DIR)/, $(addsuffix .elf, $(RUST_PROGRAMS))) -compile-programs-asm: clean $(ARTIFACTS_ASM) +compile-programs-asm: clean-asm $(ARTIFACTS_ASM) -compile-programs-rust: clean $(RUST_ARTIFACTS) +compile-programs-rust: clean-rust $(RUST_ARTIFACTS) compile-programs: compile-programs-asm compile-programs-rust @@ -36,12 +36,16 @@ $(RUST_ARTIFACTS_DIR)/%.elf: $(RUST_PROGRAMS_DIR)/%/Cargo.toml cp $(RUST_PROGRAMS_DIR)/$*/target/riscv32im-unknown-none-elf/debug/$* $@ rm -rf $(RUST_PROGRAMS_DIR)/$*/target -clean: +clean-asm: -rm -rf $(ASM_ARTIFACTS_DIR) mkdir -p $(ASM_ARTIFACTS_DIR) + +clean-rust: -rm -rf $(RUST_ARTIFACTS_DIR) mkdir -p $(RUST_ARTIFACTS_DIR) +clean: clean-asm clean-rust + test: compile-programs test-no-compile test-asm: compile-programs-asm From 2d5c573a540b8e9381f787fb4cffdcf7c07bf36d Mon Sep 17 00:00:00 2001 From: Gianbelinche <39842759+gianbelinche@users.noreply.github.com> Date: Thu, 11 Dec 2025 16:40:36 -0300 Subject: [PATCH 19/27] Format code --- vm/src/vm/execution.rs | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/vm/src/vm/execution.rs b/vm/src/vm/execution.rs index b7162d60a..e6fb8f9ae 100644 --- a/vm/src/vm/execution.rs +++ b/vm/src/vm/execution.rs @@ -152,7 +152,12 @@ fn run_instruction( *pc += offset } } - Instruction::Arith { dst, src1, src2, op } => { + Instruction::Arith { + dst, + src1, + src2, + op, + } => { let (a, b) = (registers.0[*src1 as usize], registers.0[*src2 as usize]); let res = match op { ArithOp::Add => a.wrapping_add(b), From 8618c318fe48390569547655f18f4187859d174e Mon Sep 17 00:00:00 2001 From: Gianbelinche <39842759+gianbelinche@users.noreply.github.com> Date: Thu, 11 Dec 2025 16:41:11 -0300 Subject: [PATCH 20/27] Clippy --- vm/src/vm/execution.rs | 1 - 1 file changed, 1 deletion(-) diff --git a/vm/src/vm/execution.rs b/vm/src/vm/execution.rs index e6fb8f9ae..7c197a20b 100644 --- a/vm/src/vm/execution.rs +++ b/vm/src/vm/execution.rs @@ -173,6 +173,5 @@ fn run_instruction( }; registers.0[*dst as usize] = res; } - _ => unimplemented!(), } } From 8ae41183ed68f56f7a9dee9b647fa4424aef084f Mon Sep 17 00:00:00 2001 From: Gianbelinche <39842759+gianbelinche@users.noreply.github.com> Date: Thu, 11 Dec 2025 17:32:38 -0300 Subject: [PATCH 21/27] Add slli tests --- vm/program_artifacts/asm/addi_255.elf | Bin 0 -> 792 bytes vm/program_artifacts/asm/slli.elf | Bin 0 -> 784 bytes vm/program_artifacts/asm/slli_ff_four.elf | Bin 0 -> 796 bytes vm/program_artifacts/asm/slli_max.elf | Bin 0 -> 792 bytes vm/program_artifacts/asm/slli_max_half.elf | Bin 0 -> 796 bytes vm/program_artifacts/asm/slli_max_max.elf | Bin 0 -> 796 bytes vm/program_artifacts/asm/slli_one.elf | Bin 0 -> 788 bytes vm/program_artifacts/asm/slli_one_one.elf | Bin 0 -> 796 bytes vm/program_artifacts/asm/slli_one_zero.elf | Bin 0 -> 796 bytes vm/programs/asm/addi_255.s | 9 ++++ vm/programs/asm/slli.s | 8 ++++ vm/programs/asm/slli_ff_four.s | 9 ++++ vm/programs/asm/slli_max.s | 9 ++++ vm/programs/asm/slli_max_half.s | 9 ++++ vm/programs/asm/slli_max_max.s | 9 ++++ vm/programs/asm/slli_one.s | 8 ++++ vm/programs/asm/slli_one_one.s | 9 ++++ vm/programs/asm/slli_one_zero.s | 9 ++++ vm/src/vm/execution.rs | 2 + vm/src/vm/instructions.rs | 4 +- vm/tests/asm.rs | 50 ++++++++++++++++++--- 21 files changed, 128 insertions(+), 7 deletions(-) create mode 100755 vm/program_artifacts/asm/addi_255.elf create mode 100755 vm/program_artifacts/asm/slli.elf create mode 100755 vm/program_artifacts/asm/slli_ff_four.elf create mode 100755 vm/program_artifacts/asm/slli_max.elf create mode 100755 vm/program_artifacts/asm/slli_max_half.elf create mode 100755 vm/program_artifacts/asm/slli_max_max.elf create mode 100755 vm/program_artifacts/asm/slli_one.elf create mode 100755 vm/program_artifacts/asm/slli_one_one.elf create mode 100755 vm/program_artifacts/asm/slli_one_zero.elf create mode 100644 vm/programs/asm/addi_255.s create mode 100644 vm/programs/asm/slli.s create mode 100644 vm/programs/asm/slli_ff_four.s create mode 100644 vm/programs/asm/slli_max.s create mode 100644 vm/programs/asm/slli_max_half.s create mode 100644 vm/programs/asm/slli_max_max.s create mode 100644 vm/programs/asm/slli_one.s create mode 100644 vm/programs/asm/slli_one_one.s create mode 100644 vm/programs/asm/slli_one_zero.s diff --git a/vm/program_artifacts/asm/addi_255.elf b/vm/program_artifacts/asm/addi_255.elf new file mode 100755 index 0000000000000000000000000000000000000000..f0179eebad0ded37f920223db0092eb948955490 GIT binary patch literal 792 zcma)4O-sW-5S^w?KoA=3MG!%uU{9e<+q*5TB9wyE`2A5Tv0U|BiT7eF7o30ITcP2s?oe@dS=)Vff?4tQxMGjMp#GX zxA7a*)!?Jc7oAWZXnMl6_!_!$Z?QNjjt$N>H_9ifn80LaWt?E?$it?)dse1Cfv0L#^nfYzf zpIBz)wV0c0Cs}-cZ!(eSrMqnrF3iLZI~9mM#MMB1Kel%tYQRa~t*C?`Mer12=G}?<&LWuFyV@&Qy`i=fhmmQNg1i4DsqO;z@URmH_!It%Q NdA6$ipsx0Z?gvD{RmuPW literal 0 HcmV?d00001 diff --git a/vm/program_artifacts/asm/slli_ff_four.elf b/vm/program_artifacts/asm/slli_ff_four.elf new file mode 100755 index 0000000000000000000000000000000000000000..951f287291355cf07f27d1458d7735d987ade65e GIT binary patch literal 796 zcma)4OH0E*5T2wD5CkJd5kycZ*n@;VJa}zsD}ofEdR`Kn)?m_xWLv5ibM&Y9v-}B) z7jODa((NN&9GLy)o0*-R-JO@tbyw3gQlirrF_T!&foD1;{G5(SrwSFRKsllyRvUno zg`EfT-c_}f#qhBfpkxr0iXS_ry)KR5Y@Wgwy3zfNv?G{>aMq~1^`IvFdQcV5zCZP9 zK^2j|!acI&)=o^hzTwH!=MRoe?!zSn6OZ35k$(b{Ac6OP}OQ+Y>G>w$$^hL}hz71emr-V1?oOCKvkqVR}3K!}CYgTa{ z$Y(d*Qno;jy#ObJs8sw|mX5nLLb7>@T;#lPy`q7? RW}AM8$ZhMsp{xI)`vEpUS~UOw literal 0 HcmV?d00001 diff --git a/vm/program_artifacts/asm/slli_max_half.elf b/vm/program_artifacts/asm/slli_max_half.elf new file mode 100755 index 0000000000000000000000000000000000000000..f76d99e09ccafaa3d4838e2e47f6242742d6232f GIT binary patch literal 796 zcma)4%Syvg5S^qC5L`s6D2Sj?u!5AnHZEIQMUaA2++J>MYy(LfliO0=*rlK1XZZ<= zAh@b$lBSR7!hy+|Gjs0T%VeHgSLd3hQEWPW5;KKw4S1?k$ZK>+Iu$5O8A=g()A#_e zFptwfKD+D|u_`F3zOChY)W#vfNJcEu|Tx8jw=lk1M0 zvR6XoxA7a0`EqLagT(ZnJPr99lW-*iXcU(o|lacHJG#^*-G_dj{X#XmOnue z#9RF)>GlyX4$OY@&CJfu?#@f^>fA64(qhsVF;iGuz*CbF-l8KisX|36P>v{w^#)*N zVdsIocU3KAF?_5AC|N|M;>WzS`)!QiY@fgvy3ySu8HX?n;bXJmHiEkF8$nGx`~K9c z2Q@_g3irs8TRSo3=7uLvpK~0W+==7dVJS5ht4VvX;{CLqg?zqKY-w)LS%!Br{2HA5 z*#=s`+f00z;SU*3k>|O>mowJtgvv824@roTH?gHBf{8m;PFRL#&~4weMW=Uh*%t!5 zGZ=_oznj>06p2X5P?0a)F@l@9&QK~z!WpBRYV_nQX#-W5;=Q(%GgDMeKBX#^3SE1u zoCpp7Qx1^FFIR-}n{ICN18iv(p%kRPuZayckfb5mmMR5(@KgLSKSA*W z^i0z2CHmmNw$$^hL}hzD=O1Q_7okN;*}jOeHE1MRRokSXsnH zAfH`z%NT3fOK>uX4h{_(y%4p|!DBDEpOSWhuoO=lb*~=PL{N{a;wcCwel4n^^4s`* zY=yPkGOllAiuC!tgM!lY>vmbVG@bSl&yTWx2J|L#L-A}5>--{D?}2mwEuaCs$<^<2 ze3avq_`WB`p=*uFoRK*sAx8e#v3(JZy->QbiOitWx^0Pe_v*SY1bBNe5Z!(!jh!SB ziL_%$f$fDTZff13Eo~BRI3%)?$3WT+P{tWPs7SgqNmlwpEL+Ohb0*SF@YsLaF?2k& zGMwijfjkpsSf$j?@Z}v^&~!J{4skA(-+AA9POSbB_ NhupgE1G>f^x*x-HSFZp7 literal 0 HcmV?d00001 diff --git a/vm/program_artifacts/asm/slli_one_one.elf b/vm/program_artifacts/asm/slli_one_one.elf new file mode 100755 index 0000000000000000000000000000000000000000..592be33f8d12b70a1558071e70c129a679d0bfb4 GIT binary patch literal 796 zcma)4OH0E*5T2wD5IjVRMG!%uU=I@dI(Thq6+wznJuit3HJBI4R;m|s^r!f<{0rj6 zn|_mY`-m3@X21DnW@l%2=XG>_p=lZ^(dmnrNvu8KnNAt+(J|@Nq$*XYL=>fJ1F*TY z%Rt_{u9mYDKGq7945C`qpxS<&W^ndT;fvkm{)x0Bn3edc+i^QlTlk%*C0=}g?zN*9 zB7cQ@WGQW&m~(y0Q>M=!9Gl&V^Ue7>2-zhZ|*XX>!hXsBE&i(8H z4d7iNJ}vOa0;k0DToDEis~J*bL5(R1G4n#(@qJdv;DgCT zjK;&vwv$98(uyVdmKz|ro$E|3X_0UObYmvZzO-zhjB|WYmUI@9%FXb5wiS{|^0tmZ5wGBmeIX6!li} Xh61bN@Tz)yus8F*5$LXVt@C~XB&k{V literal 0 HcmV?d00001 diff --git a/vm/program_artifacts/asm/slli_one_zero.elf b/vm/program_artifacts/asm/slli_one_zero.elf new file mode 100755 index 0000000000000000000000000000000000000000..af00306cd1b9b94675fe41fca414403551fabb1a GIT binary patch literal 796 zcma)4%Syvg5S^rLKyVSMq9B4o!3q-k+PG|K6+sG8aeGN@sDZppZcFXPF8vfg%U=*z zuJlaO^buV+FgbH(&YgRi%uDa)Qc)DjOr=j^Ch=_n&s9ozi;hX9Drr=r0#P{64gjl* zxCrF4t8OWqBgbBXlTK9DbSm#@G(xg{id^Kx4--<35SF4zv*9$ty6_rdP0T!R?AF5? zD!+~2$W~apG3Dw;rbr*(J1As&e&H?)m!{G_;`u?^Plx`Dxt?)_E^@q=}W|6d~l8of97^akwV~wR9 z { diff --git a/vm/src/vm/instructions.rs b/vm/src/vm/instructions.rs index dd43e13a5..4c6048d07 100644 --- a/vm/src/vm/instructions.rs +++ b/vm/src/vm/instructions.rs @@ -250,12 +250,12 @@ fn parse_i_instruction(instruction: u32, opcode: Opcode) -> Instruction { AND_FUNC_IDENTIFIER => ArithOp::And, SHL_FUNC_IDENTIFIER => { assert!(imm >> 5 == 0); - imm &= 0xF; + imm &= 0x1F; ArithOp::ShiftLeftLogical } SR_FUNC_IDENTIFIER => { let func_id = imm >> 5; - imm &= 0xF; + imm &= 0x1F; match func_id { 0x00 => ArithOp::ShiftRightLogical, 0x20 => ArithOp::ShiftRightArith, diff --git a/vm/tests/asm.rs b/vm/tests/asm.rs index 02c0f32f3..889f142cc 100644 --- a/vm/tests/asm.rs +++ b/vm/tests/asm.rs @@ -15,10 +15,7 @@ fn run_program_and_check_output(elf_path: &str, expected_output: i32) { #[test] fn test_basic_program() { - run_program_and_check_output( - "./program_artifacts/asm/basic_program.elf", - 0, - ); + run_program_and_check_output("./program_artifacts/asm/basic_program.elf", 0); } #[test] @@ -56,6 +53,11 @@ fn test_addi_reg_min() { run_program_and_check_output("./program_artifacts/asm/addi_reg_min.elf", -2070); } +#[test] +fn test_addi_255() { + run_program_and_check_output("./program_artifacts/asm/addi_255.elf", 255); +} + #[test] fn test_add() { run_program_and_check_output("./program_artifacts/asm/add.elf", 30); @@ -146,7 +148,6 @@ fn test_ori_max() { run_program_and_check_output("./program_artifacts/asm/ori_max.elf", 0xFFFFFFFFu32 as i32); } - #[test] fn test_xori() { run_program_and_check_output("./program_artifacts/asm/xori.elf", 0x00); @@ -217,3 +218,42 @@ fn test_sltiu_two_negatives() { run_program_and_check_output("./program_artifacts/asm/sltiu_two_negatives.elf", 1); } +#[test] +fn test_slli() { + run_program_and_check_output("./program_artifacts/asm/slli.elf", 0); +} + +#[test] +fn test_slli_one() { + run_program_and_check_output("./program_artifacts/asm/slli_one.elf", 0); +} + +#[test] +fn test_slli_one_one() { + run_program_and_check_output("./program_artifacts/asm/slli_one_one.elf", 2); +} + +#[test] +fn test_slli_one_zero() { + run_program_and_check_output("./program_artifacts/asm/slli_one_zero.elf", 1); +} + +#[test] +fn test_slli_ff_four() { + run_program_and_check_output("./program_artifacts/asm/slli_ff_four.elf", 0xFF0); +} + +#[test] +fn test_slli_max() { + run_program_and_check_output("./program_artifacts/asm/slli_max.elf", 0xFFFFFFF0u32 as i32); +} + +#[test] +fn test_slli_max_half() { + run_program_and_check_output("./program_artifacts/asm/slli_max_half.elf", 0xFFFF8000u32 as i32); +} + +#[test] +fn test_slli_max_max() { + run_program_and_check_output("./program_artifacts/asm/slli_max_max.elf", 0x80000000u32 as i32); +} From 976cf3edcb22f53a9b6b04dda25618d88591f4ee Mon Sep 17 00:00:00 2001 From: Gianbelinche <39842759+gianbelinche@users.noreply.github.com> Date: Thu, 11 Dec 2025 17:32:51 -0300 Subject: [PATCH 22/27] Format code --- vm/tests/asm.rs | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-) diff --git a/vm/tests/asm.rs b/vm/tests/asm.rs index 889f142cc..bdab697cd 100644 --- a/vm/tests/asm.rs +++ b/vm/tests/asm.rs @@ -250,10 +250,16 @@ fn test_slli_max() { #[test] fn test_slli_max_half() { - run_program_and_check_output("./program_artifacts/asm/slli_max_half.elf", 0xFFFF8000u32 as i32); + run_program_and_check_output( + "./program_artifacts/asm/slli_max_half.elf", + 0xFFFF8000u32 as i32, + ); } #[test] fn test_slli_max_max() { - run_program_and_check_output("./program_artifacts/asm/slli_max_max.elf", 0x80000000u32 as i32); + run_program_and_check_output( + "./program_artifacts/asm/slli_max_max.elf", + 0x80000000u32 as i32, + ); } From 2d8c69061473766b67fcbce7ec2e1a7370052315 Mon Sep 17 00:00:00 2001 From: Gianbelinche <39842759+gianbelinche@users.noreply.github.com> Date: Thu, 11 Dec 2025 17:49:39 -0300 Subject: [PATCH 23/27] Clippy --- vm/src/vm/execution.rs | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/vm/src/vm/execution.rs b/vm/src/vm/execution.rs index fba60e073..c2742d4a4 100644 --- a/vm/src/vm/execution.rs +++ b/vm/src/vm/execution.rs @@ -27,7 +27,7 @@ fn run_from_entrypoint(memory: &mut Memory, entrypoint: u32) -> (i32, i32) { run_instruction(&instruction, &mut registers, &mut pc, memory); } println!("Final Register Values:\n {}", ®isters); - let return_values = (registers.0[10] as i32, registers.0[11] as i32); + let return_values = (registers.0[10], registers.0[11]); println!("Return Values: {return_values:?}"); return_values } @@ -78,7 +78,7 @@ fn run_instruction( *pc += 4; match inst { Instruction::ArithImm { dst, src, imm, op } => { - let (a, b) = (registers.0[*src as usize] as i32, *imm); + let (a, b) = (registers.0[*src as usize], *imm); let res = match op { ArithOp::Add => a.wrapping_add(b), ArithOp::Sub => panic!("SubImm not supported"), @@ -97,7 +97,7 @@ fn run_instruction( if *dst != 0 { registers.0[*dst as usize] = *pc as i32; } - *pc = (registers.0[*base as usize] as i32 + offset) as u32; + *pc = (registers.0[*base as usize] + offset) as u32; } Instruction::JumpAndLink { dst, offset } => { if *dst != 0 { @@ -128,7 +128,7 @@ fn run_instruction( base, width, } => { - let value = memory.0[&((registers.0[*base as usize] as i32 + *offset) as u32)]; + let value = memory.0[&((registers.0[*base as usize] + *offset) as u32)]; let value = match width { LoadStoreWidth::Byte => todo!(), LoadStoreWidth::Half => todo!(), From ddf3145adb2f017701495d7017fd44da4d45dbcc Mon Sep 17 00:00:00 2001 From: Gianbelinche <39842759+gianbelinche@users.noreply.github.com> Date: Thu, 11 Dec 2025 18:07:02 -0300 Subject: [PATCH 24/27] Add srli tests --- vm/program_artifacts/asm/srli.elf | Bin 0 -> 784 bytes vm/program_artifacts/asm/srli_max.elf | Bin 0 -> 792 bytes vm/program_artifacts/asm/srli_max_max.elf | Bin 0 -> 796 bytes vm/program_artifacts/asm/srli_one.elf | Bin 0 -> 788 bytes vm/program_artifacts/asm/srli_one_one.elf | Bin 0 -> 796 bytes vm/program_artifacts/asm/srli_one_zero.elf | Bin 0 -> 796 bytes vm/program_artifacts/asm/srli_two_one.elf | Bin 0 -> 796 bytes vm/programs/asm/srli.s | 8 +++++ vm/programs/asm/srli_max.s | 9 +++++ vm/programs/asm/srli_max_max.s | 9 +++++ vm/programs/asm/srli_one.s | 8 +++++ vm/programs/asm/srli_one_one.s | 9 +++++ vm/programs/asm/srli_one_zero.s | 9 +++++ vm/programs/asm/srli_two_one.s | 9 +++++ vm/src/vm/execution.rs | 2 +- vm/tests/asm.rs | 38 +++++++++++++++++++++ 16 files changed, 100 insertions(+), 1 deletion(-) create mode 100755 vm/program_artifacts/asm/srli.elf create mode 100755 vm/program_artifacts/asm/srli_max.elf create mode 100755 vm/program_artifacts/asm/srli_max_max.elf create mode 100755 vm/program_artifacts/asm/srli_one.elf create mode 100755 vm/program_artifacts/asm/srli_one_one.elf create mode 100755 vm/program_artifacts/asm/srli_one_zero.elf create mode 100755 vm/program_artifacts/asm/srli_two_one.elf create mode 100644 vm/programs/asm/srli.s create mode 100644 vm/programs/asm/srli_max.s create mode 100644 vm/programs/asm/srli_max_max.s create mode 100644 vm/programs/asm/srli_one.s create mode 100644 vm/programs/asm/srli_one_one.s create mode 100644 vm/programs/asm/srli_one_zero.s create mode 100644 vm/programs/asm/srli_two_one.s diff --git a/vm/program_artifacts/asm/srli.elf b/vm/program_artifacts/asm/srli.elf new file mode 100755 index 0000000000000000000000000000000000000000..df2672ae22194d107fba04daf0a86a0393326075 GIT binary patch literal 784 zcma)4%Syvg5IspBD1ubn2qIJ{*j4Fk>87Ri0oqM4~^Rb*izk2F$90Ny;lK+G@V zBvJ0Jszpq+;wd^Zz~Md6e*tP|TtE~=E`wSSVR zy39foWgf9{jY2!+SN3N?!@bDIgcwad!uXD)-{|jj*)e%TkgJ4UI_oX%l?4V%wyJl) Mvvu7Eb(KGKKlHs;5C8xG literal 0 HcmV?d00001 diff --git a/vm/program_artifacts/asm/srli_max.elf b/vm/program_artifacts/asm/srli_max.elf new file mode 100755 index 0000000000000000000000000000000000000000..24b6cd10e5aee97dcdbdcd5aecda7f68dd3e0f26 GIT binary patch literal 792 zcma)4%Syvg5S^qC5Co&$2qGv1>?-v20k*Uip%kRLzTVhS14$c_+fv=wrJv$w`3Z{d z>zSnKBf4;4a^}pOJNGh~mrk#%X&R-b(-$#Q_%?uLonqdgGt#L{MJiB^C|INiShI@r zKt8+amaqkK>;*U(M5W@#vUJy_5t7XdA5OHTw7cdVSyL}t)#-Zn+6b9LPp0=zXCh)%y9 z$95EnNXbxlE8LzPv{(8t+HCN1RJ0pI~~1^KbBXcplDoFk+=>4~~9odqo3p R%{KiGk=xdNLs$Pp_XFotT6+Kh literal 0 HcmV?d00001 diff --git a/vm/program_artifacts/asm/srli_max_max.elf b/vm/program_artifacts/asm/srli_max_max.elf new file mode 100755 index 0000000000000000000000000000000000000000..afd130b30202e7800a272fac361e065250917eb8 GIT binary patch literal 796 zcma)4OH0E*5T2wD5Ij^0B8Z?+um=f!9lTarMUW!Yo|lacHJG#^*_P_X9Q`T&EPsL` zh`0Jp((NN&9GLy)o0*-R-JO^2&81-&q{XB!Vy3XRfM+HpyhX=kQk9BSpd3*U>kYu_ z(#`{U@48ybV)$4KP%06Xiyw>f;M*9%**=9Ybffzj8AmV+;jGzk8$n(8ji4r;eShlJ zgBl`#g?nVlZJd~LbIX&b&jpT6?!31^IMtmw&C(gvz9#RqLEXRgRfKE;wsg|0nS zPK1X4DTm18mn%Z~O%#ydMGHnMkrS*uOG}!}h@K_(rLUi&-oySk=sPqI{ICN18iv(p%kS0ye2l(K$3=JTdEZF!B6qS`~<}h z&@)N5m*|57lQU=L?Cdg`=Wg#p(=<}1(-$$5_%?y2PAPBF3F%a!GL@)66wTEEU}X^( zfqZt=En}=@FTu$mI=D4x^g`4+1CPDreoERg!cshK)V+FC6G1(yil-o$__e5t%5UTM zu@%;C%ecOgDbnZn4hl-ouiIte(sbHKJU`6(8PJ=|4aKuLtn>3+y$8!u~z-OH=K5a8{>Ky>?^GkWSoyXFTZN_r>M#`eq~q_~m#k zhND4d+eso4X~mL!%MB3R&2^@hv`9Dsx-pYyUs^U$#yLJJOFBzQX7(wjC1vc|bLk{# z_@8owJbt+^8zW zD!+~2$W~apG3Dw;rbr*(J1As&e&H?)m!{Gl;`x5sPlNuHxt4K-&U4(z@f&dNzYWxY z_qn>A<8F>q9J!7Nd|S-yD9{6{PN_O1Ax3UsnXU)}$Cq|gMP|_J+;&9QxV-8M0p1-9 zgwgLMu@%Q6mS!Z$GaVnrO|3mNrAfl}heUe(>`BuC$|%LhERyzAlAin(-IOwNtg*CX zy!d~102xoN4Ck3hAkQT;tW;vh`0_3-XtE>OE^#iMeu~){&cDIm;k<8r2P4*sw&3Wu Vv{y8ETC!C?-i3AD7j&&ZbU#naTDJfI literal 0 HcmV?d00001 diff --git a/vm/program_artifacts/asm/srli_two_one.elf b/vm/program_artifacts/asm/srli_two_one.elf new file mode 100755 index 0000000000000000000000000000000000000000..7fac2f603c5897527cd9f32219c6c21bd08526aa GIT binary patch literal 796 zcma)4OH0E*5T2wD5IjT*MG&Dv!5$>^b?{ng6+wzndtMS7YA|U+vaQvNIr>xlS^fp_ z;!VFvx_!ip1GC?JGqba^yYo7@xzsd`l<4$D%p}$>@Jy$acd14?HK>`l&ZmMN0fseHWC4;C^u2E%Nr74`fQ}`k`zF&}b46_t1I&HTdwuIjfo8ray=Uyvp zBJx+bN0!3Yi5b^-JVpBa!LjL`IL;kbGGn#sRE3osX7vo@^PLhyagEM%yr1K@;M~tX z&;X8e@kx$9<~YTX=L-20h+yWJ0o9jOpO6q!FR(37gn>JgPE?0y)bHK(#Kqw1dME_= z#b_i3!+vVpaV%nKMUs5WoguiJ>r58F^Ml#y%C zr4ys!f65W^_~pt_eiI4gcTs|oO63GA&(eyfGoogRec9`0sP?e`9r^(+Lir3v{@*<) a>aFDs1=hvkRrL;FZ|8j@&{^-= a | b, ArithOp::And => a & b, ArithOp::ShiftLeftLogical => a << b, - ArithOp::ShiftRightLogical => a >> b, + ArithOp::ShiftRightLogical => ((a as u32) >> (b as u32)) as i32, ArithOp::ShiftRightArith => a >> b, ArithOp::SetLessThan => (a < b) as i32, ArithOp::SetLessThanU => ((a as u32) < (b as u32)) as i32, diff --git a/vm/tests/asm.rs b/vm/tests/asm.rs index bdab697cd..7d49cdf14 100644 --- a/vm/tests/asm.rs +++ b/vm/tests/asm.rs @@ -263,3 +263,41 @@ fn test_slli_max_max() { 0x80000000u32 as i32, ); } + +#[test] +fn test_srli() { + run_program_and_check_output("./program_artifacts/asm/srli.elf", 0); +} + +#[test] +fn test_srli_one() { + run_program_and_check_output("./program_artifacts/asm/srli_one.elf", 0); +} + +#[test] +fn test_srli_one_zero() { + run_program_and_check_output("./program_artifacts/asm/srli_one_zero.elf", 1); +} + +#[test] +fn test_srli_one_one() { + run_program_and_check_output("./program_artifacts/asm/srli_one_one.elf", 0); +} + +#[test] +fn test_srli_two_one() { + run_program_and_check_output("./program_artifacts/asm/srli_two_one.elf", 1); +} + +#[test] +fn test_srli_max() { + run_program_and_check_output("./program_artifacts/asm/srli_max.elf", 0x0FFFFFFFu32 as i32); +} + +#[test] +fn test_srli_max_max() { + run_program_and_check_output( + "./program_artifacts/asm/srli_max_max.elf", + 0x00000001, + ); +} From aaf907381b46793b7d675530d04ac3122b2c9255 Mon Sep 17 00:00:00 2001 From: Gianbelinche <39842759+gianbelinche@users.noreply.github.com> Date: Thu, 11 Dec 2025 18:07:13 -0300 Subject: [PATCH 25/27] Format --- vm/tests/asm.rs | 5 +---- 1 file changed, 1 insertion(+), 4 deletions(-) diff --git a/vm/tests/asm.rs b/vm/tests/asm.rs index 7d49cdf14..0da72f6cf 100644 --- a/vm/tests/asm.rs +++ b/vm/tests/asm.rs @@ -296,8 +296,5 @@ fn test_srli_max() { #[test] fn test_srli_max_max() { - run_program_and_check_output( - "./program_artifacts/asm/srli_max_max.elf", - 0x00000001, - ); + run_program_and_check_output("./program_artifacts/asm/srli_max_max.elf", 0x00000001); } From 373ee524e78f9c45de7cf330e54253eae3416b4a Mon Sep 17 00:00:00 2001 From: Gianbelinche <39842759+gianbelinche@users.noreply.github.com> Date: Fri, 12 Dec 2025 10:58:50 -0300 Subject: [PATCH 26/27] Address comment --- vm/src/vm/execution.rs | 30 +++++++++++++++--------------- 1 file changed, 15 insertions(+), 15 deletions(-) diff --git a/vm/src/vm/execution.rs b/vm/src/vm/execution.rs index 208dea2dc..76d8849e9 100644 --- a/vm/src/vm/execution.rs +++ b/vm/src/vm/execution.rs @@ -13,31 +13,31 @@ pub fn run_program(instruction_map: BTreeMap, entrypoint: u32) -> (i32 fn load_program(instruction_map: BTreeMap, memory: &mut Memory) { for (addr, instruction) in instruction_map { - memory.0.insert(addr, instruction as i32); + memory.0.insert(addr, instruction); } } fn run_from_entrypoint(memory: &mut Memory, entrypoint: u32) -> (i32, i32) { let mut pc = entrypoint; let mut registers = Registers::default(); - registers.0[2] = 0xFFFFFFFFu32 as i32; // 4GB - while pc as i32 != registers.0[1] { + registers.0[2] = 0xFFFFFFFFu32; // 4GB + while pc != registers.0[1] { let next_instruction = memory.0[&pc]; let instruction = Instruction::parse(next_instruction as u32); run_instruction(&instruction, &mut registers, &mut pc, memory); } println!("Final Register Values:\n {}", ®isters); - let return_values = (registers.0[10], registers.0[11]); + let return_values = (registers.0[10] as i32, registers.0[11] as i32); println!("Return Values: {return_values:?}"); return_values } // Toy Memory, TODO: Make expandable memory #[derive(Default, Debug)] -struct Memory(BTreeMap); +struct Memory(BTreeMap); #[derive(Default, Debug)] -struct Registers([i32; 32]); +struct Registers([u32; 32]); // Registers: // 0x zero // a0-ax function arguments: 0x10 -etc @@ -78,7 +78,7 @@ fn run_instruction( *pc += 4; match inst { Instruction::ArithImm { dst, src, imm, op } => { - let (a, b) = (registers.0[*src as usize], *imm); + let (a, b) = (registers.0[*src as usize] as i32, *imm); let res = match op { ArithOp::Add => a.wrapping_add(b), ArithOp::Sub => panic!("SubImm not supported"), @@ -91,17 +91,17 @@ fn run_instruction( ArithOp::SetLessThan => (a < b) as i32, ArithOp::SetLessThanU => ((a as u32) < (b as u32)) as i32, }; - registers.0[*dst as usize] = res; + registers.0[*dst as usize] = res as u32; } Instruction::JumpAndLinkRegister { dst, base, offset } => { if *dst != 0 { - registers.0[*dst as usize] = *pc as i32; + registers.0[*dst as usize] = *pc; } - *pc = (registers.0[*base as usize] + offset) as u32; + *pc = (registers.0[*base as usize] as i32 + offset) as u32; } Instruction::JumpAndLink { dst, offset } => { if *dst != 0 { - registers.0[*dst as usize] = *pc as i32; + registers.0[*dst as usize] = *pc; } *pc -= 4; *pc = (*pc as i32 + offset) as u32; @@ -120,7 +120,7 @@ fn run_instruction( }; memory .0 - .insert((registers.0[*base as usize] + *offset as i32) as u32, value); + .insert((registers.0[*base as usize] + *offset) as u32, value); } Instruction::Load { dst, @@ -128,7 +128,7 @@ fn run_instruction( base, width, } => { - let value = memory.0[&((registers.0[*base as usize] + *offset) as u32)]; + let value = memory.0[&((registers.0[*base as usize] as i32 + *offset) as u32)]; let value = match width { LoadStoreWidth::Byte => todo!(), LoadStoreWidth::Half => todo!(), @@ -159,7 +159,7 @@ fn run_instruction( src2, op, } => { - let (a, b) = (registers.0[*src1 as usize], registers.0[*src2 as usize]); + let (a, b) = (registers.0[*src1 as usize] as i32, registers.0[*src2 as usize] as i32); let res = match op { ArithOp::Add => a.wrapping_add(b), ArithOp::Sub => a - b, @@ -172,7 +172,7 @@ fn run_instruction( ArithOp::SetLessThan => (a < b) as i32, ArithOp::SetLessThanU => ((a as u32) < (b as u32)) as i32, }; - registers.0[*dst as usize] = res; + registers.0[*dst as usize] = res as u32; } } } From a6abdce3b21fd4434cdbd501e8354e812057f294 Mon Sep 17 00:00:00 2001 From: Gianbelinche <39842759+gianbelinche@users.noreply.github.com> Date: Fri, 12 Dec 2025 11:03:15 -0300 Subject: [PATCH 27/27] Clippy --- vm/src/vm/execution.rs | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) diff --git a/vm/src/vm/execution.rs b/vm/src/vm/execution.rs index 76d8849e9..8ad647489 100644 --- a/vm/src/vm/execution.rs +++ b/vm/src/vm/execution.rs @@ -23,7 +23,7 @@ fn run_from_entrypoint(memory: &mut Memory, entrypoint: u32) -> (i32, i32) { registers.0[2] = 0xFFFFFFFFu32; // 4GB while pc != registers.0[1] { let next_instruction = memory.0[&pc]; - let instruction = Instruction::parse(next_instruction as u32); + let instruction = Instruction::parse(next_instruction); run_instruction(&instruction, &mut registers, &mut pc, memory); } println!("Final Register Values:\n {}", ®isters); @@ -120,7 +120,7 @@ fn run_instruction( }; memory .0 - .insert((registers.0[*base as usize] + *offset) as u32, value); + .insert(registers.0[*base as usize] + *offset, value); } Instruction::Load { dst, @@ -159,7 +159,10 @@ fn run_instruction( src2, op, } => { - let (a, b) = (registers.0[*src1 as usize] as i32, registers.0[*src2 as usize] as i32); + let (a, b) = ( + registers.0[*src1 as usize] as i32, + registers.0[*src2 as usize] as i32, + ); let res = match op { ArithOp::Add => a.wrapping_add(b), ArithOp::Sub => a - b,