mirror of
https://github.com/logos-storage/plonky2.git
synced 2026-01-08 16:53:07 +00:00
Merge pull request #1304 from topos-protocol/memcpy_bytes
Add macro for copying sequences of bytes
This commit is contained in:
commit
0300a322de
@ -53,3 +53,74 @@ memcpy_finish:
|
|||||||
%jump(memcpy)
|
%jump(memcpy)
|
||||||
%%after:
|
%%after:
|
||||||
%endmacro
|
%endmacro
|
||||||
|
|
||||||
|
// Similar logic to memcpy, but optimized for copying sequences of bytes.
|
||||||
|
global memcpy_bytes:
|
||||||
|
// stack: DST, SRC, count, retdest
|
||||||
|
DUP7
|
||||||
|
// stack: count, DST, SRC, count, retdest
|
||||||
|
%lt_const(0x20)
|
||||||
|
// stack: count < 32, DST, SRC, count, retdest
|
||||||
|
%jumpi(memcpy_bytes_finish)
|
||||||
|
|
||||||
|
// We will pack 32 bytes into a U256 from the source, and then unpack it at the destination.
|
||||||
|
// Copy the next chunk of bytes.
|
||||||
|
PUSH 32
|
||||||
|
DUP1
|
||||||
|
DUP8
|
||||||
|
DUP8
|
||||||
|
DUP8
|
||||||
|
// stack: SRC, 32, 32, DST, SRC, count, retdest
|
||||||
|
MLOAD_32BYTES
|
||||||
|
// stack: value, 32, DST, SRC, count, retdest
|
||||||
|
DUP5
|
||||||
|
DUP5
|
||||||
|
DUP5
|
||||||
|
// stack: DST, value, 32, DST, SRC, count, retdest
|
||||||
|
MSTORE_32BYTES
|
||||||
|
// stack: DST, SRC, count, retdest
|
||||||
|
|
||||||
|
// Increment dst_addr by 32.
|
||||||
|
SWAP2
|
||||||
|
%add_const(0x20)
|
||||||
|
SWAP2
|
||||||
|
// Increment src_addr by 32.
|
||||||
|
SWAP5
|
||||||
|
%add_const(0x20)
|
||||||
|
SWAP5
|
||||||
|
// Decrement count by 32.
|
||||||
|
SWAP6
|
||||||
|
%sub_const(0x20)
|
||||||
|
SWAP6
|
||||||
|
|
||||||
|
// Continue the loop.
|
||||||
|
%jump(memcpy_bytes)
|
||||||
|
|
||||||
|
memcpy_bytes_finish:
|
||||||
|
// stack: DST, SRC, count, retdest
|
||||||
|
|
||||||
|
// Copy the last chunk of `count` bytes.
|
||||||
|
DUP7
|
||||||
|
DUP1
|
||||||
|
DUP8
|
||||||
|
DUP8
|
||||||
|
DUP8
|
||||||
|
// stack: SRC, count, count, DST, SRC, count, retdest
|
||||||
|
MLOAD_32BYTES
|
||||||
|
// stack: value, count, DST, SRC, count, retdest
|
||||||
|
DUP5
|
||||||
|
DUP5
|
||||||
|
DUP5
|
||||||
|
// stack: DST, value, count, DST, SRC, count, retdest
|
||||||
|
MSTORE_32BYTES
|
||||||
|
// 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)
|
||||||
|
%%after:
|
||||||
|
%endmacro
|
||||||
|
|||||||
@ -95,7 +95,7 @@ calldataload_large_offset:
|
|||||||
GET_CONTEXT
|
GET_CONTEXT
|
||||||
%stack (context, kexit_info, dest_offset, offset, size) ->
|
%stack (context, kexit_info, dest_offset, offset, size) ->
|
||||||
(context, @SEGMENT_MAIN_MEMORY, dest_offset, context, $segment, offset, size, wcopy_after, kexit_info)
|
(context, @SEGMENT_MAIN_MEMORY, dest_offset, context, $segment, offset, size, wcopy_after, kexit_info)
|
||||||
%jump(memcpy)
|
%jump(memcpy_bytes)
|
||||||
%endmacro
|
%endmacro
|
||||||
|
|
||||||
wcopy_empty:
|
wcopy_empty:
|
||||||
|
|||||||
@ -116,7 +116,7 @@ global encode_txn:
|
|||||||
0, @SEGMENT_TRIE_DATA, txn_rlp_ptr, // src addr. Kernel has context 0
|
0, @SEGMENT_TRIE_DATA, txn_rlp_ptr, // src addr. Kernel has context 0
|
||||||
txn_rlp_len, // mcpy len
|
txn_rlp_len, // mcpy len
|
||||||
txn_rlp_len, rlp_pos)
|
txn_rlp_len, rlp_pos)
|
||||||
%memcpy
|
%memcpy_bytes
|
||||||
ADD
|
ADD
|
||||||
// stack new_rlp_pos, retdest
|
// stack new_rlp_pos, retdest
|
||||||
SWAP1
|
SWAP1
|
||||||
|
|||||||
@ -57,7 +57,7 @@ global update_txn_trie:
|
|||||||
0, @SEGMENT_RLP_RAW, 0, // src addr. Kernel has context 0
|
0, @SEGMENT_RLP_RAW, 0, // src addr. Kernel has context 0
|
||||||
txn_rlp_len, // mcpy len
|
txn_rlp_len, // mcpy len
|
||||||
txn_rlp_len, rlp_start, txn_counter, num_nibbles, value_ptr)
|
txn_rlp_len, rlp_start, txn_counter, num_nibbles, value_ptr)
|
||||||
%memcpy
|
%memcpy_bytes
|
||||||
ADD
|
ADD
|
||||||
%set_trie_data_size
|
%set_trie_data_size
|
||||||
// stack: txn_counter, num_nibbles, value_ptr, retdest
|
// stack: txn_counter, num_nibbles, value_ptr, retdest
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user