From 3da8efa6ba59681d5696f2eb21cc26c9d45dfbe7 Mon Sep 17 00:00:00 2001 From: Robin Salen Date: Thu, 6 Apr 2023 17:21:18 -0400 Subject: [PATCH] Implement sar in interpreter --- evm/src/cpu/kernel/interpreter.rs | 26 +++++++++++++++++++++++++- 1 file changed, 25 insertions(+), 1 deletion(-) diff --git a/evm/src/cpu/kernel/interpreter.rs b/evm/src/cpu/kernel/interpreter.rs index 1506ba1e..5dd346ec 100644 --- a/evm/src/cpu/kernel/interpreter.rs +++ b/evm/src/cpu/kernel/interpreter.rs @@ -329,7 +329,7 @@ impl<'a> Interpreter<'a> { 0x1a => self.run_byte(), // "BYTE", 0x1b => self.run_shl(), // "SHL", 0x1c => self.run_shr(), // "SHR", - 0x1d => todo!(), // "SAR", + 0x1d => self.run_sar(), // "SAR", 0x20 => self.run_keccak256(), // "KECCAK256", 0x21 => self.run_keccak_general(), // "KECCAK_GENERAL", 0x30 => todo!(), // "ADDRESS", @@ -675,6 +675,30 @@ impl<'a> Interpreter<'a> { self.push(value >> shift); } + fn run_sar(&mut self) { + let shift = self.pop(); + let value = self.pop(); + let value_is_neg = !value.eq(&(value & SIGN_MASK)); + + if shift < U256::from(256usize) { + let shift = shift.low_u64() as usize; + let mask = !(MINUS_ONE >> shift); + let value_shifted = value >> shift; + + if value_is_neg { + self.push(value_shifted | mask); + } else { + self.push(value_shifted); + }; + } else { + self.push(if value_is_neg { + MINUS_ONE + } else { + U256::zero() + }); + } + } + fn run_keccak256(&mut self) { let offset = self.pop().as_usize(); let size = self.pop().as_usize();