From 40f90d8312f51e81407c48d7e464924b71d8f0d1 Mon Sep 17 00:00:00 2001 From: Nicholas Ward Date: Tue, 7 Mar 2023 15:45:20 -0800 Subject: [PATCH] hash function optimization --- .../kernel/asm/hash/blake2b/compression.asm | 12 +-- evm/src/cpu/kernel/asm/hash/blake2b/hash.asm | 91 +++++++++++++++++-- 2 files changed, 86 insertions(+), 17 deletions(-) diff --git a/evm/src/cpu/kernel/asm/hash/blake2b/compression.asm b/evm/src/cpu/kernel/asm/hash/blake2b/compression.asm index 840d8c54..fdf02d69 100644 --- a/evm/src/cpu/kernel/asm/hash/blake2b/compression.asm +++ b/evm/src/cpu/kernel/asm/hash/blake2b/compression.asm @@ -192,14 +192,10 @@ g_functions_return: // Finalize hash value. // stack: cur_block, retdest - %blake2b_generate_new_hash_value(7) - %blake2b_generate_new_hash_value(6) - %blake2b_generate_new_hash_value(5) - %blake2b_generate_new_hash_value(4) - %blake2b_generate_new_hash_value(3) - %blake2b_generate_new_hash_value(2) - %blake2b_generate_new_hash_value(1) - %blake2b_generate_new_hash_value(0) + PUSH hash_generate_return + // stack: hash_generate_return, cur_block, retdest + %jump(blake2b_generate_all_hash_values) +hash_generate_return: // stack: h_0', h_1', h_2', h_3', h_4', h_5', h_6', h_7', cur_block, retdest DUP9 // stack: cur_block, h_0', h_1', h_2', h_3', h_4', h_5', h_6', h_7', cur_block, retdest diff --git a/evm/src/cpu/kernel/asm/hash/blake2b/hash.asm b/evm/src/cpu/kernel/asm/hash/blake2b/hash.asm index 712a97c0..91a5530e 100644 --- a/evm/src/cpu/kernel/asm/hash/blake2b/hash.asm +++ b/evm/src/cpu/kernel/asm/hash/blake2b/hash.asm @@ -1,18 +1,91 @@ -%macro blake2b_generate_new_hash_value(i) +blake2b_generate_new_hash_value: + // stack: i, retdest %blake2b_hash_value_addr - %add_const($i) + // stack: addr, i, retdest + DUP2 + ADD %mload_kernel_general - // stack: h_i, ... + // stack: h_i, i, retdest %blake2b_internal_state_addr - %add_const($i) + // stack: addr, h_i, i, retdest + DUP3 + ADD %mload_kernel_general - // stack: v_i, h_i, ... + // stack: v_i, h_i, i, retdest %blake2b_internal_state_addr - %add_const($i) + // stack: addr, v_i, h_i, i, retdest + DUP4 + ADD %add_const(8) %mload_kernel_general - // stack: v_(i+8), v_i, h_i, ... + // stack: v_(i+8), v_i, h_i, i, retdest XOR XOR - // stack: h_i' = v_(i+8) ^ v_i ^ h_i, ... -%endmacro + // stack: h_i' = v_(i+8) ^ v_i ^ h_i, i, retdest + SWAP1 + POP + // stack: h_i', retdest + SWAP1 + JUMP + +global blake2b_generate_all_hash_values: + // stack: retdest + PUSH blake2b_generate_hash_return_7 + // stack: blake2b_generate_hash_return_7, retdest + PUSH 7 + // stack: 7, blake2b_generate_hash_return_7, retdest + %jump(blake2b_generate_new_hash_value) +blake2b_generate_hash_return_7: + // stack: h_7', retdest + PUSH blake2b_generate_hash_return_6 + // stack: blake2b_generate_hash_return_6, h_7', retdest + PUSH 6 + // stack: 6, blake2b_generate_hash_return_6, h_7', retdest + %jump(blake2b_generate_new_hash_value) +blake2b_generate_hash_return_6: + // stack: h_6', h_7', retdest + PUSH blake2b_generate_hash_return_5 + // stack: blake2b_generate_hash_return_5, h_6', h_7', retdest + PUSH 5 + // stack: 5, blake2b_generate_hash_return_5, h_6', h_7', retdest + %jump(blake2b_generate_new_hash_value) +blake2b_generate_hash_return_5: + // stack: h_5', h_6', h_7', retdest + PUSH blake2b_generate_hash_return_4 + // stack: blake2b_generate_hash_return_4, h_5', h_6', h_7', retdest + PUSH 4 + // stack: 4, blake2b_generate_hash_return_4, h_5', h_6', h_7', retdest + %jump(blake2b_generate_new_hash_value) +blake2b_generate_hash_return_4: + // stack: h_4', h_5', h_6', h_7', retdest + PUSH blake2b_generate_hash_return_3 + // stack: blake2b_generate_hash_return_3, h_4', h_5', h_6', h_7', retdest + PUSH 3 + // stack: 3, blake2b_generate_hash_return_3, h_4', h_5', h_6', h_7', retdest + %jump(blake2b_generate_new_hash_value) +blake2b_generate_hash_return_3: + // stack: h_3', h_4', h_5', h_6', h_7', retdest + PUSH blake2b_generate_hash_return_2 + // stack: blake2b_generate_hash_return_2, h_3', h_4', h_5', h_6', h_7', retdest + PUSH 2 + // stack: 2, blake2b_generate_hash_return_2, h_3', h_4', h_5', h_6', h_7', retdest + %jump(blake2b_generate_new_hash_value) +blake2b_generate_hash_return_2: + // stack: h_2', h_3', h_4', h_5', h_6', h_7', retdest + PUSH blake2b_generate_hash_return_1 + // stack: blake2b_generate_hash_return_1, h_2', h_3', h_4', h_5', h_6', h_7', retdest + PUSH 1 + // stack: 1, blake2b_generate_hash_return_1, h_2', h_3', h_4', h_5', h_6', h_7', retdest + %jump(blake2b_generate_new_hash_value) +blake2b_generate_hash_return_1: + // stack: h_1', h_2', h_3', h_4', h_5', h_6', h_7', retdest + PUSH blake2b_generate_hash_return_0 + // stack: blake2b_generate_hash_return_0, h_1', h_2', h_3', h_4', h_5', h_6', h_7', retdest + PUSH 0 + // stack: 0, blake2b_generate_hash_return_0, h_1', h_2', h_3', h_4', h_5', h_6', h_7', retdest + %jump(blake2b_generate_new_hash_value) +blake2b_generate_hash_return_0: + // stack: h_0', h_1', h_2', h_3', h_4', h_5', h_6', h_7', retdest + %stack (h: 8, ret) -> (ret, h) + // stack: retdest, h_0', h_1', h_2', h_3', h_4', h_5', h_6', h_7' + JUMP \ No newline at end of file