From 86acc15f12b353997fc3e211ae57afa4e01dcd9d Mon Sep 17 00:00:00 2001 From: Nicholas Ward Date: Fri, 21 Apr 2023 18:13:53 -0700 Subject: [PATCH] blake precompile progress --- .../kernel/asm/core/precompiles/blake2_f.asm | 90 +++++++++++++------ 1 file changed, 63 insertions(+), 27 deletions(-) diff --git a/evm/src/cpu/kernel/asm/core/precompiles/blake2_f.asm b/evm/src/cpu/kernel/asm/core/precompiles/blake2_f.asm index 5915ffe7..e0ffa765 100644 --- a/evm/src/cpu/kernel/asm/core/precompiles/blake2_f.asm +++ b/evm/src/cpu/kernel/asm/core/precompiles/blake2_f.asm @@ -14,48 +14,84 @@ global precompile_blake2_f: // Copy the call data to the kernel general segment (blake2b expects it there) and call blake2b. %calldatasize + + // stack: size + %stack () -> (@SEGMENT_CALLDATA, 0, 4) GET_CONTEXT - // stack: ctx, size - %stack (ctx) -> (ctx, @SEGMENT_CALLDATA, 0, 4, blake2_f_contd) - %jump(mload_packing) -blake2_f_contd: + // stack: ctx, @SEGMENT_CALLDATA, 0, 4, size + %mload_packing // stack: rounds, size + PUSH 4 %rep 8 // stack: 4 + 8 * i, h_(i-1), ..., h_0, rounds, size - DUP1 - // stack: 4 + 8 * i, 4 + 8 * i, h_(i-1), ..., h_0, rounds, size + PUSH 8 + // stack: 8, 4 + 8 * i, h_(i-1), ..., h_0, rounds, size + DUP2 + // stack: 4 + 8 * i, 8, 4 + 8 * i, h_(i-1), ..., h_0, rounds, size + PUSH @SEGMENT_CALLDATA + // stack: @SEGMENT_CALLDATA, 4 + 8 * i, 8, 4 + 8 * i, h_(i-1), ..., h_0, rounds, size GET_CONTEXT - // stack: ctx, 4 + 8 * i, 4 + 8 * i, h_(i-1), ..., h_0, rounds, size - %stack (ctx, offset) -> (ctx, @SEGMENT_KERNEL_GENERAL, offset, 8) + // stack: ctx, @SEGMENT_CALLDATA, 4 + 8 * i, 8, 4 + 8 * i, h_(i-1), ..., h_0, rounds, size %mload_packing // stack: h_i, 4 + 8 * i, h_(i-1), ..., h_0, rounds, size SWAP1 // stack: 4 + 8 * i, h_i, h_(i-1), ..., h_0, rounds, size - %endrep - - - // stack: ctx, rounds, size - %stack (ctx) -> - // stack: rounds, size - PUSH 4 - // stack: 4, rounds, size - %rep 8 - // stack: 4 + 8 * i, h_(i-1), ..., h_0, rounds, size - DUP1 - // stack: 4 + 8 * i, 4 + 8 * i, h_(i-1), ..., h_0, rounds, size - %mload_current_u64(@SEGMENT_CALLDATA) - // stack: h_i, 4 + 8 * i, h_(i-1), ..., h_0, rounds, size - SWAP1 - // stack: 4 + 8 * i, h_i, h_(i-1), ..., h_0, rounds, size %add_const(8) - // stack: 4 + 8 * (i + 1), h_i, h_(i-1), ..., h_0, rounds, size %endrep - // stack: h_7, ..., h_0, rounds, size + // stack: 4 + 8 * 8 = 68, h_7, ..., h_0, rounds, size + + %rep 16 + // stack: 68 + 8 * i, m_(i-1), ..., m_0, h_7..h_0, rounds, size + PUSH 8 + // stack: 8, 68 + 8 * i, m_(i-1), ..., m_0, h_7..h_0, rounds, size + DUP2 + // stack: 68 + 8 * i, 8, 68 + 8 * i, m_(i-1), ..., m_0, h_7..h_0, rounds, size + PUSH @SEGMENT_CALLDATA + // stack: @SEGMENT_CALLDATA, 68 + 8 * i, 8, 68 + 8 * i, m_(i-1), ..., m_0, h_7..h_0, rounds, size + GET_CONTEXT + // stack: ctx, @SEGMENT_CALLDATA, 68 + 8 * i, 8, 68 + 8 * i, m_(i-1), ..., m_0, h_7..h_0, rounds, size + %mload_packing + // stack: m_i, 68 + 8 * i, m_(i-1), ..., m_0, h_7..h_0, rounds, size + SWAP1 + // stack: 68 + 8 * i, m_i, m_(i-1), ..., m_0, h_7..h_0, rounds, size + %add_const(8) + %endrep + // stack: 68 + 8 * 16 = 196, m_15, ..., m_0, h_7..h_0, rounds, size + + %stack (offset) -> (@SEGMENT_CALLDATA, offset, 8, offset) + // stack: @SEGMENT_CALLDATA, 196, 8, 196, m_15..m_0, h_7..h_0, rounds, size + GET_CONTEXT + // stack: ctx, @SEGMENT_CALLDATA, 196, 8, 196, m_15..m_0, h_7..h_0, rounds, size + %mload_packing + // stack: t_0, 196, m_15..m_0, h_7..h_0, rounds, size + SWAP1 + // stack: 196, t_0, m_15..m_0, h_7..h_0, rounds, size + %add_const(8) + // stack: 204, t_0, m_15..m_0, h_7..h_0, rounds, size + + %stack (offset) -> (@SEGMENT_CALLDATA, offset, 8, offset) + // stack: @SEGMENT_CALLDATA, 204, 8, 204, t_0, m_15..m_0, h_7..h_0, rounds, size + GET_CONTEXT + // stack: ctx, @SEGMENT_CALLDATA, 204, 8, 204, t_0, m_15..m_0, h_7..h_0, rounds, size + %mload_packing + // stack: t_1, 204, t_0, m_15..m_0, h_7..h_0, rounds, size + SWAP1 + // stack: 204, t_1, t_0, m_15..m_0, h_7..h_0, rounds, size + %add_const(8) + // stack: 212, t_1, t_0, m_15..m_0, h_7..h_0, rounds, size + + PUSH @SEGMENT_CALLDATA + GET_CONTEXT + // stack: ctx, @SEGMENT_CALLDATA, 212, t_1, t_0, m_15..m_0, h_7..h_0, rounds, size + MLOAD_GENERAL + // stack: f, t_1, t_0, m_15..m_0, h_7..h_0, rounds, size + + + - // TODO: change // The next block of code is equivalent to the following %stack macro call // (unfortunately the macro call takes too long to expand dynamically). //