From 00534286a609e8cafcd3d1296d08ad271a4edad8 Mon Sep 17 00:00:00 2001 From: Dmitry Vagner Date: Fri, 7 Oct 2022 15:41:46 -0700 Subject: [PATCH] Fp12 mult + Fp6 macros --- evm/src/cpu/kernel/asm/fields/Fp12.asm | 59 +++++++++ evm/src/cpu/kernel/asm/fields/Fp6.asm | 166 ++++++++++++++++++++++++- 2 files changed, 223 insertions(+), 2 deletions(-) create mode 100644 evm/src/cpu/kernel/asm/fields/Fp12.asm diff --git a/evm/src/cpu/kernel/asm/fields/Fp12.asm b/evm/src/cpu/kernel/asm/fields/Fp12.asm new file mode 100644 index 00000000..400676de --- /dev/null +++ b/evm/src/cpu/kernel/asm/fields/Fp12.asm @@ -0,0 +1,59 @@ +/// F = f + f'z +/// G = g + g'z +/// +/// h + h'z = FG +/// +/// h = fg + sh(f'g') +/// h' = (f+f')(g+g') - fg - f'g' + +mul_Fp12: + %load_fp6(6) + %load_fp6(18) + %dup2_fp6 + %dup2_fp6 + // stack: g', f', g', f' + %mul_fp6 + %dup1_fp6 + // stack: g'f', g'f', g', f' + %store_fp6_sh(36) + %store_fp6(42) + // stack: g', f' + %load_fp6(12) + // stack: g , g', f' + %swap_fp6 + // stack: g', g , f' + %dup2_fp6 + // stack: g , g', g , f' + %add_fp6 + %swap_fp6 + // stack: g + g', g , f' + %swap_fp6 + // stack: g , g + g', f' + %load_fp6(0) + // stack: f, g , g'+ g , f' + %mul_fp6 + %store_fp6(48) + // stack: g'+ g , f' + %swap_fp6 + %load_fp6(0) + %add_fp6 + // stack: f'+ f, g'+ g + %mul_fp6 + // stack: (f+f')(g+g') + %load_fp6(42) + %bus_fp6(42) + // stack: (f+f')(g+g') - f'g' + %load_fp6(48) + %swap_fp6 + // stack: (f+f')(g+g') - f'g' , fg + %dup2_fp6 + %bus_fp6 + // stack: (f+f')(g+g') - f'g' - fg, fg + %store_fp6(30) + // stack: fg + %load_fp6(36) + // stack: sh(f'g') , fg + %add_fp6 + // stack: sh(f'g') + fg + %store_fp6(24) + JUMP diff --git a/evm/src/cpu/kernel/asm/fields/Fp6.asm b/evm/src/cpu/kernel/asm/fields/Fp6.asm index 41d854c7..0d67b38f 100644 --- a/evm/src/cpu/kernel/asm/fields/Fp6.asm +++ b/evm/src/cpu/kernel/asm/fields/Fp6.asm @@ -1,4 +1,165 @@ -Fp6: +// cost: 6 loads + 6 offsets + 5 adds = 6*4 + 6*1 + 5*2 = 40 +%macro load_fp6(offset) + // stack: + PUSH $offset + %add_const(5) + %mload_kernel_general + // stack: x5 + PUSH $offset + %add_const(4) + %mload_kernel_general + // stack: x4, x5 + PUSH $offset + %add_const(3) + %mload_kernel_general + // stack: x3, x4, x5 + PUSH $offset + %add_const(2) + %mload_kernel_general + // stack: x2, x3, x4, x5 + PUSH $offset + %add_const(1) + %mload_kernel_general + // stack: x1, x2, x3, x4, x5 + PUSH $offset + %mload_kernel_general + // stack: x0, x1, x2, x3, x4, x5 +%endmacro + +// cost: 40 +%macro store_fp6(offset) + // stack: x0, x1, x2, x3, x4, x5 + PUSH $offset + %mstore_kernel_general + // stack: x1, x2, x3, x4, x5 + PUSH $offset + %add_const(1) + %mstore_kernel_general + // stack: x2, x3, x4, x5 + PUSH $offset + %add_const(2) + %mstore_kernel_general + // stack: x3, x4, x5 + PUSH $offset + %add_const(3) + %mstore_kernel_general + // stack: x4, x5 + PUSH $offset + %add_const(4) + %mstore_kernel_general + // stack: x5 + PUSH $offset + %add_const(5) + %mstore_kernel_general + // stack: +%endmacro + +// cost: 6 +%macro dup1_fp6 + // stack: F: 6 + DUP6 + DUP6 + DUP6 + DUP6 + DUP6 + DUP6 + // stack: F: 6, F: 6 +%endmacro + +// cost: 6 +%macro dup2_fp6 + // stack: F: 6, G: 6 + DUP12 + DUP12 + DUP12 + DUP12 + DUP12 + DUP12 + // stack: G: 6, F: 6, G: 6 +%endmacro + +// cost: 16 +%macro swap_fp6 + // stack: f0, f1, f2, f3, f4, f5, g0, g1, g2, g3, g4, g5 + SWAP6 + // stack: g0, f1, f2, f3, f4, f5, f0, g1, g2, g3, g4, g5 + SWAP1 + SWAP7 + SWAP1 + // stack: g0, g1, f2, f3, f4, f5, f0, f1, g2, g3, g4, g5 + SWAP2 + SWAP8 + SWAP2 + // stack: g0, g1, g2, f3, f4, f5, f0, f1, f2, g3, g4, g5 + SWAP3 + SWAP9 + SWAP3 + // stack: g0, g1, g2, g3, f4, f5, f0, f1, f2, f3, g4, g5 + SWAP4 + SWAP10 + SWAP4 + // stack: g0, g1, g2, g3, g4, f5, f0, f1, f2, f3, f4, g5 + SWAP5 + SWAP11 + SWAP5 + // stack: g0, g1, g2, g3, g4, g5, f0, f1, f2, f3, f4, f5 +%endmacro + +// cost: 16 +%macro add_fp6 + // stack: f0, f1, f2, f3, f4, f5, g0, g1, g2, g3, g4, g5 + SWAP7 + ADD + SWAP6 + // stack: f0, f2, f3, f4, f5, g0, h1, g2, g3, g4, g5 + SWAP7 + ADD + SWAP6 + // stack: f0, f3, f4, f5, g0, h1, h2, g3, g4, g5 + SWAP7 + ADD + SWAP6 + // stack: f0, f4, f5, g0, h1, h2, h3, g4, g5 + SWAP7 + ADD + SWAP6 + // stack: f0, f5, g0, h1, h2, h3, h4, g5 + SWAP7 + ADD + SWAP6 + // stack: f0, g0, h1, h2, h3, h4, h5 + ADD + // stack: h0, h1, h2, h3, h4, h5 +%endmacro + +// *backwards order subtraction* cost: 16 +%macro bus_fp6 + // stack: f0, f1, f2, f3, f4, f5, g0, g1, g2, g3, g4, g5 + SWAP7 + SUB + SWAP6 + // stack: f0, f2, f3, f4, f5, g0, h1, g2, g3, g4, g5 + SWAP7 + SUB + SWAP6 + // stack: f0, f3, f4, f5, g0, h1, h2, g3, g4, g5 + SWAP7 + SUB + SWAP6 + // stack: f0, f4, f5, g0, h1, h2, h3, g4, g5 + SWAP7 + SUB + SWAP6 + // stack: f0, f5, g0, h1, h2, h3, h4, g5 + SWAP7 + SUB + SWAP6 + // stack: f0, g0, h1, h2, h3, h4, h5 + SUB + // stack: h0, h1, h2, h3, h4, h5 +%endmacro + +%macro mul_Fp6 DUP3 DUP11 MUL @@ -151,4 +312,5 @@ Fp6: SWAP2 MUL ADD - %mstore_kernel_general(5) \ No newline at end of file + %mstore_kernel_general(5) +%endmacro