From 84ffa12e2e5808febd780fca0e5522bbc2a726b8 Mon Sep 17 00:00:00 2001 From: svv232 Date: Sun, 1 Dec 2024 16:55:52 -0500 Subject: [PATCH] adding instruction for branch lt --- .../src/interpreters/riscv32im/interpreter.rs | 28 ++++++++++++++++++- 1 file changed, 27 insertions(+), 1 deletion(-) diff --git a/o1vm/src/interpreters/riscv32im/interpreter.rs b/o1vm/src/interpreters/riscv32im/interpreter.rs index 0c9207c21e..ca486910cd 100644 --- a/o1vm/src/interpreters/riscv32im/interpreter.rs +++ b/o1vm/src/interpreters/riscv32im/interpreter.rs @@ -2267,7 +2267,33 @@ pub fn interpret_sbtype(env: &mut Env, instr: SBInstruction env.set_next_instruction_pointer(addr); } SBInstruction::BranchLessThan => { - unimplemented!("BranchLessThan") + // blt: if (x[rs1] < x[rs2]) pc += sext(offset) + let local_rs1 = env.read_register(&rs1); + let local_rs2 = env.read_register(&rs2); + + let rd_scratch = env.alloc_scratch(); + + let less_than = + unsafe { env.test_less_than_signed(&local_rs1, &local_rs2, rd_scratch) }; + let offset = (less_than.clone()) * imm0_12 + + (Env::constant(1) - less_than.clone()) * Env::constant(4); + + let addr = { + let res_scratch = env.alloc_scratch(); + let overflow_scratch = env.alloc_scratch(); + let (res, _overflow) = unsafe { + env.add_witness( + &next_instruction_pointer, + &offset, + res_scratch, + overflow_scratch, + ) + }; + // FIXME: Requires a range check + res + }; + env.set_instruction_pointer(next_instruction_pointer); + env.set_next_instruction_pointer(addr); } SBInstruction::BranchGreaterThanEqual => { unimplemented!("BranchGreaterThanEqual")