This commit is contained in:
Dmitry Vagner 2023-01-25 16:41:42 +07:00
parent 3ea8ad9062
commit 0eef28af66
3 changed files with 377 additions and 282 deletions

View File

@ -52,7 +52,7 @@ pub fn miller_loop(p: Curve, q: TwistedCurve) -> Fp12 {
line = tangent(o, q); line = tangent(o, q);
acc = line * acc; acc = line * acc;
o = o + o; o = o + o;
if i != 0 { if i {
line = cord(p, o, q); line = cord(p, o, q);
acc = line * acc; acc = line * acc;
o = o + p; o = o + p;
@ -138,13 +138,13 @@ fn get_custom_powers(f: Fp12) -> (Fp12, Fp12, Fp12) {
// must keep multiplying all three values: a4, a2, a0 // must keep multiplying all three values: a4, a2, a0
for (a, b, c) in EXPS4 { for (a, b, c) in EXPS4 {
if a != 0 { if a {
y4 = y4 * sq; y4 = y4 * sq;
} }
if b != 0 { if b {
y2 = y2 * sq; y2 = y2 * sq;
} }
if c != 0 { if c {
y0 = y0 * sq; y0 = y0 * sq;
} }
sq = sq * sq; sq = sq * sq;
@ -154,10 +154,10 @@ fn get_custom_powers(f: Fp12) -> (Fp12, Fp12, Fp12) {
// must keep multiplying remaining two values: a2, a0 // must keep multiplying remaining two values: a2, a0
for (a, b) in EXPS2 { for (a, b) in EXPS2 {
if a != 0 { if a {
y2 = y2 * sq; y2 = y2 * sq;
} }
if b != 0 { if b {
y0 = y0 * sq; y0 = y0 * sq;
} }
sq = sq * sq; sq = sq * sq;
@ -167,7 +167,7 @@ fn get_custom_powers(f: Fp12) -> (Fp12, Fp12, Fp12) {
// must keep multiplying remaining value: a0 // must keep multiplying remaining value: a0
for a in EXPS0 { for a in EXPS0 {
if a != 0 { if a {
y0 = y0 * sq; y0 = y0 * sq;
} }
sq = sq * sq; sq = sq * sq;
@ -182,153 +182,166 @@ fn get_custom_powers(f: Fp12) -> (Fp12, Fp12, Fp12) {
(y2, y4 * y2 * y2 * y0_inv, y0_inv) (y2, y4 * y2 * y2 * y0_inv, y0_inv)
} }
const EXP: [usize; 253] = [ const EXP: [bool; 253] = [
1, 0, 0, 0, 0, 0, 1, 1, 0, 0, 1, 0, 0, 0, 1, 0, 0, 1, 1, 1, 0, 0, 1, 1, 1, 0, 0, 1, 0, 1, 1, 1, true, false, false, false, false, false, true, true, false, false, true, false, false, false,
0, 0, 0, 0, 1, 0, 0, 1, 1, 0, 0, 0, 1, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 1, 1, 0, 1, true, false, false, true, true, true, false, false, true, true, true, false, false, true,
1, 1, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 1, 1, 0, 1, 1, 0, 1, 1, 0, 1, 0, 0, false, true, true, true, false, false, false, false, true, false, false, true, true, false,
0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 1, 1, 0, 0, 0, 0, 1, 0, 1, 1, 1, 0, 1, 0, 0, 1, false, false, true, true, false, true, false, false, false, false, false, false, false, true,
0, 1, 0, 0, 0, 0, 0, 1, 1, 0, 0, 1, 1, 1, 1, 1, 0, 1, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 1, 1, false, true, false, false, true, true, false, true, true, true, false, false, false, false,
1, 1, 0, 0, 1, 1, 0, 1, 1, 1, 0, 0, 1, 0, 1, 1, 1, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 1, 0, 1, 0, true, false, true, false, false, false, false, false, true, false, false, false, true, false,
0, 0, 0, 1, 1, 1, 1, 1, 0, 0, 0, 0, 1, 1, 1, 1, 1, 0, 1, 0, 1, 1, 0, 0, 1, 0, 0, 1, 1, 1, 1, 1, true, true, false, true, true, false, true, true, false, true, false, false, false, false,
1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, false, false, true, true, false, false, false, false, false, false, true, false, true, false,
true, true, false, false, false, false, true, false, true, true, true, false, true, false,
false, true, false, true, false, false, false, false, false, true, true, false, false, true,
true, true, true, true, false, true, false, false, false, false, true, false, false, true,
false, false, false, false, true, true, true, true, false, false, true, true, false, true,
true, true, false, false, true, false, true, true, true, false, false, false, false, true,
false, false, true, false, false, false, true, false, true, false, false, false, false, true,
true, true, true, true, false, false, false, false, true, true, true, true, true, false, true,
false, true, true, false, false, true, false, false, true, true, true, true, true, true, false,
false, false, false, false, false, false, false, false, false, false, false, false, false,
false, false, false, false, false, false, false, false, false, false, false, false, false,
false,
]; ];
// The folowing constants are defined above get_custom_powers // The folowing constants are defined above get_custom_powers
const EXPS4: [(usize, usize, usize); 64] = [ const EXPS4: [(bool, bool, bool); 64] = [
(1, 1, 0), (true, true, false),
(1, 1, 1), (true, true, true),
(1, 1, 1), (true, true, true),
(0, 0, 0), (false, false, false),
(0, 0, 1), (false, false, true),
(1, 0, 1), (true, false, true),
(0, 1, 0), (false, true, false),
(1, 0, 1), (true, false, true),
(1, 1, 0), (true, true, false),
(1, 0, 1), (true, false, true),
(0, 1, 0), (false, true, false),
(1, 1, 0), (true, true, false),
(1, 1, 0), (true, true, false),
(1, 1, 0), (true, true, false),
(0, 1, 0), (false, true, false),
(0, 1, 0), (false, true, false),
(0, 0, 1), (false, false, true),
(1, 0, 1), (true, false, true),
(1, 1, 0), (true, true, false),
(0, 1, 0), (false, true, false),
(1, 1, 0), (true, true, false),
(1, 1, 0), (true, true, false),
(1, 1, 0), (true, true, false),
(0, 0, 1), (false, false, true),
(0, 0, 1), (false, false, true),
(1, 0, 1), (true, false, true),
(1, 0, 1), (true, false, true),
(1, 1, 0), (true, true, false),
(1, 0, 0), (true, false, false),
(1, 1, 0), (true, true, false),
(0, 1, 0), (false, true, false),
(1, 1, 0), (true, true, false),
(1, 0, 0), (true, false, false),
(0, 1, 0), (false, true, false),
(0, 0, 0), (false, false, false),
(1, 0, 0), (true, false, false),
(1, 0, 0), (true, false, false),
(1, 0, 1), (true, false, true),
(0, 0, 1), (false, false, true),
(0, 1, 1), (false, true, true),
(0, 0, 1), (false, false, true),
(0, 1, 1), (false, true, true),
(0, 1, 1), (false, true, true),
(0, 0, 0), (false, false, false),
(1, 1, 1), (true, true, true),
(1, 0, 1), (true, false, true),
(1, 0, 1), (true, false, true),
(0, 1, 1), (false, true, true),
(1, 0, 1), (true, false, true),
(0, 1, 1), (false, true, true),
(0, 1, 1), (false, true, true),
(1, 1, 0), (true, true, false),
(1, 1, 0), (true, true, false),
(1, 1, 0), (true, true, false),
(1, 0, 0), (true, false, false),
(0, 0, 1), (false, false, true),
(1, 0, 0), (true, false, false),
(0, 0, 1), (false, false, true),
(1, 0, 1), (true, false, true),
(1, 1, 0), (true, true, false),
(1, 1, 1), (true, true, true),
(0, 1, 1), (false, true, true),
(0, 1, 0), (false, true, false),
(1, 1, 1), (true, true, true),
]; ];
const EXPS2: [(usize, usize); 62] = [ const EXPS2: [(bool, bool); 62] = [
(1, 0), (true, false),
(1, 1), (true, true),
(0, 0), (false, false),
(1, 0), (true, false),
(1, 0), (true, false),
(1, 1), (true, true),
(1, 0), (true, false),
(1, 1), (true, true),
(1, 0), (true, false),
(0, 1), (false, true),
(0, 1), (false, true),
(1, 1), (true, true),
(1, 1), (true, true),
(0, 0), (false, false),
(1, 1), (true, true),
(0, 0), (false, false),
(0, 0), (false, false),
(0, 1), (false, true),
(0, 1), (false, true),
(1, 1), (true, true),
(1, 1), (true, true),
(1, 1), (true, true),
(0, 1), (false, true),
(1, 1), (true, true),
(0, 0), (false, false),
(1, 1), (true, true),
(1, 0), (true, false),
(1, 1), (true, true),
(0, 0), (false, false),
(1, 1), (true, true),
(1, 1), (true, true),
(1, 0), (true, false),
(0, 0), (false, false),
(0, 1), (false, true),
(0, 0), (false, false),
(1, 1), (true, true),
(0, 1), (false, true),
(0, 0), (false, false),
(1, 0), (true, false),
(0, 1), (false, true),
(0, 1), (false, true),
(1, 0), (true, false),
(0, 1), (false, true),
(0, 0), (false, false),
(0, 0), (false, false),
(0, 0), (false, false),
(0, 1), (false, true),
(1, 0), (true, false),
(1, 1), (true, true),
(0, 1), (false, true),
(1, 1), (true, true),
(1, 0), (true, false),
(0, 1), (false, true),
(0, 0), (false, false),
(1, 0), (true, false),
(0, 1), (false, true),
(1, 0), (true, false),
(1, 1), (true, true),
(1, 0), (true, false),
(1, 1), (true, true),
(0, 1), (false, true),
(1, 1), (true, true),
]; ];
const EXPS0: [usize; 65] = [ const EXPS0: [bool; 65] = [
0, 0, 1, 0, 0, 1, 1, 0, 1, 0, 1, 1, 1, 0, 1, 0, 0, 0, 1, 0, 0, 1, 0, 1, 0, 1, 1, 0, 0, 0, 0, 0, false, false, true, false, false, true, true, false, true, false, true, true, true, false,
1, 0, 1, 0, 1, 1, 1, 0, 0, 1, 1, 1, 1, 0, 1, 0, 1, 1, 0, 0, 1, 0, 0, 0, 1, 1, 1, 1, 0, 0, 1, 1, true, false, false, false, true, false, false, true, false, true, false, true, true, false,
0, false, false, false, false, true, false, true, false, true, true, true, false, false, true,
true, true, true, false, true, false, true, true, false, false, true, false, false, false,
true, true, true, true, false, false, true, true, false,
]; ];

View File

@ -129,11 +129,11 @@ global test_frob_fp12_6:
%macro frob_fp6_1 %macro frob_fp6_1
// stack: C0 , C1 , C2 // stack: C0 , C1 , C2
%conj %conj_fp254_2
// stack: D0 , C1 , C2 // stack: D0 , C1 , C2
%swap_fp2_hole_2 %swap_fp2_hole_2
// stack: C2 , C1 , D0 // stack: C2 , C1 , D0
%conj %conj_fp254_2
// stack: C2`, C1 , D0 // stack: C2`, C1 , D0
%frobt2_1 %frobt2_1
// stack: D2 , C1 , D0 // stack: D2 , C1 , D0
@ -141,7 +141,7 @@ global test_frob_fp12_6:
// stack: D0 , C1 , D2 // stack: D0 , C1 , D2
%swap_fp2 %swap_fp2
// stack: C1 , D0 , D2 // stack: C1 , D0 , D2
%conj %conj_fp254_2
// stack: C1`, D0 , D2 // stack: C1`, D0 , D2
%frobt1_1 %frobt1_1
// stack: D1 , D0 , D2 // stack: D1 , D0 , D2
@ -167,11 +167,11 @@ global test_frob_fp12_6:
%macro frob_fp6_3 %macro frob_fp6_3
// stack: C0 , C1 , C2 // stack: C0 , C1 , C2
%conj %conj_fp254_2
// stack: D0 , C1 , C2 // stack: D0 , C1 , C2
%swap_fp2_hole_2 %swap_fp2_hole_2
// stack: C2 , C1 , D0 // stack: C2 , C1 , D0
%conj %conj_fp254_2
// stack: C2`, C1 , D0 // stack: C2`, C1 , D0
%frobt2_3 %frobt2_3
// stack: D2 , C1 , D0 // stack: D2 , C1 , D0
@ -179,7 +179,7 @@ global test_frob_fp12_6:
// stack: D0 , C1 , D2 // stack: D0 , C1 , D2
%swap_fp2 %swap_fp2
// stack: C1 , D0 , D2 // stack: C1 , D0 , D2
%conj %conj_fp254_2
// stack: C1`, D0 , D2 // stack: C1`, D0 , D2
%frobt1_3 %frobt1_3
// stack: D1 , D0 , D2 // stack: D1 , D0 , D2

View File

@ -7,7 +7,8 @@
// cost: 2 loads + 6 dup/swaps + 5 adds = 6*4 + 6*1 + 5*2 = 40 // cost: 2 loads + 6 dup/swaps + 5 adds = 6*4 + 6*1 + 5*2 = 40
%macro load_fp2 %macro load_fp2
// stack: ptr // stack: ptr
DUP1 %add_const(1) DUP1
%add_const(1)
// stack: ind1, ptr // stack: ind1, ptr
%mload_kernel_general %mload_kernel_general
// stack: x1, ptr // stack: x1, ptr
@ -17,7 +18,8 @@
// stack: x0, x1 // stack: x0, x1
%endmacro %endmacro
%macro conj /// complex conjugate
%macro conj_fp254_2
// stack: a, b // stack: a, b
SWAP1 SWAP1
PUSH 0 PUSH 0
@ -71,13 +73,15 @@
// stack: b, a , b // stack: b, a , b
DUP2 DUP2
// stack: a , b, a , b // stack: a , b, a , b
PUSH 9 MULFP254 PUSH 9
MULFP254
// stack: 9a , b, a , b // stack: 9a , b, a , b
SUBFP254 SUBFP254
// stack: 9a - b, a , b // stack: 9a - b, a , b
SWAP2 SWAP2
// stack: b , a, 9a - b // stack: b , a, 9a - b
PUSH 9 MULFP254 PUSH 9
MULFP254
// stack 9b , a, 9a - b // stack 9b , a, 9a - b
ADDFP254 ADDFP254
// stack: 9b + a, 9a - b // stack: 9b + a, 9a - b
@ -114,23 +118,28 @@
// cost: 6 loads + 6 dup/swaps + 5 adds = 6*4 + 6*1 + 5*2 = 40 // cost: 6 loads + 6 dup/swaps + 5 adds = 6*4 + 6*1 + 5*2 = 40
%macro load_fp6 %macro load_fp6
// stack: ptr // stack: ptr
DUP1 %add_const(4) DUP1
%add_const(4)
// stack: ind4, ptr // stack: ind4, ptr
%mload_kernel_general %mload_kernel_general
// stack: x4, ptr // stack: x4, ptr
DUP2 %add_const(3) DUP2
%add_const(3)
// stack: ind3, x4, ptr // stack: ind3, x4, ptr
%mload_kernel_general %mload_kernel_general
// stack: x3, x4, ptr // stack: x3, x4, ptr
DUP3 %add_const(2) DUP3
%add_const(2)
// stack: ind2, x3, x4, ptr // stack: ind2, x3, x4, ptr
%mload_kernel_general %mload_kernel_general
// stack: x2, x3, x4, ptr // stack: x2, x3, x4, ptr
DUP4 %add_const(1) DUP4
%add_const(1)
// stack: ind1, x2, x3, x4, ptr // stack: ind1, x2, x3, x4, ptr
%mload_kernel_general %mload_kernel_general
// stack: x1, x2, x3, x4, ptr // stack: x1, x2, x3, x4, ptr
DUP5 %add_const(5) DUP5
%add_const(5)
// stack: ind5, x1, x2, x3, x4, ptr // stack: ind5, x1, x2, x3, x4, ptr
%mload_kernel_general %mload_kernel_general
// stack: x5, x1, x2, x3, x4, ptr // stack: x5, x1, x2, x3, x4, ptr
@ -143,23 +152,28 @@
// cost: 6 loads + 6 pushes + 5 adds = 6*4 + 6*1 + 5*2 = 40 // cost: 6 loads + 6 pushes + 5 adds = 6*4 + 6*1 + 5*2 = 40
%macro load_fp6(ptr) %macro load_fp6(ptr)
// stack: // stack:
PUSH $ptr %add_const(5) PUSH $ptr
%add_const(5)
// stack: ind5 // stack: ind5
%mload_kernel_general %mload_kernel_general
// stack: x5 // stack: x5
PUSH $ptr %add_const(4) PUSH $ptr
%add_const(4)
// stack: ind4, x5 // stack: ind4, x5
%mload_kernel_general %mload_kernel_general
// stack: x4, x5 // stack: x4, x5
PUSH $ptr %add_const(3) PUSH $ptr
%add_const(3)
// stack: ind3, x4, x5 // stack: ind3, x4, x5
%mload_kernel_general %mload_kernel_general
// stack: x3, x4, x5 // stack: x3, x4, x5
PUSH $ptr %add_const(2) PUSH $ptr
%add_const(2)
// stack: ind2, x3, x4, x5 // stack: ind2, x3, x4, x5
%mload_kernel_general %mload_kernel_general
// stack: x2, x3, x4, x5 // stack: x2, x3, x4, x5
PUSH $ptr %add_const(1) PUSH $ptr
%add_const(1)
// stack: ind1, x2, x3, x4, x5 // stack: ind1, x2, x3, x4, x5
%mload_kernel_general %mload_kernel_general
// stack: x1, x2, x3, x4, x5 // stack: x1, x2, x3, x4, x5
@ -174,7 +188,8 @@
// stack: ptr, x0, x1, x2, x3, x4 , x5 // stack: ptr, x0, x1, x2, x3, x4 , x5
SWAP5 SWAP5
// stack: x4, x0, x1, x2, x3, ptr, x5 // stack: x4, x0, x1, x2, x3, ptr, x5
DUP6 %add_const(4) DUP6
%add_const(4)
// stack: ind4, x4, x0, x1, x2, x3, ptr, x5 // stack: ind4, x4, x0, x1, x2, x3, ptr, x5
%mstore_kernel_general %mstore_kernel_general
// stack: x0, x1, x2, x3, ptr, x5 // stack: x0, x1, x2, x3, ptr, x5
@ -182,15 +197,18 @@
// stack: ind0, x0, x1, x2, x3, ptr, x5 // stack: ind0, x0, x1, x2, x3, ptr, x5
%mstore_kernel_general %mstore_kernel_general
// stack: x1, x2, x3, ptr, x5 // stack: x1, x2, x3, ptr, x5
DUP4 %add_const(1) DUP4
%add_const(1)
// stack: ind1, x1, x2, x3, ptr, x5 // stack: ind1, x1, x2, x3, ptr, x5
%mstore_kernel_general %mstore_kernel_general
// stack: x2, x3, ptr, x5 // stack: x2, x3, ptr, x5
DUP3 %add_const(2) DUP3
%add_const(2)
// stack: ind2, x2, x3, ptr, x5 // stack: ind2, x2, x3, ptr, x5
%mstore_kernel_general %mstore_kernel_general
// stack: x3, ptr, x5 // stack: x3, ptr, x5
DUP2 %add_const(3) DUP2
%add_const(3)
// stack: ind3, x3, ptr, x5 // stack: ind3, x3, ptr, x5
%mstore_kernel_general %mstore_kernel_general
// stack: ptr, x5 // stack: ptr, x5
@ -205,37 +223,47 @@
// stack: ptr, x0, x1, x2, x3, x4, x5 // stack: ptr, x0, x1, x2, x3, x4, x5
SWAP6 SWAP6
// stack: x5, x0, x1, x2, x3, x4, ptr // stack: x5, x0, x1, x2, x3, x4, ptr
PUSH 2 MULFP254 PUSH 2
MULFP254
// stack: 2*x5, x0, x1, x2, x3, x4, ptr // stack: 2*x5, x0, x1, x2, x3, x4, ptr
DUP7 %add_const(5) DUP7
%add_const(5)
// stack: ind5, 2*x5, x0, x1, x2, x3, x4, ptr // stack: ind5, 2*x5, x0, x1, x2, x3, x4, ptr
%mstore_kernel_general %mstore_kernel_general
// stack: x0, x1, x2, x3, x4, ptr // stack: x0, x1, x2, x3, x4, ptr
PUSH 2 MULFP254 PUSH 2
MULFP254
// stack: 2*x0, x1, x2, x3, x4, ptr // stack: 2*x0, x1, x2, x3, x4, ptr
DUP6 DUP6
// stack: ind0, 2*x0, x1, x2, x3, x4, ptr // stack: ind0, 2*x0, x1, x2, x3, x4, ptr
%mstore_kernel_general %mstore_kernel_general
// stack: x1, x2, x3, x4, ptr // stack: x1, x2, x3, x4, ptr
PUSH 2 MULFP254 PUSH 2
MULFP254
// stack: 2*x1, x2, x3, x4, ptr // stack: 2*x1, x2, x3, x4, ptr
DUP5 %add_const(1) DUP5
%add_const(1)
// stack: ind1, 2*x1, x2, x3, x4, ptr // stack: ind1, 2*x1, x2, x3, x4, ptr
%mstore_kernel_general %mstore_kernel_general
// stack: x2, x3, x4, ptr // stack: x2, x3, x4, ptr
PUSH 2 MULFP254 PUSH 2
MULFP254
// stack: 2*x2, x3, x4, ptr // stack: 2*x2, x3, x4, ptr
DUP4 %add_const(2) DUP4
%add_const(2)
// stack: ind2, 2*x2, x3, x4, ptr // stack: ind2, 2*x2, x3, x4, ptr
%mstore_kernel_general %mstore_kernel_general
// stack: x3, x4, ptr // stack: x3, x4, ptr
PUSH 2 MULFP254 PUSH 2
MULFP254
// stack: 2*x3, x4, ptr // stack: 2*x3, x4, ptr
DUP3 %add_const(3) DUP3
%add_const(3)
// stack: ind3, 2*x3, x4, ptr // stack: ind3, 2*x3, x4, ptr
%mstore_kernel_general %mstore_kernel_general
// stack: x4, ptr // stack: x4, ptr
PUSH 2 MULFP254 PUSH 2
MULFP254
// stack: 2*x4, ptr // stack: 2*x4, ptr
SWAP1 SWAP1
// stack: ptr, 2*x4 // stack: ptr, 2*x4
@ -252,23 +280,28 @@
// stack: ind0, x0, x1, x2, x3, x4, x5 // stack: ind0, x0, x1, x2, x3, x4, x5
%mstore_kernel_general %mstore_kernel_general
// stack: x1, x2, x3, x4, x5 // stack: x1, x2, x3, x4, x5
PUSH $ptr %add_const(1) PUSH $ptr
%add_const(1)
// stack: ind1, x1, x2, x3, x4, x5 // stack: ind1, x1, x2, x3, x4, x5
%mstore_kernel_general %mstore_kernel_general
// stack: x2, x3, x4, x5 // stack: x2, x3, x4, x5
PUSH $ptr %add_const(2) PUSH $ptr
%add_const(2)
// stack: ind2, x2, x3, x4, x5 // stack: ind2, x2, x3, x4, x5
%mstore_kernel_general %mstore_kernel_general
// stack: x3, x4, x5 // stack: x3, x4, x5
PUSH $ptr %add_const(3) PUSH $ptr
%add_const(3)
// stack: ind3, x3, x4, x5 // stack: ind3, x3, x4, x5
%mstore_kernel_general %mstore_kernel_general
// stack: x4, x5 // stack: x4, x5
PUSH $ptr %add_const(4) PUSH $ptr
%add_const(4)
// stack: ind4, x4, x5 // stack: ind4, x4, x5
%mstore_kernel_general %mstore_kernel_general
// stack: x5 // stack: x5
PUSH $ptr %add_const(5) PUSH $ptr
%add_const(5)
// stack: ind5, x5 // stack: ind5, x5
%mstore_kernel_general %mstore_kernel_general
// stack: // stack:
@ -277,25 +310,30 @@
// cost: store (40) + i9 (9) = 49 // cost: store (40) + i9 (9) = 49
%macro store_fp6_sh(ptr) %macro store_fp6_sh(ptr)
// stack: x0, x1, x2, x3, x4, x5 // stack: x0, x1, x2, x3, x4, x5
PUSH $ptr %add_const(2) PUSH $ptr
%add_const(2)
// stack: ind2, x0, x1, x2, x3, x4, x5 // stack: ind2, x0, x1, x2, x3, x4, x5
%mstore_kernel_general %mstore_kernel_general
// stack: x1, x2, x3, x4, x5 // stack: x1, x2, x3, x4, x5
PUSH $ptr %add_const(3) PUSH $ptr
%add_const(3)
// stack: ind3, x1, x2, x3, x4, x5 // stack: ind3, x1, x2, x3, x4, x5
%mstore_kernel_general %mstore_kernel_general
// stack: x2, x3, x4, x5 // stack: x2, x3, x4, x5
PUSH $ptr %add_const(4) PUSH $ptr
%add_const(4)
// stack: ind4, x2, x3, x4, x5 // stack: ind4, x2, x3, x4, x5
%mstore_kernel_general %mstore_kernel_general
// stack: x3, x4, x5 // stack: x3, x4, x5
PUSH $ptr %add_const(5) PUSH $ptr
%add_const(5)
// stack: ind5, x3, x4, x5 // stack: ind5, x3, x4, x5
%mstore_kernel_general %mstore_kernel_general
// stack: x4, x5 // stack: x4, x5
%i9 %i9
// stack: y5, y4 // stack: y5, y4
PUSH $ptr %add_const(1) PUSH $ptr
%add_const(1)
// stack: ind1, y5, y4 // stack: ind1, y5, y4
%mstore_kernel_general %mstore_kernel_general
// stack: y4 // stack: y4
@ -868,47 +906,58 @@
%macro load_fp12 %macro load_fp12
// stack: ptr // stack: ptr
DUP1 %add_const(10) DUP1
%add_const(10)
// stack: ind10, ptr // stack: ind10, ptr
%mload_kernel_general %mload_kernel_general
// stack: x10, ptr // stack: x10, ptr
DUP2 %add_const(9) DUP2
%add_const(9)
// stack: ind09, x10, ptr // stack: ind09, x10, ptr
%mload_kernel_general %mload_kernel_general
// stack: x09, x10, ptr // stack: x09, x10, ptr
DUP3 %add_const(8) DUP3
%add_const(8)
// stack: ind08, x09, x10, ptr // stack: ind08, x09, x10, ptr
%mload_kernel_general %mload_kernel_general
// stack: x08, x09, x10, ptr // stack: x08, x09, x10, ptr
DUP4 %add_const(7) DUP4
%add_const(7)
// stack: ind07, x08, x09, x10, ptr // stack: ind07, x08, x09, x10, ptr
%mload_kernel_general %mload_kernel_general
// stack: x07, x08, x09, x10, ptr // stack: x07, x08, x09, x10, ptr
DUP5 %add_const(6) DUP5
%add_const(6)
// stack: ind06, x07, x08, x09, x10, ptr // stack: ind06, x07, x08, x09, x10, ptr
%mload_kernel_general %mload_kernel_general
// stack: x06, x07, x08, x09, x10, ptr // stack: x06, x07, x08, x09, x10, ptr
DUP6 %add_const(5) DUP6
%add_const(5)
// stack: ind05, x06, x07, x08, x09, x10, ptr // stack: ind05, x06, x07, x08, x09, x10, ptr
%mload_kernel_general %mload_kernel_general
// stack: x05, x06, x07, x08, x09, x10, ptr // stack: x05, x06, x07, x08, x09, x10, ptr
DUP7 %add_const(4) DUP7
%add_const(4)
// stack: ind04, x05, x06, x07, x08, x09, x10, ptr // stack: ind04, x05, x06, x07, x08, x09, x10, ptr
%mload_kernel_general %mload_kernel_general
// stack: x04, x05, x06, x07, x08, x09, x10, ptr // stack: x04, x05, x06, x07, x08, x09, x10, ptr
DUP8 %add_const(3) DUP8
%add_const(3)
// stack: ind03, x04, x05, x06, x07, x08, x09, x10, ptr // stack: ind03, x04, x05, x06, x07, x08, x09, x10, ptr
%mload_kernel_general %mload_kernel_general
// stack: x03, x04, x05, x06, x07, x08, x09, x10, ptr // stack: x03, x04, x05, x06, x07, x08, x09, x10, ptr
DUP9 %add_const(2) DUP9
%add_const(2)
// stack: ind02, x03, x04, x05, x06, x07, x08, x09, x10, ptr // stack: ind02, x03, x04, x05, x06, x07, x08, x09, x10, ptr
%mload_kernel_general %mload_kernel_general
// stack: x02, x03, x04, x05, x06, x07, x08, x09, x10, ptr // stack: x02, x03, x04, x05, x06, x07, x08, x09, x10, ptr
DUP10 %add_const(1) DUP10
%add_const(1)
// stack: ind01, x02, x03, x04, x05, x06, x07, x08, x09, x10, ptr // stack: ind01, x02, x03, x04, x05, x06, x07, x08, x09, x10, ptr
%mload_kernel_general %mload_kernel_general
// stack: x01, x02, x03, x04, x05, x06, x07, x08, x09, x10, ptr // stack: x01, x02, x03, x04, x05, x06, x07, x08, x09, x10, ptr
DUP11 %add_const(11) DUP11
%add_const(11)
// stack: ind11, x01, x02, x03, x04, x05, x06, x07, x08, x09, x10, ptr // stack: ind11, x01, x02, x03, x04, x05, x06, x07, x08, x09, x10, ptr
%mload_kernel_general %mload_kernel_general
// stack: x11, x01, x02, x03, x04, x05, x06, x07, x08, x09, x10, ptr // stack: x11, x01, x02, x03, x04, x05, x06, x07, x08, x09, x10, ptr
@ -922,7 +971,8 @@
// stack: ptr, x00, x01, x02, x03, x04, x05, x06, x07, x08, x09, x10, x11 // stack: ptr, x00, x01, x02, x03, x04, x05, x06, x07, x08, x09, x10, x11
SWAP11 SWAP11
// stack: x10, x00, x01, x02, x03, x04, x05, x06, x07, x08, x09, ptr, x11 // stack: x10, x00, x01, x02, x03, x04, x05, x06, x07, x08, x09, ptr, x11
DUP12 %add_const(10) DUP12
%add_const(10)
// stack: ind10, x10, x00, x01, x02, x03, x04, x05, x06, x07, x08, x09, ptr, x11 // stack: ind10, x10, x00, x01, x02, x03, x04, x05, x06, x07, x08, x09, ptr, x11
%mstore_kernel_general %mstore_kernel_general
// stack: x00, x01, x02, x03, x04, x05, x06, x07, x08, x09, ptr, x11 // stack: x00, x01, x02, x03, x04, x05, x06, x07, x08, x09, ptr, x11
@ -930,39 +980,48 @@
// stack: ind00, x00, x01, x02, x03, x04, x05, x06, x07, x08, x09, ptr, x11 // stack: ind00, x00, x01, x02, x03, x04, x05, x06, x07, x08, x09, ptr, x11
%mstore_kernel_general %mstore_kernel_general
// stack: x01, x02, x03, x04, x05, x06, x07, x08, x09, ptr, x11 // stack: x01, x02, x03, x04, x05, x06, x07, x08, x09, ptr, x11
DUP10 %add_const(01) DUP10
%add_const(01)
// stack: ind01, x01, x02, x03, x04, x05, x06, x07, x08, x09, ptr, x11 // stack: ind01, x01, x02, x03, x04, x05, x06, x07, x08, x09, ptr, x11
%mstore_kernel_general %mstore_kernel_general
// stack: x02, x03, x04, x05, x06, x07, x08, x09, ptr, x11 // stack: x02, x03, x04, x05, x06, x07, x08, x09, ptr, x11
DUP9 %add_const(02) DUP9
%add_const(02)
// stack: ind02, x02, x03, x04, x05, x06, x07, x08, x09, ptr, x11 // stack: ind02, x02, x03, x04, x05, x06, x07, x08, x09, ptr, x11
%mstore_kernel_general %mstore_kernel_general
// stack: x03, x04, x05, x06, x07, x08, x09, ptr, x11 // stack: x03, x04, x05, x06, x07, x08, x09, ptr, x11
DUP8 %add_const(03) DUP8
%add_const(03)
// stack: ind03, x03, x04, x05, x06, x07, x08, x09, ptr, x11 // stack: ind03, x03, x04, x05, x06, x07, x08, x09, ptr, x11
%mstore_kernel_general %mstore_kernel_general
// stack: x04, x05, x06, x07, x08, x09, ptr, x11 // stack: x04, x05, x06, x07, x08, x09, ptr, x11
DUP7 %add_const(04) DUP7
%add_const(04)
// stack: ind04, x04, x05, x06, x07, x08, x09, ptr, x11 // stack: ind04, x04, x05, x06, x07, x08, x09, ptr, x11
%mstore_kernel_general %mstore_kernel_general
// stack: x05, x06, x07, x08, x09, ptr, x11 // stack: x05, x06, x07, x08, x09, ptr, x11
DUP6 %add_const(05) DUP6
%add_const(05)
// stack: ind05, x05, x06, x07, x08, x09, ptr, x11 // stack: ind05, x05, x06, x07, x08, x09, ptr, x11
%mstore_kernel_general %mstore_kernel_general
// stack: x06, x07, x08, x09, ptr, x11 // stack: x06, x07, x08, x09, ptr, x11
DUP5 %add_const(06) DUP5
%add_const(06)
// stack: ind06, x06, x07, x08, x09, ptr, x11 // stack: ind06, x06, x07, x08, x09, ptr, x11
%mstore_kernel_general %mstore_kernel_general
// stack: x07, x08, x09, ptr, x11 // stack: x07, x08, x09, ptr, x11
DUP4 %add_const(07) DUP4
%add_const(07)
// stack: ind07, x07, x08, x09, ptr, x11 // stack: ind07, x07, x08, x09, ptr, x11
%mstore_kernel_general %mstore_kernel_general
// stack: x08, x09, ptr, x11 // stack: x08, x09, ptr, x11
DUP3 %add_const(08) DUP3
%add_const(08)
// stack: ind08, x08, x09, ptr, x11 // stack: ind08, x08, x09, ptr, x11
%mstore_kernel_general %mstore_kernel_general
// stack: x09, ptr, x11 // stack: x09, ptr, x11
DUP2 %add_const(09) DUP2
%add_const(09)
// stack: ind09, x09, ptr, x11 // stack: ind09, x09, ptr, x11
%mstore_kernel_general %mstore_kernel_general
// stack: ptr, x11 // stack: ptr, x11
@ -972,102 +1031,125 @@
// stack: // stack:
%endmacro %endmacro
/// moves fp12 from src..src+12 to dest..dest+12
/// these should not overlap. leaves dest on stack
%macro move_fp12 %macro move_fp12
// stack: ptr, ptr' // stack: src, dest
DUP1 DUP1
// stack: ind00, ptr, ptr' // stack: ind00, src, dest
%mload_kernel_general %mload_kernel_general
// stack: x00, ptr, ptr' // stack: x00, src, dest
DUP3 DUP3
// stack: ind00', x00, ptr, ptr' // stack: ind00', x00, src, dest
%mstore_kernel_general %mstore_kernel_general
// stack: ptr, ptr' // stack: src, dest
DUP1 %add_const(1) DUP1
// stack: ind01, ptr, ptr' %add_const(1)
// stack: ind01, src, dest
%mload_kernel_general %mload_kernel_general
// stack: x01, ptr, ptr' // stack: x01, src, dest
DUP3 %add_const(1) DUP3
// stack: ind01', x01, ptr, ptr' %add_const(1)
// stack: ind01', x01, src, dest
%mstore_kernel_general %mstore_kernel_general
// stack: ptr, ptr' // stack: src, dest
DUP1 %add_const(2) DUP1
// stack: ind02, ptr, ptr' %add_const(2)
// stack: ind02, src, dest
%mload_kernel_general %mload_kernel_general
// stack: x02, ptr, ptr' // stack: x02, src, dest
DUP3 %add_const(2) DUP3
// stack: ind02', x02, ptr, ptr' %add_const(2)
// stack: ind02', x02, src, dest
%mstore_kernel_general %mstore_kernel_general
// stack: ptr, ptr' // stack: src, dest
DUP1 %add_const(3) DUP1
// stack: ind03, ptr, ptr' %add_const(3)
// stack: ind03, src, dest
%mload_kernel_general %mload_kernel_general
// stack: x03, ptr, ptr' // stack: x03, src, dest
DUP3 %add_const(3) DUP3
// stack: ind03', x03, ptr, ptr' %add_const(3)
// stack: ind03', x03, src, dest
%mstore_kernel_general %mstore_kernel_general
// stack: ptr, ptr' // stack: src, dest
DUP1 %add_const(4) DUP1
// stack: ind04, ptr, ptr' %add_const(4)
// stack: ind04, src, dest
%mload_kernel_general %mload_kernel_general
// stack: x04, ptr, ptr' // stack: x04, src, dest
DUP3 %add_const(4) DUP3
// stack: ind04', x04, ptr, ptr' %add_const(4)
// stack: ind04', x04, src, dest
%mstore_kernel_general %mstore_kernel_general
// stack: ptr, ptr' // stack: src, dest
DUP1 %add_const(5) DUP1
// stack: ind05, ptr, ptr' %add_const(5)
// stack: ind05, src, dest
%mload_kernel_general %mload_kernel_general
// stack: x05, ptr, ptr' // stack: x05, src, dest
DUP3 %add_const(5) DUP3
// stack: ind05', x05, ptr, ptr' %add_const(5)
// stack: ind05', x05, src, dest
%mstore_kernel_general %mstore_kernel_general
// stack: ptr, ptr' // stack: src, dest
DUP1 %add_const(6) DUP1
// stack: ind06, ptr, ptr' %add_const(6)
// stack: ind06, src, dest
%mload_kernel_general %mload_kernel_general
// stack: x06, ptr, ptr' // stack: x06, src, dest
DUP3 %add_const(6) DUP3
// stack: ind06', x06, ptr, ptr' %add_const(6)
// stack: ind06', x06, src, dest
%mstore_kernel_general %mstore_kernel_general
// stack: ptr, ptr' // stack: src, dest
DUP1 %add_const(7) DUP1
// stack: ind07, ptr, ptr' %add_const(7)
// stack: ind07, src, dest
%mload_kernel_general %mload_kernel_general
// stack: x07, ptr, ptr' // stack: x07, src, dest
DUP3 %add_const(7) DUP3
// stack: ind07', x07, ptr, ptr' %add_const(7)
// stack: ind07', x07, src, dest
%mstore_kernel_general %mstore_kernel_general
// stack: ptr, ptr' // stack: src, dest
DUP1 %add_const(8) DUP1
// stack: ind08, ptr, ptr' %add_const(8)
// stack: ind08, src, dest
%mload_kernel_general %mload_kernel_general
// stack: x08, ptr, ptr' // stack: x08, src, dest
DUP3 %add_const(8) DUP3
// stack: ind08', x08, ptr, ptr' %add_const(8)
// stack: ind08', x08, src, dest
%mstore_kernel_general %mstore_kernel_general
// stack: ptr, ptr' // stack: src, dest
DUP1 %add_const(9) DUP1
// stack: ind09, ptr, ptr' %add_const(9)
// stack: ind09, src, dest
%mload_kernel_general %mload_kernel_general
// stack: x09, ptr, ptr' // stack: x09, src, dest
DUP3 %add_const(9) DUP3
// stack: ind09', x09, ptr, ptr' %add_const(9)
// stack: ind09', x09, src, dest
%mstore_kernel_general %mstore_kernel_general
// stack: ptr, ptr' // stack: src, dest
DUP1 %add_const(10) DUP1
// stack: ind10, ptr, ptr' %add_const(10)
// stack: ind10, src, dest
%mload_kernel_general %mload_kernel_general
// stack: x10, ptr, ptr' // stack: x10, src, dest
DUP3 %add_const(10) DUP3
// stack: ind10', x10, ptr, ptr' %add_const(10)
// stack: ind10', x10, src, dest
%mstore_kernel_general %mstore_kernel_general
// stack: ptr, ptr' // stack: src, dest
%add_const(11) %add_const(11)
// stack: ind11, ptr' // stack: ind11, dest
%mload_kernel_general %mload_kernel_general
// stack: x11, ptr' // stack: x11, dest
DUP2 %add_const(11) DUP2
// stack: ind11', x11, ptr' %add_const(11)
// stack: ind11', x11, dest
%mstore_kernel_general %mstore_kernel_general
%endmacro %endmacro