From 779a1a3f98fe476eff8f27a9f4285bef0f4df513 Mon Sep 17 00:00:00 2001 From: Dmitry Vagner Date: Tue, 6 Dec 2022 16:01:02 -0800 Subject: [PATCH] power function --- .../bn254/curve_arithmetic/miller_loop.asm | 20 ++-- .../curve/bn254/curve_arithmetic/power.asm | 103 ++++++++++++++++++ 2 files changed, 113 insertions(+), 10 deletions(-) create mode 100644 evm/src/cpu/kernel/asm/curve/bn254/curve_arithmetic/power.asm diff --git a/evm/src/cpu/kernel/asm/curve/bn254/curve_arithmetic/miller_loop.asm b/evm/src/cpu/kernel/asm/curve/bn254/curve_arithmetic/miller_loop.asm index 501eab61..cd58b677 100644 --- a/evm/src/cpu/kernel/asm/curve/bn254/curve_arithmetic/miller_loop.asm +++ b/evm/src/cpu/kernel/asm/curve/bn254/curve_arithmetic/miller_loop.asm @@ -184,7 +184,7 @@ after_add: // stack: p1y*p2x , p2y*p1x, p1x , p1y, p2x , p2y, qx, qx_, qy, qy_ SUBFP254 // stack: p1y*p2x - p2y*p1x, p1x , p1y, p2x , p2y, qx, qx_, qy, qy_ - PUSH 100 %mstore_kernel_general + %mstore_kernel_general(100) // stack: p1x , p1y, p2x , p2y, qx, qx_, qy, qy_ SWAP3 // stack: p2y , p1y, p2x , p1x, qx, qx_, qy, qy_ @@ -198,21 +198,21 @@ after_add: // stack: qy, p2y - p1y, qx, qx_, p1x - p2x, qy_ DUP5 MULFP254 // stack: (p1x - p2x)qy, p2y - p1y, qx, qx_, p1x - p2x, qy_ - PUSH 108 %mstore_kernel_general + %mstore_kernel_general(108) // stack: p2y - p1y, qx, qx_, p1x - p2x, qy_ SWAP1 // stack: qx, p2y - p1y, qx_, p1x - p2x, qy_ DUP2 MULFP254 // stack: (p2y - p1y)qx, p2y - p1y, qx_, p1x - p2x, qy_ - PUSH 102 %mstore_kernel_general + %mstore_kernel_general(102) // stack: p2y - p1y, qx_, p1x - p2x, qy_ MULFP254 // stack: (p2y - p1y)qx_, p1x - p2x, qy_ - PUSH 103 %mstore_kernel_general + %mstore_kernel_general(103) // stack: p1x - p2x, qy_ MULFP254 // stack: (p1x - p2x)qy_ - PUSH 109 %mstore_kernel_general + %mstore_kernel_general(109) %endmacro @@ -233,7 +233,7 @@ after_add: // stack: py**2 , 9, px, py, qx, qx_, qy, qy_ SUBFP254 // stack: py**2 - 9, px, py, qx, qx_, qy, qy_ - PUSH 100 %mstore_kernel_general + %mstore_kernel_general(100) // stack: px, py, qx, qx_, qy, qy_ DUP1 MULFP254 // stack: px**2, py, qx, qx_, qy, qy_ @@ -245,7 +245,7 @@ after_add: // stack: qx, py, -3px**2, qx_, qy, qy_ DUP3 MULFP254 // stack: (-3*px**2)qx, py, -3px**2, qx_, qy, qy_ - PUSH 102 %mstore_kernel_general + %mstore_kernel_general(102) // stack: py, -3px**2, qx_, qy, qy_ PUSH 2 MULFP254 // stack: 2py, -3px**2, qx_, qy, qy_ @@ -253,13 +253,13 @@ after_add: // stack: qy, -3px**2, qx_, 2py, qy_ DUP4 MULFP254 // stack: (2py)qy, -3px**2, qx_, 2py, qy_ - PUSH 108 %mstore_kernel_general + %mstore_kernel_general(108) // stack: -3px**2, qx_, 2py, qy_ MULFP254 // stack: (-3px**2)qx_, 2py, qy_ - PUSH 103 %mstore_kernel_general + %mstore_kernel_general(103) // stack: 2py, qy_ MULFP254 // stack: (2py)qy_ - PUSH 109 %mstore_kernel_general + %mstore_kernel_general(109) %endmacro diff --git a/evm/src/cpu/kernel/asm/curve/bn254/curve_arithmetic/power.asm b/evm/src/cpu/kernel/asm/curve/bn254/curve_arithmetic/power.asm new file mode 100644 index 00000000..198c3dfa --- /dev/null +++ b/evm/src/cpu/kernel/asm/curve/bn254/curve_arithmetic/power.asm @@ -0,0 +1,103 @@ +/// def power(square): +/// power_init() +/// power_loop_0() +/// power_loop_1() +/// power_loop_2() +/// power_return() +/// +/// def power_init() +/// y0, y1, y2 = 1, 1, 1 +/// +/// def power_return() +/// y0 = y0^{-1} +/// y1 *= y0 * (y2**2) +/// y1 = frob_fp12_1(y1) +/// y2 = frob_fp12_2(y2) +/// return y2 * y1 * y0 + +global power: + // stack: sqr, out, retdest + PUSH 1 DUP1 DUP1 + // stack: 1, 1, 1, sqr, out, retdest + %mstore_kernel_general(200) %mstore_kernel_general(212) %mstore_kernel_general(224) + // stack: sqr, 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} + SWAP3 + // stack: sqr, power_loop_1, power_loop_2, power_return, out, retdest {200: y0, 212: y1, 224: y2} + %jump(power_loop_0) + +power_return: + // stack: out, retdest {200: y0, 212: y1, 224: y2} + PUSH power_return_1 PUSH 236 PUSH 200 + // stack: 200, 236, power_return_1, out, retdest {200: y0, 212: y1, 224: y2} + %jump(inverse_fp12) +power_return_1: + // stack: out, retdest {236: y0, 212: y1, 224: y2} + PUSH power_return_2 PUSH 248 PUSH 224 + // stack: 224, 248, power_return_2, out, retdest {200: y0, 212: y1, 224: y2} + %jump(square_fp12) +power_return_2: + // stack: out, retdest {236: y0, 212: y1, 224: y2, 248: y2^2} + PUSH power_return_3 PUSH 248 PUSH 224 PUSH 248 + // stack: 248, 236, 248, power_return_3, out, retdest {236: y0, 212: y1, 224: y2, 248: y2^2} + %jump(mul_fp12) +power_return_3: + // stack: out, retdest {236: y0, 212: y1, 224: y2, 248: y0*y2^2} + PUSH power_return_4 PUSH 212 PUSH 248 PUSH 212 + // stack: 212, 248, 212, power_return_4, out, retdest {236: y0, 212: y1, 224: y2, 248: y0*y2^2} + %jump(mul_fp12) +power_return_4: + // stack: out, retdest {236: y0, 212: y1, 224: y2} + PUSH 212 + // stack: 212, out, retdest {236: y0, 212: y1, 224: y2} + %frob_fp12_1 + // stack: 212, out, retdest {236: y0, 212: y1, 224: y2} + POP + // stack: out, retdest {236: y0, 212: y1, 224: y2} + PUSH 224 DUP1 + // stack: 224, 224, out, retdest {236: y0, 212: y1, 224: y2} + %frob_fp12_2 + // stack: 224, out, retdest {236: y0, 212: y1, 224: y2} + POP + // stack: out, retdest {236: y0, 212: y1, 224: y2} + PUSH power_return_5 SWAP1 + // stack: out, power_return_5, retdest {236: y0, 212: y1, 224: y2} + PUSH 236 PUSH 212 + // stack: 212, 236, out, power_return_5, retdest {236: y0, 212: y1, 224: y2} + %jump(mul_fp12) +power_return_5: + // stack: out, retdest {236: y0, 212: y1, 224: y2} + PUSH 224 DUP2 + // stack: out, 224, out, retdest {236: y0, 212: y1, 224: y2} + %jump(mul_fp12) + +/// def power_loop_0(): +/// for i in range(1, len4): +/// if EXP4[-i]: +/// y1 *= square +/// if EXP2[-i]: +/// y2 *= square +/// if EXP0[-i]: +/// y0 *= square +/// square = square_fp12(square) +/// y1 *= square +/// +/// def power_loop_1(): +/// for i in range(len4, len2): +/// if EXP2[-i]: +/// y2 *= square +/// if EXP0[-i]: +/// y0 *= square +/// square = square_fp12(square) +/// y2 *= square +/// +/// def power_loop_2(): +/// for i in range(len2, len0): +/// if EXP0[-i]: +/// y0 *= square +/// square = square_fp12(square) +/// y0 *= square + + +