From 32758829ba25b8ffc236b95a614be568aa6d6189 Mon Sep 17 00:00:00 2001 From: Dmitry Vagner Date: Tue, 20 Dec 2022 12:29:48 -0800 Subject: [PATCH] refactor --- evm/src/cpu/kernel/aggregator.rs | 2 +- .../curve/bn254/field_arithmetic/fp12_mul.asm | 5 - .../curve/bn254/field_arithmetic/power.asm | 156 +++++++++--------- .../{field_macros.asm => utils.asm} | 6 + evm/src/cpu/kernel/tests/bn254_field.rs | 8 +- 5 files changed, 89 insertions(+), 88 deletions(-) rename evm/src/cpu/kernel/asm/curve/bn254/field_arithmetic/{field_macros.asm => utils.asm} (99%) diff --git a/evm/src/cpu/kernel/aggregator.rs b/evm/src/cpu/kernel/aggregator.rs index 29144404..d924eeb4 100644 --- a/evm/src/cpu/kernel/aggregator.rs +++ b/evm/src/cpu/kernel/aggregator.rs @@ -30,11 +30,11 @@ pub(crate) fn combined_kernel() -> Kernel { include_str!("asm/curve/bn254/curve_arithmetic/miller_loop.asm"), include_str!("asm/curve/bn254/curve_arithmetic/tate_pairing.asm"), include_str!("asm/curve/bn254/field_arithmetic/inverse.asm"), - include_str!("asm/curve/bn254/field_arithmetic/field_macros.asm"), include_str!("asm/curve/bn254/field_arithmetic/fp6_mul.asm"), include_str!("asm/curve/bn254/field_arithmetic/fp12_mul.asm"), include_str!("asm/curve/bn254/field_arithmetic/frobenius.asm"), include_str!("asm/curve/bn254/field_arithmetic/power.asm"), + include_str!("asm/curve/bn254/field_arithmetic/utils.asm"), include_str!("asm/curve/common.asm"), include_str!("asm/curve/secp256k1/curve_mul.asm"), include_str!("asm/curve/secp256k1/curve_add.asm"), diff --git a/evm/src/cpu/kernel/asm/curve/bn254/field_arithmetic/fp12_mul.asm b/evm/src/cpu/kernel/asm/curve/bn254/field_arithmetic/fp12_mul.asm index e93336ee..5c2471d9 100644 --- a/evm/src/cpu/kernel/asm/curve/bn254/field_arithmetic/fp12_mul.asm +++ b/evm/src/cpu/kernel/asm/curve/bn254/field_arithmetic/fp12_mul.asm @@ -7,11 +7,6 @@ global test_mul_fp12: %store_fp12 // stack: mul_dest, inA, inB, out, ret_stack, out JUMP -global ret_stack: - // stack: out - %load_fp12 - %jump(0xdeadbeef) - /////////////////////////////////////// ///// GENERAL FP12 MULTIPLICATION ///// diff --git a/evm/src/cpu/kernel/asm/curve/bn254/field_arithmetic/power.asm b/evm/src/cpu/kernel/asm/curve/bn254/field_arithmetic/power.asm index fc85cb44..6ab2eb3f 100644 --- a/evm/src/cpu/kernel/asm/curve/bn254/field_arithmetic/power.asm +++ b/evm/src/cpu/kernel/asm/curve/bn254/field_arithmetic/power.asm @@ -1,10 +1,10 @@ global test_power: - // stack: sqr, f, sqr, out, ret_stack, out + // stack: ptr, f, ptr, out, ret_stack, out %store_fp12 - // stack: sqr, out, ret_stack, out + // stack: ptr, out, ret_stack, out %jump(power) -/// def power(square): +/// def power(acc): /// power_init() /// power_loop_0() /// power_loop_1() @@ -22,17 +22,17 @@ global test_power: /// return y2 * y1 * y0 global power: - // stack: sqr, out, retdest + // stack: ptr, out, retdest PUSH 1 DUP1 DUP1 - // stack: 1, 1, 1, sqr, out, retdest + // stack: 1, 1, 1, ptr, out, retdest %mstore_kernel_general(200) %mstore_kernel_general(212) %mstore_kernel_general(224) - // stack: sqr, out, retdest {200: y0, 212: y1, 224: y2} + // stack: ptr, out, retdest {200: y0, 212: y1, 224: y2} PUSH power_loop_2 PUSH power_loop_1 PUSH power_return - // stack: power_return, power_loop_1, power_loop_2, sqr, out, retdest {200: y0, 212: y1, 224: y2} + // stack: power_return, power_loop_1, power_loop_2, ptr, out, retdest {200: y0, 212: y1, 224: y2} SWAP3 - // stack: sqr, power_loop_1, power_loop_2, power_return, out, retdest {200: y0, 212: y1, 224: y2} + // stack: ptr, power_loop_1, power_loop_2, power_return, out, retdest {200: y0, 212: y1, 224: y2} PUSH 65 PUSH 62 PUSH 65 - // stack: 65, 62, 65, sqr, power_loop_1, power_loop_2, power_return, out, retdest {200: y0, 212: y1, 224: y2} + // stack: 65, 62, 65, ptr, power_loop_1, power_loop_2, power_return, out, retdest {200: y0, 212: y1, 224: y2} %jump(power_loop_0) power_return: @@ -84,158 +84,158 @@ power_return_5: /// for i in range(1, len4): /// abc = load(power_data_0) /// if a: -/// y1 *= square +/// y1 *= acc /// if b: -/// y2 *= square +/// y2 *= acc /// if c: -/// y0 *= square -/// square = square_fp12(square) -/// y1 *= square +/// y0 *= acc +/// acc = square_fp12(acc) +/// y1 *= acc /// /// def power_loop_1(): /// for i in range(len4, len2): /// ab = load(power_data_1) /// if a: -/// y2 *= square +/// y2 *= acc /// if b: -/// y0 *= square -/// square = square_fp12(square) -/// y2 *= square +/// y0 *= acc +/// acc = square_fp12(acc) +/// y2 *= acc /// /// def power_loop_2(): /// for i in range(len2, len0): /// a = load(power_data_1) /// if a: -/// y0 *= square -/// square = square_fp12(square) -/// y0 *= square +/// y0 *= acc +/// acc = square_fp12(acc) +/// y0 *= acc power_loop_0: - // stack: i , j, k, sqr, retdest + // stack: i , j, k, ptr, retdest DUP1 ISZERO - // stack: break?, i , j, k, sqr, retdest + // stack: break?, i , j, k, ptr, retdest %jumpi(power_loop_0_end) - // stack: i , j, k, sqr, retdest + // stack: i , j, k, ptr, retdest %sub_const(1) - // stack: i-1, j, k, sqr, retdest + // stack: i-1, j, k, ptr, retdest DUP1 %mload_kernel_code(power_data_0) - // stack: abc, i-1, j, k, sqr, retdest + // stack: abc, i-1, j, k, ptr, retdest DUP1 %lt_const(100) - // stack: skip?, abc, i-1, j, k, sqr, retdest + // stack: skip?, abc, i-1, j, k, ptr, retdest %jumpi(power_loop_0_b) - // stack: abc, i-1, j, k, sqr, retdest + // stack: abc, i-1, j, k, ptr, retdest %sub_const(100) - // stack: bc, i-1, j, k, sqr, retdest + // stack: bc, i-1, j, k, ptr, retdest PUSH power_loop_0_b PUSH 212 DUP1 DUP8 - // stack: sqr, 212, 212, power_loop_0_b, bc, i-1, j, k, sqr, retdest + // stack: ptr, 212, 212, power_loop_0_b, bc, i-1, j, k, ptr, retdest %jump(mul_fp12) power_loop_0_b: - // stack: bc, i, j, k, sqr, retdest + // stack: bc, i, j, k, ptr, retdest DUP1 %lt_const(10) - // stack: skip?, bc, i, j, k, sqr, retdest + // stack: skip?, bc, i, j, k, ptr, retdest %jumpi(power_loop_0_c) - // stack: bc, i, j, k, sqr, retdest + // stack: bc, i, j, k, ptr, retdest %sub_const(10) - // stack: c, i, j, k, sqr, retdest + // stack: c, i, j, k, ptr, retdest PUSH power_loop_0_c PUSH 224 DUP1 DUP8 - // stack: sqr, 224, 224, power_loop_0_c, c, i, j, k, sqr, retdest + // stack: ptr, 224, 224, power_loop_0_c, c, i, j, k, ptr, retdest %jump(mul_fp12) power_loop_0_c: - // stack: c, i, j, k, sqr, retdest + // stack: c, i, j, k, ptr, retdest DUP1 ISZERO - // stack: skip?, c, i, j, k, sqr, retdest + // stack: skip?, c, i, j, k, ptr, retdest %jumpi(power_loop_0_sq) - // stack: c, i, j, k, sqr, retdest + // stack: c, i, j, k, ptr, retdest POP - // stack: i, j, k, sqr, retdest + // stack: i, j, k, ptr, retdest PUSH power_loop_0_sq PUSH 200 DUP1 DUP7 - // stack: sqr, 200, 200, power_loop_0_sq, i, j, k, sqr, retdest + // stack: ptr, 200, 200, power_loop_0_sq, i, j, k, ptr, retdest %jump(mul_fp12) power_loop_0_sq: - // stack: i, j, k, sqr, retdest + // stack: i, j, k, ptr, retdest PUSH power_loop_0 DUP5 DUP1 - // stack: sqr, sqr, power_loop_0, i, j, k, sqr, retdest + // stack: ptr, ptr, power_loop_0, i, j, k, ptr, retdest %jump(mul_fp12) power_loop_0_end: - // stack: 0, j, k, sqr, retdest + // stack: 0, j, k, ptr, retdest POP - // stack: j, k, sqr, retdest + // stack: j, k, ptr, retdest PUSH power_loop_1 PUSH 212 DUP1 DUP6 - // stack: sqr, 212, 212, power_loop_1, j, k, sqr, retdest + // stack: ptr, 212, 212, power_loop_1, j, k, ptr, retdest %jump(mul_fp12) power_loop_1: - // stack: j , k, sqr, retdest + // stack: j , k, ptr, retdest DUP1 ISZERO - // stack: break?, j , k, sqr, retdest + // stack: break?, j , k, ptr, retdest %jumpi(power_loop_1_end) - // stack: j , k, sqr, retdest + // stack: j , k, ptr, retdest %sub_const(1) - // stack: j-1, k, sqr, retdest + // stack: j-1, k, ptr, retdest DUP1 %mload_kernel_code(power_data_1) - // stack: ab, j-1, k, sqr, retdest + // stack: ab, j-1, k, ptr, retdest DUP1 %lt_const(10) - // stack: skip?, ab, j-1, k, sqr, retdest + // stack: skip?, ab, j-1, k, ptr, retdest %jumpi(power_loop_1_b) - // stack: ab, j-1, k, sqr, retdest + // stack: ab, j-1, k, ptr, retdest %sub_const(10) - // stack: b, j-1, k, sqr, retdest + // stack: b, j-1, k, ptr, retdest PUSH power_loop_1_b PUSH 224 DUP1 DUP7 - // stack: sqr, 224, 224, power_loop_1_b, b, j-1, k, sqr, retdest + // stack: ptr, 224, 224, power_loop_1_b, b, j-1, k, ptr, retdest %jump(mul_fp12) power_loop_1_b: - // stack: b, j, k, sqr, retdest + // stack: b, j, k, ptr, retdest DUP1 ISZERO - // stack: skip?, b, j, k, sqr, retdest + // stack: skip?, b, j, k, ptr, retdest %jumpi(power_loop_1_sq) - // stack: b, j, k, sqr, retdest + // stack: b, j, k, ptr, retdest POP - // stack: j, k, sqr, retdest + // stack: j, k, ptr, retdest PUSH power_loop_1_sq PUSH 200 DUP1 DUP6 - // stack: sqr, 200, 200, power_loop_1_sq, j, k, sqr, retdest + // stack: ptr, 200, 200, power_loop_1_sq, j, k, ptr, retdest %jump(mul_fp12) power_loop_1_sq: - // stack: j, k, sqr, retdest + // stack: j, k, ptr, retdest PUSH power_loop_1 DUP4 DUP1 - // stack: sqr, sqr, power_loop_1, j, k, sqr, retdest + // stack: ptr, ptr, power_loop_1, j, k, ptr, retdest %jump(square_fp12) power_loop_1_end: - // stack: 0, k, sqr, retdest + // stack: 0, k, ptr, retdest POP - // stack: k, sqr, retdest + // stack: k, ptr, retdest PUSH power_loop_2 PUSH 224 DUP1 DUP6 - // stack: sqr, 224, 224, power_loop_2, k, sqr, retdest + // stack: ptr, 224, 224, power_loop_2, k, ptr, retdest %jump(mul_fp12) power_loop_2: - // stack: k , sqr, retdest + // stack: k , ptr, retdest DUP1 ISZERO - // stack: break?, k , sqr, retdest + // stack: break?, k , ptr, retdest %jumpi(power_loop_2_end) - // stack: k , sqr, retdest + // stack: k , ptr, retdest %sub_const(1) - // stack: k-1, sqr, retdest + // stack: k-1, ptr, retdest DUP1 %mload_kernel_code(power_data_2) - // stack: a, k-1, sqr, retdest + // stack: a, k-1, ptr, retdest DUP1 ISZERO - // stack: skip?, a, k-1, sqr, retdest + // stack: skip?, a, k-1, ptr, retdest %jumpi(power_loop_2_sq) - // stack: a, k-1, sqr, retdest + // stack: a, k-1, ptr, retdest POP - // stack: k-1, sqr, retdest + // stack: k-1, ptr, retdest PUSH power_loop_2_sq PUSH 200 DUP1 DUP5 - // stack: sqr, 200, 200, power_loop_2_sq, k-1, sqr, retdest + // stack: ptr, 200, 200, power_loop_2_sq, k-1, ptr, retdest %jump(mul_fp12) power_loop_2_sq: - // stack: k, sqr, retdest + // stack: k, ptr, retdest PUSH power_loop_2 DUP3 DUP1 - // stack: sqr, sqr, power_loop_2, k, sqr, retdest + // stack: ptr, ptr, power_loop_2, k, ptr, retdest %jump(square_fp12) power_loop_2_end: - // stack: 0, sqr, retdest + // stack: 0, ptr, retdest POP - // stack: sqr, retdest + // stack: ptr, retdest PUSH power_return PUSH 200 DUP1 DUP4 - // stack: sqr, 200, 200, power_return, sqr, retdest + // stack: ptr, 200, 200, power_return, ptr, retdest %jump(mul_fp12) diff --git a/evm/src/cpu/kernel/asm/curve/bn254/field_arithmetic/field_macros.asm b/evm/src/cpu/kernel/asm/curve/bn254/field_arithmetic/utils.asm similarity index 99% rename from evm/src/cpu/kernel/asm/curve/bn254/field_arithmetic/field_macros.asm rename to evm/src/cpu/kernel/asm/curve/bn254/field_arithmetic/utils.asm index 87c8fdea..7a664a94 100644 --- a/evm/src/cpu/kernel/asm/curve/bn254/field_arithmetic/field_macros.asm +++ b/evm/src/cpu/kernel/asm/curve/bn254/field_arithmetic/utils.asm @@ -971,3 +971,9 @@ %mstore_kernel_general // stack: %endmacro + +global ret_stack: + // stack: out + %load_fp12 + %jump(0xdeadbeef) + \ No newline at end of file diff --git a/evm/src/cpu/kernel/tests/bn254_field.rs b/evm/src/cpu/kernel/tests/bn254_field.rs index 2f30956b..1ee629b0 100644 --- a/evm/src/cpu/kernel/tests/bn254_field.rs +++ b/evm/src/cpu/kernel/tests/bn254_field.rs @@ -733,14 +733,14 @@ fn test_inv_fp12() -> Result<()> { } fn make_power_stack(f: Fp12) -> Vec { - let sqr = U256::from(100); - let out = U256::from(300); + let ptr = U256::from(300); + let out = U256::from(400); let f: Vec = f.into_iter().flatten().flatten().collect(); let ret_stack = U256::from(KERNEL.global_labels["ret_stack"]); - let mut input = vec![sqr]; + let mut input = vec![ptr]; input.extend(f); - input.extend(vec![sqr, out, ret_stack, out]); + input.extend(vec![ptr, out, ret_stack, out]); input.reverse(); input }