blake precompile progress

This commit is contained in:
Nicholas Ward 2023-04-21 18:13:53 -07:00
parent b288ff5f0d
commit 86acc15f12

View File

@ -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).
//