Skip to content

Instantly share code, notes, and snippets.

@poemm

poemm/README.md Secret

Last active September 25, 2020 04:51
Show Gist options
  • Save poemm/bf50b9c8f18c33c0883461ede3a4ae8a to your computer and use it in GitHub Desktop.
Save poemm/bf50b9c8f18c33c0883461ede3a4ae8a to your computer and use it in GitHub Desktop.

Files

f6m_mul_v2.huff	        huff source code using interface v2.
f6m_mul_v4.huff	        huff source code using interface v4.
f6m_mul_v6.huff         huff source code using interface v6.
f6m_mul_v7.huff         huff source code using interface v7.

f6m_mul_v2.json         Ethereum test file with v2 test bytecode under the field "code".
f6m_mul_v4.json	        Ethereum test file with v4 test bytecode under the field "code".
f6m_mul_v6.json         Ethereum test file with v6 test bytecode under the field "code".
f6m_mul_v7.json         Ethereum test file with v7 test bytecode under the field "code".

f6m_mul_v2_bench.json   Ethereum test file with v2 benchmark bytecode under the field "code".
f6m_mul_v4_bench.json   Ethereum test file with v4 benchmark bytecode under the field "code".
f6m_mul_v6_bench.json   Ethereum test file with v6 benchmark bytecode under the field "code".
f6m_mul_v7_bench.json   Ethereum test file with v7 benchmark bytecode under the field "code".

compile.js              Compiler interface to huff.
huff.patch              Patch to tell huff how to handle evm384 opcodes.

Compile

get this directory

git clone https://gist.github.com/bf50b9c8f18c33c0883461ede3a4ae8a.git f6m_mul_huff
cd f6m_mul_huff

get huff, note: put huff inside the directory f6m_mul_huff because the path to huff is hardcoded in compile.js

git clone https://github.com/AztecProtocol/huff.git

patch huff with new opcodes

#diff -ruN huff huff_modified > huff.patch
patch -s -p0 < huff.patch

get dependencies listed in huff/package.json, (don't worry, everything is local to the created dir node_modules/, can just delete this dir)

cd huff
npm install	# note: npm caches packages in /home/<user>/.npm. To remove cache: npm cache clean
cd ..

finally generate the f6m_mul evm bytecode

node compile.js
const path = require('path');
const fs = require('fs');
const { compiler } = require('./huff/src');
const parser = require('./huff/src/parser');
const pathToData = path.posix.resolve(__dirname, './');
// uncomment a one file and one macro name below
//const { inputMap, macros, jumptables } = parser.parseFile('f6m_mul_v2.huff', pathToData);
//const { inputMap, macros, jumptables } = parser.parseFile('f6m_mul_v4.huff', pathToData);
//const { inputMap, macros, jumptables } = parser.parseFile('f6m_mul_v6.huff', pathToData);
//const { inputMap, macros, jumptables } = parser.parseFile('f6m_mul_v7.huff', pathToData);
const { inputMap, macros, jumptables } = parser.parseFile('f6m_mul_v8.huff', pathToData);
const {
data: { bytecode: macroCode },
} = parser.processMacro('F6M_MUL_TEST_HARDCODED', 0, [], macros, inputMap, jumptables);
//} = parser.processMacro('F6M_MUL_BENCH', 0, [], macros, inputMap, jumptables);
console.log("0x"+macroCode)
// TODO optmizations
// inline F2M_ADD, F2M_SUB, and MUL_NR2
// this is a dummy macro which lets me evaluate arithmetic at compile-time
template<val>
#define macro EVAL_ARITHMETIC = takes(0) returns(1) {
<val>
}
// these are various hard-coded memory offsets which we use for various buffers
#define macro NUM_BYTES = takes(0) returns(1) {
48
}
#define macro F6M_MUL_OUT = takes(0) returns(1) { // 6 values
0
}
#define macro F2M_MUL_BUFFER = takes(0) returns(1) { // 4 values
300
}
#define macro F6M_MUL_R_BUFFER = takes(0) returns(1) { // 6 values, but we have 8 values, first two zeros
500
}
#define macro F6M_MUL_BUFFER_AA_BB_CC = takes(0) returns(1) { // 6 values
900
}
#define macro F6_ABC0 = takes(0) returns(1) { // 6 values
1200
}
#define macro F6_ABC = takes(0) returns(1) { // 6 values
1500
}
#define macro MOD_OFFSET = takes(0) returns(1) { // 1.5 values
1800
}
// next we have various macros for f2m and f6m arithmetic, including multiplication.
#define macro MUL_NR2 = takes(5) returns(0) {
// inputs: &x0, &x1, &out0, &out1, &modulus
// outputs: out0,out1 := x0-x1, x0+x1
dup5 // mod
dup3 // x1
dup3 // x0
dup6 // out0
submod384
dup5 // mod
dup3 // x1
dup3 // x0
dup7 // out1
addmod384
pop
pop
pop
pop
pop
}
#define macro F2M_ADD = takes(7) returns(0) {
// &x0, &x1, &y0, &y1, &out0, &out1, &mod
// outputs: out0,out1 := x0+y0, x1+y1
dup7 // mod
dup4 // y0
dup3 // x0
dup8 // out0
addmod384
dup7 // mod
dup5 // y1
dup4 // x1
dup9 // out1
addmod384
pop
pop
pop
pop
pop
pop
pop
}
#define macro F2M_SUB = takes(7) returns(0) {
// inputs: &x0, &x1, &y0, &y1, &out0, &out1, &modulus
// outputs: out0,out1 := x0-y0, x1-y1
dup7 // mod
dup4 // y0
dup3 // x0
dup8 // out0
submod384
dup7 // mod
dup5 // y1
dup4 // x1
dup9 // out1
submod384
pop
pop
pop
pop
pop
pop
pop
}
#define macro F2M_MUL = takes(4) returns(0) {
// input stack shoud be:
// &x0 &x1 &y0 &y1 &out0 &out1 &mod inv
// where &out is top of stack, and x is the 48-byte value at memory location &x
// Will use memory offsets for temporary values
// F2M_MUL_BUFFER()+NUM_BYTES*0 // &zero <- we assume this is always zero for NUM_BYTES bytes
// F2M_MUL_BUFFER()+NUM_BYTES*1 // &tmp1
// F2M_MUL_BUFFER()+NUM_BYTES*2 // &tmp2
// F2M_MUL_BUFFER()+NUM_BYTES*3 // &tmp3
// &tmp1 = x0*y0
dup8 // inv
dup8 // &mod
dup5 // &y0
dup4 // &x0
EVAL_ARITHMETIC<F2M_MUL_BUFFER+NUM_BYTES*1>() // &tmp1
mulmodmont384
// &tmp2 = x1*y1
dup8 // inv
dup8 // &mod
dup6 // &y1
dup5 // &x1
EVAL_ARITHMETIC<F2M_MUL_BUFFER+NUM_BYTES*2>() // &tmp2
mulmodmont384
// &tmp3 = 0-&tmp2
dup7 // &mod
EVAL_ARITHMETIC<F2M_MUL_BUFFER+NUM_BYTES*2>() // &tmp2
EVAL_ARITHMETIC<F2M_MUL_BUFFER+NUM_BYTES*0>() // &zero
EVAL_ARITHMETIC<F2M_MUL_BUFFER+NUM_BYTES*3>() // &tmp3
submod384
// &out0 = &tmp1 + &tmp3
dup7 // &mod
EVAL_ARITHMETIC<F2M_MUL_BUFFER+NUM_BYTES*3>() // &tmp3
EVAL_ARITHMETIC<F2M_MUL_BUFFER+NUM_BYTES*1>() // &tmp1
dup8 // &out0
addmod384
// &tmp1 = &tmp1 + &tmp2
dup7 // &mod
EVAL_ARITHMETIC<F2M_MUL_BUFFER+NUM_BYTES*2>() // &tmp2
EVAL_ARITHMETIC<F2M_MUL_BUFFER+NUM_BYTES*1>() // &tmp1
EVAL_ARITHMETIC<F2M_MUL_BUFFER+NUM_BYTES*1>() // &tmp1
addmod384
// recall, stack looks like:
// &x0 &x1 &y0 &y1 &out0 &out1 &mod inv
// &tmp2 = &x0 + &x1
dup7 // &mod
dup3 // &x1
dup3 // &x0
EVAL_ARITHMETIC<F2M_MUL_BUFFER+NUM_BYTES*2>() // &tmp2
addmod384
// &tmp3 = &y0 + &y1
dup7 // &mod
dup5 // &y1
dup5 // &y0
EVAL_ARITHMETIC<F2M_MUL_BUFFER+NUM_BYTES*3>() // &tmp3
addmod384
// &tmp2 = &tmp2 * &tmp3
dup8 // inv
dup8 // &mod
EVAL_ARITHMETIC<F2M_MUL_BUFFER+NUM_BYTES*3>() // &tmp3
EVAL_ARITHMETIC<F2M_MUL_BUFFER+NUM_BYTES*2>() // &tmp2
EVAL_ARITHMETIC<F2M_MUL_BUFFER+NUM_BYTES*2>() // &tmp2
mulmodmont384
// &out1 = &tmp2 - &tmp1
dup7 // &mod
EVAL_ARITHMETIC<F2M_MUL_BUFFER+NUM_BYTES*1>() // &tmp1
EVAL_ARITHMETIC<F2M_MUL_BUFFER+NUM_BYTES*2>() // &tmp2
dup9 // &out1
submod384
// clear stack
pop
pop
pop
pop
pop
pop
pop
pop
}
#define macro F6M_MUL_r2 = takes(0) returns(0) {
// stack will remain: &a0 &a1 &b0 &b1 &c0 &c1 &A0 &A1 &B0 &B1 &C0 &C1 &mod inv &r
// output: r2 := ((a + c) * (A + C) - (a * A + c * C)) + bB
// tmp1 := a + c
dup13 // &mod
EVAL_ARITHMETIC<F6M_MUL_R_BUFFER+NUM_BYTES*2*1+1*NUM_BYTES>() // &tmp11
EVAL_ARITHMETIC<F6M_MUL_R_BUFFER+NUM_BYTES*2*1+0*NUM_BYTES>() // &tmp10
dup9 // &c1
dup9 // &c0
dup7 // &a1
dup7 // &a0
F2M_ADD()
// tmp2 := A + C
dup13 // &mod
EVAL_ARITHMETIC<F6M_MUL_R_BUFFER+NUM_BYTES*2*2+1*NUM_BYTES>() // &tmp21
EVAL_ARITHMETIC<F6M_MUL_R_BUFFER+NUM_BYTES*2*2+0*NUM_BYTES>() // &tmp20
dup15 // &C1
dup15 // &C0
dup13 // &A1
dup13 // &A0
F2M_ADD()
// tmp3 := tmp1 * tmp2
dup14 // inv
dup14 // &mod
EVAL_ARITHMETIC<F6M_MUL_R_BUFFER+NUM_BYTES*2*3+1*NUM_BYTES>() // &tmp31
EVAL_ARITHMETIC<F6M_MUL_R_BUFFER+NUM_BYTES*2*3+0*NUM_BYTES>() // &tmp30
EVAL_ARITHMETIC<F6M_MUL_R_BUFFER+NUM_BYTES*2*2+1*NUM_BYTES>() // &tmp21
EVAL_ARITHMETIC<F6M_MUL_R_BUFFER+NUM_BYTES*2*2+0*NUM_BYTES>() // &tmp20
EVAL_ARITHMETIC<F6M_MUL_R_BUFFER+NUM_BYTES*2*1+1*NUM_BYTES>() // &tmp11
EVAL_ARITHMETIC<F6M_MUL_R_BUFFER+NUM_BYTES*2*1+0*NUM_BYTES>() // &tmp10
F2M_MUL()
// tmp1 := aA + cC
dup13 // &mod
EVAL_ARITHMETIC<F6M_MUL_R_BUFFER+NUM_BYTES*2*1+1*NUM_BYTES>() // &tmp11
EVAL_ARITHMETIC<F6M_MUL_R_BUFFER+NUM_BYTES*2*1+0*NUM_BYTES>() // &tmp10
EVAL_ARITHMETIC<F6M_MUL_BUFFER_AA_BB_CC+NUM_BYTES*2*0+1*NUM_BYTES>() // &aA1
EVAL_ARITHMETIC<F6M_MUL_BUFFER_AA_BB_CC+NUM_BYTES*2*0+0*NUM_BYTES>() // &aA0
EVAL_ARITHMETIC<F6M_MUL_BUFFER_AA_BB_CC+NUM_BYTES*2*2+1*NUM_BYTES>() // &cC1
EVAL_ARITHMETIC<F6M_MUL_BUFFER_AA_BB_CC+NUM_BYTES*2*2+0*NUM_BYTES>() // &cC0
F2M_ADD()
// tmp2 := tmp3 - tmp1
dup13 // &mod
EVAL_ARITHMETIC<F6M_MUL_R_BUFFER+NUM_BYTES*2*2+1*NUM_BYTES>() // &tmp21
EVAL_ARITHMETIC<F6M_MUL_R_BUFFER+NUM_BYTES*2*2+0*NUM_BYTES>() // &tmp20
EVAL_ARITHMETIC<F6M_MUL_R_BUFFER+NUM_BYTES*2*1+1*NUM_BYTES>() // &tmp11
EVAL_ARITHMETIC<F6M_MUL_R_BUFFER+NUM_BYTES*2*1+0*NUM_BYTES>() // &tmp10
EVAL_ARITHMETIC<F6M_MUL_R_BUFFER+NUM_BYTES*2*3+1*NUM_BYTES>() // &tmp31
EVAL_ARITHMETIC<F6M_MUL_R_BUFFER+NUM_BYTES*2*3+0*NUM_BYTES>() // &tmp30
F2M_SUB()
// r_2 := bB + tmp2
dup13 // &mod
dup16 EVAL_ARITHMETIC<NUM_BYTES*2*2+1*NUM_BYTES>() add // &r21
NUM_BYTES() dup2 sub // &r20 (=&r21-NUM_BYTES)
EVAL_ARITHMETIC<F6M_MUL_R_BUFFER+NUM_BYTES*2*2+1*NUM_BYTES>() // &tmp21
EVAL_ARITHMETIC<F6M_MUL_R_BUFFER+NUM_BYTES*2*2+0*NUM_BYTES>() // &tmp20
EVAL_ARITHMETIC<F6M_MUL_BUFFER_AA_BB_CC+NUM_BYTES*2*1+1*NUM_BYTES>() // &bB1
EVAL_ARITHMETIC<F6M_MUL_BUFFER_AA_BB_CC+NUM_BYTES*2*1+0*NUM_BYTES>() // &bB0
F2M_ADD()
}
#define macro F6M_MUL_r1 = takes(0) returns(0) {
// stack will remain: &a0 &a1 &b0 &b1 &c0 &c1 &A0 &A1 &B0 &B1 &C0 &C1 &mod inv &r
// output: r1 := ((a+b * A+B) - aA+bB) + mulNonResidue(cC)
// tmp1 := a + b
dup13 // &mod
EVAL_ARITHMETIC<F6M_MUL_R_BUFFER+NUM_BYTES*2*1+1*NUM_BYTES>() // &tmp11
EVAL_ARITHMETIC<F6M_MUL_R_BUFFER+NUM_BYTES*2*1+0*NUM_BYTES>() // &tmp10
dup7 // &b1
dup7 // &b0
dup7 // &a1
dup7 // &a0
F2M_ADD()
// tmp2 := A + B
dup13 // &mod
EVAL_ARITHMETIC<F6M_MUL_R_BUFFER+NUM_BYTES*2*2+1*NUM_BYTES>() // &tmp21
EVAL_ARITHMETIC<F6M_MUL_R_BUFFER+NUM_BYTES*2*2+0*NUM_BYTES>() // &tmp20
dup13 // &B1
dup13 // &B0
dup13 // &A1
dup13 // &A0
F2M_ADD()
// tmp3 := tmp1 * tmp2
dup14 // inv
dup14 // &mod
EVAL_ARITHMETIC<F6M_MUL_R_BUFFER+NUM_BYTES*2*3+1*NUM_BYTES>() // &tmp31
EVAL_ARITHMETIC<F6M_MUL_R_BUFFER+NUM_BYTES*2*3+0*NUM_BYTES>() // &tmp30
EVAL_ARITHMETIC<F6M_MUL_R_BUFFER+NUM_BYTES*2*2+1*NUM_BYTES>() // &tmp21
EVAL_ARITHMETIC<F6M_MUL_R_BUFFER+NUM_BYTES*2*2+0*NUM_BYTES>() // &tmp20
EVAL_ARITHMETIC<F6M_MUL_R_BUFFER+NUM_BYTES*2*1+1*NUM_BYTES>() // &tmp11
EVAL_ARITHMETIC<F6M_MUL_R_BUFFER+NUM_BYTES*2*1+0*NUM_BYTES>() // &tmp10
F2M_MUL()
// tmp1 := aA + bB
dup13 // &mod
EVAL_ARITHMETIC<F6M_MUL_R_BUFFER+NUM_BYTES*2*1+1*NUM_BYTES>() // &tmp11
EVAL_ARITHMETIC<F6M_MUL_R_BUFFER+NUM_BYTES*2*1+0*NUM_BYTES>() // &tmp10
EVAL_ARITHMETIC<F6M_MUL_BUFFER_AA_BB_CC+NUM_BYTES*2*1+1*NUM_BYTES>() // &bB1
EVAL_ARITHMETIC<F6M_MUL_BUFFER_AA_BB_CC+NUM_BYTES*2*1+0*NUM_BYTES>() // &bB0
EVAL_ARITHMETIC<F6M_MUL_BUFFER_AA_BB_CC+NUM_BYTES*2*0+1*NUM_BYTES>() // &aA1
EVAL_ARITHMETIC<F6M_MUL_BUFFER_AA_BB_CC+NUM_BYTES*2*0+0*NUM_BYTES>() // &aA0
F2M_ADD()
// tmp2 := tmp3 - tmp1
dup13 // &mod
EVAL_ARITHMETIC<F6M_MUL_R_BUFFER+NUM_BYTES*2*2+1*NUM_BYTES>() // &tmp21
EVAL_ARITHMETIC<F6M_MUL_R_BUFFER+NUM_BYTES*2*2+0*NUM_BYTES>() // &tmp20
EVAL_ARITHMETIC<F6M_MUL_R_BUFFER+NUM_BYTES*2*1+1*NUM_BYTES>() // &tmp11
EVAL_ARITHMETIC<F6M_MUL_R_BUFFER+NUM_BYTES*2*1+0*NUM_BYTES>() // &tmp10
EVAL_ARITHMETIC<F6M_MUL_R_BUFFER+NUM_BYTES*2*3+1*NUM_BYTES>() // &tmp31
EVAL_ARITHMETIC<F6M_MUL_R_BUFFER+NUM_BYTES*2*3+0*NUM_BYTES>() // &tmp30
F2M_SUB()
// tmp1 := mulNonResidue(cC)
dup13 // &mod
EVAL_ARITHMETIC<F6M_MUL_R_BUFFER+NUM_BYTES*2*1+1*NUM_BYTES>() // &tmp11
EVAL_ARITHMETIC<F6M_MUL_R_BUFFER+NUM_BYTES*2*1+0*NUM_BYTES>() // &tmp10
EVAL_ARITHMETIC<F6M_MUL_BUFFER_AA_BB_CC+NUM_BYTES*2*2+1*NUM_BYTES>() // &cC1
EVAL_ARITHMETIC<F6M_MUL_BUFFER_AA_BB_CC+NUM_BYTES*2*2+0*NUM_BYTES>() // &cC0
MUL_NR2()
// r1 := tmp1 + tmp2
dup13 // &mod
dup16 EVAL_ARITHMETIC<NUM_BYTES*2*1+1*NUM_BYTES>() add // &r11
NUM_BYTES() dup2 sub // &r10 (=&r11-NUM_BYTES)
EVAL_ARITHMETIC<F6M_MUL_R_BUFFER+NUM_BYTES*2*2+1*NUM_BYTES>() // &tmp21
EVAL_ARITHMETIC<F6M_MUL_R_BUFFER+NUM_BYTES*2*2+0*NUM_BYTES>() // &tmp20
EVAL_ARITHMETIC<F6M_MUL_R_BUFFER+NUM_BYTES*2*1+1*NUM_BYTES>() // &tmp11
EVAL_ARITHMETIC<F6M_MUL_R_BUFFER+NUM_BYTES*2*1+0*NUM_BYTES>() // &tmp10
F2M_ADD()
}
#define macro F6M_MUL_r0 = takes(0) returns(0) {
// stack will remain: &a0 &a1 &b0 &b1 &c0 &c1 &A0 &A1 &B0 &B1 &C0 &C1 &mod inv &r
// output: r0 := aA + mulNonResidue((b + c) * (B + C) - (bB + cC))
// tmp1 := b + c
dup13 // &mod
EVAL_ARITHMETIC<F6M_MUL_R_BUFFER+NUM_BYTES*2*1+1*NUM_BYTES>() // &tmp11
EVAL_ARITHMETIC<F6M_MUL_R_BUFFER+NUM_BYTES*2*1+0*NUM_BYTES>() // &tmp10
dup9 // &c1
dup9 // &c0
dup9 // &b1
dup9 // &b0
F2M_ADD()
// tmp2 := B + C
dup13 // &mod
EVAL_ARITHMETIC<F6M_MUL_R_BUFFER+NUM_BYTES*2*2+1*NUM_BYTES>() // &tmp21
EVAL_ARITHMETIC<F6M_MUL_R_BUFFER+NUM_BYTES*2*2+0*NUM_BYTES>() // &tmp20
dup15 // &C1
dup15 // &C0
dup15 // &B1
dup15 // &B0
F2M_ADD()
// tmp3 := tmp1 * tmp2
dup14 // inv
dup14 // &mod
EVAL_ARITHMETIC<F6M_MUL_R_BUFFER+NUM_BYTES*2*3+1*NUM_BYTES>() // &tmp31
EVAL_ARITHMETIC<F6M_MUL_R_BUFFER+NUM_BYTES*2*3+0*NUM_BYTES>() // &tmp30
EVAL_ARITHMETIC<F6M_MUL_R_BUFFER+NUM_BYTES*2*2+1*NUM_BYTES>() // &tmp21
EVAL_ARITHMETIC<F6M_MUL_R_BUFFER+NUM_BYTES*2*2+0*NUM_BYTES>() // &tmp20
EVAL_ARITHMETIC<F6M_MUL_R_BUFFER+NUM_BYTES*2*1+1*NUM_BYTES>() // &tmp11
EVAL_ARITHMETIC<F6M_MUL_R_BUFFER+NUM_BYTES*2*1+0*NUM_BYTES>() // &tmp10
F2M_MUL()
// tmp1 := bB + cC
dup13 // &mod
EVAL_ARITHMETIC<F6M_MUL_R_BUFFER+NUM_BYTES*2*1+1*NUM_BYTES>() // &tmp11
EVAL_ARITHMETIC<F6M_MUL_R_BUFFER+NUM_BYTES*2*1+0*NUM_BYTES>() // &tmp10
EVAL_ARITHMETIC<F6M_MUL_BUFFER_AA_BB_CC+NUM_BYTES*2*2+1*NUM_BYTES>() // &cC1
EVAL_ARITHMETIC<F6M_MUL_BUFFER_AA_BB_CC+NUM_BYTES*2*2+0*NUM_BYTES>() // &cC0
EVAL_ARITHMETIC<F6M_MUL_BUFFER_AA_BB_CC+NUM_BYTES*2*1+1*NUM_BYTES>() // &bB1
EVAL_ARITHMETIC<F6M_MUL_BUFFER_AA_BB_CC+NUM_BYTES*2*1+0*NUM_BYTES>() // &bB0
F2M_ADD()
// tmp2 := tmp3 - tmp1
dup13 // &mod
EVAL_ARITHMETIC<F6M_MUL_R_BUFFER+NUM_BYTES*2*2+1*NUM_BYTES>() // &tmp21
EVAL_ARITHMETIC<F6M_MUL_R_BUFFER+NUM_BYTES*2*2+0*NUM_BYTES>() // &tmp20
EVAL_ARITHMETIC<F6M_MUL_R_BUFFER+NUM_BYTES*2*1+1*NUM_BYTES>() // &tmp11
EVAL_ARITHMETIC<F6M_MUL_R_BUFFER+NUM_BYTES*2*1+0*NUM_BYTES>() // &tmp10
EVAL_ARITHMETIC<F6M_MUL_R_BUFFER+NUM_BYTES*2*3+1*NUM_BYTES>() // &tmp31
EVAL_ARITHMETIC<F6M_MUL_R_BUFFER+NUM_BYTES*2*3+0*NUM_BYTES>() // &tmp30
F2M_SUB()
// tmp3 := mulNonResidue(tmp2)
dup13 // &mod
EVAL_ARITHMETIC<F6M_MUL_R_BUFFER+NUM_BYTES*2*3+1*NUM_BYTES>() // &tmp31
EVAL_ARITHMETIC<F6M_MUL_R_BUFFER+NUM_BYTES*2*3+0*NUM_BYTES>() // &tmp30
EVAL_ARITHMETIC<F6M_MUL_R_BUFFER+NUM_BYTES*2*2+1*NUM_BYTES>() // &tmp21
EVAL_ARITHMETIC<F6M_MUL_R_BUFFER+NUM_BYTES*2*2+0*NUM_BYTES>() // &tmp20
MUL_NR2()
// r_0 := tmp3 + aA
dup13 // &mod
dup16 EVAL_ARITHMETIC<NUM_BYTES*2*0+1*NUM_BYTES>() add // &r01
NUM_BYTES() dup2 sub // &r00 (=&r01-NUM_BYTES)
EVAL_ARITHMETIC<F6M_MUL_BUFFER_AA_BB_CC+NUM_BYTES*2*0+1*NUM_BYTES>() // &aA1
EVAL_ARITHMETIC<F6M_MUL_BUFFER_AA_BB_CC+NUM_BYTES*2*0+0*NUM_BYTES>() // &aA0
EVAL_ARITHMETIC<F6M_MUL_R_BUFFER+NUM_BYTES*2*3+1*NUM_BYTES>() // &tmp31
EVAL_ARITHMETIC<F6M_MUL_R_BUFFER+NUM_BYTES*2*3+0*NUM_BYTES>() // &tmp30
F2M_ADD()
}
// this is the main macro for f6m_mul
#define macro F6M_MUL = takes(8) returns(0) {
// input stack: &r &abc &ABC &mod inv
// output r0,r1,r2 := [a, b, c] * [A, B, C]
// 48 96 144 192 240 288
// prepare stack for each function used by f6m_mul
// &a0 &a1 &b0 &b1 &c0 &c1 &A0 &A1 &B0 &B1 &C0 &C1 &mod inv &r
// then can prepare calls based on this stack
swap4 // inv &abc &ABC &mod &r
swap3 // &mod &abc &ABC inv &r
swap2 // &ABC &abc &mod inv &r
swap1 // &abc &ABC &mod inv &r
// now convert [&abc &ABC] to [&a0 &a1 &b0 &b1 &c0 &c1 &A0 &A1 &B0 &B1 &C0 &C1]
dup2 240 add // &C1 &abc &ABC
swap2 // &ABC &abc &C1
dup1 192 add // &C0 &ABC &abc &C1
swap2 // &abc &ABC &C0 &C1
dup2 144 add // &B1 &abc &ABC &C0 &C1
swap2 // &ABC &abc &B1 &C0 &C1
dup1 96 add // &B0 &ABC &abc &B1 &C0 &C1
swap2 // &abc &ABC &B0 &B1 &C0 &C1
dup2 48 add // &A1 &abc &ABC &B0 &B1 &C0 &C1
swap2 // &ABC &abc &A1 &B0 &B1 &C0 &C1
swap1 // &abc &ABC &A1 &B0 &B1 &C0 &C1
// but &ABC is &A0, so we have: [&abc &A0 &A1 &B0 &B1 &C0 &C1], the end as desired
// now convert [&abc] to [&a0 &a1 &b0 &b1 &c0 &c1]
dup1 240 add // &c1 &abc
swap1 // &abc &c1
dup1 192 add // &c0 &abc &c1
swap1 // &abc &c0 &c1
dup1 144 add // &b1 &abc &c0 &c1
swap1 // &abc &b1 &c0 &c1
dup1 96 add // &b0 &abc &b1 &c0 &c1
swap1 // &abc &b0 &b1 &c0 &c1
dup1 48 add // &a1 &abc &b0 &b1 &c0 &c1
swap1 // &abc &a1 &b0 &b1 &c0 &c1
// but &abc is &a0, so we have: [&a0 &a1 &b0 &b1 &c0 &c1], as desired
// this completes stack preparation, and this will save us lots of work later
// note: F6M_MUL, F6M_MUL_r0, F6M_MUL_r1, and F6M_MUL_r2 all need a 288-byte temporary memory buffer for aA, bB, cC, each 96 bytes, concatenated
// the start of this buffer will be the constant defined in macro F6M_MUL_BUFFER_AA_BB_CC
// F6M_MUL_BUFFER_AA_BB_CC+NUM_BYTES*2*0+0*NUM_BYTES // &aA0
// F6M_MUL_BUFFER_AA_BB_CC+NUM_BYTES*2*0+1*NUM_BYTES // &aA1
// F6M_MUL_BUFFER_AA_BB_CC+NUM_BYTES*2*1+0*NUM_BYTES // &bB0
// F6M_MUL_BUFFER_AA_BB_CC+NUM_BYTES*2*1+1*NUM_BYTES // &bB1
// F6M_MUL_BUFFER_AA_BB_CC+NUM_BYTES*2*2+0*NUM_BYTES // &cC0
// F6M_MUL_BUFFER_AA_BB_CC+NUM_BYTES*2*2+1*NUM_BYTES // &cC1
// stack: &a0 &a1 &b0 &b1 &c0 &c1 &A0 &A1 &B0 &B1 &C0 &C1 &mod inv &r
// aA := a * A
dup14 // inv
dup14 // &mod
EVAL_ARITHMETIC<F6M_MUL_BUFFER_AA_BB_CC+NUM_BYTES*2*0+1*NUM_BYTES>() // &aA1
EVAL_ARITHMETIC<F6M_MUL_BUFFER_AA_BB_CC+NUM_BYTES*2*0+0*NUM_BYTES>() // &aA0
dup12 // A1
dup12 // A0
dup8 // a1
dup8 // a0
F2M_MUL()
// bB := b * B
dup14 // inv
dup14 // &mod
EVAL_ARITHMETIC<F6M_MUL_BUFFER_AA_BB_CC+NUM_BYTES*2*1+1*NUM_BYTES>() // &bB1
EVAL_ARITHMETIC<F6M_MUL_BUFFER_AA_BB_CC+NUM_BYTES*2*1+0*NUM_BYTES>() // &bB0
dup14 // B1
dup14 // B0
dup10 // b1
dup10 // b0
F2M_MUL()
// cC := c * C
dup14 // inv
dup14 // &mod
EVAL_ARITHMETIC<F6M_MUL_BUFFER_AA_BB_CC+NUM_BYTES*2*2+1*NUM_BYTES>() // &cC1
EVAL_ARITHMETIC<F6M_MUL_BUFFER_AA_BB_CC+NUM_BYTES*2*2+0*NUM_BYTES>() // &cC0
dup16 // C1
dup16 // C0
dup12 // c1
dup12 // c0
F2M_MUL()
// the stack is already set up for the following
F6M_MUL_r2()
F6M_MUL_r1()
F6M_MUL_r0()
// clear stack
pop
pop
pop
pop
pop
pop
pop
pop
pop
pop
pop
pop
pop
pop
pop
}
///////////////
// f6m_mul test
#define macro F6M_MUL_TEST_HARDCODED = takes(0) returns(0) {
// set up memory
// a0
0x8f2990f3e598f5b1b8f480a3c388306bc023fac151c0104d13ec3aa181599402 EVAL_ARITHMETIC<F6_ABC0+NUM_BYTES*2*0+NUM_BYTES*0>() mstore
0x72d1c8c528a1ce3bcaa280a8e735aa0d00000000000000000000000000000000 EVAL_ARITHMETIC<F6_ABC0+NUM_BYTES*2*0+NUM_BYTES*0+32>() mstore
// a1
0x992d7a27906d4cd530b23a7e8c48c0778f8653fbc3332d63db24339d8bc65d7e EVAL_ARITHMETIC<F6_ABC0+NUM_BYTES*2*0+NUM_BYTES*1>() mstore
0xe83b6e91c6550f5aceab102e88e9180900000000000000000000000000000000 EVAL_ARITHMETIC<F6_ABC0+NUM_BYTES*2*0+NUM_BYTES*1+32>() mstore
// b0
0x7299907146816f08c4c6a394e91374ed6ff3618a57358cfb124ee6ab4c560e5c EVAL_ARITHMETIC<F6_ABC0+NUM_BYTES*2*1+NUM_BYTES*0>() mstore
0xac40700b41e2ee8674680728f0c5a61800000000000000000000000000000000 EVAL_ARITHMETIC<F6_ABC0+NUM_BYTES*2*1+NUM_BYTES*0+32>() mstore
// b1
0x0fd77f62b39eb952a0f8d21cec1f93b1d62dd7923aa86882ddf7dd4d3532b0b7 EVAL_ARITHMETIC<F6_ABC0+NUM_BYTES*2*1+NUM_BYTES*1>() mstore
0xede8f3fc89fa4a79574067e2d9a9d20000000000000000000000000000000000 EVAL_ARITHMETIC<F6_ABC0+NUM_BYTES*2*1+NUM_BYTES*1+32>() mstore
// c0
0x7a69de46b13d8cb4c4833224aaf9ef7ea6a48975ab35c6e123b8539ab84c381a EVAL_ARITHMETIC<F6_ABC0+NUM_BYTES*2*2+NUM_BYTES*0>() mstore
0x2533401a73c4e79f47d714899d01ac1300000000000000000000000000000000 EVAL_ARITHMETIC<F6_ABC0+NUM_BYTES*2*2+NUM_BYTES*0+32>() mstore
// c1
0xa9fa0b0d8156c36a1a9ddacb73ef278f4d149b560e88789f2bfeb9f708b6cc2f EVAL_ARITHMETIC<F6_ABC0+NUM_BYTES*2*2+NUM_BYTES*1>() mstore
0x988927bfe0186d5bf9cb40cb07f21b1800000000000000000000000000000000 EVAL_ARITHMETIC<F6_ABC0+NUM_BYTES*2*2+NUM_BYTES*1+32>() mstore
// A0
0xecd347c808af644c7a3a971a556576f434e302b6b490004fb418a4a7da330a67 EVAL_ARITHMETIC<F6_ABC+NUM_BYTES*2*0+NUM_BYTES*0>() mstore
0x43adeca931169b8b92e91df73ae1e11500000000000000000000000000000000 EVAL_ARITHMETIC<F6_ABC+NUM_BYTES*2*0+NUM_BYTES*0+32>() mstore
// A1
0x12a2829e11e843d764d5e3b80e75432d93f69b23ad79c38d43ebbc9bd2b17b9e EVAL_ARITHMETIC<F6_ABC+NUM_BYTES*2*0+NUM_BYTES*1>() mstore
0x903033351357b03602624762e5ad360d00000000000000000000000000000000 EVAL_ARITHMETIC<F6_ABC+NUM_BYTES*2*0+NUM_BYTES*1+32>() mstore
// B0
0xd7f9857dce663301f393f9fac66f5c49168494e0d20797a6c4f96327ed4fa47d EVAL_ARITHMETIC<F6_ABC+NUM_BYTES*2*1+NUM_BYTES*0>() mstore
0xd36d0078d217a712407d35046871d40f00000000000000000000000000000000 EVAL_ARITHMETIC<F6_ABC+NUM_BYTES*2*1+NUM_BYTES*0+32>() mstore
// B1
0x2f1b767f6c1ec190eb76a0bce7906ad2e4a7548d03e8aa745e34e1bf49d83ad6 EVAL_ARITHMETIC<F6_ABC+NUM_BYTES*2*1+NUM_BYTES*1>() mstore
0x4c04f57fb4d31039cb4cf01987fda21300000000000000000000000000000000 EVAL_ARITHMETIC<F6_ABC+NUM_BYTES*2*1+NUM_BYTES*1+32>() mstore
// C0
0x7b3f8da2f2ae47885890b0d433a3eeed2f9f37cbcfc444e4f1d880390fcdb765 EVAL_ARITHMETIC<F6_ABC+NUM_BYTES*2*2+NUM_BYTES*0>() mstore
0x18d558857be01b2b10a8010bcdc6d60600000000000000000000000000000000 EVAL_ARITHMETIC<F6_ABC+NUM_BYTES*2*2+NUM_BYTES*0+32>() mstore
// C1
0x319c02f6132c8a786377868b5825ada9a5fe303e9ae3b03ce56e90734a17ce97 EVAL_ARITHMETIC<F6_ABC+NUM_BYTES*2*2+NUM_BYTES*1>() mstore
0x0c88b321012cf8dabb58211e3d50f61000000000000000000000000000000000 EVAL_ARITHMETIC<F6_ABC+NUM_BYTES*2*2+NUM_BYTES*1+32>() mstore
// mod for bls12-381
0xabaafffffffffeb9ffff53b1feffab1e24f6b0f6a0d23067bf1285f3844b7764 EVAL_ARITHMETIC<MOD_OFFSET*1>() mstore
0xd7ac4b43b6a71b4b9ae67f39ea11011a00000000000000000000000000000000 EVAL_ARITHMETIC<MOD_OFFSET+32>() mstore
// inv for bls12-381
0x89f3fffcfffcfffd000000000000000000000000000000000000000000000000 EVAL_ARITHMETIC<MOD_OFFSET+48>() mstore
// set up stack for call to f6m_mul
// input stack: &r &abc &ABC &mod inv
0x89f3fffcfffcfffd // inv for bls12-381
MOD_OFFSET() // mod
F6_ABC() // ABC
F6_ABC0() // abc
F6M_MUL_OUT() // out
F6M_MUL()
// return output
288 F6M_MUL_OUT() return
/*
output should be:
f4f3f4e0a35068eaac665aee2e71f682aecd20923b420023b6d5420ba01ea98287c314107a998a650ab3247ef39c920e
2c9620d993a22bade623d165a9f4aa648af87cb7292b7821c0fcd0adcd14ba655da54df2ad93262e24fc62bcd97e7208
ead1838e6c5e168543093c87eaeb576f940670026292dcb7a812600f4fb20a281be71ce1ef79f675e4a283b73906ca17
9c8b2c76405445b20dd7635d562309f69c2c87601d9055a5e10df2ea1d28237fafd0d32f7e8c19d4cd5a3d1ef65b120b
40591ef0c74dbec983b7bef145a87957c1e09049dbc85fbb3e9bb1174892ee83294ef8c4a5954fffbff4ca6aca74c718
9b242b8f1c5d63bb525121bd68eda084ab7e6d015052d5adeb79ddb24091d2a8e5b1da00212d0e6c11f01d23790113
*/
}
//////////////////
// f6m_mul bench
#define macro F6M_MUL_BENCH_NUM_ITERS = takes(0) returns(1) {
135
}
#define jumptable F6M_MUL_BENCH_JUMP_TABLE {
loop done
}
#define macro F6M_MUL_BENCH = takes(0) returns(0) {
// set up memory
// a0
0x8f2990f3e598f5b1b8f480a3c388306bc023fac151c0104d13ec3aa181599402 EVAL_ARITHMETIC<F6_ABC0+NUM_BYTES*2*0+NUM_BYTES*0>() mstore
0x72d1c8c528a1ce3bcaa280a8e735aa0d00000000000000000000000000000000 EVAL_ARITHMETIC<F6_ABC0+NUM_BYTES*2*0+NUM_BYTES*0+32>() mstore
// a1
0x992d7a27906d4cd530b23a7e8c48c0778f8653fbc3332d63db24339d8bc65d7e EVAL_ARITHMETIC<F6_ABC0+NUM_BYTES*2*0+NUM_BYTES*1>() mstore
0xe83b6e91c6550f5aceab102e88e9180900000000000000000000000000000000 EVAL_ARITHMETIC<F6_ABC0+NUM_BYTES*2*0+NUM_BYTES*1+32>() mstore
// b0
0x7299907146816f08c4c6a394e91374ed6ff3618a57358cfb124ee6ab4c560e5c EVAL_ARITHMETIC<F6_ABC0+NUM_BYTES*2*1+NUM_BYTES*0>() mstore
0xac40700b41e2ee8674680728f0c5a61800000000000000000000000000000000 EVAL_ARITHMETIC<F6_ABC0+NUM_BYTES*2*1+NUM_BYTES*0+32>() mstore
// b1
0x0fd77f62b39eb952a0f8d21cec1f93b1d62dd7923aa86882ddf7dd4d3532b0b7 EVAL_ARITHMETIC<F6_ABC0+NUM_BYTES*2*1+NUM_BYTES*1>() mstore
0xede8f3fc89fa4a79574067e2d9a9d20000000000000000000000000000000000 EVAL_ARITHMETIC<F6_ABC0+NUM_BYTES*2*1+NUM_BYTES*1+32>() mstore
// c0
0x7a69de46b13d8cb4c4833224aaf9ef7ea6a48975ab35c6e123b8539ab84c381a EVAL_ARITHMETIC<F6_ABC0+NUM_BYTES*2*2+NUM_BYTES*0>() mstore
0x2533401a73c4e79f47d714899d01ac1300000000000000000000000000000000 EVAL_ARITHMETIC<F6_ABC0+NUM_BYTES*2*2+NUM_BYTES*0+32>() mstore
// c1
0xa9fa0b0d8156c36a1a9ddacb73ef278f4d149b560e88789f2bfeb9f708b6cc2f EVAL_ARITHMETIC<F6_ABC0+NUM_BYTES*2*2+NUM_BYTES*1>() mstore
0x988927bfe0186d5bf9cb40cb07f21b1800000000000000000000000000000000 EVAL_ARITHMETIC<F6_ABC0+NUM_BYTES*2*2+NUM_BYTES*1+32>() mstore
// A0
0xecd347c808af644c7a3a971a556576f434e302b6b490004fb418a4a7da330a67 EVAL_ARITHMETIC<F6_ABC+NUM_BYTES*2*0+NUM_BYTES*0>() mstore
0x43adeca931169b8b92e91df73ae1e11500000000000000000000000000000000 EVAL_ARITHMETIC<F6_ABC+NUM_BYTES*2*0+NUM_BYTES*0+32>() mstore
// A1
0x12a2829e11e843d764d5e3b80e75432d93f69b23ad79c38d43ebbc9bd2b17b9e EVAL_ARITHMETIC<F6_ABC+NUM_BYTES*2*0+NUM_BYTES*1>() mstore
0x903033351357b03602624762e5ad360d00000000000000000000000000000000 EVAL_ARITHMETIC<F6_ABC+NUM_BYTES*2*0+NUM_BYTES*1+32>() mstore
// B0
0xd7f9857dce663301f393f9fac66f5c49168494e0d20797a6c4f96327ed4fa47d EVAL_ARITHMETIC<F6_ABC+NUM_BYTES*2*1+NUM_BYTES*0>() mstore
0xd36d0078d217a712407d35046871d40f00000000000000000000000000000000 EVAL_ARITHMETIC<F6_ABC+NUM_BYTES*2*1+NUM_BYTES*0+32>() mstore
// B1
0x2f1b767f6c1ec190eb76a0bce7906ad2e4a7548d03e8aa745e34e1bf49d83ad6 EVAL_ARITHMETIC<F6_ABC+NUM_BYTES*2*1+NUM_BYTES*1>() mstore
0x4c04f57fb4d31039cb4cf01987fda21300000000000000000000000000000000 EVAL_ARITHMETIC<F6_ABC+NUM_BYTES*2*1+NUM_BYTES*1+32>() mstore
// C0
0x7b3f8da2f2ae47885890b0d433a3eeed2f9f37cbcfc444e4f1d880390fcdb765 EVAL_ARITHMETIC<F6_ABC+NUM_BYTES*2*2+NUM_BYTES*0>() mstore
0x18d558857be01b2b10a8010bcdc6d60600000000000000000000000000000000 EVAL_ARITHMETIC<F6_ABC+NUM_BYTES*2*2+NUM_BYTES*0+32>() mstore
// C1
0x319c02f6132c8a786377868b5825ada9a5fe303e9ae3b03ce56e90734a17ce97 EVAL_ARITHMETIC<F6_ABC+NUM_BYTES*2*2+NUM_BYTES*1>() mstore
0x0c88b321012cf8dabb58211e3d50f61000000000000000000000000000000000 EVAL_ARITHMETIC<F6_ABC+NUM_BYTES*2*2+NUM_BYTES*1+32>() mstore
// mod for bls12-381
0xabaafffffffffeb9ffff53b1feffab1e24f6b0f6a0d23067bf1285f3844b7764 EVAL_ARITHMETIC<MOD_OFFSET*1>() mstore
0xd7ac4b43b6a71b4b9ae67f39ea11011a00000000000000000000000000000000 EVAL_ARITHMETIC<MOD_OFFSET+32>() mstore
// inv for bls12-381
0x89f3fffcfffcfffd000000000000000000000000000000000000000000000000 EVAL_ARITHMETIC<MOD_OFFSET+48>() mstore
// prepare for loop
1 // iterator, starts at 1 and grows
loop:
// set up stack for call to f6m_mul
0x89f3fffcfffcfffd // inv for bls12-381
MOD_OFFSET() // mod
F6_ABC() // ABC
F6_ABC0() // abc
F6M_MUL_OUT() // out
F6M_MUL()
// set up stack for call to f6m_mul
0x89f3fffcfffcfffd // inv for bls12-381
MOD_OFFSET() // mod
F6_ABC() // ABC
F6_ABC0() // abc
F6M_MUL_OUT() // out
F6M_MUL()
// set up stack for call to f6m_mul
0x89f3fffcfffcfffd // inv for bls12-381
MOD_OFFSET() // mod
F6_ABC() // ABC
F6_ABC0() // abc
F6M_MUL_OUT() // out
F6M_MUL()
// set up stack for call to f6m_mul
0x89f3fffcfffcfffd // inv for bls12-381
MOD_OFFSET() // mod
F6_ABC() // ABC
F6_ABC0() // abc
F6M_MUL_OUT() // out
F6M_MUL()
// set up stack for call to f6m_mul
0x89f3fffcfffcfffd // inv for bls12-381
MOD_OFFSET() // mod
F6_ABC() // ABC
F6_ABC0() // abc
F6M_MUL_OUT() // out
F6M_MUL()
// set up stack for call to f6m_mul
0x89f3fffcfffcfffd // inv for bls12-381
MOD_OFFSET() // mod
F6_ABC() // ABC
F6_ABC0() // abc
F6M_MUL_OUT() // out
F6M_MUL()
// set up stack for call to f6m_mul
0x89f3fffcfffcfffd // inv for bls12-381
MOD_OFFSET() // mod
F6_ABC() // ABC
F6_ABC0() // abc
F6M_MUL_OUT() // out
F6M_MUL()
// set up stack for call to f6m_mul
0x89f3fffcfffcfffd // inv for bls12-381
MOD_OFFSET() // mod
F6_ABC() // ABC
F6_ABC0() // abc
F6M_MUL_OUT() // out
F6M_MUL()
// set up stack for call to f6m_mul
0x89f3fffcfffcfffd // inv for bls12-381
MOD_OFFSET() // mod
F6_ABC() // ABC
F6_ABC0() // abc
F6M_MUL_OUT() // out
F6M_MUL()
// set up stack for call to f6m_mul
0x89f3fffcfffcfffd // inv for bls12-381
MOD_OFFSET() // mod
F6_ABC() // ABC
F6_ABC0() // abc
F6M_MUL_OUT() // out
F6M_MUL()
__tablesize(F6M_MUL_BENCH_JUMP_TABLE) __tablestart(F6M_MUL_BENCH_JUMP_TABLE) 1000 codecopy // copy jumpdests to memory offset 1000, clobbering whatever is there
1 add // increment [iterator+1]
dup1 F6M_MUL_BENCH_NUM_ITERS() lt // compare to max number of iters [iterator+1 0_or_1]
32 mul 1000 add // offset to jump to [iterator+1 1000_or_1032]
mload jump // where the number before lt is iter_count
done:
0xff 0 mstore8 1 0 return // return a single byte, 0xff, to make sure it executed this far
//stop
}
{
"f6m_mul_v2" : {
"_info" : {
"comment" : "",
"filledwith" : "testeth 1.8.0-6+commit.c7ba3b69",
"lllcversion" : "Version: 0.5.14-develop.2019.11.27+commit.8f259595.Linux.g++",
"source" : "src/VMTestsFiller/vmArithmeticTest/add0Filler.json",
"sourceHash" : "c1480bf5e662b7f6518d4b003e14575c6bdab286e2d8763e1b0be9a186bec775"
},
"callcreates" : [
],
"env" : {
"currentCoinbase" : "0x2adc25665018aa1fe0e6bc666dac8fc2697ff9ba",
"currentDifficulty" : "0x020000",
"currentGasLimit" : "0x7fffffffffffffff",
"currentNumber" : "0x01",
"currentTimestamp" : "0x03e8"
},
"exec" : {
"address" : "0x0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6",
"caller" : "0xcd1722f2947def4cf144679da39c4c32bdc35681",
"code" : "0x7f8f2990f3e598f5b1b8f480a3c388306bc023fac151c0104d13ec3aa1815994026104b0527f72d1c8c528a1ce3bcaa280a8e735aa0d000000000000000000000000000000006104d0527f992d7a27906d4cd530b23a7e8c48c0778f8653fbc3332d63db24339d8bc65d7e6104e0527fe83b6e91c6550f5aceab102e88e9180900000000000000000000000000000000610500527f7299907146816f08c4c6a394e91374ed6ff3618a57358cfb124ee6ab4c560e5c610510527fac40700b41e2ee8674680728f0c5a61800000000000000000000000000000000610530527f0fd77f62b39eb952a0f8d21cec1f93b1d62dd7923aa86882ddf7dd4d3532b0b7610540527fede8f3fc89fa4a79574067e2d9a9d20000000000000000000000000000000000610560527f7a69de46b13d8cb4c4833224aaf9ef7ea6a48975ab35c6e123b8539ab84c381a610570527f2533401a73c4e79f47d714899d01ac1300000000000000000000000000000000610590527fa9fa0b0d8156c36a1a9ddacb73ef278f4d149b560e88789f2bfeb9f708b6cc2f6105a0527f988927bfe0186d5bf9cb40cb07f21b18000000000000000000000000000000006105c0527fecd347c808af644c7a3a971a556576f434e302b6b490004fb418a4a7da330a676105dc527f43adeca931169b8b92e91df73ae1e115000000000000000000000000000000006105fc527f12a2829e11e843d764d5e3b80e75432d93f69b23ad79c38d43ebbc9bd2b17b9e61060c527f903033351357b03602624762e5ad360d0000000000000000000000000000000061062c527fd7f9857dce663301f393f9fac66f5c49168494e0d20797a6c4f96327ed4fa47d61063c527fd36d0078d217a712407d35046871d40f0000000000000000000000000000000061065c527f2f1b767f6c1ec190eb76a0bce7906ad2e4a7548d03e8aa745e34e1bf49d83ad661066c527f4c04f57fb4d31039cb4cf01987fda2130000000000000000000000000000000061068c527f7b3f8da2f2ae47885890b0d433a3eeed2f9f37cbcfc444e4f1d880390fcdb76561069c527f18d558857be01b2b10a8010bcdc6d606000000000000000000000000000000006106bc527f319c02f6132c8a786377868b5825ada9a5fe303e9ae3b03ce56e90734a17ce976106cc527f0c88b321012cf8dabb58211e3d50f610000000000000000000000000000000006106ec527fabaafffffffffeb9ffff53b1feffab1e24f6b0f6a0d23067bf1285f3844b7764610708527fd7ac4b43b6a71b4b9ae67f39ea11011a00000000000000000000000000000000610728527f89f3fffcfffcfffd000000000000000000000000000000000000000000000000610738526789f3fffcfffcfffd6107086105dc6104b06000939291908160f001918060c00191816090019180606001918160300191908060f001908060c001908060900190806060019080603001908d8d6103b46103848b8b87878787848361015cc28787858461018cc28661018c61012c6101bcc1866101bc61015c87c08661018c61015c61015cc086828261018cc08684846101bcc087876101bc61018c61018cc28661015c61018c88c150505050505050508d8d6104146103e48d8d89898787848361015cc28787858461018cc28661018c61012c6101bcc1866101bc61015c87c08661018c61015c61015cc086828261018cc08684846101bcc087876101bc61018c61018cc28661015c61018c88c150505050505050508d8d6104746104448f8f8b8b8787848361015cc28787858461018cc28661018c61012c6101bcc1866101bc61015c87c08661018c61015c61015cc086828261018cc08684846101bcc087876101bc61018c61018cc28661015c61018c88c150505050505050508c6102846102548888868686838287c086848388c0505050505050508c6102e46102b48e8e8c8c86838287c086848388c0505050505050508d8d6103446103146102e46102b46102846102548787848361015cc28787858461018cc28661018c61012c6101bcc1866101bc61015c87c08661018c61015c61015cc086828261018cc08684846101bcc087876101bc61018c61018cc28661015c61018c88c150505050505050508c6102846102546103b461038461047461044486838287c086848388c0505050505050508c6102e46102b461028461025461034461031486838287c186848388c1505050505050508c8f60f001603081036102e46102b46104146103e486838287c086848388c0505050505050508c6102846102548686868686838287c086848388c0505050505050508c6102e46102b48c8c8c8c86838287c086848388c0505050505050508d8d6103446103146102e46102b46102846102548787848361015cc28787858461018cc28661018c61012c6101bcc1866101bc61015c87c08661018c61015c61015cc086828261018cc08684846101bcc087876101bc61018c61018cc28661015c61018c88c150505050505050508c6102846102546104146103e46103b461038486838287c086848388c0505050505050508c6102e46102b461028461025461034461031486838287c186848388c1505050505050508c61028461025461047461044484828285c184828286c050505050508c8f609001603081036102e46102b461028461025486838287c086848388c0505050505050508c6102846102548888888886838287c086848388c0505050505050508c6102e46102b48e8e8e8e86838287c086848388c0505050505050508d8d6103446103146102e46102b46102846102548787848361015cc28787858461018cc28661018c61012c6101bcc1866101bc61015c87c08661018c61015c61015cc086828261018cc08684846101bcc087876101bc61018c61018cc28661015c61018c88c150505050505050508c6102846102546104746104446104146103e486838287c086848388c0505050505050508c6102e46102b461028461025461034461031486838287c186848388c1505050505050508c6103446103146102e46102b484828285c184828286c050505050508c8f603001603081036103b461038461034461031486838287c086848388c0505050505050505050505050505050505050505050506101206000f3",
"data" : "0x",
"gas" : "0x0186a0",
"gasPrice" : "0x0c",
"origin" : "0xcd1722f2947def4cf144679da39c4c32bdc35681",
"value" : "0x0b"
},
"gas" : "0x013874",
"logs" : "0x1dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d49347",
"out" : "0x",
"post" : {
"0x0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6" : {
"balance" : "0x0de0b6b3a7640000",
"code" : "0x",
"nonce" : "0x00",
"storage" : {
}
}
},
"pre" : {
"0x0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6" : {
"balance" : "0x0de0b6b3a7640000",
"code" : "0x",
"nonce" : "0x00",
"storage" : {
}
}
}
}
}
{
"f6m_mul_v2_bench" : {
"_info" : {
"comment" : "",
"filledwith" : "testeth 1.8.0-6+commit.c7ba3b69",
"lllcversion" : "Version: 0.5.14-develop.2019.11.27+commit.8f259595.Linux.g++",
"source" : "src/VMTestsFiller/vmArithmeticTest/add0Filler.json",
"sourceHash" : "c1480bf5e662b7f6518d4b003e14575c6bdab286e2d8763e1b0be9a186bec775"
},
"callcreates" : [
],
"env" : {
"currentCoinbase" : "0x2adc25665018aa1fe0e6bc666dac8fc2697ff9ba",
"currentDifficulty" : "0x020000",
"currentGasLimit" : "0x7fffffffffffffff",
"currentNumber" : "0x01",
"currentTimestamp" : "0x03e8"
},
"exec" : {
"address" : "0x0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6",
"caller" : "0xcd1722f2947def4cf144679da39c4c32bdc35681",
"code" : "0x7f8f2990f3e598f5b1b8f480a3c388306bc023fac151c0104d13ec3aa1815994026104b0527f72d1c8c528a1ce3bcaa280a8e735aa0d000000000000000000000000000000006104d0527f992d7a27906d4cd530b23a7e8c48c0778f8653fbc3332d63db24339d8bc65d7e6104e0527fe83b6e91c6550f5aceab102e88e9180900000000000000000000000000000000610500527f7299907146816f08c4c6a394e91374ed6ff3618a57358cfb124ee6ab4c560e5c610510527fac40700b41e2ee8674680728f0c5a61800000000000000000000000000000000610530527f0fd77f62b39eb952a0f8d21cec1f93b1d62dd7923aa86882ddf7dd4d3532b0b7610540527fede8f3fc89fa4a79574067e2d9a9d20000000000000000000000000000000000610560527f7a69de46b13d8cb4c4833224aaf9ef7ea6a48975ab35c6e123b8539ab84c381a610570527f2533401a73c4e79f47d714899d01ac1300000000000000000000000000000000610590527fa9fa0b0d8156c36a1a9ddacb73ef278f4d149b560e88789f2bfeb9f708b6cc2f6105a0527f988927bfe0186d5bf9cb40cb07f21b18000000000000000000000000000000006105c0527fecd347c808af644c7a3a971a556576f434e302b6b490004fb418a4a7da330a676105dc527f43adeca931169b8b92e91df73ae1e115000000000000000000000000000000006105fc527f12a2829e11e843d764d5e3b80e75432d93f69b23ad79c38d43ebbc9bd2b17b9e61060c527f903033351357b03602624762e5ad360d0000000000000000000000000000000061062c527fd7f9857dce663301f393f9fac66f5c49168494e0d20797a6c4f96327ed4fa47d61063c527fd36d0078d217a712407d35046871d40f0000000000000000000000000000000061065c527f2f1b767f6c1ec190eb76a0bce7906ad2e4a7548d03e8aa745e34e1bf49d83ad661066c527f4c04f57fb4d31039cb4cf01987fda2130000000000000000000000000000000061068c527f7b3f8da2f2ae47885890b0d433a3eeed2f9f37cbcfc444e4f1d880390fcdb76561069c527f18d558857be01b2b10a8010bcdc6d606000000000000000000000000000000006106bc527f319c02f6132c8a786377868b5825ada9a5fe303e9ae3b03ce56e90734a17ce976106cc527f0c88b321012cf8dabb58211e3d50f610000000000000000000000000000000006106ec5260015b6105dc6104b0600091908160f001918060c00191816090019180606001918160300191908060f001908060c001908060900190806060019080603001906103b461038489898585828161015cc2838261018cc261018c61012c6101bcc16101bc61015c86c061018c61015c61015cc0818161018cc083836101bcc06101bc61018c61018cc261015c61018c87c15050505050506104146103e48b8b8787828161015cc2838261018cc261018c61012c6101bcc16101bc61015c86c061018c61015c61015cc0818161018cc083836101bcc06101bc61018c61018cc261015c61018c87c15050505050506104746104448d8d8989828161015cc2838261018cc261018c61012c6101bcc16101bc61015c86c061018c61015c61015cc0818161018cc083836101bcc06101bc61018c61018cc261015c61018c87c150505050505061028461025487878585828186c0838287c05050505050506102e46102b48d8d8b8b828186c0838287c05050505050506103446103146102e46102b4610284610254828161015cc2838261018cc261018c61012c6101bcc16101bc61015c86c061018c61015c61015cc0818161018cc083836101bcc06101bc61018c61018cc261015c61018c87c15050505050506102846102546103b4610384610474610444828186c0838287c05050505050506102e46102b4610284610254610344610314828186c1838287c15050505050508c60f001603081036102e46102b46104146103e4828186c0838287c050505050505061028461025485858585828186c0838287c05050505050506102e46102b48b8b8b8b828186c0838287c05050505050506103446103146102e46102b4610284610254828161015cc2838261018cc261018c61012c6101bcc16101bc61015c86c061018c61015c61015cc0818161018cc083836101bcc06101bc61018c61018cc261015c61018c87c15050505050506102846102546104146103e46103b4610384828186c0838287c05050505050506102e46102b4610284610254610344610314828186c1838287c1505050505050610284610254610474610444818184c1818185c0505050508c609001603081036102e46102b4610284610254828186c0838287c050505050505061028461025487878787828186c0838287c05050505050506102e46102b48d8d8d8d828186c0838287c05050505050506103446103146102e46102b4610284610254828161015cc2838261018cc261018c61012c6101bcc16101bc61015c86c061018c61015c61015cc0818161018cc083836101bcc06101bc61018c61018cc261015c61018c87c15050505050506102846102546104746104446104146103e4828186c0838287c05050505050506102e46102b4610284610254610344610314828186c1838287c15050505050506103446103146102e46102b4818184c1818185c0505050508c603001603081036103b4610384610344610314828186c0838287c0505050505050505050505050505050505050506105dc6104b0600091908160f001918060c00191816090019180606001918160300191908060f001908060c001908060900190806060019080603001906103b461038489898585828161015cc2838261018cc261018c61012c6101bcc16101bc61015c86c061018c61015c61015cc0818161018cc083836101bcc06101bc61018c61018cc261015c61018c87c15050505050506104146103e48b8b8787828161015cc2838261018cc261018c61012c6101bcc16101bc61015c86c061018c61015c61015cc0818161018cc083836101bcc06101bc61018c61018cc261015c61018c87c15050505050506104746104448d8d8989828161015cc2838261018cc261018c61012c6101bcc16101bc61015c86c061018c61015c61015cc0818161018cc083836101bcc06101bc61018c61018cc261015c61018c87c150505050505061028461025487878585828186c0838287c05050505050506102e46102b48d8d8b8b828186c0838287c05050505050506103446103146102e46102b4610284610254828161015cc2838261018cc261018c61012c6101bcc16101bc61015c86c061018c61015c61015cc0818161018cc083836101bcc06101bc61018c61018cc261015c61018c87c15050505050506102846102546103b4610384610474610444828186c0838287c05050505050506102e46102b4610284610254610344610314828186c1838287c15050505050508c60f001603081036102e46102b46104146103e4828186c0838287c050505050505061028461025485858585828186c0838287c05050505050506102e46102b48b8b8b8b828186c0838287c05050505050506103446103146102e46102b4610284610254828161015cc2838261018cc261018c61012c6101bcc16101bc61015c86c061018c61015c61015cc0818161018cc083836101bcc06101bc61018c61018cc261015c61018c87c15050505050506102846102546104146103e46103b4610384828186c0838287c05050505050506102e46102b4610284610254610344610314828186c1838287c1505050505050610284610254610474610444818184c1818185c0505050508c609001603081036102e46102b4610284610254828186c0838287c050505050505061028461025487878787828186c0838287c05050505050506102e46102b48d8d8d8d828186c0838287c05050505050506103446103146102e46102b4610284610254828161015cc2838261018cc261018c61012c6101bcc16101bc61015c86c061018c61015c61015cc0818161018cc083836101bcc06101bc61018c61018cc261015c61018c87c15050505050506102846102546104746104446104146103e4828186c0838287c05050505050506102e46102b4610284610254610344610314828186c1838287c15050505050506103446103146102e46102b4818184c1818185c0505050508c603001603081036103b4610384610344610314828186c0838287c0505050505050505050505050505050505050506105dc6104b0600091908160f001918060c00191816090019180606001918160300191908060f001908060c001908060900190806060019080603001906103b461038489898585828161015cc2838261018cc261018c61012c6101bcc16101bc61015c86c061018c61015c61015cc0818161018cc083836101bcc06101bc61018c61018cc261015c61018c87c15050505050506104146103e48b8b8787828161015cc2838261018cc261018c61012c6101bcc16101bc61015c86c061018c61015c61015cc0818161018cc083836101bcc06101bc61018c61018cc261015c61018c87c15050505050506104746104448d8d8989828161015cc2838261018cc261018c61012c6101bcc16101bc61015c86c061018c61015c61015cc0818161018cc083836101bcc06101bc61018c61018cc261015c61018c87c150505050505061028461025487878585828186c0838287c05050505050506102e46102b48d8d8b8b828186c0838287c05050505050506103446103146102e46102b4610284610254828161015cc2838261018cc261018c61012c6101bcc16101bc61015c86c061018c61015c61015cc0818161018cc083836101bcc06101bc61018c61018cc261015c61018c87c15050505050506102846102546103b4610384610474610444828186c0838287c05050505050506102e46102b4610284610254610344610314828186c1838287c15050505050508c60f001603081036102e46102b46104146103e4828186c0838287c050505050505061028461025485858585828186c0838287c05050505050506102e46102b48b8b8b8b828186c0838287c05050505050506103446103146102e46102b4610284610254828161015cc2838261018cc261018c61012c6101bcc16101bc61015c86c061018c61015c61015cc0818161018cc083836101bcc06101bc61018c61018cc261015c61018c87c15050505050506102846102546104146103e46103b4610384828186c0838287c05050505050506102e46102b4610284610254610344610314828186c1838287c1505050505050610284610254610474610444818184c1818185c0505050508c609001603081036102e46102b4610284610254828186c0838287c050505050505061028461025487878787828186c0838287c05050505050506102e46102b48d8d8d8d828186c0838287c05050505050506103446103146102e46102b4610284610254828161015cc2838261018cc261018c61012c6101bcc16101bc61015c86c061018c61015c61015cc0818161018cc083836101bcc06101bc61018c61018cc261015c61018c87c15050505050506102846102546104746104446104146103e4828186c0838287c05050505050506102e46102b4610284610254610344610314828186c1838287c15050505050506103446103146102e46102b4818184c1818185c0505050508c603001603081036103b4610384610344610314828186c0838287c0505050505050505050505050505050505050506105dc6104b0600091908160f001918060c00191816090019180606001918160300191908060f001908060c001908060900190806060019080603001906103b461038489898585828161015cc2838261018cc261018c61012c6101bcc16101bc61015c86c061018c61015c61015cc0818161018cc083836101bcc06101bc61018c61018cc261015c61018c87c15050505050506104146103e48b8b8787828161015cc2838261018cc261018c61012c6101bcc16101bc61015c86c061018c61015c61015cc0818161018cc083836101bcc06101bc61018c61018cc261015c61018c87c15050505050506104746104448d8d8989828161015cc2838261018cc261018c61012c6101bcc16101bc61015c86c061018c61015c61015cc0818161018cc083836101bcc06101bc61018c61018cc261015c61018c87c150505050505061028461025487878585828186c0838287c05050505050506102e46102b48d8d8b8b828186c0838287c05050505050506103446103146102e46102b4610284610254828161015cc2838261018cc261018c61012c6101bcc16101bc61015c86c061018c61015c61015cc0818161018cc083836101bcc06101bc61018c61018cc261015c61018c87c15050505050506102846102546103b4610384610474610444828186c0838287c05050505050506102e46102b4610284610254610344610314828186c1838287c15050505050508c60f001603081036102e46102b46104146103e4828186c0838287c050505050505061028461025485858585828186c0838287c05050505050506102e46102b48b8b8b8b828186c0838287c05050505050506103446103146102e46102b4610284610254828161015cc2838261018cc261018c61012c6101bcc16101bc61015c86c061018c61015c61015cc0818161018cc083836101bcc06101bc61018c61018cc261015c61018c87c15050505050506102846102546104146103e46103b4610384828186c0838287c05050505050506102e46102b4610284610254610344610314828186c1838287c1505050505050610284610254610474610444818184c1818185c0505050508c609001603081036102e46102b4610284610254828186c0838287c050505050505061028461025487878787828186c0838287c05050505050506102e46102b48d8d8d8d828186c0838287c05050505050506103446103146102e46102b4610284610254828161015cc2838261018cc261018c61012c6101bcc16101bc61015c86c061018c61015c61015cc0818161018cc083836101bcc06101bc61018c61018cc261015c61018c87c15050505050506102846102546104746104446104146103e4828186c0838287c05050505050506102e46102b4610284610254610344610314828186c1838287c15050505050506103446103146102e46102b4818184c1818185c0505050508c603001603081036103b4610384610344610314828186c0838287c0505050505050505050505050505050505050506105dc6104b0600091908160f001918060c00191816090019180606001918160300191908060f001908060c001908060900190806060019080603001906103b461038489898585828161015cc2838261018cc261018c61012c6101bcc16101bc61015c86c061018c61015c61015cc0818161018cc083836101bcc06101bc61018c61018cc261015c61018c87c15050505050506104146103e48b8b8787828161015cc2838261018cc261018c61012c6101bcc16101bc61015c86c061018c61015c61015cc0818161018cc083836101bcc06101bc61018c61018cc261015c61018c87c15050505050506104746104448d8d8989828161015cc2838261018cc261018c61012c6101bcc16101bc61015c86c061018c61015c61015cc0818161018cc083836101bcc06101bc61018c61018cc261015c61018c87c150505050505061028461025487878585828186c0838287c05050505050506102e46102b48d8d8b8b828186c0838287c05050505050506103446103146102e46102b4610284610254828161015cc2838261018cc261018c61012c6101bcc16101bc61015c86c061018c61015c61015cc0818161018cc083836101bcc06101bc61018c61018cc261015c61018c87c15050505050506102846102546103b4610384610474610444828186c0838287c05050505050506102e46102b4610284610254610344610314828186c1838287c15050505050508c60f001603081036102e46102b46104146103e4828186c0838287c050505050505061028461025485858585828186c0838287c05050505050506102e46102b48b8b8b8b828186c0838287c05050505050506103446103146102e46102b4610284610254828161015cc2838261018cc261018c61012c6101bcc16101bc61015c86c061018c61015c61015cc0818161018cc083836101bcc06101bc61018c61018cc261015c61018c87c15050505050506102846102546104146103e46103b4610384828186c0838287c05050505050506102e46102b4610284610254610344610314828186c1838287c1505050505050610284610254610474610444818184c1818185c0505050508c609001603081036102e46102b4610284610254828186c0838287c050505050505061028461025487878787828186c0838287c05050505050506102e46102b48d8d8d8d828186c0838287c05050505050506103446103146102e46102b4610284610254828161015cc2838261018cc261018c61012c6101bcc16101bc61015c86c061018c61015c61015cc0818161018cc083836101bcc06101bc61018c61018cc261015c61018c87c15050505050506102846102546104746104446104146103e4828186c0838287c05050505050506102e46102b4610284610254610344610314828186c1838287c15050505050506103446103146102e46102b4818184c1818185c0505050508c603001603081036103b4610384610344610314828186c0838287c0505050505050505050505050505050505050506105dc6104b0600091908160f001918060c00191816090019180606001918160300191908060f001908060c001908060900190806060019080603001906103b461038489898585828161015cc2838261018cc261018c61012c6101bcc16101bc61015c86c061018c61015c61015cc0818161018cc083836101bcc06101bc61018c61018cc261015c61018c87c15050505050506104146103e48b8b8787828161015cc2838261018cc261018c61012c6101bcc16101bc61015c86c061018c61015c61015cc0818161018cc083836101bcc06101bc61018c61018cc261015c61018c87c15050505050506104746104448d8d8989828161015cc2838261018cc261018c61012c6101bcc16101bc61015c86c061018c61015c61015cc0818161018cc083836101bcc06101bc61018c61018cc261015c61018c87c150505050505061028461025487878585828186c0838287c05050505050506102e46102b48d8d8b8b828186c0838287c05050505050506103446103146102e46102b4610284610254828161015cc2838261018cc261018c61012c6101bcc16101bc61015c86c061018c61015c61015cc0818161018cc083836101bcc06101bc61018c61018cc261015c61018c87c15050505050506102846102546103b4610384610474610444828186c0838287c05050505050506102e46102b4610284610254610344610314828186c1838287c15050505050508c60f001603081036102e46102b46104146103e4828186c0838287c050505050505061028461025485858585828186c0838287c05050505050506102e46102b48b8b8b8b828186c0838287c05050505050506103446103146102e46102b4610284610254828161015cc2838261018cc261018c61012c6101bcc16101bc61015c86c061018c61015c61015cc0818161018cc083836101bcc06101bc61018c61018cc261015c61018c87c15050505050506102846102546104146103e46103b4610384828186c0838287c05050505050506102e46102b4610284610254610344610314828186c1838287c1505050505050610284610254610474610444818184c1818185c0505050508c609001603081036102e46102b4610284610254828186c0838287c050505050505061028461025487878787828186c0838287c05050505050506102e46102b48d8d8d8d828186c0838287c05050505050506103446103146102e46102b4610284610254828161015cc2838261018cc261018c61012c6101bcc16101bc61015c86c061018c61015c61015cc0818161018cc083836101bcc06101bc61018c61018cc261015c61018c87c15050505050506102846102546104746104446104146103e4828186c0838287c05050505050506102e46102b4610284610254610344610314828186c1838287c15050505050506103446103146102e46102b4818184c1818185c0505050508c603001603081036103b4610384610344610314828186c0838287c0505050505050505050505050505050505050506105dc6104b0600091908160f001918060c00191816090019180606001918160300191908060f001908060c001908060900190806060019080603001906103b461038489898585828161015cc2838261018cc261018c61012c6101bcc16101bc61015c86c061018c61015c61015cc0818161018cc083836101bcc06101bc61018c61018cc261015c61018c87c15050505050506104146103e48b8b8787828161015cc2838261018cc261018c61012c6101bcc16101bc61015c86c061018c61015c61015cc0818161018cc083836101bcc06101bc61018c61018cc261015c61018c87c15050505050506104746104448d8d8989828161015cc2838261018cc261018c61012c6101bcc16101bc61015c86c061018c61015c61015cc0818161018cc083836101bcc06101bc61018c61018cc261015c61018c87c150505050505061028461025487878585828186c0838287c05050505050506102e46102b48d8d8b8b828186c0838287c05050505050506103446103146102e46102b4610284610254828161015cc2838261018cc261018c61012c6101bcc16101bc61015c86c061018c61015c61015cc0818161018cc083836101bcc06101bc61018c61018cc261015c61018c87c15050505050506102846102546103b4610384610474610444828186c0838287c05050505050506102e46102b4610284610254610344610314828186c1838287c15050505050508c60f001603081036102e46102b46104146103e4828186c0838287c050505050505061028461025485858585828186c0838287c05050505050506102e46102b48b8b8b8b828186c0838287c05050505050506103446103146102e46102b4610284610254828161015cc2838261018cc261018c61012c6101bcc16101bc61015c86c061018c61015c61015cc0818161018cc083836101bcc06101bc61018c61018cc261015c61018c87c15050505050506102846102546104146103e46103b4610384828186c0838287c05050505050506102e46102b4610284610254610344610314828186c1838287c1505050505050610284610254610474610444818184c1818185c0505050508c609001603081036102e46102b4610284610254828186c0838287c050505050505061028461025487878787828186c0838287c05050505050506102e46102b48d8d8d8d828186c0838287c05050505050506103446103146102e46102b4610284610254828161015cc2838261018cc261018c61012c6101bcc16101bc61015c86c061018c61015c61015cc0818161018cc083836101bcc06101bc61018c61018cc261015c61018c87c15050505050506102846102546104746104446104146103e4828186c0838287c05050505050506102e46102b4610284610254610344610314828186c1838287c15050505050506103446103146102e46102b4818184c1818185c0505050508c603001603081036103b4610384610344610314828186c0838287c0505050505050505050505050505050505050506105dc6104b0600091908160f001918060c00191816090019180606001918160300191908060f001908060c001908060900190806060019080603001906103b461038489898585828161015cc2838261018cc261018c61012c6101bcc16101bc61015c86c061018c61015c61015cc0818161018cc083836101bcc06101bc61018c61018cc261015c61018c87c15050505050506104146103e48b8b8787828161015cc2838261018cc261018c61012c6101bcc16101bc61015c86c061018c61015c61015cc0818161018cc083836101bcc06101bc61018c61018cc261015c61018c87c15050505050506104746104448d8d8989828161015cc2838261018cc261018c61012c6101bcc16101bc61015c86c061018c61015c61015cc0818161018cc083836101bcc06101bc61018c61018cc261015c61018c87c150505050505061028461025487878585828186c0838287c05050505050506102e46102b48d8d8b8b828186c0838287c05050505050506103446103146102e46102b4610284610254828161015cc2838261018cc261018c61012c6101bcc16101bc61015c86c061018c61015c61015cc0818161018cc083836101bcc06101bc61018c61018cc261015c61018c87c15050505050506102846102546103b4610384610474610444828186c0838287c05050505050506102e46102b4610284610254610344610314828186c1838287c15050505050508c60f001603081036102e46102b46104146103e4828186c0838287c050505050505061028461025485858585828186c0838287c05050505050506102e46102b48b8b8b8b828186c0838287c05050505050506103446103146102e46102b4610284610254828161015cc2838261018cc261018c61012c6101bcc16101bc61015c86c061018c61015c61015cc0818161018cc083836101bcc06101bc61018c61018cc261015c61018c87c15050505050506102846102546104146103e46103b4610384828186c0838287c05050505050506102e46102b4610284610254610344610314828186c1838287c1505050505050610284610254610474610444818184c1818185c0505050508c609001603081036102e46102b4610284610254828186c0838287c050505050505061028461025487878787828186c0838287c05050505050506102e46102b48d8d8d8d828186c0838287c05050505050506103446103146102e46102b4610284610254828161015cc2838261018cc261018c61012c6101bcc16101bc61015c86c061018c61015c61015cc0818161018cc083836101bcc06101bc61018c61018cc261015c61018c87c15050505050506102846102546104746104446104146103e4828186c0838287c05050505050506102e46102b4610284610254610344610314828186c1838287c15050505050506103446103146102e46102b4818184c1818185c0505050508c603001603081036103b4610384610344610314828186c0838287c0505050505050505050505050505050505050506105dc6104b0600091908160f001918060c00191816090019180606001918160300191908060f001908060c001908060900190806060019080603001906103b461038489898585828161015cc2838261018cc261018c61012c6101bcc16101bc61015c86c061018c61015c61015cc0818161018cc083836101bcc06101bc61018c61018cc261015c61018c87c15050505050506104146103e48b8b8787828161015cc2838261018cc261018c61012c6101bcc16101bc61015c86c061018c61015c61015cc0818161018cc083836101bcc06101bc61018c61018cc261015c61018c87c15050505050506104746104448d8d8989828161015cc2838261018cc261018c61012c6101bcc16101bc61015c86c061018c61015c61015cc0818161018cc083836101bcc06101bc61018c61018cc261015c61018c87c150505050505061028461025487878585828186c0838287c05050505050506102e46102b48d8d8b8b828186c0838287c05050505050506103446103146102e46102b4610284610254828161015cc2838261018cc261018c61012c6101bcc16101bc61015c86c061018c61015c61015cc0818161018cc083836101bcc06101bc61018c61018cc261015c61018c87c15050505050506102846102546103b4610384610474610444828186c0838287c05050505050506102e46102b4610284610254610344610314828186c1838287c15050505050508c60f001603081036102e46102b46104146103e4828186c0838287c050505050505061028461025485858585828186c0838287c05050505050506102e46102b48b8b8b8b828186c0838287c05050505050506103446103146102e46102b4610284610254828161015cc2838261018cc261018c61012c6101bcc16101bc61015c86c061018c61015c61015cc0818161018cc083836101bcc06101bc61018c61018cc261015c61018c87c15050505050506102846102546104146103e46103b4610384828186c0838287c05050505050506102e46102b4610284610254610344610314828186c1838287c1505050505050610284610254610474610444818184c1818185c0505050508c609001603081036102e46102b4610284610254828186c0838287c050505050505061028461025487878787828186c0838287c05050505050506102e46102b48d8d8d8d828186c0838287c05050505050506103446103146102e46102b4610284610254828161015cc2838261018cc261018c61012c6101bcc16101bc61015c86c061018c61015c61015cc0818161018cc083836101bcc06101bc61018c61018cc261015c61018c87c15050505050506102846102546104746104446104146103e4828186c0838287c05050505050506102e46102b4610284610254610344610314828186c1838287c15050505050506103446103146102e46102b4818184c1818185c0505050508c603001603081036103b4610384610344610314828186c0838287c0505050505050505050505050505050505050506105dc6104b0600091908160f001918060c00191816090019180606001918160300191908060f001908060c001908060900190806060019080603001906103b461038489898585828161015cc2838261018cc261018c61012c6101bcc16101bc61015c86c061018c61015c61015cc0818161018cc083836101bcc06101bc61018c61018cc261015c61018c87c15050505050506104146103e48b8b8787828161015cc2838261018cc261018c61012c6101bcc16101bc61015c86c061018c61015c61015cc0818161018cc083836101bcc06101bc61018c61018cc261015c61018c87c15050505050506104746104448d8d8989828161015cc2838261018cc261018c61012c6101bcc16101bc61015c86c061018c61015c61015cc0818161018cc083836101bcc06101bc61018c61018cc261015c61018c87c150505050505061028461025487878585828186c0838287c05050505050506102e46102b48d8d8b8b828186c0838287c05050505050506103446103146102e46102b4610284610254828161015cc2838261018cc261018c61012c6101bcc16101bc61015c86c061018c61015c61015cc0818161018cc083836101bcc06101bc61018c61018cc261015c61018c87c15050505050506102846102546103b4610384610474610444828186c0838287c05050505050506102e46102b4610284610254610344610314828186c1838287c15050505050508c60f001603081036102e46102b46104146103e4828186c0838287c050505050505061028461025485858585828186c0838287c05050505050506102e46102b48b8b8b8b828186c0838287c05050505050506103446103146102e46102b4610284610254828161015cc2838261018cc261018c61012c6101bcc16101bc61015c86c061018c61015c61015cc0818161018cc083836101bcc06101bc61018c61018cc261015c61018c87c15050505050506102846102546104146103e46103b4610384828186c0838287c05050505050506102e46102b4610284610254610344610314828186c1838287c1505050505050610284610254610474610444818184c1818185c0505050508c609001603081036102e46102b4610284610254828186c0838287c050505050505061028461025487878787828186c0838287c05050505050506102e46102b48d8d8d8d828186c0838287c05050505050506103446103146102e46102b4610284610254828161015cc2838261018cc261018c61012c6101bcc16101bc61015c86c061018c61015c61015cc0818161018cc083836101bcc06101bc61018c61018cc261015c61018c87c15050505050506102846102546104746104446104146103e4828186c0838287c05050505050506102e46102b4610284610254610344610314828186c1838287c15050505050506103446103146102e46102b4818184c1818185c0505050508c603001603081036103b4610384610344610314828186c0838287c0505050505050505050505050505050505050506040612e976103e839600101806087106020026103e80151565b60ff60005360016000f3000000000000000000000000000000000000000000000000000000000000037a0000000000000000000000000000000000000000000000000000000000002e8c",
"data" : "0x",
"gas" : "0x0186a0",
"gasPrice" : "0x0c",
"origin" : "0xcd1722f2947def4cf144679da39c4c32bdc35681",
"value" : "0x0b"
},
"gas" : "0x013874",
"logs" : "0x1dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d49347",
"out" : "0x",
"post" : {
"0x0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6" : {
"balance" : "0x0de0b6b3a7640000",
"code" : "0x",
"nonce" : "0x00",
"storage" : {
}
}
},
"pre" : {
"0x0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6" : {
"balance" : "0x0de0b6b3a7640000",
"code" : "0x",
"nonce" : "0x00",
"storage" : {
}
}
}
}
}
// TODO optmizations
// inline F2M_ADD, F2M_SUB, and MUL_NR2, saving 34 operations
// this is a dummy macro which lets me evaluate arithmetic at compile-time
template<val>
#define macro EVAL_ARITHMETIC = takes(0) returns(1) {
<val>
}
// these are various hard-coded memory offsets which we use for various buffers
#define macro NUM_BYTES = takes(0) returns(1) {
48
}
#define macro F6M_MUL_OUT = takes(0) returns(1) { // 6 values
0
}
#define macro F2M_MUL_BUFFER = takes(0) returns(1) { // 4 values
300
}
#define macro F6M_MUL_R_BUFFER = takes(0) returns(1) { // 6 values, but we have 8 values, first two zeros
500
}
#define macro F6M_MUL_BUFFER_AA_BB_CC = takes(0) returns(1) { // 6 values
900
}
#define macro F6_ABC0 = takes(0) returns(1) { // 6 values
1200
}
#define macro F6_ABC = takes(0) returns(1) { // 6 values
1500
}
#define macro MOD_OFFSET = takes(0) returns(1) { // 1.5 values
1800
}
// next we have various macros for f2m and f6m arithmetic, including multiplication.
#define macro MUL_NR2 = takes(5) returns(0) {
// inputs: &x0, &x1, &out0, &out1
// outputs: out0,out1 := x0-x1, x0+x1
dup2 // x1
dup2 // x0
dup5 // out0
submod384
dup2 // x1
dup2 // x0
dup6 // out1
addmod384
pop
pop
pop
pop
}
#define macro F2M_ADD = takes(7) returns(0) {
// &x0, &x1, &y0, &y1, &out0, &out1
// outputs: out0,out1 := x0+y0, x1+y1
dup3 // y0
dup2 // x0
dup7 // out0
addmod384
dup4 // y1
dup3 // x1
dup8 // out1
addmod384
pop
pop
pop
pop
pop
pop
}
#define macro F2M_SUB = takes(7) returns(0) {
// inputs: &x0, &x1, &y0, &y1, &out0, &out1
// outputs: out0,out1 := x0-y0, x1-y1
dup3 // y0
dup2 // x0
dup7 // out0
submod384
dup4 // y1
dup3 // x1
dup8 // out1
submod384
pop
pop
pop
pop
pop
pop
}
#define macro F2M_MUL = takes(4) returns(0) {
// input stack shoud be:
// &x0 &x1 &y0 &y1 &out0 &out1
// where &out is top of stack, and x is the 48-byte value at memory location &x
// Will use memory offsets for temporary values
// F2M_MUL_BUFFER()+NUM_BYTES*0 // &zero <- we assume this is always zero for NUM_BYTES bytes
// F2M_MUL_BUFFER()+NUM_BYTES*1 // &tmp1
// F2M_MUL_BUFFER()+NUM_BYTES*2 // &tmp2
// F2M_MUL_BUFFER()+NUM_BYTES*3 // &tmp3
// &tmp1 = x0*y0
dup3 // &y0
dup2 // &x0
EVAL_ARITHMETIC<F2M_MUL_BUFFER+NUM_BYTES*1>() // &tmp1
mulmodmont384
// &tmp2 = x1*y1
dup4 // &y1
dup3 // &x1
EVAL_ARITHMETIC<F2M_MUL_BUFFER+NUM_BYTES*2>() // &tmp2
mulmodmont384
// &tmp3 = 0-&tmp2
EVAL_ARITHMETIC<F2M_MUL_BUFFER+NUM_BYTES*2>() // &tmp2
EVAL_ARITHMETIC<F2M_MUL_BUFFER+NUM_BYTES*0>() // &zero
EVAL_ARITHMETIC<F2M_MUL_BUFFER+NUM_BYTES*3>() // &tmp3
submod384
// &out0 = &tmp1 + &tmp3
EVAL_ARITHMETIC<F2M_MUL_BUFFER+NUM_BYTES*3>() // &tmp3
EVAL_ARITHMETIC<F2M_MUL_BUFFER+NUM_BYTES*1>() // &tmp1
dup7 // &out0
addmod384
// &tmp1 = &tmp1 + &tmp2
EVAL_ARITHMETIC<F2M_MUL_BUFFER+NUM_BYTES*2>() // &tmp2
EVAL_ARITHMETIC<F2M_MUL_BUFFER+NUM_BYTES*1>() // &tmp1
EVAL_ARITHMETIC<F2M_MUL_BUFFER+NUM_BYTES*1>() // &tmp1
addmod384
// recall, stack looks like:
// &x0 &x1 &y0 &y1 &out0 &out1
// &tmp2 = &x0 + &x1
dup2 // &x1
dup2 // &x0
EVAL_ARITHMETIC<F2M_MUL_BUFFER+NUM_BYTES*2>() // &tmp2
addmod384
// &tmp3 = &y0 + &y1
dup4 // &y1
dup4 // &y0
EVAL_ARITHMETIC<F2M_MUL_BUFFER+NUM_BYTES*3>() // &tmp3
addmod384
// &tmp2 = &tmp2 * &tmp3
EVAL_ARITHMETIC<F2M_MUL_BUFFER+NUM_BYTES*3>() // &tmp3
EVAL_ARITHMETIC<F2M_MUL_BUFFER+NUM_BYTES*2>() // &tmp2
EVAL_ARITHMETIC<F2M_MUL_BUFFER+NUM_BYTES*2>() // &tmp2
mulmodmont384
// &out1 = &tmp2 - &tmp1
EVAL_ARITHMETIC<F2M_MUL_BUFFER+NUM_BYTES*1>() // &tmp1
EVAL_ARITHMETIC<F2M_MUL_BUFFER+NUM_BYTES*2>() // &tmp2
dup8 // &out1
submod384
// clear stack
pop
pop
pop
pop
pop
pop
}
#define macro F6M_MUL_r2 = takes(0) returns(0) {
// stack will remain: &a0 &a1 &b0 &b1 &c0 &c1 &A0 &A1 &B0 &B1 &C0 &C1 &r
// output: r2 := ((a + c) * (A + C) - (a * A + c * C)) + bB
// tmp1 := a + c
EVAL_ARITHMETIC<F6M_MUL_R_BUFFER+NUM_BYTES*2*1+1*NUM_BYTES>() // &tmp11
EVAL_ARITHMETIC<F6M_MUL_R_BUFFER+NUM_BYTES*2*1+0*NUM_BYTES>() // &tmp10
dup8 // &c1
dup8 // &c0
dup6 // &a1
dup6 // &a0
F2M_ADD()
// tmp2 := A + C
EVAL_ARITHMETIC<F6M_MUL_R_BUFFER+NUM_BYTES*2*2+1*NUM_BYTES>() // &tmp21
EVAL_ARITHMETIC<F6M_MUL_R_BUFFER+NUM_BYTES*2*2+0*NUM_BYTES>() // &tmp20
dup14 // &C1
dup14 // &C0
dup12 // &A1
dup12 // &A0
F2M_ADD()
// tmp3 := tmp1 * tmp2
EVAL_ARITHMETIC<F6M_MUL_R_BUFFER+NUM_BYTES*2*3+1*NUM_BYTES>() // &tmp31
EVAL_ARITHMETIC<F6M_MUL_R_BUFFER+NUM_BYTES*2*3+0*NUM_BYTES>() // &tmp30
EVAL_ARITHMETIC<F6M_MUL_R_BUFFER+NUM_BYTES*2*2+1*NUM_BYTES>() // &tmp21
EVAL_ARITHMETIC<F6M_MUL_R_BUFFER+NUM_BYTES*2*2+0*NUM_BYTES>() // &tmp20
EVAL_ARITHMETIC<F6M_MUL_R_BUFFER+NUM_BYTES*2*1+1*NUM_BYTES>() // &tmp11
EVAL_ARITHMETIC<F6M_MUL_R_BUFFER+NUM_BYTES*2*1+0*NUM_BYTES>() // &tmp10
F2M_MUL()
// tmp1 := aA + cC
EVAL_ARITHMETIC<F6M_MUL_R_BUFFER+NUM_BYTES*2*1+1*NUM_BYTES>() // &tmp11
EVAL_ARITHMETIC<F6M_MUL_R_BUFFER+NUM_BYTES*2*1+0*NUM_BYTES>() // &tmp10
EVAL_ARITHMETIC<F6M_MUL_BUFFER_AA_BB_CC+NUM_BYTES*2*0+1*NUM_BYTES>() // &aA1
EVAL_ARITHMETIC<F6M_MUL_BUFFER_AA_BB_CC+NUM_BYTES*2*0+0*NUM_BYTES>() // &aA0
EVAL_ARITHMETIC<F6M_MUL_BUFFER_AA_BB_CC+NUM_BYTES*2*2+1*NUM_BYTES>() // &cC1
EVAL_ARITHMETIC<F6M_MUL_BUFFER_AA_BB_CC+NUM_BYTES*2*2+0*NUM_BYTES>() // &cC0
F2M_ADD()
// tmp2 := tmp3 - tmp1
EVAL_ARITHMETIC<F6M_MUL_R_BUFFER+NUM_BYTES*2*2+1*NUM_BYTES>() // &tmp21
EVAL_ARITHMETIC<F6M_MUL_R_BUFFER+NUM_BYTES*2*2+0*NUM_BYTES>() // &tmp20
EVAL_ARITHMETIC<F6M_MUL_R_BUFFER+NUM_BYTES*2*1+1*NUM_BYTES>() // &tmp11
EVAL_ARITHMETIC<F6M_MUL_R_BUFFER+NUM_BYTES*2*1+0*NUM_BYTES>() // &tmp10
EVAL_ARITHMETIC<F6M_MUL_R_BUFFER+NUM_BYTES*2*3+1*NUM_BYTES>() // &tmp31
EVAL_ARITHMETIC<F6M_MUL_R_BUFFER+NUM_BYTES*2*3+0*NUM_BYTES>() // &tmp30
F2M_SUB()
// r_2 := bB + tmp2
dup13 EVAL_ARITHMETIC<NUM_BYTES*2*2+1*NUM_BYTES>() add // &r21
NUM_BYTES() dup2 sub // &r20 (=&r21-NUM_BYTES)
EVAL_ARITHMETIC<F6M_MUL_R_BUFFER+NUM_BYTES*2*2+1*NUM_BYTES>() // &tmp21
EVAL_ARITHMETIC<F6M_MUL_R_BUFFER+NUM_BYTES*2*2+0*NUM_BYTES>() // &tmp20
EVAL_ARITHMETIC<F6M_MUL_BUFFER_AA_BB_CC+NUM_BYTES*2*1+1*NUM_BYTES>() // &bB1
EVAL_ARITHMETIC<F6M_MUL_BUFFER_AA_BB_CC+NUM_BYTES*2*1+0*NUM_BYTES>() // &bB0
F2M_ADD()
}
#define macro F6M_MUL_r1 = takes(0) returns(0) {
// stack will remain: &a0 &a1 &b0 &b1 &c0 &c1 &A0 &A1 &B0 &B1 &C0 &C1 &r
// output: r1 := ((a+b * A+B) - aA+bB) + mulNonResidue(cC)
// tmp1 := a + b
EVAL_ARITHMETIC<F6M_MUL_R_BUFFER+NUM_BYTES*2*1+1*NUM_BYTES>() // &tmp11
EVAL_ARITHMETIC<F6M_MUL_R_BUFFER+NUM_BYTES*2*1+0*NUM_BYTES>() // &tmp10
dup6 // &b1
dup6 // &b0
dup6 // &a1
dup6 // &a0
F2M_ADD()
// tmp2 := A + B
EVAL_ARITHMETIC<F6M_MUL_R_BUFFER+NUM_BYTES*2*2+1*NUM_BYTES>() // &tmp21
EVAL_ARITHMETIC<F6M_MUL_R_BUFFER+NUM_BYTES*2*2+0*NUM_BYTES>() // &tmp20
dup12 // &B1
dup12 // &B0
dup12 // &A1
dup12 // &A0
F2M_ADD()
// tmp3 := tmp1 * tmp2
EVAL_ARITHMETIC<F6M_MUL_R_BUFFER+NUM_BYTES*2*3+1*NUM_BYTES>() // &tmp31
EVAL_ARITHMETIC<F6M_MUL_R_BUFFER+NUM_BYTES*2*3+0*NUM_BYTES>() // &tmp30
EVAL_ARITHMETIC<F6M_MUL_R_BUFFER+NUM_BYTES*2*2+1*NUM_BYTES>() // &tmp21
EVAL_ARITHMETIC<F6M_MUL_R_BUFFER+NUM_BYTES*2*2+0*NUM_BYTES>() // &tmp20
EVAL_ARITHMETIC<F6M_MUL_R_BUFFER+NUM_BYTES*2*1+1*NUM_BYTES>() // &tmp11
EVAL_ARITHMETIC<F6M_MUL_R_BUFFER+NUM_BYTES*2*1+0*NUM_BYTES>() // &tmp10
F2M_MUL()
// tmp1 := aA + bB
EVAL_ARITHMETIC<F6M_MUL_R_BUFFER+NUM_BYTES*2*1+1*NUM_BYTES>() // &tmp11
EVAL_ARITHMETIC<F6M_MUL_R_BUFFER+NUM_BYTES*2*1+0*NUM_BYTES>() // &tmp10
EVAL_ARITHMETIC<F6M_MUL_BUFFER_AA_BB_CC+NUM_BYTES*2*1+1*NUM_BYTES>() // &bB1
EVAL_ARITHMETIC<F6M_MUL_BUFFER_AA_BB_CC+NUM_BYTES*2*1+0*NUM_BYTES>() // &bB0
EVAL_ARITHMETIC<F6M_MUL_BUFFER_AA_BB_CC+NUM_BYTES*2*0+1*NUM_BYTES>() // &aA1
EVAL_ARITHMETIC<F6M_MUL_BUFFER_AA_BB_CC+NUM_BYTES*2*0+0*NUM_BYTES>() // &aA0
F2M_ADD()
// tmp2 := tmp3 - tmp1
EVAL_ARITHMETIC<F6M_MUL_R_BUFFER+NUM_BYTES*2*2+1*NUM_BYTES>() // &tmp21
EVAL_ARITHMETIC<F6M_MUL_R_BUFFER+NUM_BYTES*2*2+0*NUM_BYTES>() // &tmp20
EVAL_ARITHMETIC<F6M_MUL_R_BUFFER+NUM_BYTES*2*1+1*NUM_BYTES>() // &tmp11
EVAL_ARITHMETIC<F6M_MUL_R_BUFFER+NUM_BYTES*2*1+0*NUM_BYTES>() // &tmp10
EVAL_ARITHMETIC<F6M_MUL_R_BUFFER+NUM_BYTES*2*3+1*NUM_BYTES>() // &tmp31
EVAL_ARITHMETIC<F6M_MUL_R_BUFFER+NUM_BYTES*2*3+0*NUM_BYTES>() // &tmp30
F2M_SUB()
// tmp1 := mulNonResidue(cC)
EVAL_ARITHMETIC<F6M_MUL_R_BUFFER+NUM_BYTES*2*1+1*NUM_BYTES>() // &tmp11
EVAL_ARITHMETIC<F6M_MUL_R_BUFFER+NUM_BYTES*2*1+0*NUM_BYTES>() // &tmp10
EVAL_ARITHMETIC<F6M_MUL_BUFFER_AA_BB_CC+NUM_BYTES*2*2+1*NUM_BYTES>() // &cC1
EVAL_ARITHMETIC<F6M_MUL_BUFFER_AA_BB_CC+NUM_BYTES*2*2+0*NUM_BYTES>() // &cC0
MUL_NR2()
// r1 := tmp1 + tmp2
dup13 EVAL_ARITHMETIC<NUM_BYTES*2*1+1*NUM_BYTES>() add // &r11
NUM_BYTES() dup2 sub // &r10 (=&r11-NUM_BYTES)
EVAL_ARITHMETIC<F6M_MUL_R_BUFFER+NUM_BYTES*2*2+1*NUM_BYTES>() // &tmp21
EVAL_ARITHMETIC<F6M_MUL_R_BUFFER+NUM_BYTES*2*2+0*NUM_BYTES>() // &tmp20
EVAL_ARITHMETIC<F6M_MUL_R_BUFFER+NUM_BYTES*2*1+1*NUM_BYTES>() // &tmp11
EVAL_ARITHMETIC<F6M_MUL_R_BUFFER+NUM_BYTES*2*1+0*NUM_BYTES>() // &tmp10
F2M_ADD()
}
#define macro F6M_MUL_r0 = takes(0) returns(0) {
// stack will remain: &a0 &a1 &b0 &b1 &c0 &c1 &A0 &A1 &B0 &B1 &C0 &C1 &r
// output: r0 := aA + mulNonResidue((b + c) * (B + C) - (bB + cC))
// tmp1 := b + c
EVAL_ARITHMETIC<F6M_MUL_R_BUFFER+NUM_BYTES*2*1+1*NUM_BYTES>() // &tmp11
EVAL_ARITHMETIC<F6M_MUL_R_BUFFER+NUM_BYTES*2*1+0*NUM_BYTES>() // &tmp10
dup8 // &c1
dup8 // &c0
dup8 // &b1
dup8 // &b0
F2M_ADD()
// tmp2 := B + C
EVAL_ARITHMETIC<F6M_MUL_R_BUFFER+NUM_BYTES*2*2+1*NUM_BYTES>() // &tmp21
EVAL_ARITHMETIC<F6M_MUL_R_BUFFER+NUM_BYTES*2*2+0*NUM_BYTES>() // &tmp20
dup14 // &C1
dup14 // &C0
dup14 // &B1
dup14 // &B0
F2M_ADD()
// tmp3 := tmp1 * tmp2
EVAL_ARITHMETIC<F6M_MUL_R_BUFFER+NUM_BYTES*2*3+1*NUM_BYTES>() // &tmp31
EVAL_ARITHMETIC<F6M_MUL_R_BUFFER+NUM_BYTES*2*3+0*NUM_BYTES>() // &tmp30
EVAL_ARITHMETIC<F6M_MUL_R_BUFFER+NUM_BYTES*2*2+1*NUM_BYTES>() // &tmp21
EVAL_ARITHMETIC<F6M_MUL_R_BUFFER+NUM_BYTES*2*2+0*NUM_BYTES>() // &tmp20
EVAL_ARITHMETIC<F6M_MUL_R_BUFFER+NUM_BYTES*2*1+1*NUM_BYTES>() // &tmp11
EVAL_ARITHMETIC<F6M_MUL_R_BUFFER+NUM_BYTES*2*1+0*NUM_BYTES>() // &tmp10
F2M_MUL()
// tmp1 := bB + cC
EVAL_ARITHMETIC<F6M_MUL_R_BUFFER+NUM_BYTES*2*1+1*NUM_BYTES>() // &tmp11
EVAL_ARITHMETIC<F6M_MUL_R_BUFFER+NUM_BYTES*2*1+0*NUM_BYTES>() // &tmp10
EVAL_ARITHMETIC<F6M_MUL_BUFFER_AA_BB_CC+NUM_BYTES*2*2+1*NUM_BYTES>() // &cC1
EVAL_ARITHMETIC<F6M_MUL_BUFFER_AA_BB_CC+NUM_BYTES*2*2+0*NUM_BYTES>() // &cC0
EVAL_ARITHMETIC<F6M_MUL_BUFFER_AA_BB_CC+NUM_BYTES*2*1+1*NUM_BYTES>() // &bB1
EVAL_ARITHMETIC<F6M_MUL_BUFFER_AA_BB_CC+NUM_BYTES*2*1+0*NUM_BYTES>() // &bB0
F2M_ADD()
// tmp2 := tmp3 - tmp1
EVAL_ARITHMETIC<F6M_MUL_R_BUFFER+NUM_BYTES*2*2+1*NUM_BYTES>() // &tmp21
EVAL_ARITHMETIC<F6M_MUL_R_BUFFER+NUM_BYTES*2*2+0*NUM_BYTES>() // &tmp20
EVAL_ARITHMETIC<F6M_MUL_R_BUFFER+NUM_BYTES*2*1+1*NUM_BYTES>() // &tmp11
EVAL_ARITHMETIC<F6M_MUL_R_BUFFER+NUM_BYTES*2*1+0*NUM_BYTES>() // &tmp10
EVAL_ARITHMETIC<F6M_MUL_R_BUFFER+NUM_BYTES*2*3+1*NUM_BYTES>() // &tmp31
EVAL_ARITHMETIC<F6M_MUL_R_BUFFER+NUM_BYTES*2*3+0*NUM_BYTES>() // &tmp30
F2M_SUB()
// tmp3 := mulNonResidue(tmp2)
EVAL_ARITHMETIC<F6M_MUL_R_BUFFER+NUM_BYTES*2*3+1*NUM_BYTES>() // &tmp31
EVAL_ARITHMETIC<F6M_MUL_R_BUFFER+NUM_BYTES*2*3+0*NUM_BYTES>() // &tmp30
EVAL_ARITHMETIC<F6M_MUL_R_BUFFER+NUM_BYTES*2*2+1*NUM_BYTES>() // &tmp21
EVAL_ARITHMETIC<F6M_MUL_R_BUFFER+NUM_BYTES*2*2+0*NUM_BYTES>() // &tmp20
MUL_NR2()
// r_0 := tmp3 + aA
dup13 EVAL_ARITHMETIC<NUM_BYTES*2*0+1*NUM_BYTES>() add // &r01
NUM_BYTES() dup2 sub // &r00 (=&r01-NUM_BYTES)
EVAL_ARITHMETIC<F6M_MUL_BUFFER_AA_BB_CC+NUM_BYTES*2*0+1*NUM_BYTES>() // &aA1
EVAL_ARITHMETIC<F6M_MUL_BUFFER_AA_BB_CC+NUM_BYTES*2*0+0*NUM_BYTES>() // &aA0
EVAL_ARITHMETIC<F6M_MUL_R_BUFFER+NUM_BYTES*2*3+1*NUM_BYTES>() // &tmp31
EVAL_ARITHMETIC<F6M_MUL_R_BUFFER+NUM_BYTES*2*3+0*NUM_BYTES>() // &tmp30
F2M_ADD()
}
// this is the main macro for f6m_mul
#define macro F6M_MUL = takes(8) returns(0) {
// input stack: &r &abc &ABC
// output r0,r1,r2 := [a, b, c] * [A, B, C]
// 48 96 144 192 240 288
// prepare stack for each function used by f6m_mul
// &a0 &a1 &b0 &b1 &c0 &c1 &A0 &A1 &B0 &B1 &C0 &C1 &r
// then can prepare calls based on this stack
swap2 // &ABC &abc &r
swap1 // &abc &ABC &r
// now convert [&abc &ABC] to [&a0 &a1 &b0 &b1 &c0 &c1 &A0 &A1 &B0 &B1 &C0 &C1]
dup2 240 add // &C1 &abc &ABC
swap2 // &ABC &abc &C1
dup1 192 add // &C0 &ABC &abc &C1
swap2 // &abc &ABC &C0 &C1
dup2 144 add // &B1 &abc &ABC &C0 &C1
swap2 // &ABC &abc &B1 &C0 &C1
dup1 96 add // &B0 &ABC &abc &B1 &C0 &C1
swap2 // &abc &ABC &B0 &B1 &C0 &C1
dup2 48 add // &A1 &abc &ABC &B0 &B1 &C0 &C1
swap2 // &ABC &abc &A1 &B0 &B1 &C0 &C1
swap1 // &abc &ABC &A1 &B0 &B1 &C0 &C1
// but &ABC is &A0, so we have: [&abc &A0 &A1 &B0 &B1 &C0 &C1], the end as desired
// now convert [&abc] to [&a0 &a1 &b0 &b1 &c0 &c1]
dup1 240 add // &c1 &abc
swap1 // &abc &c1
dup1 192 add // &c0 &abc &c1
swap1 // &abc &c0 &c1
dup1 144 add // &b1 &abc &c0 &c1
swap1 // &abc &b1 &c0 &c1
dup1 96 add // &b0 &abc &b1 &c0 &c1
swap1 // &abc &b0 &b1 &c0 &c1
dup1 48 add // &a1 &abc &b0 &b1 &c0 &c1
swap1 // &abc &a1 &b0 &b1 &c0 &c1
// but &abc is &a0, so we have: [&a0 &a1 &b0 &b1 &c0 &c1], as desired
// this completes stack preparation, and this will save us lots of work later
// note: F6M_MUL, F6M_MUL_r0, F6M_MUL_r1, and F6M_MUL_r2 all need a 288-byte temporary memory buffer for aA, bB, cC, each 96 bytes, concatenated
// the start of this buffer will be the constant defined in macro F6M_MUL_BUFFER_AA_BB_CC
// F6M_MUL_BUFFER_AA_BB_CC+NUM_BYTES*2*0+0*NUM_BYTES // &aA0
// F6M_MUL_BUFFER_AA_BB_CC+NUM_BYTES*2*0+1*NUM_BYTES // &aA1
// F6M_MUL_BUFFER_AA_BB_CC+NUM_BYTES*2*1+0*NUM_BYTES // &bB0
// F6M_MUL_BUFFER_AA_BB_CC+NUM_BYTES*2*1+1*NUM_BYTES // &bB1
// F6M_MUL_BUFFER_AA_BB_CC+NUM_BYTES*2*2+0*NUM_BYTES // &cC0
// F6M_MUL_BUFFER_AA_BB_CC+NUM_BYTES*2*2+1*NUM_BYTES // &cC1
// stack: &a0 &a1 &b0 &b1 &c0 &c1 &A0 &A1 &B0 &B1 &C0 &C1 &r
// aA := a * A
EVAL_ARITHMETIC<F6M_MUL_BUFFER_AA_BB_CC+NUM_BYTES*2*0+1*NUM_BYTES>() // &aA1
EVAL_ARITHMETIC<F6M_MUL_BUFFER_AA_BB_CC+NUM_BYTES*2*0+0*NUM_BYTES>() // &aA0
dup10 // A1
dup10 // A0
dup6 // a1
dup6 // a0
F2M_MUL()
// bB := b * B
EVAL_ARITHMETIC<F6M_MUL_BUFFER_AA_BB_CC+NUM_BYTES*2*1+1*NUM_BYTES>() // &bB1
EVAL_ARITHMETIC<F6M_MUL_BUFFER_AA_BB_CC+NUM_BYTES*2*1+0*NUM_BYTES>() // &bB0
dup12 // B1
dup12 // B0
dup8 // b1
dup8 // b0
F2M_MUL()
// cC := c * C
EVAL_ARITHMETIC<F6M_MUL_BUFFER_AA_BB_CC+NUM_BYTES*2*2+1*NUM_BYTES>() // &cC1
EVAL_ARITHMETIC<F6M_MUL_BUFFER_AA_BB_CC+NUM_BYTES*2*2+0*NUM_BYTES>() // &cC0
dup14 // C1
dup14 // C0
dup10 // c1
dup10 // c0
F2M_MUL()
// the stack is already set up for the following
F6M_MUL_r2()
F6M_MUL_r1()
F6M_MUL_r0()
// clear stack
pop
pop
pop
pop
pop
pop
pop
pop
pop
pop
pop
pop
pop
}
///////////////
// f6m_mul test
#define macro F6M_MUL_TEST_HARDCODED = takes(0) returns(0) {
// set up memory
// a0
0x8f2990f3e598f5b1b8f480a3c388306bc023fac151c0104d13ec3aa181599402 EVAL_ARITHMETIC<F6_ABC0+NUM_BYTES*2*0+NUM_BYTES*0>() mstore
0x72d1c8c528a1ce3bcaa280a8e735aa0d00000000000000000000000000000000 EVAL_ARITHMETIC<F6_ABC0+NUM_BYTES*2*0+NUM_BYTES*0+32>() mstore
// a1
0x992d7a27906d4cd530b23a7e8c48c0778f8653fbc3332d63db24339d8bc65d7e EVAL_ARITHMETIC<F6_ABC0+NUM_BYTES*2*0+NUM_BYTES*1>() mstore
0xe83b6e91c6550f5aceab102e88e9180900000000000000000000000000000000 EVAL_ARITHMETIC<F6_ABC0+NUM_BYTES*2*0+NUM_BYTES*1+32>() mstore
// b0
0x7299907146816f08c4c6a394e91374ed6ff3618a57358cfb124ee6ab4c560e5c EVAL_ARITHMETIC<F6_ABC0+NUM_BYTES*2*1+NUM_BYTES*0>() mstore
0xac40700b41e2ee8674680728f0c5a61800000000000000000000000000000000 EVAL_ARITHMETIC<F6_ABC0+NUM_BYTES*2*1+NUM_BYTES*0+32>() mstore
// b1
0x0fd77f62b39eb952a0f8d21cec1f93b1d62dd7923aa86882ddf7dd4d3532b0b7 EVAL_ARITHMETIC<F6_ABC0+NUM_BYTES*2*1+NUM_BYTES*1>() mstore
0xede8f3fc89fa4a79574067e2d9a9d20000000000000000000000000000000000 EVAL_ARITHMETIC<F6_ABC0+NUM_BYTES*2*1+NUM_BYTES*1+32>() mstore
// c0
0x7a69de46b13d8cb4c4833224aaf9ef7ea6a48975ab35c6e123b8539ab84c381a EVAL_ARITHMETIC<F6_ABC0+NUM_BYTES*2*2+NUM_BYTES*0>() mstore
0x2533401a73c4e79f47d714899d01ac1300000000000000000000000000000000 EVAL_ARITHMETIC<F6_ABC0+NUM_BYTES*2*2+NUM_BYTES*0+32>() mstore
// c1
0xa9fa0b0d8156c36a1a9ddacb73ef278f4d149b560e88789f2bfeb9f708b6cc2f EVAL_ARITHMETIC<F6_ABC0+NUM_BYTES*2*2+NUM_BYTES*1>() mstore
0x988927bfe0186d5bf9cb40cb07f21b1800000000000000000000000000000000 EVAL_ARITHMETIC<F6_ABC0+NUM_BYTES*2*2+NUM_BYTES*1+32>() mstore
// A0
0xecd347c808af644c7a3a971a556576f434e302b6b490004fb418a4a7da330a67 EVAL_ARITHMETIC<F6_ABC+NUM_BYTES*2*0+NUM_BYTES*0>() mstore
0x43adeca931169b8b92e91df73ae1e11500000000000000000000000000000000 EVAL_ARITHMETIC<F6_ABC+NUM_BYTES*2*0+NUM_BYTES*0+32>() mstore
// A1
0x12a2829e11e843d764d5e3b80e75432d93f69b23ad79c38d43ebbc9bd2b17b9e EVAL_ARITHMETIC<F6_ABC+NUM_BYTES*2*0+NUM_BYTES*1>() mstore
0x903033351357b03602624762e5ad360d00000000000000000000000000000000 EVAL_ARITHMETIC<F6_ABC+NUM_BYTES*2*0+NUM_BYTES*1+32>() mstore
// B0
0xd7f9857dce663301f393f9fac66f5c49168494e0d20797a6c4f96327ed4fa47d EVAL_ARITHMETIC<F6_ABC+NUM_BYTES*2*1+NUM_BYTES*0>() mstore
0xd36d0078d217a712407d35046871d40f00000000000000000000000000000000 EVAL_ARITHMETIC<F6_ABC+NUM_BYTES*2*1+NUM_BYTES*0+32>() mstore
// B1
0x2f1b767f6c1ec190eb76a0bce7906ad2e4a7548d03e8aa745e34e1bf49d83ad6 EVAL_ARITHMETIC<F6_ABC+NUM_BYTES*2*1+NUM_BYTES*1>() mstore
0x4c04f57fb4d31039cb4cf01987fda21300000000000000000000000000000000 EVAL_ARITHMETIC<F6_ABC+NUM_BYTES*2*1+NUM_BYTES*1+32>() mstore
// C0
0x7b3f8da2f2ae47885890b0d433a3eeed2f9f37cbcfc444e4f1d880390fcdb765 EVAL_ARITHMETIC<F6_ABC+NUM_BYTES*2*2+NUM_BYTES*0>() mstore
0x18d558857be01b2b10a8010bcdc6d60600000000000000000000000000000000 EVAL_ARITHMETIC<F6_ABC+NUM_BYTES*2*2+NUM_BYTES*0+32>() mstore
// C1
0x319c02f6132c8a786377868b5825ada9a5fe303e9ae3b03ce56e90734a17ce97 EVAL_ARITHMETIC<F6_ABC+NUM_BYTES*2*2+NUM_BYTES*1>() mstore
0x0c88b321012cf8dabb58211e3d50f61000000000000000000000000000000000 EVAL_ARITHMETIC<F6_ABC+NUM_BYTES*2*2+NUM_BYTES*1+32>() mstore
// set up stack for call to f6m_mul
// input stack: &r &abc &ABC
F6_ABC() // ABC
F6_ABC0() // abc
F6M_MUL_OUT() // out
F6M_MUL()
// return output
288 F6M_MUL_OUT() return
/*
output should be:
f4f3f4e0a35068eaac665aee2e71f682aecd20923b420023b6d5420ba01ea98287c314107a998a650ab3247ef39c920e
2c9620d993a22bade623d165a9f4aa648af87cb7292b7821c0fcd0adcd14ba655da54df2ad93262e24fc62bcd97e7208
ead1838e6c5e168543093c87eaeb576f940670026292dcb7a812600f4fb20a281be71ce1ef79f675e4a283b73906ca17
9c8b2c76405445b20dd7635d562309f69c2c87601d9055a5e10df2ea1d28237fafd0d32f7e8c19d4cd5a3d1ef65b120b
40591ef0c74dbec983b7bef145a87957c1e09049dbc85fbb3e9bb1174892ee83294ef8c4a5954fffbff4ca6aca74c718
9b242b8f1c5d63bb525121bd68eda084ab7e6d015052d5adeb79ddb24091d2a8e5b1da00212d0e6c11f01d23790113
*/
}
//////////////////
// f6m_mul bench
#define macro F6M_MUL_BENCH_NUM_ITERS = takes(0) returns(1) {
135
}
#define jumptable F6M_MUL_BENCH_JUMP_TABLE {
loop done
}
#define macro F6M_MUL_BENCH = takes(0) returns(0) {
// set up memory
// a0
0x8f2990f3e598f5b1b8f480a3c388306bc023fac151c0104d13ec3aa181599402 EVAL_ARITHMETIC<F6_ABC0+NUM_BYTES*2*0+NUM_BYTES*0>() mstore
0x72d1c8c528a1ce3bcaa280a8e735aa0d00000000000000000000000000000000 EVAL_ARITHMETIC<F6_ABC0+NUM_BYTES*2*0+NUM_BYTES*0+32>() mstore
// a1
0x992d7a27906d4cd530b23a7e8c48c0778f8653fbc3332d63db24339d8bc65d7e EVAL_ARITHMETIC<F6_ABC0+NUM_BYTES*2*0+NUM_BYTES*1>() mstore
0xe83b6e91c6550f5aceab102e88e9180900000000000000000000000000000000 EVAL_ARITHMETIC<F6_ABC0+NUM_BYTES*2*0+NUM_BYTES*1+32>() mstore
// b0
0x7299907146816f08c4c6a394e91374ed6ff3618a57358cfb124ee6ab4c560e5c EVAL_ARITHMETIC<F6_ABC0+NUM_BYTES*2*1+NUM_BYTES*0>() mstore
0xac40700b41e2ee8674680728f0c5a61800000000000000000000000000000000 EVAL_ARITHMETIC<F6_ABC0+NUM_BYTES*2*1+NUM_BYTES*0+32>() mstore
// b1
0x0fd77f62b39eb952a0f8d21cec1f93b1d62dd7923aa86882ddf7dd4d3532b0b7 EVAL_ARITHMETIC<F6_ABC0+NUM_BYTES*2*1+NUM_BYTES*1>() mstore
0xede8f3fc89fa4a79574067e2d9a9d20000000000000000000000000000000000 EVAL_ARITHMETIC<F6_ABC0+NUM_BYTES*2*1+NUM_BYTES*1+32>() mstore
// c0
0x7a69de46b13d8cb4c4833224aaf9ef7ea6a48975ab35c6e123b8539ab84c381a EVAL_ARITHMETIC<F6_ABC0+NUM_BYTES*2*2+NUM_BYTES*0>() mstore
0x2533401a73c4e79f47d714899d01ac1300000000000000000000000000000000 EVAL_ARITHMETIC<F6_ABC0+NUM_BYTES*2*2+NUM_BYTES*0+32>() mstore
// c1
0xa9fa0b0d8156c36a1a9ddacb73ef278f4d149b560e88789f2bfeb9f708b6cc2f EVAL_ARITHMETIC<F6_ABC0+NUM_BYTES*2*2+NUM_BYTES*1>() mstore
0x988927bfe0186d5bf9cb40cb07f21b1800000000000000000000000000000000 EVAL_ARITHMETIC<F6_ABC0+NUM_BYTES*2*2+NUM_BYTES*1+32>() mstore
// A0
0xecd347c808af644c7a3a971a556576f434e302b6b490004fb418a4a7da330a67 EVAL_ARITHMETIC<F6_ABC+NUM_BYTES*2*0+NUM_BYTES*0>() mstore
0x43adeca931169b8b92e91df73ae1e11500000000000000000000000000000000 EVAL_ARITHMETIC<F6_ABC+NUM_BYTES*2*0+NUM_BYTES*0+32>() mstore
// A1
0x12a2829e11e843d764d5e3b80e75432d93f69b23ad79c38d43ebbc9bd2b17b9e EVAL_ARITHMETIC<F6_ABC+NUM_BYTES*2*0+NUM_BYTES*1>() mstore
0x903033351357b03602624762e5ad360d00000000000000000000000000000000 EVAL_ARITHMETIC<F6_ABC+NUM_BYTES*2*0+NUM_BYTES*1+32>() mstore
// B0
0xd7f9857dce663301f393f9fac66f5c49168494e0d20797a6c4f96327ed4fa47d EVAL_ARITHMETIC<F6_ABC+NUM_BYTES*2*1+NUM_BYTES*0>() mstore
0xd36d0078d217a712407d35046871d40f00000000000000000000000000000000 EVAL_ARITHMETIC<F6_ABC+NUM_BYTES*2*1+NUM_BYTES*0+32>() mstore
// B1
0x2f1b767f6c1ec190eb76a0bce7906ad2e4a7548d03e8aa745e34e1bf49d83ad6 EVAL_ARITHMETIC<F6_ABC+NUM_BYTES*2*1+NUM_BYTES*1>() mstore
0x4c04f57fb4d31039cb4cf01987fda21300000000000000000000000000000000 EVAL_ARITHMETIC<F6_ABC+NUM_BYTES*2*1+NUM_BYTES*1+32>() mstore
// C0
0x7b3f8da2f2ae47885890b0d433a3eeed2f9f37cbcfc444e4f1d880390fcdb765 EVAL_ARITHMETIC<F6_ABC+NUM_BYTES*2*2+NUM_BYTES*0>() mstore
0x18d558857be01b2b10a8010bcdc6d60600000000000000000000000000000000 EVAL_ARITHMETIC<F6_ABC+NUM_BYTES*2*2+NUM_BYTES*0+32>() mstore
// C1
0x319c02f6132c8a786377868b5825ada9a5fe303e9ae3b03ce56e90734a17ce97 EVAL_ARITHMETIC<F6_ABC+NUM_BYTES*2*2+NUM_BYTES*1>() mstore
0x0c88b321012cf8dabb58211e3d50f61000000000000000000000000000000000 EVAL_ARITHMETIC<F6_ABC+NUM_BYTES*2*2+NUM_BYTES*1+32>() mstore
// prepare for loop
1 // iterator, starts at 1 and grows
loop:
// set up stack for call to f6m_mul
F6_ABC() // ABC
F6_ABC0() // abc
F6M_MUL_OUT() // out
F6M_MUL()
// set up stack for call to f6m_mul
F6_ABC() // ABC
F6_ABC0() // abc
F6M_MUL_OUT() // out
F6M_MUL()
// set up stack for call to f6m_mul
F6_ABC() // ABC
F6_ABC0() // abc
F6M_MUL_OUT() // out
F6M_MUL()
// set up stack for call to f6m_mul
F6_ABC() // ABC
F6_ABC0() // abc
F6M_MUL_OUT() // out
F6M_MUL()
// set up stack for call to f6m_mul
F6_ABC() // ABC
F6_ABC0() // abc
F6M_MUL_OUT() // out
F6M_MUL()
// set up stack for call to f6m_mul
F6_ABC() // ABC
F6_ABC0() // abc
F6M_MUL_OUT() // out
F6M_MUL()
// set up stack for call to f6m_mul
F6_ABC() // ABC
F6_ABC0() // abc
F6M_MUL_OUT() // out
F6M_MUL()
// set up stack for call to f6m_mul
F6_ABC() // ABC
F6_ABC0() // abc
F6M_MUL_OUT() // out
F6M_MUL()
// set up stack for call to f6m_mul
F6_ABC() // ABC
F6_ABC0() // abc
F6M_MUL_OUT() // out
F6M_MUL()
// set up stack for call to f6m_mul
F6_ABC() // ABC
F6_ABC0() // abc
F6M_MUL_OUT() // out
F6M_MUL()
__tablesize(F6M_MUL_BENCH_JUMP_TABLE) __tablestart(F6M_MUL_BENCH_JUMP_TABLE) 1000 codecopy // copy jumpdests to memory offset 3000, clobbering whatever is there
1 add // increment [iterator+1]
dup1 F6M_MUL_BENCH_NUM_ITERS() lt // compare to max number of iters [iterator+1 0_or_1]
32 mul 1000 add // offset to jump to [iterator+1 1000_or_1032]
mload jump // where the number before lt is iter_count
done:
0xff 0 mstore8 1 0 return // return a single byte, 0xff, to make sure it executed this far
//stop
}
{
"f6m_mul_v4" : {
"_info" : {
"comment" : "",
"filledwith" : "testeth 1.8.0-6+commit.c7ba3b69",
"lllcversion" : "Version: 0.5.14-develop.2019.11.27+commit.8f259595.Linux.g++",
"source" : "src/VMTestsFiller/vmArithmeticTest/add0Filler.json",
"sourceHash" : "c1480bf5e662b7f6518d4b003e14575c6bdab286e2d8763e1b0be9a186bec775"
},
"callcreates" : [
],
"env" : {
"currentCoinbase" : "0x2adc25665018aa1fe0e6bc666dac8fc2697ff9ba",
"currentDifficulty" : "0x020000",
"currentGasLimit" : "0x7fffffffffffffff",
"currentNumber" : "0x01",
"currentTimestamp" : "0x03e8"
},
"exec" : {
"address" : "0x0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6",
"caller" : "0xcd1722f2947def4cf144679da39c4c32bdc35681",
"code" : "0x7f8f2990f3e598f5b1b8f480a3c388306bc023fac151c0104d13ec3aa1815994026104b0527f72d1c8c528a1ce3bcaa280a8e735aa0d000000000000000000000000000000006104d0527f992d7a27906d4cd530b23a7e8c48c0778f8653fbc3332d63db24339d8bc65d7e6104e0527fe83b6e91c6550f5aceab102e88e9180900000000000000000000000000000000610500527f7299907146816f08c4c6a394e91374ed6ff3618a57358cfb124ee6ab4c560e5c610510527fac40700b41e2ee8674680728f0c5a61800000000000000000000000000000000610530527f0fd77f62b39eb952a0f8d21cec1f93b1d62dd7923aa86882ddf7dd4d3532b0b7610540527fede8f3fc89fa4a79574067e2d9a9d20000000000000000000000000000000000610560527f7a69de46b13d8cb4c4833224aaf9ef7ea6a48975ab35c6e123b8539ab84c381a610570527f2533401a73c4e79f47d714899d01ac1300000000000000000000000000000000610590527fa9fa0b0d8156c36a1a9ddacb73ef278f4d149b560e88789f2bfeb9f708b6cc2f6105a0527f988927bfe0186d5bf9cb40cb07f21b18000000000000000000000000000000006105c0527fecd347c808af644c7a3a971a556576f434e302b6b490004fb418a4a7da330a676105dc527f43adeca931169b8b92e91df73ae1e115000000000000000000000000000000006105fc527f12a2829e11e843d764d5e3b80e75432d93f69b23ad79c38d43ebbc9bd2b17b9e61060c527f903033351357b03602624762e5ad360d0000000000000000000000000000000061062c527fd7f9857dce663301f393f9fac66f5c49168494e0d20797a6c4f96327ed4fa47d61063c527fd36d0078d217a712407d35046871d40f0000000000000000000000000000000061065c527f2f1b767f6c1ec190eb76a0bce7906ad2e4a7548d03e8aa745e34e1bf49d83ad661066c527f4c04f57fb4d31039cb4cf01987fda2130000000000000000000000000000000061068c527f7b3f8da2f2ae47885890b0d433a3eeed2f9f37cbcfc444e4f1d880390fcdb76561069c527f18d558857be01b2b10a8010bcdc6d606000000000000000000000000000000006106bc527f319c02f6132c8a786377868b5825ada9a5fe303e9ae3b03ce56e90734a17ce976106cc527f0c88b321012cf8dabb58211e3d50f610000000000000000000000000000000006106ec526105dc6104b0600091908160f001918060c00191816090019180606001918160300191908060f001908060c001908060900190806060019080603001906103b461038489898585828161015cc2838261018cc261018c61012c6101bcc16101bc61015c86c061018c61015c61015cc0818161018cc083836101bcc06101bc61018c61018cc261015c61018c87c15050505050506104146103e48b8b8787828161015cc2838261018cc261018c61012c6101bcc16101bc61015c86c061018c61015c61015cc0818161018cc083836101bcc06101bc61018c61018cc261015c61018c87c15050505050506104746104448d8d8989828161015cc2838261018cc261018c61012c6101bcc16101bc61015c86c061018c61015c61015cc0818161018cc083836101bcc06101bc61018c61018cc261015c61018c87c150505050505061028461025487878585828186c0838287c05050505050506102e46102b48d8d8b8b828186c0838287c05050505050506103446103146102e46102b4610284610254828161015cc2838261018cc261018c61012c6101bcc16101bc61015c86c061018c61015c61015cc0818161018cc083836101bcc06101bc61018c61018cc261015c61018c87c15050505050506102846102546103b4610384610474610444828186c0838287c05050505050506102e46102b4610284610254610344610314828186c1838287c15050505050508c60f001603081036102e46102b46104146103e4828186c0838287c050505050505061028461025485858585828186c0838287c05050505050506102e46102b48b8b8b8b828186c0838287c05050505050506103446103146102e46102b4610284610254828161015cc2838261018cc261018c61012c6101bcc16101bc61015c86c061018c61015c61015cc0818161018cc083836101bcc06101bc61018c61018cc261015c61018c87c15050505050506102846102546104146103e46103b4610384828186c0838287c05050505050506102e46102b4610284610254610344610314828186c1838287c1505050505050610284610254610474610444818184c1818185c0505050508c609001603081036102e46102b4610284610254828186c0838287c050505050505061028461025487878787828186c0838287c05050505050506102e46102b48d8d8d8d828186c0838287c05050505050506103446103146102e46102b4610284610254828161015cc2838261018cc261018c61012c6101bcc16101bc61015c86c061018c61015c61015cc0818161018cc083836101bcc06101bc61018c61018cc261015c61018c87c15050505050506102846102546104746104446104146103e4828186c0838287c05050505050506102e46102b4610284610254610344610314828186c1838287c15050505050506103446103146102e46102b4818184c1818185c0505050508c603001603081036103b4610384610344610314828186c0838287c0505050505050505050505050505050505050506101206000f3",
"data" : "0x",
"gas" : "0x0186a0",
"gasPrice" : "0x0c",
"origin" : "0xcd1722f2947def4cf144679da39c4c32bdc35681",
"value" : "0x0b"
},
"gas" : "0x013874",
"logs" : "0x1dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d49347",
"out" : "0x",
"post" : {
"0x0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6" : {
"balance" : "0x0de0b6b3a7640000",
"code" : "0x",
"nonce" : "0x00",
"storage" : {
}
}
},
"pre" : {
"0x0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6" : {
"balance" : "0x0de0b6b3a7640000",
"code" : "0x",
"nonce" : "0x00",
"storage" : {
}
}
}
}
}
{
"f6m_mul_v4_bench" : {
"_info" : {
"comment" : "",
"filledwith" : "testeth 1.8.0-6+commit.c7ba3b69",
"lllcversion" : "Version: 0.5.14-develop.2019.11.27+commit.8f259595.Linux.g++",
"source" : "src/VMTestsFiller/vmArithmeticTest/add0Filler.json",
"sourceHash" : "c1480bf5e662b7f6518d4b003e14575c6bdab286e2d8763e1b0be9a186bec775"
},
"callcreates" : [
],
"env" : {
"currentCoinbase" : "0x2adc25665018aa1fe0e6bc666dac8fc2697ff9ba",
"currentDifficulty" : "0x020000",
"currentGasLimit" : "0x7fffffffffffffff",
"currentNumber" : "0x01",
"currentTimestamp" : "0x03e8"
},
"exec" : {
"address" : "0x0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6",
"caller" : "0xcd1722f2947def4cf144679da39c4c32bdc35681",
"code" : "0x7f8f2990f3e598f5b1b8f480a3c388306bc023fac151c0104d13ec3aa1815994026104b0527f72d1c8c528a1ce3bcaa280a8e735aa0d000000000000000000000000000000006104d0527f992d7a27906d4cd530b23a7e8c48c0778f8653fbc3332d63db24339d8bc65d7e6104e0527fe83b6e91c6550f5aceab102e88e9180900000000000000000000000000000000610500527f7299907146816f08c4c6a394e91374ed6ff3618a57358cfb124ee6ab4c560e5c610510527fac40700b41e2ee8674680728f0c5a61800000000000000000000000000000000610530527f0fd77f62b39eb952a0f8d21cec1f93b1d62dd7923aa86882ddf7dd4d3532b0b7610540527fede8f3fc89fa4a79574067e2d9a9d20000000000000000000000000000000000610560527f7a69de46b13d8cb4c4833224aaf9ef7ea6a48975ab35c6e123b8539ab84c381a610570527f2533401a73c4e79f47d714899d01ac1300000000000000000000000000000000610590527fa9fa0b0d8156c36a1a9ddacb73ef278f4d149b560e88789f2bfeb9f708b6cc2f6105a0527f988927bfe0186d5bf9cb40cb07f21b18000000000000000000000000000000006105c0527fecd347c808af644c7a3a971a556576f434e302b6b490004fb418a4a7da330a676105dc527f43adeca931169b8b92e91df73ae1e115000000000000000000000000000000006105fc527f12a2829e11e843d764d5e3b80e75432d93f69b23ad79c38d43ebbc9bd2b17b9e61060c527f903033351357b03602624762e5ad360d0000000000000000000000000000000061062c527fd7f9857dce663301f393f9fac66f5c49168494e0d20797a6c4f96327ed4fa47d61063c527fd36d0078d217a712407d35046871d40f0000000000000000000000000000000061065c527f2f1b767f6c1ec190eb76a0bce7906ad2e4a7548d03e8aa745e34e1bf49d83ad661066c527f4c04f57fb4d31039cb4cf01987fda2130000000000000000000000000000000061068c527f7b3f8da2f2ae47885890b0d433a3eeed2f9f37cbcfc444e4f1d880390fcdb76561069c527f18d558857be01b2b10a8010bcdc6d606000000000000000000000000000000006106bc527f319c02f6132c8a786377868b5825ada9a5fe303e9ae3b03ce56e90734a17ce976106cc527f0c88b321012cf8dabb58211e3d50f610000000000000000000000000000000006106ec5260015b6105dc6104b0600091908160f001918060c00191816090019180606001918160300191908060f001908060c001908060900190806060019080603001906103b461038489898585828161015cc2838261018cc261018c61012c6101bcc16101bc61015c86c061018c61015c61015cc0818161018cc083836101bcc06101bc61018c61018cc261015c61018c87c15050505050506104146103e48b8b8787828161015cc2838261018cc261018c61012c6101bcc16101bc61015c86c061018c61015c61015cc0818161018cc083836101bcc06101bc61018c61018cc261015c61018c87c15050505050506104746104448d8d8989828161015cc2838261018cc261018c61012c6101bcc16101bc61015c86c061018c61015c61015cc0818161018cc083836101bcc06101bc61018c61018cc261015c61018c87c150505050505061028461025487878585828186c0838287c05050505050506102e46102b48d8d8b8b828186c0838287c05050505050506103446103146102e46102b4610284610254828161015cc2838261018cc261018c61012c6101bcc16101bc61015c86c061018c61015c61015cc0818161018cc083836101bcc06101bc61018c61018cc261015c61018c87c15050505050506102846102546103b4610384610474610444828186c0838287c05050505050506102e46102b4610284610254610344610314828186c1838287c15050505050508c60f001603081036102e46102b46104146103e4828186c0838287c050505050505061028461025485858585828186c0838287c05050505050506102e46102b48b8b8b8b828186c0838287c05050505050506103446103146102e46102b4610284610254828161015cc2838261018cc261018c61012c6101bcc16101bc61015c86c061018c61015c61015cc0818161018cc083836101bcc06101bc61018c61018cc261015c61018c87c15050505050506102846102546104146103e46103b4610384828186c0838287c05050505050506102e46102b4610284610254610344610314828186c1838287c1505050505050610284610254610474610444818184c1818185c0505050508c609001603081036102e46102b4610284610254828186c0838287c050505050505061028461025487878787828186c0838287c05050505050506102e46102b48d8d8d8d828186c0838287c05050505050506103446103146102e46102b4610284610254828161015cc2838261018cc261018c61012c6101bcc16101bc61015c86c061018c61015c61015cc0818161018cc083836101bcc06101bc61018c61018cc261015c61018c87c15050505050506102846102546104746104446104146103e4828186c0838287c05050505050506102e46102b4610284610254610344610314828186c1838287c15050505050506103446103146102e46102b4818184c1818185c0505050508c603001603081036103b4610384610344610314828186c0838287c0505050505050505050505050505050505050506105dc6104b0600091908160f001918060c00191816090019180606001918160300191908060f001908060c001908060900190806060019080603001906103b461038489898585828161015cc2838261018cc261018c61012c6101bcc16101bc61015c86c061018c61015c61015cc0818161018cc083836101bcc06101bc61018c61018cc261015c61018c87c15050505050506104146103e48b8b8787828161015cc2838261018cc261018c61012c6101bcc16101bc61015c86c061018c61015c61015cc0818161018cc083836101bcc06101bc61018c61018cc261015c61018c87c15050505050506104746104448d8d8989828161015cc2838261018cc261018c61012c6101bcc16101bc61015c86c061018c61015c61015cc0818161018cc083836101bcc06101bc61018c61018cc261015c61018c87c150505050505061028461025487878585828186c0838287c05050505050506102e46102b48d8d8b8b828186c0838287c05050505050506103446103146102e46102b4610284610254828161015cc2838261018cc261018c61012c6101bcc16101bc61015c86c061018c61015c61015cc0818161018cc083836101bcc06101bc61018c61018cc261015c61018c87c15050505050506102846102546103b4610384610474610444828186c0838287c05050505050506102e46102b4610284610254610344610314828186c1838287c15050505050508c60f001603081036102e46102b46104146103e4828186c0838287c050505050505061028461025485858585828186c0838287c05050505050506102e46102b48b8b8b8b828186c0838287c05050505050506103446103146102e46102b4610284610254828161015cc2838261018cc261018c61012c6101bcc16101bc61015c86c061018c61015c61015cc0818161018cc083836101bcc06101bc61018c61018cc261015c61018c87c15050505050506102846102546104146103e46103b4610384828186c0838287c05050505050506102e46102b4610284610254610344610314828186c1838287c1505050505050610284610254610474610444818184c1818185c0505050508c609001603081036102e46102b4610284610254828186c0838287c050505050505061028461025487878787828186c0838287c05050505050506102e46102b48d8d8d8d828186c0838287c05050505050506103446103146102e46102b4610284610254828161015cc2838261018cc261018c61012c6101bcc16101bc61015c86c061018c61015c61015cc0818161018cc083836101bcc06101bc61018c61018cc261015c61018c87c15050505050506102846102546104746104446104146103e4828186c0838287c05050505050506102e46102b4610284610254610344610314828186c1838287c15050505050506103446103146102e46102b4818184c1818185c0505050508c603001603081036103b4610384610344610314828186c0838287c0505050505050505050505050505050505050506105dc6104b0600091908160f001918060c00191816090019180606001918160300191908060f001908060c001908060900190806060019080603001906103b461038489898585828161015cc2838261018cc261018c61012c6101bcc16101bc61015c86c061018c61015c61015cc0818161018cc083836101bcc06101bc61018c61018cc261015c61018c87c15050505050506104146103e48b8b8787828161015cc2838261018cc261018c61012c6101bcc16101bc61015c86c061018c61015c61015cc0818161018cc083836101bcc06101bc61018c61018cc261015c61018c87c15050505050506104746104448d8d8989828161015cc2838261018cc261018c61012c6101bcc16101bc61015c86c061018c61015c61015cc0818161018cc083836101bcc06101bc61018c61018cc261015c61018c87c150505050505061028461025487878585828186c0838287c05050505050506102e46102b48d8d8b8b828186c0838287c05050505050506103446103146102e46102b4610284610254828161015cc2838261018cc261018c61012c6101bcc16101bc61015c86c061018c61015c61015cc0818161018cc083836101bcc06101bc61018c61018cc261015c61018c87c15050505050506102846102546103b4610384610474610444828186c0838287c05050505050506102e46102b4610284610254610344610314828186c1838287c15050505050508c60f001603081036102e46102b46104146103e4828186c0838287c050505050505061028461025485858585828186c0838287c05050505050506102e46102b48b8b8b8b828186c0838287c05050505050506103446103146102e46102b4610284610254828161015cc2838261018cc261018c61012c6101bcc16101bc61015c86c061018c61015c61015cc0818161018cc083836101bcc06101bc61018c61018cc261015c61018c87c15050505050506102846102546104146103e46103b4610384828186c0838287c05050505050506102e46102b4610284610254610344610314828186c1838287c1505050505050610284610254610474610444818184c1818185c0505050508c609001603081036102e46102b4610284610254828186c0838287c050505050505061028461025487878787828186c0838287c05050505050506102e46102b48d8d8d8d828186c0838287c05050505050506103446103146102e46102b4610284610254828161015cc2838261018cc261018c61012c6101bcc16101bc61015c86c061018c61015c61015cc0818161018cc083836101bcc06101bc61018c61018cc261015c61018c87c15050505050506102846102546104746104446104146103e4828186c0838287c05050505050506102e46102b4610284610254610344610314828186c1838287c15050505050506103446103146102e46102b4818184c1818185c0505050508c603001603081036103b4610384610344610314828186c0838287c0505050505050505050505050505050505050506105dc6104b0600091908160f001918060c00191816090019180606001918160300191908060f001908060c001908060900190806060019080603001906103b461038489898585828161015cc2838261018cc261018c61012c6101bcc16101bc61015c86c061018c61015c61015cc0818161018cc083836101bcc06101bc61018c61018cc261015c61018c87c15050505050506104146103e48b8b8787828161015cc2838261018cc261018c61012c6101bcc16101bc61015c86c061018c61015c61015cc0818161018cc083836101bcc06101bc61018c61018cc261015c61018c87c15050505050506104746104448d8d8989828161015cc2838261018cc261018c61012c6101bcc16101bc61015c86c061018c61015c61015cc0818161018cc083836101bcc06101bc61018c61018cc261015c61018c87c150505050505061028461025487878585828186c0838287c05050505050506102e46102b48d8d8b8b828186c0838287c05050505050506103446103146102e46102b4610284610254828161015cc2838261018cc261018c61012c6101bcc16101bc61015c86c061018c61015c61015cc0818161018cc083836101bcc06101bc61018c61018cc261015c61018c87c15050505050506102846102546103b4610384610474610444828186c0838287c05050505050506102e46102b4610284610254610344610314828186c1838287c15050505050508c60f001603081036102e46102b46104146103e4828186c0838287c050505050505061028461025485858585828186c0838287c05050505050506102e46102b48b8b8b8b828186c0838287c05050505050506103446103146102e46102b4610284610254828161015cc2838261018cc261018c61012c6101bcc16101bc61015c86c061018c61015c61015cc0818161018cc083836101bcc06101bc61018c61018cc261015c61018c87c15050505050506102846102546104146103e46103b4610384828186c0838287c05050505050506102e46102b4610284610254610344610314828186c1838287c1505050505050610284610254610474610444818184c1818185c0505050508c609001603081036102e46102b4610284610254828186c0838287c050505050505061028461025487878787828186c0838287c05050505050506102e46102b48d8d8d8d828186c0838287c05050505050506103446103146102e46102b4610284610254828161015cc2838261018cc261018c61012c6101bcc16101bc61015c86c061018c61015c61015cc0818161018cc083836101bcc06101bc61018c61018cc261015c61018c87c15050505050506102846102546104746104446104146103e4828186c0838287c05050505050506102e46102b4610284610254610344610314828186c1838287c15050505050506103446103146102e46102b4818184c1818185c0505050508c603001603081036103b4610384610344610314828186c0838287c0505050505050505050505050505050505050506105dc6104b0600091908160f001918060c00191816090019180606001918160300191908060f001908060c001908060900190806060019080603001906103b461038489898585828161015cc2838261018cc261018c61012c6101bcc16101bc61015c86c061018c61015c61015cc0818161018cc083836101bcc06101bc61018c61018cc261015c61018c87c15050505050506104146103e48b8b8787828161015cc2838261018cc261018c61012c6101bcc16101bc61015c86c061018c61015c61015cc0818161018cc083836101bcc06101bc61018c61018cc261015c61018c87c15050505050506104746104448d8d8989828161015cc2838261018cc261018c61012c6101bcc16101bc61015c86c061018c61015c61015cc0818161018cc083836101bcc06101bc61018c61018cc261015c61018c87c150505050505061028461025487878585828186c0838287c05050505050506102e46102b48d8d8b8b828186c0838287c05050505050506103446103146102e46102b4610284610254828161015cc2838261018cc261018c61012c6101bcc16101bc61015c86c061018c61015c61015cc0818161018cc083836101bcc06101bc61018c61018cc261015c61018c87c15050505050506102846102546103b4610384610474610444828186c0838287c05050505050506102e46102b4610284610254610344610314828186c1838287c15050505050508c60f001603081036102e46102b46104146103e4828186c0838287c050505050505061028461025485858585828186c0838287c05050505050506102e46102b48b8b8b8b828186c0838287c05050505050506103446103146102e46102b4610284610254828161015cc2838261018cc261018c61012c6101bcc16101bc61015c86c061018c61015c61015cc0818161018cc083836101bcc06101bc61018c61018cc261015c61018c87c15050505050506102846102546104146103e46103b4610384828186c0838287c05050505050506102e46102b4610284610254610344610314828186c1838287c1505050505050610284610254610474610444818184c1818185c0505050508c609001603081036102e46102b4610284610254828186c0838287c050505050505061028461025487878787828186c0838287c05050505050506102e46102b48d8d8d8d828186c0838287c05050505050506103446103146102e46102b4610284610254828161015cc2838261018cc261018c61012c6101bcc16101bc61015c86c061018c61015c61015cc0818161018cc083836101bcc06101bc61018c61018cc261015c61018c87c15050505050506102846102546104746104446104146103e4828186c0838287c05050505050506102e46102b4610284610254610344610314828186c1838287c15050505050506103446103146102e46102b4818184c1818185c0505050508c603001603081036103b4610384610344610314828186c0838287c0505050505050505050505050505050505050506105dc6104b0600091908160f001918060c00191816090019180606001918160300191908060f001908060c001908060900190806060019080603001906103b461038489898585828161015cc2838261018cc261018c61012c6101bcc16101bc61015c86c061018c61015c61015cc0818161018cc083836101bcc06101bc61018c61018cc261015c61018c87c15050505050506104146103e48b8b8787828161015cc2838261018cc261018c61012c6101bcc16101bc61015c86c061018c61015c61015cc0818161018cc083836101bcc06101bc61018c61018cc261015c61018c87c15050505050506104746104448d8d8989828161015cc2838261018cc261018c61012c6101bcc16101bc61015c86c061018c61015c61015cc0818161018cc083836101bcc06101bc61018c61018cc261015c61018c87c150505050505061028461025487878585828186c0838287c05050505050506102e46102b48d8d8b8b828186c0838287c05050505050506103446103146102e46102b4610284610254828161015cc2838261018cc261018c61012c6101bcc16101bc61015c86c061018c61015c61015cc0818161018cc083836101bcc06101bc61018c61018cc261015c61018c87c15050505050506102846102546103b4610384610474610444828186c0838287c05050505050506102e46102b4610284610254610344610314828186c1838287c15050505050508c60f001603081036102e46102b46104146103e4828186c0838287c050505050505061028461025485858585828186c0838287c05050505050506102e46102b48b8b8b8b828186c0838287c05050505050506103446103146102e46102b4610284610254828161015cc2838261018cc261018c61012c6101bcc16101bc61015c86c061018c61015c61015cc0818161018cc083836101bcc06101bc61018c61018cc261015c61018c87c15050505050506102846102546104146103e46103b4610384828186c0838287c05050505050506102e46102b4610284610254610344610314828186c1838287c1505050505050610284610254610474610444818184c1818185c0505050508c609001603081036102e46102b4610284610254828186c0838287c050505050505061028461025487878787828186c0838287c05050505050506102e46102b48d8d8d8d828186c0838287c05050505050506103446103146102e46102b4610284610254828161015cc2838261018cc261018c61012c6101bcc16101bc61015c86c061018c61015c61015cc0818161018cc083836101bcc06101bc61018c61018cc261015c61018c87c15050505050506102846102546104746104446104146103e4828186c0838287c05050505050506102e46102b4610284610254610344610314828186c1838287c15050505050506103446103146102e46102b4818184c1818185c0505050508c603001603081036103b4610384610344610314828186c0838287c0505050505050505050505050505050505050506105dc6104b0600091908160f001918060c00191816090019180606001918160300191908060f001908060c001908060900190806060019080603001906103b461038489898585828161015cc2838261018cc261018c61012c6101bcc16101bc61015c86c061018c61015c61015cc0818161018cc083836101bcc06101bc61018c61018cc261015c61018c87c15050505050506104146103e48b8b8787828161015cc2838261018cc261018c61012c6101bcc16101bc61015c86c061018c61015c61015cc0818161018cc083836101bcc06101bc61018c61018cc261015c61018c87c15050505050506104746104448d8d8989828161015cc2838261018cc261018c61012c6101bcc16101bc61015c86c061018c61015c61015cc0818161018cc083836101bcc06101bc61018c61018cc261015c61018c87c150505050505061028461025487878585828186c0838287c05050505050506102e46102b48d8d8b8b828186c0838287c05050505050506103446103146102e46102b4610284610254828161015cc2838261018cc261018c61012c6101bcc16101bc61015c86c061018c61015c61015cc0818161018cc083836101bcc06101bc61018c61018cc261015c61018c87c15050505050506102846102546103b4610384610474610444828186c0838287c05050505050506102e46102b4610284610254610344610314828186c1838287c15050505050508c60f001603081036102e46102b46104146103e4828186c0838287c050505050505061028461025485858585828186c0838287c05050505050506102e46102b48b8b8b8b828186c0838287c05050505050506103446103146102e46102b4610284610254828161015cc2838261018cc261018c61012c6101bcc16101bc61015c86c061018c61015c61015cc0818161018cc083836101bcc06101bc61018c61018cc261015c61018c87c15050505050506102846102546104146103e46103b4610384828186c0838287c05050505050506102e46102b4610284610254610344610314828186c1838287c1505050505050610284610254610474610444818184c1818185c0505050508c609001603081036102e46102b4610284610254828186c0838287c050505050505061028461025487878787828186c0838287c05050505050506102e46102b48d8d8d8d828186c0838287c05050505050506103446103146102e46102b4610284610254828161015cc2838261018cc261018c61012c6101bcc16101bc61015c86c061018c61015c61015cc0818161018cc083836101bcc06101bc61018c61018cc261015c61018c87c15050505050506102846102546104746104446104146103e4828186c0838287c05050505050506102e46102b4610284610254610344610314828186c1838287c15050505050506103446103146102e46102b4818184c1818185c0505050508c603001603081036103b4610384610344610314828186c0838287c0505050505050505050505050505050505050506105dc6104b0600091908160f001918060c00191816090019180606001918160300191908060f001908060c001908060900190806060019080603001906103b461038489898585828161015cc2838261018cc261018c61012c6101bcc16101bc61015c86c061018c61015c61015cc0818161018cc083836101bcc06101bc61018c61018cc261015c61018c87c15050505050506104146103e48b8b8787828161015cc2838261018cc261018c61012c6101bcc16101bc61015c86c061018c61015c61015cc0818161018cc083836101bcc06101bc61018c61018cc261015c61018c87c15050505050506104746104448d8d8989828161015cc2838261018cc261018c61012c6101bcc16101bc61015c86c061018c61015c61015cc0818161018cc083836101bcc06101bc61018c61018cc261015c61018c87c150505050505061028461025487878585828186c0838287c05050505050506102e46102b48d8d8b8b828186c0838287c05050505050506103446103146102e46102b4610284610254828161015cc2838261018cc261018c61012c6101bcc16101bc61015c86c061018c61015c61015cc0818161018cc083836101bcc06101bc61018c61018cc261015c61018c87c15050505050506102846102546103b4610384610474610444828186c0838287c05050505050506102e46102b4610284610254610344610314828186c1838287c15050505050508c60f001603081036102e46102b46104146103e4828186c0838287c050505050505061028461025485858585828186c0838287c05050505050506102e46102b48b8b8b8b828186c0838287c05050505050506103446103146102e46102b4610284610254828161015cc2838261018cc261018c61012c6101bcc16101bc61015c86c061018c61015c61015cc0818161018cc083836101bcc06101bc61018c61018cc261015c61018c87c15050505050506102846102546104146103e46103b4610384828186c0838287c05050505050506102e46102b4610284610254610344610314828186c1838287c1505050505050610284610254610474610444818184c1818185c0505050508c609001603081036102e46102b4610284610254828186c0838287c050505050505061028461025487878787828186c0838287c05050505050506102e46102b48d8d8d8d828186c0838287c05050505050506103446103146102e46102b4610284610254828161015cc2838261018cc261018c61012c6101bcc16101bc61015c86c061018c61015c61015cc0818161018cc083836101bcc06101bc61018c61018cc261015c61018c87c15050505050506102846102546104746104446104146103e4828186c0838287c05050505050506102e46102b4610284610254610344610314828186c1838287c15050505050506103446103146102e46102b4818184c1818185c0505050508c603001603081036103b4610384610344610314828186c0838287c0505050505050505050505050505050505050506105dc6104b0600091908160f001918060c00191816090019180606001918160300191908060f001908060c001908060900190806060019080603001906103b461038489898585828161015cc2838261018cc261018c61012c6101bcc16101bc61015c86c061018c61015c61015cc0818161018cc083836101bcc06101bc61018c61018cc261015c61018c87c15050505050506104146103e48b8b8787828161015cc2838261018cc261018c61012c6101bcc16101bc61015c86c061018c61015c61015cc0818161018cc083836101bcc06101bc61018c61018cc261015c61018c87c15050505050506104746104448d8d8989828161015cc2838261018cc261018c61012c6101bcc16101bc61015c86c061018c61015c61015cc0818161018cc083836101bcc06101bc61018c61018cc261015c61018c87c150505050505061028461025487878585828186c0838287c05050505050506102e46102b48d8d8b8b828186c0838287c05050505050506103446103146102e46102b4610284610254828161015cc2838261018cc261018c61012c6101bcc16101bc61015c86c061018c61015c61015cc0818161018cc083836101bcc06101bc61018c61018cc261015c61018c87c15050505050506102846102546103b4610384610474610444828186c0838287c05050505050506102e46102b4610284610254610344610314828186c1838287c15050505050508c60f001603081036102e46102b46104146103e4828186c0838287c050505050505061028461025485858585828186c0838287c05050505050506102e46102b48b8b8b8b828186c0838287c05050505050506103446103146102e46102b4610284610254828161015cc2838261018cc261018c61012c6101bcc16101bc61015c86c061018c61015c61015cc0818161018cc083836101bcc06101bc61018c61018cc261015c61018c87c15050505050506102846102546104146103e46103b4610384828186c0838287c05050505050506102e46102b4610284610254610344610314828186c1838287c1505050505050610284610254610474610444818184c1818185c0505050508c609001603081036102e46102b4610284610254828186c0838287c050505050505061028461025487878787828186c0838287c05050505050506102e46102b48d8d8d8d828186c0838287c05050505050506103446103146102e46102b4610284610254828161015cc2838261018cc261018c61012c6101bcc16101bc61015c86c061018c61015c61015cc0818161018cc083836101bcc06101bc61018c61018cc261015c61018c87c15050505050506102846102546104746104446104146103e4828186c0838287c05050505050506102e46102b4610284610254610344610314828186c1838287c15050505050506103446103146102e46102b4818184c1818185c0505050508c603001603081036103b4610384610344610314828186c0838287c0505050505050505050505050505050505050506105dc6104b0600091908160f001918060c00191816090019180606001918160300191908060f001908060c001908060900190806060019080603001906103b461038489898585828161015cc2838261018cc261018c61012c6101bcc16101bc61015c86c061018c61015c61015cc0818161018cc083836101bcc06101bc61018c61018cc261015c61018c87c15050505050506104146103e48b8b8787828161015cc2838261018cc261018c61012c6101bcc16101bc61015c86c061018c61015c61015cc0818161018cc083836101bcc06101bc61018c61018cc261015c61018c87c15050505050506104746104448d8d8989828161015cc2838261018cc261018c61012c6101bcc16101bc61015c86c061018c61015c61015cc0818161018cc083836101bcc06101bc61018c61018cc261015c61018c87c150505050505061028461025487878585828186c0838287c05050505050506102e46102b48d8d8b8b828186c0838287c05050505050506103446103146102e46102b4610284610254828161015cc2838261018cc261018c61012c6101bcc16101bc61015c86c061018c61015c61015cc0818161018cc083836101bcc06101bc61018c61018cc261015c61018c87c15050505050506102846102546103b4610384610474610444828186c0838287c05050505050506102e46102b4610284610254610344610314828186c1838287c15050505050508c60f001603081036102e46102b46104146103e4828186c0838287c050505050505061028461025485858585828186c0838287c05050505050506102e46102b48b8b8b8b828186c0838287c05050505050506103446103146102e46102b4610284610254828161015cc2838261018cc261018c61012c6101bcc16101bc61015c86c061018c61015c61015cc0818161018cc083836101bcc06101bc61018c61018cc261015c61018c87c15050505050506102846102546104146103e46103b4610384828186c0838287c05050505050506102e46102b4610284610254610344610314828186c1838287c1505050505050610284610254610474610444818184c1818185c0505050508c609001603081036102e46102b4610284610254828186c0838287c050505050505061028461025487878787828186c0838287c05050505050506102e46102b48d8d8d8d828186c0838287c05050505050506103446103146102e46102b4610284610254828161015cc2838261018cc261018c61012c6101bcc16101bc61015c86c061018c61015c61015cc0818161018cc083836101bcc06101bc61018c61018cc261015c61018c87c15050505050506102846102546104746104446104146103e4828186c0838287c05050505050506102e46102b4610284610254610344610314828186c1838287c15050505050506103446103146102e46102b4818184c1818185c0505050508c603001603081036103b4610384610344610314828186c0838287c0505050505050505050505050505050505050506040612e976103e839600101806087106020026103e80151565b60ff60005360016000f3000000000000000000000000000000000000000000000000000000000000037a0000000000000000000000000000000000000000000000000000000000002e8c",
"data" : "0x",
"gas" : "0x989680",
"gasPrice" : "0x0c",
"origin" : "0xcd1722f2947def4cf144679da39c4c32bdc35681",
"value" : "0x0b"
},
"gas" : "0x013874",
"logs" : "0x1dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d49347",
"out" : "0x",
"post" : {
"0x0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6" : {
"balance" : "0x0de0b6b3a7640000",
"code" : "0x",
"nonce" : "0x00",
"storage" : {
}
}
},
"pre" : {
"0x0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6" : {
"balance" : "0x0de0b6b3a7640000",
"code" : "0x",
"nonce" : "0x00",
"storage" : {
}
}
}
}
}
// this is a dummy macro which lets me evaluate arithmetic at compile-time
template<val>
#define macro EVAL_ARITHMETIC = takes(0) returns(1) {
<val>
}
// these are various hard-coded memory offsets which we use for various buffers
#define macro NUM_BYTES = takes(0) returns(1) {
48
}
#define macro F6M_MUL_OUT = takes(0) returns(1) { // 6 values
1344 // EVAL_ARITHMETIC<0x1c*48>()
}
#define macro F1_TMP = takes(0) returns(1) { // 3 values
1200 // EVAL_ARITHMETIC<0x19*48>()
}
#define macro F6M_MUL_R_TMP = takes(0) returns(1) { // 6 values, but we have 8 values, first two zeros
912 // EVAL_ARITHMETIC<0x13*48>()
}
#define macro F6M_MUL_BUFFER_AA_BB_CC = takes(0) returns(1) { // 6 values
624 // EVAL_ARITHMETIC<0x0d*48>()
}
#define macro F6_INPUTABC = takes(0) returns(1) { // 6 values
48 // EVAL_ARITHMETIC<0x01*48>()
}
#define macro MOD_OFFSET = takes(0) returns(1) { // 1.5 values
12288 // EVAL_ARITHMETIC<256*48>()
}
// next we have various macros for f2m and f6m arithmetic, including multiplication.
/*
registers are
00 zero
01 a0
02 a1
03 b0
04 b1
05 c0
06 c1
07 A0
08 A1
09 B0
0a B1
0b C0
0c C1
0d aA0
0e aA1
0f bB0
10 bB1
11 cC0
12 cC1
13 tmp10
14 tmp11
15 tmp20
16 tmp21
17 tmp30
18 tmp31
19 f1tmp1
1a f1tmp2
1b f1tmp3
1c out00
1d out01
1e out10
1f out11
20 out20
21 out21
*/
// this is the main macro for f6m_mul
#define macro F6M_MUL = takes(0) returns(0) {
// set up aA, bB, and cC
// f2m_mul aA = a * A
0x190107 mulmodmont384 // tmp1 = x0*y0
0x1a0208 mulmodmont384 // tmp2 = x1*y1
0x1b001a submod384 // tmp3 = zero-tmp2
0x0d191b addmod384 // out0 = tmp1+tmp3
0x19191a addmod384 // tmp1 = tmp1+tmp2
0x1a0102 addmod384 // tmp2 = x0+x1
0x1b0708 addmod384 // tmp3 = y0+y1
0x1a1a1b mulmodmont384 // tmp2 = tmp2*tmp3
0x0e1a19 submod384 // out1 = tmp2-tmp1
// f2m_mul bB = b * B
0x190309 mulmodmont384 // tmp1 = x0*y0
0x1a040a mulmodmont384 // tmp2 = x1*y1
0x1b001a submod384 // tmp3 = zero-tmp2
0x0f191b addmod384 // out0 = tmp1+tmp3
0x19191a addmod384 // tmp1 = tmp1+tmp2
0x1a0304 addmod384 // tmp2 = x0+x1
0x1b090a addmod384 // tmp3 = y0+y1
0x1a1a1b mulmodmont384 // tmp2 = tmp2*tmp3
0x101a19 submod384 // out1 = tmp2-tmp1
// f2m_mul cC = c * C
0x19050b mulmodmont384 // tmp1 = x0*y0
0x1a060c mulmodmont384 // tmp2 = x1*y1
0x1b001a submod384 // tmp3 = zero-tmp2
0x11191b addmod384 // out0 = tmp1+tmp3
0x19191a addmod384 // tmp1 = tmp1+tmp2
0x1a0506 addmod384 // tmp2 = x0+x1
0x1b0b0c addmod384 // tmp3 = y0+y1
0x1a1a1b mulmodmont384 // tmp2 = tmp2*tmp3
0x121a19 submod384 // out1 = tmp2-tmp1
// F6M_MUL_R2
// f2m_add tmp1 = a + c
0x130105 addmod384
0x140206 addmod384
// f2m_add tmp2 = A + C
0x15070b addmod384
0x16080c addmod384
// f2m_mul tmp3 = tmp1 * tmp2
0x191315 mulmodmont384 // tmp1 = x0*y0
0x1a1416 mulmodmont384 // tmp2 = x1*y1
0x1b001a submod384 // tmp3 = zero-tmp2
0x17191b addmod384 // out0 = tmp1+tmp3
0x19191a addmod384 // tmp1 = tmp1+tmp2
0x1a1314 addmod384 // tmp2 = x0+x1
0x1b1516 addmod384 // tmp3 = y0+y1
0x1a1a1b mulmodmont384 // tmp2 = tmp2*tmp3
0x181a19 submod384 // out1 = tmp2-tmp1
// f2m_add tmp1 = aA + cC
0x130d11 addmod384
0x140e12 addmod384
// f2m_sub tmp2 = tmp3 - tmp1
0x151713 submod384
0x161814 submod384
// f2m_add r2 = 0f + tmp2
0x200f15 addmod384
0x211016 addmod384
// F6M_MUL_R1
// f2m_add tmp1 = a + b
0x130103 addmod384
0x140204 addmod384
// f2m_add tmp2 = A + B
0x150709 addmod384
0x16080a addmod384
// f2m_mul tmp3 = tmp1 * tmp2
0x191315 mulmodmont384 // tmp1 = x0*y0
0x1a1416 mulmodmont384 // tmp2 = x1*y1
0x1b001a submod384 // tmp3 = zero-tmp2
0x17191b addmod384 // out0 = tmp1+tmp3
0x19191a addmod384 // tmp1 = tmp1+tmp2
0x1a1314 addmod384 // tmp2 = x0+x1
0x1b1516 addmod384 // tmp3 = y0+y1
0x1a1a1b mulmodmont384 // tmp2 = tmp2*tmp3
0x181a19 submod384 // out1 = tmp2-tmp1
// f2m_add tmp1 = aA + bB
0x130d0f addmod384
0x140e10 addmod384
// f2m_sub tmp2 = tmp3 - tmp1
0x151713 submod384
0x161814 submod384
// mul_nr2 tmp1 = mulnr2(cC)
0x131112 submod384 // out0 = x0-x1
0x141112 addmod384 // out1 = x0+x1
// f2m_add r1 = tmp1 + tmp2
0x1e1315 addmod384
0x1f1416 addmod384
// F6M_MUL_R0
// f2m_add tmp1 = b + c
0x130305 addmod384
0x140406 addmod384
// f2m_add tmp2 = B + C
0x15090b addmod384
0x160a0c addmod384
// f2m_mul tmp3 = tmp1 * tmp2
0x191315 mulmodmont384 // tmp1 = x0*y0
0x1a1416 mulmodmont384 // tmp2 = x1*y1
0x1b001a submod384 // tmp3 = zero-tmp2
0x17191b addmod384 // out0 = tmp1+tmp3
0x19191a addmod384 // tmp1 = tmp1+tmp2
0x1a1314 addmod384 // tmp2 = x0+x1
0x1b1516 addmod384 // tmp3 = y0+y1
0x1a1a1b mulmodmont384 // tmp2 = tmp2*tmp3
0x181a19 submod384 // out1 = tmp2-tmp1
// f2m_add tmp1 = bB + cC
0x130f11 addmod384
0x141012 addmod384
// f2m_sub tmp2 = tmp3 - tmp1
0x151713 submod384
0x161814 submod384
// mul_nr2 tmp3 = tmp2
0x171516 submod384 // out0 = x0-x1
0x181516 addmod384 // out1 = x0+x1
// f2m_add r0 = aA + tmp3
0x1c0d17 addmod384
0x1d0e18 addmod384
/*
// pseudo-code for f6m_mul
// set up aA, bB, and cC
f2m_mul aA = a * A
f2m_mul bB = b * B
f2m_mul cC = c * C
// F6M_MUL_R2
f2m_add tmp1 = a + c
f2m_add tmp2 = A + C
f2m_mul tmp3 = tmp1 * tmp2
f2m_add tmp1 = aA + cC
f2m_sub tmp2 = tmp3 - tmp1
f2m_add r2 = bB + tmp2
// F6M_MUL_R1
f2m_add tmp1 = a + b
f2m_add tmp2 = A + B
f2m_mul tmp3 = tmp1 * tmp2
f2m_add tmp1 = aA + bB
f2m_sub tmp2 = tmp3 - tmp1
mul_nr2 tmp1 = mulnr2(cC)
f2m_add r1 = tmp1 + tmp2
// F6M_MUL_R0
f2m_add tmp1 = b + c
f2m_add tmp2 = B + C
f2m_mul tmp3 = tmp1 * tmp2
f2m_add tmp1 = bB + cC
f2m_sub tmp2 = tmp3 - tmp1
mul_nr2 tmp3 = tmp2
f2m_add r0 = aA + tmp3
*/
}
///////////////
// f6m_mul test
#define macro F6M_MUL_TEST_HARDCODED = takes(0) returns(0) {
/*
*/
// set up memory
// a0
0x8f2990f3e598f5b1b8f480a3c388306bc023fac151c0104d13ec3aa181599402 EVAL_ARITHMETIC<F6_INPUTABC+NUM_BYTES*2*0+NUM_BYTES*0>() mstore
0x72d1c8c528a1ce3bcaa280a8e735aa0d00000000000000000000000000000000 EVAL_ARITHMETIC<F6_INPUTABC+NUM_BYTES*2*0+NUM_BYTES*0+32>() mstore
// a1
0x992d7a27906d4cd530b23a7e8c48c0778f8653fbc3332d63db24339d8bc65d7e EVAL_ARITHMETIC<F6_INPUTABC+NUM_BYTES*2*0+NUM_BYTES*1>() mstore
0xe83b6e91c6550f5aceab102e88e9180900000000000000000000000000000000 EVAL_ARITHMETIC<F6_INPUTABC+NUM_BYTES*2*0+NUM_BYTES*1+32>() mstore
// b0
0x7299907146816f08c4c6a394e91374ed6ff3618a57358cfb124ee6ab4c560e5c EVAL_ARITHMETIC<F6_INPUTABC+NUM_BYTES*2*1+NUM_BYTES*0>() mstore
0xac40700b41e2ee8674680728f0c5a61800000000000000000000000000000000 EVAL_ARITHMETIC<F6_INPUTABC+NUM_BYTES*2*1+NUM_BYTES*0+32>() mstore
// b1
0x0fd77f62b39eb952a0f8d21cec1f93b1d62dd7923aa86882ddf7dd4d3532b0b7 EVAL_ARITHMETIC<F6_INPUTABC+NUM_BYTES*2*1+NUM_BYTES*1>() mstore
0xede8f3fc89fa4a79574067e2d9a9d20000000000000000000000000000000000 EVAL_ARITHMETIC<F6_INPUTABC+NUM_BYTES*2*1+NUM_BYTES*1+32>() mstore
// c0
0x7a69de46b13d8cb4c4833224aaf9ef7ea6a48975ab35c6e123b8539ab84c381a EVAL_ARITHMETIC<F6_INPUTABC+NUM_BYTES*2*2+NUM_BYTES*0>() mstore
0x2533401a73c4e79f47d714899d01ac1300000000000000000000000000000000 EVAL_ARITHMETIC<F6_INPUTABC+NUM_BYTES*2*2+NUM_BYTES*0+32>() mstore
// c1
0xa9fa0b0d8156c36a1a9ddacb73ef278f4d149b560e88789f2bfeb9f708b6cc2f EVAL_ARITHMETIC<F6_INPUTABC+NUM_BYTES*2*2+NUM_BYTES*1>() mstore
0x988927bfe0186d5bf9cb40cb07f21b1800000000000000000000000000000000 EVAL_ARITHMETIC<F6_INPUTABC+NUM_BYTES*2*2+NUM_BYTES*1+32>() mstore
// A0
0xecd347c808af644c7a3a971a556576f434e302b6b490004fb418a4a7da330a67 EVAL_ARITHMETIC<F6_INPUTABC+NUM_BYTES*6+NUM_BYTES*2*0+NUM_BYTES*0>() mstore
0x43adeca931169b8b92e91df73ae1e11500000000000000000000000000000000 EVAL_ARITHMETIC<F6_INPUTABC+NUM_BYTES*6+NUM_BYTES*2*0+NUM_BYTES*0+32>() mstore
// A1
0x12a2829e11e843d764d5e3b80e75432d93f69b23ad79c38d43ebbc9bd2b17b9e EVAL_ARITHMETIC<F6_INPUTABC+NUM_BYTES*6+NUM_BYTES*2*0+NUM_BYTES*1>() mstore
0x903033351357b03602624762e5ad360d00000000000000000000000000000000 EVAL_ARITHMETIC<F6_INPUTABC+NUM_BYTES*6+NUM_BYTES*2*0+NUM_BYTES*1+32>() mstore
// B0
0xd7f9857dce663301f393f9fac66f5c49168494e0d20797a6c4f96327ed4fa47d EVAL_ARITHMETIC<F6_INPUTABC+NUM_BYTES*6+NUM_BYTES*2*1+NUM_BYTES*0>() mstore
0xd36d0078d217a712407d35046871d40f00000000000000000000000000000000 EVAL_ARITHMETIC<F6_INPUTABC+NUM_BYTES*6+NUM_BYTES*2*1+NUM_BYTES*0+32>() mstore
// B1
0x2f1b767f6c1ec190eb76a0bce7906ad2e4a7548d03e8aa745e34e1bf49d83ad6 EVAL_ARITHMETIC<F6_INPUTABC+NUM_BYTES*6+NUM_BYTES*2*1+NUM_BYTES*1>() mstore
0x4c04f57fb4d31039cb4cf01987fda21300000000000000000000000000000000 EVAL_ARITHMETIC<F6_INPUTABC+NUM_BYTES*6+NUM_BYTES*2*1+NUM_BYTES*1+32>() mstore
// C0
0x7b3f8da2f2ae47885890b0d433a3eeed2f9f37cbcfc444e4f1d880390fcdb765 EVAL_ARITHMETIC<F6_INPUTABC+NUM_BYTES*6+NUM_BYTES*2*2+NUM_BYTES*0>() mstore
0x18d558857be01b2b10a8010bcdc6d60600000000000000000000000000000000 EVAL_ARITHMETIC<F6_INPUTABC+NUM_BYTES*6+NUM_BYTES*2*2+NUM_BYTES*0+32>() mstore
// C1
0x319c02f6132c8a786377868b5825ada9a5fe303e9ae3b03ce56e90734a17ce97 EVAL_ARITHMETIC<F6_INPUTABC+NUM_BYTES*6+NUM_BYTES*2*2+NUM_BYTES*1>() mstore
0x0c88b321012cf8dabb58211e3d50f61000000000000000000000000000000000 EVAL_ARITHMETIC<F6_INPUTABC+NUM_BYTES*6+NUM_BYTES*2*2+NUM_BYTES*1+32>() mstore
// mod for bls12-381
0xabaafffffffffeb9ffff53b1feffab1e24f6b0f6a0d23067bf1285f3844b7764 EVAL_ARITHMETIC<MOD_OFFSET*1>() mstore
0xd7ac4b43b6a71b4b9ae67f39ea11011a00000000000000000000000000000000 EVAL_ARITHMETIC<MOD_OFFSET+32>() mstore
// inv for bls12-381
0xfdfffcfffcfff389000000000000000000000000000000000000000000000000 EVAL_ARITHMETIC<MOD_OFFSET+48>() mstore
// call f6m_mul over above memory
F6M_MUL()
// return output
288 F6M_MUL_OUT() return
/*
output should be:
f4f3f4e0a35068eaac665aee2e71f682aecd20923b420023b6d5420ba01ea98287c314107a998a650ab3247ef39c920e
2c9620d993a22bade623d165a9f4aa648af87cb7292b7821c0fcd0adcd14ba655da54df2ad93262e24fc62bcd97e7208
ead1838e6c5e168543093c87eaeb576f940670026292dcb7a812600f4fb20a281be71ce1ef79f675e4a283b73906ca17
9c8b2c76405445b20dd7635d562309f69c2c87601d9055a5e10df2ea1d28237fafd0d32f7e8c19d4cd5a3d1ef65b120b
40591ef0c74dbec983b7bef145a87957c1e09049dbc85fbb3e9bb1174892ee83294ef8c4a5954fffbff4ca6aca74c718
9b242b8f1c5d63bb525121bd68eda084ab7e6d015052d5adeb79ddb24091d2a8e5b1da00212d0e6c11f01d2379011308
*/
}
///////////////
// f6m_mul_registers benchmark
#define macro F6M_MUL_BENCH_NUM_ITERS = takes(0) returns(1) {
135
}
#define jumptable F6M_MUL_BENCH_JUMP_TABLE {
loop done
}
#define macro F6M_MUL_BENCH = takes(0) returns(0) {
/*
*/
// set up memory
// a0
0x8f2990f3e598f5b1b8f480a3c388306bc023fac151c0104d13ec3aa181599402 EVAL_ARITHMETIC<F6_INPUTABC+NUM_BYTES*2*0+NUM_BYTES*0>() mstore
0x72d1c8c528a1ce3bcaa280a8e735aa0d00000000000000000000000000000000 EVAL_ARITHMETIC<F6_INPUTABC+NUM_BYTES*2*0+NUM_BYTES*0+32>() mstore
// a1
0x992d7a27906d4cd530b23a7e8c48c0778f8653fbc3332d63db24339d8bc65d7e EVAL_ARITHMETIC<F6_INPUTABC+NUM_BYTES*2*0+NUM_BYTES*1>() mstore
0xe83b6e91c6550f5aceab102e88e9180900000000000000000000000000000000 EVAL_ARITHMETIC<F6_INPUTABC+NUM_BYTES*2*0+NUM_BYTES*1+32>() mstore
// b0
0x7299907146816f08c4c6a394e91374ed6ff3618a57358cfb124ee6ab4c560e5c EVAL_ARITHMETIC<F6_INPUTABC+NUM_BYTES*2*1+NUM_BYTES*0>() mstore
0xac40700b41e2ee8674680728f0c5a61800000000000000000000000000000000 EVAL_ARITHMETIC<F6_INPUTABC+NUM_BYTES*2*1+NUM_BYTES*0+32>() mstore
// b1
0x0fd77f62b39eb952a0f8d21cec1f93b1d62dd7923aa86882ddf7dd4d3532b0b7 EVAL_ARITHMETIC<F6_INPUTABC+NUM_BYTES*2*1+NUM_BYTES*1>() mstore
0xede8f3fc89fa4a79574067e2d9a9d20000000000000000000000000000000000 EVAL_ARITHMETIC<F6_INPUTABC+NUM_BYTES*2*1+NUM_BYTES*1+32>() mstore
// c0
0x7a69de46b13d8cb4c4833224aaf9ef7ea6a48975ab35c6e123b8539ab84c381a EVAL_ARITHMETIC<F6_INPUTABC+NUM_BYTES*2*2+NUM_BYTES*0>() mstore
0x2533401a73c4e79f47d714899d01ac1300000000000000000000000000000000 EVAL_ARITHMETIC<F6_INPUTABC+NUM_BYTES*2*2+NUM_BYTES*0+32>() mstore
// c1
0xa9fa0b0d8156c36a1a9ddacb73ef278f4d149b560e88789f2bfeb9f708b6cc2f EVAL_ARITHMETIC<F6_INPUTABC+NUM_BYTES*2*2+NUM_BYTES*1>() mstore
0x988927bfe0186d5bf9cb40cb07f21b1800000000000000000000000000000000 EVAL_ARITHMETIC<F6_INPUTABC+NUM_BYTES*2*2+NUM_BYTES*1+32>() mstore
// A0
0xecd347c808af644c7a3a971a556576f434e302b6b490004fb418a4a7da330a67 EVAL_ARITHMETIC<F6_INPUTABC+NUM_BYTES*6+NUM_BYTES*2*0+NUM_BYTES*0>() mstore
0x43adeca931169b8b92e91df73ae1e11500000000000000000000000000000000 EVAL_ARITHMETIC<F6_INPUTABC+NUM_BYTES*6+NUM_BYTES*2*0+NUM_BYTES*0+32>() mstore
// A1
0x12a2829e11e843d764d5e3b80e75432d93f69b23ad79c38d43ebbc9bd2b17b9e EVAL_ARITHMETIC<F6_INPUTABC+NUM_BYTES*6+NUM_BYTES*2*0+NUM_BYTES*1>() mstore
0x903033351357b03602624762e5ad360d00000000000000000000000000000000 EVAL_ARITHMETIC<F6_INPUTABC+NUM_BYTES*6+NUM_BYTES*2*0+NUM_BYTES*1+32>() mstore
// B0
0xd7f9857dce663301f393f9fac66f5c49168494e0d20797a6c4f96327ed4fa47d EVAL_ARITHMETIC<F6_INPUTABC+NUM_BYTES*6+NUM_BYTES*2*1+NUM_BYTES*0>() mstore
0xd36d0078d217a712407d35046871d40f00000000000000000000000000000000 EVAL_ARITHMETIC<F6_INPUTABC+NUM_BYTES*6+NUM_BYTES*2*1+NUM_BYTES*0+32>() mstore
// B1
0x2f1b767f6c1ec190eb76a0bce7906ad2e4a7548d03e8aa745e34e1bf49d83ad6 EVAL_ARITHMETIC<F6_INPUTABC+NUM_BYTES*6+NUM_BYTES*2*1+NUM_BYTES*1>() mstore
0x4c04f57fb4d31039cb4cf01987fda21300000000000000000000000000000000 EVAL_ARITHMETIC<F6_INPUTABC+NUM_BYTES*6+NUM_BYTES*2*1+NUM_BYTES*1+32>() mstore
// C0
0x7b3f8da2f2ae47885890b0d433a3eeed2f9f37cbcfc444e4f1d880390fcdb765 EVAL_ARITHMETIC<F6_INPUTABC+NUM_BYTES*6+NUM_BYTES*2*2+NUM_BYTES*0>() mstore
0x18d558857be01b2b10a8010bcdc6d60600000000000000000000000000000000 EVAL_ARITHMETIC<F6_INPUTABC+NUM_BYTES*6+NUM_BYTES*2*2+NUM_BYTES*0+32>() mstore
// C1
0x319c02f6132c8a786377868b5825ada9a5fe303e9ae3b03ce56e90734a17ce97 EVAL_ARITHMETIC<F6_INPUTABC+NUM_BYTES*6+NUM_BYTES*2*2+NUM_BYTES*1>() mstore
0x0c88b321012cf8dabb58211e3d50f61000000000000000000000000000000000 EVAL_ARITHMETIC<F6_INPUTABC+NUM_BYTES*6+NUM_BYTES*2*2+NUM_BYTES*1+32>() mstore
// mod for bls12-381
0xabaafffffffffeb9ffff53b1feffab1e24f6b0f6a0d23067bf1285f3844b7764 EVAL_ARITHMETIC<MOD_OFFSET*1>() mstore
0xd7ac4b43b6a71b4b9ae67f39ea11011a00000000000000000000000000000000 EVAL_ARITHMETIC<MOD_OFFSET+32>() mstore
// inv for bls12-381
0xfdfffcfffcfff389000000000000000000000000000000000000000000000000 EVAL_ARITHMETIC<MOD_OFFSET+48>() mstore
// prepare for loop
1 // iterator, starts at 1 and grows
loop:
F6M_MUL()
F6M_MUL()
F6M_MUL()
F6M_MUL()
F6M_MUL()
F6M_MUL()
F6M_MUL()
F6M_MUL()
F6M_MUL()
F6M_MUL()
__tablesize(F6M_MUL_BENCH_JUMP_TABLE) __tablestart(F6M_MUL_BENCH_JUMP_TABLE) 3000 codecopy // copy jumpdests to memory offset 3000
1 add // increment [iterator+1]
dup1 F6M_MUL_BENCH_NUM_ITERS() lt // compare to max number of iters [iterator+1 0_or_1]
32 mul 3000 add // offset to jump to [iterator+1 1000_or_1032]
mload jump // where the number before lt is iter_count
done:
0xff 0 mstore8 1 0 return // return a single byte, 0xff, to make sure it executed this far
//stop
}
{
"f6m_mul_v6" : {
"_info" : {
"comment" : "",
"filledwith" : "testeth 1.8.0-6+commit.c7ba3b69",
"lllcversion" : "Version: 0.5.14-develop.2019.11.27+commit.8f259595.Linux.g++",
"source" : "src/VMTestsFiller/vmArithmeticTest/add0Filler.json",
"sourceHash" : "c1480bf5e662b7f6518d4b003e14575c6bdab286e2d8763e1b0be9a186bec775"
},
"callcreates" : [
],
"env" : {
"currentCoinbase" : "0x2adc25665018aa1fe0e6bc666dac8fc2697ff9ba",
"currentDifficulty" : "0x020000",
"currentGasLimit" : "0x7fffffffffffffff",
"currentNumber" : "0x01",
"currentTimestamp" : "0x03e8"
},
"exec" : {
"address" : "0x0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6",
"caller" : "0xcd1722f2947def4cf144679da39c4c32bdc35681",
"code" : "0x7f8f2990f3e598f5b1b8f480a3c388306bc023fac151c0104d13ec3aa1815994026030527f72d1c8c528a1ce3bcaa280a8e735aa0d000000000000000000000000000000006050527f992d7a27906d4cd530b23a7e8c48c0778f8653fbc3332d63db24339d8bc65d7e6060527fe83b6e91c6550f5aceab102e88e91809000000000000000000000000000000006080527f7299907146816f08c4c6a394e91374ed6ff3618a57358cfb124ee6ab4c560e5c6090527fac40700b41e2ee8674680728f0c5a6180000000000000000000000000000000060b0527f0fd77f62b39eb952a0f8d21cec1f93b1d62dd7923aa86882ddf7dd4d3532b0b760c0527fede8f3fc89fa4a79574067e2d9a9d2000000000000000000000000000000000060e0527f7a69de46b13d8cb4c4833224aaf9ef7ea6a48975ab35c6e123b8539ab84c381a60f0527f2533401a73c4e79f47d714899d01ac1300000000000000000000000000000000610110527fa9fa0b0d8156c36a1a9ddacb73ef278f4d149b560e88789f2bfeb9f708b6cc2f610120527f988927bfe0186d5bf9cb40cb07f21b1800000000000000000000000000000000610140527fecd347c808af644c7a3a971a556576f434e302b6b490004fb418a4a7da330a67610150527f43adeca931169b8b92e91df73ae1e11500000000000000000000000000000000610170527f12a2829e11e843d764d5e3b80e75432d93f69b23ad79c38d43ebbc9bd2b17b9e610180527f903033351357b03602624762e5ad360d000000000000000000000000000000006101a0527fd7f9857dce663301f393f9fac66f5c49168494e0d20797a6c4f96327ed4fa47d6101b0527fd36d0078d217a712407d35046871d40f000000000000000000000000000000006101d0527f2f1b767f6c1ec190eb76a0bce7906ad2e4a7548d03e8aa745e34e1bf49d83ad66101e0527f4c04f57fb4d31039cb4cf01987fda21300000000000000000000000000000000610200527f7b3f8da2f2ae47885890b0d433a3eeed2f9f37cbcfc444e4f1d880390fcdb765610210527f18d558857be01b2b10a8010bcdc6d60600000000000000000000000000000000610230527f319c02f6132c8a786377868b5825ada9a5fe303e9ae3b03ce56e90734a17ce97610240527f0c88b321012cf8dabb58211e3d50f61000000000000000000000000000000000610260527fabaafffffffffeb9ffff53b1feffab1e24f6b0f6a0d23067bf1285f3844b7764613000527fd7ac4b43b6a71b4b9ae67f39ea11011a00000000000000000000000000000000613020527ffdfffcfffcfff3890000000000000000000000000000000000000000000000006130305262190107c2621a0208c2621b001ac1620d191bc06219191ac0621a0102c0621b0708c0621a1a1bc2620e1a19c162190309c2621a040ac2621b001ac1620f191bc06219191ac0621a0304c0621b090ac0621a1a1bc262101a19c16219050bc2621a060cc2621b001ac16211191bc06219191ac0621a0506c0621b0b0cc0621a1a1bc262121a19c162130105c062140206c06215070bc06216080cc062191315c2621a1416c2621b001ac16217191bc06219191ac0621a1314c0621b1516c0621a1a1bc262181a19c162130d11c062140e12c062151713c162161814c162200f15c062211016c062130103c062140204c062150709c06216080ac062191315c2621a1416c2621b001ac16217191bc06219191ac0621a1314c0621b1516c0621a1a1bc262181a19c162130d0fc062140e10c062151713c162161814c162131112c162141112c0621e1315c0621f1416c062130305c062140406c06215090bc062160a0cc062191315c2621a1416c2621b001ac16217191bc06219191ac0621a1314c0621b1516c0621a1a1bc262181a19c162130f11c062141012c062151713c162161814c162171516c162181516c0621c0d17c0621d0e18c0610120610540f3",
"data" : "0x",
"gas" : "0x0186a0",
"gasPrice" : "0x0c",
"origin" : "0xcd1722f2947def4cf144679da39c4c32bdc35681",
"value" : "0x0b"
},
"gas" : "0x013874",
"logs" : "0x1dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d49347",
"out" : "0x",
"post" : {
"0x0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6" : {
"balance" : "0x0de0b6b3a7640000",
"code" : "0x",
"nonce" : "0x00",
"storage" : {
}
}
},
"pre" : {
"0x0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6" : {
"balance" : "0x0de0b6b3a7640000",
"code" : "0x",
"nonce" : "0x00",
"storage" : {
}
}
}
}
}
{
"f6m_mul_v6_bench" : {
"_info" : {
"comment" : "",
"filledwith" : "testeth 1.8.0-6+commit.c7ba3b69",
"lllcversion" : "Version: 0.5.14-develop.2019.11.27+commit.8f259595.Linux.g++",
"source" : "src/VMTestsFiller/vmArithmeticTest/add0Filler.json",
"sourceHash" : "c1480bf5e662b7f6518d4b003e14575c6bdab286e2d8763e1b0be9a186bec775"
},
"callcreates" : [
],
"env" : {
"currentCoinbase" : "0x2adc25665018aa1fe0e6bc666dac8fc2697ff9ba",
"currentDifficulty" : "0x020000",
"currentGasLimit" : "0x7fffffffffffffff",
"currentNumber" : "0x01",
"currentTimestamp" : "0x03e8"
},
"exec" : {
"address" : "0x0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6",
"caller" : "0xcd1722f2947def4cf144679da39c4c32bdc35681",
"code" : "0x7f8f2990f3e598f5b1b8f480a3c388306bc023fac151c0104d13ec3aa1815994026030527f72d1c8c528a1ce3bcaa280a8e735aa0d000000000000000000000000000000006050527f992d7a27906d4cd530b23a7e8c48c0778f8653fbc3332d63db24339d8bc65d7e6060527fe83b6e91c6550f5aceab102e88e91809000000000000000000000000000000006080527f7299907146816f08c4c6a394e91374ed6ff3618a57358cfb124ee6ab4c560e5c6090527fac40700b41e2ee8674680728f0c5a6180000000000000000000000000000000060b0527f0fd77f62b39eb952a0f8d21cec1f93b1d62dd7923aa86882ddf7dd4d3532b0b760c0527fede8f3fc89fa4a79574067e2d9a9d2000000000000000000000000000000000060e0527f7a69de46b13d8cb4c4833224aaf9ef7ea6a48975ab35c6e123b8539ab84c381a60f0527f2533401a73c4e79f47d714899d01ac1300000000000000000000000000000000610110527fa9fa0b0d8156c36a1a9ddacb73ef278f4d149b560e88789f2bfeb9f708b6cc2f610120527f988927bfe0186d5bf9cb40cb07f21b1800000000000000000000000000000000610140527fecd347c808af644c7a3a971a556576f434e302b6b490004fb418a4a7da330a67610150527f43adeca931169b8b92e91df73ae1e11500000000000000000000000000000000610170527f12a2829e11e843d764d5e3b80e75432d93f69b23ad79c38d43ebbc9bd2b17b9e610180527f903033351357b03602624762e5ad360d000000000000000000000000000000006101a0527fd7f9857dce663301f393f9fac66f5c49168494e0d20797a6c4f96327ed4fa47d6101b0527fd36d0078d217a712407d35046871d40f000000000000000000000000000000006101d0527f2f1b767f6c1ec190eb76a0bce7906ad2e4a7548d03e8aa745e34e1bf49d83ad66101e0527f4c04f57fb4d31039cb4cf01987fda21300000000000000000000000000000000610200527f7b3f8da2f2ae47885890b0d433a3eeed2f9f37cbcfc444e4f1d880390fcdb765610210527f18d558857be01b2b10a8010bcdc6d60600000000000000000000000000000000610230527f319c02f6132c8a786377868b5825ada9a5fe303e9ae3b03ce56e90734a17ce97610240527f0c88b321012cf8dabb58211e3d50f61000000000000000000000000000000000610260527fabaafffffffffeb9ffff53b1feffab1e24f6b0f6a0d23067bf1285f3844b7764613000527fd7ac4b43b6a71b4b9ae67f39ea11011a00000000000000000000000000000000613020527ffdfffcfffcfff3890000000000000000000000000000000000000000000000006130305260015b62190107c2621a0208c2621b001ac1620d191bc06219191ac0621a0102c0621b0708c0621a1a1bc2620e1a19c162190309c2621a040ac2621b001ac1620f191bc06219191ac0621a0304c0621b090ac0621a1a1bc262101a19c16219050bc2621a060cc2621b001ac16211191bc06219191ac0621a0506c0621b0b0cc0621a1a1bc262121a19c162130105c062140206c06215070bc06216080cc062191315c2621a1416c2621b001ac16217191bc06219191ac0621a1314c0621b1516c0621a1a1bc262181a19c162130d11c062140e12c062151713c162161814c162200f15c062211016c062130103c062140204c062150709c06216080ac062191315c2621a1416c2621b001ac16217191bc06219191ac0621a1314c0621b1516c0621a1a1bc262181a19c162130d0fc062140e10c062151713c162161814c162131112c162141112c0621e1315c0621f1416c062130305c062140406c06215090bc062160a0cc062191315c2621a1416c2621b001ac16217191bc06219191ac0621a1314c0621b1516c0621a1a1bc262181a19c162130f11c062141012c062151713c162161814c162171516c162181516c0621c0d17c0621d0e18c062190107c2621a0208c2621b001ac1620d191bc06219191ac0621a0102c0621b0708c0621a1a1bc2620e1a19c162190309c2621a040ac2621b001ac1620f191bc06219191ac0621a0304c0621b090ac0621a1a1bc262101a19c16219050bc2621a060cc2621b001ac16211191bc06219191ac0621a0506c0621b0b0cc0621a1a1bc262121a19c162130105c062140206c06215070bc06216080cc062191315c2621a1416c2621b001ac16217191bc06219191ac0621a1314c0621b1516c0621a1a1bc262181a19c162130d11c062140e12c062151713c162161814c162200f15c062211016c062130103c062140204c062150709c06216080ac062191315c2621a1416c2621b001ac16217191bc06219191ac0621a1314c0621b1516c0621a1a1bc262181a19c162130d0fc062140e10c062151713c162161814c162131112c162141112c0621e1315c0621f1416c062130305c062140406c06215090bc062160a0cc062191315c2621a1416c2621b001ac16217191bc06219191ac0621a1314c0621b1516c0621a1a1bc262181a19c162130f11c062141012c062151713c162161814c162171516c162181516c0621c0d17c0621d0e18c062190107c2621a0208c2621b001ac1620d191bc06219191ac0621a0102c0621b0708c0621a1a1bc2620e1a19c162190309c2621a040ac2621b001ac1620f191bc06219191ac0621a0304c0621b090ac0621a1a1bc262101a19c16219050bc2621a060cc2621b001ac16211191bc06219191ac0621a0506c0621b0b0cc0621a1a1bc262121a19c162130105c062140206c06215070bc06216080cc062191315c2621a1416c2621b001ac16217191bc06219191ac0621a1314c0621b1516c0621a1a1bc262181a19c162130d11c062140e12c062151713c162161814c162200f15c062211016c062130103c062140204c062150709c06216080ac062191315c2621a1416c2621b001ac16217191bc06219191ac0621a1314c0621b1516c0621a1a1bc262181a19c162130d0fc062140e10c062151713c162161814c162131112c162141112c0621e1315c0621f1416c062130305c062140406c06215090bc062160a0cc062191315c2621a1416c2621b001ac16217191bc06219191ac0621a1314c0621b1516c0621a1a1bc262181a19c162130f11c062141012c062151713c162161814c162171516c162181516c0621c0d17c0621d0e18c062190107c2621a0208c2621b001ac1620d191bc06219191ac0621a0102c0621b0708c0621a1a1bc2620e1a19c162190309c2621a040ac2621b001ac1620f191bc06219191ac0621a0304c0621b090ac0621a1a1bc262101a19c16219050bc2621a060cc2621b001ac16211191bc06219191ac0621a0506c0621b0b0cc0621a1a1bc262121a19c162130105c062140206c06215070bc06216080cc062191315c2621a1416c2621b001ac16217191bc06219191ac0621a1314c0621b1516c0621a1a1bc262181a19c162130d11c062140e12c062151713c162161814c162200f15c062211016c062130103c062140204c062150709c06216080ac062191315c2621a1416c2621b001ac16217191bc06219191ac0621a1314c0621b1516c0621a1a1bc262181a19c162130d0fc062140e10c062151713c162161814c162131112c162141112c0621e1315c0621f1416c062130305c062140406c06215090bc062160a0cc062191315c2621a1416c2621b001ac16217191bc06219191ac0621a1314c0621b1516c0621a1a1bc262181a19c162130f11c062141012c062151713c162161814c162171516c162181516c0621c0d17c0621d0e18c062190107c2621a0208c2621b001ac1620d191bc06219191ac0621a0102c0621b0708c0621a1a1bc2620e1a19c162190309c2621a040ac2621b001ac1620f191bc06219191ac0621a0304c0621b090ac0621a1a1bc262101a19c16219050bc2621a060cc2621b001ac16211191bc06219191ac0621a0506c0621b0b0cc0621a1a1bc262121a19c162130105c062140206c06215070bc06216080cc062191315c2621a1416c2621b001ac16217191bc06219191ac0621a1314c0621b1516c0621a1a1bc262181a19c162130d11c062140e12c062151713c162161814c162200f15c062211016c062130103c062140204c062150709c06216080ac062191315c2621a1416c2621b001ac16217191bc06219191ac0621a1314c0621b1516c0621a1a1bc262181a19c162130d0fc062140e10c062151713c162161814c162131112c162141112c0621e1315c0621f1416c062130305c062140406c06215090bc062160a0cc062191315c2621a1416c2621b001ac16217191bc06219191ac0621a1314c0621b1516c0621a1a1bc262181a19c162130f11c062141012c062151713c162161814c162171516c162181516c0621c0d17c0621d0e18c062190107c2621a0208c2621b001ac1620d191bc06219191ac0621a0102c0621b0708c0621a1a1bc2620e1a19c162190309c2621a040ac2621b001ac1620f191bc06219191ac0621a0304c0621b090ac0621a1a1bc262101a19c16219050bc2621a060cc2621b001ac16211191bc06219191ac0621a0506c0621b0b0cc0621a1a1bc262121a19c162130105c062140206c06215070bc06216080cc062191315c2621a1416c2621b001ac16217191bc06219191ac0621a1314c0621b1516c0621a1a1bc262181a19c162130d11c062140e12c062151713c162161814c162200f15c062211016c062130103c062140204c062150709c06216080ac062191315c2621a1416c2621b001ac16217191bc06219191ac0621a1314c0621b1516c0621a1a1bc262181a19c162130d0fc062140e10c062151713c162161814c162131112c162141112c0621e1315c0621f1416c062130305c062140406c06215090bc062160a0cc062191315c2621a1416c2621b001ac16217191bc06219191ac0621a1314c0621b1516c0621a1a1bc262181a19c162130f11c062141012c062151713c162161814c162171516c162181516c0621c0d17c0621d0e18c062190107c2621a0208c2621b001ac1620d191bc06219191ac0621a0102c0621b0708c0621a1a1bc2620e1a19c162190309c2621a040ac2621b001ac1620f191bc06219191ac0621a0304c0621b090ac0621a1a1bc262101a19c16219050bc2621a060cc2621b001ac16211191bc06219191ac0621a0506c0621b0b0cc0621a1a1bc262121a19c162130105c062140206c06215070bc06216080cc062191315c2621a1416c2621b001ac16217191bc06219191ac0621a1314c0621b1516c0621a1a1bc262181a19c162130d11c062140e12c062151713c162161814c162200f15c062211016c062130103c062140204c062150709c06216080ac062191315c2621a1416c2621b001ac16217191bc06219191ac0621a1314c0621b1516c0621a1a1bc262181a19c162130d0fc062140e10c062151713c162161814c162131112c162141112c0621e1315c0621f1416c062130305c062140406c06215090bc062160a0cc062191315c2621a1416c2621b001ac16217191bc06219191ac0621a1314c0621b1516c0621a1a1bc262181a19c162130f11c062141012c062151713c162161814c162171516c162181516c0621c0d17c0621d0e18c062190107c2621a0208c2621b001ac1620d191bc06219191ac0621a0102c0621b0708c0621a1a1bc2620e1a19c162190309c2621a040ac2621b001ac1620f191bc06219191ac0621a0304c0621b090ac0621a1a1bc262101a19c16219050bc2621a060cc2621b001ac16211191bc06219191ac0621a0506c0621b0b0cc0621a1a1bc262121a19c162130105c062140206c06215070bc06216080cc062191315c2621a1416c2621b001ac16217191bc06219191ac0621a1314c0621b1516c0621a1a1bc262181a19c162130d11c062140e12c062151713c162161814c162200f15c062211016c062130103c062140204c062150709c06216080ac062191315c2621a1416c2621b001ac16217191bc06219191ac0621a1314c0621b1516c0621a1a1bc262181a19c162130d0fc062140e10c062151713c162161814c162131112c162141112c0621e1315c0621f1416c062130305c062140406c06215090bc062160a0cc062191315c2621a1416c2621b001ac16217191bc06219191ac0621a1314c0621b1516c0621a1a1bc262181a19c162130f11c062141012c062151713c162161814c162171516c162181516c0621c0d17c0621d0e18c062190107c2621a0208c2621b001ac1620d191bc06219191ac0621a0102c0621b0708c0621a1a1bc2620e1a19c162190309c2621a040ac2621b001ac1620f191bc06219191ac0621a0304c0621b090ac0621a1a1bc262101a19c16219050bc2621a060cc2621b001ac16211191bc06219191ac0621a0506c0621b0b0cc0621a1a1bc262121a19c162130105c062140206c06215070bc06216080cc062191315c2621a1416c2621b001ac16217191bc06219191ac0621a1314c0621b1516c0621a1a1bc262181a19c162130d11c062140e12c062151713c162161814c162200f15c062211016c062130103c062140204c062150709c06216080ac062191315c2621a1416c2621b001ac16217191bc06219191ac0621a1314c0621b1516c0621a1a1bc262181a19c162130d0fc062140e10c062151713c162161814c162131112c162141112c0621e1315c0621f1416c062130305c062140406c06215090bc062160a0cc062191315c2621a1416c2621b001ac16217191bc06219191ac0621a1314c0621b1516c0621a1a1bc262181a19c162130f11c062141012c062151713c162161814c162171516c162181516c0621c0d17c0621d0e18c062190107c2621a0208c2621b001ac1620d191bc06219191ac0621a0102c0621b0708c0621a1a1bc2620e1a19c162190309c2621a040ac2621b001ac1620f191bc06219191ac0621a0304c0621b090ac0621a1a1bc262101a19c16219050bc2621a060cc2621b001ac16211191bc06219191ac0621a0506c0621b0b0cc0621a1a1bc262121a19c162130105c062140206c06215070bc06216080cc062191315c2621a1416c2621b001ac16217191bc06219191ac0621a1314c0621b1516c0621a1a1bc262181a19c162130d11c062140e12c062151713c162161814c162200f15c062211016c062130103c062140204c062150709c06216080ac062191315c2621a1416c2621b001ac16217191bc06219191ac0621a1314c0621b1516c0621a1a1bc262181a19c162130d0fc062140e10c062151713c162161814c162131112c162141112c0621e1315c0621f1416c062130305c062140406c06215090bc062160a0cc062191315c2621a1416c2621b001ac16217191bc06219191ac0621a1314c0621b1516c0621a1a1bc262181a19c162130f11c062141012c062151713c162161814c162171516c162181516c0621c0d17c0621d0e18c06040611535610bb83960010180608710602002610bb80151565b60ff60005360016000f300000000000000000000000000000000000000000000000000000000000003e0000000000000000000000000000000000000000000000000000000000000152a",
"data" : "0x",
"gas" : "0x989680",
"gasPrice" : "0x0c",
"origin" : "0xcd1722f2947def4cf144679da39c4c32bdc35681",
"value" : "0x0b"
},
"gas" : "0x013874",
"logs" : "0x1dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d49347",
"out" : "0x",
"post" : {
"0x0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6" : {
"balance" : "0x0de0b6b3a7640000",
"code" : "0x",
"nonce" : "0x00",
"storage" : {
}
}
},
"pre" : {
"0x0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6" : {
"balance" : "0x0de0b6b3a7640000",
"code" : "0x",
"nonce" : "0x00",
"storage" : {
}
}
}
}
}
// this is a dummy macro which lets me evaluate arithmetic at compile-time
template<val>
#define macro EVAL_ARITHMETIC = takes(0) returns(1) {
<val>
}
// these are various hard-coded memory offsets which we use for various buffers
#define macro NUM_BYTES = takes(0) returns(1) {
48
}
#define macro F6M_MUL_OUT = takes(0) returns(1) { // 6 values
1344 // EVAL_ARITHMETIC<0x1c*48>()
}
#define macro F1_TMP = takes(0) returns(1) { // 3 values
1200 // EVAL_ARITHMETIC<0x19*48>()
}
#define macro F6M_MUL_R_TMP = takes(0) returns(1) { // 6 values, but we have 8 values, first two zeros
912 // EVAL_ARITHMETIC<0x13*48>()
}
#define macro F6M_MUL_BUFFER_AA_BB_CC = takes(0) returns(1) { // 6 values
624 // EVAL_ARITHMETIC<0x0d*48>()
}
#define macro F6_INPUTABC = takes(0) returns(1) { // 6 values
48 // EVAL_ARITHMETIC<0x01*48>()
}
#define macro MOD_OFFSET = takes(0) returns(1) { // 1.5 values
0x660 // EVAL_ARITHMETIC<256*48>()
}
// next we have various macros for f2m and f6m arithmetic, including multiplication.
/*
Convention: memory is set up as follows
<idx> <variable>, where <idx> is the memory location divided by 48 (i.e. the idx'th 48-byte chunk), and <variable> is the variable name
00 zero
01 a0
02 a1
03 b0
04 b1
05 c0
06 c1
07 A0
08 A1
09 B0
0a B1
0b C0
0c C1
0d aA0
0e aA1
0f bB0
10 bB1
11 cC0
12 cC1
13 tmp10
14 tmp11
15 tmp20
16 tmp21
17 tmp30
18 tmp31
19 f1tmp1
1a f1tmp2
1b f1tmp3
1c out00
1d out01
1e out10
1f out11
20 out20
21 out21
22 mod_and_inv
*/
// this is the main macro for f6m_mul
#define macro F6M_MUL = takes(0) returns(0) {
// first precompute aA, bB, and cC, which we will reuse
// f2m_mul aA = a * A
0x000004b0000000300000015000000660 mulmodmont384 // tmp1 = x0*y0
0x000004e0000000600000018000000660 mulmodmont384 // tmp2 = x1*y1
0x0000051000000000000004e000000660 submod384 // tmp3 = zero-tmp2
0x00000270000004b00000051000000660 addmod384 // out0 = tmp1+tmp3
0x000004b0000004b0000004e000000660 addmod384 // tmp1 = tmp1+tmp2
0x000004e0000000300000006000000660 addmod384 // tmp2 = x0+x1
0x00000510000001500000018000000660 addmod384 // tmp3 = y0+y1
0x000004e0000004e00000051000000660 mulmodmont384 // tmp2 = tmp2*tmp3
0x000002a0000004e0000004b000000660 submod384 // out1 = tmp2-tmp1
// f2m_mul bB = b * B
0x000004b000000090000001b000000660 mulmodmont384 // tmp1 = x0*y0
0x000004e0000000c0000001e000000660 mulmodmont384 // tmp2 = x1*y1
0x0000051000000000000004e000000660 submod384 // tmp3 = zero-tmp2
0x000002d0000004b00000051000000660 addmod384 // out0 = tmp1+tmp3
0x000004b0000004b0000004e000000660 addmod384 // tmp1 = tmp1+tmp2
0x000004e000000090000000c000000660 addmod384 // tmp2 = x0+x1
0x00000510000001b0000001e000000660 addmod384 // tmp3 = y0+y1
0x000004e0000004e00000051000000660 mulmodmont384 // tmp2 = tmp2*tmp3
0x00000300000004e0000004b000000660 submod384 // out1 = tmp2-tmp1
// f2m_mul cC = c * C
0x000004b0000000f00000021000000660 mulmodmont384 // tmp1 = x0*y0
0x000004e0000001200000024000000660 mulmodmont384 // tmp2 = x1*y1
0x0000051000000000000004e000000660 submod384 // tmp3 = zero-tmp2
0x00000330000004b00000051000000660 addmod384 // out0 = tmp1+tmp3
0x000004b0000004b0000004e000000660 addmod384 // tmp1 = tmp1+tmp2
0x000004e0000000f00000012000000660 addmod384 // tmp2 = x0+x1
0x00000510000002100000024000000660 addmod384 // tmp3 = y0+y1
0x000004e0000004e00000051000000660 mulmodmont384 // tmp2 = tmp2*tmp3
0x00000360000004e0000004b000000660 submod384 // out1 = tmp2-tmp1
// next compute each of the three output f2 points, which are together an f6 point
// F6M_MUL_R2
// f2m_add tmp1 = a + c
0x0000039000000030000000f000000660 addmod384
0x000003c0000000600000012000000660 addmod384
// f2m_add tmp2 = A + C
0x000003f0000001500000021000000660 addmod384
0x00000420000001800000024000000660 addmod384
// f2m_mul tmp3 = tmp1 * tmp2
0x000004b000000390000003f000000660 mulmodmont384 // tmp1 = x0*y0
0x000004e0000003c00000042000000660 mulmodmont384 // tmp2 = x1*y1
0x0000051000000000000004e000000660 submod384 // tmp3 = zero-tmp2
0x00000450000004b00000051000000660 addmod384 // out0 = tmp1+tmp3
0x000004b0000004b0000004e000000660 addmod384 // tmp1 = tmp1+tmp2
0x000004e000000390000003c000000660 addmod384 // tmp2 = x0+x1
0x00000510000003f00000042000000660 addmod384 // tmp3 = y0+y1
0x000004e0000004e00000051000000660 mulmodmont384 // tmp2 = tmp2*tmp3
0x00000480000004e0000004b000000660 submod384 // out1 = tmp2-tmp1
// f2m_add tmp1 = aA + cC
0x00000390000002700000033000000660 addmod384
0x000003c0000002a00000036000000660 addmod384
// f2m_sub tmp2 = tmp3 - tmp1
0x000003f0000004500000039000000660 submod384
0x0000042000000480000003c000000660 submod384
// f2m_add r2 = 0f + tmp2
0x00000600000002d0000003f000000660 addmod384
0x00000630000003000000042000000660 addmod384
// F6M_MUL_R1
// f2m_add tmp1 = a + b
0x00000390000000300000009000000660 addmod384
0x000003c000000060000000c000000660 addmod384
// f2m_add tmp2 = A + B
0x000003f000000150000001b000000660 addmod384
0x0000042000000180000001e000000660 addmod384
// f2m_mul tmp3 = tmp1 * tmp2
0x000004b000000390000003f000000660 mulmodmont384 // tmp1 = x0*y0
0x000004e0000003c00000042000000660 mulmodmont384 // tmp2 = x1*y1
0x0000051000000000000004e000000660 submod384 // tmp3 = zero-tmp2
0x00000450000004b00000051000000660 addmod384 // out0 = tmp1+tmp3
0x000004b0000004b0000004e000000660 addmod384 // tmp1 = tmp1+tmp2
0x000004e000000390000003c000000660 addmod384 // tmp2 = x0+x1
0x00000510000003f00000042000000660 addmod384 // tmp3 = y0+y1
0x000004e0000004e00000051000000660 mulmodmont384 // tmp2 = tmp2*tmp3
0x00000480000004e0000004b000000660 submod384 // out1 = tmp2-tmp1
// f2m_add tmp1 = aA + bB
0x0000039000000270000002d000000660 addmod384
0x000003c0000002a00000030000000660 addmod384
// f2m_sub tmp2 = tmp3 - tmp1
0x000003f0000004500000039000000660 submod384
0x0000042000000480000003c000000660 submod384
// mul_nr2 tmp1 = mulnr2(cC)
0x00000390000003300000036000000660 submod384 // out0 = x0-x1
0x000003c0000003300000036000000660 addmod384 // out1 = x0+x1
// f2m_add r1 = tmp1 + tmp2
0x000005a000000390000003f000000660 addmod384
0x000005d0000003c00000042000000660 addmod384
// F6M_MUL_R0
// f2m_add tmp1 = b + c
0x0000039000000090000000f000000660 addmod384
0x000003c0000000c00000012000000660 addmod384
// f2m_add tmp2 = B + C
0x000003f0000001b00000021000000660 addmod384
0x00000420000001e00000024000000660 addmod384
// f2m_mul tmp3 = tmp1 * tmp2
0x000004b000000390000003f000000660 mulmodmont384 // tmp1 = x0*y0
0x000004e0000003c00000042000000660 mulmodmont384 // tmp2 = x1*y1
0x0000051000000000000004e000000660 submod384 // tmp3 = zero-tmp2
0x00000450000004b00000051000000660 addmod384 // out0 = tmp1+tmp3
0x000004b0000004b0000004e000000660 addmod384 // tmp1 = tmp1+tmp2
0x000004e000000390000003c000000660 addmod384 // tmp2 = x0+x1
0x00000510000003f00000042000000660 addmod384 // tmp3 = y0+y1
0x000004e0000004e00000051000000660 mulmodmont384 // tmp2 = tmp2*tmp3
0x00000480000004e0000004b000000660 submod384 // out1 = tmp2-tmp1
// f2m_add tmp1 = bB + cC
0x00000390000002d00000033000000660 addmod384
0x000003c0000003000000036000000660 addmod384
// f2m_sub tmp2 = tmp3 - tmp1
0x000003f0000004500000039000000660 submod384
0x0000042000000480000003c000000660 submod384
// mul_nr2 tmp3 = tmp2
0x00000450000003f00000042000000660 submod384 // out0 = x0-x1
0x00000480000003f00000042000000660 addmod384 // out1 = x0+x1
// f2m_add r0 = aA + tmp3
0x00000540000002700000045000000660 addmod384
0x00000570000002a00000048000000660 addmod384
/*
// more concisely, the above takes input f6 points abc and ABC, and outputs f6 point r. In other words, it inputs six f2 points, a, b, c, A, B, C, and ouputs three f2 points r0, r1, r2. And each f2 point is two f1 points. And an f1 point is a 48-bit integer.
// set up aA, bB, and cC
f2m_mul aA = a * A
f2m_mul bB = b * B
f2m_mul cC = c * C
// F6M_MUL_R2
f2m_add tmp1 = a + c
f2m_add tmp2 = A + C
f2m_mul tmp3 = tmp1 * tmp2
f2m_add tmp1 = aA + cC
f2m_sub tmp2 = tmp3 - tmp1
f2m_add r2 = bB + tmp2
// F6M_MUL_R1
f2m_add tmp1 = a + b
f2m_add tmp2 = A + B
f2m_mul tmp3 = tmp1 * tmp2
f2m_add tmp1 = aA + bB
f2m_sub tmp2 = tmp3 - tmp1
mul_nr2 tmp1 = mulnr2(cC)
f2m_add r1 = tmp1 + tmp2
// F6M_MUL_R0
f2m_add tmp1 = b + c
f2m_add tmp2 = B + C
f2m_mul tmp3 = tmp1 * tmp2
f2m_add tmp1 = bB + cC
f2m_sub tmp2 = tmp3 - tmp1
mul_nr2 tmp3 = tmp2
f2m_add r0 = aA + tmp3
*/
}
///////////////
// f6m_mul test
#define macro F6M_MUL_TEST_HARDCODED = takes(0) returns(0) {
/*
*/
// set up memory
// a0
0x8f2990f3e598f5b1b8f480a3c388306bc023fac151c0104d13ec3aa181599402 EVAL_ARITHMETIC<F6_INPUTABC+NUM_BYTES*2*0+NUM_BYTES*0>() mstore
0x72d1c8c528a1ce3bcaa280a8e735aa0d00000000000000000000000000000000 EVAL_ARITHMETIC<F6_INPUTABC+NUM_BYTES*2*0+NUM_BYTES*0+32>() mstore
// a1
0x992d7a27906d4cd530b23a7e8c48c0778f8653fbc3332d63db24339d8bc65d7e EVAL_ARITHMETIC<F6_INPUTABC+NUM_BYTES*2*0+NUM_BYTES*1>() mstore
0xe83b6e91c6550f5aceab102e88e9180900000000000000000000000000000000 EVAL_ARITHMETIC<F6_INPUTABC+NUM_BYTES*2*0+NUM_BYTES*1+32>() mstore
// b0
0x7299907146816f08c4c6a394e91374ed6ff3618a57358cfb124ee6ab4c560e5c EVAL_ARITHMETIC<F6_INPUTABC+NUM_BYTES*2*1+NUM_BYTES*0>() mstore
0xac40700b41e2ee8674680728f0c5a61800000000000000000000000000000000 EVAL_ARITHMETIC<F6_INPUTABC+NUM_BYTES*2*1+NUM_BYTES*0+32>() mstore
// b1
0x0fd77f62b39eb952a0f8d21cec1f93b1d62dd7923aa86882ddf7dd4d3532b0b7 EVAL_ARITHMETIC<F6_INPUTABC+NUM_BYTES*2*1+NUM_BYTES*1>() mstore
0xede8f3fc89fa4a79574067e2d9a9d20000000000000000000000000000000000 EVAL_ARITHMETIC<F6_INPUTABC+NUM_BYTES*2*1+NUM_BYTES*1+32>() mstore
// c0
0x7a69de46b13d8cb4c4833224aaf9ef7ea6a48975ab35c6e123b8539ab84c381a EVAL_ARITHMETIC<F6_INPUTABC+NUM_BYTES*2*2+NUM_BYTES*0>() mstore
0x2533401a73c4e79f47d714899d01ac1300000000000000000000000000000000 EVAL_ARITHMETIC<F6_INPUTABC+NUM_BYTES*2*2+NUM_BYTES*0+32>() mstore
// c1
0xa9fa0b0d8156c36a1a9ddacb73ef278f4d149b560e88789f2bfeb9f708b6cc2f EVAL_ARITHMETIC<F6_INPUTABC+NUM_BYTES*2*2+NUM_BYTES*1>() mstore
0x988927bfe0186d5bf9cb40cb07f21b1800000000000000000000000000000000 EVAL_ARITHMETIC<F6_INPUTABC+NUM_BYTES*2*2+NUM_BYTES*1+32>() mstore
// A0
0xecd347c808af644c7a3a971a556576f434e302b6b490004fb418a4a7da330a67 EVAL_ARITHMETIC<F6_INPUTABC+NUM_BYTES*6+NUM_BYTES*2*0+NUM_BYTES*0>() mstore
0x43adeca931169b8b92e91df73ae1e11500000000000000000000000000000000 EVAL_ARITHMETIC<F6_INPUTABC+NUM_BYTES*6+NUM_BYTES*2*0+NUM_BYTES*0+32>() mstore
// A1
0x12a2829e11e843d764d5e3b80e75432d93f69b23ad79c38d43ebbc9bd2b17b9e EVAL_ARITHMETIC<F6_INPUTABC+NUM_BYTES*6+NUM_BYTES*2*0+NUM_BYTES*1>() mstore
0x903033351357b03602624762e5ad360d00000000000000000000000000000000 EVAL_ARITHMETIC<F6_INPUTABC+NUM_BYTES*6+NUM_BYTES*2*0+NUM_BYTES*1+32>() mstore
// B0
0xd7f9857dce663301f393f9fac66f5c49168494e0d20797a6c4f96327ed4fa47d EVAL_ARITHMETIC<F6_INPUTABC+NUM_BYTES*6+NUM_BYTES*2*1+NUM_BYTES*0>() mstore
0xd36d0078d217a712407d35046871d40f00000000000000000000000000000000 EVAL_ARITHMETIC<F6_INPUTABC+NUM_BYTES*6+NUM_BYTES*2*1+NUM_BYTES*0+32>() mstore
// B1
0x2f1b767f6c1ec190eb76a0bce7906ad2e4a7548d03e8aa745e34e1bf49d83ad6 EVAL_ARITHMETIC<F6_INPUTABC+NUM_BYTES*6+NUM_BYTES*2*1+NUM_BYTES*1>() mstore
0x4c04f57fb4d31039cb4cf01987fda21300000000000000000000000000000000 EVAL_ARITHMETIC<F6_INPUTABC+NUM_BYTES*6+NUM_BYTES*2*1+NUM_BYTES*1+32>() mstore
// C0
0x7b3f8da2f2ae47885890b0d433a3eeed2f9f37cbcfc444e4f1d880390fcdb765 EVAL_ARITHMETIC<F6_INPUTABC+NUM_BYTES*6+NUM_BYTES*2*2+NUM_BYTES*0>() mstore
0x18d558857be01b2b10a8010bcdc6d60600000000000000000000000000000000 EVAL_ARITHMETIC<F6_INPUTABC+NUM_BYTES*6+NUM_BYTES*2*2+NUM_BYTES*0+32>() mstore
// C1
0x319c02f6132c8a786377868b5825ada9a5fe303e9ae3b03ce56e90734a17ce97 EVAL_ARITHMETIC<F6_INPUTABC+NUM_BYTES*6+NUM_BYTES*2*2+NUM_BYTES*1>() mstore
0x0c88b321012cf8dabb58211e3d50f61000000000000000000000000000000000 EVAL_ARITHMETIC<F6_INPUTABC+NUM_BYTES*6+NUM_BYTES*2*2+NUM_BYTES*1+32>() mstore
// mod for bls12-381
0xabaafffffffffeb9ffff53b1feffab1e24f6b0f6a0d23067bf1285f3844b7764 EVAL_ARITHMETIC<MOD_OFFSET*1>() mstore
0xd7ac4b43b6a71b4b9ae67f39ea11011a00000000000000000000000000000000 EVAL_ARITHMETIC<MOD_OFFSET+32>() mstore
// inv for bls12-381
0xfdfffcfffcfff389000000000000000000000000000000000000000000000000 EVAL_ARITHMETIC<MOD_OFFSET+48>() mstore
// call f6m_mul over above memory
F6M_MUL()
// return output
288 F6M_MUL_OUT() return
/*
output should be:
f4f3f4e0a35068eaac665aee2e71f682aecd20923b420023b6d5420ba01ea98287c314107a998a650ab3247ef39c920e
2c9620d993a22bade623d165a9f4aa648af87cb7292b7821c0fcd0adcd14ba655da54df2ad93262e24fc62bcd97e7208
ead1838e6c5e168543093c87eaeb576f940670026292dcb7a812600f4fb20a281be71ce1ef79f675e4a283b73906ca17
9c8b2c76405445b20dd7635d562309f69c2c87601d9055a5e10df2ea1d28237fafd0d32f7e8c19d4cd5a3d1ef65b120b
40591ef0c74dbec983b7bef145a87957c1e09049dbc85fbb3e9bb1174892ee83294ef8c4a5954fffbff4ca6aca74c718
9b242b8f1c5d63bb525121bd68eda084ab7e6d015052d5adeb79ddb24091d2a8e5b1da00212d0e6c11f01d2379011308
*/
}
///////////////
// f6m_mul benchmark
#define macro F6M_MUL_BENCH_NUM_ITERS = takes(0) returns(1) {
135
}
#define jumptable F6M_MUL_BENCH_JUMP_TABLE {
loop done
}
#define macro F6M_MUL_BENCH = takes(0) returns(0) {
/*
*/
// set up memory
// a0
0x8f2990f3e598f5b1b8f480a3c388306bc023fac151c0104d13ec3aa181599402 EVAL_ARITHMETIC<F6_INPUTABC+NUM_BYTES*2*0+NUM_BYTES*0>() mstore
0x72d1c8c528a1ce3bcaa280a8e735aa0d00000000000000000000000000000000 EVAL_ARITHMETIC<F6_INPUTABC+NUM_BYTES*2*0+NUM_BYTES*0+32>() mstore
// a1
0x992d7a27906d4cd530b23a7e8c48c0778f8653fbc3332d63db24339d8bc65d7e EVAL_ARITHMETIC<F6_INPUTABC+NUM_BYTES*2*0+NUM_BYTES*1>() mstore
0xe83b6e91c6550f5aceab102e88e9180900000000000000000000000000000000 EVAL_ARITHMETIC<F6_INPUTABC+NUM_BYTES*2*0+NUM_BYTES*1+32>() mstore
// b0
0x7299907146816f08c4c6a394e91374ed6ff3618a57358cfb124ee6ab4c560e5c EVAL_ARITHMETIC<F6_INPUTABC+NUM_BYTES*2*1+NUM_BYTES*0>() mstore
0xac40700b41e2ee8674680728f0c5a61800000000000000000000000000000000 EVAL_ARITHMETIC<F6_INPUTABC+NUM_BYTES*2*1+NUM_BYTES*0+32>() mstore
// b1
0x0fd77f62b39eb952a0f8d21cec1f93b1d62dd7923aa86882ddf7dd4d3532b0b7 EVAL_ARITHMETIC<F6_INPUTABC+NUM_BYTES*2*1+NUM_BYTES*1>() mstore
0xede8f3fc89fa4a79574067e2d9a9d20000000000000000000000000000000000 EVAL_ARITHMETIC<F6_INPUTABC+NUM_BYTES*2*1+NUM_BYTES*1+32>() mstore
// c0
0x7a69de46b13d8cb4c4833224aaf9ef7ea6a48975ab35c6e123b8539ab84c381a EVAL_ARITHMETIC<F6_INPUTABC+NUM_BYTES*2*2+NUM_BYTES*0>() mstore
0x2533401a73c4e79f47d714899d01ac1300000000000000000000000000000000 EVAL_ARITHMETIC<F6_INPUTABC+NUM_BYTES*2*2+NUM_BYTES*0+32>() mstore
// c1
0xa9fa0b0d8156c36a1a9ddacb73ef278f4d149b560e88789f2bfeb9f708b6cc2f EVAL_ARITHMETIC<F6_INPUTABC+NUM_BYTES*2*2+NUM_BYTES*1>() mstore
0x988927bfe0186d5bf9cb40cb07f21b1800000000000000000000000000000000 EVAL_ARITHMETIC<F6_INPUTABC+NUM_BYTES*2*2+NUM_BYTES*1+32>() mstore
// A0
0xecd347c808af644c7a3a971a556576f434e302b6b490004fb418a4a7da330a67 EVAL_ARITHMETIC<F6_INPUTABC+NUM_BYTES*6+NUM_BYTES*2*0+NUM_BYTES*0>() mstore
0x43adeca931169b8b92e91df73ae1e11500000000000000000000000000000000 EVAL_ARITHMETIC<F6_INPUTABC+NUM_BYTES*6+NUM_BYTES*2*0+NUM_BYTES*0+32>() mstore
// A1
0x12a2829e11e843d764d5e3b80e75432d93f69b23ad79c38d43ebbc9bd2b17b9e EVAL_ARITHMETIC<F6_INPUTABC+NUM_BYTES*6+NUM_BYTES*2*0+NUM_BYTES*1>() mstore
0x903033351357b03602624762e5ad360d00000000000000000000000000000000 EVAL_ARITHMETIC<F6_INPUTABC+NUM_BYTES*6+NUM_BYTES*2*0+NUM_BYTES*1+32>() mstore
// B0
0xd7f9857dce663301f393f9fac66f5c49168494e0d20797a6c4f96327ed4fa47d EVAL_ARITHMETIC<F6_INPUTABC+NUM_BYTES*6+NUM_BYTES*2*1+NUM_BYTES*0>() mstore
0xd36d0078d217a712407d35046871d40f00000000000000000000000000000000 EVAL_ARITHMETIC<F6_INPUTABC+NUM_BYTES*6+NUM_BYTES*2*1+NUM_BYTES*0+32>() mstore
// B1
0x2f1b767f6c1ec190eb76a0bce7906ad2e4a7548d03e8aa745e34e1bf49d83ad6 EVAL_ARITHMETIC<F6_INPUTABC+NUM_BYTES*6+NUM_BYTES*2*1+NUM_BYTES*1>() mstore
0x4c04f57fb4d31039cb4cf01987fda21300000000000000000000000000000000 EVAL_ARITHMETIC<F6_INPUTABC+NUM_BYTES*6+NUM_BYTES*2*1+NUM_BYTES*1+32>() mstore
// C0
0x7b3f8da2f2ae47885890b0d433a3eeed2f9f37cbcfc444e4f1d880390fcdb765 EVAL_ARITHMETIC<F6_INPUTABC+NUM_BYTES*6+NUM_BYTES*2*2+NUM_BYTES*0>() mstore
0x18d558857be01b2b10a8010bcdc6d60600000000000000000000000000000000 EVAL_ARITHMETIC<F6_INPUTABC+NUM_BYTES*6+NUM_BYTES*2*2+NUM_BYTES*0+32>() mstore
// C1
0x319c02f6132c8a786377868b5825ada9a5fe303e9ae3b03ce56e90734a17ce97 EVAL_ARITHMETIC<F6_INPUTABC+NUM_BYTES*6+NUM_BYTES*2*2+NUM_BYTES*1>() mstore
0x0c88b321012cf8dabb58211e3d50f61000000000000000000000000000000000 EVAL_ARITHMETIC<F6_INPUTABC+NUM_BYTES*6+NUM_BYTES*2*2+NUM_BYTES*1+32>() mstore
// mod for bls12-381
0xabaafffffffffeb9ffff53b1feffab1e24f6b0f6a0d23067bf1285f3844b7764 EVAL_ARITHMETIC<MOD_OFFSET*1>() mstore
0xd7ac4b43b6a71b4b9ae67f39ea11011a00000000000000000000000000000000 EVAL_ARITHMETIC<MOD_OFFSET+32>() mstore
// inv for bls12-381
0xfdfffcfffcfff389000000000000000000000000000000000000000000000000 EVAL_ARITHMETIC<MOD_OFFSET+48>() mstore
// prepare for loop
1 // iterator, starts at 1 and grows
loop:
F6M_MUL()
F6M_MUL()
F6M_MUL()
F6M_MUL()
F6M_MUL()
F6M_MUL()
F6M_MUL()
F6M_MUL()
F6M_MUL()
F6M_MUL()
__tablesize(F6M_MUL_BENCH_JUMP_TABLE) __tablestart(F6M_MUL_BENCH_JUMP_TABLE) 3000 codecopy // copy jumpdests to memory offset 3000
1 add // increment [iterator+1]
dup1 F6M_MUL_BENCH_NUM_ITERS() lt // compare to max number of iters [iterator+1 0_or_1]
32 mul 3000 add // offset to jump to [iterator+1 1000_or_1032]
mload jump // where the number before lt is iter_count
done:
0xff 0 mstore8 1 0 return // return a single byte, 0xff, to make sure it executed this far
//stop
}
{
"f6m_mul_v7" : {
"_info" : {
"comment" : "",
"filledwith" : "testeth 1.8.0-6+commit.c7ba3b69",
"lllcversion" : "Version: 0.5.14-develop.2019.11.27+commit.8f259595.Linux.g++",
"source" : "src/VMTestsFiller/vmArithmeticTest/add0Filler.json",
"sourceHash" : "c1480bf5e662b7f6518d4b003e14575c6bdab286e2d8763e1b0be9a186bec775"
},
"callcreates" : [
],
"env" : {
"currentCoinbase" : "0x2adc25665018aa1fe0e6bc666dac8fc2697ff9ba",
"currentDifficulty" : "0x020000",
"currentGasLimit" : "0x7fffffffffffffff",
"currentNumber" : "0x01",
"currentTimestamp" : "0x03e8"
},
"exec" : {
"address" : "0x0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6",
"caller" : "0xcd1722f2947def4cf144679da39c4c32bdc35681",
"code" : "0x7f8f2990f3e598f5b1b8f480a3c388306bc023fac151c0104d13ec3aa1815994026030527f72d1c8c528a1ce3bcaa280a8e735aa0d000000000000000000000000000000006050527f992d7a27906d4cd530b23a7e8c48c0778f8653fbc3332d63db24339d8bc65d7e6060527fe83b6e91c6550f5aceab102e88e91809000000000000000000000000000000006080527f7299907146816f08c4c6a394e91374ed6ff3618a57358cfb124ee6ab4c560e5c6090527fac40700b41e2ee8674680728f0c5a6180000000000000000000000000000000060b0527f0fd77f62b39eb952a0f8d21cec1f93b1d62dd7923aa86882ddf7dd4d3532b0b760c0527fede8f3fc89fa4a79574067e2d9a9d2000000000000000000000000000000000060e0527f7a69de46b13d8cb4c4833224aaf9ef7ea6a48975ab35c6e123b8539ab84c381a60f0527f2533401a73c4e79f47d714899d01ac1300000000000000000000000000000000610110527fa9fa0b0d8156c36a1a9ddacb73ef278f4d149b560e88789f2bfeb9f708b6cc2f610120527f988927bfe0186d5bf9cb40cb07f21b1800000000000000000000000000000000610140527fecd347c808af644c7a3a971a556576f434e302b6b490004fb418a4a7da330a67610150527f43adeca931169b8b92e91df73ae1e11500000000000000000000000000000000610170527f12a2829e11e843d764d5e3b80e75432d93f69b23ad79c38d43ebbc9bd2b17b9e610180527f903033351357b03602624762e5ad360d000000000000000000000000000000006101a0527fd7f9857dce663301f393f9fac66f5c49168494e0d20797a6c4f96327ed4fa47d6101b0527fd36d0078d217a712407d35046871d40f000000000000000000000000000000006101d0527f2f1b767f6c1ec190eb76a0bce7906ad2e4a7548d03e8aa745e34e1bf49d83ad66101e0527f4c04f57fb4d31039cb4cf01987fda21300000000000000000000000000000000610200527f7b3f8da2f2ae47885890b0d433a3eeed2f9f37cbcfc444e4f1d880390fcdb765610210527f18d558857be01b2b10a8010bcdc6d60600000000000000000000000000000000610230527f319c02f6132c8a786377868b5825ada9a5fe303e9ae3b03ce56e90734a17ce97610240527f0c88b321012cf8dabb58211e3d50f61000000000000000000000000000000000610260527fabaafffffffffeb9ffff53b1feffab1e24f6b0f6a0d23067bf1285f3844b7764610660527fd7ac4b43b6a71b4b9ae67f39ea11011a00000000000000000000000000000000610680527ffdfffcfffcfff389000000000000000000000000000000000000000000000000610690526f000004b0000000300000015000000660c26f000004e0000000600000018000000660c26f0000051000000000000004e000000660c16f00000270000004b00000051000000660c06f000004b0000004b0000004e000000660c06f000004e0000000300000006000000660c06f00000510000001500000018000000660c06f000004e0000004e00000051000000660c26f000002a0000004e0000004b000000660c16f000004b000000090000001b000000660c26f000004e0000000c0000001e000000660c26f0000051000000000000004e000000660c16f000002d0000004b00000051000000660c06f000004b0000004b0000004e000000660c06f000004e000000090000000c000000660c06f00000510000001b0000001e000000660c06f000004e0000004e00000051000000660c26f00000300000004e0000004b000000660c16f000004b0000000f00000021000000660c26f000004e0000001200000024000000660c26f0000051000000000000004e000000660c16f00000330000004b00000051000000660c06f000004b0000004b0000004e000000660c06f000004e0000000f00000012000000660c06f00000510000002100000024000000660c06f000004e0000004e00000051000000660c26f00000360000004e0000004b000000660c16f0000039000000030000000f000000660c06f000003c0000000600000012000000660c06f000003f0000001500000021000000660c06f00000420000001800000024000000660c06f000004b000000390000003f000000660c26f000004e0000003c00000042000000660c26f0000051000000000000004e000000660c16f00000450000004b00000051000000660c06f000004b0000004b0000004e000000660c06f000004e000000390000003c000000660c06f00000510000003f00000042000000660c06f000004e0000004e00000051000000660c26f00000480000004e0000004b000000660c16f00000390000002700000033000000660c06f000003c0000002a00000036000000660c06f000003f0000004500000039000000660c16f0000042000000480000003c000000660c16f00000600000002d0000003f000000660c06f00000630000003000000042000000660c06f00000390000000300000009000000660c06f000003c000000060000000c000000660c06f000003f000000150000001b000000660c06f0000042000000180000001e000000660c06f000004b000000390000003f000000660c26f000004e0000003c00000042000000660c26f0000051000000000000004e000000660c16f00000450000004b00000051000000660c06f000004b0000004b0000004e000000660c06f000004e000000390000003c000000660c06f00000510000003f00000042000000660c06f000004e0000004e00000051000000660c26f00000480000004e0000004b000000660c16f0000039000000270000002d000000660c06f000003c0000002a00000030000000660c06f000003f0000004500000039000000660c16f0000042000000480000003c000000660c16f00000390000003300000036000000660c16f000003c0000003300000036000000660c06f000005a000000390000003f000000660c06f000005d0000003c00000042000000660c06f0000039000000090000000f000000660c06f000003c0000000c00000012000000660c06f000003f0000001b00000021000000660c06f00000420000001e00000024000000660c06f000004b000000390000003f000000660c26f000004e0000003c00000042000000660c26f0000051000000000000004e000000660c16f00000450000004b00000051000000660c06f000004b0000004b0000004e000000660c06f000004e000000390000003c000000660c06f00000510000003f00000042000000660c06f000004e0000004e00000051000000660c26f00000480000004e0000004b000000660c16f00000390000002d00000033000000660c06f000003c0000003000000036000000660c06f000003f0000004500000039000000660c16f0000042000000480000003c000000660c16f00000450000003f00000042000000660c16f00000480000003f00000042000000660c06f00000540000002700000045000000660c06f00000570000002a00000048000000660c0610120610540f3",
"data" : "0x",
"gas" : "0x0186a0",
"gasPrice" : "0x0c",
"origin" : "0xcd1722f2947def4cf144679da39c4c32bdc35681",
"value" : "0x0b"
},
"gas" : "0x013874",
"logs" : "0x1dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d49347",
"out" : "0x",
"post" : {
"0x0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6" : {
"balance" : "0x0de0b6b3a7640000",
"code" : "0x",
"nonce" : "0x00",
"storage" : {
}
}
},
"pre" : {
"0x0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6" : {
"balance" : "0x0de0b6b3a7640000",
"code" : "0x",
"nonce" : "0x00",
"storage" : {
}
}
}
}
}
{
"f6m_mul_v7_bench" : {
"_info" : {
"comment" : "",
"filledwith" : "testeth 1.8.0-6+commit.c7ba3b69",
"lllcversion" : "Version: 0.5.14-develop.2019.11.27+commit.8f259595.Linux.g++",
"source" : "src/VMTestsFiller/vmArithmeticTest/add0Filler.json",
"sourceHash" : "c1480bf5e662b7f6518d4b003e14575c6bdab286e2d8763e1b0be9a186bec775"
},
"callcreates" : [
],
"env" : {
"currentCoinbase" : "0x2adc25665018aa1fe0e6bc666dac8fc2697ff9ba",
"currentDifficulty" : "0x020000",
"currentGasLimit" : "0x7fffffffffffffff",
"currentNumber" : "0x01",
"currentTimestamp" : "0x03e8"
},
"exec" : {
"address" : "0x0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6",
"caller" : "0xcd1722f2947def4cf144679da39c4c32bdc35681",
"code" : "0x7f8f2990f3e598f5b1b8f480a3c388306bc023fac151c0104d13ec3aa1815994026030527f72d1c8c528a1ce3bcaa280a8e735aa0d000000000000000000000000000000006050527f992d7a27906d4cd530b23a7e8c48c0778f8653fbc3332d63db24339d8bc65d7e6060527fe83b6e91c6550f5aceab102e88e91809000000000000000000000000000000006080527f7299907146816f08c4c6a394e91374ed6ff3618a57358cfb124ee6ab4c560e5c6090527fac40700b41e2ee8674680728f0c5a6180000000000000000000000000000000060b0527f0fd77f62b39eb952a0f8d21cec1f93b1d62dd7923aa86882ddf7dd4d3532b0b760c0527fede8f3fc89fa4a79574067e2d9a9d2000000000000000000000000000000000060e0527f7a69de46b13d8cb4c4833224aaf9ef7ea6a48975ab35c6e123b8539ab84c381a60f0527f2533401a73c4e79f47d714899d01ac1300000000000000000000000000000000610110527fa9fa0b0d8156c36a1a9ddacb73ef278f4d149b560e88789f2bfeb9f708b6cc2f610120527f988927bfe0186d5bf9cb40cb07f21b1800000000000000000000000000000000610140527fecd347c808af644c7a3a971a556576f434e302b6b490004fb418a4a7da330a67610150527f43adeca931169b8b92e91df73ae1e11500000000000000000000000000000000610170527f12a2829e11e843d764d5e3b80e75432d93f69b23ad79c38d43ebbc9bd2b17b9e610180527f903033351357b03602624762e5ad360d000000000000000000000000000000006101a0527fd7f9857dce663301f393f9fac66f5c49168494e0d20797a6c4f96327ed4fa47d6101b0527fd36d0078d217a712407d35046871d40f000000000000000000000000000000006101d0527f2f1b767f6c1ec190eb76a0bce7906ad2e4a7548d03e8aa745e34e1bf49d83ad66101e0527f4c04f57fb4d31039cb4cf01987fda21300000000000000000000000000000000610200527f7b3f8da2f2ae47885890b0d433a3eeed2f9f37cbcfc444e4f1d880390fcdb765610210527f18d558857be01b2b10a8010bcdc6d60600000000000000000000000000000000610230527f319c02f6132c8a786377868b5825ada9a5fe303e9ae3b03ce56e90734a17ce97610240527f0c88b321012cf8dabb58211e3d50f61000000000000000000000000000000000610260527fabaafffffffffeb9ffff53b1feffab1e24f6b0f6a0d23067bf1285f3844b7764610660527fd7ac4b43b6a71b4b9ae67f39ea11011a00000000000000000000000000000000610680527ffdfffcfffcfff3890000000000000000000000000000000000000000000000006106905260015b6f000004b0000000300000015000000660c26f000004e0000000600000018000000660c26f0000051000000000000004e000000660c16f00000270000004b00000051000000660c06f000004b0000004b0000004e000000660c06f000004e0000000300000006000000660c06f00000510000001500000018000000660c06f000004e0000004e00000051000000660c26f000002a0000004e0000004b000000660c16f000004b000000090000001b000000660c26f000004e0000000c0000001e000000660c26f0000051000000000000004e000000660c16f000002d0000004b00000051000000660c06f000004b0000004b0000004e000000660c06f000004e000000090000000c000000660c06f00000510000001b0000001e000000660c06f000004e0000004e00000051000000660c26f00000300000004e0000004b000000660c16f000004b0000000f00000021000000660c26f000004e0000001200000024000000660c26f0000051000000000000004e000000660c16f00000330000004b00000051000000660c06f000004b0000004b0000004e000000660c06f000004e0000000f00000012000000660c06f00000510000002100000024000000660c06f000004e0000004e00000051000000660c26f00000360000004e0000004b000000660c16f0000039000000030000000f000000660c06f000003c0000000600000012000000660c06f000003f0000001500000021000000660c06f00000420000001800000024000000660c06f000004b000000390000003f000000660c26f000004e0000003c00000042000000660c26f0000051000000000000004e000000660c16f00000450000004b00000051000000660c06f000004b0000004b0000004e000000660c06f000004e000000390000003c000000660c06f00000510000003f00000042000000660c06f000004e0000004e00000051000000660c26f00000480000004e0000004b000000660c16f00000390000002700000033000000660c06f000003c0000002a00000036000000660c06f000003f0000004500000039000000660c16f0000042000000480000003c000000660c16f00000600000002d0000003f000000660c06f00000630000003000000042000000660c06f00000390000000300000009000000660c06f000003c000000060000000c000000660c06f000003f000000150000001b000000660c06f0000042000000180000001e000000660c06f000004b000000390000003f000000660c26f000004e0000003c00000042000000660c26f0000051000000000000004e000000660c16f00000450000004b00000051000000660c06f000004b0000004b0000004e000000660c06f000004e000000390000003c000000660c06f00000510000003f00000042000000660c06f000004e0000004e00000051000000660c26f00000480000004e0000004b000000660c16f0000039000000270000002d000000660c06f000003c0000002a00000030000000660c06f000003f0000004500000039000000660c16f0000042000000480000003c000000660c16f00000390000003300000036000000660c16f000003c0000003300000036000000660c06f000005a000000390000003f000000660c06f000005d0000003c00000042000000660c06f0000039000000090000000f000000660c06f000003c0000000c00000012000000660c06f000003f0000001b00000021000000660c06f00000420000001e00000024000000660c06f000004b000000390000003f000000660c26f000004e0000003c00000042000000660c26f0000051000000000000004e000000660c16f00000450000004b00000051000000660c06f000004b0000004b0000004e000000660c06f000004e000000390000003c000000660c06f00000510000003f00000042000000660c06f000004e0000004e00000051000000660c26f00000480000004e0000004b000000660c16f00000390000002d00000033000000660c06f000003c0000003000000036000000660c06f000003f0000004500000039000000660c16f0000042000000480000003c000000660c16f00000450000003f00000042000000660c16f00000480000003f00000042000000660c06f00000540000002700000045000000660c06f00000570000002a00000048000000660c06f000004b0000000300000015000000660c26f000004e0000000600000018000000660c26f0000051000000000000004e000000660c16f00000270000004b00000051000000660c06f000004b0000004b0000004e000000660c06f000004e0000000300000006000000660c06f00000510000001500000018000000660c06f000004e0000004e00000051000000660c26f000002a0000004e0000004b000000660c16f000004b000000090000001b000000660c26f000004e0000000c0000001e000000660c26f0000051000000000000004e000000660c16f000002d0000004b00000051000000660c06f000004b0000004b0000004e000000660c06f000004e000000090000000c000000660c06f00000510000001b0000001e000000660c06f000004e0000004e00000051000000660c26f00000300000004e0000004b000000660c16f000004b0000000f00000021000000660c26f000004e0000001200000024000000660c26f0000051000000000000004e000000660c16f00000330000004b00000051000000660c06f000004b0000004b0000004e000000660c06f000004e0000000f00000012000000660c06f00000510000002100000024000000660c06f000004e0000004e00000051000000660c26f00000360000004e0000004b000000660c16f0000039000000030000000f000000660c06f000003c0000000600000012000000660c06f000003f0000001500000021000000660c06f00000420000001800000024000000660c06f000004b000000390000003f000000660c26f000004e0000003c00000042000000660c26f0000051000000000000004e000000660c16f00000450000004b00000051000000660c06f000004b0000004b0000004e000000660c06f000004e000000390000003c000000660c06f00000510000003f00000042000000660c06f000004e0000004e00000051000000660c26f00000480000004e0000004b000000660c16f00000390000002700000033000000660c06f000003c0000002a00000036000000660c06f000003f0000004500000039000000660c16f0000042000000480000003c000000660c16f00000600000002d0000003f000000660c06f00000630000003000000042000000660c06f00000390000000300000009000000660c06f000003c000000060000000c000000660c06f000003f000000150000001b000000660c06f0000042000000180000001e000000660c06f000004b000000390000003f000000660c26f000004e0000003c00000042000000660c26f0000051000000000000004e000000660c16f00000450000004b00000051000000660c06f000004b0000004b0000004e000000660c06f000004e000000390000003c000000660c06f00000510000003f00000042000000660c06f000004e0000004e00000051000000660c26f00000480000004e0000004b000000660c16f0000039000000270000002d000000660c06f000003c0000002a00000030000000660c06f000003f0000004500000039000000660c16f0000042000000480000003c000000660c16f00000390000003300000036000000660c16f000003c0000003300000036000000660c06f000005a000000390000003f000000660c06f000005d0000003c00000042000000660c06f0000039000000090000000f000000660c06f000003c0000000c00000012000000660c06f000003f0000001b00000021000000660c06f00000420000001e00000024000000660c06f000004b000000390000003f000000660c26f000004e0000003c00000042000000660c26f0000051000000000000004e000000660c16f00000450000004b00000051000000660c06f000004b0000004b0000004e000000660c06f000004e000000390000003c000000660c06f00000510000003f00000042000000660c06f000004e0000004e00000051000000660c26f00000480000004e0000004b000000660c16f00000390000002d00000033000000660c06f000003c0000003000000036000000660c06f000003f0000004500000039000000660c16f0000042000000480000003c000000660c16f00000450000003f00000042000000660c16f00000480000003f00000042000000660c06f00000540000002700000045000000660c06f00000570000002a00000048000000660c06f000004b0000000300000015000000660c26f000004e0000000600000018000000660c26f0000051000000000000004e000000660c16f00000270000004b00000051000000660c06f000004b0000004b0000004e000000660c06f000004e0000000300000006000000660c06f00000510000001500000018000000660c06f000004e0000004e00000051000000660c26f000002a0000004e0000004b000000660c16f000004b000000090000001b000000660c26f000004e0000000c0000001e000000660c26f0000051000000000000004e000000660c16f000002d0000004b00000051000000660c06f000004b0000004b0000004e000000660c06f000004e000000090000000c000000660c06f00000510000001b0000001e000000660c06f000004e0000004e00000051000000660c26f00000300000004e0000004b000000660c16f000004b0000000f00000021000000660c26f000004e0000001200000024000000660c26f0000051000000000000004e000000660c16f00000330000004b00000051000000660c06f000004b0000004b0000004e000000660c06f000004e0000000f00000012000000660c06f00000510000002100000024000000660c06f000004e0000004e00000051000000660c26f00000360000004e0000004b000000660c16f0000039000000030000000f000000660c06f000003c0000000600000012000000660c06f000003f0000001500000021000000660c06f00000420000001800000024000000660c06f000004b000000390000003f000000660c26f000004e0000003c00000042000000660c26f0000051000000000000004e000000660c16f00000450000004b00000051000000660c06f000004b0000004b0000004e000000660c06f000004e000000390000003c000000660c06f00000510000003f00000042000000660c06f000004e0000004e00000051000000660c26f00000480000004e0000004b000000660c16f00000390000002700000033000000660c06f000003c0000002a00000036000000660c06f000003f0000004500000039000000660c16f0000042000000480000003c000000660c16f00000600000002d0000003f000000660c06f00000630000003000000042000000660c06f00000390000000300000009000000660c06f000003c000000060000000c000000660c06f000003f000000150000001b000000660c06f0000042000000180000001e000000660c06f000004b000000390000003f000000660c26f000004e0000003c00000042000000660c26f0000051000000000000004e000000660c16f00000450000004b00000051000000660c06f000004b0000004b0000004e000000660c06f000004e000000390000003c000000660c06f00000510000003f00000042000000660c06f000004e0000004e00000051000000660c26f00000480000004e0000004b000000660c16f0000039000000270000002d000000660c06f000003c0000002a00000030000000660c06f000003f0000004500000039000000660c16f0000042000000480000003c000000660c16f00000390000003300000036000000660c16f000003c0000003300000036000000660c06f000005a000000390000003f000000660c06f000005d0000003c00000042000000660c06f0000039000000090000000f000000660c06f000003c0000000c00000012000000660c06f000003f0000001b00000021000000660c06f00000420000001e00000024000000660c06f000004b000000390000003f000000660c26f000004e0000003c00000042000000660c26f0000051000000000000004e000000660c16f00000450000004b00000051000000660c06f000004b0000004b0000004e000000660c06f000004e000000390000003c000000660c06f00000510000003f00000042000000660c06f000004e0000004e00000051000000660c26f00000480000004e0000004b000000660c16f00000390000002d00000033000000660c06f000003c0000003000000036000000660c06f000003f0000004500000039000000660c16f0000042000000480000003c000000660c16f00000450000003f00000042000000660c16f00000480000003f00000042000000660c06f00000540000002700000045000000660c06f00000570000002a00000048000000660c06f000004b0000000300000015000000660c26f000004e0000000600000018000000660c26f0000051000000000000004e000000660c16f00000270000004b00000051000000660c06f000004b0000004b0000004e000000660c06f000004e0000000300000006000000660c06f00000510000001500000018000000660c06f000004e0000004e00000051000000660c26f000002a0000004e0000004b000000660c16f000004b000000090000001b000000660c26f000004e0000000c0000001e000000660c26f0000051000000000000004e000000660c16f000002d0000004b00000051000000660c06f000004b0000004b0000004e000000660c06f000004e000000090000000c000000660c06f00000510000001b0000001e000000660c06f000004e0000004e00000051000000660c26f00000300000004e0000004b000000660c16f000004b0000000f00000021000000660c26f000004e0000001200000024000000660c26f0000051000000000000004e000000660c16f00000330000004b00000051000000660c06f000004b0000004b0000004e000000660c06f000004e0000000f00000012000000660c06f00000510000002100000024000000660c06f000004e0000004e00000051000000660c26f00000360000004e0000004b000000660c16f0000039000000030000000f000000660c06f000003c0000000600000012000000660c06f000003f0000001500000021000000660c06f00000420000001800000024000000660c06f000004b000000390000003f000000660c26f000004e0000003c00000042000000660c26f0000051000000000000004e000000660c16f00000450000004b00000051000000660c06f000004b0000004b0000004e000000660c06f000004e000000390000003c000000660c06f00000510000003f00000042000000660c06f000004e0000004e00000051000000660c26f00000480000004e0000004b000000660c16f00000390000002700000033000000660c06f000003c0000002a00000036000000660c06f000003f0000004500000039000000660c16f0000042000000480000003c000000660c16f00000600000002d0000003f000000660c06f00000630000003000000042000000660c06f00000390000000300000009000000660c06f000003c000000060000000c000000660c06f000003f000000150000001b000000660c06f0000042000000180000001e000000660c06f000004b000000390000003f000000660c26f000004e0000003c00000042000000660c26f0000051000000000000004e000000660c16f00000450000004b00000051000000660c06f000004b0000004b0000004e000000660c06f000004e000000390000003c000000660c06f00000510000003f00000042000000660c06f000004e0000004e00000051000000660c26f00000480000004e0000004b000000660c16f0000039000000270000002d000000660c06f000003c0000002a00000030000000660c06f000003f0000004500000039000000660c16f0000042000000480000003c000000660c16f00000390000003300000036000000660c16f000003c0000003300000036000000660c06f000005a000000390000003f000000660c06f000005d0000003c00000042000000660c06f0000039000000090000000f000000660c06f000003c0000000c00000012000000660c06f000003f0000001b00000021000000660c06f00000420000001e00000024000000660c06f000004b000000390000003f000000660c26f000004e0000003c00000042000000660c26f0000051000000000000004e000000660c16f00000450000004b00000051000000660c06f000004b0000004b0000004e000000660c06f000004e000000390000003c000000660c06f00000510000003f00000042000000660c06f000004e0000004e00000051000000660c26f00000480000004e0000004b000000660c16f00000390000002d00000033000000660c06f000003c0000003000000036000000660c06f000003f0000004500000039000000660c16f0000042000000480000003c000000660c16f00000450000003f00000042000000660c16f00000480000003f00000042000000660c06f00000540000002700000045000000660c06f00000570000002a00000048000000660c06f000004b0000000300000015000000660c26f000004e0000000600000018000000660c26f0000051000000000000004e000000660c16f00000270000004b00000051000000660c06f000004b0000004b0000004e000000660c06f000004e0000000300000006000000660c06f00000510000001500000018000000660c06f000004e0000004e00000051000000660c26f000002a0000004e0000004b000000660c16f000004b000000090000001b000000660c26f000004e0000000c0000001e000000660c26f0000051000000000000004e000000660c16f000002d0000004b00000051000000660c06f000004b0000004b0000004e000000660c06f000004e000000090000000c000000660c06f00000510000001b0000001e000000660c06f000004e0000004e00000051000000660c26f00000300000004e0000004b000000660c16f000004b0000000f00000021000000660c26f000004e0000001200000024000000660c26f0000051000000000000004e000000660c16f00000330000004b00000051000000660c06f000004b0000004b0000004e000000660c06f000004e0000000f00000012000000660c06f00000510000002100000024000000660c06f000004e0000004e00000051000000660c26f00000360000004e0000004b000000660c16f0000039000000030000000f000000660c06f000003c0000000600000012000000660c06f000003f0000001500000021000000660c06f00000420000001800000024000000660c06f000004b000000390000003f000000660c26f000004e0000003c00000042000000660c26f0000051000000000000004e000000660c16f00000450000004b00000051000000660c06f000004b0000004b0000004e000000660c06f000004e000000390000003c000000660c06f00000510000003f00000042000000660c06f000004e0000004e00000051000000660c26f00000480000004e0000004b000000660c16f00000390000002700000033000000660c06f000003c0000002a00000036000000660c06f000003f0000004500000039000000660c16f0000042000000480000003c000000660c16f00000600000002d0000003f000000660c06f00000630000003000000042000000660c06f00000390000000300000009000000660c06f000003c000000060000000c000000660c06f000003f000000150000001b000000660c06f0000042000000180000001e000000660c06f000004b000000390000003f000000660c26f000004e0000003c00000042000000660c26f0000051000000000000004e000000660c16f00000450000004b00000051000000660c06f000004b0000004b0000004e000000660c06f000004e000000390000003c000000660c06f00000510000003f00000042000000660c06f000004e0000004e00000051000000660c26f00000480000004e0000004b000000660c16f0000039000000270000002d000000660c06f000003c0000002a00000030000000660c06f000003f0000004500000039000000660c16f0000042000000480000003c000000660c16f00000390000003300000036000000660c16f000003c0000003300000036000000660c06f000005a000000390000003f000000660c06f000005d0000003c00000042000000660c06f0000039000000090000000f000000660c06f000003c0000000c00000012000000660c06f000003f0000001b00000021000000660c06f00000420000001e00000024000000660c06f000004b000000390000003f000000660c26f000004e0000003c00000042000000660c26f0000051000000000000004e000000660c16f00000450000004b00000051000000660c06f000004b0000004b0000004e000000660c06f000004e000000390000003c000000660c06f00000510000003f00000042000000660c06f000004e0000004e00000051000000660c26f00000480000004e0000004b000000660c16f00000390000002d00000033000000660c06f000003c0000003000000036000000660c06f000003f0000004500000039000000660c16f0000042000000480000003c000000660c16f00000450000003f00000042000000660c16f00000480000003f00000042000000660c06f00000540000002700000045000000660c06f00000570000002a00000048000000660c06f000004b0000000300000015000000660c26f000004e0000000600000018000000660c26f0000051000000000000004e000000660c16f00000270000004b00000051000000660c06f000004b0000004b0000004e000000660c06f000004e0000000300000006000000660c06f00000510000001500000018000000660c06f000004e0000004e00000051000000660c26f000002a0000004e0000004b000000660c16f000004b000000090000001b000000660c26f000004e0000000c0000001e000000660c26f0000051000000000000004e000000660c16f000002d0000004b00000051000000660c06f000004b0000004b0000004e000000660c06f000004e000000090000000c000000660c06f00000510000001b0000001e000000660c06f000004e0000004e00000051000000660c26f00000300000004e0000004b000000660c16f000004b0000000f00000021000000660c26f000004e0000001200000024000000660c26f0000051000000000000004e000000660c16f00000330000004b00000051000000660c06f000004b0000004b0000004e000000660c06f000004e0000000f00000012000000660c06f00000510000002100000024000000660c06f000004e0000004e00000051000000660c26f00000360000004e0000004b000000660c16f0000039000000030000000f000000660c06f000003c0000000600000012000000660c06f000003f0000001500000021000000660c06f00000420000001800000024000000660c06f000004b000000390000003f000000660c26f000004e0000003c00000042000000660c26f0000051000000000000004e000000660c16f00000450000004b00000051000000660c06f000004b0000004b0000004e000000660c06f000004e000000390000003c000000660c06f00000510000003f00000042000000660c06f000004e0000004e00000051000000660c26f00000480000004e0000004b000000660c16f00000390000002700000033000000660c06f000003c0000002a00000036000000660c06f000003f0000004500000039000000660c16f0000042000000480000003c000000660c16f00000600000002d0000003f000000660c06f00000630000003000000042000000660c06f00000390000000300000009000000660c06f000003c000000060000000c000000660c06f000003f000000150000001b000000660c06f0000042000000180000001e000000660c06f000004b000000390000003f000000660c26f000004e0000003c00000042000000660c26f0000051000000000000004e000000660c16f00000450000004b00000051000000660c06f000004b0000004b0000004e000000660c06f000004e000000390000003c000000660c06f00000510000003f00000042000000660c06f000004e0000004e00000051000000660c26f00000480000004e0000004b000000660c16f0000039000000270000002d000000660c06f000003c0000002a00000030000000660c06f000003f0000004500000039000000660c16f0000042000000480000003c000000660c16f00000390000003300000036000000660c16f000003c0000003300000036000000660c06f000005a000000390000003f000000660c06f000005d0000003c00000042000000660c06f0000039000000090000000f000000660c06f000003c0000000c00000012000000660c06f000003f0000001b00000021000000660c06f00000420000001e00000024000000660c06f000004b000000390000003f000000660c26f000004e0000003c00000042000000660c26f0000051000000000000004e000000660c16f00000450000004b00000051000000660c06f000004b0000004b0000004e000000660c06f000004e000000390000003c000000660c06f00000510000003f00000042000000660c06f000004e0000004e00000051000000660c26f00000480000004e0000004b000000660c16f00000390000002d00000033000000660c06f000003c0000003000000036000000660c06f000003f0000004500000039000000660c16f0000042000000480000003c000000660c16f00000450000003f00000042000000660c16f00000480000003f00000042000000660c06f00000540000002700000045000000660c06f00000570000002a00000048000000660c06f000004b0000000300000015000000660c26f000004e0000000600000018000000660c26f0000051000000000000004e000000660c16f00000270000004b00000051000000660c06f000004b0000004b0000004e000000660c06f000004e0000000300000006000000660c06f00000510000001500000018000000660c06f000004e0000004e00000051000000660c26f000002a0000004e0000004b000000660c16f000004b000000090000001b000000660c26f000004e0000000c0000001e000000660c26f0000051000000000000004e000000660c16f000002d0000004b00000051000000660c06f000004b0000004b0000004e000000660c06f000004e000000090000000c000000660c06f00000510000001b0000001e000000660c06f000004e0000004e00000051000000660c26f00000300000004e0000004b000000660c16f000004b0000000f00000021000000660c26f000004e0000001200000024000000660c26f0000051000000000000004e000000660c16f00000330000004b00000051000000660c06f000004b0000004b0000004e000000660c06f000004e0000000f00000012000000660c06f00000510000002100000024000000660c06f000004e0000004e00000051000000660c26f00000360000004e0000004b000000660c16f0000039000000030000000f000000660c06f000003c0000000600000012000000660c06f000003f0000001500000021000000660c06f00000420000001800000024000000660c06f000004b000000390000003f000000660c26f000004e0000003c00000042000000660c26f0000051000000000000004e000000660c16f00000450000004b00000051000000660c06f000004b0000004b0000004e000000660c06f000004e000000390000003c000000660c06f00000510000003f00000042000000660c06f000004e0000004e00000051000000660c26f00000480000004e0000004b000000660c16f00000390000002700000033000000660c06f000003c0000002a00000036000000660c06f000003f0000004500000039000000660c16f0000042000000480000003c000000660c16f00000600000002d0000003f000000660c06f00000630000003000000042000000660c06f00000390000000300000009000000660c06f000003c000000060000000c000000660c06f000003f000000150000001b000000660c06f0000042000000180000001e000000660c06f000004b000000390000003f000000660c26f000004e0000003c00000042000000660c26f0000051000000000000004e000000660c16f00000450000004b00000051000000660c06f000004b0000004b0000004e000000660c06f000004e000000390000003c000000660c06f00000510000003f00000042000000660c06f000004e0000004e00000051000000660c26f00000480000004e0000004b000000660c16f0000039000000270000002d000000660c06f000003c0000002a00000030000000660c06f000003f0000004500000039000000660c16f0000042000000480000003c000000660c16f00000390000003300000036000000660c16f000003c0000003300000036000000660c06f000005a000000390000003f000000660c06f000005d0000003c00000042000000660c06f0000039000000090000000f000000660c06f000003c0000000c00000012000000660c06f000003f0000001b00000021000000660c06f00000420000001e00000024000000660c06f000004b000000390000003f000000660c26f000004e0000003c00000042000000660c26f0000051000000000000004e000000660c16f00000450000004b00000051000000660c06f000004b0000004b0000004e000000660c06f000004e000000390000003c000000660c06f00000510000003f00000042000000660c06f000004e0000004e00000051000000660c26f00000480000004e0000004b000000660c16f00000390000002d00000033000000660c06f000003c0000003000000036000000660c06f000003f0000004500000039000000660c16f0000042000000480000003c000000660c16f00000450000003f00000042000000660c16f00000480000003f00000042000000660c06f00000540000002700000045000000660c06f00000570000002a00000048000000660c06f000004b0000000300000015000000660c26f000004e0000000600000018000000660c26f0000051000000000000004e000000660c16f00000270000004b00000051000000660c06f000004b0000004b0000004e000000660c06f000004e0000000300000006000000660c06f00000510000001500000018000000660c06f000004e0000004e00000051000000660c26f000002a0000004e0000004b000000660c16f000004b000000090000001b000000660c26f000004e0000000c0000001e000000660c26f0000051000000000000004e000000660c16f000002d0000004b00000051000000660c06f000004b0000004b0000004e000000660c06f000004e000000090000000c000000660c06f00000510000001b0000001e000000660c06f000004e0000004e00000051000000660c26f00000300000004e0000004b000000660c16f000004b0000000f00000021000000660c26f000004e0000001200000024000000660c26f0000051000000000000004e000000660c16f00000330000004b00000051000000660c06f000004b0000004b0000004e000000660c06f000004e0000000f00000012000000660c06f00000510000002100000024000000660c06f000004e0000004e00000051000000660c26f00000360000004e0000004b000000660c16f0000039000000030000000f000000660c06f000003c0000000600000012000000660c06f000003f0000001500000021000000660c06f00000420000001800000024000000660c06f000004b000000390000003f000000660c26f000004e0000003c00000042000000660c26f0000051000000000000004e000000660c16f00000450000004b00000051000000660c06f000004b0000004b0000004e000000660c06f000004e000000390000003c000000660c06f00000510000003f00000042000000660c06f000004e0000004e00000051000000660c26f00000480000004e0000004b000000660c16f00000390000002700000033000000660c06f000003c0000002a00000036000000660c06f000003f0000004500000039000000660c16f0000042000000480000003c000000660c16f00000600000002d0000003f000000660c06f00000630000003000000042000000660c06f00000390000000300000009000000660c06f000003c000000060000000c000000660c06f000003f000000150000001b000000660c06f0000042000000180000001e000000660c06f000004b000000390000003f000000660c26f000004e0000003c00000042000000660c26f0000051000000000000004e000000660c16f00000450000004b00000051000000660c06f000004b0000004b0000004e000000660c06f000004e000000390000003c000000660c06f00000510000003f00000042000000660c06f000004e0000004e00000051000000660c26f00000480000004e0000004b000000660c16f0000039000000270000002d000000660c06f000003c0000002a00000030000000660c06f000003f0000004500000039000000660c16f0000042000000480000003c000000660c16f00000390000003300000036000000660c16f000003c0000003300000036000000660c06f000005a000000390000003f000000660c06f000005d0000003c00000042000000660c06f0000039000000090000000f000000660c06f000003c0000000c00000012000000660c06f000003f0000001b00000021000000660c06f00000420000001e00000024000000660c06f000004b000000390000003f000000660c26f000004e0000003c00000042000000660c26f0000051000000000000004e000000660c16f00000450000004b00000051000000660c06f000004b0000004b0000004e000000660c06f000004e000000390000003c000000660c06f00000510000003f00000042000000660c06f000004e0000004e00000051000000660c26f00000480000004e0000004b000000660c16f00000390000002d00000033000000660c06f000003c0000003000000036000000660c06f000003f0000004500000039000000660c16f0000042000000480000003c000000660c16f00000450000003f00000042000000660c16f00000480000003f00000042000000660c06f00000540000002700000045000000660c06f00000570000002a00000048000000660c06f000004b0000000300000015000000660c26f000004e0000000600000018000000660c26f0000051000000000000004e000000660c16f00000270000004b00000051000000660c06f000004b0000004b0000004e000000660c06f000004e0000000300000006000000660c06f00000510000001500000018000000660c06f000004e0000004e00000051000000660c26f000002a0000004e0000004b000000660c16f000004b000000090000001b000000660c26f000004e0000000c0000001e000000660c26f0000051000000000000004e000000660c16f000002d0000004b00000051000000660c06f000004b0000004b0000004e000000660c06f000004e000000090000000c000000660c06f00000510000001b0000001e000000660c06f000004e0000004e00000051000000660c26f00000300000004e0000004b000000660c16f000004b0000000f00000021000000660c26f000004e0000001200000024000000660c26f0000051000000000000004e000000660c16f00000330000004b00000051000000660c06f000004b0000004b0000004e000000660c06f000004e0000000f00000012000000660c06f00000510000002100000024000000660c06f000004e0000004e00000051000000660c26f00000360000004e0000004b000000660c16f0000039000000030000000f000000660c06f000003c0000000600000012000000660c06f000003f0000001500000021000000660c06f00000420000001800000024000000660c06f000004b000000390000003f000000660c26f000004e0000003c00000042000000660c26f0000051000000000000004e000000660c16f00000450000004b00000051000000660c06f000004b0000004b0000004e000000660c06f000004e000000390000003c000000660c06f00000510000003f00000042000000660c06f000004e0000004e00000051000000660c26f00000480000004e0000004b000000660c16f00000390000002700000033000000660c06f000003c0000002a00000036000000660c06f000003f0000004500000039000000660c16f0000042000000480000003c000000660c16f00000600000002d0000003f000000660c06f00000630000003000000042000000660c06f00000390000000300000009000000660c06f000003c000000060000000c000000660c06f000003f000000150000001b000000660c06f0000042000000180000001e000000660c06f000004b000000390000003f000000660c26f000004e0000003c00000042000000660c26f0000051000000000000004e000000660c16f00000450000004b00000051000000660c06f000004b0000004b0000004e000000660c06f000004e000000390000003c000000660c06f00000510000003f00000042000000660c06f000004e0000004e00000051000000660c26f00000480000004e0000004b000000660c16f0000039000000270000002d000000660c06f000003c0000002a00000030000000660c06f000003f0000004500000039000000660c16f0000042000000480000003c000000660c16f00000390000003300000036000000660c16f000003c0000003300000036000000660c06f000005a000000390000003f000000660c06f000005d0000003c00000042000000660c06f0000039000000090000000f000000660c06f000003c0000000c00000012000000660c06f000003f0000001b00000021000000660c06f00000420000001e00000024000000660c06f000004b000000390000003f000000660c26f000004e0000003c00000042000000660c26f0000051000000000000004e000000660c16f00000450000004b00000051000000660c06f000004b0000004b0000004e000000660c06f000004e000000390000003c000000660c06f00000510000003f00000042000000660c06f000004e0000004e00000051000000660c26f00000480000004e0000004b000000660c16f00000390000002d00000033000000660c06f000003c0000003000000036000000660c06f000003f0000004500000039000000660c16f0000042000000480000003c000000660c16f00000450000003f00000042000000660c16f00000480000003f00000042000000660c06f00000540000002700000045000000660c06f00000570000002a00000048000000660c06f000004b0000000300000015000000660c26f000004e0000000600000018000000660c26f0000051000000000000004e000000660c16f00000270000004b00000051000000660c06f000004b0000004b0000004e000000660c06f000004e0000000300000006000000660c06f00000510000001500000018000000660c06f000004e0000004e00000051000000660c26f000002a0000004e0000004b000000660c16f000004b000000090000001b000000660c26f000004e0000000c0000001e000000660c26f0000051000000000000004e000000660c16f000002d0000004b00000051000000660c06f000004b0000004b0000004e000000660c06f000004e000000090000000c000000660c06f00000510000001b0000001e000000660c06f000004e0000004e00000051000000660c26f00000300000004e0000004b000000660c16f000004b0000000f00000021000000660c26f000004e0000001200000024000000660c26f0000051000000000000004e000000660c16f00000330000004b00000051000000660c06f000004b0000004b0000004e000000660c06f000004e0000000f00000012000000660c06f00000510000002100000024000000660c06f000004e0000004e00000051000000660c26f00000360000004e0000004b000000660c16f0000039000000030000000f000000660c06f000003c0000000600000012000000660c06f000003f0000001500000021000000660c06f00000420000001800000024000000660c06f000004b000000390000003f000000660c26f000004e0000003c00000042000000660c26f0000051000000000000004e000000660c16f00000450000004b00000051000000660c06f000004b0000004b0000004e000000660c06f000004e000000390000003c000000660c06f00000510000003f00000042000000660c06f000004e0000004e00000051000000660c26f00000480000004e0000004b000000660c16f00000390000002700000033000000660c06f000003c0000002a00000036000000660c06f000003f0000004500000039000000660c16f0000042000000480000003c000000660c16f00000600000002d0000003f000000660c06f00000630000003000000042000000660c06f00000390000000300000009000000660c06f000003c000000060000000c000000660c06f000003f000000150000001b000000660c06f0000042000000180000001e000000660c06f000004b000000390000003f000000660c26f000004e0000003c00000042000000660c26f0000051000000000000004e000000660c16f00000450000004b00000051000000660c06f000004b0000004b0000004e000000660c06f000004e000000390000003c000000660c06f00000510000003f00000042000000660c06f000004e0000004e00000051000000660c26f00000480000004e0000004b000000660c16f0000039000000270000002d000000660c06f000003c0000002a00000030000000660c06f000003f0000004500000039000000660c16f0000042000000480000003c000000660c16f00000390000003300000036000000660c16f000003c0000003300000036000000660c06f000005a000000390000003f000000660c06f000005d0000003c00000042000000660c06f0000039000000090000000f000000660c06f000003c0000000c00000012000000660c06f000003f0000001b00000021000000660c06f00000420000001e00000024000000660c06f000004b000000390000003f000000660c26f000004e0000003c00000042000000660c26f0000051000000000000004e000000660c16f00000450000004b00000051000000660c06f000004b0000004b0000004e000000660c06f000004e000000390000003c000000660c06f00000510000003f00000042000000660c06f000004e0000004e00000051000000660c26f00000480000004e0000004b000000660c16f00000390000002d00000033000000660c06f000003c0000003000000036000000660c06f000003f0000004500000039000000660c16f0000042000000480000003c000000660c16f00000450000003f00000042000000660c16f00000480000003f00000042000000660c06f00000540000002700000045000000660c06f00000570000002a00000048000000660c060406141e5610bb83960010180608710602002610bb80151565b60ff60005360016000f300000000000000000000000000000000000000000000000000000000000003e000000000000000000000000000000000000000000000000000000000000041da",
"data" : "0x",
"gas" : "0x989680",
"gasPrice" : "0x0c",
"origin" : "0xcd1722f2947def4cf144679da39c4c32bdc35681",
"value" : "0x0b"
},
"gas" : "0x013874",
"logs" : "0x1dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d49347",
"out" : "0x",
"post" : {
"0x0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6" : {
"balance" : "0x0de0b6b3a7640000",
"code" : "0x",
"nonce" : "0x00",
"storage" : {
}
}
},
"pre" : {
"0x0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6" : {
"balance" : "0x0de0b6b3a7640000",
"code" : "0x",
"nonce" : "0x00",
"storage" : {
}
}
}
}
}
// this is a dummy macro which lets me evaluate arithmetic at compile-time
template<val>
#define macro EVAL_ARITHMETIC = takes(0) returns(1) {
<val>
}
// these are various hard-coded memory offsets which we use for various buffers
#define macro NUM_BYTES = takes(0) returns(1) {
48
}
#define macro F6M_MUL_OUT = takes(0) returns(1) { // 6 values
1344 // EVAL_ARITHMETIC<0x1c*48>()
}
#define macro F1_TMP = takes(0) returns(1) { // 3 values
1200 // EVAL_ARITHMETIC<0x19*48>()
}
#define macro F6M_MUL_R_TMP = takes(0) returns(1) { // 6 values, but we have 8 values, first two zeros
912 // EVAL_ARITHMETIC<0x13*48>()
}
#define macro F6M_MUL_BUFFER_AA_BB_CC = takes(0) returns(1) { // 6 values
624 // EVAL_ARITHMETIC<0x0d*48>()
}
#define macro F6_INPUTABC = takes(0) returns(1) { // 6 values
48 // EVAL_ARITHMETIC<0x01*48>()
}
#define macro MOD_OFFSET = takes(0) returns(1) { // 1.5 values
0x660 // EVAL_ARITHMETIC<256*48>()
}
// next we have various macros for f2m and f6m arithmetic, including multiplication.
/*
Convention: memory is set up as follows
<idx> <variable>, where <idx> is the memory location divided by 48 (i.e. the idx'th 48-byte chunk), and <variable> is the variable name
00 zero
01 a0
02 a1
03 b0
04 b1
05 c0
06 c1
07 A0
08 A1
09 B0
0a B1
0b C0
0c C1
0d aA0
0e aA1
0f bB0
10 bB1
11 cC0
12 cC1
13 tmp10
14 tmp11
15 tmp20
16 tmp21
17 tmp30
18 tmp31
19 f1tmp1
1a f1tmp2
1b f1tmp3
1c out00
1d out01
1e out10
1f out11
20 out20
21 out21
22 mod_and_inv
*/
// this is the main macro for f6m_mul
#define macro F6M_MUL = takes(0) returns(0) {
// first precompute aA, bB, and cC, which we will reuse
// f2m_mul aA = a * A
0x000004b0000000300000015000000660 mulmodmont384 // tmp1 = x0*y0
0x000004e0000000600000018000000660 mulmodmont384 // tmp2 = x1*y1
0x0000051000000000000004e000000660 submod384 // tmp3 = zero-tmp2
0x00000270000004b00000051000000660 addmod384 // out0 = tmp1+tmp3
0x000004b0000004b0000004e000000660 addmod384 // tmp1 = tmp1+tmp2
0x000004e0000000300000006000000660 addmod384 // tmp2 = x0+x1
0x00000510000001500000018000000660 addmod384 // tmp3 = y0+y1
0x000004e0000004e00000051000000660 mulmodmont384 // tmp2 = tmp2*tmp3
0x000002a0000004e0000004b000000660 submod384 // out1 = tmp2-tmp1
// f2m_mul bB = b * B
0x000004b000000090000001b000000660 mulmodmont384 // tmp1 = x0*y0
0x000004e0000000c0000001e000000660 mulmodmont384 // tmp2 = x1*y1
0x0000051000000000000004e000000660 submod384 // tmp3 = zero-tmp2
0x000002d0000004b00000051000000660 addmod384 // out0 = tmp1+tmp3
0x000004b0000004b0000004e000000660 addmod384 // tmp1 = tmp1+tmp2
0x000004e000000090000000c000000660 addmod384 // tmp2 = x0+x1
0x00000510000001b0000001e000000660 addmod384 // tmp3 = y0+y1
0x000004e0000004e00000051000000660 mulmodmont384 // tmp2 = tmp2*tmp3
0x00000300000004e0000004b000000660 submod384 // out1 = tmp2-tmp1
// f2m_mul cC = c * C
0x000004b0000000f00000021000000660 mulmodmont384 // tmp1 = x0*y0
0x000004e0000001200000024000000660 mulmodmont384 // tmp2 = x1*y1
0x0000051000000000000004e000000660 submod384 // tmp3 = zero-tmp2
0x00000330000004b00000051000000660 addmod384 // out0 = tmp1+tmp3
0x000004b0000004b0000004e000000660 addmod384 // tmp1 = tmp1+tmp2
0x000004e0000000f00000012000000660 addmod384 // tmp2 = x0+x1
0x00000510000002100000024000000660 addmod384 // tmp3 = y0+y1
0x000004e0000004e00000051000000660 mulmodmont384 // tmp2 = tmp2*tmp3
0x00000360000004e0000004b000000660 submod384 // out1 = tmp2-tmp1
// next compute each of the three output f2 points, which are together an f6 point
// F6M_MUL_R2
// f2m_add tmp1 = a + c
0x0000039000000030000000f000000660 addmod384
0x000003c0000000600000012000000660 addmod384
// f2m_add tmp2 = A + C
0x000003f0000001500000021000000660 addmod384
0x00000420000001800000024000000660 addmod384
// f2m_mul tmp3 = tmp1 * tmp2
0x000004b000000390000003f000000660 mulmodmont384 // tmp1 = x0*y0
0x000004e0000003c00000042000000660 mulmodmont384 // tmp2 = x1*y1
0x0000051000000000000004e000000660 submod384 // tmp3 = zero-tmp2
0x00000450000004b00000051000000660 addmod384 // out0 = tmp1+tmp3
0x000004b0000004b0000004e000000660 addmod384 // tmp1 = tmp1+tmp2
0x000004e000000390000003c000000660 addmod384 // tmp2 = x0+x1
0x00000510000003f00000042000000660 addmod384 // tmp3 = y0+y1
0x000004e0000004e00000051000000660 mulmodmont384 // tmp2 = tmp2*tmp3
0x00000480000004e0000004b000000660 submod384 // out1 = tmp2-tmp1
// f2m_add tmp1 = aA + cC
0x00000390000002700000033000000660 addmod384
0x000003c0000002a00000036000000660 addmod384
// f2m_sub tmp2 = tmp3 - tmp1
0x000003f0000004500000039000000660 submod384
0x0000042000000480000003c000000660 submod384
// f2m_add r2 = 0f + tmp2
0x00000600000002d0000003f000000660 addmod384
0x00000630000003000000042000000660 addmod384
// F6M_MUL_R1
// f2m_add tmp1 = a + b
0x00000390000000300000009000000660 addmod384
0x000003c000000060000000c000000660 addmod384
// f2m_add tmp2 = A + B
0x000003f000000150000001b000000660 addmod384
0x0000042000000180000001e000000660 addmod384
// f2m_mul tmp3 = tmp1 * tmp2
0x000004b000000390000003f000000660 mulmodmont384 // tmp1 = x0*y0
0x000004e0000003c00000042000000660 mulmodmont384 // tmp2 = x1*y1
0x0000051000000000000004e000000660 submod384 // tmp3 = zero-tmp2
0x00000450000004b00000051000000660 addmod384 // out0 = tmp1+tmp3
0x000004b0000004b0000004e000000660 addmod384 // tmp1 = tmp1+tmp2
0x000004e000000390000003c000000660 addmod384 // tmp2 = x0+x1
0x00000510000003f00000042000000660 addmod384 // tmp3 = y0+y1
0x000004e0000004e00000051000000660 mulmodmont384 // tmp2 = tmp2*tmp3
0x00000480000004e0000004b000000660 submod384 // out1 = tmp2-tmp1
// f2m_add tmp1 = aA + bB
0x0000039000000270000002d000000660 addmod384
0x000003c0000002a00000030000000660 addmod384
// f2m_sub tmp2 = tmp3 - tmp1
0x000003f0000004500000039000000660 submod384
0x0000042000000480000003c000000660 submod384
// mul_nr2 tmp1 = mulnr2(cC)
0x00000390000003300000036000000660 submod384 // out0 = x0-x1
0x000003c0000003300000036000000660 addmod384 // out1 = x0+x1
// f2m_add r1 = tmp1 + tmp2
0x000005a000000390000003f000000660 addmod384
0x000005d0000003c00000042000000660 addmod384
// F6M_MUL_R0
// f2m_add tmp1 = b + c
0x0000039000000090000000f000000660 addmod384
0x000003c0000000c00000012000000660 addmod384
// f2m_add tmp2 = B + C
0x000003f0000001b00000021000000660 addmod384
0x00000420000001e00000024000000660 addmod384
// f2m_mul tmp3 = tmp1 * tmp2
0x000004b000000390000003f000000660 mulmodmont384 // tmp1 = x0*y0
0x000004e0000003c00000042000000660 mulmodmont384 // tmp2 = x1*y1
0x0000051000000000000004e000000660 submod384 // tmp3 = zero-tmp2
0x00000450000004b00000051000000660 addmod384 // out0 = tmp1+tmp3
0x000004b0000004b0000004e000000660 addmod384 // tmp1 = tmp1+tmp2
0x000004e000000390000003c000000660 addmod384 // tmp2 = x0+x1
0x00000510000003f00000042000000660 addmod384 // tmp3 = y0+y1
0x000004e0000004e00000051000000660 mulmodmont384 // tmp2 = tmp2*tmp3
0x00000480000004e0000004b000000660 submod384 // out1 = tmp2-tmp1
// f2m_add tmp1 = bB + cC
0x00000390000002d00000033000000660 addmod384
0x000003c0000003000000036000000660 addmod384
// f2m_sub tmp2 = tmp3 - tmp1
0x000003f0000004500000039000000660 submod384
0x0000042000000480000003c000000660 submod384
// mul_nr2 tmp3 = tmp2
0x00000450000003f00000042000000660 submod384 // out0 = x0-x1
0x00000480000003f00000042000000660 addmod384 // out1 = x0+x1
// f2m_add r0 = aA + tmp3
0x00000540000002700000045000000660 addmod384
0x00000570000002a00000048000000660 addmod384
/*
// more concisely, the above takes input f6 points abc and ABC, and outputs f6 point r. In other words, it inputs six f2 points, a, b, c, A, B, C, and ouputs three f2 points r0, r1, r2. And each f2 point is two f1 points. And an f1 point is a 48-bit integer.
// set up aA, bB, and cC
f2m_mul aA = a * A
f2m_mul bB = b * B
f2m_mul cC = c * C
// F6M_MUL_R2
f2m_add tmp1 = a + c
f2m_add tmp2 = A + C
f2m_mul tmp3 = tmp1 * tmp2
f2m_add tmp1 = aA + cC
f2m_sub tmp2 = tmp3 - tmp1
f2m_add r2 = bB + tmp2
// F6M_MUL_R1
f2m_add tmp1 = a + b
f2m_add tmp2 = A + B
f2m_mul tmp3 = tmp1 * tmp2
f2m_add tmp1 = aA + bB
f2m_sub tmp2 = tmp3 - tmp1
mul_nr2 tmp1 = mulnr2(cC)
f2m_add r1 = tmp1 + tmp2
// F6M_MUL_R0
f2m_add tmp1 = b + c
f2m_add tmp2 = B + C
f2m_mul tmp3 = tmp1 * tmp2
f2m_add tmp1 = bB + cC
f2m_sub tmp2 = tmp3 - tmp1
mul_nr2 tmp3 = tmp2
f2m_add r0 = aA + tmp3
*/
}
///////////////
// f6m_mul test
#define macro F6M_MUL_TEST_HARDCODED = takes(0) returns(0) {
// set up memory
// a0
0x0daa35e7a880a2ca3bcea128c5c8d17202945981a13aec134d10c051c1fa23c0 EVAL_ARITHMETIC<F6_INPUTABC+NUM_BYTES*2*0+NUM_BYTES*0>() mstore
0x6b3088c3a380f4b8b1f598e5f390298f00000000000000000000000000000000 EVAL_ARITHMETIC<F6_INPUTABC+NUM_BYTES*2*0+NUM_BYTES*0+32>() mstore
// a1
0x0918e9882e10abce5a0f55c6916e3be87e5dc68b9d3324db632d33c3fb53868f EVAL_ARITHMETIC<F6_INPUTABC+NUM_BYTES*2*0+NUM_BYTES*1>() mstore
0x77c0488c7e3ab230d54c6d90277a2d9900000000000000000000000000000000 EVAL_ARITHMETIC<F6_INPUTABC+NUM_BYTES*2*0+NUM_BYTES*1+32>() mstore
// b0
0x18a6c5f02807687486eee2410b7040ac5c0e564cabe64e12fb8c35578a61f36f EVAL_ARITHMETIC<F6_INPUTABC+NUM_BYTES*2*1+NUM_BYTES*0>() mstore
0xed7413e994a3c6c4086f81467190997200000000000000000000000000000000 EVAL_ARITHMETIC<F6_INPUTABC+NUM_BYTES*2*1+NUM_BYTES*0+32>() mstore
// b1
0x00d2a9d9e2674057794afa89fcf3e8edb7b032354dddf7dd8268a83a92d72dd6 EVAL_ARITHMETIC<F6_INPUTABC+NUM_BYTES*2*1+NUM_BYTES*1>() mstore
0xb1931fec1cd2f8a052b99eb3627fd70f00000000000000000000000000000000 EVAL_ARITHMETIC<F6_INPUTABC+NUM_BYTES*2*1+NUM_BYTES*1+32>() mstore
// c0
0x13ac019d8914d7479fe7c4731a4033251a384cb89a53b823e1c635ab7589a4a6 EVAL_ARITHMETIC<F6_INPUTABC+NUM_BYTES*2*2+NUM_BYTES*0>() mstore
0x7eeff9aa243283c4b48c3db146de697a00000000000000000000000000000000 EVAL_ARITHMETIC<F6_INPUTABC+NUM_BYTES*2*2+NUM_BYTES*0+32>() mstore
// c1
0x181bf207cb40cbf95b6d18e0bf2789982fccb608f7b9fe2b9f78880e569b144d EVAL_ARITHMETIC<F6_INPUTABC+NUM_BYTES*2*2+NUM_BYTES*1>() mstore
0x8f27ef73cbda9d1a6ac356810d0bfaa900000000000000000000000000000000 EVAL_ARITHMETIC<F6_INPUTABC+NUM_BYTES*2*2+NUM_BYTES*1+32>() mstore
// A0
0x15e1e13af71de9928b9b1631a9ecad43670a33daa7a418b44f0090b4b602e334 EVAL_ARITHMETIC<F6_INPUTABC+NUM_BYTES*6+NUM_BYTES*2*0+NUM_BYTES*0>() mstore
0xf47665551a973a7a4c64af08c847d3ec00000000000000000000000000000000 EVAL_ARITHMETIC<F6_INPUTABC+NUM_BYTES*6+NUM_BYTES*2*0+NUM_BYTES*0+32>() mstore
// A1
0x0d36ade56247620236b05713353330909e7bb1d29bbceb438dc379ad239bf693 EVAL_ARITHMETIC<F6_INPUTABC+NUM_BYTES*6+NUM_BYTES*2*0+NUM_BYTES*1>() mstore
0x2d43750eb8e3d564d743e8119e82a21200000000000000000000000000000000 EVAL_ARITHMETIC<F6_INPUTABC+NUM_BYTES*6+NUM_BYTES*2*0+NUM_BYTES*1+32>() mstore
// B0
0x0fd4716804357d4012a717d278006dd37da44fed2763f9c4a69707d2e0948416 EVAL_ARITHMETIC<F6_INPUTABC+NUM_BYTES*6+NUM_BYTES*2*1+NUM_BYTES*0>() mstore
0x495c6fc6faf993f3013366ce7d85f9d700000000000000000000000000000000 EVAL_ARITHMETIC<F6_INPUTABC+NUM_BYTES*6+NUM_BYTES*2*1+NUM_BYTES*0+32>() mstore
// B1
0x13a2fd8719f04ccb3910d3b47ff5044cd63ad849bfe1345e74aae8038d54a7e4 EVAL_ARITHMETIC<F6_INPUTABC+NUM_BYTES*6+NUM_BYTES*2*1+NUM_BYTES*1>() mstore
0xd26a90e7bca076eb90c11e6c7f761b2f00000000000000000000000000000000 EVAL_ARITHMETIC<F6_INPUTABC+NUM_BYTES*6+NUM_BYTES*2*1+NUM_BYTES*1+32>() mstore
// C0
0x06d6c6cd0b01a8102b1be07b8558d51865b7cd0f3980d8f1e444c4cfcb379f2f EVAL_ARITHMETIC<F6_INPUTABC+NUM_BYTES*6+NUM_BYTES*2*2+NUM_BYTES*0>() mstore
0xedeea333d4b090588847aef2a28d3f7b00000000000000000000000000000000 EVAL_ARITHMETIC<F6_INPUTABC+NUM_BYTES*6+NUM_BYTES*2*2+NUM_BYTES*0+32>() mstore
// C1
0x10f6503d1e2158bbdaf82c0121b3880c97ce174a73906ee53cb0e39a3e30fea5 EVAL_ARITHMETIC<F6_INPUTABC+NUM_BYTES*6+NUM_BYTES*2*2+NUM_BYTES*1>() mstore
0xa9ad25588b867763788a2c13f6029c3100000000000000000000000000000000 EVAL_ARITHMETIC<F6_INPUTABC+NUM_BYTES*6+NUM_BYTES*2*2+NUM_BYTES*1+32>() mstore
// mod for bls12-381
0x1a0111ea397fe69a4b1ba7b6434bacd764774b84f38512bf6730d2a0f6b0f624 EVAL_ARITHMETIC<MOD_OFFSET*1>() mstore
0x1eabfffeb153ffffb9feffffffffaaab00000000000000000000000000000000 EVAL_ARITHMETIC<MOD_OFFSET+32>() mstore
// inv for bls12-381
0x89f3fffcfffcfffd000000000000000000000000000000000000000000000000 EVAL_ARITHMETIC<MOD_OFFSET+48>() mstore
// call f6m_mul over above memory
F6M_MUL()
// return output
288 F6M_MUL_OUT() return
/*
output should be the following but big-endian:
f4f3f4e0a35068eaac665aee2e71f682aecd20923b420023b6d5420ba01ea98287c314107a998a650ab3247ef39c920e
2c9620d993a22bade623d165a9f4aa648af87cb7292b7821c0fcd0adcd14ba655da54df2ad93262e24fc62bcd97e7208
ead1838e6c5e168543093c87eaeb576f940670026292dcb7a812600f4fb20a281be71ce1ef79f675e4a283b73906ca17
9c8b2c76405445b20dd7635d562309f69c2c87601d9055a5e10df2ea1d28237fafd0d32f7e8c19d4cd5a3d1ef65b120b
40591ef0c74dbec983b7bef145a87957c1e09049dbc85fbb3e9bb1174892ee83294ef8c4a5954fffbff4ca6aca74c718
9b242b8f1c5d63bb525121bd68eda084ab7e6d015052d5adeb79ddb24091d2a8e5b1da00212d0e6c11f01d2379011308
*/
}
///////////////
// f6m_mul benchmark
#define macro F6M_MUL_BENCH_NUM_ITERS = takes(0) returns(1) {
135
}
#define jumptable F6M_MUL_BENCH_JUMP_TABLE {
loop done
}
#define macro F6M_MUL_BENCH = takes(0) returns(0) {
// set up memory
// a0
0x0daa35e7a880a2ca3bcea128c5c8d17202945981a13aec134d10c051c1fa23c0 EVAL_ARITHMETIC<F6_INPUTABC+NUM_BYTES*2*0+NUM_BYTES*0>() mstore
0x6b3088c3a380f4b8b1f598e5f390298f00000000000000000000000000000000 EVAL_ARITHMETIC<F6_INPUTABC+NUM_BYTES*2*0+NUM_BYTES*0+32>() mstore
// a1
0x0918e9882e10abce5a0f55c6916e3be87e5dc68b9d3324db632d33c3fb53868f EVAL_ARITHMETIC<F6_INPUTABC+NUM_BYTES*2*0+NUM_BYTES*1>() mstore
0x77c0488c7e3ab230d54c6d90277a2d9900000000000000000000000000000000 EVAL_ARITHMETIC<F6_INPUTABC+NUM_BYTES*2*0+NUM_BYTES*1+32>() mstore
// b0
0x18a6c5f02807687486eee2410b7040ac5c0e564cabe64e12fb8c35578a61f36f EVAL_ARITHMETIC<F6_INPUTABC+NUM_BYTES*2*1+NUM_BYTES*0>() mstore
0xed7413e994a3c6c4086f81467190997200000000000000000000000000000000 EVAL_ARITHMETIC<F6_INPUTABC+NUM_BYTES*2*1+NUM_BYTES*0+32>() mstore
// b1
0x00d2a9d9e2674057794afa89fcf3e8edb7b032354dddf7dd8268a83a92d72dd6 EVAL_ARITHMETIC<F6_INPUTABC+NUM_BYTES*2*1+NUM_BYTES*1>() mstore
0xb1931fec1cd2f8a052b99eb3627fd70f00000000000000000000000000000000 EVAL_ARITHMETIC<F6_INPUTABC+NUM_BYTES*2*1+NUM_BYTES*1+32>() mstore
// c0
0x13ac019d8914d7479fe7c4731a4033251a384cb89a53b823e1c635ab7589a4a6 EVAL_ARITHMETIC<F6_INPUTABC+NUM_BYTES*2*2+NUM_BYTES*0>() mstore
0x7eeff9aa243283c4b48c3db146de697a00000000000000000000000000000000 EVAL_ARITHMETIC<F6_INPUTABC+NUM_BYTES*2*2+NUM_BYTES*0+32>() mstore
// c1
0x181bf207cb40cbf95b6d18e0bf2789982fccb608f7b9fe2b9f78880e569b144d EVAL_ARITHMETIC<F6_INPUTABC+NUM_BYTES*2*2+NUM_BYTES*1>() mstore
0x8f27ef73cbda9d1a6ac356810d0bfaa900000000000000000000000000000000 EVAL_ARITHMETIC<F6_INPUTABC+NUM_BYTES*2*2+NUM_BYTES*1+32>() mstore
// A0
0x15e1e13af71de9928b9b1631a9ecad43670a33daa7a418b44f0090b4b602e334 EVAL_ARITHMETIC<F6_INPUTABC+NUM_BYTES*6+NUM_BYTES*2*0+NUM_BYTES*0>() mstore
0xf47665551a973a7a4c64af08c847d3ec00000000000000000000000000000000 EVAL_ARITHMETIC<F6_INPUTABC+NUM_BYTES*6+NUM_BYTES*2*0+NUM_BYTES*0+32>() mstore
// A1
0x0d36ade56247620236b05713353330909e7bb1d29bbceb438dc379ad239bf693 EVAL_ARITHMETIC<F6_INPUTABC+NUM_BYTES*6+NUM_BYTES*2*0+NUM_BYTES*1>() mstore
0x2d43750eb8e3d564d743e8119e82a21200000000000000000000000000000000 EVAL_ARITHMETIC<F6_INPUTABC+NUM_BYTES*6+NUM_BYTES*2*0+NUM_BYTES*1+32>() mstore
// B0
0x0fd4716804357d4012a717d278006dd37da44fed2763f9c4a69707d2e0948416 EVAL_ARITHMETIC<F6_INPUTABC+NUM_BYTES*6+NUM_BYTES*2*1+NUM_BYTES*0>() mstore
0x495c6fc6faf993f3013366ce7d85f9d700000000000000000000000000000000 EVAL_ARITHMETIC<F6_INPUTABC+NUM_BYTES*6+NUM_BYTES*2*1+NUM_BYTES*0+32>() mstore
// B1
0x13a2fd8719f04ccb3910d3b47ff5044cd63ad849bfe1345e74aae8038d54a7e4 EVAL_ARITHMETIC<F6_INPUTABC+NUM_BYTES*6+NUM_BYTES*2*1+NUM_BYTES*1>() mstore
0xd26a90e7bca076eb90c11e6c7f761b2f00000000000000000000000000000000 EVAL_ARITHMETIC<F6_INPUTABC+NUM_BYTES*6+NUM_BYTES*2*1+NUM_BYTES*1+32>() mstore
// C0
0x06d6c6cd0b01a8102b1be07b8558d51865b7cd0f3980d8f1e444c4cfcb379f2f EVAL_ARITHMETIC<F6_INPUTABC+NUM_BYTES*6+NUM_BYTES*2*2+NUM_BYTES*0>() mstore
0xedeea333d4b090588847aef2a28d3f7b00000000000000000000000000000000 EVAL_ARITHMETIC<F6_INPUTABC+NUM_BYTES*6+NUM_BYTES*2*2+NUM_BYTES*0+32>() mstore
// C1
0x10f6503d1e2158bbdaf82c0121b3880c97ce174a73906ee53cb0e39a3e30fea5 EVAL_ARITHMETIC<F6_INPUTABC+NUM_BYTES*6+NUM_BYTES*2*2+NUM_BYTES*1>() mstore
0xa9ad25588b867763788a2c13f6029c3100000000000000000000000000000000 EVAL_ARITHMETIC<F6_INPUTABC+NUM_BYTES*6+NUM_BYTES*2*2+NUM_BYTES*1+32>() mstore
// mod for bls12-381
0x1a0111ea397fe69a4b1ba7b6434bacd764774b84f38512bf6730d2a0f6b0f624 EVAL_ARITHMETIC<MOD_OFFSET*1>() mstore
0x1eabfffeb153ffffb9feffffffffaaab00000000000000000000000000000000 EVAL_ARITHMETIC<MOD_OFFSET+32>() mstore
// inv for bls12-381
0x89f3fffcfffcfffd000000000000000000000000000000000000000000000000 EVAL_ARITHMETIC<MOD_OFFSET+48>() mstore
// prepare for loop
1 // iterator, starts at 1 and grows
loop:
F6M_MUL()
F6M_MUL()
F6M_MUL()
F6M_MUL()
F6M_MUL()
F6M_MUL()
F6M_MUL()
F6M_MUL()
F6M_MUL()
F6M_MUL()
__tablesize(F6M_MUL_BENCH_JUMP_TABLE) __tablestart(F6M_MUL_BENCH_JUMP_TABLE) 3000 codecopy // copy jumpdests to memory offset 3000
1 add // increment [iterator+1]
dup1 F6M_MUL_BENCH_NUM_ITERS() lt // compare to max number of iters [iterator+1 0_or_1]
32 mul 3000 add // offset to jump to [iterator+1 1000_or_1032]
mload jump // where the number before lt is iter_count
done:
0xff 0 mstore8 1 0 return // return a single byte, 0xff, to make sure it executed this far
//stop
}
{
"f6m_mul_v8" : {
"_info" : {
"comment" : "",
"filledwith" : "testeth 1.8.0-6+commit.c7ba3b69",
"lllcversion" : "Version: 0.5.14-develop.2019.11.27+commit.8f259595.Linux.g++",
"source" : "src/VMTestsFiller/vmArithmeticTest/add0Filler.json",
"sourceHash" : "c1480bf5e662b7f6518d4b003e14575c6bdab286e2d8763e1b0be9a186bec775"
},
"callcreates" : [
],
"env" : {
"currentCoinbase" : "0x2adc25665018aa1fe0e6bc666dac8fc2697ff9ba",
"currentDifficulty" : "0x020000",
"currentGasLimit" : "0x7fffffffffffffff",
"currentNumber" : "0x01",
"currentTimestamp" : "0x03e8"
},
"exec" : {
"address" : "0x0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6",
"caller" : "0xcd1722f2947def4cf144679da39c4c32bdc35681",
"code" : "0x7f0daa35e7a880a2ca3bcea128c5c8d17202945981a13aec134d10c051c1fa23c06030527f6b3088c3a380f4b8b1f598e5f390298f000000000000000000000000000000006050527f0918e9882e10abce5a0f55c6916e3be87e5dc68b9d3324db632d33c3fb53868f6060527f77c0488c7e3ab230d54c6d90277a2d99000000000000000000000000000000006080527f18a6c5f02807687486eee2410b7040ac5c0e564cabe64e12fb8c35578a61f36f6090527fed7413e994a3c6c4086f8146719099720000000000000000000000000000000060b0527f00d2a9d9e2674057794afa89fcf3e8edb7b032354dddf7dd8268a83a92d72dd660c0527fb1931fec1cd2f8a052b99eb3627fd70f0000000000000000000000000000000060e0527f13ac019d8914d7479fe7c4731a4033251a384cb89a53b823e1c635ab7589a4a660f0527f7eeff9aa243283c4b48c3db146de697a00000000000000000000000000000000610110527f181bf207cb40cbf95b6d18e0bf2789982fccb608f7b9fe2b9f78880e569b144d610120527f8f27ef73cbda9d1a6ac356810d0bfaa900000000000000000000000000000000610140527f15e1e13af71de9928b9b1631a9ecad43670a33daa7a418b44f0090b4b602e334610150527ff47665551a973a7a4c64af08c847d3ec00000000000000000000000000000000610170527f0d36ade56247620236b05713353330909e7bb1d29bbceb438dc379ad239bf693610180527f2d43750eb8e3d564d743e8119e82a212000000000000000000000000000000006101a0527f0fd4716804357d4012a717d278006dd37da44fed2763f9c4a69707d2e09484166101b0527f495c6fc6faf993f3013366ce7d85f9d7000000000000000000000000000000006101d0527f13a2fd8719f04ccb3910d3b47ff5044cd63ad849bfe1345e74aae8038d54a7e46101e0527fd26a90e7bca076eb90c11e6c7f761b2f00000000000000000000000000000000610200527f06d6c6cd0b01a8102b1be07b8558d51865b7cd0f3980d8f1e444c4cfcb379f2f610210527fedeea333d4b090588847aef2a28d3f7b00000000000000000000000000000000610230527f10f6503d1e2158bbdaf82c0121b3880c97ce174a73906ee53cb0e39a3e30fea5610240527fa9ad25588b867763788a2c13f6029c3100000000000000000000000000000000610260527f1a0111ea397fe69a4b1ba7b6434bacd764774b84f38512bf6730d2a0f6b0f624610660527f1eabfffeb153ffffb9feffffffffaaab00000000000000000000000000000000610680527f89f3fffcfffcfffd000000000000000000000000000000000000000000000000610690526f000004b0000000300000015000000660c26f000004e0000000600000018000000660c26f0000051000000000000004e000000660c16f00000270000004b00000051000000660c06f000004b0000004b0000004e000000660c06f000004e0000000300000006000000660c06f00000510000001500000018000000660c06f000004e0000004e00000051000000660c26f000002a0000004e0000004b000000660c16f000004b000000090000001b000000660c26f000004e0000000c0000001e000000660c26f0000051000000000000004e000000660c16f000002d0000004b00000051000000660c06f000004b0000004b0000004e000000660c06f000004e000000090000000c000000660c06f00000510000001b0000001e000000660c06f000004e0000004e00000051000000660c26f00000300000004e0000004b000000660c16f000004b0000000f00000021000000660c26f000004e0000001200000024000000660c26f0000051000000000000004e000000660c16f00000330000004b00000051000000660c06f000004b0000004b0000004e000000660c06f000004e0000000f00000012000000660c06f00000510000002100000024000000660c06f000004e0000004e00000051000000660c26f00000360000004e0000004b000000660c16f0000039000000030000000f000000660c06f000003c0000000600000012000000660c06f000003f0000001500000021000000660c06f00000420000001800000024000000660c06f000004b000000390000003f000000660c26f000004e0000003c00000042000000660c26f0000051000000000000004e000000660c16f00000450000004b00000051000000660c06f000004b0000004b0000004e000000660c06f000004e000000390000003c000000660c06f00000510000003f00000042000000660c06f000004e0000004e00000051000000660c26f00000480000004e0000004b000000660c16f00000390000002700000033000000660c06f000003c0000002a00000036000000660c06f000003f0000004500000039000000660c16f0000042000000480000003c000000660c16f00000600000002d0000003f000000660c06f00000630000003000000042000000660c06f00000390000000300000009000000660c06f000003c000000060000000c000000660c06f000003f000000150000001b000000660c06f0000042000000180000001e000000660c06f000004b000000390000003f000000660c26f000004e0000003c00000042000000660c26f0000051000000000000004e000000660c16f00000450000004b00000051000000660c06f000004b0000004b0000004e000000660c06f000004e000000390000003c000000660c06f00000510000003f00000042000000660c06f000004e0000004e00000051000000660c26f00000480000004e0000004b000000660c16f0000039000000270000002d000000660c06f000003c0000002a00000030000000660c06f000003f0000004500000039000000660c16f0000042000000480000003c000000660c16f00000390000003300000036000000660c16f000003c0000003300000036000000660c06f000005a000000390000003f000000660c06f000005d0000003c00000042000000660c06f0000039000000090000000f000000660c06f000003c0000000c00000012000000660c06f000003f0000001b00000021000000660c06f00000420000001e00000024000000660c06f000004b000000390000003f000000660c26f000004e0000003c00000042000000660c26f0000051000000000000004e000000660c16f00000450000004b00000051000000660c06f000004b0000004b0000004e000000660c06f000004e000000390000003c000000660c06f00000510000003f00000042000000660c06f000004e0000004e00000051000000660c26f00000480000004e0000004b000000660c16f00000390000002d00000033000000660c06f000003c0000003000000036000000660c06f000003f0000004500000039000000660c16f0000042000000480000003c000000660c16f00000450000003f00000042000000660c16f00000480000003f00000042000000660c06f00000540000002700000045000000660c06f00000570000002a00000048000000660c0610120610540f3",
"data" : "0x",
"gas" : "0x0186a0",
"gasPrice" : "0x0c",
"origin" : "0xcd1722f2947def4cf144679da39c4c32bdc35681",
"value" : "0x0b"
},
"gas" : "0x013874",
"logs" : "0x1dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d49347",
"out" : "0x",
"post" : {
"0x0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6" : {
"balance" : "0x0de0b6b3a7640000",
"code" : "0x",
"nonce" : "0x00",
"storage" : {
}
}
},
"pre" : {
"0x0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6" : {
"balance" : "0x0de0b6b3a7640000",
"code" : "0x",
"nonce" : "0x00",
"storage" : {
}
}
}
}
}
{
"f6m_mul_v8_bench" : {
"_info" : {
"comment" : "",
"filledwith" : "testeth 1.8.0-6+commit.c7ba3b69",
"lllcversion" : "Version: 0.5.14-develop.2019.11.27+commit.8f259595.Linux.g++",
"source" : "src/VMTestsFiller/vmArithmeticTest/add0Filler.json",
"sourceHash" : "c1480bf5e662b7f6518d4b003e14575c6bdab286e2d8763e1b0be9a186bec775"
},
"callcreates" : [
],
"env" : {
"currentCoinbase" : "0x2adc25665018aa1fe0e6bc666dac8fc2697ff9ba",
"currentDifficulty" : "0x020000",
"currentGasLimit" : "0x7fffffffffffffff",
"currentNumber" : "0x01",
"currentTimestamp" : "0x03e8"
},
"exec" : {
"address" : "0x0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6",
"caller" : "0xcd1722f2947def4cf144679da39c4c32bdc35681",
"code" : "0x7f0daa35e7a880a2ca3bcea128c5c8d17202945981a13aec134d10c051c1fa23c06030527f6b3088c3a380f4b8b1f598e5f390298f000000000000000000000000000000006050527f0918e9882e10abce5a0f55c6916e3be87e5dc68b9d3324db632d33c3fb53868f6060527f77c0488c7e3ab230d54c6d90277a2d99000000000000000000000000000000006080527f18a6c5f02807687486eee2410b7040ac5c0e564cabe64e12fb8c35578a61f36f6090527fed7413e994a3c6c4086f8146719099720000000000000000000000000000000060b0527f00d2a9d9e2674057794afa89fcf3e8edb7b032354dddf7dd8268a83a92d72dd660c0527fb1931fec1cd2f8a052b99eb3627fd70f0000000000000000000000000000000060e0527f13ac019d8914d7479fe7c4731a4033251a384cb89a53b823e1c635ab7589a4a660f0527f7eeff9aa243283c4b48c3db146de697a00000000000000000000000000000000610110527f181bf207cb40cbf95b6d18e0bf2789982fccb608f7b9fe2b9f78880e569b144d610120527f8f27ef73cbda9d1a6ac356810d0bfaa900000000000000000000000000000000610140527f15e1e13af71de9928b9b1631a9ecad43670a33daa7a418b44f0090b4b602e334610150527ff47665551a973a7a4c64af08c847d3ec00000000000000000000000000000000610170527f0d36ade56247620236b05713353330909e7bb1d29bbceb438dc379ad239bf693610180527f2d43750eb8e3d564d743e8119e82a212000000000000000000000000000000006101a0527f0fd4716804357d4012a717d278006dd37da44fed2763f9c4a69707d2e09484166101b0527f495c6fc6faf993f3013366ce7d85f9d7000000000000000000000000000000006101d0527f13a2fd8719f04ccb3910d3b47ff5044cd63ad849bfe1345e74aae8038d54a7e46101e0527fd26a90e7bca076eb90c11e6c7f761b2f00000000000000000000000000000000610200527f06d6c6cd0b01a8102b1be07b8558d51865b7cd0f3980d8f1e444c4cfcb379f2f610210527fedeea333d4b090588847aef2a28d3f7b00000000000000000000000000000000610230527f10f6503d1e2158bbdaf82c0121b3880c97ce174a73906ee53cb0e39a3e30fea5610240527fa9ad25588b867763788a2c13f6029c3100000000000000000000000000000000610260527f1a0111ea397fe69a4b1ba7b6434bacd764774b84f38512bf6730d2a0f6b0f624610660527f1eabfffeb153ffffb9feffffffffaaab00000000000000000000000000000000610680527f89f3fffcfffcfffd0000000000000000000000000000000000000000000000006106905260015b6f000004b0000000300000015000000660c26f000004e0000000600000018000000660c26f0000051000000000000004e000000660c16f00000270000004b00000051000000660c06f000004b0000004b0000004e000000660c06f000004e0000000300000006000000660c06f00000510000001500000018000000660c06f000004e0000004e00000051000000660c26f000002a0000004e0000004b000000660c16f000004b000000090000001b000000660c26f000004e0000000c0000001e000000660c26f0000051000000000000004e000000660c16f000002d0000004b00000051000000660c06f000004b0000004b0000004e000000660c06f000004e000000090000000c000000660c06f00000510000001b0000001e000000660c06f000004e0000004e00000051000000660c26f00000300000004e0000004b000000660c16f000004b0000000f00000021000000660c26f000004e0000001200000024000000660c26f0000051000000000000004e000000660c16f00000330000004b00000051000000660c06f000004b0000004b0000004e000000660c06f000004e0000000f00000012000000660c06f00000510000002100000024000000660c06f000004e0000004e00000051000000660c26f00000360000004e0000004b000000660c16f0000039000000030000000f000000660c06f000003c0000000600000012000000660c06f000003f0000001500000021000000660c06f00000420000001800000024000000660c06f000004b000000390000003f000000660c26f000004e0000003c00000042000000660c26f0000051000000000000004e000000660c16f00000450000004b00000051000000660c06f000004b0000004b0000004e000000660c06f000004e000000390000003c000000660c06f00000510000003f00000042000000660c06f000004e0000004e00000051000000660c26f00000480000004e0000004b000000660c16f00000390000002700000033000000660c06f000003c0000002a00000036000000660c06f000003f0000004500000039000000660c16f0000042000000480000003c000000660c16f00000600000002d0000003f000000660c06f00000630000003000000042000000660c06f00000390000000300000009000000660c06f000003c000000060000000c000000660c06f000003f000000150000001b000000660c06f0000042000000180000001e000000660c06f000004b000000390000003f000000660c26f000004e0000003c00000042000000660c26f0000051000000000000004e000000660c16f00000450000004b00000051000000660c06f000004b0000004b0000004e000000660c06f000004e000000390000003c000000660c06f00000510000003f00000042000000660c06f000004e0000004e00000051000000660c26f00000480000004e0000004b000000660c16f0000039000000270000002d000000660c06f000003c0000002a00000030000000660c06f000003f0000004500000039000000660c16f0000042000000480000003c000000660c16f00000390000003300000036000000660c16f000003c0000003300000036000000660c06f000005a000000390000003f000000660c06f000005d0000003c00000042000000660c06f0000039000000090000000f000000660c06f000003c0000000c00000012000000660c06f000003f0000001b00000021000000660c06f00000420000001e00000024000000660c06f000004b000000390000003f000000660c26f000004e0000003c00000042000000660c26f0000051000000000000004e000000660c16f00000450000004b00000051000000660c06f000004b0000004b0000004e000000660c06f000004e000000390000003c000000660c06f00000510000003f00000042000000660c06f000004e0000004e00000051000000660c26f00000480000004e0000004b000000660c16f00000390000002d00000033000000660c06f000003c0000003000000036000000660c06f000003f0000004500000039000000660c16f0000042000000480000003c000000660c16f00000450000003f00000042000000660c16f00000480000003f00000042000000660c06f00000540000002700000045000000660c06f00000570000002a00000048000000660c06f000004b0000000300000015000000660c26f000004e0000000600000018000000660c26f0000051000000000000004e000000660c16f00000270000004b00000051000000660c06f000004b0000004b0000004e000000660c06f000004e0000000300000006000000660c06f00000510000001500000018000000660c06f000004e0000004e00000051000000660c26f000002a0000004e0000004b000000660c16f000004b000000090000001b000000660c26f000004e0000000c0000001e000000660c26f0000051000000000000004e000000660c16f000002d0000004b00000051000000660c06f000004b0000004b0000004e000000660c06f000004e000000090000000c000000660c06f00000510000001b0000001e000000660c06f000004e0000004e00000051000000660c26f00000300000004e0000004b000000660c16f000004b0000000f00000021000000660c26f000004e0000001200000024000000660c26f0000051000000000000004e000000660c16f00000330000004b00000051000000660c06f000004b0000004b0000004e000000660c06f000004e0000000f00000012000000660c06f00000510000002100000024000000660c06f000004e0000004e00000051000000660c26f00000360000004e0000004b000000660c16f0000039000000030000000f000000660c06f000003c0000000600000012000000660c06f000003f0000001500000021000000660c06f00000420000001800000024000000660c06f000004b000000390000003f000000660c26f000004e0000003c00000042000000660c26f0000051000000000000004e000000660c16f00000450000004b00000051000000660c06f000004b0000004b0000004e000000660c06f000004e000000390000003c000000660c06f00000510000003f00000042000000660c06f000004e0000004e00000051000000660c26f00000480000004e0000004b000000660c16f00000390000002700000033000000660c06f000003c0000002a00000036000000660c06f000003f0000004500000039000000660c16f0000042000000480000003c000000660c16f00000600000002d0000003f000000660c06f00000630000003000000042000000660c06f00000390000000300000009000000660c06f000003c000000060000000c000000660c06f000003f000000150000001b000000660c06f0000042000000180000001e000000660c06f000004b000000390000003f000000660c26f000004e0000003c00000042000000660c26f0000051000000000000004e000000660c16f00000450000004b00000051000000660c06f000004b0000004b0000004e000000660c06f000004e000000390000003c000000660c06f00000510000003f00000042000000660c06f000004e0000004e00000051000000660c26f00000480000004e0000004b000000660c16f0000039000000270000002d000000660c06f000003c0000002a00000030000000660c06f000003f0000004500000039000000660c16f0000042000000480000003c000000660c16f00000390000003300000036000000660c16f000003c0000003300000036000000660c06f000005a000000390000003f000000660c06f000005d0000003c00000042000000660c06f0000039000000090000000f000000660c06f000003c0000000c00000012000000660c06f000003f0000001b00000021000000660c06f00000420000001e00000024000000660c06f000004b000000390000003f000000660c26f000004e0000003c00000042000000660c26f0000051000000000000004e000000660c16f00000450000004b00000051000000660c06f000004b0000004b0000004e000000660c06f000004e000000390000003c000000660c06f00000510000003f00000042000000660c06f000004e0000004e00000051000000660c26f00000480000004e0000004b000000660c16f00000390000002d00000033000000660c06f000003c0000003000000036000000660c06f000003f0000004500000039000000660c16f0000042000000480000003c000000660c16f00000450000003f00000042000000660c16f00000480000003f00000042000000660c06f00000540000002700000045000000660c06f00000570000002a00000048000000660c06f000004b0000000300000015000000660c26f000004e0000000600000018000000660c26f0000051000000000000004e000000660c16f00000270000004b00000051000000660c06f000004b0000004b0000004e000000660c06f000004e0000000300000006000000660c06f00000510000001500000018000000660c06f000004e0000004e00000051000000660c26f000002a0000004e0000004b000000660c16f000004b000000090000001b000000660c26f000004e0000000c0000001e000000660c26f0000051000000000000004e000000660c16f000002d0000004b00000051000000660c06f000004b0000004b0000004e000000660c06f000004e000000090000000c000000660c06f00000510000001b0000001e000000660c06f000004e0000004e00000051000000660c26f00000300000004e0000004b000000660c16f000004b0000000f00000021000000660c26f000004e0000001200000024000000660c26f0000051000000000000004e000000660c16f00000330000004b00000051000000660c06f000004b0000004b0000004e000000660c06f000004e0000000f00000012000000660c06f00000510000002100000024000000660c06f000004e0000004e00000051000000660c26f00000360000004e0000004b000000660c16f0000039000000030000000f000000660c06f000003c0000000600000012000000660c06f000003f0000001500000021000000660c06f00000420000001800000024000000660c06f000004b000000390000003f000000660c26f000004e0000003c00000042000000660c26f0000051000000000000004e000000660c16f00000450000004b00000051000000660c06f000004b0000004b0000004e000000660c06f000004e000000390000003c000000660c06f00000510000003f00000042000000660c06f000004e0000004e00000051000000660c26f00000480000004e0000004b000000660c16f00000390000002700000033000000660c06f000003c0000002a00000036000000660c06f000003f0000004500000039000000660c16f0000042000000480000003c000000660c16f00000600000002d0000003f000000660c06f00000630000003000000042000000660c06f00000390000000300000009000000660c06f000003c000000060000000c000000660c06f000003f000000150000001b000000660c06f0000042000000180000001e000000660c06f000004b000000390000003f000000660c26f000004e0000003c00000042000000660c26f0000051000000000000004e000000660c16f00000450000004b00000051000000660c06f000004b0000004b0000004e000000660c06f000004e000000390000003c000000660c06f00000510000003f00000042000000660c06f000004e0000004e00000051000000660c26f00000480000004e0000004b000000660c16f0000039000000270000002d000000660c06f000003c0000002a00000030000000660c06f000003f0000004500000039000000660c16f0000042000000480000003c000000660c16f00000390000003300000036000000660c16f000003c0000003300000036000000660c06f000005a000000390000003f000000660c06f000005d0000003c00000042000000660c06f0000039000000090000000f000000660c06f000003c0000000c00000012000000660c06f000003f0000001b00000021000000660c06f00000420000001e00000024000000660c06f000004b000000390000003f000000660c26f000004e0000003c00000042000000660c26f0000051000000000000004e000000660c16f00000450000004b00000051000000660c06f000004b0000004b0000004e000000660c06f000004e000000390000003c000000660c06f00000510000003f00000042000000660c06f000004e0000004e00000051000000660c26f00000480000004e0000004b000000660c16f00000390000002d00000033000000660c06f000003c0000003000000036000000660c06f000003f0000004500000039000000660c16f0000042000000480000003c000000660c16f00000450000003f00000042000000660c16f00000480000003f00000042000000660c06f00000540000002700000045000000660c06f00000570000002a00000048000000660c06f000004b0000000300000015000000660c26f000004e0000000600000018000000660c26f0000051000000000000004e000000660c16f00000270000004b00000051000000660c06f000004b0000004b0000004e000000660c06f000004e0000000300000006000000660c06f00000510000001500000018000000660c06f000004e0000004e00000051000000660c26f000002a0000004e0000004b000000660c16f000004b000000090000001b000000660c26f000004e0000000c0000001e000000660c26f0000051000000000000004e000000660c16f000002d0000004b00000051000000660c06f000004b0000004b0000004e000000660c06f000004e000000090000000c000000660c06f00000510000001b0000001e000000660c06f000004e0000004e00000051000000660c26f00000300000004e0000004b000000660c16f000004b0000000f00000021000000660c26f000004e0000001200000024000000660c26f0000051000000000000004e000000660c16f00000330000004b00000051000000660c06f000004b0000004b0000004e000000660c06f000004e0000000f00000012000000660c06f00000510000002100000024000000660c06f000004e0000004e00000051000000660c26f00000360000004e0000004b000000660c16f0000039000000030000000f000000660c06f000003c0000000600000012000000660c06f000003f0000001500000021000000660c06f00000420000001800000024000000660c06f000004b000000390000003f000000660c26f000004e0000003c00000042000000660c26f0000051000000000000004e000000660c16f00000450000004b00000051000000660c06f000004b0000004b0000004e000000660c06f000004e000000390000003c000000660c06f00000510000003f00000042000000660c06f000004e0000004e00000051000000660c26f00000480000004e0000004b000000660c16f00000390000002700000033000000660c06f000003c0000002a00000036000000660c06f000003f0000004500000039000000660c16f0000042000000480000003c000000660c16f00000600000002d0000003f000000660c06f00000630000003000000042000000660c06f00000390000000300000009000000660c06f000003c000000060000000c000000660c06f000003f000000150000001b000000660c06f0000042000000180000001e000000660c06f000004b000000390000003f000000660c26f000004e0000003c00000042000000660c26f0000051000000000000004e000000660c16f00000450000004b00000051000000660c06f000004b0000004b0000004e000000660c06f000004e000000390000003c000000660c06f00000510000003f00000042000000660c06f000004e0000004e00000051000000660c26f00000480000004e0000004b000000660c16f0000039000000270000002d000000660c06f000003c0000002a00000030000000660c06f000003f0000004500000039000000660c16f0000042000000480000003c000000660c16f00000390000003300000036000000660c16f000003c0000003300000036000000660c06f000005a000000390000003f000000660c06f000005d0000003c00000042000000660c06f0000039000000090000000f000000660c06f000003c0000000c00000012000000660c06f000003f0000001b00000021000000660c06f00000420000001e00000024000000660c06f000004b000000390000003f000000660c26f000004e0000003c00000042000000660c26f0000051000000000000004e000000660c16f00000450000004b00000051000000660c06f000004b0000004b0000004e000000660c06f000004e000000390000003c000000660c06f00000510000003f00000042000000660c06f000004e0000004e00000051000000660c26f00000480000004e0000004b000000660c16f00000390000002d00000033000000660c06f000003c0000003000000036000000660c06f000003f0000004500000039000000660c16f0000042000000480000003c000000660c16f00000450000003f00000042000000660c16f00000480000003f00000042000000660c06f00000540000002700000045000000660c06f00000570000002a00000048000000660c06f000004b0000000300000015000000660c26f000004e0000000600000018000000660c26f0000051000000000000004e000000660c16f00000270000004b00000051000000660c06f000004b0000004b0000004e000000660c06f000004e0000000300000006000000660c06f00000510000001500000018000000660c06f000004e0000004e00000051000000660c26f000002a0000004e0000004b000000660c16f000004b000000090000001b000000660c26f000004e0000000c0000001e000000660c26f0000051000000000000004e000000660c16f000002d0000004b00000051000000660c06f000004b0000004b0000004e000000660c06f000004e000000090000000c000000660c06f00000510000001b0000001e000000660c06f000004e0000004e00000051000000660c26f00000300000004e0000004b000000660c16f000004b0000000f00000021000000660c26f000004e0000001200000024000000660c26f0000051000000000000004e000000660c16f00000330000004b00000051000000660c06f000004b0000004b0000004e000000660c06f000004e0000000f00000012000000660c06f00000510000002100000024000000660c06f000004e0000004e00000051000000660c26f00000360000004e0000004b000000660c16f0000039000000030000000f000000660c06f000003c0000000600000012000000660c06f000003f0000001500000021000000660c06f00000420000001800000024000000660c06f000004b000000390000003f000000660c26f000004e0000003c00000042000000660c26f0000051000000000000004e000000660c16f00000450000004b00000051000000660c06f000004b0000004b0000004e000000660c06f000004e000000390000003c000000660c06f00000510000003f00000042000000660c06f000004e0000004e00000051000000660c26f00000480000004e0000004b000000660c16f00000390000002700000033000000660c06f000003c0000002a00000036000000660c06f000003f0000004500000039000000660c16f0000042000000480000003c000000660c16f00000600000002d0000003f000000660c06f00000630000003000000042000000660c06f00000390000000300000009000000660c06f000003c000000060000000c000000660c06f000003f000000150000001b000000660c06f0000042000000180000001e000000660c06f000004b000000390000003f000000660c26f000004e0000003c00000042000000660c26f0000051000000000000004e000000660c16f00000450000004b00000051000000660c06f000004b0000004b0000004e000000660c06f000004e000000390000003c000000660c06f00000510000003f00000042000000660c06f000004e0000004e00000051000000660c26f00000480000004e0000004b000000660c16f0000039000000270000002d000000660c06f000003c0000002a00000030000000660c06f000003f0000004500000039000000660c16f0000042000000480000003c000000660c16f00000390000003300000036000000660c16f000003c0000003300000036000000660c06f000005a000000390000003f000000660c06f000005d0000003c00000042000000660c06f0000039000000090000000f000000660c06f000003c0000000c00000012000000660c06f000003f0000001b00000021000000660c06f00000420000001e00000024000000660c06f000004b000000390000003f000000660c26f000004e0000003c00000042000000660c26f0000051000000000000004e000000660c16f00000450000004b00000051000000660c06f000004b0000004b0000004e000000660c06f000004e000000390000003c000000660c06f00000510000003f00000042000000660c06f000004e0000004e00000051000000660c26f00000480000004e0000004b000000660c16f00000390000002d00000033000000660c06f000003c0000003000000036000000660c06f000003f0000004500000039000000660c16f0000042000000480000003c000000660c16f00000450000003f00000042000000660c16f00000480000003f00000042000000660c06f00000540000002700000045000000660c06f00000570000002a00000048000000660c06f000004b0000000300000015000000660c26f000004e0000000600000018000000660c26f0000051000000000000004e000000660c16f00000270000004b00000051000000660c06f000004b0000004b0000004e000000660c06f000004e0000000300000006000000660c06f00000510000001500000018000000660c06f000004e0000004e00000051000000660c26f000002a0000004e0000004b000000660c16f000004b000000090000001b000000660c26f000004e0000000c0000001e000000660c26f0000051000000000000004e000000660c16f000002d0000004b00000051000000660c06f000004b0000004b0000004e000000660c06f000004e000000090000000c000000660c06f00000510000001b0000001e000000660c06f000004e0000004e00000051000000660c26f00000300000004e0000004b000000660c16f000004b0000000f00000021000000660c26f000004e0000001200000024000000660c26f0000051000000000000004e000000660c16f00000330000004b00000051000000660c06f000004b0000004b0000004e000000660c06f000004e0000000f00000012000000660c06f00000510000002100000024000000660c06f000004e0000004e00000051000000660c26f00000360000004e0000004b000000660c16f0000039000000030000000f000000660c06f000003c0000000600000012000000660c06f000003f0000001500000021000000660c06f00000420000001800000024000000660c06f000004b000000390000003f000000660c26f000004e0000003c00000042000000660c26f0000051000000000000004e000000660c16f00000450000004b00000051000000660c06f000004b0000004b0000004e000000660c06f000004e000000390000003c000000660c06f00000510000003f00000042000000660c06f000004e0000004e00000051000000660c26f00000480000004e0000004b000000660c16f00000390000002700000033000000660c06f000003c0000002a00000036000000660c06f000003f0000004500000039000000660c16f0000042000000480000003c000000660c16f00000600000002d0000003f000000660c06f00000630000003000000042000000660c06f00000390000000300000009000000660c06f000003c000000060000000c000000660c06f000003f000000150000001b000000660c06f0000042000000180000001e000000660c06f000004b000000390000003f000000660c26f000004e0000003c00000042000000660c26f0000051000000000000004e000000660c16f00000450000004b00000051000000660c06f000004b0000004b0000004e000000660c06f000004e000000390000003c000000660c06f00000510000003f00000042000000660c06f000004e0000004e00000051000000660c26f00000480000004e0000004b000000660c16f0000039000000270000002d000000660c06f000003c0000002a00000030000000660c06f000003f0000004500000039000000660c16f0000042000000480000003c000000660c16f00000390000003300000036000000660c16f000003c0000003300000036000000660c06f000005a000000390000003f000000660c06f000005d0000003c00000042000000660c06f0000039000000090000000f000000660c06f000003c0000000c00000012000000660c06f000003f0000001b00000021000000660c06f00000420000001e00000024000000660c06f000004b000000390000003f000000660c26f000004e0000003c00000042000000660c26f0000051000000000000004e000000660c16f00000450000004b00000051000000660c06f000004b0000004b0000004e000000660c06f000004e000000390000003c000000660c06f00000510000003f00000042000000660c06f000004e0000004e00000051000000660c26f00000480000004e0000004b000000660c16f00000390000002d00000033000000660c06f000003c0000003000000036000000660c06f000003f0000004500000039000000660c16f0000042000000480000003c000000660c16f00000450000003f00000042000000660c16f00000480000003f00000042000000660c06f00000540000002700000045000000660c06f00000570000002a00000048000000660c06f000004b0000000300000015000000660c26f000004e0000000600000018000000660c26f0000051000000000000004e000000660c16f00000270000004b00000051000000660c06f000004b0000004b0000004e000000660c06f000004e0000000300000006000000660c06f00000510000001500000018000000660c06f000004e0000004e00000051000000660c26f000002a0000004e0000004b000000660c16f000004b000000090000001b000000660c26f000004e0000000c0000001e000000660c26f0000051000000000000004e000000660c16f000002d0000004b00000051000000660c06f000004b0000004b0000004e000000660c06f000004e000000090000000c000000660c06f00000510000001b0000001e000000660c06f000004e0000004e00000051000000660c26f00000300000004e0000004b000000660c16f000004b0000000f00000021000000660c26f000004e0000001200000024000000660c26f0000051000000000000004e000000660c16f00000330000004b00000051000000660c06f000004b0000004b0000004e000000660c06f000004e0000000f00000012000000660c06f00000510000002100000024000000660c06f000004e0000004e00000051000000660c26f00000360000004e0000004b000000660c16f0000039000000030000000f000000660c06f000003c0000000600000012000000660c06f000003f0000001500000021000000660c06f00000420000001800000024000000660c06f000004b000000390000003f000000660c26f000004e0000003c00000042000000660c26f0000051000000000000004e000000660c16f00000450000004b00000051000000660c06f000004b0000004b0000004e000000660c06f000004e000000390000003c000000660c06f00000510000003f00000042000000660c06f000004e0000004e00000051000000660c26f00000480000004e0000004b000000660c16f00000390000002700000033000000660c06f000003c0000002a00000036000000660c06f000003f0000004500000039000000660c16f0000042000000480000003c000000660c16f00000600000002d0000003f000000660c06f00000630000003000000042000000660c06f00000390000000300000009000000660c06f000003c000000060000000c000000660c06f000003f000000150000001b000000660c06f0000042000000180000001e000000660c06f000004b000000390000003f000000660c26f000004e0000003c00000042000000660c26f0000051000000000000004e000000660c16f00000450000004b00000051000000660c06f000004b0000004b0000004e000000660c06f000004e000000390000003c000000660c06f00000510000003f00000042000000660c06f000004e0000004e00000051000000660c26f00000480000004e0000004b000000660c16f0000039000000270000002d000000660c06f000003c0000002a00000030000000660c06f000003f0000004500000039000000660c16f0000042000000480000003c000000660c16f00000390000003300000036000000660c16f000003c0000003300000036000000660c06f000005a000000390000003f000000660c06f000005d0000003c00000042000000660c06f0000039000000090000000f000000660c06f000003c0000000c00000012000000660c06f000003f0000001b00000021000000660c06f00000420000001e00000024000000660c06f000004b000000390000003f000000660c26f000004e0000003c00000042000000660c26f0000051000000000000004e000000660c16f00000450000004b00000051000000660c06f000004b0000004b0000004e000000660c06f000004e000000390000003c000000660c06f00000510000003f00000042000000660c06f000004e0000004e00000051000000660c26f00000480000004e0000004b000000660c16f00000390000002d00000033000000660c06f000003c0000003000000036000000660c06f000003f0000004500000039000000660c16f0000042000000480000003c000000660c16f00000450000003f00000042000000660c16f00000480000003f00000042000000660c06f00000540000002700000045000000660c06f00000570000002a00000048000000660c06f000004b0000000300000015000000660c26f000004e0000000600000018000000660c26f0000051000000000000004e000000660c16f00000270000004b00000051000000660c06f000004b0000004b0000004e000000660c06f000004e0000000300000006000000660c06f00000510000001500000018000000660c06f000004e0000004e00000051000000660c26f000002a0000004e0000004b000000660c16f000004b000000090000001b000000660c26f000004e0000000c0000001e000000660c26f0000051000000000000004e000000660c16f000002d0000004b00000051000000660c06f000004b0000004b0000004e000000660c06f000004e000000090000000c000000660c06f00000510000001b0000001e000000660c06f000004e0000004e00000051000000660c26f00000300000004e0000004b000000660c16f000004b0000000f00000021000000660c26f000004e0000001200000024000000660c26f0000051000000000000004e000000660c16f00000330000004b00000051000000660c06f000004b0000004b0000004e000000660c06f000004e0000000f00000012000000660c06f00000510000002100000024000000660c06f000004e0000004e00000051000000660c26f00000360000004e0000004b000000660c16f0000039000000030000000f000000660c06f000003c0000000600000012000000660c06f000003f0000001500000021000000660c06f00000420000001800000024000000660c06f000004b000000390000003f000000660c26f000004e0000003c00000042000000660c26f0000051000000000000004e000000660c16f00000450000004b00000051000000660c06f000004b0000004b0000004e000000660c06f000004e000000390000003c000000660c06f00000510000003f00000042000000660c06f000004e0000004e00000051000000660c26f00000480000004e0000004b000000660c16f00000390000002700000033000000660c06f000003c0000002a00000036000000660c06f000003f0000004500000039000000660c16f0000042000000480000003c000000660c16f00000600000002d0000003f000000660c06f00000630000003000000042000000660c06f00000390000000300000009000000660c06f000003c000000060000000c000000660c06f000003f000000150000001b000000660c06f0000042000000180000001e000000660c06f000004b000000390000003f000000660c26f000004e0000003c00000042000000660c26f0000051000000000000004e000000660c16f00000450000004b00000051000000660c06f000004b0000004b0000004e000000660c06f000004e000000390000003c000000660c06f00000510000003f00000042000000660c06f000004e0000004e00000051000000660c26f00000480000004e0000004b000000660c16f0000039000000270000002d000000660c06f000003c0000002a00000030000000660c06f000003f0000004500000039000000660c16f0000042000000480000003c000000660c16f00000390000003300000036000000660c16f000003c0000003300000036000000660c06f000005a000000390000003f000000660c06f000005d0000003c00000042000000660c06f0000039000000090000000f000000660c06f000003c0000000c00000012000000660c06f000003f0000001b00000021000000660c06f00000420000001e00000024000000660c06f000004b000000390000003f000000660c26f000004e0000003c00000042000000660c26f0000051000000000000004e000000660c16f00000450000004b00000051000000660c06f000004b0000004b0000004e000000660c06f000004e000000390000003c000000660c06f00000510000003f00000042000000660c06f000004e0000004e00000051000000660c26f00000480000004e0000004b000000660c16f00000390000002d00000033000000660c06f000003c0000003000000036000000660c06f000003f0000004500000039000000660c16f0000042000000480000003c000000660c16f00000450000003f00000042000000660c16f00000480000003f00000042000000660c06f00000540000002700000045000000660c06f00000570000002a00000048000000660c06f000004b0000000300000015000000660c26f000004e0000000600000018000000660c26f0000051000000000000004e000000660c16f00000270000004b00000051000000660c06f000004b0000004b0000004e000000660c06f000004e0000000300000006000000660c06f00000510000001500000018000000660c06f000004e0000004e00000051000000660c26f000002a0000004e0000004b000000660c16f000004b000000090000001b000000660c26f000004e0000000c0000001e000000660c26f0000051000000000000004e000000660c16f000002d0000004b00000051000000660c06f000004b0000004b0000004e000000660c06f000004e000000090000000c000000660c06f00000510000001b0000001e000000660c06f000004e0000004e00000051000000660c26f00000300000004e0000004b000000660c16f000004b0000000f00000021000000660c26f000004e0000001200000024000000660c26f0000051000000000000004e000000660c16f00000330000004b00000051000000660c06f000004b0000004b0000004e000000660c06f000004e0000000f00000012000000660c06f00000510000002100000024000000660c06f000004e0000004e00000051000000660c26f00000360000004e0000004b000000660c16f0000039000000030000000f000000660c06f000003c0000000600000012000000660c06f000003f0000001500000021000000660c06f00000420000001800000024000000660c06f000004b000000390000003f000000660c26f000004e0000003c00000042000000660c26f0000051000000000000004e000000660c16f00000450000004b00000051000000660c06f000004b0000004b0000004e000000660c06f000004e000000390000003c000000660c06f00000510000003f00000042000000660c06f000004e0000004e00000051000000660c26f00000480000004e0000004b000000660c16f00000390000002700000033000000660c06f000003c0000002a00000036000000660c06f000003f0000004500000039000000660c16f0000042000000480000003c000000660c16f00000600000002d0000003f000000660c06f00000630000003000000042000000660c06f00000390000000300000009000000660c06f000003c000000060000000c000000660c06f000003f000000150000001b000000660c06f0000042000000180000001e000000660c06f000004b000000390000003f000000660c26f000004e0000003c00000042000000660c26f0000051000000000000004e000000660c16f00000450000004b00000051000000660c06f000004b0000004b0000004e000000660c06f000004e000000390000003c000000660c06f00000510000003f00000042000000660c06f000004e0000004e00000051000000660c26f00000480000004e0000004b000000660c16f0000039000000270000002d000000660c06f000003c0000002a00000030000000660c06f000003f0000004500000039000000660c16f0000042000000480000003c000000660c16f00000390000003300000036000000660c16f000003c0000003300000036000000660c06f000005a000000390000003f000000660c06f000005d0000003c00000042000000660c06f0000039000000090000000f000000660c06f000003c0000000c00000012000000660c06f000003f0000001b00000021000000660c06f00000420000001e00000024000000660c06f000004b000000390000003f000000660c26f000004e0000003c00000042000000660c26f0000051000000000000004e000000660c16f00000450000004b00000051000000660c06f000004b0000004b0000004e000000660c06f000004e000000390000003c000000660c06f00000510000003f00000042000000660c06f000004e0000004e00000051000000660c26f00000480000004e0000004b000000660c16f00000390000002d00000033000000660c06f000003c0000003000000036000000660c06f000003f0000004500000039000000660c16f0000042000000480000003c000000660c16f00000450000003f00000042000000660c16f00000480000003f00000042000000660c06f00000540000002700000045000000660c06f00000570000002a00000048000000660c06f000004b0000000300000015000000660c26f000004e0000000600000018000000660c26f0000051000000000000004e000000660c16f00000270000004b00000051000000660c06f000004b0000004b0000004e000000660c06f000004e0000000300000006000000660c06f00000510000001500000018000000660c06f000004e0000004e00000051000000660c26f000002a0000004e0000004b000000660c16f000004b000000090000001b000000660c26f000004e0000000c0000001e000000660c26f0000051000000000000004e000000660c16f000002d0000004b00000051000000660c06f000004b0000004b0000004e000000660c06f000004e000000090000000c000000660c06f00000510000001b0000001e000000660c06f000004e0000004e00000051000000660c26f00000300000004e0000004b000000660c16f000004b0000000f00000021000000660c26f000004e0000001200000024000000660c26f0000051000000000000004e000000660c16f00000330000004b00000051000000660c06f000004b0000004b0000004e000000660c06f000004e0000000f00000012000000660c06f00000510000002100000024000000660c06f000004e0000004e00000051000000660c26f00000360000004e0000004b000000660c16f0000039000000030000000f000000660c06f000003c0000000600000012000000660c06f000003f0000001500000021000000660c06f00000420000001800000024000000660c06f000004b000000390000003f000000660c26f000004e0000003c00000042000000660c26f0000051000000000000004e000000660c16f00000450000004b00000051000000660c06f000004b0000004b0000004e000000660c06f000004e000000390000003c000000660c06f00000510000003f00000042000000660c06f000004e0000004e00000051000000660c26f00000480000004e0000004b000000660c16f00000390000002700000033000000660c06f000003c0000002a00000036000000660c06f000003f0000004500000039000000660c16f0000042000000480000003c000000660c16f00000600000002d0000003f000000660c06f00000630000003000000042000000660c06f00000390000000300000009000000660c06f000003c000000060000000c000000660c06f000003f000000150000001b000000660c06f0000042000000180000001e000000660c06f000004b000000390000003f000000660c26f000004e0000003c00000042000000660c26f0000051000000000000004e000000660c16f00000450000004b00000051000000660c06f000004b0000004b0000004e000000660c06f000004e000000390000003c000000660c06f00000510000003f00000042000000660c06f000004e0000004e00000051000000660c26f00000480000004e0000004b000000660c16f0000039000000270000002d000000660c06f000003c0000002a00000030000000660c06f000003f0000004500000039000000660c16f0000042000000480000003c000000660c16f00000390000003300000036000000660c16f000003c0000003300000036000000660c06f000005a000000390000003f000000660c06f000005d0000003c00000042000000660c06f0000039000000090000000f000000660c06f000003c0000000c00000012000000660c06f000003f0000001b00000021000000660c06f00000420000001e00000024000000660c06f000004b000000390000003f000000660c26f000004e0000003c00000042000000660c26f0000051000000000000004e000000660c16f00000450000004b00000051000000660c06f000004b0000004b0000004e000000660c06f000004e000000390000003c000000660c06f00000510000003f00000042000000660c06f000004e0000004e00000051000000660c26f00000480000004e0000004b000000660c16f00000390000002d00000033000000660c06f000003c0000003000000036000000660c06f000003f0000004500000039000000660c16f0000042000000480000003c000000660c16f00000450000003f00000042000000660c16f00000480000003f00000042000000660c06f00000540000002700000045000000660c06f00000570000002a00000048000000660c060406141e5610bb83960010180608710602002610bb80151565b60ff60005360016000f300000000000000000000000000000000000000000000000000000000000003e000000000000000000000000000000000000000000000000000000000000041da",
"data" : "0x",
"gas" : "0x989680",
"gasPrice" : "0x0c",
"origin" : "0xcd1722f2947def4cf144679da39c4c32bdc35681",
"value" : "0x0b"
},
"gas" : "0x013874",
"logs" : "0x1dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d49347",
"out" : "0x",
"post" : {
"0x0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6" : {
"balance" : "0x0de0b6b3a7640000",
"code" : "0x",
"nonce" : "0x00",
"storage" : {
}
}
},
"pre" : {
"0x0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6" : {
"balance" : "0x0de0b6b3a7640000",
"code" : "0x",
"nonce" : "0x00",
"storage" : {
}
}
}
}
}
diff -ruN huff/src/opcodes/opcodes.js huff_modified/src/opcodes/opcodes.js
--- huff/src/opcodes/opcodes.js 2020-08-25 22:09:19.874010859 -0500
+++ huff_modified/src/opcodes/opcodes.js 2020-08-25 22:12:20.621659305 -0500
@@ -135,6 +135,9 @@
a2: 'LOG2',
a3: 'LOG3',
a4: 'LOG4',
+ c0: 'ADDMOD384',
+ c1: 'SUBMOD384',
+ c2: 'MULMODMONT384',
f0: 'CREATE',
f1: 'CALL',
f2: 'CALLCODE',
@@ -246,6 +249,9 @@
log2: 'a2',
log3: 'a3',
log4: 'a4',
+ addmod384: 'c0',
+ submod384: 'c1',
+ mulmodmont384: 'c2',
create: 'f0',
call: 'f1',
callcode: 'f2',
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment