From 83054b0ffee655d7fef4520a6a70d1450d091c64 Mon Sep 17 00:00:00 2001 From: Robin Salen Date: Mon, 23 Oct 2023 19:12:54 -0400 Subject: [PATCH 1/2] Handle empty case for memcpy_bytes --- evm/src/cpu/kernel/asm/memory/memcpy.asm | 17 +++++++++++++++++ 1 file changed, 17 insertions(+) diff --git a/evm/src/cpu/kernel/asm/memory/memcpy.asm b/evm/src/cpu/kernel/asm/memory/memcpy.asm index 108b7c6f..e9aea36f 100644 --- a/evm/src/cpu/kernel/asm/memory/memcpy.asm +++ b/evm/src/cpu/kernel/asm/memory/memcpy.asm @@ -57,6 +57,17 @@ memcpy_finish: // Similar logic to memcpy, but optimized for copying sequences of bytes. global memcpy_bytes: // stack: DST, SRC, count, retdest + + // Handle empty case + DUP7 + // stack: count, DST, SRC, count, retdest + ISZERO + // stack: count == 0, DST, SRC, count, retdest + %jumpi(memcpy_bytes_empty) + + // stack: DST, SRC, count, retdest + + // Handle small case DUP7 // stack: count, DST, SRC, count, retdest %lt_const(0x20) @@ -119,6 +130,12 @@ memcpy_bytes_finish: // stack: retdest JUMP +memcpy_bytes_empty: + // stack: DST, SRC, count, retdest + %pop7 + // stack: retdest + JUMP + %macro memcpy_bytes %stack (dst: 3, src: 3, count) -> (dst, src, count, %%after) %jump(memcpy_bytes) From 60811d083f8e3bd34126b955c5ef69b47f12548d Mon Sep 17 00:00:00 2001 From: Robin Salen Date: Mon, 23 Oct 2023 19:40:32 -0400 Subject: [PATCH 2/2] Also for memset --- evm/src/cpu/kernel/asm/memory/memcpy.asm | 2 +- evm/src/cpu/kernel/asm/memory/memset.asm | 16 ++++++++++++++++ 2 files changed, 17 insertions(+), 1 deletion(-) diff --git a/evm/src/cpu/kernel/asm/memory/memcpy.asm b/evm/src/cpu/kernel/asm/memory/memcpy.asm index e9aea36f..e737dc33 100644 --- a/evm/src/cpu/kernel/asm/memory/memcpy.asm +++ b/evm/src/cpu/kernel/asm/memory/memcpy.asm @@ -131,7 +131,7 @@ memcpy_bytes_finish: JUMP memcpy_bytes_empty: - // stack: DST, SRC, count, retdest + // stack: DST, SRC, 0, retdest %pop7 // stack: retdest JUMP diff --git a/evm/src/cpu/kernel/asm/memory/memset.asm b/evm/src/cpu/kernel/asm/memory/memset.asm index c0bad482..4c2e363b 100644 --- a/evm/src/cpu/kernel/asm/memory/memset.asm +++ b/evm/src/cpu/kernel/asm/memory/memset.asm @@ -2,12 +2,22 @@ // DST = (dst_ctx, dst_segment, dst_addr). // This tuple definition is used for brevity in the stack comments below. global memset: + // Handle empty case + DUP7 + // stack: count, DST, count, retdest + ISZERO + // stack: count == 0, DST, count, retdest + %jumpi(memset_bytes_empty) + // stack: DST, count, retdest + + // Handle small case DUP4 // stack: count, DST, count, retdest %lt_const(0x20) // stack: count < 32, DST, count, retdest %jumpi(memset_finish) + // stack: DST, count, retdest PUSH 32 PUSH 0 @@ -43,3 +53,9 @@ memset_finish: %pop4 // stack: retdest JUMP + +memset_bytes_empty: + // stack: DST, 0, retdest + %pop4 + // stack: retdest + JUMP