diff --git a/evm/src/cpu/kernel/asm/fields/fp6mul.asm b/evm/src/cpu/kernel/asm/fields/fp6mul.asm index 46e71a2f..5eef91ba 100644 --- a/evm/src/cpu/kernel/asm/fields/fp6mul.asm +++ b/evm/src/cpu/kernel/asm/fields/fp6mul.asm @@ -1,4 +1,5 @@ -mul_Fp6: +global mul_Fp6: + // stack: d1, c2_, d0, c0, d2_, c0_, d2, d1_, c1, c2, d0_, c1_ DUP6 // stack: c0_, d1, c2_, d0, c0, d2_, c0_, d2, d1_, c1, c2, d0_, c1_ DUP12 @@ -99,7 +100,7 @@ mul_Fp6: // stack: 9d1c2 + d2c1 - d2_c1_ + d1_c2_ - d1c2_ + d1_c2 + d2c1_ + d2_c1, c0d0_ + c0_d0, d1c2_ + d1_c2 + d2c1_ + d2_c1, d1c2 + d2c1 - d2_c1_ + d1_c2_, d0c0 - d0_c0_, d1, c2_, d0, c0, d2_, c0_, d2, d1_, c1, c2, d0_, c1_ ADDFP254 // stack: 9d1c2 + d2c1 - d2_c1_ + d1_c2_ - d1c2_ + d1_c2 + d2c1_ + d2_c1 + c0d0_ + c0_d0, d1c2_ + d1_c2 + d2c1_ + d2_c1, d1c2 + d2c1 - d2_c1_ + d1_c2_, d0c0 - d0_c0_, d1, c2_, d0, c0, d2_, c0_, d2, d1_, c1, c2, d0_, c1_ - SWAP15 + SWAP15 // stack: c1_, d1c2_ + d1_c2 + d2c1_ + d2_c1, d1c2 + d2c1 - d2_c1_ + d1_c2_, d0c0 - d0_c0_, d1, c2_, d0, c0, d2_, c0_, d2, d1_, c1, c2, d0_, 9d1c2 + d2c1 - d2_c1_ + d1_c2_ - d1c2_ + d1_c2 + d2c1_ + d2_c1 + c0d0_ + c0_d0 SWAP3 // stack: d0c0 - d0_c0_, d1c2_ + d1_c2 + d2c1_ + d2_c1, d1c2 + d2c1 - d2_c1_ + d1_c2_, c1_, d1, c2_, d0, c0, d2_, c0_, d2, d1_, c1, c2, d0_, 9d1c2 + d2c1 - d2_c1_ + d1_c2_ - d1c2_ + d1_c2 + d2c1_ + d2_c1 + c0d0_ + c0_d0 diff --git a/evm/src/cpu/kernel/interpreter.rs b/evm/src/cpu/kernel/interpreter.rs index 8464160e..cb335be7 100644 --- a/evm/src/cpu/kernel/interpreter.rs +++ b/evm/src/cpu/kernel/interpreter.rs @@ -380,7 +380,7 @@ impl<'a> Interpreter<'a> { fn run_sub_p(&mut self) { let x = self.pop(); let y = self.pop(); - self.push(U256::try_from((x - y) % 101).unwrap()); + self.push(U256::try_from((U256::from(101) + x - y) % 101).unwrap()); } fn run_div(&mut self) { diff --git a/evm/src/cpu/kernel/tests/fields.rs b/evm/src/cpu/kernel/tests/fields.rs index 17a59731..bc644e24 100644 --- a/evm/src/cpu/kernel/tests/fields.rs +++ b/evm/src/cpu/kernel/tests/fields.rs @@ -10,12 +10,12 @@ fn test_field() -> Result<()> { let kernel = combined_kernel(); let initial_offset = kernel.global_labels["mul_Fp6"]; - let initial_stack: Vec = vec![0, 0, 3, 1, 0, 1, 0, 1, 0, 1, 0, 0].iter().map(|&x| U256::from(x as u32)).collect(); + let initial_stack: Vec = vec![0, 0, 3, 1, 0, 1, 0, 1, 0, 1, 0, 0].iter().map(|&x| U256::from(x as u32)).rev().collect(); let final_stack: Vec = run_with_kernel(&kernel, initial_offset, initial_stack)? .stack() .to_vec(); - let expected: Vec = vec![2, 12, -1, 1, 3, 0].iter().map(|&x| U256::from(x as u32)).collect(); + let expected: Vec = vec![2, 12, 100, 1, 3, 0].iter().map(|&x| U256::from(x as u32)).rev().collect(); assert_eq!(final_stack, expected); Ok(())