This commit is contained in:
Dmitry Vagner 2022-12-20 12:29:48 -08:00
parent 950771a6ea
commit 32758829ba
5 changed files with 89 additions and 88 deletions

View File

@ -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"),

View File

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

View File

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

View File

@ -971,3 +971,9 @@
%mstore_kernel_general
// stack:
%endmacro
global ret_stack:
// stack: out
%load_fp12
%jump(0xdeadbeef)

View File

@ -733,14 +733,14 @@ fn test_inv_fp12() -> Result<()> {
}
fn make_power_stack(f: Fp12) -> Vec<U256> {
let sqr = U256::from(100);
let out = U256::from(300);
let ptr = U256::from(300);
let out = U256::from(400);
let f: Vec<U256> = 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
}