@zkasm/zkevm-rom 0.0.1-security → 6.0.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.

Potentially problematic release.


This version of @zkasm/zkevm-rom might be problematic. Click here for more details.

Files changed (232) hide show
  1. package/.eslintrc.js +33 -0
  2. package/.github/CODEOWNERS +14 -0
  3. package/.github/ISSUE_TEMPLATE/bug.yml +38 -0
  4. package/.github/ISSUE_TEMPLATE/feature.yml +26 -0
  5. package/.github/ISSUE_TEMPLATE/question.yml +26 -0
  6. package/.github/workflows/main.yaml +40 -0
  7. package/LICENSE +636 -0
  8. package/README.md +23 -5
  9. package/audits/Hexens_Polygon_zkEVM_PUBLIC_27.02.23.pdf +0 -0
  10. package/audits/Polygon-zkEVM-Public-v1.1-verichains-19-03-2024.pdf +0 -0
  11. package/audits/zkEVM-ROM-upgrade-1-Spearbit-30-May.pdf +0 -0
  12. package/audits/zkEVM-ROM-upgrade-2-Spearbit-21-August.pdf +0 -0
  13. package/audits/zkEVM-engagement-1-Spearbit-27-March.pdf +0 -0
  14. package/audits/zkEVM-engagement-2-Spearbit-27-March.pdf +0 -0
  15. package/audits/zkEVM-engagement-3-Spearbit-6-April.pdf +0 -0
  16. package/counters/README.md +45 -0
  17. package/counters/counters-executor.js +80 -0
  18. package/counters/countersConstants.zkasm +370 -0
  19. package/counters/endIncludes.zkasm +18 -0
  20. package/counters/initIncludes.zkasm +2 -0
  21. package/counters/tests/MLOAD32.zkasm +27 -0
  22. package/counters/tests/MLOADX.zkasm +30 -0
  23. package/counters/tests/MSTORE32.zkasm +32 -0
  24. package/counters/tests/MSTOREX.zkasm +36 -0
  25. package/counters/tests/SHLarith.zkasm +28 -0
  26. package/counters/tests/SHLarithBit.zkasm +28 -0
  27. package/counters/tests/SHRarith.zkasm +28 -0
  28. package/counters/tests/SHRarithBit.zkasm +28 -0
  29. package/counters/tests/abs.zkasm +29 -0
  30. package/counters/tests/addBatchHashByteByByte.zkasm +31 -0
  31. package/counters/tests/computeGasSendCall.zkasm +30 -0
  32. package/counters/tests/divArith.zkasm +27 -0
  33. package/counters/tests/expAD.zkasm +30 -0
  34. package/counters/tests/getLenBits.zkasm +30 -0
  35. package/counters/tests/getLenBytes.zkasm +32 -0
  36. package/counters/tests/isEmptyAccount.zkasm +30 -0
  37. package/counters/tests/mulARITH.zkasm +28 -0
  38. package/counters/tests/offsetUtil.zkasm +29 -0
  39. package/counters/tests/opADDMOD.zkasm +28 -0
  40. package/counters/tests/opAdd.zkasm +27 -0
  41. package/counters/tests/opBLOCKHASH.zkasm +28 -0
  42. package/counters/tests/opCALL.zkasm +41 -0
  43. package/counters/tests/opCALLCODE.zkasm +41 -0
  44. package/counters/tests/opCALLDATACOPY.zkasm +28 -0
  45. package/counters/tests/opCALLDATALOAD.zkasm +27 -0
  46. package/counters/tests/opCODECOPY.zkasm +28 -0
  47. package/counters/tests/opCREATE.zkasm +35 -0
  48. package/counters/tests/opCREATE2.zkasm +35 -0
  49. package/counters/tests/opDELEGATECALL.zkasm +35 -0
  50. package/counters/tests/opDIV.zkasm +27 -0
  51. package/counters/tests/opEXP.zkasm +29 -0
  52. package/counters/tests/opEXTCODECOPY.zkasm +29 -0
  53. package/counters/tests/opMOD.zkasm +27 -0
  54. package/counters/tests/opMUL.zkasm +27 -0
  55. package/counters/tests/opMULMOD.zkasm +28 -0
  56. package/counters/tests/opRETURN.zkasm +32 -0
  57. package/counters/tests/opRETURNDATACOPY.zkasm +29 -0
  58. package/counters/tests/opREVERT.zkasm +32 -0
  59. package/counters/tests/opSDIV.zkasm +28 -0
  60. package/counters/tests/opSHA3.zkasm +28 -0
  61. package/counters/tests/opSIGNEXTEND.zkasm +27 -0
  62. package/counters/tests/opSMOD.zkasm +28 -0
  63. package/counters/tests/opSTATICCALL.zkasm +35 -0
  64. package/counters/tests/opSUB.zkasm +27 -0
  65. package/counters/tests/saveMem.zkasm +31 -0
  66. package/docs/opcode-cost-zk-counters.md +315 -0
  67. package/docs/usage-ecrecover.md +51 -0
  68. package/index.js +43 -0
  69. package/main/block-info.zkasm +204 -0
  70. package/main/constants.zkasm +145 -0
  71. package/main/ecrecover/addFpEc.zkasm +31 -0
  72. package/main/ecrecover/checkSqrtFpEc.zkasm +1558 -0
  73. package/main/ecrecover/constEc.zkasm +13 -0
  74. package/main/ecrecover/ecrecover.zkasm +280 -0
  75. package/main/ecrecover/invFnEc.zkasm +44 -0
  76. package/main/ecrecover/invFpEc.zkasm +45 -0
  77. package/main/ecrecover/mulFnEc.zkasm +36 -0
  78. package/main/ecrecover/mulFpEc.zkasm +36 -0
  79. package/main/ecrecover/mulPointEc.zkasm +311 -0
  80. package/main/ecrecover/sqFpEc.zkasm +38 -0
  81. package/main/ecrecover/sqrtFpEc.zkasm +70 -0
  82. package/main/end.zkasm +4 -0
  83. package/main/l2-tx-hash.zkasm +159 -0
  84. package/main/load-change-l2-block-utils.zkasm +11 -0
  85. package/main/load-change-l2-block.zkasm +28 -0
  86. package/main/load-tx-rlp-utils.zkasm +72 -0
  87. package/main/load-tx-rlp.zkasm +431 -0
  88. package/main/main.zkasm +237 -0
  89. package/main/map-opcodes.zkasm +274 -0
  90. package/main/modexp/array_lib/array_add_AGTB.zkasm +123 -0
  91. package/main/modexp/array_lib/array_add_short.zkasm +85 -0
  92. package/main/modexp/array_lib/array_div.zkasm +215 -0
  93. package/main/modexp/array_lib/array_div_long.zkasm +284 -0
  94. package/main/modexp/array_lib/array_div_short.zkasm +222 -0
  95. package/main/modexp/array_lib/array_mul.zkasm +97 -0
  96. package/main/modexp/array_lib/array_mul_long.zkasm +156 -0
  97. package/main/modexp/array_lib/array_mul_short.zkasm +127 -0
  98. package/main/modexp/array_lib/array_square.zkasm +246 -0
  99. package/main/modexp/array_lib/unused/array_add.zkasm +100 -0
  100. package/main/modexp/array_lib/unused/array_is_odd.zkasm +23 -0
  101. package/main/modexp/array_lib/unused/array_is_one.zkasm +33 -0
  102. package/main/modexp/array_lib/unused/array_is_zero.zkasm +34 -0
  103. package/main/modexp/array_lib/unused/array_sub_AGTB.zkasm +111 -0
  104. package/main/modexp/array_lib/unused/array_unshift.zkasm +37 -0
  105. package/main/modexp/array_lib/utils/array_compare.zkasm +82 -0
  106. package/main/modexp/array_lib/utils/array_trim.zkasm +49 -0
  107. package/main/modexp/constants.zkasm +5 -0
  108. package/main/modexp/modexp.zkasm +296 -0
  109. package/main/modexp/modexp_utils.zkasm +230 -0
  110. package/main/opcodes/arithmetic.zkasm +357 -0
  111. package/main/opcodes/block.zkasm +163 -0
  112. package/main/opcodes/calldata-returndata-code.zkasm +619 -0
  113. package/main/opcodes/comparison.zkasm +446 -0
  114. package/main/opcodes/context-information.zkasm +169 -0
  115. package/main/opcodes/create-terminate-context.zkasm +1011 -0
  116. package/main/opcodes/crypto.zkasm +96 -0
  117. package/main/opcodes/flow-control.zkasm +126 -0
  118. package/main/opcodes/logs.zkasm +193 -0
  119. package/main/opcodes/stack-operations.zkasm +658 -0
  120. package/main/opcodes/storage-memory.zkasm +313 -0
  121. package/main/pairings/BN254/addPointBN254.zkasm +245 -0
  122. package/main/pairings/BN254/ecAdd.zkasm +312 -0
  123. package/main/pairings/BN254/ecMul.zkasm +159 -0
  124. package/main/pairings/BN254/escalarMulBN254.zkasm +155 -0
  125. package/main/pairings/BN254/lineDiffPointsBN254.zkasm +83 -0
  126. package/main/pairings/BN254/lineSamePointsBN254.zkasm +96 -0
  127. package/main/pairings/FP12BN254/CYCLOFP12BN254/compressFp12BN254.zkasm +49 -0
  128. package/main/pairings/FP12BN254/CYCLOFP12BN254/decompressFp12BN254.zkasm +236 -0
  129. package/main/pairings/FP12BN254/CYCLOFP12BN254/expByXCompCycloFp12BN254.zkasm +444 -0
  130. package/main/pairings/FP12BN254/CYCLOFP12BN254/squareCompCycloFp12BN254.zkasm +212 -0
  131. package/main/pairings/FP12BN254/CYCLOFP12BN254/squareCycloFp12BN254.zkasm +228 -0
  132. package/main/pairings/FP12BN254/CYCLOFP12BN254/xBinDecompBN254.zkasm +64 -0
  133. package/main/pairings/FP12BN254/frob2Fp12BN254.zkasm +80 -0
  134. package/main/pairings/FP12BN254/frob3Fp12BN254.zkasm +96 -0
  135. package/main/pairings/FP12BN254/frobFp12BN254.zkasm +96 -0
  136. package/main/pairings/FP12BN254/inverseFp12BN254.zkasm +289 -0
  137. package/main/pairings/FP12BN254/mulFp12BN254.zkasm +408 -0
  138. package/main/pairings/FP12BN254/sparseMulAFp12BN254.zkasm +296 -0
  139. package/main/pairings/FP12BN254/sparseMulBFp12BN254.zkasm +291 -0
  140. package/main/pairings/FP12BN254/squareFp12BN254.zkasm +376 -0
  141. package/main/pairings/FP2BN254/addFp2BN254.zkasm +19 -0
  142. package/main/pairings/FP2BN254/escalarMulFp2BN254.zkasm +20 -0
  143. package/main/pairings/FP2BN254/invFp2BN254.zkasm +66 -0
  144. package/main/pairings/FP2BN254/mulFp2BN254.zkasm +19 -0
  145. package/main/pairings/FP2BN254/squareFp2BN254.zkasm +21 -0
  146. package/main/pairings/FP2BN254/subFp2BN254.zkasm +19 -0
  147. package/main/pairings/FP4BN254/squareFp4BN254.zkasm +76 -0
  148. package/main/pairings/FP6BN254/addFp6BN254.zkasm +59 -0
  149. package/main/pairings/FP6BN254/escalarMulFp6BN254.zkasm +51 -0
  150. package/main/pairings/FP6BN254/inverseFp6BN254.zkasm +208 -0
  151. package/main/pairings/FP6BN254/mulFp6BN254.zkasm +201 -0
  152. package/main/pairings/FP6BN254/sparseMulAFp6BN254.zkasm +65 -0
  153. package/main/pairings/FP6BN254/sparseMulBFp6BN254.zkasm +134 -0
  154. package/main/pairings/FP6BN254/sparseMulCFp6BN254.zkasm +128 -0
  155. package/main/pairings/FP6BN254/squareFp6BN254.zkasm +147 -0
  156. package/main/pairings/FP6BN254/subFp6BN254.zkasm +59 -0
  157. package/main/pairings/FPBN254/addFpBN254.zkasm +29 -0
  158. package/main/pairings/FPBN254/invFpBN254.zkasm +55 -0
  159. package/main/pairings/FPBN254/mulFpBN254.zkasm +29 -0
  160. package/main/pairings/FPBN254/reduceFpBN254.zkasm +25 -0
  161. package/main/pairings/FPBN254/squareFpBN254.zkasm +31 -0
  162. package/main/pairings/FPBN254/subFpBN254.zkasm +36 -0
  163. package/main/pairings/FRBN254/reduceFrBN254.zkasm +25 -0
  164. package/main/pairings/constants.zkasm +62 -0
  165. package/main/pairings/ecPairing.zkasm +244 -0
  166. package/main/pairings/finalExpBN254.zkasm +2095 -0
  167. package/main/pairings/halfPairingBN254.zkasm +428 -0
  168. package/main/pairings/loopLengthBN254.zkasm +75 -0
  169. package/main/pairings/millerLoopBN254.zkasm +741 -0
  170. package/main/pairings/pairingBN254.zkasm +481 -0
  171. package/main/pairings/unused/addFp12BN254.zkasm +130 -0
  172. package/main/pairings/unused/expByXCycloFp12BN254.zkasm +411 -0
  173. package/main/pairings/unused/expFp12BN254.zkasm +333 -0
  174. package/main/pairings/unused/subFp12BN254.zkasm +130 -0
  175. package/main/pairings/unused/xPseudoBinDecompBN254.zkasm +68 -0
  176. package/main/pairings/utilsTests/expCycloFp12BN254.zkasm +334 -0
  177. package/main/precompiled/end.zkasm +42 -0
  178. package/main/precompiled/identity.zkasm +99 -0
  179. package/main/precompiled/pre-ecAdd.zkasm +84 -0
  180. package/main/precompiled/pre-ecMul.zkasm +82 -0
  181. package/main/precompiled/pre-ecPairing.zkasm +72 -0
  182. package/main/precompiled/pre-ecrecover.zkasm +71 -0
  183. package/main/precompiled/pre-modexp.zkasm +367 -0
  184. package/main/precompiled/pre-sha2-256.zkasm +125 -0
  185. package/main/precompiled/revert-precompiled.zkasm +25 -0
  186. package/main/precompiled/selector.zkasm +77 -0
  187. package/main/process-change-l2-block.zkasm +147 -0
  188. package/main/process-tx.zkasm +587 -0
  189. package/main/tables/2-exp.zkasm +260 -0
  190. package/main/touched.zkasm +118 -0
  191. package/main/utils.zkasm +2335 -0
  192. package/main/vars.zkasm +117 -0
  193. package/package.json +62 -3
  194. package/test/bytes-length.zkasm +39 -0
  195. package/test/ecrecover.zkasm +538 -0
  196. package/test/lt4-test.zkasm +38 -0
  197. package/test/mstorex.zkasm +191 -0
  198. package/test/opcalldatacopy.ignore.zkasm +331 -0
  199. package/test/performance/read-push.zkasm +71 -0
  200. package/test/read-push.zkasm +304 -0
  201. package/test/testArrayArith.zkasm +1099 -0
  202. package/test/testArrayUtils.zkasm +335 -0
  203. package/test/testCycloFp12ArithBN254.zkasm +548 -0
  204. package/test/testEcAdd.zkasm +252 -0
  205. package/test/testEcMul.zkasm +231 -0
  206. package/test/testEcPairing.zkasm +436 -0
  207. package/test/testFinalExpBn254.zkasm +139 -0
  208. package/test/testFp12ArithBN254.zkasm +692 -0
  209. package/test/testFp2ArithBN254.zkasm +185 -0
  210. package/test/testFp4ArithBN254.zkasm +128 -0
  211. package/test/testFp6ArithBN254.zkasm +260 -0
  212. package/test/testFpArithBN254.zkasm +159 -0
  213. package/test/testFrArithBN254.zkasm +113 -0
  214. package/test/testHalfPairingBN254.zkasm +285 -0
  215. package/test/testModExp.zkasm +586 -0
  216. package/test/testModExpReturn.zkasm +81 -0
  217. package/test/testPairingBN254.zkasm +463 -0
  218. package/test/testPointArithBN254.zkasm +270 -0
  219. package/test/testSHA256.zkasm +27 -0
  220. package/test/touched-assert.zkasm +59 -0
  221. package/test/utils-expAD.zkasm +48 -0
  222. package/test/utils-getLenBytes.zkasm +36 -0
  223. package/tools/audit-tools/registry-op-checker.js +71 -0
  224. package/tools/get-not-used-labels.js +31 -0
  225. package/tools/helpers/helpers.js +47 -0
  226. package/tools/modexp-utils/README.md +5 -0
  227. package/tools/modexp-utils/modexp-test-gen.js +168 -0
  228. package/tools/modexp-utils/modexp-test-int.sage +37 -0
  229. package/tools/parallel-testing/checker.sh +6 -0
  230. package/tools/parallel-testing/gen-parallel-tests.js +78 -0
  231. package/tools/parallel-testing/parallel-tests-sample/sample.test.js +136 -0
  232. package/tools/run-tests-zkasm.js +83 -0
@@ -0,0 +1,296 @@
1
+ ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
2
+ ;; POST: The result is in the range [0,BN254_P) because if falls back to FP6 arithmetic
3
+ ;;
4
+ ;; sparseMulAFp12BN254:
5
+ ;; in: (a1 + a2·w),(b1 + b2·w) ∈ Fp12, where ai ∈ Fp6, b1 = b12·v and b2 = b22·v + b23·v², with b12,b22,b23 ∈ Fp2
6
+ ;; out: (a1 + a2·w)·(b1 + b2·w) = (c1 + c2·w) ∈ Fp12, where:
7
+ ;; - c1 = a1·b1 + a2·b2·v
8
+ ;; - c2 = (a1+a2)·[(b12+b22)·v + b23·v²] - a1·b1 - a2·b2
9
+ ;;
10
+ ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
11
+
12
+ VAR GLOBAL sparseMulAFp12BN254_a11_x
13
+ VAR GLOBAL sparseMulAFp12BN254_a11_y
14
+ VAR GLOBAL sparseMulAFp12BN254_a12_x
15
+ VAR GLOBAL sparseMulAFp12BN254_a12_y
16
+ VAR GLOBAL sparseMulAFp12BN254_a13_x
17
+ VAR GLOBAL sparseMulAFp12BN254_a13_y
18
+ VAR GLOBAL sparseMulAFp12BN254_a21_x
19
+ VAR GLOBAL sparseMulAFp12BN254_a21_y
20
+ VAR GLOBAL sparseMulAFp12BN254_a22_x
21
+ VAR GLOBAL sparseMulAFp12BN254_a22_y
22
+ VAR GLOBAL sparseMulAFp12BN254_a23_x
23
+ VAR GLOBAL sparseMulAFp12BN254_a23_y
24
+
25
+ VAR GLOBAL sparseMulAFp12BN254_b12_x
26
+ VAR GLOBAL sparseMulAFp12BN254_b12_y
27
+ VAR GLOBAL sparseMulAFp12BN254_b22_x
28
+ VAR GLOBAL sparseMulAFp12BN254_b22_y
29
+ VAR GLOBAL sparseMulAFp12BN254_b23_x
30
+ VAR GLOBAL sparseMulAFp12BN254_b23_y
31
+
32
+ VAR GLOBAL sparseMulAFp12BN254_c11_x
33
+ VAR GLOBAL sparseMulAFp12BN254_c11_y
34
+ VAR GLOBAL sparseMulAFp12BN254_c12_x
35
+ VAR GLOBAL sparseMulAFp12BN254_c12_y
36
+ VAR GLOBAL sparseMulAFp12BN254_c13_x
37
+ VAR GLOBAL sparseMulAFp12BN254_c13_y
38
+ VAR GLOBAL sparseMulAFp12BN254_c21_x
39
+ VAR GLOBAL sparseMulAFp12BN254_c21_y
40
+ VAR GLOBAL sparseMulAFp12BN254_c22_x
41
+ VAR GLOBAL sparseMulAFp12BN254_c22_y
42
+ VAR GLOBAL sparseMulAFp12BN254_c23_x
43
+ VAR GLOBAL sparseMulAFp12BN254_c23_y
44
+
45
+ VAR GLOBAL sparseMulAFp12BN254_a1b1mul1_x
46
+ VAR GLOBAL sparseMulAFp12BN254_a1b1mul1_y
47
+ VAR GLOBAL sparseMulAFp12BN254_a1b1mul2_x
48
+ VAR GLOBAL sparseMulAFp12BN254_a1b1mul2_y
49
+ VAR GLOBAL sparseMulAFp12BN254_a1b1mul3_x
50
+ VAR GLOBAL sparseMulAFp12BN254_a1b1mul3_y
51
+ VAR GLOBAL sparseMulAFp12BN254_a2b2mul1_x
52
+ VAR GLOBAL sparseMulAFp12BN254_a2b2mul1_y
53
+ VAR GLOBAL sparseMulAFp12BN254_a2b2mul2_x
54
+ VAR GLOBAL sparseMulAFp12BN254_a2b2mul2_y
55
+ VAR GLOBAL sparseMulAFp12BN254_a2b2mul3_x
56
+ VAR GLOBAL sparseMulAFp12BN254_a2b2mul3_y
57
+
58
+ VAR GLOBAL sparseMulAFp12BN254_aux2_x
59
+ VAR GLOBAL sparseMulAFp12BN254_aux2_y
60
+
61
+ VAR GLOBAL sparseMulAFp12BN254_RR
62
+
63
+ sparseMulAFp12BN254:
64
+ RR :MSTORE(sparseMulAFp12BN254_RR)
65
+
66
+ ; 1] a1·b1, a2·b2
67
+ $ => A :MLOAD(sparseMulAFp12BN254_a11_x)
68
+ $ => B :MLOAD(sparseMulAFp12BN254_a11_y)
69
+ A :MSTORE(sparseMulAFp6BN254_a1_x)
70
+ B :MSTORE(sparseMulAFp6BN254_a1_y)
71
+ $ => A :MLOAD(sparseMulAFp12BN254_a12_x)
72
+ $ => B :MLOAD(sparseMulAFp12BN254_a12_y)
73
+ A :MSTORE(sparseMulAFp6BN254_a2_x)
74
+ B :MSTORE(sparseMulAFp6BN254_a2_y)
75
+ $ => A :MLOAD(sparseMulAFp12BN254_a13_x)
76
+ $ => B :MLOAD(sparseMulAFp12BN254_a13_y)
77
+ A :MSTORE(sparseMulAFp6BN254_a3_x)
78
+ B :MSTORE(sparseMulAFp6BN254_a3_y)
79
+ $ => A :MLOAD(sparseMulAFp12BN254_b12_x)
80
+ $ => B :MLOAD(sparseMulAFp12BN254_b12_y)
81
+ A :MSTORE(sparseMulAFp6BN254_b2_x)
82
+ B :MSTORE(sparseMulAFp6BN254_b2_y), CALL(sparseMulAFp6BN254)
83
+ $ => A :MLOAD(sparseMulAFp6BN254_c1_x)
84
+ $ => B :MLOAD(sparseMulAFp6BN254_c1_y)
85
+ A :MSTORE(sparseMulAFp12BN254_a1b1mul1_x)
86
+ B :MSTORE(sparseMulAFp12BN254_a1b1mul1_y)
87
+ $ => A :MLOAD(sparseMulAFp6BN254_c2_x)
88
+ $ => B :MLOAD(sparseMulAFp6BN254_c2_y)
89
+ A :MSTORE(sparseMulAFp12BN254_a1b1mul2_x)
90
+ B :MSTORE(sparseMulAFp12BN254_a1b1mul2_y)
91
+ $ => A :MLOAD(sparseMulAFp6BN254_c3_x)
92
+ $ => B :MLOAD(sparseMulAFp6BN254_c3_y)
93
+ A :MSTORE(sparseMulAFp12BN254_a1b1mul3_x)
94
+ B :MSTORE(sparseMulAFp12BN254_a1b1mul3_y)
95
+
96
+ $ => A :MLOAD(sparseMulAFp12BN254_a21_x)
97
+ $ => B :MLOAD(sparseMulAFp12BN254_a21_y)
98
+ A :MSTORE(sparseMulBFp6BN254_a1_x)
99
+ B :MSTORE(sparseMulBFp6BN254_a1_y)
100
+ $ => A :MLOAD(sparseMulAFp12BN254_a22_x)
101
+ $ => B :MLOAD(sparseMulAFp12BN254_a22_y)
102
+ A :MSTORE(sparseMulBFp6BN254_a2_x)
103
+ B :MSTORE(sparseMulBFp6BN254_a2_y)
104
+ $ => A :MLOAD(sparseMulAFp12BN254_a23_x)
105
+ $ => B :MLOAD(sparseMulAFp12BN254_a23_y)
106
+ A :MSTORE(sparseMulBFp6BN254_a3_x)
107
+ B :MSTORE(sparseMulBFp6BN254_a3_y)
108
+ $ => A :MLOAD(sparseMulAFp12BN254_b22_x)
109
+ $ => B :MLOAD(sparseMulAFp12BN254_b22_y)
110
+ A :MSTORE(sparseMulBFp6BN254_b2_x)
111
+ B :MSTORE(sparseMulBFp6BN254_b2_y)
112
+ $ => A :MLOAD(sparseMulAFp12BN254_b23_x)
113
+ $ => B :MLOAD(sparseMulAFp12BN254_b23_y)
114
+ A :MSTORE(sparseMulBFp6BN254_b3_x)
115
+ B :MSTORE(sparseMulBFp6BN254_b3_y), CALL(sparseMulBFp6BN254)
116
+ $ => A :MLOAD(sparseMulBFp6BN254_c1_x)
117
+ $ => B :MLOAD(sparseMulBFp6BN254_c1_y)
118
+ A :MSTORE(sparseMulAFp12BN254_a2b2mul1_x)
119
+ B :MSTORE(sparseMulAFp12BN254_a2b2mul1_y)
120
+ $ => A :MLOAD(sparseMulBFp6BN254_c2_x)
121
+ $ => B :MLOAD(sparseMulBFp6BN254_c2_y)
122
+ A :MSTORE(sparseMulAFp12BN254_a2b2mul2_x)
123
+ B :MSTORE(sparseMulAFp12BN254_a2b2mul2_y)
124
+ $ => A :MLOAD(sparseMulBFp6BN254_c3_x)
125
+ $ => B :MLOAD(sparseMulBFp6BN254_c3_y)
126
+ A :MSTORE(sparseMulAFp12BN254_a2b2mul3_x)
127
+ B :MSTORE(sparseMulAFp12BN254_a2b2mul3_y)
128
+
129
+ ; 2] c1 = a1·b1 + a2·b2·v
130
+ $ => A :MLOAD(sparseMulAFp12BN254_a2b2mul1_x)
131
+ $ => B :MLOAD(sparseMulAFp12BN254_a2b2mul1_y)
132
+ A :MSTORE(sparseMulAFp6BN254_a1_x)
133
+ B :MSTORE(sparseMulAFp6BN254_a1_y)
134
+ $ => A :MLOAD(sparseMulAFp12BN254_a2b2mul2_x)
135
+ $ => B :MLOAD(sparseMulAFp12BN254_a2b2mul2_y)
136
+ A :MSTORE(sparseMulAFp6BN254_a2_x)
137
+ B :MSTORE(sparseMulAFp6BN254_a2_y)
138
+ $ => A :MLOAD(sparseMulAFp12BN254_a2b2mul3_x)
139
+ $ => B :MLOAD(sparseMulAFp12BN254_a2b2mul3_y)
140
+ A :MSTORE(sparseMulAFp6BN254_a3_x)
141
+ B :MSTORE(sparseMulAFp6BN254_a3_y)
142
+ 1n :MSTORE(sparseMulAFp6BN254_b2_x)
143
+ 0n :MSTORE(sparseMulAFp6BN254_b2_y), CALL(sparseMulAFp6BN254)
144
+ $ => A :MLOAD(sparseMulAFp6BN254_c1_x)
145
+ $ => B :MLOAD(sparseMulAFp6BN254_c1_y)
146
+ A :MSTORE(addFp6BN254_a1_x)
147
+ B :MSTORE(addFp6BN254_a1_y)
148
+ $ => A :MLOAD(sparseMulAFp6BN254_c2_x)
149
+ $ => B :MLOAD(sparseMulAFp6BN254_c2_y)
150
+ A :MSTORE(addFp6BN254_a2_x)
151
+ B :MSTORE(addFp6BN254_a2_y)
152
+ $ => A :MLOAD(sparseMulAFp6BN254_c3_x)
153
+ $ => B :MLOAD(sparseMulAFp6BN254_c3_y)
154
+ A :MSTORE(addFp6BN254_a3_x)
155
+ B :MSTORE(addFp6BN254_a3_y)
156
+ $ => A :MLOAD(sparseMulAFp12BN254_a1b1mul1_x)
157
+ $ => B :MLOAD(sparseMulAFp12BN254_a1b1mul1_y)
158
+ A :MSTORE(addFp6BN254_b1_x)
159
+ B :MSTORE(addFp6BN254_b1_y)
160
+ $ => A :MLOAD(sparseMulAFp12BN254_a1b1mul2_x)
161
+ $ => B :MLOAD(sparseMulAFp12BN254_a1b1mul2_y)
162
+ A :MSTORE(addFp6BN254_b2_x)
163
+ B :MSTORE(addFp6BN254_b2_y)
164
+ $ => A :MLOAD(sparseMulAFp12BN254_a1b1mul3_x)
165
+ $ => B :MLOAD(sparseMulAFp12BN254_a1b1mul3_y)
166
+ A :MSTORE(addFp6BN254_b3_x)
167
+ B :MSTORE(addFp6BN254_b3_y), CALL(addFp6BN254)
168
+ $ => A :MLOAD(addFp6BN254_c1_x)
169
+ $ => B :MLOAD(addFp6BN254_c1_y)
170
+ A :MSTORE(sparseMulAFp12BN254_c11_x)
171
+ B :MSTORE(sparseMulAFp12BN254_c11_y)
172
+ $ => A :MLOAD(addFp6BN254_c2_x)
173
+ $ => B :MLOAD(addFp6BN254_c2_y)
174
+ A :MSTORE(sparseMulAFp12BN254_c12_x)
175
+ B :MSTORE(sparseMulAFp12BN254_c12_y)
176
+ $ => A :MLOAD(addFp6BN254_c3_x)
177
+ $ => B :MLOAD(addFp6BN254_c3_y)
178
+ A :MSTORE(sparseMulAFp12BN254_c13_x)
179
+ B :MSTORE(sparseMulAFp12BN254_c13_y)
180
+
181
+ ; 3] aux = (b12+b22)·v + b23·v²
182
+ $ => A :MLOAD(sparseMulAFp12BN254_b12_x)
183
+ $ => B :MLOAD(sparseMulAFp12BN254_b12_y)
184
+ $ => C :MLOAD(sparseMulAFp12BN254_b22_x)
185
+ $ => D :MLOAD(sparseMulAFp12BN254_b22_y), CALL(addFp2BN254)
186
+ E :MSTORE(sparseMulAFp12BN254_aux2_x)
187
+ C :MSTORE(sparseMulAFp12BN254_aux2_y)
188
+
189
+ ; 4] c2 = (a1+a2)·aux - a1·b1 - a2·b2
190
+ $ => A :MLOAD(sparseMulAFp12BN254_a11_x)
191
+ $ => B :MLOAD(sparseMulAFp12BN254_a11_y)
192
+ A :MSTORE(addFp6BN254_a1_x)
193
+ B :MSTORE(addFp6BN254_a1_y)
194
+ $ => A :MLOAD(sparseMulAFp12BN254_a12_x)
195
+ $ => B :MLOAD(sparseMulAFp12BN254_a12_y)
196
+ A :MSTORE(addFp6BN254_a2_x)
197
+ B :MSTORE(addFp6BN254_a2_y)
198
+ $ => A :MLOAD(sparseMulAFp12BN254_a13_x)
199
+ $ => B :MLOAD(sparseMulAFp12BN254_a13_y)
200
+ A :MSTORE(addFp6BN254_a3_x)
201
+ B :MSTORE(addFp6BN254_a3_y)
202
+ $ => A :MLOAD(sparseMulAFp12BN254_a21_x)
203
+ $ => B :MLOAD(sparseMulAFp12BN254_a21_y)
204
+ A :MSTORE(addFp6BN254_b1_x)
205
+ B :MSTORE(addFp6BN254_b1_y)
206
+ $ => A :MLOAD(sparseMulAFp12BN254_a22_x)
207
+ $ => B :MLOAD(sparseMulAFp12BN254_a22_y)
208
+ A :MSTORE(addFp6BN254_b2_x)
209
+ B :MSTORE(addFp6BN254_b2_y)
210
+ $ => A :MLOAD(sparseMulAFp12BN254_a23_x)
211
+ $ => B :MLOAD(sparseMulAFp12BN254_a23_y)
212
+ A :MSTORE(addFp6BN254_b3_x)
213
+ B :MSTORE(addFp6BN254_b3_y), CALL(addFp6BN254)
214
+ $ => A :MLOAD(addFp6BN254_c1_x)
215
+ $ => B :MLOAD(addFp6BN254_c1_y)
216
+ A :MSTORE(sparseMulBFp6BN254_a1_x)
217
+ B :MSTORE(sparseMulBFp6BN254_a1_y)
218
+ $ => A :MLOAD(addFp6BN254_c2_x)
219
+ $ => B :MLOAD(addFp6BN254_c2_y)
220
+ A :MSTORE(sparseMulBFp6BN254_a2_x)
221
+ B :MSTORE(sparseMulBFp6BN254_a2_y)
222
+ $ => A :MLOAD(addFp6BN254_c3_x)
223
+ $ => B :MLOAD(addFp6BN254_c3_y)
224
+ A :MSTORE(sparseMulBFp6BN254_a3_x)
225
+ B :MSTORE(sparseMulBFp6BN254_a3_y)
226
+ $ => A :MLOAD(sparseMulAFp12BN254_aux2_x)
227
+ $ => B :MLOAD(sparseMulAFp12BN254_aux2_y)
228
+ A :MSTORE(sparseMulBFp6BN254_b2_x)
229
+ B :MSTORE(sparseMulBFp6BN254_b2_y)
230
+ $ => A :MLOAD(sparseMulAFp12BN254_b23_x)
231
+ $ => B :MLOAD(sparseMulAFp12BN254_b23_y)
232
+ A :MSTORE(sparseMulBFp6BN254_b3_x)
233
+ B :MSTORE(sparseMulBFp6BN254_b3_y), CALL(sparseMulBFp6BN254)
234
+ $ => A :MLOAD(sparseMulBFp6BN254_c1_x)
235
+ $ => B :MLOAD(sparseMulBFp6BN254_c1_y)
236
+ A :MSTORE(subFp6BN254_a1_x)
237
+ B :MSTORE(subFp6BN254_a1_y)
238
+ $ => A :MLOAD(sparseMulBFp6BN254_c2_x)
239
+ $ => B :MLOAD(sparseMulBFp6BN254_c2_y)
240
+ A :MSTORE(subFp6BN254_a2_x)
241
+ B :MSTORE(subFp6BN254_a2_y)
242
+ $ => A :MLOAD(sparseMulBFp6BN254_c3_x)
243
+ $ => B :MLOAD(sparseMulBFp6BN254_c3_y)
244
+ A :MSTORE(subFp6BN254_a3_x)
245
+ B :MSTORE(subFp6BN254_a3_y)
246
+ $ => A :MLOAD(sparseMulAFp12BN254_a1b1mul1_x)
247
+ $ => B :MLOAD(sparseMulAFp12BN254_a1b1mul1_y)
248
+ A :MSTORE(subFp6BN254_b1_x)
249
+ B :MSTORE(subFp6BN254_b1_y)
250
+ $ => A :MLOAD(sparseMulAFp12BN254_a1b1mul2_x)
251
+ $ => B :MLOAD(sparseMulAFp12BN254_a1b1mul2_y)
252
+ A :MSTORE(subFp6BN254_b2_x)
253
+ B :MSTORE(subFp6BN254_b2_y)
254
+ $ => A :MLOAD(sparseMulAFp12BN254_a1b1mul3_x)
255
+ $ => B :MLOAD(sparseMulAFp12BN254_a1b1mul3_y)
256
+ A :MSTORE(subFp6BN254_b3_x)
257
+ B :MSTORE(subFp6BN254_b3_y), CALL(subFp6BN254)
258
+ $ => A :MLOAD(subFp6BN254_c1_x)
259
+ $ => B :MLOAD(subFp6BN254_c1_y)
260
+ A :MSTORE(subFp6BN254_a1_x)
261
+ B :MSTORE(subFp6BN254_a1_y)
262
+ $ => A :MLOAD(subFp6BN254_c2_x)
263
+ $ => B :MLOAD(subFp6BN254_c2_y)
264
+ A :MSTORE(subFp6BN254_a2_x)
265
+ B :MSTORE(subFp6BN254_a2_y)
266
+ $ => A :MLOAD(subFp6BN254_c3_x)
267
+ $ => B :MLOAD(subFp6BN254_c3_y)
268
+ A :MSTORE(subFp6BN254_a3_x)
269
+ B :MSTORE(subFp6BN254_a3_y)
270
+ $ => A :MLOAD(sparseMulAFp12BN254_a2b2mul1_x)
271
+ $ => B :MLOAD(sparseMulAFp12BN254_a2b2mul1_y)
272
+ A :MSTORE(subFp6BN254_b1_x)
273
+ B :MSTORE(subFp6BN254_b1_y)
274
+ $ => A :MLOAD(sparseMulAFp12BN254_a2b2mul2_x)
275
+ $ => B :MLOAD(sparseMulAFp12BN254_a2b2mul2_y)
276
+ A :MSTORE(subFp6BN254_b2_x)
277
+ B :MSTORE(subFp6BN254_b2_y)
278
+ $ => A :MLOAD(sparseMulAFp12BN254_a2b2mul3_x)
279
+ $ => B :MLOAD(sparseMulAFp12BN254_a2b2mul3_y)
280
+ A :MSTORE(subFp6BN254_b3_x)
281
+ B :MSTORE(subFp6BN254_b3_y), CALL(subFp6BN254)
282
+ $ => A :MLOAD(subFp6BN254_c1_x)
283
+ $ => B :MLOAD(subFp6BN254_c1_y)
284
+ A :MSTORE(sparseMulAFp12BN254_c21_x)
285
+ B :MSTORE(sparseMulAFp12BN254_c21_y)
286
+ $ => A :MLOAD(subFp6BN254_c2_x)
287
+ $ => B :MLOAD(subFp6BN254_c2_y)
288
+ A :MSTORE(sparseMulAFp12BN254_c22_x)
289
+ B :MSTORE(sparseMulAFp12BN254_c22_y)
290
+ $ => A :MLOAD(subFp6BN254_c3_x)
291
+ $ => B :MLOAD(subFp6BN254_c3_y)
292
+ A :MSTORE(sparseMulAFp12BN254_c23_x)
293
+ B :MSTORE(sparseMulAFp12BN254_c23_y)
294
+
295
+ $ => RR :MLOAD(sparseMulAFp12BN254_RR)
296
+ :RETURN
@@ -0,0 +1,291 @@
1
+ ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
2
+ ;; POST: The result is in the range [0,BN254_P) because if falls back to FP6 arithmetic
3
+ ;;
4
+ ;; sparseMulBFp12BN254:
5
+ ;; in: (a1 + a2·w),(b1 + b2·w) ∈ Fp12, where ai ∈ Fp6, b1 = b11 + b13·v² and b2 = b22·v, with b11,b13,b22 ∈ Fp2
6
+ ;; out: (a1 + a2·w)·(b1 + b2·w) = (c1 + c2·w) ∈ Fp12, where:
7
+ ;; - c1 = a1·b1 + a2·b2·v
8
+ ;; - c2 = (a1+a2)·(b11 + b22·v + b13·v²) - a1·b1 - a2·b2
9
+ ;;
10
+ ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
11
+
12
+ VAR GLOBAL sparseMulBFp12BN254_a11_x
13
+ VAR GLOBAL sparseMulBFp12BN254_a11_y
14
+ VAR GLOBAL sparseMulBFp12BN254_a12_x
15
+ VAR GLOBAL sparseMulBFp12BN254_a12_y
16
+ VAR GLOBAL sparseMulBFp12BN254_a13_x
17
+ VAR GLOBAL sparseMulBFp12BN254_a13_y
18
+ VAR GLOBAL sparseMulBFp12BN254_a21_x
19
+ VAR GLOBAL sparseMulBFp12BN254_a21_y
20
+ VAR GLOBAL sparseMulBFp12BN254_a22_x
21
+ VAR GLOBAL sparseMulBFp12BN254_a22_y
22
+ VAR GLOBAL sparseMulBFp12BN254_a23_x
23
+ VAR GLOBAL sparseMulBFp12BN254_a23_y
24
+
25
+ VAR GLOBAL sparseMulBFp12BN254_b11_x
26
+ VAR GLOBAL sparseMulBFp12BN254_b11_y
27
+ VAR GLOBAL sparseMulBFp12BN254_b13_x
28
+ VAR GLOBAL sparseMulBFp12BN254_b13_y
29
+ VAR GLOBAL sparseMulBFp12BN254_b22_x
30
+ VAR GLOBAL sparseMulBFp12BN254_b22_y
31
+
32
+ VAR GLOBAL sparseMulBFp12BN254_c11_x
33
+ VAR GLOBAL sparseMulBFp12BN254_c11_y
34
+ VAR GLOBAL sparseMulBFp12BN254_c12_x
35
+ VAR GLOBAL sparseMulBFp12BN254_c12_y
36
+ VAR GLOBAL sparseMulBFp12BN254_c13_x
37
+ VAR GLOBAL sparseMulBFp12BN254_c13_y
38
+ VAR GLOBAL sparseMulBFp12BN254_c21_x
39
+ VAR GLOBAL sparseMulBFp12BN254_c21_y
40
+ VAR GLOBAL sparseMulBFp12BN254_c22_x
41
+ VAR GLOBAL sparseMulBFp12BN254_c22_y
42
+ VAR GLOBAL sparseMulBFp12BN254_c23_x
43
+ VAR GLOBAL sparseMulBFp12BN254_c23_y
44
+
45
+ VAR GLOBAL sparseMulBFp12BN254_a1b1mul1_x
46
+ VAR GLOBAL sparseMulBFp12BN254_a1b1mul1_y
47
+ VAR GLOBAL sparseMulBFp12BN254_a1b1mul2_x
48
+ VAR GLOBAL sparseMulBFp12BN254_a1b1mul2_y
49
+ VAR GLOBAL sparseMulBFp12BN254_a1b1mul3_x
50
+ VAR GLOBAL sparseMulBFp12BN254_a1b1mul3_y
51
+ VAR GLOBAL sparseMulBFp12BN254_a2b2mul1_x
52
+ VAR GLOBAL sparseMulBFp12BN254_a2b2mul1_y
53
+ VAR GLOBAL sparseMulBFp12BN254_a2b2mul2_x
54
+ VAR GLOBAL sparseMulBFp12BN254_a2b2mul2_y
55
+ VAR GLOBAL sparseMulBFp12BN254_a2b2mul3_x
56
+ VAR GLOBAL sparseMulBFp12BN254_a2b2mul3_y
57
+
58
+ VAR GLOBAL sparseMulBFp12BN254_RR
59
+
60
+ sparseMulBFp12BN254:
61
+ RR :MSTORE(sparseMulBFp12BN254_RR)
62
+
63
+ ; 1] a1·b1, a2·b2
64
+ $ => A :MLOAD(sparseMulBFp12BN254_a11_x)
65
+ $ => B :MLOAD(sparseMulBFp12BN254_a11_y)
66
+ A :MSTORE(sparseMulCFp6BN254_a1_x)
67
+ B :MSTORE(sparseMulCFp6BN254_a1_y)
68
+ $ => A :MLOAD(sparseMulBFp12BN254_a12_x)
69
+ $ => B :MLOAD(sparseMulBFp12BN254_a12_y)
70
+ A :MSTORE(sparseMulCFp6BN254_a2_x)
71
+ B :MSTORE(sparseMulCFp6BN254_a2_y)
72
+ $ => A :MLOAD(sparseMulBFp12BN254_a13_x)
73
+ $ => B :MLOAD(sparseMulBFp12BN254_a13_y)
74
+ A :MSTORE(sparseMulCFp6BN254_a3_x)
75
+ B :MSTORE(sparseMulCFp6BN254_a3_y)
76
+ $ => A :MLOAD(sparseMulBFp12BN254_b11_x)
77
+ $ => B :MLOAD(sparseMulBFp12BN254_b11_y)
78
+ A :MSTORE(sparseMulCFp6BN254_b1_x)
79
+ B :MSTORE(sparseMulCFp6BN254_b1_y)
80
+ $ => A :MLOAD(sparseMulBFp12BN254_b13_x)
81
+ $ => B :MLOAD(sparseMulBFp12BN254_b13_y)
82
+ A :MSTORE(sparseMulCFp6BN254_b3_x)
83
+ B :MSTORE(sparseMulCFp6BN254_b3_y), CALL(sparseMulCFp6BN254)
84
+ $ => A :MLOAD(sparseMulCFp6BN254_c1_x)
85
+ $ => B :MLOAD(sparseMulCFp6BN254_c1_y)
86
+ A :MSTORE(sparseMulBFp12BN254_a1b1mul1_x)
87
+ B :MSTORE(sparseMulBFp12BN254_a1b1mul1_y)
88
+ $ => A :MLOAD(sparseMulCFp6BN254_c2_x)
89
+ $ => B :MLOAD(sparseMulCFp6BN254_c2_y)
90
+ A :MSTORE(sparseMulBFp12BN254_a1b1mul2_x)
91
+ B :MSTORE(sparseMulBFp12BN254_a1b1mul2_y)
92
+ $ => A :MLOAD(sparseMulCFp6BN254_c3_x)
93
+ $ => B :MLOAD(sparseMulCFp6BN254_c3_y)
94
+ A :MSTORE(sparseMulBFp12BN254_a1b1mul3_x)
95
+ B :MSTORE(sparseMulBFp12BN254_a1b1mul3_y)
96
+
97
+ $ => A :MLOAD(sparseMulBFp12BN254_a21_x)
98
+ $ => B :MLOAD(sparseMulBFp12BN254_a21_y)
99
+ A :MSTORE(sparseMulAFp6BN254_a1_x)
100
+ B :MSTORE(sparseMulAFp6BN254_a1_y)
101
+ $ => A :MLOAD(sparseMulBFp12BN254_a22_x)
102
+ $ => B :MLOAD(sparseMulBFp12BN254_a22_y)
103
+ A :MSTORE(sparseMulAFp6BN254_a2_x)
104
+ B :MSTORE(sparseMulAFp6BN254_a2_y)
105
+ $ => A :MLOAD(sparseMulBFp12BN254_a23_x)
106
+ $ => B :MLOAD(sparseMulBFp12BN254_a23_y)
107
+ A :MSTORE(sparseMulAFp6BN254_a3_x)
108
+ B :MSTORE(sparseMulAFp6BN254_a3_y)
109
+ $ => A :MLOAD(sparseMulBFp12BN254_b22_x)
110
+ $ => B :MLOAD(sparseMulBFp12BN254_b22_y)
111
+ A :MSTORE(sparseMulAFp6BN254_b2_x)
112
+ B :MSTORE(sparseMulAFp6BN254_b2_y), CALL(sparseMulAFp6BN254)
113
+ $ => A :MLOAD(sparseMulAFp6BN254_c1_x)
114
+ $ => B :MLOAD(sparseMulAFp6BN254_c1_y)
115
+ A :MSTORE(sparseMulBFp12BN254_a2b2mul1_x)
116
+ B :MSTORE(sparseMulBFp12BN254_a2b2mul1_y)
117
+ $ => A :MLOAD(sparseMulAFp6BN254_c2_x)
118
+ $ => B :MLOAD(sparseMulAFp6BN254_c2_y)
119
+ A :MSTORE(sparseMulBFp12BN254_a2b2mul2_x)
120
+ B :MSTORE(sparseMulBFp12BN254_a2b2mul2_y)
121
+ $ => A :MLOAD(sparseMulAFp6BN254_c3_x)
122
+ $ => B :MLOAD(sparseMulAFp6BN254_c3_y)
123
+ A :MSTORE(sparseMulBFp12BN254_a2b2mul3_x)
124
+ B :MSTORE(sparseMulBFp12BN254_a2b2mul3_y)
125
+
126
+ ; 2] c1 = a1·b1 + a2·b2·v
127
+ $ => A :MLOAD(sparseMulBFp12BN254_a2b2mul1_x)
128
+ $ => B :MLOAD(sparseMulBFp12BN254_a2b2mul1_y)
129
+ A :MSTORE(sparseMulAFp6BN254_a1_x)
130
+ B :MSTORE(sparseMulAFp6BN254_a1_y)
131
+ $ => A :MLOAD(sparseMulBFp12BN254_a2b2mul2_x)
132
+ $ => B :MLOAD(sparseMulBFp12BN254_a2b2mul2_y)
133
+ A :MSTORE(sparseMulAFp6BN254_a2_x)
134
+ B :MSTORE(sparseMulAFp6BN254_a2_y)
135
+ $ => A :MLOAD(sparseMulBFp12BN254_a2b2mul3_x)
136
+ $ => B :MLOAD(sparseMulBFp12BN254_a2b2mul3_y)
137
+ A :MSTORE(sparseMulAFp6BN254_a3_x)
138
+ B :MSTORE(sparseMulAFp6BN254_a3_y)
139
+ 1n :MSTORE(sparseMulAFp6BN254_b2_x)
140
+ 0n :MSTORE(sparseMulAFp6BN254_b2_y), CALL(sparseMulAFp6BN254)
141
+ $ => A :MLOAD(sparseMulAFp6BN254_c1_x)
142
+ $ => B :MLOAD(sparseMulAFp6BN254_c1_y)
143
+ A :MSTORE(addFp6BN254_a1_x)
144
+ B :MSTORE(addFp6BN254_a1_y)
145
+ $ => A :MLOAD(sparseMulAFp6BN254_c2_x)
146
+ $ => B :MLOAD(sparseMulAFp6BN254_c2_y)
147
+ A :MSTORE(addFp6BN254_a2_x)
148
+ B :MSTORE(addFp6BN254_a2_y)
149
+ $ => A :MLOAD(sparseMulAFp6BN254_c3_x)
150
+ $ => B :MLOAD(sparseMulAFp6BN254_c3_y)
151
+ A :MSTORE(addFp6BN254_a3_x)
152
+ B :MSTORE(addFp6BN254_a3_y)
153
+ $ => A :MLOAD(sparseMulBFp12BN254_a1b1mul1_x)
154
+ $ => B :MLOAD(sparseMulBFp12BN254_a1b1mul1_y)
155
+ A :MSTORE(addFp6BN254_b1_x)
156
+ B :MSTORE(addFp6BN254_b1_y)
157
+ $ => A :MLOAD(sparseMulBFp12BN254_a1b1mul2_x)
158
+ $ => B :MLOAD(sparseMulBFp12BN254_a1b1mul2_y)
159
+ A :MSTORE(addFp6BN254_b2_x)
160
+ B :MSTORE(addFp6BN254_b2_y)
161
+ $ => A :MLOAD(sparseMulBFp12BN254_a1b1mul3_x)
162
+ $ => B :MLOAD(sparseMulBFp12BN254_a1b1mul3_y)
163
+ A :MSTORE(addFp6BN254_b3_x)
164
+ B :MSTORE(addFp6BN254_b3_y), CALL(addFp6BN254)
165
+ $ => A :MLOAD(addFp6BN254_c1_x)
166
+ $ => B :MLOAD(addFp6BN254_c1_y)
167
+ A :MSTORE(sparseMulBFp12BN254_c11_x)
168
+ B :MSTORE(sparseMulBFp12BN254_c11_y)
169
+ $ => A :MLOAD(addFp6BN254_c2_x)
170
+ $ => B :MLOAD(addFp6BN254_c2_y)
171
+ A :MSTORE(sparseMulBFp12BN254_c12_x)
172
+ B :MSTORE(sparseMulBFp12BN254_c12_y)
173
+ $ => A :MLOAD(addFp6BN254_c3_x)
174
+ $ => B :MLOAD(addFp6BN254_c3_y)
175
+ A :MSTORE(sparseMulBFp12BN254_c13_x)
176
+ B :MSTORE(sparseMulBFp12BN254_c13_y)
177
+
178
+ ; aux = b11 + b22·v + b13·v²
179
+
180
+ ; 3] c2 = (a1+a2)·aux - a1·b1 - a2·b2
181
+ $ => A :MLOAD(sparseMulBFp12BN254_a11_x)
182
+ $ => B :MLOAD(sparseMulBFp12BN254_a11_y)
183
+ A :MSTORE(addFp6BN254_a1_x)
184
+ B :MSTORE(addFp6BN254_a1_y)
185
+ $ => A :MLOAD(sparseMulBFp12BN254_a12_x)
186
+ $ => B :MLOAD(sparseMulBFp12BN254_a12_y)
187
+ A :MSTORE(addFp6BN254_a2_x)
188
+ B :MSTORE(addFp6BN254_a2_y)
189
+ $ => A :MLOAD(sparseMulBFp12BN254_a13_x)
190
+ $ => B :MLOAD(sparseMulBFp12BN254_a13_y)
191
+ A :MSTORE(addFp6BN254_a3_x)
192
+ B :MSTORE(addFp6BN254_a3_y)
193
+ $ => A :MLOAD(sparseMulBFp12BN254_a21_x)
194
+ $ => B :MLOAD(sparseMulBFp12BN254_a21_y)
195
+ A :MSTORE(addFp6BN254_b1_x)
196
+ B :MSTORE(addFp6BN254_b1_y)
197
+ $ => A :MLOAD(sparseMulBFp12BN254_a22_x)
198
+ $ => B :MLOAD(sparseMulBFp12BN254_a22_y)
199
+ A :MSTORE(addFp6BN254_b2_x)
200
+ B :MSTORE(addFp6BN254_b2_y)
201
+ $ => A :MLOAD(sparseMulBFp12BN254_a23_x)
202
+ $ => B :MLOAD(sparseMulBFp12BN254_a23_y)
203
+ A :MSTORE(addFp6BN254_b3_x)
204
+ B :MSTORE(addFp6BN254_b3_y), CALL(addFp6BN254)
205
+ $ => A :MLOAD(addFp6BN254_c1_x)
206
+ $ => B :MLOAD(addFp6BN254_c1_y)
207
+ A :MSTORE(mulFp6BN254_a1_x)
208
+ B :MSTORE(mulFp6BN254_a1_y)
209
+ $ => A :MLOAD(addFp6BN254_c2_x)
210
+ $ => B :MLOAD(addFp6BN254_c2_y)
211
+ A :MSTORE(mulFp6BN254_a2_x)
212
+ B :MSTORE(mulFp6BN254_a2_y)
213
+ $ => A :MLOAD(addFp6BN254_c3_x)
214
+ $ => B :MLOAD(addFp6BN254_c3_y)
215
+ A :MSTORE(mulFp6BN254_a3_x)
216
+ B :MSTORE(mulFp6BN254_a3_y)
217
+ $ => A :MLOAD(sparseMulBFp12BN254_b11_x)
218
+ $ => B :MLOAD(sparseMulBFp12BN254_b11_y)
219
+ A :MSTORE(mulFp6BN254_b1_x)
220
+ B :MSTORE(mulFp6BN254_b1_y)
221
+ $ => A :MLOAD(sparseMulBFp12BN254_b22_x)
222
+ $ => B :MLOAD(sparseMulBFp12BN254_b22_y)
223
+ A :MSTORE(mulFp6BN254_b2_x)
224
+ B :MSTORE(mulFp6BN254_b2_y)
225
+ $ => A :MLOAD(sparseMulBFp12BN254_b13_x)
226
+ $ => B :MLOAD(sparseMulBFp12BN254_b13_y)
227
+ A :MSTORE(mulFp6BN254_b3_x)
228
+ B :MSTORE(mulFp6BN254_b3_y), CALL(mulFp6BN254)
229
+ $ => A :MLOAD(mulFp6BN254_c1_x)
230
+ $ => B :MLOAD(mulFp6BN254_c1_y)
231
+ A :MSTORE(subFp6BN254_a1_x)
232
+ B :MSTORE(subFp6BN254_a1_y)
233
+ $ => A :MLOAD(mulFp6BN254_c2_x)
234
+ $ => B :MLOAD(mulFp6BN254_c2_y)
235
+ A :MSTORE(subFp6BN254_a2_x)
236
+ B :MSTORE(subFp6BN254_a2_y)
237
+ $ => A :MLOAD(mulFp6BN254_c3_x)
238
+ $ => B :MLOAD(mulFp6BN254_c3_y)
239
+ A :MSTORE(subFp6BN254_a3_x)
240
+ B :MSTORE(subFp6BN254_a3_y)
241
+ $ => A :MLOAD(sparseMulBFp12BN254_a1b1mul1_x)
242
+ $ => B :MLOAD(sparseMulBFp12BN254_a1b1mul1_y)
243
+ A :MSTORE(subFp6BN254_b1_x)
244
+ B :MSTORE(subFp6BN254_b1_y)
245
+ $ => A :MLOAD(sparseMulBFp12BN254_a1b1mul2_x)
246
+ $ => B :MLOAD(sparseMulBFp12BN254_a1b1mul2_y)
247
+ A :MSTORE(subFp6BN254_b2_x)
248
+ B :MSTORE(subFp6BN254_b2_y)
249
+ $ => A :MLOAD(sparseMulBFp12BN254_a1b1mul3_x)
250
+ $ => B :MLOAD(sparseMulBFp12BN254_a1b1mul3_y)
251
+ A :MSTORE(subFp6BN254_b3_x)
252
+ B :MSTORE(subFp6BN254_b3_y), CALL(subFp6BN254)
253
+ $ => A :MLOAD(subFp6BN254_c1_x)
254
+ $ => B :MLOAD(subFp6BN254_c1_y)
255
+ A :MSTORE(subFp6BN254_a1_x)
256
+ B :MSTORE(subFp6BN254_a1_y)
257
+ $ => A :MLOAD(subFp6BN254_c2_x)
258
+ $ => B :MLOAD(subFp6BN254_c2_y)
259
+ A :MSTORE(subFp6BN254_a2_x)
260
+ B :MSTORE(subFp6BN254_a2_y)
261
+ $ => A :MLOAD(subFp6BN254_c3_x)
262
+ $ => B :MLOAD(subFp6BN254_c3_y)
263
+ A :MSTORE(subFp6BN254_a3_x)
264
+ B :MSTORE(subFp6BN254_a3_y)
265
+ $ => A :MLOAD(sparseMulBFp12BN254_a2b2mul1_x)
266
+ $ => B :MLOAD(sparseMulBFp12BN254_a2b2mul1_y)
267
+ A :MSTORE(subFp6BN254_b1_x)
268
+ B :MSTORE(subFp6BN254_b1_y)
269
+ $ => A :MLOAD(sparseMulBFp12BN254_a2b2mul2_x)
270
+ $ => B :MLOAD(sparseMulBFp12BN254_a2b2mul2_y)
271
+ A :MSTORE(subFp6BN254_b2_x)
272
+ B :MSTORE(subFp6BN254_b2_y)
273
+ $ => A :MLOAD(sparseMulBFp12BN254_a2b2mul3_x)
274
+ $ => B :MLOAD(sparseMulBFp12BN254_a2b2mul3_y)
275
+ A :MSTORE(subFp6BN254_b3_x)
276
+ B :MSTORE(subFp6BN254_b3_y), CALL(subFp6BN254)
277
+ $ => A :MLOAD(subFp6BN254_c1_x)
278
+ $ => B :MLOAD(subFp6BN254_c1_y)
279
+ A :MSTORE(sparseMulBFp12BN254_c21_x)
280
+ B :MSTORE(sparseMulBFp12BN254_c21_y)
281
+ $ => A :MLOAD(subFp6BN254_c2_x)
282
+ $ => B :MLOAD(subFp6BN254_c2_y)
283
+ A :MSTORE(sparseMulBFp12BN254_c22_x)
284
+ B :MSTORE(sparseMulBFp12BN254_c22_y)
285
+ $ => A :MLOAD(subFp6BN254_c3_x)
286
+ $ => B :MLOAD(subFp6BN254_c3_y)
287
+ A :MSTORE(sparseMulBFp12BN254_c23_x)
288
+ B :MSTORE(sparseMulBFp12BN254_c23_y)
289
+
290
+ $ => RR :MLOAD(sparseMulBFp12BN254_RR)
291
+ :RETURN