mirror of
https://github.com/logos-storage/plonky2.git
synced 2026-01-13 03:03:05 +00:00
power function
This commit is contained in:
parent
51dc601a94
commit
779a1a3f98
@ -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
|
||||
|
||||
103
evm/src/cpu/kernel/asm/curve/bn254/curve_arithmetic/power.asm
Normal file
103
evm/src/cpu/kernel/asm/curve/bn254/curve_arithmetic/power.asm
Normal file
@ -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
|
||||
|
||||
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user