diff --git a/evm/src/cpu/kernel/asm/fields/Fp6.asm b/evm/src/cpu/kernel/asm/fields/Fp6.asm index 0d67b38f..e97cf653 100644 --- a/evm/src/cpu/kernel/asm/fields/Fp6.asm +++ b/evm/src/cpu/kernel/asm/fields/Fp6.asm @@ -54,6 +54,36 @@ // stack: %endmacro +// cost: 49 +%macro store_fp6_sh(offset) + // stack: x0, x1, x2, x3, x4, x5 + PUSH $offset + %add_const(2) + %mstore_kernel_general + // stack: x1, x2, x3, x4, x5 + PUSH $offset + %add_const(3) + %mstore_kernel_general + // stack: x2, x3, x4, x5 + PUSH $offset + %add_const(4) + %mstore_kernel_general + // stack: x3, x4, x5 + PUSH $offset + %add_const(5) + %mstore_kernel_general + // stack: x4, x5 + %i9 + // stack: y5, y4 + PUSH $offset + %add_const(1) + %mstore_kernel_general + // stack: y4 + PUSH $offset + %mstore_kernel_general + // stack: +%endmacro + // cost: 6 %macro dup1_fp6 // stack: F: 6 @@ -160,142 +190,147 @@ %endmacro %macro mul_Fp6 - DUP3 - DUP11 - MUL - DUP2 - DUP14 - MUL - SUB - DUP12 - DUP8 - MUL - DUP9 - DUP5 - MUL - ADD - DUP7 - DUP7 - MUL - DUP12 - DUP12 - MUL - ADD - SUB - DUP7 - DUP5 - MUL - DUP10 - DUP8 - MUL - ADD - DUP12 - DUP10 - MUL - ADD - DUP14 - DUP12 - MUL - ADD - DUP15 - DUP7 - MUL - DUP14 DUP6 - MUL - ADD - DUP2 - DUP4 - PUSH 9 - MUL - SUB - ADD - %mstore_kernel_general(0) - PUSH 9 - MUL - ADD - ADD - %mstore_kernel_general(1) - DUP4 DUP12 MUL + DUP5 + DUP5 + MUL + SUB DUP3 - DUP11 + DUP10 + MUL + DUP14 + DUP8 MUL ADD - DUP3 + DUP11 + DUP10 + MUL DUP13 - MUL - DUP6 - DUP12 - MUL - SUB - DUP12 - DUP10 - MUL - DUP9 - DUP7 + DUP5 MUL ADD - DUP2 - DUP4 - PUSH 9 + SUB + DUP11 + DUP8 + MUL + DUP15 + DUP11 + MUL + ADD + DUP13 + DUP12 + MUL + ADD + DUP5 + DUP5 + MUL + ADD + DUP6 + DUP10 MUL - SUB - SUB DUP15 DUP9 MUL - DUP12 - DUP6 + ADD + DUP2 + DUP4 + PUSH 9 MUL + SUB ADD - ADD - %mstore_kernel_general(2) + SWAP15 + SWAP3 + SWAP2 + SWAP1 PUSH 9 MUL ADD - DUP13 + ADD + SWAP9 DUP9 + DUP5 MUL - DUP12 DUP8 + DUP14 MUL ADD - DUP10 + DUP8 DUP6 MUL + DUP11 + DUP15 + MUL + SUB + DUP15 + DUP5 + MUL + DUP4 + DUP12 + MUL ADD + DUP2 + DUP4 + PUSH 9 + MUL + SUB + SUB DUP8 + DUP15 + MUL + DUP7 + DUP11 + MUL + ADD + ADD + SWAP13 + SWAP2 + SWAP1 + PUSH 9 + MUL + ADD + DUP7 + DUP5 + MUL + DUP16 DUP4 MUL ADD + DUP6 + DUP12 + MUL + ADD + DUP4 + DUP10 + MUL + ADD + ADD + SWAP13 + DUP15 + DUP7 + MUL + DUP4 + DUP6 + MUL ADD - %mstore_kernel_general(3) DUP10 DUP12 MUL - DUP7 - DUP9 - MUL ADD + DUP8 DUP3 + MUL + DUP7 DUP5 MUL ADD DUP13 DUP11 MUL - DUP10 - DUP8 - MUL - ADD - DUP6 - DUP4 - MUL ADD SUB - %mstore_kernel_general(4) + SWAP15 MUL SWAP2 MUL @@ -312,5 +347,21 @@ SWAP2 MUL ADD - %mstore_kernel_general(5) + SWAP5 +%endmacro + +// cost: 9; note this returns y, x for x + yi +%macro i9 + // stack: a , b + DUP2 + DUP2 + // stack: a , b, a , b + %mul_const(9) + SUB + // stack: 9a - b, a , b + SWAP2 + // stack: b , a, 9a - b + %mul_const(9) + ADD + // stack: 9b + a, 9a - b %endmacro diff --git a/evm/src/cpu/kernel/interpreter.rs b/evm/src/cpu/kernel/interpreter.rs index 589ba6b3..ad517931 100644 --- a/evm/src/cpu/kernel/interpreter.rs +++ b/evm/src/cpu/kernel/interpreter.rs @@ -214,9 +214,12 @@ impl<'a> Interpreter<'a> { self.incr(1); match opcode { 0x00 => self.run_stop(), // "STOP", - 0x01 => self.run_add(), // "ADD", - 0x02 => self.run_mul(), // "MUL", - 0x03 => self.run_sub(), // "SUB", + // 0x01 => self.run_add(), // "ADD", + // 0x02 => self.run_mul(), // "MUL", + // 0x03 => self.run_sub(), // "SUB", + 0x01 => self.run_add_p(), // "ADD", + 0x02 => self.run_mul_p(), // "MUL", + 0x03 => self.run_sub_p(), // "SUB", 0x04 => self.run_div(), // "DIV", 0x05 => todo!(), // "SDIV", 0x06 => self.run_mod(), // "MOD", @@ -322,18 +325,36 @@ impl<'a> Interpreter<'a> { self.push(x.overflowing_add(y).0); } + fn run_add_p(&mut self) { + let x = self.pop(); + let y = self.pop(); + self.push(U256::try_from((x + y) % 101).unwrap()); + } + fn run_mul(&mut self) { let x = self.pop(); let y = self.pop(); self.push(x.overflowing_mul(y).0); } + fn run_mul_p(&mut self) { + let x = self.pop(); + let y = self.pop(); + self.push(U256::try_from(x.full_mul(y) % 101).unwrap()); + } + fn run_sub(&mut self) { let x = self.pop(); let y = self.pop(); self.push(x.overflowing_sub(y).0); } + fn run_sub_p(&mut self) { + let x = self.pop(); + let y = self.pop(); + self.push(U256::try_from((x - y) % 101).unwrap()); + } + fn run_div(&mut self) { let x = self.pop(); let y = self.pop();