From d5060ecd60471c78fa30f1e7b24fae39353c093e Mon Sep 17 00:00:00 2001 From: Nicholas Ward Date: Fri, 21 Apr 2023 18:00:52 -0700 Subject: [PATCH] precompile optimizations --- .../kernel/asm/core/precompiles/bn_add.asm | 33 +++++++++++-------- .../kernel/asm/core/precompiles/bn_mul.asm | 26 ++++++++------- .../cpu/kernel/asm/core/precompiles/ecrec.asm | 33 +++++++++++-------- 3 files changed, 53 insertions(+), 39 deletions(-) diff --git a/evm/src/cpu/kernel/asm/core/precompiles/bn_add.asm b/evm/src/cpu/kernel/asm/core/precompiles/bn_add.asm index ca8bbb5a..c03c9259 100644 --- a/evm/src/cpu/kernel/asm/core/precompiles/bn_add.asm +++ b/evm/src/cpu/kernel/asm/core/precompiles/bn_add.asm @@ -11,25 +11,30 @@ global precompile_bn_add: %charge_gas_const(@BN_ADD_GAS) // Load x0, y0, x1, y1 from the call data using `mload_packing`. + PUSH bn_add_return + // stack: bn_add_return, kexit_info + %stack () -> (@SEGMENT_CALLDATA, 96, 32) GET_CONTEXT - %stack (ctx, kexit_info) -> (ctx, @SEGMENT_CALLDATA, 96, 32, bn_add_contd, kexit_info) - %jump(mload_packing) -bn_add_contd: + // stack: ctx, @SEGMENT_CALLDATA, 96, 32, bn_add_return, kexit_info + %mload_packing + // stack: y1, bn_add_return, kexit_info + %stack () -> (@SEGMENT_CALLDATA, 64, 32) GET_CONTEXT - %stack (ctx, y1, kexit_info) -> (ctx, @SEGMENT_CALLDATA, 64, 32, bn_add_contd2, y1, kexit_info) - %jump(mload_packing) -bn_add_contd2: + // stack: ctx, @SEGMENT_CALLDATA, 64, 32, y1, bn_add_return, kexit_info + %mload_packing + // stack: x1, y1, bn_add_return, kexit_info + %stack () -> (@SEGMENT_CALLDATA, 32, 32) GET_CONTEXT - %stack (ctx, x1, y1, kexit_info) -> (ctx, @SEGMENT_CALLDATA, 32, 32, bn_add_contd3, x1, y1, kexit_info) - %jump(mload_packing) -bn_add_contd3: + // stack: ctx, @SEGMENT_CALLDATA, 32, 32, x1, y1, bn_add_return, kexit_info + %mload_packing + // stack: y0, x1, y1, bn_add_return, kexit_info + %stack () -> (@SEGMENT_CALLDATA, 0, 32) GET_CONTEXT - %stack (ctx, y0, x1, y1, kexit_info) -> (ctx, @SEGMENT_CALLDATA, 0, 32, bn_add_contd4, y0, x1, y1, kexit_info) - %jump(mload_packing) -bn_add_contd4: - %stack (x0, y0, x1, y1, kexit_info) -> (x0, y0, x1, y1, bn_add_contd5, kexit_info) + // stack: ctx, @SEGMENT_CALLDATA, 0, 32, y0, x1, y1, bn_add_return, kexit_info + %mload_packing + // stack: x0, y0, x1, y1, bn_add_return, kexit_info %jump(bn_add) -bn_add_contd5: +bn_add_return: // stack: x, y, 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. diff --git a/evm/src/cpu/kernel/asm/core/precompiles/bn_mul.asm b/evm/src/cpu/kernel/asm/core/precompiles/bn_mul.asm index 554849ab..4e71954d 100644 --- a/evm/src/cpu/kernel/asm/core/precompiles/bn_mul.asm +++ b/evm/src/cpu/kernel/asm/core/precompiles/bn_mul.asm @@ -11,21 +11,25 @@ global precompile_bn_mul: %charge_gas_const(@BN_MUL_GAS) // Load x, y, n from the call data using `mload_packing`. + PUSH bn_mul_return + // stack: bn_mul_return, kexit_info + %stack () -> (@SEGMENT_CALLDATA, 64, 32) GET_CONTEXT - %stack (ctx, kexit_info) -> (ctx, @SEGMENT_CALLDATA, 64, 32, bn_mul_contd, kexit_info) - %jump(mload_packing) -bn_mul_contd: + // stack: ctx, @SEGMENT_CALLDATA, 64, 32, bn_mul_return, kexit_info + %mload_packing + // stack: n, bn_mul_return, kexit_info + %stack () -> (@SEGMENT_CALLDATA, 32, 32) GET_CONTEXT - %stack (ctx, n, kexit_info) -> (ctx, @SEGMENT_CALLDATA, 32, 32, bn_mul_contd2, n, kexit_info) - %jump(mload_packing) -bn_mul_contd2: + // stack: ctx, @SEGMENT_CALLDATA, 32, 32, n, bn_mul_return, kexit_info + %mload_packing + // stack: y, n, bn_mul_return, kexit_info + %stack () -> (@SEGMENT_CALLDATA, 0, 32) GET_CONTEXT - %stack (ctx, y, n, kexit_info) -> (ctx, @SEGMENT_CALLDATA, 0, 32, bn_mul_contd3, y, n, kexit_info) - %jump(mload_packing) -bn_mul_contd3: - %stack (x, y, n, kexit_info) -> (x, y, n, bn_mul_contd4, kexit_info) + // stack: ctx, @SEGMENT_CALLDATA, 0, 32, y, n, bn_mul_return, kexit_info + %mload_packing + // stack: x, y, n, bn_mul_return, kexit_info %jump(bn_mul) -bn_mul_contd4: +bn_mul_return: // stack: Px, Py, 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. diff --git a/evm/src/cpu/kernel/asm/core/precompiles/ecrec.asm b/evm/src/cpu/kernel/asm/core/precompiles/ecrec.asm index e4a03a99..b59301d7 100644 --- a/evm/src/cpu/kernel/asm/core/precompiles/ecrec.asm +++ b/evm/src/cpu/kernel/asm/core/precompiles/ecrec.asm @@ -11,25 +11,30 @@ global precompile_ecrec: %charge_gas_const(@ECREC_GAS) // Load hash, v, r, s from the call data using `mload_packing`. + PUSH ecrec_return + // stack: ecrec_return, kexit_info + %stack () -> (@SEGMENT_CALLDATA, 96, 32) GET_CONTEXT - %stack (ctx, kexit_info) -> (ctx, @SEGMENT_CALLDATA, 96, 32, ecrec_contd, kexit_info) - %jump(mload_packing) -ecrec_contd: + // stack: ctx, @SEGMENT_CALLDATA, 96, 32, ecrec_return, kexit_info + %mload_packing + // stack: s, ecrec_return, kexit_info + %stack () -> (@SEGMENT_CALLDATA, 64, 32) GET_CONTEXT - %stack (ctx, s, kexit_info) -> (ctx, @SEGMENT_CALLDATA, 64, 32, ecrec_contd2, s, kexit_info) - %jump(mload_packing) -ecrec_contd2: + // stack: ctx, @SEGMENT_CALLDATA, 64, 32, s, ecrec_return, kexit_info + %mload_packing + // stack: r, s, ecrec_return, kexit_info + %stack () -> (@SEGMENT_CALLDATA, 32, 32) GET_CONTEXT - %stack (ctx, r, s, kexit_info) -> (ctx, @SEGMENT_CALLDATA, 32, 32, ecrec_contd3, r, s, kexit_info) - %jump(mload_packing) -ecrec_contd3: + // stack: ctx, @SEGMENT_CALLDATA, 32, 32, r, s, ecrec_return, kexit_info + %mload_packing + // stack: v, r, s, ecrec_return, kexit_info + %stack () -> (@SEGMENT_CALLDATA, 0, 32) GET_CONTEXT - %stack (ctx, v, r, s, kexit_info) -> (ctx, @SEGMENT_CALLDATA, 0, 32, ecrec_contd4, v, r, s, kexit_info) - %jump(mload_packing) -ecrec_contd4: - %stack (hash, v, r, s, kexit_info) -> (hash, v, r, s, ecrec_contd5, kexit_info) + // stack: ctx, @SEGMENT_CALLDATA, 0, 32, v, r, s, ecrec_return, kexit_info + %mload_packing + // stack: hash, v, r, s, ecrec_return, kexit_info %jump(ecrecover) -ecrec_contd5: +ecrec_return: // stack: address, kexit_info DUP1 %eq_const(@U256_MAX) %jumpi(ecrec_bad_input) // ecrecover returns U256_MAX on bad input.