Skip to content

Commit

Permalink
More
Browse files Browse the repository at this point in the history
  • Loading branch information
Nashtare committed Oct 1, 2024
1 parent e2baea5 commit 1834bc0
Show file tree
Hide file tree
Showing 3 changed files with 61 additions and 62 deletions.
44 changes: 21 additions & 23 deletions evm_arithmetization/src/cpu/kernel/asm/core/precompiles/bn_add.asm
Original file line number Diff line number Diff line change
Expand Up @@ -14,41 +14,37 @@ global precompile_bn_add:

%charge_gas_const(@BN_ADD_GAS)

GET_CONTEXT
PUSH @SEGMENT_CALLDATA
%build_address_no_offset
// stack: base_addr, kexit_info

// Load x0, y0, x1, y1 from the call data using `MLOAD_32BYTES`.
PUSH bn_add_return
// stack: bn_add_return, kexit_info
%stack () -> (@SEGMENT_CALLDATA, 96, 32)
GET_CONTEXT
// stack: ctx, @SEGMENT_CALLDATA, 96, 32, bn_add_return, kexit_info
%build_address
// stack: bn_add_return, base_addr, kexit_info
%stack (bn_add_return, base_addr) -> (base_addr, 96, 32, bn_add_return, base_addr)
ADD // base_addr + offset
MLOAD_32BYTES
// stack: y1, bn_add_return, kexit_info
%stack () -> (@SEGMENT_CALLDATA, 64, 32)
GET_CONTEXT
// stack: ctx, @SEGMENT_CALLDATA, 64, 32, y1, bn_add_return, kexit_info
%build_address
// stack: y1, bn_add_return, base_addr, kexit_info
%stack (y1, bn_add_return, base_addr) -> (base_addr, 64, 32, y1, bn_add_return, base_addr)
ADD // base_addr + offset
MLOAD_32BYTES
// stack: x1, y1, bn_add_return, kexit_info
%stack () -> (@SEGMENT_CALLDATA, 32, 32)
GET_CONTEXT
// stack: ctx, @SEGMENT_CALLDATA, 32, 32, x1, y1, bn_add_return, kexit_info
%build_address
// stack: x1, y1, bn_add_return, base_addr, kexit_info
%stack (x1, y1, bn_add_return, base_addr) -> (base_addr, 32, 32, x1, y1, bn_add_return, base_addr)
ADD // base_addr + offset
MLOAD_32BYTES
// stack: y0, x1, y1, bn_add_return, kexit_info
%stack () -> (@SEGMENT_CALLDATA, 32)
GET_CONTEXT
// stack: ctx, @SEGMENT_CALLDATA, 32, y0, x1, y1, bn_add_return, kexit_info
%build_address_no_offset
// stack: y0, x1, y1, bn_add_return, base_addr, kexit_info
%stack (y0, x1, y1, bn_add_return, base_addr) -> (base_addr, 32, y0, x1, y1, bn_add_return, base_addr)
MLOAD_32BYTES
// stack: x0, y0, x1, y1, bn_add_return, kexit_info
// stack: x0, y0, x1, y1, bn_add_return, base_addr, kexit_info
%jump(bn_add)
bn_add_return:
// stack: x, y, kexit_info
// stack: x, y, base_addr, kexit_info
DUP2 %eq_const(@U256_MAX) // bn_add returns (U256_MAX, U256_MAX) on bad input.
DUP2 %eq_const(@U256_MAX) // bn_add returns (U256_MAX, U256_MAX) on bad input.
MUL // Cheaper than AND
%jumpi(fault_exception)
// stack: x, y, kexit_info
// stack: x, y, base_addr, kexit_info

// Store the result (x, y) to the parent's return data using `mstore_unpacking`.
%mstore_parent_context_metadata(@CTX_METADATA_RETURNDATA_SIZE, 64)
Expand All @@ -60,4 +56,6 @@ bn_add_return:
%stack (parent_ctx, y) -> (parent_ctx, @SEGMENT_RETURNDATA, 32, y)
%build_address
MSTORE_32BYTES_32
// stack: addr, base_addr, kexit_info
POP
%jump(pop_and_return_success)
34 changes: 17 additions & 17 deletions evm_arithmetization/src/cpu/kernel/asm/core/precompiles/bn_mul.asm
Original file line number Diff line number Diff line change
Expand Up @@ -14,30 +14,28 @@ global precompile_bn_mul:

%charge_gas_const(@BN_MUL_GAS)

GET_CONTEXT
PUSH @SEGMENT_CALLDATA
%build_address_no_offset
// stack: base_addr, kexit_info

// Load x, y, n from the call data using `MLOAD_32BYTES`.
PUSH bn_mul_return
// stack: bn_mul_return, kexit_info
%stack () -> (@SEGMENT_CALLDATA, 64, 32)
GET_CONTEXT
// stack: ctx, @SEGMENT_CALLDATA, 64, 32, bn_mul_return, kexit_info
%build_address
// stack: bn_mul_return, base_addr, kexit_info
%stack (bn_mul_return, base_addr) -> (base_addr, 64, 32, bn_mul_return, base_addr)
ADD // base_addr + offset
MLOAD_32BYTES
// stack: n, bn_mul_return, kexit_info
%stack () -> (@SEGMENT_CALLDATA, 32, 32)
GET_CONTEXT
// stack: ctx, @SEGMENT_CALLDATA, 32, 32, n, bn_mul_return, kexit_info
%build_address
// stack: n, bn_mul_return, base_addr, kexit_info
%stack (n, bn_mul_return, base_addr) -> (base_addr, 32, 32, n, bn_mul_return, base_addr)
ADD // base_addr + offset
MLOAD_32BYTES
// stack: y, n, bn_mul_return, kexit_info
%stack () -> (@SEGMENT_CALLDATA, 32)
GET_CONTEXT
// stack: ctx, @SEGMENT_CALLDATA, 32, y, n, bn_mul_return, kexit_info
%build_address_no_offset
// stack: y, n, bn_mul_return, base_addr, kexit_info
%stack (y, n, bn_mul_return, base_addr) -> (base_addr, 32, y, n, bn_mul_return, base_addr)
MLOAD_32BYTES
// stack: x, y, n, bn_mul_return, kexit_info
// stack: x, y, n, bn_mul_return, base_addr, kexit_info
%jump(bn_mul)
bn_mul_return:
// stack: Px, Py, kexit_info
// stack: Px, Py, base_addr, kexit_info
DUP2 %eq_const(@U256_MAX) // bn_mul returns (U256_MAX, U256_MAX) on bad input.
DUP2 %eq_const(@U256_MAX) // bn_mul returns (U256_MAX, U256_MAX) on bad input.
MUL // Cheaper than AND
Expand All @@ -55,4 +53,6 @@ bn_mul_contd6:
%stack (parent_ctx, Py) -> (parent_ctx, @SEGMENT_RETURNDATA, 32, Py)
%build_address
MSTORE_32BYTES_32
// stack: addr, base_addr, kexit_info
POP
%jump(pop_and_return_success)
45 changes: 23 additions & 22 deletions evm_arithmetization/src/cpu/kernel/asm/core/precompiles/ecrec.asm
Original file line number Diff line number Diff line change
Expand Up @@ -14,36 +14,33 @@ global precompile_ecrec:

%charge_gas_const(@ECREC_GAS)

GET_CONTEXT
PUSH @SEGMENT_CALLDATA
%build_address_no_offset
// stack: base_addr, kexit_info

// Load hash, v, r, s from the call data using `MLOAD_32BYTES`.
PUSH ecrec_return
// stack: ecrec_return, kexit_info
%stack () -> (@SEGMENT_CALLDATA, 96, 32)
GET_CONTEXT
// stack: ctx, @SEGMENT_CALLDATA, 96, 32, ecrec_return, kexit_info
%build_address
// stack: ecrec_return, base_addr, kexit_info

%stack (ecrec_return, base_addr) -> (base_addr, 96, 32, ecrec_return, base_addr)
ADD // base_addr + offset
MLOAD_32BYTES
// stack: s, ecrec_return, kexit_info
%stack () -> (@SEGMENT_CALLDATA, 64, 32)
GET_CONTEXT
// stack: ctx, @SEGMENT_CALLDATA, 64, 32, s, ecrec_return, kexit_info
%build_address
// stack: s, ecrec_return, base_addr, kexit_info
%stack (s, ecrec_return, base_addr) -> (base_addr, 64, 32, s, ecrec_return, base_addr)
ADD // base_addr + offset
MLOAD_32BYTES
// stack: r, s, ecrec_return, kexit_info
%stack () -> (@SEGMENT_CALLDATA, 32, 32)
GET_CONTEXT
// stack: ctx, @SEGMENT_CALLDATA, 32, 32, r, s, ecrec_return, kexit_info
%build_address
// stack: r, s, ecrec_return, base_addr, kexit_info
%stack (r, s, ecrec_return, base_addr) -> (base_addr, 32, 32, r, s, ecrec_return, base_addr)
ADD // base_addr + offset
MLOAD_32BYTES
// stack: v, r, s, ecrec_return, kexit_info
%stack () -> (@SEGMENT_CALLDATA, 32)
GET_CONTEXT
// stack: ctx, @SEGMENT_CALLDATA, 32, v, r, s, ecrec_return, kexit_info
%build_address_no_offset
// stack: v, r, s, ecrec_return, base_addr, kexit_info
%stack (v, r, s, ecrec_return, base_addr) -> (base_addr, 32, v, r, s, ecrec_return, base_addr)
MLOAD_32BYTES
// stack: hash, v, r, s, ecrec_return, kexit_info
// stack: hash, v, r, s, ecrec_return, base_addr, kexit_info
%jump(ecrecover)
ecrec_return:
// stack: address, kexit_info
// stack: address, base_addr, kexit_info
DUP1 %eq_const(@U256_MAX) %jumpi(ecrec_bad_input) // ecrecover returns U256_MAX on bad input.

// Store the result address to the parent's return data using `mstore_unpacking`.
Expand All @@ -52,9 +49,13 @@ ecrec_return:
%stack (parent_ctx, address) -> (parent_ctx, @SEGMENT_RETURNDATA, address)
%build_address_no_offset
MSTORE_32BYTES_32
// stack: addr, base_addr, kexit_info
POP
%jump(pop_and_return_success)

// On bad input, return empty return data but still return success.
ecrec_bad_input:
%mstore_parent_context_metadata(@CTX_METADATA_RETURNDATA_SIZE, 0)
// stack: addr, base_addr, kexit_info
POP
%jump(pop_and_return_success)

0 comments on commit 1834bc0

Please sign in to comment.