From 560b9b2a97bbfd1644fdef654008c69e2b39e761 Mon Sep 17 00:00:00 2001 From: wborgeaud Date: Fri, 21 Oct 2022 18:11:27 +0200 Subject: [PATCH] Finish extcodecopy --- evm/src/cpu/kernel/aggregator.rs | 1 + evm/src/cpu/kernel/asm/account_code.asm | 39 +++++++++++++++++++------ 2 files changed, 31 insertions(+), 9 deletions(-) diff --git a/evm/src/cpu/kernel/aggregator.rs b/evm/src/cpu/kernel/aggregator.rs index 8fe49739..1d20fe0c 100644 --- a/evm/src/cpu/kernel/aggregator.rs +++ b/evm/src/cpu/kernel/aggregator.rs @@ -79,6 +79,7 @@ pub(crate) fn combined_kernel() -> Kernel { include_str!("asm/util/assertions.asm"), include_str!("asm/util/basic_macros.asm"), include_str!("asm/util/keccak.asm"), + include_str!("asm/account_code.asm"), ]; let parsed_files = files.iter().map(|f| parse(f)).collect_vec(); diff --git a/evm/src/cpu/kernel/asm/account_code.asm b/evm/src/cpu/kernel/asm/account_code.asm index ef8d5504..211363fb 100644 --- a/evm/src/cpu/kernel/asm/account_code.asm +++ b/evm/src/cpu/kernel/asm/account_code.asm @@ -1,4 +1,4 @@ -%extcodehash +%macro extcodehash // stack: address %mpt_read_state_trie // stack: account_ptr @@ -8,18 +8,24 @@ // stack: codehash %endmacro -%extcodesize - // stack: address - %stack (address) -> (address, %after) +%macro extcodesize + %stack (address) -> (address, %%after) %jump(load_code) %%after: %endmacro -%codesize +%macro codesize ADDRESS %extcodesize %endmacro +%macro codecopy + // stack: dest_offset, offset, size, retdest + ADDRESS + // stack: address, dest_offset, offset, size, retdest + %jump(extcodecopy) +%endmacro + global extcodecopy: // stack: address, dest_offset, offset, size, retdest %stack (address, dest_offset, offset, size, retdest) -> (address, extcodecopy_contd, size, offset, dest_offset, retdest) @@ -34,22 +40,38 @@ extcodecopy_loop: DUP2 DUP2 EQ // stack: i == size, i, size, code_length, offset, dest_offset, retdest %jumpi(extcodecopy_end) - %stack: (i, size, code_length, offset, dest_offset, retdest) -> (offset, code_length, offset, code_length, dest_offset, i, size, retdest) + %stack (i, size, code_length, offset, dest_offset, retdest) -> (offset, code_length, offset, code_length, dest_offset, i, size, retdest) LT // stack: offset < code_length, offset, code_length, dest_offset, i, size, retdest DUP2 // stack: offset, offset < code_length, offset, code_length, dest_offset, i, size, retdest %mload_current(@SEGMENT_KERNEL_ACCOUNT_CODE) // stack: opcode, offset < code_length, offset, code_length, dest_offset, i, size, retdest - &stack (opcode, offset < code_length, offset, code_length, dest_offset, i, size, retdest) -> (offset < code_length, 0, opcode, offset, code_length, dest_offset, i, size, retdest) + %stack (opcode, offset_lt_code_length, offset, code_length, dest_offset, i, size, retdest) -> (offset_lt_code_length, 0, opcode, offset, code_length, dest_offset, i, size, retdest) %select_bool // stack: opcode, offset, code_length, dest_offset, i, size, retdest DUP4 // stack: dest_offset, opcode, offset, code_length, dest_offset, i, size, retdest + %mstore_main + // stack: offset, code_length, dest_offset, i, size, retdest + %increment + // stack: offset+1, code_length, dest_offset, i, size, retdest + SWAP2 + // stack: dest_offset, code_length, offset+1, i, size, retdest + %increment + // stack: dest_offset+1, code_length, offset+1, i, size, retdest + SWAP3 + // stack: i, code_length, offset+1, dest_offset+1, size, retdest + %increment + // stack: i+1, code_length, offset+1, dest_offset+1, size, retdest + %stack (i, code_length, offset, dest_offset, size, retdest) -> (i, size, code_length, offset, dest_offset, retdest) + %jump(extcodecopy_loop) + + extcodecopy_end: - %stack: (i, size, code_length, offset, dest_offset, size, retdest) -> (retdest) + %stack (i, size, code_length, offset, dest_offset, size, retdest) -> (retdest) JUMP @@ -90,4 +112,3 @@ load_code_check: // stack: shouldbecodehash, codehash, retdest, code_length %assert_eq JUMP -