This commit is contained in:
Dmitry Vagner 2022-11-16 16:28:36 -08:00
parent b779b82512
commit ca92057b01
2 changed files with 163 additions and 34 deletions

View File

@ -2,6 +2,8 @@
%add_const(6)
%endmacro
// fp2 macros
// cost: 2 loads + 6 dup/swaps + 5 adds = 6*4 + 6*1 + 5*2 = 40
%macro load_fp2
// stack: ptr
@ -15,6 +17,72 @@
// stack: x0, x1
%endmacro
%macro conj
// stack: a, b
SWAP1
PUSH 0
SUBFP254
SWAP1
// stack: a, -b
%endmacro
%macro swap_fp2
// stack: a , a_, b , b_
SWAP2
// stack: b , a_, a , b_
SWAP1
// stack: a_, b , a , b_
SWAP3
// stack: b_, b , a , a_
SWAP1
// stack: b , b_, a , a_
%endmacro
%macro swap_fp2_hole_2
// stack: a , a_, X, b , b_
SWAP4
// stack: b , a_, X, a , b_
SWAP1
// stack: a_, b , X, a , b_
SWAP5
// stack: b_, b , X, a , a_
SWAP1
// stack: b , b_, X, a , a_
%endmacro
%macro mul_fp_fp2
// stack: c, x, y
SWAP2
// stack: y, x, c
DUP3
// stack: c, y, x, c
MULFP254
// stack: cy, x, c
SWAP2
// stack: c, x, cy
MULFP254
// stack: cx, cy
%endmacro
// cost: 9; note this returns y, x for the output x + yi
%macro i9
// stack: a , b
DUP2
// stack: b, a , b
DUP2
// stack: a , b, a , b
PUSH 9 MULFP254
// stack: 9a , b, a , b
SUBFP254
// stack: 9a - b, a , b
SWAP2
// stack: b , a, 9a - b
PUSH 9 MULFP254
// stack 9b , a, 9a - b
ADDFP254
// stack: 9b + a, 9a - b
%endmacro
%macro mul_fp2
// stack: a, b, c, d
DUP4
@ -41,6 +109,8 @@
// stack: ac - bd, bc + ad
%endmacro
// fp6 macros
// cost: 6 loads + 6 dup/swaps + 5 adds = 6*4 + 6*1 + 5*2 = 40
%macro load_fp6
// stack: ptr
@ -518,25 +588,6 @@
// stack: c * f0, c * f1, c * f2, c * f3, c * f4, c * f5
%endmacro
// cost: 9; note this returns y, x for the output x + yi
%macro i9
// stack: a , b
DUP2
// stack: b, a , b
DUP2
// stack: a , b, a , b
PUSH 9 MULFP254
// stack: 9a , b, a , b
SUBFP254
// stack: 9a - b, a , b
SWAP2
// stack: b , a, 9a - b
PUSH 9 MULFP254
// stack 9b , a, 9a - b
ADDFP254
// stack: 9b + a, 9a - b
%endmacro
/// cost: 1 i9 (9) + 16 dups + 15 swaps + 12 muls + 6 adds/subs = 58
///
/// G0 + G1t + G2t^2 = (a+bi)t * (F0 + F1t + F2t^2)
@ -724,18 +775,3 @@
SWAP1
// stack: g0, g0_, g1, g1_, g2, g2_
%endmacro
%macro frob_fp2
// stack: n , a, b
PUSH 2
MULFP254
PUSH 1
SUBFP254
// stack: 1-2n , a, b
DUP3
MULFP254
// stack: (1-2n)b, a, b
SWAP2
POP
// stack: a, (1-2n)b
%endmacro

View File

@ -0,0 +1,93 @@
/// def frob_fp6(n, C0, C1, C2):
/// if n%2:
/// D0, D1, D2 = C0`, FROB_t1[n] * C1`, FROB_t2[n] * C2`
/// else:
/// D0, D1, D2 = C0 , FROB_t1[n] * C1 , FROB_t2[n] * C2
/// return D0, D1, D2
%macro frob_fp6_1
// stack: C0 , C1 , C2
%conj
// stack: D0 , C1 , C2
%swap_fp2_hole_2
// stack: C2 , C1 , D0
%conj
// stack: C2`, C1 , D0
PUSH 0x2c145edbe7fd8aee9f3a80b03b0b1c923685d2ea1bdec763c13b4711cd2b8126
PUSH 0x5b54f5e64eea80180f3c0b75a181e84d33365f7be94ec72848a1f55921ea762
%mul_fp2
// stack: D2 , C1 , D0
%swap_fp2_hole_2
// stack: D0 , C1 , D2
%swap_fp2
// stack: C1 , D0 , D2
%conj
// stack: C1`, D0 , D2
PUSH 0x16c9e55061ebae204ba4cc8bd75a079432ae2a1d0b7c9dce1665d51c640fcba2
PUSH 0x2fb347984f7911f74c0bec3cf559b143b78cc310c2c3330c99e39557176f553d
%mul_fp2
// stack: D1 , D0 , D2
%swap_fp2
// stack: D0 , D1 , D2
%endmacro
%macro frob_fp6_2
// stack: C0, C1, C2
%swap_fp2_hole_2
// stack: C2, C1, C0
PUSH 0x59e26bcea0d48bacd4f263f1acdb5c4f5763473177fffffe
%mul_fp_fp2
// stack: D2, C1, C0
%swap_fp2_hole_2
// stack: C0, C1, D2
%swap_fp2
// stack: C1, C0, D2
PUSH 0x30644e72e131a0295e6dd9e7e0acccb0c28f069fbb966e3de4bd44e5607cfd48
%mul_fp_fp2
// stack: D1, C0, D2
%swap_fp2
// stack: D0, D1, D2
%endmacro
%macro frob_fp6_3
// stack: C0 , C1 , C2
%conj
// stack: D0 , C1 , C2
%swap_fp2_hole_2
// stack: C2 , C1 , D0
%conj
// stack: C2`, C1 , D0
PUSH 0x23d5e999e1910a12feb0f6ef0cd21d04a44a9e08737f96e55fe3ed9d730c239f
PUSH 0xbc58c6611c08dab19bee0f7b5b2444ee633094575b06bcb0e1a92bc3ccbf066
%mul_fp2
// stack: D2 , C1 , D0
%swap_fp2_hole_2
// stack: D0 , C1 , D2
%swap_fp2
// stack: C1 , D0 , D2
%conj
// stack: C1`, D0 , D2
PUSH 0x4f1de41b3d1766fa9f30e6dec26094f0fdf31bf98ff2631380cab2baaa586de
PUSH 0x856e078b755ef0abaff1c77959f25ac805ffd3d5d6942d37b746ee87bdcfb6d
%mul_fp2
// stack: D1 , D0 , D2
%swap_fp2
// stack: D0 , D1 , D2
%endmacro
/// def Fp12_frob(n, f, f'):
/// return frob_fp6(n, f ),
/// FROB_z[n] * frob_fp6(n, f')
global frob_fp12_1:
global frob_fp12_2:
global frob_fp12_3:
global frob_fp12_6: